theme-lib
Version:
This is a simple example Angular Library published to npm.
572 lines • 44.8 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 { Component, Input, Output, EventEmitter, HostBinding, Inject, } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { takeWhile, filter, map } from 'rxjs/operators';
import { NbMenuInternalService, NbMenuService } from './menu.service';
import { convertToBoolProperty } from '../helpers';
import { NB_WINDOW } from '../../theme.options';
import { animate, state, style, transition, trigger } from '@angular/animations';
/** @enum {string} */
var NbToggleStates = {
Expanded: 'expanded',
Collapsed: 'collapsed',
};
export { NbToggleStates };
var NbMenuItemComponent = /** @class */ (function () {
function NbMenuItemComponent(menuService) {
this.menuService = menuService;
this.menuItem = (/** @type {?} */ (null));
this.hoverItem = new EventEmitter();
this.toggleSubMenu = new EventEmitter();
this.selectItem = new EventEmitter();
this.itemClick = new EventEmitter();
this.alive = true;
}
/**
* @return {?}
*/
NbMenuItemComponent.prototype.ngDoCheck = /**
* @return {?}
*/
function () {
this.toggleState = this.menuItem.expanded ? NbToggleStates.Expanded : NbToggleStates.Collapsed;
};
/**
* @return {?}
*/
NbMenuItemComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.menuService.onSubmenuToggle()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (_a) {
var item = _a.item;
return item === _this.menuItem;
}), map(function (_a) {
var item = _a.item;
return item.expanded;
}))
.subscribe(function (isExpanded) { return _this.toggleState = isExpanded ? NbToggleStates.Expanded : NbToggleStates.Collapsed; });
};
/**
* @return {?}
*/
NbMenuItemComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.alive = false;
};
/**
* @param {?} item
* @return {?}
*/
NbMenuItemComponent.prototype.onToggleSubMenu = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.toggleSubMenu.emit(item);
};
/**
* @param {?} item
* @return {?}
*/
NbMenuItemComponent.prototype.onHoverItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.hoverItem.emit(item);
};
/**
* @param {?} item
* @return {?}
*/
NbMenuItemComponent.prototype.onSelectItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.selectItem.emit(item);
};
/**
* @param {?} item
* @return {?}
*/
NbMenuItemComponent.prototype.onItemClick = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.itemClick.emit(item);
};
NbMenuItemComponent.decorators = [
{ type: Component, args: [{
selector: '[nbMenuItem]',
template: "<span *ngIf=\"menuItem.group\">\r\n <i class=\"menu-icon {{ menuItem.icon }}\" *ngIf=\"menuItem.icon\"></i>\r\n {{ menuItem.title }}\r\n</span>\r\n<a *ngIf=\"menuItem.link && !menuItem.url && !menuItem.children && !menuItem.group\"\r\n [routerLink]=\"menuItem.link\"\r\n [queryParams]=\"menuItem.queryParams\"\r\n [fragment]=\"menuItem.fragment\"\r\n [attr.target]=\"menuItem.target\"\r\n [attr.title]=\"menuItem.title\"\r\n [class.active]=\"menuItem.selected\"\r\n (mouseenter)=\"onHoverItem(menuItem)\"\r\n (click)=\"onItemClick(menuItem);\">\r\n <i class=\"menu-icon {{ menuItem.icon }}\" *ngIf=\"menuItem.icon\"></i>\r\n <span class=\"menu-title\">{{ menuItem.title }}</span>\r\n</a>\r\n<a *ngIf=\"menuItem.url && !menuItem.children && !menuItem.link && !menuItem.group\"\r\n [attr.href]=\"menuItem.url\"\r\n [attr.target]=\"menuItem.target\"\r\n [attr.title]=\"menuItem.title\"\r\n [class.active]=\"menuItem.selected\"\r\n (mouseenter)=\"onHoverItem(menuItem)\"\r\n (click)=\"onSelectItem(menuItem)\">\r\n <i class=\"menu-icon {{ menuItem.icon }}\" *ngIf=\"menuItem.icon\"></i>\r\n <span class=\"menu-title\">{{ menuItem.title }}</span>\r\n</a>\r\n<a *ngIf=\"!menuItem.children && !menuItem.link && !menuItem.url && !menuItem.group\"\r\n [attr.target]=\"menuItem.target\"\r\n [attr.title]=\"menuItem.title\"\r\n [class.active]=\"menuItem.selected\"\r\n (mouseenter)=\"onHoverItem(menuItem)\"\r\n (click)=\"$event.preventDefault(); onItemClick(menuItem);\">\r\n <i class=\"menu-icon {{ menuItem.icon }}\" *ngIf=\"menuItem.icon\"></i>\r\n <span class=\"menu-title\">{{ menuItem.title }}</span>\r\n</a>\r\n<a *ngIf=\"menuItem.children\"\r\n (click)=\"$event.preventDefault(); onToggleSubMenu(menuItem);\"\r\n [attr.target]=\"menuItem.target\"\r\n [attr.title]=\"menuItem.title\"\r\n [class.active]=\"menuItem.selected\"\r\n (mouseenter)=\"onHoverItem(menuItem)\"\r\n href=\"#\">\r\n <i class=\"menu-icon {{ menuItem.icon }}\" *ngIf=\"menuItem.icon\"></i>\r\n <span class=\"menu-title\">{{ menuItem.title }}</span>\r\n <i class=\"ion chevron\" [class.ion-chevron-left]=\"!menuItem.expanded\"\r\n [class.ion-chevron-down]=\"menuItem.expanded\"></i>\r\n</a>\r\n<ul *ngIf=\"menuItem.children\"\r\n [class.collapsed]=\"!(menuItem.children && menuItem.expanded)\"\r\n [class.expanded]=\"menuItem.expanded\"\r\n [@toggle]=\"toggleState\"\r\n class=\"menu-items\">\r\n <ng-container *ngFor=\"let item of menuItem.children\">\r\n <li nbMenuItem *ngIf=\"!item.hidden\"\r\n [menuItem]=\"item\"\r\n [class.menu-group]=\"item.group\"\r\n (hoverItem)=\"onHoverItem($event)\"\r\n (toggleSubMenu)=\"onToggleSubMenu($event)\"\r\n (selectItem)=\"onSelectItem($event)\"\r\n (itemClick)=\"onItemClick($event)\"\r\n class=\"menu-item\">\r\n </li>\r\n </ng-container>\r\n</ul>\r\n",
animations: [
trigger('toggle', [
state(NbToggleStates.Collapsed, style({ height: '0' })),
state(NbToggleStates.Expanded, style({ height: '*' })),
transition(NbToggleStates.Collapsed + " <=> " + NbToggleStates.Expanded, animate(300)),
]),
]
}] }
];
/** @nocollapse */
NbMenuItemComponent.ctorParameters = function () { return [
{ type: NbMenuService }
]; };
NbMenuItemComponent.propDecorators = {
menuItem: [{ type: Input }],
hoverItem: [{ type: Output }],
toggleSubMenu: [{ type: Output }],
selectItem: [{ type: Output }],
itemClick: [{ type: Output }]
};
return NbMenuItemComponent;
}());
export { NbMenuItemComponent };
if (false) {
/** @type {?} */
NbMenuItemComponent.prototype.menuItem;
/** @type {?} */
NbMenuItemComponent.prototype.hoverItem;
/** @type {?} */
NbMenuItemComponent.prototype.toggleSubMenu;
/** @type {?} */
NbMenuItemComponent.prototype.selectItem;
/** @type {?} */
NbMenuItemComponent.prototype.itemClick;
/**
* @type {?}
* @private
*/
NbMenuItemComponent.prototype.alive;
/** @type {?} */
NbMenuItemComponent.prototype.toggleState;
/**
* @type {?}
* @private
*/
NbMenuItemComponent.prototype.menuService;
}
/*
* Vertical menu component.
*
* Accepts a list of menu items and renders them accordingly. Supports multi-level menus.
*
* Basic example
* @stacked-example(Showcase, menu/menu-showcase.component)
*
* ```ts
* // ...
* items: NbMenuItem[] = [
* {
* title: home,
* link: '/'
* },
* {
* title: dashboard,
* link: 'dashboard'
* }
* ];
* // ...
* <nb-menu [items]="items"></nb-menu>
* ```
* ### Installation
*
* Import `NbMenuModule.forRoot()` to your app module.
* ```ts
* @NgModule({
* imports: [
* // ...
* NbMenuModule.forRoot(),
* ],
* })
* export class AppModule { }
* ```
* and `NbMenuModule` to your feature module where the component should be shown:
* ```ts
* @NgModule({
* imports: [
* // ...
* NbMenuModule,
* ],
* })
* export class PageModule { }
* ```
* ### Usage
*
* Two-level menu example
* @stacked-example(Two Levels, menu/menu-children.component)
*
* @styles
*
* menu-font-family:
* menu-font-size:
* menu-font-weight:
* menu-fg:
* menu-bg:
* menu-active-fg:
* menu-active-bg:
* menu-active-font-weight:
* menu-submenu-bg:
* menu-submenu-fg:
* menu-submenu-active-fg:
* menu-submenu-active-bg:
* menu-submenu-active-border-color:
* menu-submenu-active-shadow:
* menu-submenu-hover-fg:
* menu-submenu-hover-bg:
* menu-submenu-item-border-width:
* menu-submenu-item-border-radius:
* menu-submenu-item-padding:
* menu-submenu-item-container-padding:
* menu-submenu-padding:
* menu-group-font-weight:
* menu-group-font-size:
* menu-group-fg:
* menu-group-padding
* menu-item-padding:
* menu-item-separator:
* menu-icon-font-size:
* menu-icon-margin:
* menu-icon-color:
* menu-icon-active-color:
*/
var NbMenuComponent = /** @class */ (function () {
function NbMenuComponent(window, menuInternalService, router) {
this.window = window;
this.menuInternalService = menuInternalService;
this.router = router;
this.alive = true;
this.autoCollapseValue = false;
}
Object.defineProperty(NbMenuComponent.prototype, "inverse", {
/*
* Makes colors inverse based on current theme
* @type boolean
*/
set: /*
* Makes colors inverse based on current theme
* @type boolean
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.inverseValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbMenuComponent.prototype, "autoCollapse", {
/*
* Collapse all opened submenus on the toggle event
* Default value is "false"
* @type boolean
*/
set: /*
* Collapse all opened submenus on the toggle event
* Default value is "false"
* @type boolean
*/
/**
* @param {?} val
* @return {?}
*/
function (val) {
this.autoCollapseValue = convertToBoolProperty(val);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NbMenuComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.menuInternalService.prepareItems(this.items);
this.menuInternalService
.onAddItem()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function (data) { return _this.onAddItem(data); });
this.menuInternalService
.onNavigateHome()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function () { return _this.navigateHome(); });
this.menuInternalService
.onGetSelectedItem()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function (data) {
data.listener.next({ tag: _this.tag, item: _this.getSelectedItem(_this.items) });
});
this.menuInternalService
.onCollapseAll()
.pipe(takeWhile(function () { return _this.alive; }), filter(function (data) { return _this.compareTag(data.tag); }))
.subscribe(function () { return _this.collapseAll(); });
this.router.events
.pipe(takeWhile(function () { return _this.alive; }), filter(function (event) { return event instanceof NavigationEnd; }))
.subscribe(function () {
_this.menuInternalService.selectFromUrl(_this.items, _this.tag, _this.autoCollapseValue);
});
};
/**
* @return {?}
*/
NbMenuComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
setTimeout(function () { return _this.menuInternalService.selectFromUrl(_this.items, _this.tag, _this.autoCollapseValue); });
};
/**
* @param {?} data
* @return {?}
*/
NbMenuComponent.prototype.onAddItem = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _a;
(_a = this.items).push.apply(_a, tslib_1.__spread(data.items));
this.menuInternalService.prepareItems(this.items);
this.menuInternalService.selectFromUrl(this.items, this.tag, this.autoCollapseValue);
};
/**
* @param {?} item
* @return {?}
*/
NbMenuComponent.prototype.onHoverItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.menuInternalService.itemHover(item, this.tag);
};
/**
* @param {?} item
* @return {?}
*/
NbMenuComponent.prototype.onToggleSubMenu = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (this.autoCollapseValue) {
this.menuInternalService.collapseAll(this.items, this.tag, item);
}
item.expanded = !item.expanded;
this.menuInternalService.submenuToggle(item, this.tag);
};
// TODO: is not fired on page reload
// TODO: is not fired on page reload
/**
* @param {?} item
* @return {?}
*/
NbMenuComponent.prototype.onSelectItem =
// TODO: is not fired on page reload
/**
* @param {?} item
* @return {?}
*/
function (item) {
this.menuInternalService.selectItem(item, this.items, this.autoCollapseValue, this.tag);
};
/**
* @param {?} item
* @return {?}
*/
NbMenuComponent.prototype.onItemClick = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.menuInternalService.itemClick(item, this.tag);
};
/**
* @return {?}
*/
NbMenuComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.alive = false;
};
/**
* @private
* @return {?}
*/
NbMenuComponent.prototype.navigateHome = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var homeItem = this.getHomeItem(this.items);
if (homeItem) {
if (homeItem.link) {
this.router.navigate([homeItem.link], { queryParams: homeItem.queryParams, fragment: homeItem.fragment });
}
if (homeItem.url) {
this.window.location.href = homeItem.url;
}
}
};
/**
* @private
* @return {?}
*/
NbMenuComponent.prototype.collapseAll = /**
* @private
* @return {?}
*/
function () {
this.menuInternalService.collapseAll(this.items, this.tag);
};
/**
* @private
* @param {?} items
* @return {?}
*/
NbMenuComponent.prototype.getHomeItem = /**
* @private
* @param {?} items
* @return {?}
*/
function (items) {
var e_1, _a;
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.home) {
return item;
}
/** @type {?} */
var homeItem = item.children && this.getHomeItem(item.children);
if (homeItem) {
return homeItem;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
}
finally { if (e_1) throw e_1.error; }
}
};
/**
* @private
* @param {?} tag
* @return {?}
*/
NbMenuComponent.prototype.compareTag = /**
* @private
* @param {?} tag
* @return {?}
*/
function (tag) {
return !tag || tag === this.tag;
};
/**
* @private
* @param {?} items
* @return {?}
*/
NbMenuComponent.prototype.getSelectedItem = /**
* @private
* @param {?} items
* @return {?}
*/
function (items) {
var _this = this;
/** @type {?} */
var selected = null;
items.forEach(function (item) {
if (item.selected) {
selected = item;
}
if (item.selected && item.children && item.children.length > 0) {
selected = _this.getSelectedItem(item.children);
}
});
return selected;
};
NbMenuComponent.decorators = [
{ type: Component, args: [{
selector: 'nb-menu',
template: "\n <ul class=\"menu-items\">\n <ng-container *ngFor=\"let item of items\">\n <li nbMenuItem *ngIf=\"!item.hidden\"\n [menuItem]=\"item\"\n [class.menu-group]=\"item.group\"\n (hoverItem)=\"onHoverItem($event)\"\n (toggleSubMenu)=\"onToggleSubMenu($event)\"\n (selectItem)=\"onSelectItem($event)\"\n (itemClick)=\"onItemClick($event)\"\n class=\"menu-item\">\n </li>\n </ng-container>\n </ul>\n ",
styles: [":host /deep/{display:block}:host /deep/ .menu-item>.menu-items,:host /deep/ .menu-items{list-style-type:none;overflow:hidden}:host /deep/ .menu-item a{display:flex;color:inherit;text-decoration:none;align-items:center}:host /deep/ .menu-item a .menu-title{flex:1}[dir=rtl] :host /deep/ .menu-item a .menu-title{text-align:right}"]
}] }
];
/** @nocollapse */
NbMenuComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [NB_WINDOW,] }] },
{ type: NbMenuInternalService },
{ type: Router }
]; };
NbMenuComponent.propDecorators = {
inverseValue: [{ type: HostBinding, args: ['class.inverse',] }],
tag: [{ type: Input }],
items: [{ type: Input }],
inverse: [{ type: Input }],
autoCollapse: [{ type: Input }]
};
return NbMenuComponent;
}());
export { NbMenuComponent };
if (false) {
/** @type {?} */
NbMenuComponent.prototype.inverseValue;
/** @type {?} */
NbMenuComponent.prototype.tag;
/** @type {?} */
NbMenuComponent.prototype.items;
/**
* @type {?}
* @private
*/
NbMenuComponent.prototype.alive;
/**
* @type {?}
* @private
*/
NbMenuComponent.prototype.autoCollapseValue;
/**
* @type {?}
* @private
*/
NbMenuComponent.prototype.window;
/**
* @type {?}
* @private
*/
NbMenuComponent.prototype.menuInternalService;
/**
* @type {?}
* @private
*/
NbMenuComponent.prototype.router;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFdBQVcsRUFFWCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQXlCLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0lBRy9FLFVBQVcsVUFBVTtJQUNyQixXQUFZLFdBQVc7OztBQUd6QjtJQXNCRSw2QkFBb0IsV0FBMEI7UUFBMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWU7UUFWckMsYUFBUSxHQUFHLG1CQUFZLElBQUksRUFBQSxDQUFDO1FBRTNCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3BDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN4QyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNyQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV0QyxVQUFLLEdBQUcsSUFBSSxDQUFDO0lBRzRCLENBQUM7Ozs7SUFF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LEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztnQkFoTUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxTQUFTO29CQUVuQixRQUFRLEVBQUUsd2ZBY1Q7O2lCQUNGOzs7O2dEQXdDYyxNQUFNLFNBQUMsU0FBUztnQkFuTnRCLHFCQUFxQjtnQkFIckIsTUFBTTs7OytCQWdMWixXQUFXLFNBQUMsZUFBZTtzQkFRM0IsS0FBSzt3QkFNTCxLQUFLOzBCQU1MLEtBQUs7K0JBVUwsS0FBSzs7SUErSVIsc0JBQUM7Q0FBQSxBQWpNRCxJQWlNQztTQTlLWSxlQUFlOzs7SUFDMUIsdUNBQW9EOztJQVFwRCw4QkFBcUI7O0lBTXJCLGdDQUE2Qjs7Ozs7SUFxQjdCLGdDQUE4Qjs7Ozs7SUFDOUIsNENBQTJDOzs7OztJQUUvQixpQ0FBaUM7Ozs7O0lBQ2pDLDhDQUFrRDs7Ozs7SUFDbEQsaUNBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBIb3N0QmluZGluZyxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIEluamVjdCxcclxuICBEb0NoZWNrLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVdoaWxlLCBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTmJNZW51SW50ZXJuYWxTZXJ2aWNlLCBOYk1lbnVJdGVtLCBOYk1lbnVCYWcsIE5iTWVudVNlcnZpY2UgfSBmcm9tICcuL21lbnUuc2VydmljZSc7XHJcbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSB9IGZyb20gJy4uL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBOQl9XSU5ET1cgfSBmcm9tICcuLi8uLi90aGVtZS5vcHRpb25zJztcclxuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcblxyXG5leHBvcnQgZW51bSBOYlRvZ2dsZVN0YXRlcyB7XHJcbiAgRXhwYW5kZWQgPSAnZXhwYW5kZWQnLFxyXG4gIENvbGxhcHNlZCA9ICdjb2xsYXBzZWQnLFxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1tuYk1lbnVJdGVtXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21lbnUtaXRlbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcigndG9nZ2xlJywgW1xyXG4gICAgICBzdGF0ZShOYlRvZ2dsZVN0YXRlcy5Db2xsYXBzZWQsIHN0eWxlKHsgaGVpZ2h0OiAnMCcgfSkpLFxyXG4gICAgICBzdGF0ZShOYlRvZ2dsZVN0YXRlcy5FeHBhbmRlZCwgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oYCR7TmJUb2dnbGVTdGF0ZXMuQ29sbGFwc2VkfSA8PT4gJHtOYlRvZ2dsZVN0YXRlcy5FeHBhbmRlZH1gLCBhbmltYXRlKDMwMCkpLFxyXG4gICAgXSksXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iTWVudUl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIG1lbnVJdGVtID0gPE5iTWVudUl0ZW0+bnVsbDtcclxuXHJcbiAgQE91dHB1dCgpIGhvdmVySXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB0b2dnbGVTdWJNZW51ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgYWxpdmUgPSB0cnVlO1xyXG4gIHRvZ2dsZVN0YXRlOiBOYlRvZ2dsZVN0YXRlcztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtZW51U2VydmljZTogTmJNZW51U2VydmljZSkge31cclxuXHJcbiAgbmdEb0NoZWNrKCkge1xyXG4gICAgdGhpcy50b2dnbGVTdGF0ZSA9IHRoaXMubWVudUl0ZW0uZXhwYW5kZWQgPyBOYlRvZ2dsZVN0YXRlcy5FeHBhbmRlZCA6IE5iVG9nZ2xlU3RhdGVzLkNvbGxhcHNlZDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMubWVudVNlcnZpY2Uub25TdWJtZW51VG9nZ2xlKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpLFxyXG4gICAgICAgIGZpbHRlcigoeyBpdGVtIH0pID0+IGl0ZW0gPT09IHRoaXMubWVudUl0ZW0pLFxyXG4gICAgICAgIG1hcCgoeyBpdGVtIH06IE5iTWVudUJhZykgPT4gaXRlbS5leHBhbmRlZCksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShpc0V4cGFuZGVkID0+IHRoaXMudG9nZ2xlU3RhdGUgPSBpc0V4cGFuZGVkID8gTmJUb2dnbGVTdGF0ZXMuRXhwYW5kZWQgOiBOYlRvZ2dsZVN0YXRlcy5Db2xsYXBzZWQpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmFsaXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvblRvZ2dsZVN1Yk1lbnUoaXRlbTogTmJNZW51SXRlbSkge1xyXG4gICAgdGhpcy50b2dnbGVTdWJNZW51LmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBvbkhvdmVySXRlbShpdGVtOiBOYk1lbnVJdGVtKSB7XHJcbiAgICB0aGlzLmhvdmVySXRlbS5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RJdGVtKGl0ZW06IE5iTWVudUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0SXRlbS5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgb25JdGVtQ2xpY2soaXRlbTogTmJNZW51SXRlbSkge1xyXG4gICAgdGhpcy5pdGVtQ2xpY2suZW1pdChpdGVtKTtcclxuICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIFZlcnRpY2FsIG1lbnUgY29tcG9uZW50LlxyXG4gKlxyXG4gKiBBY2NlcHRzIGEgbGlzdCBvZiBtZW51IGl0ZW1zIGFuZCByZW5kZXJzIHRoZW0gYWNjb3JkaW5nbHkuIFN1cHBvcnRzIG11bHRpLWxldmVsIG1lbnVzLlxyXG4gKlxyXG4gKiBCYXNpYyBleGFtcGxlXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2hvd2Nhc2UsIG1lbnUvbWVudS1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGBgYHRzXHJcbiAqIC8vIC4uLlxyXG4gKiBpdGVtczogTmJNZW51SXRlbVtdID0gW1xyXG4gKiAge1xyXG4gKiAgICB0aXRsZTogaG9tZSxcclxuICogICAgbGluazogJy8nXHJcbiAqICB9LFxyXG4gKiAge1xyXG4gKiAgICB0aXRsZTogZGFzaGJvYXJkLFxyXG4gKiAgICBsaW5rOiAnZGFzaGJvYXJkJ1xyXG4gKiAgfVxyXG4gKiBdO1xyXG4gKiAvLyAuLi5cclxuICogPG5iLW1lbnUgW2l0ZW1zXT1cIml0ZW1zXCI+PC9uYi1tZW51PlxyXG4gKiBgYGBcclxuICogIyMjIEluc3RhbGxhdGlvblxyXG4gKlxyXG4gKiBJbXBvcnQgYE5iTWVudU1vZHVsZS5mb3JSb290KClgIHRvIHlvdXIgYXBwIG1vZHVsZS5cclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iTWVudU1vZHVsZS5mb3JSb290KCksXHJcbiAqICAgXSxcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqIGFuZCBgTmJNZW51TW9kdWxlYCB0byB5b3VyIGZlYXR1cmUgbW9kdWxlIHdoZXJlIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHNob3duOlxyXG4gKiBgYGB0c1xyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAgIGltcG9ydHM6IFtcclxuICogICBcdC8vIC4uLlxyXG4gKiAgICAgTmJNZW51TW9kdWxlLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBQYWdlTW9kdWxlIHsgfVxyXG4gKiBgYGBcclxuICogIyMjIFVzYWdlXHJcbiAqXHJcbiAqIFR3by1sZXZlbCBtZW51IGV4YW1wbGVcclxuICogQHN0YWNrZWQtZXhhbXBsZShUd28gTGV2ZWxzLCBtZW51L21lbnUtY2hpbGRyZW4uY29tcG9uZW50KVxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIG1lbnUtZm9udC1mYW1pbHk6XHJcbiAqIG1lbnUtZm9udC1zaXplOlxyXG4gKiBtZW51LWZvbnQtd2VpZ2h0OlxyXG4gKiBtZW51LWZnOlxyXG4gKiBtZW51LWJnOlxyXG4gKiBtZW51LWFjdGl2ZS1mZzpcclxuICogbWVudS1hY3RpdmUtYmc6XHJcbiAqIG1lbnUtYWN0aXZlLWZvbnQtd2VpZ2h0OlxyXG4gKiBtZW51LXN1Ym1lbnUtYmc6XHJcbiAqIG1lbnUtc3VibWVudS1mZzpcclxuICogbWVudS1zdWJtZW51LWFjdGl2ZS1mZzpcclxuICogbWVudS1zdWJtZW51LWFjdGl2ZS1iZzpcclxuICogbWVudS1zdWJtZW51LWFjdGl2ZS1ib3JkZXItY29sb3I6XHJcbiAqIG1lbnUtc3VibWVudS1hY3RpdmUtc2hhZG93OlxyXG4gKiBtZW51LXN1Ym1lbnUtaG92ZXItZmc6XHJcbiAqIG1lbnUtc3VibWVudS1ob3Zlci1iZzpcclxuICogbWVudS1zdWJtZW51LWl0ZW0tYm9yZGVyLXdpZHRoOlxyXG4gKiBtZW51LXN1Ym1lbnUtaXRlbS1ib3JkZXItcmFkaXVzOlxyXG4gKiBtZW51LXN1Ym1lbnUtaXRlbS1wYWRkaW5nOlxyXG4gKiBtZW51LXN1Ym1lbnUtaXRlbS1jb250YWluZXItcGFkZGluZzpcclxuICogbWVudS1zdWJtZW51LXBhZGRpbmc6XHJcbiAqIG1lbnUtZ3JvdXAtZm9udC13ZWlnaHQ6XHJcbiAqIG1lbnUtZ3JvdXAtZm9udC1zaXplOlxyXG4gKiBtZW51LWdyb3VwLWZnOlxyXG4gKiBtZW51LWdyb3VwLXBhZGRpbmdcclxuICogbWVudS1pdGVtLXBhZGRpbmc6XHJcbiAqIG1lbnUtaXRlbS1zZXBhcmF0b3I6XHJcbiAqIG1lbnUtaWNvbi1mb250LXNpemU6XHJcbiAqIG1lbnUtaWNvbi1tYXJnaW46XHJcbiAqIG1lbnUtaWNvbi1jb2xvcjpcclxuICogbWVudS1pY29uLWFjdGl2ZS1jb2xvcjpcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItbWVudScsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8dWwgY2xhc3M9XCJtZW51LWl0ZW1zXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNcIj5cclxuICAgICAgICA8bGkgbmJNZW51SXRlbSAqbmdJZj1cIiFpdGVtLmhpZGRlblwiXHJcbiAgICAgICAgICAgIFttZW51SXRlbV09XCJpdGVtXCJcclxuICAgICAgICAgICAgW2NsYXNzLm1lbnUtZ3JvdXBdPVwiaXRlbS5ncm91cFwiXHJcbiAgICAgICAgICAgIChob3Zlckl0ZW0pPVwib25Ib3Zlckl0ZW0oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh0b2dnbGVTdWJNZW51KT1cIm9uVG9nZ2xlU3ViTWVudSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHNlbGVjdEl0ZW0pPVwib25TZWxlY3RJdGVtKCRldmVudClcIlxyXG4gICAgICAgICAgICAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm1lbnUtaXRlbVwiPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC91bD5cclxuICBgLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaW52ZXJzZScpIGludmVyc2VWYWx1ZTogYm9vbGVhbjtcclxuXHJcbiAgLypcclxuICAgKiBUYWdzIGEgbWVudSB3aXRoIHNvbWUgSUQsIGNhbiBiZSBsYXRlciB1c2VkIGluIHRoZSBtZW51IHNlcnZpY2VcclxuICAgKiB0byBkZXRlcm1pbmUgd2hpY2ggbWVudSB0cmlnZ2VyZWQgdGhlIGFjdGlvbiwgaWYgbXVsdGlwbGUgbWVudXMgZXhpc3Qgb24gdGhlIHBhZ2UuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhZzogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIExpc3Qgb2YgbWVudSBpdGVtcy5cclxuICAgKiBAdHlwZSBMaXN0PE5iTWVudUl0ZW0+IHwgTGlzdDxhbnk+IHwgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgaXRlbXM6IE5iTWVudUl0ZW1bXTtcclxuXHJcbiAgLypcclxuICAgKiBNYWtlcyBjb2xvcnMgaW52ZXJzZSBiYXNlZCBvbiBjdXJyZW50IHRoZW1lXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGludmVyc2UodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmludmVyc2VWYWx1ZSA9IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSh2YWwpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDb2xsYXBzZSBhbGwgb3BlbmVkIHN1Ym1lbnVzIG9uIHRoZSB0b2dnbGUgZXZlbnRcclxuICAgKiBEZWZhdWx0IHZhbHVlIGlzIFwiZmFsc2VcIlxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdXRvQ29sbGFwc2UodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmF1dG9Db2xsYXBzZVZhbHVlID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIGF1dG9Db2xsYXBzZVZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkJfV0lORE9XKSBwcml2YXRlIHdpbmRvdyxcclxuICAgICAgICAgICAgICBwcml2YXRlIG1lbnVJbnRlcm5hbFNlcnZpY2U6IE5iTWVudUludGVybmFsU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubWVudUludGVybmFsU2VydmljZS5wcmVwYXJlSXRlbXModGhpcy5pdGVtcyk7XHJcblxyXG4gICAgdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlXHJcbiAgICAgIC5vbkFkZEl0ZW0oKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSksXHJcbiAgICAgICAgZmlsdGVyKChkYXRhOiB7IHRhZzogc3RyaW5nOyBpdGVtczogTmJNZW51SXRlbVtdIH0pID0+IHRoaXMuY29tcGFyZVRhZyhkYXRhLnRhZykpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLm9uQWRkSXRlbShkYXRhKSk7XHJcblxyXG4gICAgdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlXHJcbiAgICAgIC5vbk5hdmlnYXRlSG9tZSgpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGE6IHsgdGFnOiBzdHJpbmc7IGl0ZW1zOiBOYk1lbnVJdGVtW10gfSkgPT4gdGhpcy5jb21wYXJlVGFnKGRhdGEudGFnKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5hdmlnYXRlSG9tZSgpKTtcclxuXHJcbiAgICB0aGlzLm1lbnVJbnRlcm5hbFNlcnZpY2VcclxuICAgICAgLm9uR2V0U2VsZWN0ZWRJdGVtKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpLFxyXG4gICAgICAgIGZpbHRlcigoZGF0YTogeyB0YWc6IHN0cmluZzsgbGlzdGVuZXI6IEJlaGF2aW9yU3ViamVjdDxOYk1lbnVCYWc+IH0pID0+IHRoaXMuY29tcGFyZVRhZyhkYXRhLnRhZykpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IHsgdGFnOiBzdHJpbmc7IGxpc3RlbmVyOiBCZWhhdmlvclN1YmplY3Q8TmJNZW51QmFnPiB9KSA9PiB7XHJcbiAgICAgICAgZGF0YS5saXN0ZW5lci5uZXh0KHsgdGFnOiB0aGlzLnRhZywgaXRlbTogdGhpcy5nZXRTZWxlY3RlZEl0ZW0odGhpcy5pdGVtcykgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHRoaXMubWVudUludGVybmFsU2VydmljZVxyXG4gICAgICAub25Db2xsYXBzZUFsbCgpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoKGRhdGE6IHsgdGFnOiBzdHJpbmcgfSkgPT4gdGhpcy5jb21wYXJlVGFnKGRhdGEudGFnKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNvbGxhcHNlQWxsKCkpO1xyXG5cclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSksXHJcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlLnNlbGVjdEZyb21VcmwodGhpcy5pdGVtcywgdGhpcy50YWcsIHRoaXMuYXV0b0NvbGxhcHNlVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlLnNlbGVjdEZyb21VcmwodGhpcy5pdGVtcywgdGhpcy50YWcsIHRoaXMuYXV0b0NvbGxhcHNlVmFsdWUpKTtcclxuICB9XHJcblxyXG4gIG9uQWRkSXRlbShkYXRhOiB7IHRhZzogc3RyaW5nOyBpdGVtczogTmJNZW51SXRlbVtdIH0pIHtcclxuICAgIHRoaXMuaXRlbXMucHVzaCguLi5kYXRhLml0ZW1zKTtcclxuXHJcbiAgICB0aGlzLm1lbnVJbnRlcm5hbFNlcnZpY2UucHJlcGFyZUl0ZW1zKHRoaXMuaXRlbXMpO1xyXG4gICAgdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlLnNlbGVjdEZyb21VcmwodGhpcy5pdGVtcywgdGhpcy50YWcsIHRoaXMuYXV0b0NvbGxhcHNlVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25Ib3Zlckl0ZW0oaXRlbTogTmJNZW51SXRlbSkge1xyXG4gICAgdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlLml0ZW1Ib3ZlcihpdGVtLCB0aGlzLnRhZyk7XHJcbiAgfVxyXG5cclxuICBvblRvZ2dsZVN1Yk1lbnUoaXRlbTogTmJNZW51SXRlbSkge1xyXG4gICAgaWYgKHRoaXMuYXV0b0NvbGxhcHNlVmFsdWUpIHtcclxuICAgICAgdGhpcy5tZW51SW50ZXJuYWxTZXJ2aWNlLmNvbGxhcHNlQWxsKHRoaXMuaXRlbXMsIHRoaXMudGFnLCBpdGVtKTtcclxuICAgIH1cclxuICAgIGl0ZW0uZXhwYW5kZWQgPSAhaXRlbS5leHBhbmRlZDtcclxuICAgIHRoaXMubWVudUludGVybmFsU2VydmljZS5zdWJtZW51VG9nZ2xlKGl0ZW0sIHRoaXMudGFnKTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IGlzIG5vdCBmaXJlZCBvbiBwYWdlIHJlbG9hZFxyXG4gIG9uU2VsZWN0SXRlbShpdGVtOiBOYk1lbnVJdGVtKSB7XHJcbiAgICB0aGlzLm1lbnVJbnRlcm5hbFNlcnZpY2Uuc2VsZWN0SXRlbShpdGVtLCB0aGlzLml0ZW1zLCB0aGlzLmF1dG9Db2xsYXBzZVZhbHVlLCB0aGlzLnRhZyk7XHJcbiAgfVxyXG5cclxuICBvbkl0ZW1DbGljayhpdGVtOiBOYk1lbnVJdGVtKSB7XHJcbiAgICB0aGlzLm1lbnVJbnRlcm5hbFNlcnZpY2UuaXRlbUNsaWNrKGl0ZW0sIHRoaXMudGFnKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZUhvbWUoKSB7XHJcbiAgICBjb25zdCBob21lSXRlbSA9IHRoaXMuZ2V0SG9tZUl0ZW0odGhpcy5pdGVtcyk7XHJcblxyXG4gICAgaWYgKGhvbWVJdGVtKSB7XHJcbiAgICAgIGlmIChob21lSXRlbS5saW5rKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2hvbWVJdGVtLmxpbmtdLCB7IHF1ZXJ5UGFyYW1zOiBob21lSXRlbS5xdWVyeVBhcmFtcywgZnJhZ21lbnQ6IGhvbWVJdGVtLmZyYWdtZW50IH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaG9tZUl0ZW0udXJsKSB7XHJcbiAgICAgICAgdGhpcy53aW5kb3cubG9jYXRpb24uaHJlZiA9IGhvbWVJdGVtLnVybDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb2xsYXBzZUFsbCgpIHtcclxuICAgIHRoaXMubWVudUludGVybmFsU2VydmljZS5jb2xsYXBzZUFsbCh0aGlzLml0ZW1zLCB0aGlzLnRhZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhvbWVJdGVtKGl0ZW1zOiBOYk1lbnVJdGVtW10pOiBOYk1lbnVJdGVtIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAoaXRlbS5ob21lKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGhvbWVJdGVtID0gaXRlbS5jaGlsZHJlbiAmJiB0aGlzLmdldEhvbWVJdGVtKGl0ZW0uY2hpbGRyZW4pO1xyXG4gICAgICBpZiAoaG9tZUl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaG9tZUl0ZW07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGFyZVRhZyh0YWc6IHN0cmluZykge1xyXG4gICAgcmV0dXJuICF0YWcgfHwgdGFnID09PSB0aGlzLnRhZztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJdGVtKGl0ZW1zOiBOYk1lbnVJdGVtW10pOiBOYk1lbnVJdGVtIHtcclxuICAgIGxldCBzZWxlY3RlZCA9IG51bGw7XHJcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBOYk1lbnVJdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgc2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpdGVtLnNlbGVjdGVkICYmIGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmdldFNlbGVjdGVkSXRlbShpdGVtLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==