theme-lib
Version:
This is a simple example Angular Library published to npm.
748 lines • 46.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* @license
* Copyright Akveo. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Injectable } from '@angular/core';
import { Location } from '@angular/common';
import { BehaviorSubject, ReplaySubject, Subject } from 'rxjs';
import { share } from 'rxjs/operators';
import { isUrlPathContain, isUrlPathEqual } from './url-matching-helpers';
/**
* @record
*/
export function NbMenuBag() { }
if (false) {
/** @type {?} */
NbMenuBag.prototype.tag;
/** @type {?} */
NbMenuBag.prototype.item;
}
/** @type {?} */
var itemClick$ = new Subject();
/** @type {?} */
var addItems$ = new ReplaySubject(1);
/** @type {?} */
var navigateHome$ = new ReplaySubject(1);
/** @type {?} */
var getSelectedItem$ = new ReplaySubject(1);
/** @type {?} */
var itemSelect$ = new ReplaySubject(1);
/** @type {?} */
var itemHover$ = new ReplaySubject(1);
/** @type {?} */
var submenuToggle$ = new ReplaySubject(1);
/** @type {?} */
var collapseAll$ = new ReplaySubject(1);
// TODO: check if we need both URL and LINK
/*
* Menu Item options
*/
var
// TODO: check if we need both URL and LINK
/*
* Menu Item options
*/
NbMenuItem = /** @class */ (function () {
function NbMenuItem() {
/*
* Item is selected when partly or fully equal to the current url
* @type {string}
*/
this.pathMatch = 'full';
}
/*
* @returns item parents in top-down order
*/
/*
* @returns item parents in top-down order
*/
/**
* @param {?} item
* @return {?}
*/
NbMenuItem.getParents = /*
* @returns item parents in top-down order
*/
/**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var parents = [];
/** @type {?} */
var parent = item.parent;
while (parent) {
parents.unshift(parent);
parent = parent.parent;
}
return parents;
};
/**
* @param {?} item
* @param {?} possibleChild
* @return {?}
*/
NbMenuItem.isParent = /**
* @param {?} item
* @param {?} possibleChild
* @return {?}
*/
function (item, possibleChild) {
return possibleChild.parent
? possibleChild.parent === item || this.isParent(item, possibleChild.parent)
: false;
};
return NbMenuItem;
}());
// TODO: check if we need both URL and LINK
/*
* Menu Item options
*/
export { NbMenuItem };
if (false) {
/** @type {?} */
NbMenuItem.prototype.title;
/** @type {?} */
NbMenuItem.prototype.link;
/** @type {?} */
NbMenuItem.prototype.url;
/** @type {?} */
NbMenuItem.prototype.icon;
/** @type {?} */
NbMenuItem.prototype.expanded;
/** @type {?} */
NbMenuItem.prototype.children;
/** @type {?} */
NbMenuItem.prototype.target;
/** @type {?} */
NbMenuItem.prototype.hidden;
/** @type {?} */
NbMenuItem.prototype.pathMatch;
/** @type {?} */
NbMenuItem.prototype.home;
/** @type {?} */
NbMenuItem.prototype.group;
/** @type {?} */
NbMenuItem.prototype.queryParams;
/** @type {?} */
NbMenuItem.prototype.parent;
/** @type {?} */
NbMenuItem.prototype.selected;
/** @type {?} */
NbMenuItem.prototype.data;
/** @type {?} */
NbMenuItem.prototype.fragment;
}
// TODO: map select events to router change events
// TODO: review the interface
/*
* Menu Service. Allows you to listen to menu events, or to interact with a menu.
*/
var NbMenuService = /** @class */ (function () {
function NbMenuService() {
}
/*
* Add items to the end of the menu items list
* @param {List<NbMenuItem>} items
* @param {string} tag
*/
/*
* Add items to the end of the menu items list
* @param {List<NbMenuItem>} items
* @param {string} tag
*/
/**
* @param {?} items
* @param {?=} tag
* @return {?}
*/
NbMenuService.prototype.addItems = /*
* Add items to the end of the menu items list
* @param {List<NbMenuItem>} items
* @param {string} tag
*/
/**
* @param {?} items
* @param {?=} tag
* @return {?}
*/
function (items, tag) {
addItems$.next({ tag: tag, items: items });
};
/*
* Collapses all menu items
* @param {string} tag
*/
/*
* Collapses all menu items
* @param {string} tag
*/
/**
* @param {?=} tag
* @return {?}
*/
NbMenuService.prototype.collapseAll = /*
* Collapses all menu items
* @param {string} tag
*/
/**
* @param {?=} tag
* @return {?}
*/
function (tag) {
collapseAll$.next({ tag: tag });
};
/*
* Navigate to the home menu item
* @param {string} tag
*/
/*
* Navigate to the home menu item
* @param {string} tag
*/
/**
* @param {?=} tag
* @return {?}
*/
NbMenuService.prototype.navigateHome = /*
* Navigate to the home menu item
* @param {string} tag
*/
/**
* @param {?=} tag
* @return {?}
*/
function (tag) {
navigateHome$.next({ tag: tag });
};
/*
* Returns currently selected item. Won't subscribe to the future events.
* @param {string} tag
* @returns {Observable<{tag: string; item: NbMenuItem}>}
*/
/*
* Returns currently selected item. Won't subscribe to the future events.
* @param {string} tag
* @returns {Observable<{tag: string; item: NbMenuItem}>}
*/
/**
* @param {?=} tag
* @return {?}
*/
NbMenuService.prototype.getSelectedItem = /*
* Returns currently selected item. Won't subscribe to the future events.
* @param {string} tag
* @returns {Observable<{tag: string; item: NbMenuItem}>}
*/
/**
* @param {?=} tag
* @return {?}
*/
function (tag) {
/** @type {?} */
var listener = new BehaviorSubject(null);
getSelectedItem$.next({ tag: tag, listener: listener });
return listener.asObservable();
};
/**
* @return {?}
*/
NbMenuService.prototype.onItemClick = /**
* @return {?}
*/
function () {
return itemClick$.pipe(share());
};
/**
* @return {?}
*/
NbMenuService.prototype.onItemSelect = /**
* @return {?}
*/
function () {
return itemSelect$.pipe(share());
};
/**
* @return {?}
*/
NbMenuService.prototype.onItemHover = /**
* @return {?}
*/
function () {
return itemHover$.pipe(share());
};
/**
* @return {?}
*/
NbMenuService.prototype.onSubmenuToggle = /**
* @return {?}
*/
function () {
return submenuToggle$.pipe(share());
};
NbMenuService.decorators = [
{ type: Injectable }
];
return NbMenuService;
}());
export { NbMenuService };
var NbMenuInternalService = /** @class */ (function () {
function NbMenuInternalService(location) {
this.location = location;
}
/**
* @param {?} items
* @return {?}
*/
NbMenuInternalService.prototype.prepareItems = /**
* @param {?} items
* @return {?}
*/
function (items) {
var _this = this;
/** @type {?} */
var defaultItem = new NbMenuItem();
items.forEach(function (i) {
_this.applyDefaults(i, defaultItem);
_this.setParent(i);
});
};
/**
* @param {?} items
* @param {?} tag
* @param {?=} collapseOther
* @return {?}
*/
NbMenuInternalService.prototype.selectFromUrl = /**
* @param {?} items
* @param {?} tag
* @param {?=} collapseOther
* @return {?}
*/
function (items, tag, collapseOther) {
if (collapseOther === void 0) { collapseOther = false; }
/** @type {?} */
var selectedItem = this.findItemByUrl(items);
if (selectedItem) {
this.selectItem(selectedItem, items, collapseOther, tag);
}
};
/**
* @param {?} item
* @param {?} items
* @param {?=} collapseOther
* @param {?=} tag
* @return {?}
*/
NbMenuInternalService.prototype.selectItem = /**
* @param {?} item
* @param {?} items
* @param {?=} collapseOther
* @param {?=} tag
* @return {?}
*/
function (item, items, collapseOther, tag) {
if (collapseOther === void 0) { collapseOther = false; }
var e_1, _a, e_2, _b;
/** @type {?} */
var unselectedItems = this.resetSelection(items);
/** @type {?} */
var collapsedItems = collapseOther ? this.collapseItems(items) : [];
try {
for (var _c = tslib_1.__values(NbMenuItem.getParents(item)), _d = _c.next(); !_d.done; _d = _c.next()) {
var parent_1 = _d.value;
parent_1.selected = true;
// emit event only for items that weren't selected before ('unselectedItems' contains items that were selected)
if (!unselectedItems.includes(parent_1)) {
this.itemSelect(parent_1, tag);
}
/** @type {?} */
var wasNotExpanded = !parent_1.expanded;
parent_1.expanded = true;
/** @type {?} */
var i = collapsedItems.indexOf(parent_1);
// emit event only for items that weren't expanded before.
// 'collapsedItems' contains items that were expanded, so no need to emit event.
// in case 'collapseOther' is false, 'collapsedItems' will be empty,
// so also check if item isn't expanded already ('wasNotExpanded').
if (i === -1 && wasNotExpanded) {
this.submenuToggle(parent_1, tag);
}
else {
collapsedItems.splice(i, 1);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
}
finally { if (e_1) throw e_1.error; }
}
item.selected = true;
// emit event only for items that weren't selected before ('unselectedItems' contains items that were selected)
if (!unselectedItems.includes(item)) {
this.itemSelect(item, tag);
}
try {
// remaining items which wasn't expanded back after expanding all currently selected items
for (var collapsedItems_1 = tslib_1.__values(collapsedItems), collapsedItems_1_1 = collapsedItems_1.next(); !collapsedItems_1_1.done; collapsedItems_1_1 = collapsedItems_1.next()) {
var collapsedItem = collapsedItems_1_1.value;
this.submenuToggle(collapsedItem, tag);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (collapsedItems_1_1 && !collapsedItems_1_1.done && (_b = collapsedItems_1.return)) _b.call(collapsedItems_1);
}
finally { if (e_2) throw e_2.error; }
}
};
/**
* @param {?} items
* @param {?} tag
* @param {?=} except
* @return {?}
*/
NbMenuInternalService.prototype.collapseAll = /**
* @param {?} items
* @param {?} tag
* @param {?=} except
* @return {?}
*/
function (items, tag, except) {
var e_3, _a;
/** @type {?} */
var collapsedItems = this.collapseItems(items, except);
try {
for (var collapsedItems_2 = tslib_1.__values(collapsedItems), collapsedItems_2_1 = collapsedItems_2.next(); !collapsedItems_2_1.done; collapsedItems_2_1 = collapsedItems_2.next()) {
var item = collapsedItems_2_1.value;
this.submenuToggle(item, tag);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (collapsedItems_2_1 && !collapsedItems_2_1.done && (_a = collapsedItems_2.return)) _a.call(collapsedItems_2);
}
finally { if (e_3) throw e_3.error; }
}
};
/**
* @return {?}
*/
NbMenuInternalService.prototype.onAddItem = /**
* @return {?}
*/
function () {
return addItems$.pipe(share());
};
/**
* @return {?}
*/
NbMenuInternalService.prototype.onNavigateHome = /**
* @return {?}
*/
function () {
return navigateHome$.pipe(share());
};
/**
* @return {?}
*/
NbMenuInternalService.prototype.onCollapseAll = /**
* @return {?}
*/
function () {
return collapseAll$.pipe(share());
};
/**
* @return {?}
*/
NbMenuInternalService.prototype.onGetSelectedItem = /**
* @return {?}
*/
function () {
return getSelectedItem$.pipe(share());
};
/**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
NbMenuInternalService.prototype.itemHover = /**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
function (item, tag) {
itemHover$.next({ tag: tag, item: item });
};
/**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
NbMenuInternalService.prototype.submenuToggle = /**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
function (item, tag) {
submenuToggle$.next({ tag: tag, item: item });
};
/**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
NbMenuInternalService.prototype.itemSelect = /**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
function (item, tag) {
itemSelect$.next({ tag: tag, item: item });
};
/**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
NbMenuInternalService.prototype.itemClick = /**
* @param {?} item
* @param {?=} tag
* @return {?}
*/
function (item, tag) {
itemClick$.next({ tag: tag, item: item });
};
/*
* Unselect all given items deeply.
* @param items array of items to unselect.
* @returns items which selected value was changed.
*/
/*
* Unselect all given items deeply.
* @param items array of items to unselect.
* @returns items which selected value was changed.
*/
/**
* @private
* @param {?} items
* @return {?}
*/
NbMenuInternalService.prototype.resetSelection = /*
* Unselect all given items deeply.
* @param items array of items to unselect.
* @returns items which selected value was changed.
*/
/**
* @private
* @param {?} items
* @return {?}
*/
function (items) {
var e_4, _a;
/** @type {?} */
var unselectedItems = [];
try {
for (var items_1 = tslib_1.__values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
var item = items_1_1.value;
if (item.selected) {
unselectedItems.push(item);
}
item.selected = false;
if (item.children) {
unselectedItems.push.apply(unselectedItems, tslib_1.__spread(this.resetSelection(item.children)));
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
}
finally { if (e_4) throw e_4.error; }
}
return unselectedItems;
};
/*
* Collapse all given items deeply.
* @param items array of items to collapse.
* @param except menu item which shouldn't be collapsed, also disables collapsing for parents of this item.
* @returns items which expanded value was changed.
*/
/*
* Collapse all given items deeply.
* @param items array of items to collapse.
* @param except menu item which shouldn't be collapsed, also disables collapsing for parents of this item.
* @returns items which expanded value was changed.
*/
/**
* @private
* @param {?} items
* @param {?=} except
* @return {?}
*/
NbMenuInternalService.prototype.collapseItems = /*
* Collapse all given items deeply.
* @param items array of items to collapse.
* @param except menu item which shouldn't be collapsed, also disables collapsing for parents of this item.
* @returns items which expanded value was changed.
*/
/**
* @private
* @param {?} items
* @param {?=} except
* @return {?}
*/
function (items, except) {
var e_5, _a;
/** @type {?} */
var collapsedItems = [];
try {
for (var items_2 = tslib_1.__values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
var item = items_2_1.value;
if (except && (item === except || NbMenuItem.isParent(item, except))) {
continue;
}
if (item.expanded) {
collapsedItems.push(item);
}
item.expanded = false;
if (item.children) {
collapsedItems.push.apply(collapsedItems, tslib_1.__spread(this.collapseItems(item.children)));
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
}
finally { if (e_5) throw e_5.error; }
}
return collapsedItems;
};
/**
* @private
* @param {?} item
* @param {?} defaultItem
* @return {?}
*/
NbMenuInternalService.prototype.applyDefaults = /**
* @private
* @param {?} item
* @param {?} defaultItem
* @return {?}
*/
function (item, defaultItem) {
var _this = this;
/** @type {?} */
var menuItem = tslib_1.__assign({}, item);
Object.assign(item, defaultItem, menuItem);
item.children && item.children.forEach(function (child) {
_this.applyDefaults(child, defaultItem);
});
};
/**
* @private
* @param {?} item
* @return {?}
*/
NbMenuInternalService.prototype.setParent = /**
* @private
* @param {?} item
* @return {?}
*/
function (item) {
var _this = this;
item.children && item.children.forEach(function (child) {
child.parent = item;
_this.setParent(child);
});
};
/*
* Find deepest item which link matches current URL path.
* @param items array of items to search in.
* @returns found item of undefined.
*/
/*
* Find deepest item which link matches current URL path.
* @param items array of items to search in.
* @returns found item of undefined.
*/
/**
* @private
* @param {?} items
* @return {?}
*/
NbMenuInternalService.prototype.findItemByUrl = /*
* Find deepest item which link matches current URL path.
* @param items array of items to search in.
* @returns found item of undefined.
*/
/**
* @private
* @param {?} items
* @return {?}
*/
function (items) {
var _this = this;
/** @type {?} */
var selectedItem;
items.some(function (item) {
if (item.children) {
selectedItem = _this.findItemByUrl(item.children);
}
if (!selectedItem && _this.isSelectedInUrl(item)) {
selectedItem = item;
}
return selectedItem;
});
return selectedItem;
};
/**
* @private
* @param {?} item
* @return {?}
*/
NbMenuInternalService.prototype.isSelectedInUrl = /**
* @private
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var exact = item.pathMatch === 'full';
return exact
? isUrlPathEqual(this.location.path(), item.link)
: isUrlPathContain(this.location.path(), item.link);
};
NbMenuInternalService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NbMenuInternalService.ctorParameters = function () { return [
{ type: Location }
]; };
return NbMenuInternalService;
}());
export { NbMenuInternalService };
if (false) {
/**
* @type {?}
* @private
*/
NbMenuInternalService.prototype.location;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbWVudS9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBYyxlQUFlLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBRTFFLCtCQUE0RDs7O0lBQS9CLHdCQUFZOztJQUFDLHlCQUFnQjs7O0lBRXBELFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBYTs7SUFDckMsU0FBUyxHQUFHLElBQUksYUFBYSxDQUF1QyxDQUFDLENBQUM7O0lBQ3RFLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBa0IsQ0FBQyxDQUFDOztJQUNyRCxnQkFBZ0IsR0FDbEIsSUFBSSxhQUFhLENBQXdELENBQUMsQ0FBQzs7SUFDekUsV0FBVyxHQUFHLElBQUksYUFBYSxDQUFZLENBQUMsQ0FBQzs7SUFDN0MsVUFBVSxHQUFHLElBQUksYUFBYSxDQUFZLENBQUMsQ0FBQzs7SUFDNUMsY0FBYyxHQUFHLElBQUksYUFBYSxDQUFZLENBQUMsQ0FBQzs7SUFDaEQsWUFBWSxHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUM7Ozs7O0FBTTFEOzs7Ozs7SUFBQTs7Ozs7UUE2Q0UsY0FBUyxHQUFZLE1BQU0sQ0FBQztJQXdDOUIsQ0FBQztJQXBCQzs7T0FFRzs7Ozs7Ozs7SUFDSSxxQkFBVTs7Ozs7OztJQUFqQixVQUFrQixJQUFnQjs7WUFDMUIsT0FBTyxH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LENBQUM7YUFDckI7WUFFRCxPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7Ozs7OztJQUVPLCtDQUFlOzs7OztJQUF2QixVQUF3QixJQUFnQjs7WUFDaEMsS0FBSyxHQUFZLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTTtRQUNoRCxPQUFPLEtBQUs7WUFDVixDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNqRCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQzs7Z0JBNUxGLFVBQVU7Ozs7Z0JBNUtGLFFBQVE7O0lBeVdqQiw0QkFBQztDQUFBLEFBN0xELElBNkxDO1NBNUxZLHFCQUFxQjs7Ozs7O0lBRXBCLHlDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHNoYXJlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBpc1VybFBhdGhDb250YWluLCBpc1VybFBhdGhFcXVhbCB9IGZyb20gJy4vdXJsLW1hdGNoaW5nLWhlbHBlcnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYk1lbnVCYWcgeyB0YWc6IHN0cmluZzsgaXRlbTogTmJNZW51SXRlbSB9XHJcblxyXG5jb25zdCBpdGVtQ2xpY2skID0gbmV3IFN1YmplY3Q8TmJNZW51QmFnPigpO1xyXG5jb25zdCBhZGRJdGVtcyQgPSBuZXcgUmVwbGF5U3ViamVjdDx7IHRhZzogc3RyaW5nOyBpdGVtczogTmJNZW51SXRlbVtdIH0+KDEpO1xyXG5jb25zdCBuYXZpZ2F0ZUhvbWUkID0gbmV3IFJlcGxheVN1YmplY3Q8eyB0YWc6IHN0cmluZyB9PigxKTtcclxuY29uc3QgZ2V0U2VsZWN0ZWRJdGVtJFxyXG4gID0gbmV3IFJlcGxheVN1YmplY3Q8eyB0YWc6IHN0cmluZzsgbGlzdGVuZXI6IEJlaGF2aW9yU3ViamVjdDxOYk1lbnVCYWc+IH0+KDEpO1xyXG5jb25zdCBpdGVtU2VsZWN0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PE5iTWVudUJhZz4oMSk7XHJcbmNvbnN0IGl0ZW1Ib3ZlciQgPSBuZXcgUmVwbGF5U3ViamVjdDxOYk1lbnVCYWc+KDEpO1xyXG5jb25zdCBzdWJtZW51VG9nZ2xlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PE5iTWVudUJhZz4oMSk7XHJcbmNvbnN0IGNvbGxhcHNlQWxsJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHsgdGFnOiBzdHJpbmcgfT4oMSk7XHJcblxyXG4vLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIGJvdGggVVJMIGFuZCBMSU5LXHJcbi8qXHJcbiAqIE1lbnUgSXRlbSBvcHRpb25zXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTmJNZW51SXRlbSB7XHJcbiAgLypcclxuICAgKiBJdGVtIFRpdGxlXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIC8qXHJcbiAgICogSXRlbSByZWxhdGl2ZSBsaW5rIChmb3Igcm91dGVyTGluaylcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIGxpbms/OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBJdGVtIFVSTCAoYWJzb2x1dGUpXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBJY29uIGNsYXNzIG5hbWVcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIGljb24/OiBzdHJpbmc7XHJcbiAgLypcclxuICAgKiBFeHBhbmRlZCBieSBkZWZhdWxcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBleHBhbmRlZD86IGJvb2xlYW47XHJcbiAgLypcclxuICAgKiBDaGlsZHJlbiBpdGVtc1xyXG4gICAqIEB0eXBlIHtMaXN0PE5iTWVudUl0ZW0+fVxyXG4gICAqL1xyXG4gIGNoaWxkcmVuPzogTmJNZW51SXRlbVtdO1xyXG4gIC8qXHJcbiAgICogSFRNTCBMaW5rIHRhcmdldFxyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICovXHJcbiAgdGFyZ2V0Pzogc3RyaW5nO1xyXG4gIC8qXHJcbiAgICogSGlkZGVuIEl0ZW1cclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBoaWRkZW4/OiBib29sZWFuO1xyXG4gIC8qXHJcbiAgICogSXRlbSBpcyBzZWxlY3RlZCB3aGVuIHBhcnRseSBvciBmdWxseSBlcXVhbCB0byB0aGUgY3VycmVudCB1cmxcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIHBhdGhNYXRjaD86IHN0cmluZyA9ICdmdWxsJztcclxuICAvKlxyXG4gICAqIFdoZXJlIHRoaXMgaXMgYSBob21lIGl0ZW1cclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBob21lPzogYm9vbGVhbjtcclxuICAvKlxyXG4gICAqIFdoZXRoZXIgdGhlIGl0ZW0gaXMganVzdCBhIGdyb3VwIChub24tY2xpY2thYmxlKVxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xyXG4gIGdyb3VwPzogYm9vbGVhbjtcclxuICAvKiBNYXAgb2YgcXVlcnkgcGFyYW1ldGVyc1xyXG4gICAqQHR5cGUge1BhcmFtc31cclxuICAgKi9cclxuICBxdWVyeVBhcmFtcz86IFBhcmFtcztcclxuICBwYXJlbnQ/OiBOYk1lbnVJdGVtO1xyXG4gIHNlbGVjdGVkPzogYm9vbGVhbjtcclxuICBkYXRhPzogYW55O1xyXG4gIGZyYWdtZW50Pzogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIEByZXR1cm5zIGl0ZW0gcGFyZW50cyBpbiB0b3AtZG93biBvcmRlclxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXRQYXJlbnRzKGl0ZW06IE5iTWVudUl0ZW0pOiBOYk1lbnVJdGVtW10ge1xyXG4gICAgY29uc3QgcGFyZW50cyA9IFtdO1xyXG5cclxuICAgIGxldCBwYXJlbnQgPSBpdGVtLnBhcmVudDtcclxuICAgIHdoaWxlIChwYXJlbnQpIHtcclxuICAgICAgcGFyZW50cy51bnNoaWZ0KHBhcmVudCk7XHJcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNQYXJlbnQoaXRlbTogTmJNZW51SXRlbSwgcG9zc2libGVDaGlsZDogTmJNZW51SXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHBvc3NpYmxlQ2hpbGQucGFyZW50XHJcbiAgICAgID8gcG9zc2libGVDaGlsZC5wYXJlbnQgPT09IGl0ZW0gfHwgdGhpcy5pc1BhcmVudChpdGVtLCBwb3NzaWJsZUNoaWxkLnBhcmVudClcclxuICAgICAgOiBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbi8vIFRPRE86IG1hcCBzZWxlY3QgZXZlbnRzIHRvIHJvdXRlciBjaGFuZ2UgZXZlbnRzXHJcbi8vIFRPRE86IHJldmlldyB0aGUgaW50ZXJmYWNlXHJcbi8qXHJcbiAqIE1lbnUgU2VydmljZS4gQWxsb3dzIHlvdSB0byBsaXN0ZW4gdG8gbWVudSBldmVudHMsIG9yIHRvIGludGVyYWN0IHdpdGggYSBtZW51LlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJNZW51U2VydmljZSB7XHJcblxyXG4gIC8qXHJcbiAgICogQWRkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdGhlIG1lbnUgaXRlbXMgbGlzdFxyXG4gICAqIEBwYXJhbSB7TGlzdDxOYk1lbnVJdGVtPn0gaXRlbXNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXHJcbiAgICovXHJcbiAgYWRkSXRlbXMoaXRlbXM6IE5iTWVudUl0ZW1bXSwgdGFnPzogc3RyaW5nKSB7XHJcbiAgICBhZGRJdGVtcyQubmV4dCh7IHRhZywgaXRlbXMgfSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENvbGxhcHNlcyBhbGwgbWVudSBpdGVtc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcclxuICAgKi9cclxuICBjb2xsYXBzZUFsbCh0YWc/OiBzdHJpbmcpIHtcclxuICAgIGNvbGxhcHNlQWxsJC5uZXh0KHsgdGFnIH0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBOYXZpZ2F0ZSB0byB0aGUgaG9tZSBtZW51IGl0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXHJcbiAgICovXHJcbiAgbmF2aWdhdGVIb21lKHRhZz86IHN0cmluZykge1xyXG4gICAgbmF2aWdhdGVIb21lJC5uZXh0KHsgdGFnIH0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBSZXR1cm5zIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiBXb24ndCBzdWJzY3JpYmUgdG8gdGhlIGZ1dHVyZSBldmVudHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPHt0YWc6IHN0cmluZzsgaXRlbTogTmJNZW51SXRlbX0+fVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkSXRlbSh0YWc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgY29uc3QgbGlzdGVuZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE5iTWVudUJhZz4obnVsbCk7XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWRJdGVtJC5uZXh0KHsgdGFnLCBsaXN0ZW5lciB9KTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXIuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1DbGljaygpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIGl0ZW1DbGljayQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIG9uSXRlbVNlbGVjdCgpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIGl0ZW1TZWxlY3QkLnBpcGUoc2hhcmUoKSk7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1Ib3ZlcigpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIGl0ZW1Ib3ZlciQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIG9uU3VibWVudVRvZ2dsZSgpOiBPYnNlcnZhYmxlPE5iTWVudUJhZz4ge1xyXG4gICAgcmV0dXJuIHN1Ym1lbnVUb2dnbGUkLnBpcGUoc2hhcmUoKSk7XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYk1lbnVJbnRlcm5hbFNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbikge31cclxuXHJcbiAgcHJlcGFyZUl0ZW1zKGl0ZW1zOiBOYk1lbnVJdGVtW10pIHtcclxuICAgIGNvbnN0IGRlZmF1bHRJdGVtID0gbmV3IE5iTWVudUl0ZW0oKTtcclxuICAgIGl0ZW1zLmZvckVhY2goaSA9PiB7XHJcbiAgICAgIHRoaXMuYXBwbHlEZWZhdWx0cyhpLCBkZWZhdWx0SXRlbSk7XHJcbiAgICAgIHRoaXMuc2V0UGFyZW50KGkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RGcm9tVXJsKGl0ZW1zOiBOYk1lbnVJdGVtW10sIHRhZzogc3RyaW5nLCBjb2xsYXBzZU90aGVyOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuZmluZEl0ZW1CeVVybChpdGVtcyk7XHJcbiAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0SXRlbShzZWxlY3RlZEl0ZW0sIGl0ZW1zLCBjb2xsYXBzZU90aGVyLCB0YWcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0SXRlbShpdGVtOiBOYk1lbnVJdGVtLCBpdGVtczogTmJNZW51SXRlbVtdLCBjb2xsYXBzZU90aGVyOiBib29sZWFuID0gZmFsc2UsIHRhZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB1bnNlbGVjdGVkSXRlbXMgPSB0aGlzLnJlc2V0U2VsZWN0aW9uKGl0ZW1zKTtcclxuICAgIGNvbnN0IGNvbGxhcHNlZEl0ZW1zID0gY29sbGFwc2VPdGhlciA/IHRoaXMuY29sbGFwc2VJdGVtcyhpdGVtcykgOiBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBOYk1lbnVJdGVtLmdldFBhcmVudHMoaXRlbSkpIHtcclxuICAgICAgcGFyZW50LnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgLy8gZW1pdCBldmVudCBvbmx5IGZvciBpdGVtcyB0aGF0IHdlcmVuJ3Qgc2VsZWN0ZWQgYmVmb3JlICgndW5zZWxlY3RlZEl0ZW1zJyBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgc2VsZWN0ZWQpXHJcbiAgICAgIGlmICghdW5zZWxlY3RlZEl0ZW1zLmluY2x1ZGVzKHBhcmVudCkpIHtcclxuICAgICAgICB0aGlzLml0ZW1TZWxlY3QocGFyZW50LCB0YWcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB3YXNOb3RFeHBhbmRlZCA9ICFwYXJlbnQuZXhwYW5kZWQ7XHJcbiAgICAgIHBhcmVudC5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIGNvbnN0IGkgPSBjb2xsYXBzZWRJdGVtcy5pbmRleE9mKHBhcmVudCk7XHJcbiAgICAgIC8vIGVtaXQgZXZlbnQgb25seSBmb3IgaXRlbXMgdGhhdCB3ZXJlbid0IGV4cGFuZGVkIGJlZm9yZS5cclxuICAgICAgLy8gJ2NvbGxhcHNlZEl0ZW1zJyBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgZXhwYW5kZWQsIHNvIG5vIG5lZWQgdG8gZW1pdCBldmVudC5cclxuICAgICAgLy8gaW4gY2FzZSAnY29sbGFwc2VPdGhlcicgaXMgZmFsc2UsICdjb2xsYXBzZWRJdGVtcycgd2lsbCBiZSBlbXB0eSxcclxuICAgICAgLy8gc28gYWxzbyBjaGVjayBpZiBpdGVtIGlzbid0IGV4cGFuZGVkIGFscmVhZHkgKCd3YXNOb3RFeHBhbmRlZCcpLlxyXG4gICAgICBpZiAoaSA9PT0gLTEgJiYgd2FzTm90RXhwYW5kZWQpIHtcclxuICAgICAgICB0aGlzLnN1Ym1lbnVUb2dnbGUocGFyZW50LCB0YWcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbGxhcHNlZEl0ZW1zLnNwbGljZShpLCAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgLy8gZW1pdCBldmVudCBvbmx5IGZvciBpdGVtcyB0aGF0IHdlcmVuJ3Qgc2VsZWN0ZWQgYmVmb3JlICgndW5zZWxlY3RlZEl0ZW1zJyBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgc2VsZWN0ZWQpXHJcbiAgICBpZiAoIXVuc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICB0aGlzLml0ZW1TZWxlY3QoaXRlbSwgdGFnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZW1haW5pbmcgaXRlbXMgd2hpY2ggd2Fzbid0IGV4cGFuZGVkIGJhY2sgYWZ0ZXIgZXhwYW5kaW5nIGFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXNcclxuICAgIGZvciAoY29uc3QgY29sbGFwc2VkSXRlbSBvZiBjb2xsYXBzZWRJdGVtcykge1xyXG4gICAgICB0aGlzLnN1Ym1lbnVUb2dnbGUoY29sbGFwc2VkSXRlbSwgdGFnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbGxhcHNlQWxsKGl0ZW1zOiBOYk1lbnVJdGVtW10sIHRhZzogc3RyaW5nLCBleGNlcHQ/OiBOYk1lbnVJdGVtKSB7XHJcbiAgICBjb25zdCBjb2xsYXBzZWRJdGVtcyA9IHRoaXMuY29sbGFwc2VJdGVtcyhpdGVtcywgZXhjZXB0KTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGFwc2VkSXRlbXMpIHtcclxuICAgICAgdGhpcy5zdWJtZW51VG9nZ2xlKGl0ZW0sIHRhZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkFkZEl0ZW0oKTogT2JzZXJ2YWJsZTx7IHRhZzogc3RyaW5nOyBpdGVtczogTmJNZW51SXRlbVtdIH0+IHtcclxuICAgIHJldHVybiBhZGRJdGVtcyQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIG9uTmF2aWdhdGVIb21lKCk6IE9ic2VydmFibGU8eyB0YWc6IHN0cmluZyB9PiB7XHJcbiAgICByZXR1cm4gbmF2aWdhdGVIb21lJC5waXBlKHNoYXJlKCkpO1xyXG4gIH1cclxuXHJcbiAgb25Db2xsYXBzZUFsbCgpOiBPYnNlcnZhYmxlPHsgdGFnOiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIGNvbGxhcHNlQWxsJC5waXBlKHNoYXJlKCkpO1xyXG4gIH1cclxuXHJcbiAgb25HZXRTZWxlY3RlZEl0ZW0oKTogT2JzZXJ2YWJsZTx7IHRhZzogc3RyaW5nOyBsaXN0ZW5lcjogQmVoYXZpb3JTdWJqZWN0PE5iTWVudUJhZz4gfT4ge1xyXG4gICAgcmV0dXJuIGdldFNlbGVjdGVkSXRlbSQucGlwZShzaGFyZSgpKTtcclxuICB9XHJcblxyXG4gIGl0ZW1Ib3ZlcihpdGVtOiBOYk1lbnVJdGVtLCB0YWc/OiBzdHJpbmcpIHtcclxuICAgIGl0ZW1Ib3ZlciQubmV4dCh7dGFnLCBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBzdWJtZW51VG9nZ2xlKGl0ZW06IE5iTWVudUl0ZW0sIHRhZz86IHN0cmluZykge1xyXG4gICAgc3VibWVudVRvZ2dsZSQubmV4dCh7dGFnLCBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBpdGVtU2VsZWN0KGl0ZW06IE5iTWVudUl0ZW0sIHRhZz86IHN0cmluZykge1xyXG4gICAgaXRlbVNlbGVjdCQubmV4dCh7dGFnLCBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBpdGVtQ2xpY2soaXRlbTogTmJNZW51SXRlbSwgdGFnPzogc3RyaW5nKSB7XHJcbiAgICBpdGVtQ2xpY2skLm5leHQoe3RhZywgaXRlbX0pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBVbnNlbGVjdCBhbGwgZ2l2ZW4gaXRlbXMgZGVlcGx5LlxyXG4gICAqIEBwYXJhbSBpdGVtcyBhcnJheSBvZiBpdGVtcyB0byB1bnNlbGVjdC5cclxuICAgKiBAcmV0dXJucyBpdGVtcyB3aGljaCBzZWxlY3RlZCB2YWx1ZSB3YXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBwcml2YXRlIHJlc2V0U2VsZWN0aW9uKGl0ZW1zOiBOYk1lbnVJdGVtW10pOiBOYk1lbnVJdGVtW10ge1xyXG4gICAgY29uc3QgdW5zZWxlY3RlZEl0ZW1zID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgdW5zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5zZWxlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICB1bnNlbGVjdGVkSXRlbXMucHVzaCguLi50aGlzLnJlc2V0U2VsZWN0aW9uKGl0ZW0uY2hpbGRyZW4pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1bnNlbGVjdGVkSXRlbXM7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENvbGxhcHNlIGFsbCBnaXZlbiBpdGVtcyBkZWVwbHkuXHJcbiAgICogQHBhcmFtIGl0ZW1zIGFycmF5IG9mIGl0ZW1zIHRvIGNvbGxhcHNlLlxyXG4gICAqIEBwYXJhbSBleGNlcHQgbWVudSBpdGVtIHdoaWNoIHNob3VsZG4ndCBiZSBjb2xsYXBzZWQsIGFsc28gZGlzYWJsZXMgY29sbGFwc2luZyBmb3IgcGFyZW50cyBvZiB0aGlzIGl0ZW0uXHJcbiAgICogQHJldHVybnMgaXRlbXMgd2hpY2ggZXhwYW5kZWQgdmFsdWUgd2FzIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb2xsYXBzZUl0ZW1zKGl0ZW1zOiBOYk1lbnVJdGVtW10sIGV4Y2VwdD86IE5iTWVudUl0ZW0pOiBOYk1lbnVJdGVtW10ge1xyXG4gICAgY29uc3QgY29sbGFwc2VkSXRlbXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKGV4Y2VwdCAmJiAoaXRlbSA9PT0gZXhjZXB0IHx8IE5iTWVudUl0ZW0uaXNQYXJlbnQoaXRlbSwgZXhjZXB0KSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHtcclxuICAgICAgICBjb2xsYXBzZWRJdGVtcy5wdXNoKGl0ZW0pXHJcbiAgICAgIH1cclxuICAgICAgaXRlbS5leHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4pIHtcclxuICAgICAgICBjb2xsYXBzZWRJdGVtcy5wdXNoKC4uLnRoaXMuY29sbGFwc2VJdGVtcyhpdGVtLmNoaWxkcmVuKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY29sbGFwc2VkSXRlbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5RGVmYXVsdHMoaXRlbSwgZGVmYXVsdEl0ZW0pIHtcclxuICAgIGNvbnN0IG1lbnVJdGVtID0gey4uLml0ZW19O1xyXG4gICAgT2JqZWN0LmFzc2lnbihpdGVtLCBkZWZhdWx0SXRlbSwgbWVudUl0ZW0pO1xyXG4gICAgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICB0aGlzLmFwcGx5RGVmYXVsdHMoY2hpbGQsIGRlZmF1bHRJdGVtKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQYXJlbnQoaXRlbTogTmJNZW51SXRlbSkge1xyXG4gICAgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBjaGlsZC5wYXJlbnQgPSBpdGVtO1xyXG4gICAgICB0aGlzLnNldFBhcmVudChjaGlsZCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogRmluZCBkZWVwZXN0IGl0ZW0gd2hpY2ggbGluayBtYXRjaGVzIGN1cnJlbnQgVVJMIHBhdGguXHJcbiAgICogQHBhcmFtIGl0ZW1zIGFycmF5IG9mIGl0ZW1zIHRvIHNlYXJjaCBpbi5cclxuICAgKiBAcmV0dXJucyBmb3VuZCBpdGVtIG9mIHVuZGVmaW5lZC5cclxuICAgKi9cclxuICBwcml2YXRlIGZpbmRJdGVtQnlVcmwoaXRlbXM6IE5iTWVudUl0ZW1bXSk6IE5iTWVudUl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgbGV0IHNlbGVjdGVkSXRlbTtcclxuXHJcbiAgICBpdGVtcy5zb21lKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xyXG4gICAgICAgIHNlbGVjdGVkSXRlbSA9IHRoaXMuZmluZEl0ZW1CeVVybChpdGVtLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXNlbGVjdGVkSXRlbSAmJiB0aGlzLmlzU2VsZWN0ZWRJblVybChpdGVtKSkge1xyXG4gICAgICAgIHNlbGVjdGVkSXRlbSA9IGl0ZW07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gc2VsZWN0ZWRJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGVkSW5VcmwoaXRlbTogTmJNZW51SXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZXhhY3Q6IGJvb2xlYW4gPSBpdGVtLnBhdGhNYXRjaCA9PT0gJ2Z1bGwnO1xyXG4gICAgcmV0dXJuIGV4YWN0XHJcbiAgICAgID8gaXNVcmxQYXRoRXF1YWwodGhpcy5sb2NhdGlvbi5wYXRoKCksIGl0ZW0ubGluaylcclxuICAgICAgOiBpc1VybFBhdGhDb250YWluKHRoaXMubG9jYXRpb24ucGF0aCgpLCBpdGVtLmxpbmspO1xyXG4gIH1cclxufVxyXG4iXX0=