@exalif/ngx-breadcrumbs
Version:
Angular 4+ breadcrumbs on top of native Angular router
324 lines (314 loc) • 25.4 kB
JavaScript
import { Injectable, Injector, Component, NgModule } from '@angular/core';
import { Observable, of, from, BehaviorSubject, concat } from 'rxjs';
import * as template from 'lodash.template';
import * as templateSettings from 'lodash.templatesettings';
import { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router';
import { filter, flatMap, distinct, toArray, first } from 'rxjs/operators';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsConfig = /** @class */ (function () {
function BreadcrumbsConfig() {
}
BreadcrumbsConfig.decorators = [
{ type: 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 = /** @class */ (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 Observable) {
return value;
}
if (this.isPromise(value)) {
return from(Promise.resolve(value));
}
return 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 = /** @class */ (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 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 = /** @class */ (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 BehaviorSubject([]);
this._defaultResolver = new BreadcrumbsResolver();
this._router.events.pipe(filter(function (x) { return x instanceof NavigationEnd; }))
.subscribe(function (event) {
var /** @type {?} */ routeRoot = _router.routerState.snapshot.root;
_this._resolveCrumbs(routeRoot).pipe(flatMap(function (crumbs) { return crumbs; }), distinct(function (crumb) { return crumb.text; }), toArray(), flatMap(function (crumbs) {
if (_this._config.postProcess) {
var /** @type {?} */ postProcessedCrumb = _this._config.postProcess(crumbs);
return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(first());
}
else {
return 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(first());
}
else {
crumbs$ = of([]);
}
if (route.firstChild) {
crumbs$ = concat(crumbs$, this._resolveCrumbs(route.firstChild));
}
return crumbs$;
};
BreadcrumbsService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
BreadcrumbsService.ctorParameters = function () { return [
{ type: Router },
{ type: ActivatedRoute },
{ type: BreadcrumbsConfig },
{ type: Injector }
]; };
return BreadcrumbsService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var BreadcrumbsComponent = /** @class */ (function () {
function BreadcrumbsComponent(breadcrumbsService) {
this.breadcrumbsService = breadcrumbsService;
this.crumbs$ = this.breadcrumbsService.getCrumbs();
}
BreadcrumbsComponent.decorators = [
{ type: 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 = /** @class */ (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: NgModule, args: [{
imports: [
CommonModule,
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
*/
export { BreadcrumbsModule, BreadcrumbsComponent, BreadcrumbsService, BreadcrumbsConfig, BreadcrumbsResolver };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhhbGlmLW5neC1icmVhZGNydW1icy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3NlcnZpY2VzL2JyZWFkY3J1bWJzLmNvbmZpZy50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL3V0aWxzL2JyZWFkY3J1bWJzLnV0aWxzLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvc2VydmljZXMvYnJlYWRjcnVtYnMucmVzb2x2ZXIudHMiLCJuZzovL0BleGFsaWYvbmd4LWJyZWFkY3J1bWJzL2xpYi9zZXJ2aWNlcy9icmVhZGNydW1icy5zZXJ2aWNlLnRzIiwibmc6Ly9AZXhhbGlmL25neC1icmVhZGNydW1icy9saWIvY29tcG9uZW50L2JyZWFkY3J1bWJzLmNvbXBvbmVudC50cyIsIm5nOi8vQGV4YWxpZi9uZ3gtYnJlYWRjcnVtYnMvbGliL2JyZWFkY3J1bWJzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcblxuZXhwb3J0IHR5cGUgUG9zdFByb2Nlc3NGdW5jdGlvbiA9XG4gIChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb25maWcge1xuICBwb3N0UHJvY2VzczogUG9zdFByb2Nlc3NGdW5jdGlvbjtcbn1cbiIsImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJlc29sdmUsIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgKiBhcyB0ZW1wbGF0ZSBmcm9tICdsb2Rhc2gudGVtcGxhdGUnO1xuaW1wb3J0ICogYXMgdGVtcGxhdGVTZXR0aW5ncyBmcm9tICdsb2Rhc2gudGVtcGxhdGVzZXR0aW5ncyc7XG5cbmNvbnN0IF8gPSB7XG4gIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgdGVtcGxhdGVTZXR0aW5nczogdGVtcGxhdGVTZXR0aW5nc1xufTtcbl8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcmVhZGNydW1ic1V0aWxzIHtcbiAgcHVibGljIHN0YXRpYyBzdHJpbmdGb3JtYXQocmF3VGVtcGxhdGU6IHN0cmluZywgYmluZGluZzogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb21waWxlZCA9IF8udGVtcGxhdGUocmF3VGVtcGxhdGUpO1xuXG4gICAgcmV0dXJuIGNvbXBpbGVkKGJpbmRpbmcpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB3cmFwSW50b09ic2VydmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1Byb21pc2UodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodmFsdWUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2YodmFsdWUgYXMgVCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBpc1Byb21pc2UodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSZXNvbHZlLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzVXRpbHMgfSBmcm9tICcuLi91dGlscy9icmVhZGNydW1icy51dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1ic1Jlc29sdmVyIGltcGxlbWVudHMgUmVzb2x2ZTxCcmVhZGNydW1iW10+IHtcbiAgcHVibGljIHJlc29sdmUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KVxuICAgIDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdIHtcblxuICAgIGNvbnN0IGRhdGEgPSByb3V0ZS5yb3V0ZUNvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLmdldEZ1bGxQYXRoKHJvdXRlKTtcblxuICAgIGxldCB0ZXh0ID0gdHlwZW9mIChkYXRhLmJyZWFkY3J1bWJzKSA9PT0gJ3N0cmluZycgPyBkYXRhLmJyZWFkY3J1bWJzIDogZGF0YS5icmVhZGNydW1icy50ZXh0IHx8IGRhdGEudGV4dCB8fCBwYXRoO1xuICAgIHRleHQgPSBCcmVhZGNydW1ic1V0aWxzLnN0cmluZ0Zvcm1hdCh0ZXh0LCByb3V0ZS5kYXRhKTtcblxuICAgIGNvbnN0IGNydW1iczogQnJlYWRjcnVtYltdID0gW3tcbiAgICAgIHRleHQsXG4gICAgICBwYXRoXG4gICAgfV07XG5cbiAgICByZXR1cm4gb2YoY3J1bWJzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGdWxsUGF0aChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hGdWxsUGF0aChyb3V0ZS5wYXRoRnJvbVJvb3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaEZ1bGxQYXRoKHJvdXRlczogQWN0aXZhdGVkUm91dGVTbmFwc2hvdFtdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcm91dGVzLnJlZHVjZSgocGF0aCwgcm91dGUpID0+IHBhdGggKz0gdGhpcy5mZXRjaFJlbGF0aXZlUGF0aChyb3V0ZS51cmwpLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoUmVsYXRpdmVQYXRoKHVybFNlZ21lbnRzOiBVcmxTZWdtZW50W10pOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmxTZWdtZW50cy5yZWR1Y2UoKHBhdGgsIHVybFNlZ21lbnQpID0+IHBhdGggKz0gJy8nICsgdXJsU2VnbWVudC5wYXRoLCAnJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29uY2F0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGZpbHRlciwgZmxhdE1hcCwgZGlzdGluY3QsIHRvQXJyYXksIGZpcnN0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCcmVhZGNydW1ic0NvbmZpZyB9IGZyb20gJy4vYnJlYWRjcnVtYnMuY29uZmlnJztcbmltcG9ydCB7IEJyZWFkY3J1bWJzUmVzb2x2ZXIgfSBmcm9tICcuL2JyZWFkY3J1bWJzLnJlc29sdmVyJztcbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1V0aWxzIH0gZnJvbSAnLi4vdXRpbHMvYnJlYWRjcnVtYnMudXRpbHMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9icmVhZGNydW1icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QnJlYWRjcnVtYltdPihbXSk7XG4gIHByaXZhdGUgX2RlZmF1bHRSZXNvbHZlciA9IG5ldyBCcmVhZGNydW1ic1Jlc29sdmVyKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHVibGljIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIF9jb25maWc6IEJyZWFkY3J1bWJzQ29uZmlnLFxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvclxuICApIHtcblxuICAgIHRoaXMuX3JvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoKHgpID0+IHggaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdXRlUm9vdCA9IF9yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3Qucm9vdDtcblxuICAgICAgICB0aGlzLl9yZXNvbHZlQ3J1bWJzKHJvdXRlUm9vdCkucGlwZShcbiAgICAgICAgICBmbGF0TWFwKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gY3J1bWJzKSxcbiAgICAgICAgICBkaXN0aW5jdCgoY3J1bWI6IEJyZWFkY3J1bWIpID0+IGNydW1iLnRleHQpLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgICBmbGF0TWFwKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5wb3N0UHJvY2Vzcykge1xuICAgICAgICAgICAgICBjb25zdCBwb3N0UHJvY2Vzc2VkQ3J1bWIgPSB0aGlzLl9jb25maWcucG9zdFByb2Nlc3MoY3J1bWJzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIEJyZWFkY3J1bWJzVXRpbHMud3JhcEludG9PYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ocG9zdFByb2Nlc3NlZENydW1iKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBvZihjcnVtYnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYnJlYWRjcnVtYnMubmV4dChjcnVtYnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgY3J1bWJzJCgpOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ge1xuICAgIHJldHVybiB0aGlzLl9icmVhZGNydW1icztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcnVtYnMoKTogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHtcbiAgICByZXR1cm4gdGhpcy5jcnVtYnMkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUNydW1icyhyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdClcbiAgICA6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG5cbiAgICBsZXQgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+O1xuXG4gICAgY29uc3QgZGF0YSA9IHJvdXRlLnJvdXRlQ29uZmlnICYmIHJvdXRlLnJvdXRlQ29uZmlnLmRhdGE7XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmJyZWFkY3J1bWJzKSB7XG4gICAgICBsZXQgcmVzb2x2ZXI6IEJyZWFkY3J1bWJzUmVzb2x2ZXI7XG5cbiAgICAgIGlmIChkYXRhLmJyZWFkY3J1bWJzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJyZWFkY3J1bWJzUmVzb2x2ZXIpIHtcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoZGF0YS5icmVhZGNydW1icyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlciA9IHRoaXMuX2RlZmF1bHRSZXNvbHZlcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShyb3V0ZSwgdGhpcy5fcm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcbiAgICAgIGNydW1icyQgPSBCcmVhZGNydW1ic1V0aWxzLndyYXBJbnRvT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+KHJlc3VsdCkucGlwZShcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjcnVtYnMkID0gb2YoW10pO1xuICAgIH1cblxuICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICBjcnVtYnMkID0gY29uY2F0KGNydW1icyQsIHRoaXMuX3Jlc29sdmVDcnVtYnMocm91dGUuZmlyc3RDaGlsZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBjcnVtYnMkO1xuICB9XG59XG4iLCJcbmltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWJzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4uL21vZGVscy9icmVhZGNydW1iJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyZWFkY3J1bWJzJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8b2wgKm5nSWY9XCJjcnVtYnMkIHwgYXN5bmMgYXMgY3J1bWJzXCIgY2xhc3M9XCJicmVhZGNydW1ic19fY29udGFpbmVyXCI+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGNydW1iIG9mIGNydW1iczsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYnJlYWRjcnVtYnNfX2l0ZW0tLWFjdGl2ZSc6IGxhc3QgfVwiXG4gICAgICAgIGNsYXNzPVwiYnJlYWRjcnVtYnNfX2l0ZW1cIlxuICAgICAgPlxuICAgICAgICA8YSAqbmdJZj1cIiFsYXN0XCIgW3JvdXRlckxpbmtdPVwiY3J1bWIucGF0aFwiPnt7IGNydW1iLnRleHQgfX08L2E+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibGFzdFwiPnt7IGNydW1iLnRleHQgfX08L3NwYW4+XG4gICAgICA8L2xpPlxuICAgIDwvb2w+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb21wb25lbnQge1xuICBwdWJsaWMgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+ID0gdGhpcy5icmVhZGNydW1ic1NlcnZpY2UuZ2V0Q3J1bWJzKCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGJyZWFkY3J1bWJzU2VydmljZTogQnJlYWRjcnVtYnNTZXJ2aWNlKSB7IH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb25maWcgfSBmcm9tICcuL3NlcnZpY2VzL2JyZWFkY3J1bWJzLmNvbmZpZyc7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9icmVhZGNydW1icy5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtCcmVhZGNydW1ic0NvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtCcmVhZGNydW1ic0NvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNNb2R1bGUge1xuICBwdWJsaWMgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCcmVhZGNydW1ic01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBCcmVhZGNydW1ic0NvbmZpZyxcbiAgICAgICAgQnJlYWRjcnVtYnNTZXJ2aWNlXG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZm9yQ2hpbGQoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCcmVhZGNydW1ic01vZHVsZVxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7OztnQkFTQyxVQUFVOzs0QkFUWDs7Ozs7OztBQ0VBLEFBS0EscUJBQU0sQ0FBQyxHQUFHO0lBQ1IsUUFBUSxFQUFFLFFBQVE7SUFDbEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUM7QUFDRixDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDOzs7O0FBRW5EOzs7QUFBQTs7Ozs7Ozs7SUFDZ0IsNkJBQVk7Ozs7O2NBQUMsV0FBbUIsRUFBRSxPQUFZO1FBQzFELHFCQUFNLFFBQVEsR0FBRyxDQUFDLENB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