@exalif/ngx-breadcrumbs
Version:
Angular 4+ breadcrumbs on top of native Angular router
332 lines (320 loc) • 28.1 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('lodash.template'), require('lodash.templatesettings'), require('@angular/router'), require('rxjs/operators'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('@exalif/ngx-breadcrumbs', ['exports', '@angular/core', 'rxjs', 'lodash.template', 'lodash.templatesettings', '@angular/router', 'rxjs/operators', '@angular/common'], factory) :
(factory((global.exalif = global.exalif || {}, global.exalif['ngx-breadcrumbs'] = {}),global.ng.core,global.rxjs,null,null,global.ng.router,global.rxjs.operators,global.ng.common));
}(this, (function (exports,core,rxjs,template,templateSettings,router,operators,common) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsConfig = (function () {
function BreadcrumbsConfig() {
}
BreadcrumbsConfig.decorators = [
{ type: core.Injectable },
];
return BreadcrumbsConfig;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var /** @type {?} */ _ = {
template: template,
templateSettings: templateSettings
};
_.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
/**
* @abstract
*/
var /**
* @abstract
*/ BreadcrumbsUtils = (function () {
function BreadcrumbsUtils() {
}
/**
* @param {?} rawTemplate
* @param {?} binding
* @return {?}
*/
BreadcrumbsUtils.stringFormat = /**
* @param {?} rawTemplate
* @param {?} binding
* @return {?}
*/
function (rawTemplate, binding) {
var /** @type {?} */ compiled = _.template(rawTemplate);
return compiled(binding);
};
/**
* @template T
* @param {?} value
* @return {?}
*/
BreadcrumbsUtils.wrapIntoObservable = /**
* @template T
* @param {?} value
* @return {?}
*/
function (value) {
if (value instanceof rxjs.Observable) {
return value;
}
if (this.isPromise(value)) {
return rxjs.from(Promise.resolve(value));
}
return rxjs.of(/** @type {?} */ (value));
};
/**
* @param {?} value
* @return {?}
*/
BreadcrumbsUtils.isPromise = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value && (typeof value.then === 'function');
};
return BreadcrumbsUtils;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsResolver = (function () {
function BreadcrumbsResolver() {
}
/**
* @param {?} route
* @param {?} state
* @return {?}
*/
BreadcrumbsResolver.prototype.resolve = /**
* @param {?} route
* @param {?} state
* @return {?}
*/
function (route, state) {
var /** @type {?} */ data = route.routeConfig.data;
var /** @type {?} */ path = this.getFullPath(route);
var /** @type {?} */ text = typeof (data["breadcrumbs"]) === 'string' ? data["breadcrumbs"] : data["breadcrumbs"].text || data["text"] || path;
text = BreadcrumbsUtils.stringFormat(text, route.data);
var /** @type {?} */ crumbs = [{
text: text,
path: path
}];
return rxjs.of(crumbs);
};
/**
* @param {?} route
* @return {?}
*/
BreadcrumbsResolver.prototype.getFullPath = /**
* @param {?} route
* @return {?}
*/
function (route) {
return this.fetchFullPath(route.pathFromRoot);
};
/**
* @param {?} routes
* @return {?}
*/
BreadcrumbsResolver.prototype.fetchFullPath = /**
* @param {?} routes
* @return {?}
*/
function (routes) {
var _this = this;
return routes.reduce(function (path, route) { return path += _this.fetchRelativePath(route.url); }, '');
};
/**
* @param {?} urlSegments
* @return {?}
*/
BreadcrumbsResolver.prototype.fetchRelativePath = /**
* @param {?} urlSegments
* @return {?}
*/
function (urlSegments) {
return urlSegments.reduce(function (path, urlSegment) { return path += '/' + urlSegment.path; }, '');
};
return BreadcrumbsResolver;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsService = (function () {
function BreadcrumbsService(_router, route, _config, _injector) {
var _this = this;
this._router = _router;
this.route = route;
this._config = _config;
this._injector = _injector;
this._breadcrumbs = new rxjs.BehaviorSubject([]);
this._defaultResolver = new BreadcrumbsResolver();
this._router.events.pipe(operators.filter(function (x) { return x instanceof router.NavigationEnd; }))
.subscribe(function (event) {
var /** @type {?} */ routeRoot = _router.routerState.snapshot.root;
_this._resolveCrumbs(routeRoot).pipe(operators.flatMap(function (crumbs) { return crumbs; }), operators.distinct(function (crumb) { return crumb.text; }), operators.toArray(), operators.flatMap(function (crumbs) {
if (_this._config.postProcess) {
var /** @type {?} */ postProcessedCrumb = _this._config.postProcess(crumbs);
return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(operators.first());
}
else {
return rxjs.of(crumbs);
}
}))
.subscribe(function (crumbs) {
_this._breadcrumbs.next(crumbs);
});
});
}
Object.defineProperty(BreadcrumbsService.prototype, "crumbs$", {
get: /**
* @return {?}
*/ function () {
return this._breadcrumbs;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
BreadcrumbsService.prototype.getCrumbs = /**
* @return {?}
*/
function () {
return this.crumbs$;
};
/**
* @param {?} route
* @return {?}
*/
BreadcrumbsService.prototype._resolveCrumbs = /**
* @param {?} route
* @return {?}
*/
function (route) {
var /** @type {?} */ crumbs$;
var /** @type {?} */ data = route.routeConfig && route.routeConfig.data;
if (data && data["breadcrumbs"]) {
var /** @type {?} */ resolver = void 0;
if (data["breadcrumbs"].prototype instanceof BreadcrumbsResolver) {
resolver = this._injector.get(data["breadcrumbs"]);
}
else {
resolver = this._defaultResolver;
}
var /** @type {?} */ result = resolver.resolve(route, this._router.routerState.snapshot);
crumbs$ = BreadcrumbsUtils.wrapIntoObservable(result).pipe(operators.first());
}
else {
crumbs$ = rxjs.of([]);
}
if (route.firstChild) {
crumbs$ = rxjs.concat(crumbs$, this._resolveCrumbs(route.firstChild));
}
return crumbs$;
};
BreadcrumbsService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
BreadcrumbsService.ctorParameters = function () {
return [
{ type: router.Router },
{ type: router.ActivatedRoute },
{ type: BreadcrumbsConfig },
{ type: core.Injector }
];
};
return BreadcrumbsService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsComponent = (function () {
function BreadcrumbsComponent(breadcrumbsService) {
this.breadcrumbsService = breadcrumbsService;
this.crumbs$ = this.breadcrumbsService.getCrumbs();
}
BreadcrumbsComponent.decorators = [
{ type: core.Component, args: [{
selector: 'lib-breadcrumbs',
template: "\n <ol *ngIf=\"crumbs$ | async as crumbs\" class=\"breadcrumbs__container\">\n <li *ngFor=\"let crumb of crumbs; let last = last\"\n [ngClass]=\"{ 'breadcrumbs__item--active': last }\"\n class=\"breadcrumbs__item\"\n >\n <a *ngIf=\"!last\" [routerLink]=\"crumb.path\">{{ crumb.text }}</a>\n <span *ngIf=\"last\">{{ crumb.text }}</span>\n </li>\n </ol>\n "
},] },
];
/** @nocollapse */
BreadcrumbsComponent.ctorParameters = function () {
return [
{ type: BreadcrumbsService }
];
};
return BreadcrumbsComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsModule = (function () {
function BreadcrumbsModule() {
}
/**
* @return {?}
*/
BreadcrumbsModule.forRoot = /**
* @return {?}
*/
function () {
return {
ngModule: BreadcrumbsModule,
providers: [
BreadcrumbsConfig,
BreadcrumbsService
]
};
};
/**
* @return {?}
*/
BreadcrumbsModule.forChild = /**
* @return {?}
*/
function () {
return {
ngModule: BreadcrumbsModule
};
};
BreadcrumbsModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule,
router.RouterModule
],
declarations: [BreadcrumbsComponent],
exports: [BreadcrumbsComponent]
},] },
];
return BreadcrumbsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.BreadcrumbsModule = BreadcrumbsModule;
exports.BreadcrumbsComponent = BreadcrumbsComponent;
exports.BreadcrumbsService = BreadcrumbsService;
exports.BreadcrumbsConfig = BreadcrumbsConfig;
exports.BreadcrumbsResolver = BreadcrumbsResolver;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbGlmLW5neC1icmVhZGNydW1icy51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BleGFsaWYvbmd4LWJyZWFkY3J1bWJzL2xpYi9zZXJ2aWNlcy9icmVhZGNydW1icy5jb25maWcudHMiLCJuZzovL0BleGFsaWYvbmd4LWJyZWFkY3J1bWJzL2xpYi91dGlscy9icmVhZGNydW1icy51dGlscy50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnJlc29sdmVyLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvc2VydmljZXMvYnJlYWRjcnVtYnMuc2VydmljZS50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL2NvbXBvbmVudC9icmVhZGNydW1icy5jb21wb25lbnQudHMiLCJuZzovL0BleGFsaWYvbmd4LWJyZWFkY3J1bWJzL2xpYi9icmVhZGNydW1icy5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5cbmV4cG9ydCB0eXBlIFBvc3RQcm9jZXNzRnVuY3Rpb24gPVxuICAoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IFByb21pc2U8QnJlYWRjcnVtYltdPiB8IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB8IEJyZWFkY3J1bWJbXTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzQ29uZmlnIHtcbiAgcG9zdFByb2Nlc3M6IFBvc3RQcm9jZXNzRnVuY3Rpb247XG59XG4iLCJpbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSZXNvbHZlLCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIGZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0ICogYXMgdGVtcGxhdGUgZnJvbSAnbG9kYXNoLnRlbXBsYXRlJztcbmltcG9ydCAqIGFzIHRlbXBsYXRlU2V0dGluZ3MgZnJvbSAnbG9kYXNoLnRlbXBsYXRlc2V0dGluZ3MnO1xuXG5jb25zdCBfID0ge1xuICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gIHRlbXBsYXRlU2V0dGluZ3M6IHRlbXBsYXRlU2V0dGluZ3Ncbn07XG5fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJlYWRjcnVtYnNVdGlscyB7XG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5nRm9ybWF0KHJhd1RlbXBsYXRlOiBzdHJpbmcsIGJpbmRpbmc6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHJhd1RlbXBsYXRlKTtcblxuICAgIHJldHVybiBjb21waWxlZChiaW5kaW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgd3JhcEludG9PYnNlcnZhYmxlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZTxUPiB8IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQcm9taXNlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZyb20oUHJvbWlzZS5yZXNvbHZlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKHZhbHVlIGFzIFQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQcm9taXNlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUmVzb2x2ZSwgUm91dGVyU3RhdGVTbmFwc2hvdCwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1V0aWxzIH0gZnJvbSAnLi4vdXRpbHMvYnJlYWRjcnVtYnMudXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNSZXNvbHZlciBpbXBsZW1lbnRzIFJlc29sdmU8QnJlYWRjcnVtYltdPiB7XG4gIHB1YmxpYyByZXNvbHZlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdClcbiAgICA6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB8IFByb21pc2U8QnJlYWRjcnVtYltdPiB8IEJyZWFkY3J1bWJbXSB7XG5cbiAgICBjb25zdCBkYXRhID0gcm91dGUucm91dGVDb25maWcuZGF0YTtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRGdWxsUGF0aChyb3V0ZSk7XG5cbiAgICBsZXQgdGV4dCA9IHR5cGVvZiAoZGF0YS5icmVhZGNydW1icykgPT09ICdzdHJpbmcnID8gZGF0YS5icmVhZGNydW1icyA6IGRhdGEuYnJlYWRjcnVtYnMudGV4dCB8fCBkYXRhLnRleHQgfHwgcGF0aDtcbiAgICB0ZXh0ID0gQnJlYWRjcnVtYnNVdGlscy5zdHJpbmdGb3JtYXQodGV4dCwgcm91dGUuZGF0YSk7XG5cbiAgICBjb25zdCBjcnVtYnM6IEJyZWFkY3J1bWJbXSA9IFt7XG4gICAgICB0ZXh0LFxuICAgICAgcGF0aFxuICAgIH1dO1xuXG4gICAgcmV0dXJuIG9mKGNydW1icyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RnVsbFBhdGgocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZldGNoRnVsbFBhdGgocm91dGUucGF0aEZyb21Sb290KTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hGdWxsUGF0aChyb3V0ZXM6IEFjdGl2YXRlZFJvdXRlU25hcHNob3RbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJvdXRlcy5yZWR1Y2UoKHBhdGgsIHJvdXRlKSA9PiBwYXRoICs9IHRoaXMuZmV0Y2hSZWxhdGl2ZVBhdGgocm91dGUudXJsKSwgJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFJlbGF0aXZlUGF0aCh1cmxTZWdtZW50czogVXJsU2VnbWVudFtdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsU2VnbWVudHMucmVkdWNlKChwYXRoLCB1cmxTZWdtZW50KSA9PiBwYXRoICs9ICcvJyArIHVybFNlZ21lbnQucGF0aCwgJycpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIE5hdmlnYXRpb25FbmQsIFJvdXRlciwgUm91dGVyU3RhdGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbmNhdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBmaWx0ZXIsIGZsYXRNYXAsIGRpc3RpbmN0LCB0b0FycmF5LCBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb25maWcgfSBmcm9tICcuL2JyZWFkY3J1bWJzLmNvbmZpZyc7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1Jlc29sdmVyIH0gZnJvbSAnLi9icmVhZGNydW1icy5yZXNvbHZlcic7XG5pbXBvcnQgeyBCcmVhZGNydW1iIH0gZnJvbSAnLi4vbW9kZWxzL2JyZWFkY3J1bWInO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNVdGlscyB9IGZyb20gJy4uL3V0aWxzL2JyZWFkY3J1bWJzLnV0aWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfYnJlYWRjcnVtYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJyZWFkY3J1bWJbXT4oW10pO1xuICBwcml2YXRlIF9kZWZhdWx0UmVzb2x2ZXIgPSBuZXcgQnJlYWRjcnVtYnNSZXNvbHZlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgIHB1YmxpYyByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBCcmVhZGNydW1ic0NvbmZpZyxcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7XG5cbiAgICB0aGlzLl9yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKCh4KSA9PiB4IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xuICAgICAgICBjb25zdCByb3V0ZVJvb3QgPSBfcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnJvb3Q7XG5cbiAgICAgICAgdGhpcy5fcmVzb2x2ZUNydW1icyhyb3V0ZVJvb3QpLnBpcGUoXG4gICAgICAgICAgZmxhdE1hcCgoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IGNydW1icyksXG4gICAgICAgICAgZGlzdGluY3QoKGNydW1iOiBCcmVhZGNydW1iKSA9PiBjcnVtYi50ZXh0KSxcbiAgICAgICAgICB0b0FycmF5KCksXG4gICAgICAgICAgZmxhdE1hcCgoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcucG9zdFByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgY29uc3QgcG9zdFByb2Nlc3NlZENydW1iID0gdGhpcy5fY29uZmlnLnBvc3RQcm9jZXNzKGNydW1icyk7XG4gICAgICAgICAgICAgIHJldHVybiBCcmVhZGNydW1ic1V0aWxzLndyYXBJbnRvT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+KHBvc3RQcm9jZXNzZWRDcnVtYikucGlwZShcbiAgICAgICAgICAgICAgICBmaXJzdCgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gb2YoY3J1bWJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2JyZWFkY3J1bWJzLm5leHQoY3J1bWJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGNydW1icyQoKTogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHtcbiAgICByZXR1cm4gdGhpcy5fYnJlYWRjcnVtYnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3J1bWJzKCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG4gICAgcmV0dXJuIHRoaXMuY3J1bWJzJDtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmVDcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpXG4gICAgOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ge1xuXG4gICAgbGV0IGNydW1icyQ6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPjtcblxuICAgIGNvbnN0IGRhdGEgPSByb3V0ZS5yb3V0ZUNvbmZpZyAmJiByb3V0ZS5yb3V0ZUNvbmZpZy5kYXRhO1xuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5icmVhZGNydW1icykge1xuICAgICAgbGV0IHJlc29sdmVyOiBCcmVhZGNydW1ic1Jlc29sdmVyO1xuXG4gICAgICBpZiAoZGF0YS5icmVhZGNydW1icy5wcm90b3R5cGUgaW5zdGFuY2VvZiBCcmVhZGNydW1ic1Jlc29sdmVyKSB7XG4gICAgICAgIHJlc29sdmVyID0gdGhpcy5faW5qZWN0b3IuZ2V0KGRhdGEuYnJlYWRjcnVtYnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLl9kZWZhdWx0UmVzb2x2ZXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUocm91dGUsIHRoaXMuX3JvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCk7XG4gICAgICBjcnVtYnMkID0gQnJlYWRjcnVtYnNVdGlscy53cmFwSW50b09ic2VydmFibGU8QnJlYWRjcnVtYltdPihyZXN1bHQpLnBpcGUoXG4gICAgICAgIGZpcnN0KClcbiAgICAgICk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgY3J1bWJzJCA9IG9mKFtdKTtcbiAgICB9XG5cbiAgICBpZiAocm91dGUuZmlyc3RDaGlsZCkge1xuICAgICAgY3J1bWJzJCA9IGNvbmNhdChjcnVtYnMkLCB0aGlzLl9yZXNvbHZlQ3J1bWJzKHJvdXRlLmZpcnN0Q2hpbGQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3J1bWJzJDtcbiAgfVxufVxuIiwiXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCcmVhZGNydW1ic1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9icmVhZGNydW1icy5zZXJ2aWNlJztcbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1icmVhZGNydW1icycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG9sICpuZ0lmPVwiY3J1bWJzJCB8IGFzeW5jIGFzIGNydW1ic1wiIGNsYXNzPVwiYnJlYWRjcnVtYnNfX2NvbnRhaW5lclwiPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBjcnVtYiBvZiBjcnVtYnM7IGxldCBsYXN0ID0gbGFzdFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2JyZWFkY3J1bWJzX19pdGVtLS1hY3RpdmUnOiBsYXN0IH1cIlxuICAgICAgICBjbGFzcz1cImJyZWFkY3J1bWJzX19pdGVtXCJcbiAgICAgID5cbiAgICAgICAgPGEgKm5nSWY9XCIhbGFzdFwiIFtyb3V0ZXJMaW5rXT1cImNydW1iLnBhdGhcIj57eyBjcnVtYi50ZXh0IH19PC9hPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImxhc3RcIj57eyBjcnVtYi50ZXh0IH19PC9zcGFuPlxuICAgICAgPC9saT5cbiAgICA8L29sPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzQ29tcG9uZW50IHtcbiAgcHVibGljIGNydW1icyQ6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiA9IHRoaXMuYnJlYWRjcnVtYnNTZXJ2aWNlLmdldENydW1icygpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBicmVhZGNydW1ic1NlcnZpY2U6IEJyZWFkY3J1bWJzU2VydmljZSkgeyB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWJzQ29uZmlnIH0gZnJvbSAnLi9zZXJ2aWNlcy9icmVhZGNydW1icy5jb25maWcnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9icmVhZGNydW1icy5zZXJ2aWNlJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQvYnJlYWRjcnVtYnMuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSb3V0ZXJNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbQnJlYWRjcnVtYnNDb21wb25lbnRdLFxuICBleHBvcnRzOiBbQnJlYWRjcnVtYnNDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzTW9kdWxlIHtcbiAgcHVibGljIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogQnJlYWRjcnVtYnNNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgQnJlYWRjcnVtYnNDb25maWcsXG4gICAgICAgIEJyZWFkY3J1bWJzU2VydmljZVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZvckNoaWxkKCk6IE1vZHVsZVdpdGhQcm92aWRlcnMge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogQnJlYWRjcnVtYnNNb2R1bGVcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiSW5qZWN0YWJsZSIsIk9ic2VydmFibGUiLCJmcm9tIiwib2YiLCJCZWhhdmlvclN1YmplY3QiLCJmaWx0ZXIiLCJOYXZpZ2F0aW9uRW5kIiwiZmxhdE1hcCIsImRpc3RpbmN0IiwidG9BcnJheSIsImZpcnN0IiwiY29uY2F0IiwiUm91dGVyIiwiQWN0aXZhdGVkUm91dGUiLCJJbmplY3RvciIsIkNvbXBvbmVudCIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIiwiUm91dGVyTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7b0JBU0NBLGVBQVU7O2dDQVRYOzs7Ozs7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