@energycap/components 0.39.16 → 0.39.17-ECAP-23124-menu-item-divider-improvements.20240523-1134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/controls/combobox/combobox.component.mjs +32 -40
- package/esm2020/lib/controls/menu/menu.component.mjs +67 -39
- package/fesm2015/energycap-components.mjs +1020 -1000
- package/fesm2015/energycap-components.mjs.map +1 -1
- package/fesm2020/energycap-components.mjs +1009 -990
- package/fesm2020/energycap-components.mjs.map +1 -1
- package/lib/controls/combobox/combobox.component.d.ts +5 -0
- package/lib/controls/menu/menu.component.d.ts +26 -11
- package/package.json +1 -1
@@ -14,6 +14,53 @@ export const menuAnimationSpeed = 350;
|
|
14
14
|
* @export
|
15
15
|
*/
|
16
16
|
export class MenuComponent {
|
17
|
+
/**
|
18
|
+
* Helper function to return a flat list of all selectable items in the provided menu items. Filters out headings and divided-sections.
|
19
|
+
* This makes it much easier to keep track of currently highlighted items for keyboard navigation.
|
20
|
+
*/
|
21
|
+
static getSelectableItems(items) {
|
22
|
+
return items.reduce((selectableItems, item) => {
|
23
|
+
if (item.display !== 'heading' && item.display !== 'divided-section') {
|
24
|
+
selectableItems.push(item);
|
25
|
+
}
|
26
|
+
else if (item.items) {
|
27
|
+
selectableItems.push(...item.items.filter(childItem => childItem.display !== 'heading' && childItem.display !== 'divided-section'));
|
28
|
+
}
|
29
|
+
return selectableItems;
|
30
|
+
}, []);
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Returns an ID for the provided item based on its index in the provided items array. This mimics the behavior of the MenuComponent's
|
34
|
+
* generated IDs for items that don't have provided IDs. This is used in MenuComponent and ComboboxComponent to scroll to specific items.
|
35
|
+
* NOTE: If the items array does not match what is displayed in the menu, this function will not return the correct ID.
|
36
|
+
*
|
37
|
+
* Returns null if the not found
|
38
|
+
* @param items The MenuItems array to search through.
|
39
|
+
* @param item The item to generate the ID for.
|
40
|
+
* @param menuComponentId Used to prefix the generated ID. This should be the ID of the menu component the item is present in.
|
41
|
+
* @memberof MenuComponent
|
42
|
+
*/
|
43
|
+
static getIndexedItemId(items, item, menuComponentId) {
|
44
|
+
if (item) {
|
45
|
+
for (let i = 0; i < items.length; i++) {
|
46
|
+
const itemInList = items[i];
|
47
|
+
if (itemInList.label === item.label) {
|
48
|
+
return `${menuComponentId}_item${i}`;
|
49
|
+
}
|
50
|
+
// If the item is a heading or divided section, check its children
|
51
|
+
if (itemInList.items && (itemInList.display === 'heading' || itemInList.display === 'divided-section')) {
|
52
|
+
for (let j = 0; j < itemInList.items.length; j++) {
|
53
|
+
const childItem = itemInList.items[j];
|
54
|
+
// Fall back to checking only the label if the item doesn't have an id
|
55
|
+
if (childItem.label === item.label) {
|
56
|
+
return `${menuComponentId}_item${i}-${j}`;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
return null;
|
63
|
+
}
|
17
64
|
constructor(el, renderer, windowService, scrollService) {
|
18
65
|
this.el = el;
|
19
66
|
this.renderer = renderer;
|
@@ -91,6 +138,15 @@ export class MenuComponent {
|
|
91
138
|
* This allows us to prevent double-calls to selectItem() with the same input.
|
92
139
|
*/
|
93
140
|
this.lastSelected = null;
|
141
|
+
/**
|
142
|
+
* Flattened array of all selectable items in the menu. Makes it easier to keep track of the currently highlighted item for keyboard navigation.
|
143
|
+
*/
|
144
|
+
this.selectableItems = [];
|
145
|
+
}
|
146
|
+
ngOnChanges(changes) {
|
147
|
+
if (changes.items && this.items) {
|
148
|
+
this.selectableItems = MenuComponent.getSelectableItems(this.items);
|
149
|
+
}
|
94
150
|
}
|
95
151
|
/**
|
96
152
|
* Sets & displays the interalized template based on
|
@@ -124,8 +180,8 @@ export class MenuComponent {
|
|
124
180
|
this.attrId = this.id;
|
125
181
|
}
|
126
182
|
this.setItemIds();
|
127
|
-
if (this.highlightedItem && this.
|
128
|
-
this.highlightedItemIndex = this.
|
183
|
+
if (this.highlightedItem && this.selectableItems.length) {
|
184
|
+
this.highlightedItemIndex = this.selectableItems.findIndex(item => { return this.highlightedItem === item; });
|
129
185
|
}
|
130
186
|
this.addKeydownListener();
|
131
187
|
}
|
@@ -152,7 +208,7 @@ export class MenuComponent {
|
|
152
208
|
if (item.onClick) {
|
153
209
|
item.onClick(item, false);
|
154
210
|
}
|
155
|
-
if (item.items) {
|
211
|
+
if (item.items && item.display !== 'heading' && item.display !== 'divided-section') {
|
156
212
|
this.toggleChildMenu(true);
|
157
213
|
}
|
158
214
|
else {
|
@@ -309,20 +365,12 @@ export class MenuComponent {
|
|
309
365
|
case 'Up':
|
310
366
|
if (this.highlightedItemIndex > -1) {
|
311
367
|
this.highlightedItemIndex--;
|
312
|
-
// Skip any in-menu heading items
|
313
|
-
if (this.highlightedItemIndex > -1 && this.items[this.highlightedItemIndex].display === 'heading') {
|
314
|
-
this.highlightedItemIndex--;
|
315
|
-
}
|
316
368
|
}
|
317
369
|
break;
|
318
370
|
case 'ArrowDown':
|
319
371
|
case 'Down':
|
320
|
-
if (this.highlightedItemIndex < this.
|
372
|
+
if (this.highlightedItemIndex < this.selectableItems.length - 1) {
|
321
373
|
this.highlightedItemIndex++;
|
322
|
-
// Skip any in-menu heading items
|
323
|
-
if (this.highlightedItemIndex < this.items.length - 1 && this.items[this.highlightedItemIndex].display === 'heading') {
|
324
|
-
this.highlightedItemIndex++;
|
325
|
-
}
|
326
374
|
}
|
327
375
|
break;
|
328
376
|
default:
|
@@ -330,7 +378,7 @@ export class MenuComponent {
|
|
330
378
|
}
|
331
379
|
if (this.highlightedItemIndex > -1) {
|
332
380
|
// Store the item at the current highlight index
|
333
|
-
this.highlightedItem = this.
|
381
|
+
this.highlightedItem = this.selectableItems[this.highlightedItemIndex];
|
334
382
|
}
|
335
383
|
else {
|
336
384
|
this.highlightedItem = null;
|
@@ -345,35 +393,15 @@ export class MenuComponent {
|
|
345
393
|
* @memberof MenuComponent
|
346
394
|
*/
|
347
395
|
scrollMenu(item) {
|
348
|
-
if (this.items.length > 0) {
|
396
|
+
if (this.items.length > 0 && this.id) {
|
349
397
|
item = item ? item : this.items[0];
|
350
|
-
let
|
351
|
-
|
352
|
-
let itemSelector = item.id ? `#${item.id}` : `#${this.id}_item${itemIndex}`;
|
353
|
-
this.scrollService.scrollItemCentered(`#${this.id}_list`, itemSelector);
|
354
|
-
}
|
398
|
+
let itemId = item.id ? item.id : MenuComponent.getIndexedItemId(this.items, item, this.id);
|
399
|
+
this.scrollService.scrollItemCentered(`#${this.id}_list`, `#${itemId}`);
|
355
400
|
}
|
356
401
|
}
|
357
402
|
scrollToHighlightedItem() {
|
358
403
|
this.scrollMenu(this.highlightedItem);
|
359
404
|
}
|
360
|
-
/**
|
361
|
-
* Find a given item's index in the filtered items array.
|
362
|
-
*
|
363
|
-
* Returns -1 if not found
|
364
|
-
* @param itemToFind The matching item to find in the items array.
|
365
|
-
* @memberof MenuComponent
|
366
|
-
*/
|
367
|
-
findItemIndex(itemToFind) {
|
368
|
-
if (itemToFind) {
|
369
|
-
return this.items.findIndex(item => {
|
370
|
-
return item.label === itemToFind.label;
|
371
|
-
});
|
372
|
-
}
|
373
|
-
else {
|
374
|
-
return -1;
|
375
|
-
}
|
376
|
-
}
|
377
405
|
addKeydownListener() {
|
378
406
|
// Only attempt to add the listener if keyboard nav is enabled
|
379
407
|
if (this.enableKeyNav) {
|
@@ -394,10 +422,10 @@ export class MenuComponent {
|
|
394
422
|
}
|
395
423
|
}
|
396
424
|
MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.WindowService }, { token: i2.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
|
397
|
-
MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, selector: "ec-menu", inputs: { id: "id", items: "items", selected: "selected", parent: "parent", templateType: "templateType", customMenuTemplate: "customMenuTemplate", title: "title", showNoItems: "showNoItems", noDataText: "noDataText", enableKeyNav: "enableKeyNav", highlightedItem: "highlightedItem", maintainSelectedItem: "maintainSelectedItem", truncateItems: "truncateItems", preserveIconSpace: "preserveIconSpace", dropdownToggleButton: "dropdownToggleButton" }, outputs: { selectedChanged: "selectedChanged", menuClosed: "menuClosed" }, host: { properties: { "attr.id": "this.attrId" } }, viewQueries: [{ propertyName: "labelTemplate", first: true, predicate: ["label"], descendants: true, static: true }, { propertyName: "iconAndLabelTemplate", first: true, predicate: ["iconAndLabel"], descendants: true, static: true }, { propertyName: "checkAndLabelTemplate", first: true, predicate: ["checkAndLabel"], descendants: true, static: true }, { propertyName: "iconLabelCaptionTemplate", first: true, predicate: ["iconLabelCaption"], descendants: true, static: true }], ngImport: i0, template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <li *ngFor=\"let item of items; index as i\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider{border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.NavItemActiveDirective, selector: "[ecNavItemActive]", inputs: ["ecNavItemActive", "ecNavItemActiveExactMatch", "ecNavItemActiveQueryParams", "ecNavItemActiveUrl"], outputs: ["routerLinkActivated"] }, { kind: "component", type: MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
|
425
|
+
MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, selector: "ec-menu", inputs: { id: "id", items: "items", selected: "selected", parent: "parent", templateType: "templateType", customMenuTemplate: "customMenuTemplate", title: "title", showNoItems: "showNoItems", noDataText: "noDataText", enableKeyNav: "enableKeyNav", highlightedItem: "highlightedItem", maintainSelectedItem: "maintainSelectedItem", truncateItems: "truncateItems", preserveIconSpace: "preserveIconSpace", dropdownToggleButton: "dropdownToggleButton" }, outputs: { selectedChanged: "selectedChanged", menuClosed: "menuClosed" }, host: { properties: { "attr.id": "this.attrId" } }, viewQueries: [{ propertyName: "labelTemplate", first: true, predicate: ["label"], descendants: true, static: true }, { propertyName: "iconAndLabelTemplate", first: true, predicate: ["iconAndLabel"], descendants: true, static: true }, { propertyName: "checkAndLabelTemplate", first: true, predicate: ["checkAndLabel"], descendants: true, static: true }, { propertyName: "iconLabelCaptionTemplate", first: true, predicate: ["iconLabelCaption"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <ng-container *ngFor=\"let item of items; index as i\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\r\n\r\n <!-- Show child items under parent item if the item is a heading or divided-section -->\r\n <ng-container *ngIf=\"item.items?.length && (item.display === 'heading' || item.display === 'divided-section')\">\r\n <ng-container *ngFor=\"let childItem of item.items; index as j; first as isFirst; last as isLast\"\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: childItem, index: i + '-' + j, isDividedSectionChild: item.display === 'divided-section', isFirst: isFirst, isLast: isLast}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items && selected?.display !== 'heading' && selected?.display !== 'divided-section'\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<ng-template #itemTemplate\r\n let-item\r\n let-i=\"index\"\r\n let-isDividedSectionChild=\"isDividedSectionChild\"\r\n let-isFirst=\"isFirst\"\r\n let-isLast=\"isLast\">\r\n <li *ngIf=\"!(item.hideIfNoItems && !item.items?.length) && item.display !== 'divided-section'\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [class.divider-top]=\"item.display === 'divider-top' || (isDividedSectionChild && isFirst)\"\r\n [class.divider]=\"item.display === 'divider' || (isDividedSectionChild && isLast)\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n</ng-template>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider:not(:last-child){border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.divider-top:not(:first-child):not(.divider + .divider-top){border-top:1px solid var(--ec-border-color);padding-top:.25rem;margin-top:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.NavItemActiveDirective, selector: "[ecNavItemActive]", inputs: ["ecNavItemActive", "ecNavItemActiveExactMatch", "ecNavItemActiveQueryParams", "ecNavItemActiveUrl"], outputs: ["routerLinkActivated"] }, { kind: "component", type: MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }] });
|
398
426
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, decorators: [{
|
399
427
|
type: Component,
|
400
|
-
args: [{ selector: 'ec-menu', template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <li *ngFor=\"let item of items; index as i\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider{border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"] }]
|
428
|
+
args: [{ selector: 'ec-menu', template: "<nav>\r\n <div class=\"parent\"\r\n [class.no-data]=\"showNoItems && (!items || items.length === 0)\">\r\n <header id=\"{{id}}_header\"\r\n class=\"text-heading-3 p-1\"\r\n [class.is-selected]=\"highlightedItemIndex === -1\"\r\n *ngIf=\"parent\"\r\n (click)=\"back($event)\">\r\n <div class=\"item-wrapper\">\r\n <i class=\"ec-icon icon-angle-down rotate-90 flex-shrink\"></i>\r\n <span class=\"label text-truncate flex-grow\">{{parent?.label}}</span>\r\n </div>\r\n </header>\r\n\r\n <ul id=\"{{id}}_list\"\r\n class=\"py-1\">\r\n <ng-container *ngFor=\"let item of items; index as i\">\r\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\r\n\r\n <!-- Show child items under parent item if the item is a heading or divided-section -->\r\n <ng-container *ngIf=\"item.items?.length && (item.display === 'heading' || item.display === 'divided-section')\">\r\n <ng-container *ngFor=\"let childItem of item.items; index as j; first as isFirst; last as isLast\"\r\n [ngTemplateOutlet]=\"itemTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: childItem, index: i + '-' + j, isDividedSectionChild: item.display === 'divided-section', isFirst: isFirst, isLast: isLast}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ul>\r\n\r\n <p class=\"no-data-message\">{{noDataText | translate}}</p>\r\n </div>\r\n\r\n <!-- Child menu (Rendered to the right) -->\r\n <ec-menu *ngIf=\"selected?.items && selected?.display !== 'heading' && selected?.display !== 'divided-section'\"\r\n id=\"{{id}}_child\"\r\n class=\"child\"\r\n [parent]=\"selected\"\r\n [items]=\"selected?.items\"\r\n [showNoItems]=\"true\"\r\n [templateType]=\"templateType\"\r\n [enableKeyNav]=\"true\"\r\n [truncateItems]=\"truncateItems\"\r\n (selectedChanged)=\"onSelection($event)\"\r\n (menuClosed)=\"toggleChildMenu(false)\">\r\n </ec-menu>\r\n</nav>\r\n\r\n<ng-template #itemTemplate\r\n let-item\r\n let-i=\"index\"\r\n let-isDividedSectionChild=\"isDividedSectionChild\"\r\n let-isFirst=\"isFirst\"\r\n let-isLast=\"isLast\">\r\n <li *ngIf=\"!(item.hideIfNoItems && !item.items?.length) && item.display !== 'divided-section'\"\r\n id=\"{{item.id || id + '_item' + i}}\"\r\n class=\"{{item.display || 'item'}} {{item.classList}}\"\r\n [class.divider-top]=\"item.display === 'divider-top' || (isDividedSectionChild && isFirst)\"\r\n [class.divider]=\"item.display === 'divider' || (isDividedSectionChild && isLast)\"\r\n [attr.disabled]=\"item.disabled\"\r\n [hidden]=\"item.hidden\"\r\n ecNavItemActive=\"is-selected\"\r\n [ecNavItemActiveQueryParams]=\"item.queryParams\"\r\n [ecNavItemActiveUrl]=\"item.url\"\r\n [ecNavItemActiveExactMatch]='item.isActiveExactMatch'\r\n (routerLinkActivated)=\"selectItem($event, item)\"\r\n [ngClass]=\"{'is-highlighted':(selected === item && item?.display !== 'heading') || highlightedItem === item, 'is-link': item.url, 'is-disabled': item.disabled, 'is-readonly': item.readonly, 'is-checked': item.checked, 'text-heading-3': item?.display === 'heading'}\"\r\n (click)=\"selectItem($event, item)\">\r\n\r\n <a *ngIf=\"item.url && !item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n [routerLink]=\"item.url\"\r\n [queryParams]=\"item.queryParams || null\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <a *ngIf=\"item.url && item.externalLink\"\r\n id=\"{{item.id}}_link\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\"\r\n href=\"{{item.url}}\"\r\n target=\"{{item.target || '_self'}}\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </a>\r\n\r\n <div *ngIf=\"!item.url\"\r\n title=\"{{truncateItems ? item.label : ''}}\"\r\n class=\"item-wrapper\">\r\n <ng-container *ngTemplateOutlet=\"internalizedTemplate; context: {$implicit: item}\"></ng-container>\r\n </div>\r\n </li>\r\n</ng-template>\r\n\r\n<!-- 'label' Item Template -->\r\n<ng-template #label\r\n let-item>\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'checkAndLabel' Item Template -->\r\n<ng-template #checkAndLabel\r\n let-item>\r\n\r\n <i class=\"ec-icon icon-check ec-icon-sm\"\r\n *ngIf=\"item.display !== 'heading'\"></i>\r\n\r\n <i class=\"ec-icon {{item.icon}} ml-2\"\r\n *ngIf=\"item.icon\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<!-- 'iconAndLabel' Item Template -->\r\n<ng-template #iconAndLabel\r\n let-item>\r\n <!-- If menuItem.icon exists and is not blank, show the icon in the menu -->\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n\r\n <span id=\"{{item.id}}_label\"\r\n class=\"label\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</span>\r\n\r\n <i class=\"ec-icon icon-angle-down rotate-270\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>\r\n\r\n<ng-template #iconLabelCaption\r\n let-item>\r\n <i class=\"ec-icon {{item.icon}}\"\r\n *ngIf=\"(item.icon && item.icon !== '') || preserveIconSpace\"></i>\r\n <div *ngIf=\"item.display !== 'heading'\"\r\n class=\"label flex-grow\">\r\n <div id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</div>\r\n <div id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</div>\r\n </div>\r\n <h3 *ngIf=\"item.display === 'heading'\"\r\n class=\"flex-grow text-heading-3 align-self-center\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</h3>\r\n <i class=\"ec-icon icon-angle-down rotate-270 align-self-center\"\r\n *ngIf=\"item?.items && item.display !== 'heading' && item.display !== 'divided-section'\"></i>\r\n</ng-template>", styles: ["@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}:host{display:block;font-size:var(--ec-menu-font-size, var(--ec-font-size-action));font-weight:400;background-color:var(--ec-menu-background-color, var(--ec-background-color))}:host.open>nav>.parent,:host.open>nav>.child{position:absolute;left:0;top:0;right:0;height:100%;transition:transform .25s ease}:host.open>nav>.parent{transform:translate(0)}:host.open>nav>.child{transform:translate(100%)}:host.open-active>nav>.parent{transform:translate(-100%)}:host.open-active>nav>.child{transform:translate(0)}:host(.bg-transparent){background-color:transparent}:host-context(.is-always-open){height:100%}:host-context(.is-always-open) .item-wrapper{padding-left:1rem;padding-right:1rem}nav{display:flex;position:relative;height:100%;overflow:hidden}.parent{display:flex;flex-direction:column;flex:auto;position:relative;max-width:100%}.parent>header{cursor:pointer}.parent>header.is-selected .item-wrapper,.parent>header.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}.parent>header:hover .item-wrapper{background-color:var(--ec-background-color-hover)}.parent.no-data ul{display:none}.parent.no-data .no-data-message{display:block}ul{padding:0;margin:0;list-style:none;flex:auto;height:100%;overflow-y:auto}ul li{cursor:pointer;padding:0 .25rem}ul li a{color:inherit;border-bottom:0;text-decoration:none}ul li.is-selected .item-wrapper,ul li.is-highlighted .item-wrapper{background-color:var(--ec-background-color-selected)}ul li:hover .item-wrapper{background-color:var(--ec-background-color-hover)}ul li:focus .item-wrapper{outline:none;background-color:var(--ec-color-disabled-dark);position:relative;z-index:1}ul li.is-disabled .item-wrapper{color:var(--ec-color-disabled-dark);opacity:var(--ec-form-control-opacity-disabled)}ul li.is-disabled,ul li.is-readonly{cursor:default}ul li.is-disabled .item-wrapper,ul li.is-readonly .item-wrapper{background-color:transparent;color:inherit}ul li.is-checked .icon-check{opacity:1}ul li.heading{cursor:default}ul li.heading .item-wrapper{background-color:transparent}ul li.heading:not(:first-child){margin-top:.5rem}ul li.divider:not(:last-child){border-bottom:1px solid var(--ec-border-color);padding-bottom:.25rem;margin-bottom:.25rem}ul li.divider-top:not(:first-child):not(.divider + .divider-top){border-top:1px solid var(--ec-border-color);padding-top:.25rem;margin-top:.25rem}ul li.indent-1 .item-wrapper{padding-left:1.5rem}ul li.indent-2 .item-wrapper{padding-left:2.5rem}ul li.indent-3 .item-wrapper{padding-left:3.5rem}.item-wrapper{cursor:inherit;line-height:1.25rem;min-height:1.75rem;padding:.25rem .5rem;border-radius:var(--ec-border-radius);display:flex;color:inherit}.item-wrapper .label{margin-right:auto}.item-wrapper .label+.ec-icon{margin-left:.5rem}.item-wrapper .ec-icon{margin-top:calc((1.25rem - var(--ec-font-size-icon)) / 2);flex:none}.item-wrapper .ec-icon+.label{margin-left:.5rem}.item-wrapper .ec-icon-sm{margin-top:calc((1.25rem - calc(var(--ec-font-size-icon) * .75)) / 2)}.item-wrapper .icon-check{opacity:0}.no-data-message{display:none;text-align:center;padding:1rem;color:var(--ec-color-hint-dark);margin-bottom:0;font-size:var(--ec-font-size-body)}:host-context(ec-tree) ul{overflow-x:hidden}:host-context(ec-tree) li.is-selected,:host-context(ec-tree) li.is-highlighted{font-weight:700;color:var(--ec-menu-color-highlighted, inherit)}:host-context(ec-tree) li.is-selected:not(:hover),:host-context(ec-tree) li.is-highlighted:not(:hover){background-color:transparent}\n"] }]
|
401
429
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.WindowService }, { type: i2.ScrollService }]; }, propDecorators: { id: [{
|
402
430
|
type: Input
|
403
431
|
}], attrId: [{
|
@@ -448,4 +476,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
448
476
|
type: ViewChild,
|
449
477
|
args: ['iconLabelCaption', { static: true }]
|
450
478
|
}] } });
|
451
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUEwQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBNEIvSixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBRXRDOzs7O0dBSUc7QUFNSCxNQUFNLE9BQU8sYUFBYTtJQTRLdEIsWUFDWSxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsYUFBNEI7UUFINUIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqS3hDOzs7O1dBSUc7UUFDYSxVQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUc1Qzs7Ozs7V0FLRztRQUNhLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBVWpEOzs7O1dBSUc7UUFDYSxpQkFBWSxHQUFxQixPQUFPLENBQUM7UUFtQnpEOztXQUVHO1FBQ2EsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0M7O1dBRUc7UUFDYSxlQUFVLEdBQVcsWUFBWSxDQUFDO1FBR2xEOztXQUVHO1FBQ2EsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFHL0M7O1dBRUc7UUFDYSxvQkFBZSxHQUFvQixJQUFJLENBQUM7UUFFeEQ7Ozs7V0FJRztRQUNhLHlCQUFvQixH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QWlCO3NCQUFoQyxLQUFLO2dCQUtVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFPVyxlQUFlO3NCQUEvQixNQUFNO2dCQU9VLFVBQVU7c0JBQTFCLE1BQU07Z0JBbUJ3QyxhQUFhO3NCQUExRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTWdCLG9CQUFvQjtzQkFBeEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1XLHFCQUFxQjtzQkFBMUUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUthLHdCQUF3QjtzQkFBaEYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51VGVtcGxhdGVUeXBlID0gXCJsYWJlbFwiIHwgXCJpY29uQW5kTGFiZWxcIiB8IFwiY2hlY2tBbmRMYWJlbFwiIHwgXCJpY29uTGFiZWxDYXB0aW9uXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51SG9zdEVsZW1lbnRDbGFzc2VzID0gJ2JnLXRyYW5zcGFyZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW08VFZhbHVlPWFueSwgU0l0ZW1zPWFueT4gZXh0ZW5kcyBOYXZJdGVtIHtcclxuICAvLyBMYWJlbCBpcyBvcHRpb25hbCBpbiBOYXZJdGVtIGJ1dCB3YXMgbm90IGluIE1lbnVJdGVtLFxyXG4gIC8vIG92ZXJyaWRpbmcgdG8gYmUgcmVxdWlyZWRcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGNhcHRpb24/OiBzdHJpbmcsXHJcbiAgaXRlbXM/OiBNZW51SXRlbTxTSXRlbXM+W10sXHJcbiAgY2hlY2tlZD86IGJvb2xlYW4sXHJcbiAgZGlzcGxheT86ICdkZWZhdWx0J3wnaGVhZGluZyd8J2RpdmlkZXInLFxyXG4gIHZhbHVlPzpUVmFsdWUsXHJcbiAgY2xhc3NMaXN0PzpzdHJpbmcsXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gIGhpZGRlbj86IGJvb2xlYW4sXHJcbiAgcmVhZG9ubHk/OiBib29sZWFuLFxyXG4gIHRhcmdldD86IExpbmtUYXJnZXQsXHJcbiAgZXh0ZXJuYWxMaW5rPzogYm9vbGVhbixcclxuICAvKiogT3B0aW9uYWwgdGV4dCB0byBkaXNwbGF5IGluLXBsYWNlIG9mIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gdGhlIE1lbnVJdGVtIGlzIHNlbGVjdGVkLiAqL1xyXG4gIHNlbGVjdGVkTGFiZWw/OiBzdHJpbmdcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBtZW51QW5pbWF0aW9uU3BlZWQgPSAzNTA7XHJcblxyXG4vKipcclxuICogUHJpbWl0aXZlIE1lbnUgY29tcG9uZW50IHRoYXQgZW5jYXBzdWxhdGVzIGtub3duIHRlbXBsYXRlc1xyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZWMtbWVudScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIElucHV0IGZvciB0aGUgbWVudSdzIHRlbXBsYXRlIGlkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZD86IHN0cmluZztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBib3VuZCB0byB0aGUgaG9zdCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpIHB1YmxpYyBhdHRySWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJyYXkgb2YgaXRlbXMgdG8gZGlzcGxheVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogIFNlbGVjdGVkIGl0ZW07IGFubm90YXRlcyB0aGUgaXRlbVxyXG4gICAgICogIHdoZW4gZGlzcGxheWVkIHdpdGggJ3NlbGVjdGVkJyBjbGFzc1xyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGFyZW50IG1lbnUgaXRlbS4gSWYgZGVmaW5lZCwgYSBoZWFkZXIgd2l0aCB0aGUgcGFyZW50J3MgbGFiZWwgYW5kIGFcclxuICAgICAqIGJhY2sgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFyZW50PzogTWVudUl0ZW07XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGlzcGxheSB0ZW1wbGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0ZW1wbGF0ZVR5cGU6IE1lbnVUZW1wbGF0ZVR5cGUgPSAnbGFiZWwnO1xyXG5cclxuXHQvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcblx0ICogaW5wdXQgdmFyaWFibGUgY2FsbGVkIFwiaXRlbVwiIGxpa2Ugc286IDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOYW1lIGxldC1pdGVtPixcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1lbnUncyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGl0bGU/OnN0cmluZztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IG1lc3NhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gaXRlbXNcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dOb0l0ZW1zPzpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IHRvIHNob3cgd2hlbiBtZW51IGlzIGVtcHR5IGFuZCBzaG93Tm9JdGVtcyBpcyB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBub0RhdGFUZXh0OiBzdHJpbmcgPSAnTm9JdGVtc19UQyc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbHMgd2hldGhlciBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGVuYWJsZUtleU5hdj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCBieSBrZXlib2FyZCBuYXZpZ2F0aW9uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB0aGUgbWVudSB0byBtYWludGFpbiB0aGUgc2VsZWN0ZWQvbGFzdFNlbGVjdGVkIGl0ZW0uIFR1cm5pbmcgdGhpcyBvZmYgaXMgdXNlZnVsIGZvclxyXG4gICAgICogYWN0aW9uIHR5cGUgbWVudXMgdGhhdCBhcmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYXQgYWxsIHRpbWVzIGFuZCB5b3UgZG8gbm90XHJcbiAgICAgKiB3YW50IHRoZSBpdGVtIHRvIGJlIHNlbGVjdGVkIHdoZW4gY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG1haW50YWluU2VsZWN0ZWRJdGVtOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgcHJldmVudCB0ZXh0LXdyYXBwaW5nIG9mIG1lbnUgaXRlbXMgYW5kIHRydW5jYXRlIGluc3RlYWQuIEFsc28gdHVybnMgb24gYSB0b29sdGlwIGZvciB0aGUgbWVudSBpdGVtLiBEZWZhdWx0OiBmYWxzZTtcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRydW5jYXRlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdHJ1ZSwgdGhlIHNwYWNlIGZvciB0aGUgaWNvbiBpcyBwcmVzZXJ2ZWQgZm9yIG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSBpY29ucy5cclxuICAgICAqIE9ubHkgYXBwbGljYWJsZSBmb3IgaWNvbkFuZExhYmVsIG1lbnVzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgdG9nZ2xlIGJ1dHRvbi4gIFNldCB3aGVuIG1lbnUgaXMgdXNlZCBhcyBwYXJ0IG9mIGEgRHJvcGRvd25Db21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93blRvZ2dsZUJ1dHRvbj86IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gYHNlbGVjdGVkYCBpcyBjaGFuZ2VkLiBFbWl0cyB0aGUgcmVmZXJlbmNlZCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgbWVudSBoYXMgYSBwYXJlbnQgYW5kIGJhY2sgaXMgY2xpY2tlZFxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBtZW51Q2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGl0ZW0gdGVtcGxhdGUgdGhhdCBpcyBsb2FkZWQgaW50byB0aGUgY29tcG9uZW50IHRlbXBsYXRlXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsaXplZFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGV4IG9mIHRoZSBpdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCB1c2luZyBrZXlib2FyZCBuYXZcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhpZ2hsaWdodGVkSXRlbUluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICAgQFZpZXdDaGlsZCgnbGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGxhYmVsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGljb24gYW5kIGxhYmVsIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25BbmRMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgaWNvbkFuZExhYmVsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGNoZWNrIGFuZCBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdjaGVja0FuZExhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjaGVja0FuZExhYmVsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgaWNvbiwgbGFiZWwgYW5kIGNhcHRpb24gdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaWNvbkxhYmVsQ2FwdGlvbicsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgaWNvbkxhYmVsQ2FwdGlvblRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRhaW5zIHRoZSBmdW5jdGlvbiB1c2VkIHRvIHJlbW92ZSB0aGUgZXZlbiBsaXN0ZW5lciBmcm9tIHRoZSByZW5kZXJlclxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlbW92ZUtleWRvd25MaXN0ZW5lcj86ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMYXN0IGl0ZW0gdGhpcy5zZWxlY3RlZCB3YXMgc2V0IHRvIHZpYSBzZWxlY3RJdGVtKCkuXHJcbiAgICAgKiBUaGlzIGlzbid0IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoaXMuc2VsZWN0ZWQsIGJlY2F1c2UgdGhpcy5zZWxlY3RlZCBpcyBhbiBpbnB1dCBwcm9wZXJ0eVxyXG4gICAgICogYW5kIGNvdWxkIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IGEgY29uc3VtZXIgdGhyb3VnaCBzb21lIG1lYW5zIG90aGVyIHRoYW4gc2VsZWN0SXRlbSgpLlxyXG4gICAgICogVGhpcyBhbGxvd3MgdXMgdG8gcHJldmVudCBkb3VibGUtY2FsbHMgdG8gc2VsZWN0SXRlbSgpIHdpdGggdGhlIHNhbWUgaW5wdXQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICBwcml2YXRlIHdpbmRvd1NlcnZpY2U6IFdpbmRvd1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBTY3JvbGxTZXJ2aWNlXHJcbiAgICApe1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyAmIGRpc3BsYXlzIHRoZSBpbnRlcmFsaXplZCB0ZW1wbGF0ZSBiYXNlZCBvblxyXG4gICAgICogdGhlIHNldCB0ZW1wbGF0ZS5cclxuICAgICAqIEBzZWUgeyBAbGluayBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzfEFuZ3VsYXIgTGlmZWN5Y2xlIEhvb2tzfVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnRlbXBsYXRlVHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIChcImxhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkFuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJpY29uQW5kTGFiZWxcIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5pY29uQW5kTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChcImNoZWNrQW5kTGFiZWxcIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jaGVja0FuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJpY29uTGFiZWxDYXB0aW9uXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkxhYmVsQ2FwdGlvblRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGVUeXBlIGZvciBNZW51Q29tcG9uZW50LiBQbGVhc2UgdXNlIGVpdGhlcjogJ2xhYmVsJywgJ2ljb25BbmRMYWJlbCcgb3IgJ2NoZWNrQW5kTGFiZWwnYClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIGEgbWVudUl0ZW1UZW1wbGF0ZSwgb3ZlcnJpZGUgdGhlIGludGVybmFsaXplZFRlbXBsYXRlIHdpdGggdGhhdC5cclxuICAgICAgICBpZih0aGlzLmN1c3RvbU1lbnVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jdXN0b21NZW51VGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF0dHJJZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEl0ZW1JZHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPSB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHsgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID09PSBpdGVtfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFkZEtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3RlbmVyIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgICAgICBpZiAodGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBhIG1lbnUgaXRlbSBpcyBzZWxlY3RlZCwgb3BlbiBhIGNoaWxkIG1lbnUgaWYgdGhlIGl0ZW0gaGFzIGl0ZW1zLCBjYWxsXHJcbiAgICAgKiB0aGUgaXRlbSdzIGNsaWNrIG1ldGhvZCBpZiBkZWZpbmVkLCBvciBlbWl0IHRoZSBzZWxlY3RlZCBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VsZWN0SXRlbShldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtLCBpc0tleUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAvL0luIHRoZSBjYXNlIHRoYXQgdGhlIHVzZXIgY2xpY2tzIGFuIGl0ZW0sIHNlbGVjdEl0ZW0oKSB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGljayBoYW5kbGVyXHJcbiAgICAgICAgLy9hbmQgdGhyb3VnaCBvblJvdXRlckxpbmtBY3RpdmF0ZWQuIE9ubHkgb25lIG9mIHRoZXNlIHdpbGwgbWFrZSBpdCB0aHJvdWdoIHRoaXMgaWYgc3RhdGVtZW50XHJcbiAgICAgICAgLy9iZWNhdXNlIHRoZSBmaXJzdCBvbmUgd2lsbCBzZXQgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtLlxyXG4gICAgICAgIGlmKCFpdGVtLmRpc2FibGVkICYmICFpdGVtLnJlYWRvbmx5ICYmIHRoaXMubGFzdFNlbGVjdGVkICE9PSBpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5vbkNsaWNrKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hpbGRNZW51KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSB0aGUgdXJsIG5hdmlnYXRpb24gaWYgdGhlIGtleWJvYXJkIHdhcyB1c2VkXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNLZXlFdmVudCB8fCAoPEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KT8udGFnTmFtZSA9PT0gJ0xJJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS51cmwsIGl0ZW0udGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3dTZXJ2aWNlLm5hdmlnYXRlVG9VcmwoaXRlbS51cmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gRW1pdCBzbyB1cHN0cmVhbSBjb21wb25lbnRzIGtub3cgYW4gaXRlbSB3YXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpblNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IG1lbnUgYW5kIG9wZW4gdGhlIHBhcmVudCBtZW51XHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYmFjayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vbkNsaWNrKG51bGwsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lbnVDbG9zZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgdGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNlbGVjdGlvbihpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlZC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIG9yIGNsb3NlIHRoZSBjaGlsZCBtZW51LiBXaGVuIHRoZSBjaGlsZCBtZW51IGNsb3NlcywgdGhlIHNlbGVjdGVkXHJcbiAgICAgKiBpdGVtIGlzIHJlc2V0LlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZUNoaWxkTWVudShvcGVuOmJvb2xlYW4pOnZvaWQge1xyXG4gICAgICAgIGxldCBuYXZFbCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCduYXYnKTtcclxuXHJcbiAgICAgICAgaWYgKG9wZW4pIHtcclxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciBvbiB0aGUgcGFyZW50IG1lbnUgd2hlbiBhIGNoaWxkIG1lbnUgaXMgb3BlbmVkXHJcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgbWVudXNcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaGVpZ2h0Om51bWJlciA9IG5hdkVsLm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgbGV0IHdpZHRoOm51bWJlciA9IG5hdkVsLm9mZnNldFdpZHRoO1xyXG5cclxuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gYW5pbWF0ZSB0aGUgY2hpbGQgbWVudSwgd2UgbmVlZCB0byBzZXQgaGVpZ2h0IG9uIHRoZSBuYXYgZWxlbWVudFxyXG4gICAgICAgICAgICAvLyBzbyB3ZSBjYW4gYWJzb2x1dGVseSBwb3NpdGlvbiB0aGUgdHdvIG1lbnVzIGFuZCBtYWludGFpbiB0aGUgY3VycmVudCBtZW51J3MgaGVpZ2h0XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXZFbCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3Blbi1hY3RpdmUnKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBSZS1hZGQgdGhlIGxpc3RlbmVyIG9uY2UgdGhlIGNoaWxkIG1lbnUgY2xvc2VzXHJcbiAgICAgICAgICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIG5hdiBlbGVtZW50J3MgaGVpZ2h0IHRvIGF1dG9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICdoZWlnaHQnLCAnMTAwJScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sIG1lbnVBbmltYXRpb25TcGVlZClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUga2V5IHByZXNzZXMgdG8gbmF2aWdhdGUgdGhlIG1lbnVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2ICYmIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5kcm9wZG93blRvZ2dsZUJ1dHRvbj8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdVcCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVIaWdobGlnaHRlZFVwT3JEb3duKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgaXRlbSBpZiBpdCBoYXMgY2hpbGQgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW0gJiYgdGhpcy5oaWdobGlnaHRlZEl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLmhpZ2hsaWdodGVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdMZWZ0JzpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZW51IGlmIGl0IGlzIGEgY2hpbGQgbWVudVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICcgJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ1NwYWNlYmFyJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50ICdlbnRlcicgZnJvbSBkb2luZyB3aGF0ZXZlciBpdCBkb2VzIG9uIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLmhpZ2hsaWdodGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZXZlbnQsIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIGlzIGhpZ2hsaWdodGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID09PSAtMSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIG1lbnUgaWYgaXQncyBhIGNoaWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNjcm9sbCB0byB0aGUgaXRlbSBjdXJyZW50bHkgbWFya2VkIGFzICdpcy1zZWxlY3RlZCcuIFdhaXQgYSB0aWNrIGZvciB0aGVcclxuICAgICAqIE5nQ2xhc3NEaXJlY2l0dmUgb3IgTmF2SXRlbUFjdGl2ZURpcmVjdGl2ZSB0byByZXNwb25kIHRvIHRoZSBtb2RlbCBjaGFuZ2VzXHJcbiAgICAgKiBhbmQgdXBkYXRlIHRoZSB2aWV3LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rU2VsZWN0b3IgPSBgbGkuaXMtc2VsZWN0ZWRgO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsVG9JdGVtKGAjJHt0aGlzLmlkfV9saXN0YCwgbGlua1NlbGVjdG9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1vdmVIaWdobGlnaHRlZFVwT3JEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ1VwJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4LS07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgaW4tbWVudSBoZWFkaW5nIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLml0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4LS07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICBjYXNlICdEb3duJzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4IDwgdGhpcy5pdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4IDwgdGhpcy5pdGVtcy5sZW5ndGggLSAxICYmIHRoaXMuaXRlbXNbdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBpdGVtIGF0IHRoZSBjdXJyZW50IGhpZ2hsaWdodCBpbmRleFxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IHRoaXMuaXRlbXNbdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjcm9sbFRvSGlnaGxpZ2h0ZWRJdGVtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogU2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgbWVudSBpdGVtLlxyXG4gICAqIElmIG5vIGl0ZW0gaXMgcHJvdmlkZWQsIGl0IHdpbGwgc2Nyb2xsIHRvIHRoZSBmaXJzdCBpdGVtLlxyXG5cdCAqXHJcbiAgICogQHBhcmFtIGl0ZW0gVGhlIG1lbnUgaXRlbSB0byBzY3JvbGwgdG8uXHJcblx0ICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbE1lbnUoaXRlbT86IE1lbnVJdGVtIHwgbnVsbCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpdGVtID0gaXRlbSA/IGl0ZW0gOiB0aGlzLml0ZW1zWzBdO1xyXG4gICAgICAgICAgICBsZXQgaXRlbUluZGV4ID0gdGhpcy5maW5kSXRlbUluZGV4KGl0ZW0pO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtU2VsZWN0b3IgPSBpdGVtLmlkID8gYCMke2l0ZW0uaWR9YCA6IGAjJHt0aGlzLmlkfV9pdGVtJHtpdGVtSW5kZXh9YDtcclxuXHRcdFx0XHR0aGlzLnNjcm9sbFNlcnZpY2Uuc2Nyb2xsSXRlbUNlbnRlcmVkKGAjJHt0aGlzLmlkfV9saXN0YCwgaXRlbVNlbGVjdG9yKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9IaWdobGlnaHRlZEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxNZW51KHRoaXMuaGlnaGxpZ2h0ZWRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQgKiBGaW5kIGEgZ2l2ZW4gaXRlbSdzIGluZGV4IGluIHRoZSBmaWx0ZXJlZCBpdGVtcyBhcnJheS5cclxuXHQgKlxyXG5cdCAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kXHJcblx0ICogQHBhcmFtIGl0ZW1Ub0ZpbmQgVGhlIG1hdGNoaW5nIGl0ZW0gdG8gZmluZCBpbiB0aGUgaXRlbXMgYXJyYXkuXHJcblx0ICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRJdGVtSW5kZXgoaXRlbVRvRmluZD86IE1lbnVJdGVtIHwgbnVsbCk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKGl0ZW1Ub0ZpbmQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWwgPT09ICg8TWVudUl0ZW0+aXRlbVRvRmluZCkubGFiZWw7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRLZXlkb3duTGlzdGVuZXIoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gT25seSBhdHRlbXB0IHRvIGFkZCB0aGUgbGlzdGVuZXIgaWYga2V5Ym9hcmQgbmF2IGlzIGVuYWJsZWRcclxuICAgICAgICBpZiAodGhpcy5lbmFibGVLZXlOYXYpIHtcclxuICAgICAgICAgICAgLy8gcmVuZGVyZXIubGlzdGVuIGFkZHMgdGhlIGxpc3RlbmVyIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIHJlbmRlcmVyLlxyXG4gICAgICAgICAgICAvLyBUaGUgbGlzdGVuZXIgcmVtYWlucyBhY3RpdmUgdW50aWwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuXHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMua2V5TmF2aWdhdGUoZXZlbnQpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBtZW51IGl0ZW0gaWRzIHVzaW5nIGl0cyBpbmRleCBpZiBpdGVtIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIG9uZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldEl0ZW1JZHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5pZCA9IGl0ZW0uaWQgPyBpdGVtLmlkIDogdGhpcy5pZCArICdfaXRlbScgKyBpbmRleDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxuYXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFyZW50XCJcclxuICAgICAgICAgW2NsYXNzLm5vLWRhdGFdPVwic2hvd05vSXRlbXMgJiYgKCFpdGVtcyB8fCBpdGVtcy5sZW5ndGggPT09IDApXCI+XHJcbiAgICAgICAgPGhlYWRlciBpZD1cInt7aWR9fV9oZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMyBwLTFcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cImhpZ2hsaWdodGVkSXRlbUluZGV4ID09PSAtMVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInBhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFjaygkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTkwIGZsZXgtc2hyaW5rXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbCB0ZXh0LXRydW5jYXRlIGZsZXgtZ3Jvd1wiPnt7cGFyZW50Py5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuXHJcbiAgICAgICAgPHVsIGlkPVwie3tpZH19X2xpc3RcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInB5LTFcIj5cclxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCJcclxuICAgICAgICAgICAgICAgIGlkPVwie3tpdGVtLmlkIHx8IGlkICsgJ19pdGVtJyArIGl9fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInt7aXRlbS5kaXNwbGF5IHx8ICdpdGVtJ319IHt7aXRlbS5jbGFzc0xpc3R9fVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiaXRlbS5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgZWNOYXZJdGVtQWN0aXZlPVwiaXMtc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZVF1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXNcIlxyXG4gICAgICAgICAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZVVybF09XCJpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICAgICBbZWNOYXZJdGVtQWN0aXZlRXhhY3RNYXRjaF09J2l0ZW0uaXNBY3RpdmVFeGFjdE1hdGNoJ1xyXG4gICAgICAgICAgICAgICAgKHJvdXRlckxpbmtBY3RpdmF0ZWQpPVwic2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaGlnaGxpZ2h0ZWQnOihzZWxlY3RlZCA9PT0gaXRlbSAmJiBpdGVtPy5kaXNwbGF5ICE9PSAnaGVhZGluZycpIHx8IGhpZ2hsaWdodGVkSXRlbSA9PT0gaXRlbSwgJ2lzLWxpbmsnOiBpdGVtLnVybCwgJ2lzLWRpc2FibGVkJzogaXRlbS5kaXNhYmxlZCwgJ2lzLXJlYWRvbmx5JzogaXRlbS5yZWFkb25seSwgJ2lzLWNoZWNrZWQnOiBpdGVtLmNoZWNrZWQsICd0ZXh0LWhlYWRpbmctMyc6IGl0ZW0/LmRpc3BsYXkgPT09ICdoZWFkaW5nJ31cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgIWl0ZW0uZXh0ZXJuYWxMaW5rXCJcclxuICAgICAgICAgICAgICAgICAgIGlkPVwie3tpdGVtLmlkfX1fbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCJcclxuICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0udXJsXCJcclxuICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJpdGVtLnF1ZXJ5UGFyYW1zIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgaXRlbS5leHRlcm5hbExpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2l0ZW0uaWR9fV9saW5rXCJcclxuICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3t0cnVuY2F0ZUl0ZW1zID8gaXRlbS5sYWJlbCA6ICcnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgaHJlZj1cInt7aXRlbS51cmx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJ7e2l0ZW0udGFyZ2V0IHx8ICdfc2VsZid9fVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3t0cnVuY2F0ZUl0ZW1zID8gaXRlbS5sYWJlbCA6ICcnfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIDxwIGNsYXNzPVwibm8tZGF0YS1tZXNzYWdlXCI+e3tub0RhdGFUZXh0IHwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENoaWxkIG1lbnUgKFJlbmRlcmVkIHRvIHRoZSByaWdodCkgLS0+XHJcbiAgICA8ZWMtbWVudSAqbmdJZj1cInNlbGVjdGVkPy5pdGVtc1wiXHJcbiAgICAgICAgICAgICBpZD1cInt7aWR9fV9jaGlsZFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImNoaWxkXCJcclxuICAgICAgICAgICAgIFtwYXJlbnRdPVwic2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgW2l0ZW1zXT1cInNlbGVjdGVkPy5pdGVtc1wiXHJcbiAgICAgICAgICAgICBbc2hvd05vSXRlbXNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbdGVtcGxhdGVUeXBlXT1cInRlbXBsYXRlVHlwZVwiXHJcbiAgICAgICAgICAgICBbZW5hYmxlS2V5TmF2XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgW3RydW5jYXRlSXRlbXNdPVwidHJ1bmNhdGVJdGVtc1wiXHJcbiAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cIm9uU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKG1lbnVDbG9zZWQpPVwidG9nZ2xlQ2hpbGRNZW51KGZhbHNlKVwiPlxyXG4gICAgPC9lYy1tZW51PlxyXG48L25hdj5cclxuXHJcbjwhLS0gJ2xhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2xhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDxzcGFuIGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXNcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdjaGVja0FuZExhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2NoZWNrQW5kTGFiZWxcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWNoZWNrIGVjLWljb24tc21cIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJ1wiPjwvaT5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fSBtbC0yXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCI+PC9pPlxyXG5cclxuICAgIDxzcGFuIGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXNcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdpY29uQW5kTGFiZWwnIEl0ZW0gVGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkFuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDwhLS0gSWYgbWVudUl0ZW0uaWNvbiBleGlzdHMgYW5kIGlzIG5vdCBibGFuaywgc2hvdyB0aGUgaWNvbiBpbiB0aGUgbWVudSAtLT5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19XCJcclxuICAgICAgICpuZ0lmPVwiKGl0ZW0uaWNvbiAmJiBpdGVtLmljb24gIT09ICcnKSB8fCBwcmVzZXJ2ZUljb25TcGFjZVwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNpY29uTGFiZWxDYXB0aW9uXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2l0ZW0uaWNvbn19XCJcclxuICAgICAgICpuZ0lmPVwiKGl0ZW0uaWNvbiAmJiBpdGVtLmljb24gIT09ICcnKSB8fCBwcmVzZXJ2ZUljb25TcGFjZVwiPjwvaT5cclxuICAgIDxkaXYgKm5nSWY9XCJpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJ1wiXHJcbiAgICAgICAgIGNsYXNzPVwibGFiZWwgZmxleC1ncm93XCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktMVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgaWQ9XCJ7e2l0ZW0uaWR9fV9jYXB0aW9uXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jYXB0aW9uXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jYXB0aW9uLTFcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5jYXB0aW9ufX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGgzICpuZ0lmPVwiaXRlbS5kaXNwbGF5ID09PSAnaGVhZGluZydcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleC1ncm93IHRleHQtaGVhZGluZy0zIGFsaWduLXNlbGYtY2VudGVyXCJcclxuICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L2gzPlxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwIGFsaWduLXNlbGYtY2VudGVyXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXNcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+Il19
|
479
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXdCLE1BQU0sRUFBeUMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQTZCekwsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUV0Qzs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLGFBQWE7SUFnTHRCOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFpQjtRQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGlCQUFpQixFQUFFO2dCQUNsRSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDbkIsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7YUFDdkk7WUFDRCxPQUFPLGVBQWUsQ0FBQztRQUMzQixDQUFDLEVBQWMsRUFB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QW9CO3NCQUFuQyxLQUFLO2dCQU9XLGVBQWU7c0JBQS9CLE1BQU07Z0JBT1UsVUFBVTtzQkFBMUIsTUFBTTtnQkFtQnVDLGFBQWE7c0JBQTFELFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNaUIsb0JBQW9CO3NCQUF4RSxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTVcscUJBQXFCO3NCQUExRSxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBS2Esd0JBQXdCO3NCQUFoRixTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXaW5kb3dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS93aW5kb3cuc2VydmljZSc7XHJcbmltcG9ydCB7IExpbmtUYXJnZXQgfSBmcm9tICcuLi8uLi9kaXNwbGF5L3RhZ3MvdGFnJztcclxuaW1wb3J0IHsgTmF2SXRlbSB9IGZyb20gJy4uL25hdmlnYXRpb24vbmF2LWl0ZW0nO1xyXG5cclxuZXhwb3J0IHR5cGUgTWVudVRlbXBsYXRlVHlwZSA9IFwibGFiZWxcIiB8IFwiaWNvbkFuZExhYmVsXCIgfCBcImNoZWNrQW5kTGFiZWxcIiB8IFwiaWNvbkxhYmVsQ2FwdGlvblwiO1xyXG5cclxuZXhwb3J0IHR5cGUgTWVudUhvc3RFbGVtZW50Q2xhc3NlcyA9ICdiZy10cmFuc3BhcmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lbnVJdGVtPFRWYWx1ZSA9IGFueSwgU0l0ZW1zID0gYW55PiBleHRlbmRzIE5hdkl0ZW0ge1xyXG4gICAgLy8gTGFiZWwgaXMgb3B0aW9uYWwgaW4gTmF2SXRlbSBidXQgd2FzIG5vdCBpbiBNZW51SXRlbSxcclxuICAgIC8vIG92ZXJyaWRpbmcgdG8gYmUgcmVxdWlyZWRcclxuICAgIGxhYmVsOiBzdHJpbmcsXHJcbiAgICBjYXB0aW9uPzogc3RyaW5nLFxyXG4gICAgaXRlbXM/OiBNZW51SXRlbTxTSXRlbXM+W10sXHJcbiAgICBjaGVja2VkPzogYm9vbGVhbixcclxuICAgIGRpc3BsYXk/OiAnZGVmYXVsdCcgfCAnaGVhZGluZycgfCAnZGl2aWRlcicgfCAnZGl2aWRlZC1zZWN0aW9uJyxcclxuICAgIHZhbHVlPzogVFZhbHVlLFxyXG4gICAgY2xhc3NMaXN0Pzogc3RyaW5nLFxyXG4gICAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gICAgaGlkZGVuPzogYm9vbGVhbixcclxuICAgIHJlYWRvbmx5PzogYm9vbGVhbixcclxuICAgIHRhcmdldD86IExpbmtUYXJnZXQsXHJcbiAgICBleHRlcm5hbExpbms/OiBib29sZWFuLFxyXG4gICAgLyoqIE9wdGlvbmFsIHRleHQgdG8gZGlzcGxheSBpbi1wbGFjZSBvZiB0aGUgZGVmYXVsdCBsYWJlbCB3aGVuIHRoZSBNZW51SXRlbSBpcyBzZWxlY3RlZC4gKi9cclxuICAgIHNlbGVjdGVkTGFiZWw/OiBzdHJpbmcsXHJcbiAgICBoaWRlSWZOb0l0ZW1zPzogYm9vbGVhblxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IG1lbnVBbmltYXRpb25TcGVlZCA9IDM1MDtcclxuXHJcbi8qKlxyXG4gKiBQcmltaXRpdmUgTWVudSBjb21wb25lbnQgdGhhdCBlbmNhcHN1bGF0ZXMga25vd24gdGVtcGxhdGVzXHJcbiAqXHJcbiAqIEBleHBvcnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdlYy1tZW51JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL21lbnUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dCBmb3IgdGhlIG1lbnUncyB0ZW1wbGF0ZSBpZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgYm91bmQgdG8gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBwdWJsaWMgYXR0cklkPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIGl0ZW1zIHRvIGRpc3BsYXlcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqICBTZWxlY3RlZCBpdGVtOyBhbm5vdGF0ZXMgdGhlIGl0ZW1cclxuICAgICAqICB3aGVuIGRpc3BsYXllZCB3aXRoICdzZWxlY3RlZCcgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBhcmVudCBtZW51IGl0ZW0uIElmIGRlZmluZWQsIGEgaGVhZGVyIHdpdGggdGhlIHBhcmVudCdzIGxhYmVsIGFuZCBhXHJcbiAgICAgKiBiYWNrIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhcmVudD86IE1lbnVJdGVtO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXkgdGVtcGxhdGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcbiAgICAgKiBpbnB1dCB2YXJpYWJsZSBjYWxsZWQgXCJpdGVtXCIgbGlrZSBzbzogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZU5hbWUgbGV0LWl0ZW0+LFxyXG4gICAgICogd2hlcmUgaXRlbSByZXByZXNlbnRzIHRoZSBtZW51SXRlbS5cclxuICAgICAqIFdpbGwgb3ZlcnJpZGUgdGhlIGNob2ljZSBmb3IgdGVtcGxhdGVUeXBlIGlmIHByb3ZpZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZW51J3MgdGl0bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRpdGxlPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgbWVzc2FnZSB3aGVuIHRoZXJlIGFyZSBubyBpdGVtc1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd05vSXRlbXM/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZXh0IHRvIHNob3cgd2hlbiBtZW51IGlzIGVtcHR5IGFuZCBzaG93Tm9JdGVtcyBpcyB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBub0RhdGFUZXh0OiBzdHJpbmcgPSAnTm9JdGVtc19UQyc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udHJvbHMgd2hldGhlciBrZXlib2FyZCBuYXZpZ2F0aW9uIGlzIGVuYWJsZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGVuYWJsZUtleU5hdj86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCBieSBrZXlib2FyZCBuYXZpZ2F0aW9uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyB0aGUgbWVudSB0byBtYWludGFpbiB0aGUgc2VsZWN0ZWQvbGFzdFNlbGVjdGVkIGl0ZW0uIFR1cm5pbmcgdGhpcyBvZmYgaXMgdXNlZnVsIGZvclxyXG4gICAgICogYWN0aW9uIHR5cGUgbWVudXMgdGhhdCBhcmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYXQgYWxsIHRpbWVzIGFuZCB5b3UgZG8gbm90XHJcbiAgICAgKiB3YW50IHRoZSBpdGVtIHRvIGJlIHNlbGVjdGVkIHdoZW4gY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG1haW50YWluU2VsZWN0ZWRJdGVtOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgcHJldmVudCB0ZXh0LXdyYXBwaW5nIG9mIG1lbnUgaXRlbXMgYW5kIHRydW5jYXRlIGluc3RlYWQuIEFsc28gdHVybnMgb24gYSB0b29sdGlwIGZvciB0aGUgbWVudSBpdGVtLiBEZWZhdWx0OiBmYWxzZTtcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRydW5jYXRlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gdHJ1ZSwgdGhlIHNwYWNlIGZvciB0aGUgaWNvbiBpcyBwcmVzZXJ2ZWQgZm9yIG1lbnUgaXRlbXMgdGhhdCBkbyBub3QgaGF2ZSBpY29ucy5cclxuICAgICAqIE9ubHkgYXBwbGljYWJsZSBmb3IgaWNvbkFuZExhYmVsIG1lbnVzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUgdG9nZ2xlIGJ1dHRvbi4gIFNldCB3aGVuIG1lbnUgaXMgdXNlZCBhcyBwYXJ0IG9mIGEgRHJvcGRvd25Db21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93blRvZ2dsZUJ1dHRvbj86IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gYHNlbGVjdGVkYCBpcyBjaGFuZ2VkLiBFbWl0cyB0aGUgcmVmZXJlbmNlZCBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgbWVudSBoYXMgYSBwYXJlbnQgYW5kIGJhY2sgaXMgY2xpY2tlZFxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBtZW51Q2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGl0ZW0gdGVtcGxhdGUgdGhhdCBpcyBsb2FkZWQgaW50byB0aGUgY29tcG9uZW50IHRlbXBsYXRlXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGludGVybmFsaXplZFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGV4IG9mIHRoZSBpdGVtIGN1cnJlbnRseSBoaWdobGlnaHRlZCB1c2luZyBrZXlib2FyZCBuYXZcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhpZ2hsaWdodGVkSXRlbUluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdsYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgbGFiZWxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgaWNvbiBhbmQgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnaWNvbkFuZExhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBpY29uQW5kTGFiZWxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgY2hlY2sgYW5kIGxhYmVsIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2NoZWNrQW5kTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGNoZWNrQW5kTGFiZWxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBpY29uLCBsYWJlbCBhbmQgY2FwdGlvbiB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdpY29uTGFiZWxDYXB0aW9uJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBpY29uTGFiZWxDYXB0aW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGFpbnMgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gcmVtb3ZlIHRoZSBldmVuIGxpc3RlbmVyIGZyb20gdGhlIHJlbmRlcmVyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlS2V5ZG93bkxpc3RlbmVyPzogKCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExhc3QgaXRlbSB0aGlzLnNlbGVjdGVkIHdhcyBzZXQgdG8gdmlhIHNlbGVjdEl0ZW0oKS5cclxuICAgICAqIFRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhpcy5zZWxlY3RlZCwgYmVjYXVzZSB0aGlzLnNlbGVjdGVkIGlzIGFuIGlucHV0IHByb3BlcnR5XHJcbiAgICAgKiBhbmQgY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgYSBjb25zdW1lciB0aHJvdWdoIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiBzZWxlY3RJdGVtKCkuXHJcbiAgICAgKiBUaGlzIGFsbG93cyB1cyB0byBwcmV2ZW50IGRvdWJsZS1jYWxscyB0byBzZWxlY3RJdGVtKCkgd2l0aCB0aGUgc2FtZSBpbnB1dC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGbGF0dGVuZWQgYXJyYXkgb2YgYWxsIHNlbGVjdGFibGUgaXRlbXMgaW4gdGhlIG1lbnUuIE1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgaXRlbSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZWxlY3RhYmxlSXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gYSBmbGF0IGxpc3Qgb2YgYWxsIHNlbGVjdGFibGUgaXRlbXMgaW4gdGhlIHByb3ZpZGVkIG1lbnUgaXRlbXMuIEZpbHRlcnMgb3V0IGhlYWRpbmdzIGFuZCBkaXZpZGVkLXNlY3Rpb25zLlxyXG4gICAgICogVGhpcyBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBrZWVwIHRyYWNrIG9mIGN1cnJlbnRseSBoaWdobGlnaHRlZCBpdGVtcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBnZXRTZWxlY3RhYmxlSXRlbXMoaXRlbXM6IE1lbnVJdGVtW10pOiBNZW51SXRlbVtdIHtcclxuICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChzZWxlY3RhYmxlSXRlbXMsIGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGVJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGVJdGVtcy5wdXNoKC4uLml0ZW0uaXRlbXMuZmlsdGVyKGNoaWxkSXRlbSA9PiBjaGlsZEl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGNoaWxkSXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RhYmxlSXRlbXM7XHJcbiAgICAgICAgfSwgPE1lbnVJdGVtW10+W10pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBJRCBmb3IgdGhlIHByb3ZpZGVkIGl0ZW0gYmFzZWQgb24gaXRzIGluZGV4IGluIHRoZSBwcm92aWRlZCBpdGVtcyBhcnJheS4gVGhpcyBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIHRoZSBNZW51Q29tcG9uZW50J3NcclxuICAgICAqIGdlbmVyYXRlZCBJRHMgZm9yIGl0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBwcm92aWRlZCBJRHMuIFRoaXMgaXMgdXNlZCBpbiBNZW51Q29tcG9uZW50IGFuZCBDb21ib2JveENvbXBvbmVudCB0byBzY3JvbGwgdG8gc3BlY2lmaWMgaXRlbXMuXHJcbiAgICAgKiBOT1RFOiBJZiB0aGUgaXRlbXMgYXJyYXkgZG9lcyBub3QgbWF0Y2ggd2hhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIG1lbnUsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IElELlxyXG4gICAgICpcclxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgbm90IGZvdW5kXHJcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIE1lbnVJdGVtcyBhcnJheSB0byBzZWFyY2ggdGhyb3VnaC5cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGdlbmVyYXRlIHRoZSBJRCBmb3IuXHJcbiAgICAgKiBAcGFyYW0gbWVudUNvbXBvbmVudElkIFVzZWQgdG8gcHJlZml4IHRoZSBnZW5lcmF0ZWQgSUQuIFRoaXMgc2hvdWxkIGJlIHRoZSBJRCBvZiB0aGUgbWVudSBjb21wb25lbnQgdGhlIGl0ZW0gaXMgcHJlc2VudCBpbi5cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5kZXhlZEl0ZW1JZChpdGVtczogTWVudUl0ZW1bXSwgaXRlbT86IE1lbnVJdGVtIHwgbnVsbCwgbWVudUNvbXBvbmVudElkPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUluTGlzdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1Jbkxpc3QubGFiZWwgPT09IGl0ZW0ubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bWVudUNvbXBvbmVudElkfV9pdGVtJHtpfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBoZWFkaW5nIG9yIGRpdmlkZWQgc2VjdGlvbiwgY2hlY2sgaXRzIGNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbUluTGlzdC5pdGVtcyAmJiAoaXRlbUluTGlzdC5kaXNwbGF5ID09PSAnaGVhZGluZycgfHwgaXRlbUluTGlzdC5kaXNwbGF5ID09PSAnZGl2aWRlZC1zZWN0aW9uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZW1Jbkxpc3QuaXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtID0gaXRlbUluTGlzdC5pdGVtc1tqXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGNoZWNraW5nIG9ubHkgdGhlIGxhYmVsIGlmIHRoZSBpdGVtIGRvZXNuJ3QgaGF2ZSBhbiBpZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJdGVtLmxhYmVsID09PSBpdGVtLmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bWVudUNvbXBvbmVudElkfV9pdGVtJHtpfS0ke2p9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLml0ZW1zICYmIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlSXRlbXMgPSBNZW51Q29tcG9uZW50LmdldFNlbGVjdGFibGVJdGVtcyh0aGlzLml0ZW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzICYgZGlzcGxheXMgdGhlIGludGVyYWxpemVkIHRlbXBsYXRlIGJhc2VkIG9uXHJcbiAgICAgKiB0aGUgc2V0IHRlbXBsYXRlLlxyXG4gICAgICogQHNlZSB7IEBsaW5rIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9saWZlY3ljbGUtaG9va3N8QW5ndWxhciBMaWZlY3ljbGUgSG9va3N9XHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMudGVtcGxhdGVUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgKFwibGFiZWxcIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5pY29uQW5kTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChcImljb25BbmRMYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25BbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiY2hlY2tBbmRMYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmNoZWNrQW5kTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIChcImljb25MYWJlbENhcHRpb25cIik6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5pY29uTGFiZWxDYXB0aW9uVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZVR5cGUgZm9yIE1lbnVDb21wb25lbnQuIFBsZWFzZSB1c2UgZWl0aGVyOiAnbGFiZWwnLCAnaWNvbkFuZExhYmVsJyBvciAnY2hlY2tBbmRMYWJlbCdgKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9pZiB0aGUgY29uc3VtZXIgcHJvdmlkZWQgYSBtZW51SXRlbVRlbXBsYXRlLCBvdmVycmlkZSB0aGUgaW50ZXJuYWxpemVkVGVtcGxhdGUgd2l0aCB0aGF0LlxyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbU1lbnVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsaXplZFRlbXBsYXRlID0gdGhpcy5jdXN0b21NZW51VGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICAgICAgICB0aGlzLmF0dHJJZCA9IHRoaXMuaWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldEl0ZW1JZHMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuc2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID0gdGhpcy5zZWxlY3RhYmxlSXRlbXMuZmluZEluZGV4KGl0ZW0gPT4geyByZXR1cm4gdGhpcy5oaWdobGlnaHRlZEl0ZW0gPT09IGl0ZW19KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdGVuZXIgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZFxyXG4gICAgICAgIGlmICh0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLCBvcGVuIGEgY2hpbGQgbWVudSBpZiB0aGUgaXRlbSBoYXMgaXRlbXMsIGNhbGxcclxuICAgICAqIHRoZSBpdGVtJ3MgY2xpY2sgbWV0aG9kIGlmIGRlZmluZWQsIG9yIGVtaXQgdGhlIHNlbGVjdGVkIGl0ZW0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGl0ZW0gVGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGV2ZW50OiBFdmVudCwgaXRlbTogTWVudUl0ZW0sIGlzS2V5RXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIC8vSW4gdGhlIGNhc2UgdGhhdCB0aGUgdXNlciBjbGlja3MgYW4gaXRlbSwgc2VsZWN0SXRlbSgpIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGNsaWNrIGhhbmRsZXJcclxuICAgICAgICAvL2FuZCB0aHJvdWdoIG9uUm91dGVyTGlua0FjdGl2YXRlZC4gT25seSBvbmUgb2YgdGhlc2Ugd2lsbCBtYWtlIGl0IHRocm91Z2ggdGhpcyBpZiBzdGF0ZW1lbnRcclxuICAgICAgICAvL2JlY2F1c2UgdGhlIGZpcnN0IG9uZSB3aWxsIHNldCB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW0uXHJcbiAgICAgICAgaWYgKCFpdGVtLmRpc2FibGVkICYmICFpdGVtLnJlYWRvbmx5ICYmIHRoaXMubGFzdFNlbGVjdGVkICE9PSBpdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWl0ZW0udXJsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5vbkNsaWNrKGl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pdGVtcyAmJiBpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJyAmJiBpdGVtLmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVDaGlsZE1lbnUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1hbnVhbGx5IGhhbmRsZSB0aGUgdXJsIG5hdmlnYXRpb24gaWYgdGhlIGtleWJvYXJkIHdhcyB1c2VkXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNLZXlFdmVudCB8fCAoPEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KT8udGFnTmFtZSA9PT0gJ0xJJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udGFyZ2V0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oaXRlbS51cmwsIGl0ZW0udGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3dTZXJ2aWNlLm5hdmlnYXRlVG9VcmwoaXRlbS51cmwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gRW1pdCBzbyB1cHN0cmVhbSBjb21wb25lbnRzIGtub3cgYW4gaXRlbSB3YXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb24oaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYWludGFpblNlbGVjdGVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGl0ZW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlIHRoZSBjdXJyZW50IG1lbnUgYW5kIG9wZW4gdGhlIHBhcmVudCBtZW51XHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYmFjayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5vbkNsaWNrKG51bGwsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lbnVDbG9zZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXQgdGhlIHNlbGVjdGVkIGl0ZW1cclxuICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblNlbGVjdGlvbihpdGVtOiBNZW51SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlZC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPcGVuIG9yIGNsb3NlIHRoZSBjaGlsZCBtZW51LiBXaGVuIHRoZSBjaGlsZCBtZW51IGNsb3NlcywgdGhlIHNlbGVjdGVkXHJcbiAgICAgKiBpdGVtIGlzIHJlc2V0LlxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvZ2dsZUNoaWxkTWVudShvcGVuOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG5hdkVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdicpO1xyXG5cclxuICAgICAgICBpZiAob3Blbikge1xyXG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3RlbmVyIG9uIHRoZSBwYXJlbnQgbWVudSB3aGVuIGEgY2hpbGQgbWVudSBpcyBvcGVuZWRcclxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBhdm9pZCBpbnRlcmZlcmVuY2UgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBtZW51c1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQ6IG51bWJlciA9IG5hdkVsLm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgbGV0IHdpZHRoOiBudW1iZXIgPSBuYXZFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGFuaW1hdGUgdGhlIGNoaWxkIG1lbnUsIHdlIG5lZWQgdG8gc2V0IGhlaWdodCBvbiB0aGUgbmF2IGVsZW1lbnRcclxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIGFic29sdXRlbHkgcG9zaXRpb24gdGhlIHR3byBtZW51cyBhbmQgbWFpbnRhaW4gdGhlIGN1cnJlbnQgbWVudSdzIGhlaWdodFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICd3aWR0aCcsIGAke3dpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4nKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUmUtYWRkIHRoZSBsaXN0ZW5lciBvbmNlIHRoZSBjaGlsZCBtZW51IGNsb3Nlc1xyXG4gICAgICAgICAgICB0aGlzLmFkZEtleWRvd25MaXN0ZW5lcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBuYXYgZWxlbWVudCdzIGhlaWdodCB0byBhdXRvXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnaGVpZ2h0JywgJzEwMCUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9LCBtZW51QW5pbWF0aW9uU3BlZWQpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGtleSBwcmVzc2VzIHRvIG5hdmlnYXRlIHRoZSBtZW51XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlOYXZpZ2F0ZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUtleU5hdiAmJiBldmVudC50YXJnZXQgPT09IHRoaXMuZHJvcGRvd25Ub2dnbGVCdXR0b24/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnVXAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0ZWRVcE9yRG93bihldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdSaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0gaWYgaXQgaGFzIGNoaWxkIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5oaWdobGlnaHRlZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnTGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbWVudSBpZiBpdCBpcyBhIGNoaWxkIG1lbnVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdTcGFjZWJhcic6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCAnZW50ZXInIGZyb20gZG9pbmcgd2hhdGV2ZXIgaXQgZG9lcyBvbiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5oaWdobGlnaHRlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLmhpZ2hsaWdodGVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBoZWFkZXIgaXMgaGlnaGxpZ2h0ZWRcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPT09IC0xKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbWVudSBpZiBpdCdzIGEgY2hpbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Nyb2xsIHRvIHRoZSBpdGVtIGN1cnJlbnRseSBtYXJrZWQgYXMgJ2lzLXNlbGVjdGVkJy4gV2FpdCBhIHRpY2sgZm9yIHRoZVxyXG4gICAgICogTmdDbGFzc0RpcmVjaXR2ZSBvciBOYXZJdGVtQWN0aXZlRGlyZWN0aXZlIHRvIHJlc3BvbmQgdG8gdGhlIG1vZGVsIGNoYW5nZXNcclxuICAgICAqIGFuZCB1cGRhdGUgdGhlIHZpZXcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzY3JvbGxUb1NlbGVjdGVkSXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmtTZWxlY3RvciA9IGBsaS5pcy1zZWxlY3RlZGA7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxUb0l0ZW0oYCMke3RoaXMuaWR9X2xpc3RgLCBsaW5rU2VsZWN0b3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbW92ZUhpZ2hsaWdodGVkVXBPckRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgY2FzZSAnVXAnOlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgtLTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA8IHRoaXMuc2VsZWN0YWJsZUl0ZW1zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBpdGVtIGF0IHRoZSBjdXJyZW50IGhpZ2hsaWdodCBpbmRleFxyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IHRoaXMuc2VsZWN0YWJsZUl0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0hpZ2hsaWdodGVkSXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2Nyb2xsIHRvIHRoZSBzcGVjaWZpZWQgbWVudSBpdGVtLlxyXG4gICAqIElmIG5vIGl0ZW0gaXMgcHJvdmlkZWQsIGl0IHdpbGwgc2Nyb2xsIHRvIHRoZSBmaXJzdCBpdGVtLlxyXG4gICAgICpcclxuICAgKiBAcGFyYW0gaXRlbSBUaGUgbWVudSBpdGVtIHRvIHNjcm9sbCB0by5cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2Nyb2xsTWVudShpdGVtPzogTWVudUl0ZW0gfCBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmlkKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSBpdGVtID8gaXRlbSA6IHRoaXMuaXRlbXNbMF07XHJcbiAgICAgICAgICAgIGxldCBpdGVtSWQgPSBpdGVtLmlkID8gaXRlbS5pZCA6IE1lbnVDb21wb25lbnQuZ2V0SW5kZXhlZEl0ZW1JZCh0aGlzLml0ZW1zLCBpdGVtLCB0aGlzLmlkKTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbEl0ZW1DZW50ZXJlZChgIyR7dGhpcy5pZH1fbGlzdGAsIGAjJHtpdGVtSWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2Nyb2xsVG9IaWdobGlnaHRlZEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxNZW51KHRoaXMuaGlnaGxpZ2h0ZWRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZEtleWRvd25MaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgICAgICAvLyBPbmx5IGF0dGVtcHQgdG8gYWRkIHRoZSBsaXN0ZW5lciBpZiBrZXlib2FyZCBuYXYgaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUtleU5hdikge1xyXG4gICAgICAgICAgICAvLyByZW5kZXJlci5saXN0ZW4gYWRkcyB0aGUgbGlzdGVuZXIgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB0byByZW1vdmUgaXQgZnJvbSB0aGUgcmVuZGVyZXIuXHJcbiAgICAgICAgICAgIC8vIFRoZSBsaXN0ZW5lciByZW1haW5zIGFjdGl2ZSB1bnRpbCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC5cclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5rZXlOYXZpZ2F0ZShldmVudCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIG1lbnUgaXRlbSBpZHMgdXNpbmcgaXRzIGluZGV4IGlmIGl0ZW0gZG9lc24ndCBhbHJlYWR5IGhhdmUgb25lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0SXRlbUlkcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmlkID0gaXRlbS5pZCA/IGl0ZW0uaWQgOiB0aGlzLmlkICsgJ19pdGVtJyArIGluZGV4O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPG5hdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYXJlbnRcIlxyXG4gICAgICAgICBbY2xhc3Mubm8tZGF0YV09XCJzaG93Tm9JdGVtcyAmJiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMClcIj5cclxuICAgICAgICA8aGVhZGVyIGlkPVwie3tpZH19X2hlYWRlclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtaGVhZGluZy0zIHAtMVwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPT09IC0xXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicGFyZW50XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrKCRldmVudClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtOTAgZmxleC1zaHJpbmtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsIHRleHQtdHJ1bmNhdGUgZmxleC1ncm93XCI+e3twYXJlbnQ/LmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvaGVhZGVyPlxyXG5cclxuICAgICAgICA8dWwgaWQ9XCJ7e2lkfX1fbGlzdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicHktMVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFNob3cgY2hpbGQgaXRlbXMgdW5kZXIgcGFyZW50IGl0ZW0gaWYgdGhlIGl0ZW0gaXMgYSBoZWFkaW5nIG9yIGRpdmlkZWQtc2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLml0ZW1zPy5sZW5ndGggJiYgKGl0ZW0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnIHx8IGl0ZW0uZGlzcGxheSA9PT0gJ2RpdmlkZWQtc2VjdGlvbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGRJdGVtIG9mIGl0ZW0uaXRlbXM7IGluZGV4IGFzIGo7IGZpcnN0IGFzIGlzRmlyc3Q7IGxhc3QgYXMgaXNMYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogY2hpbGRJdGVtLCBpbmRleDogaSArICctJyArIGosIGlzRGl2aWRlZFNlY3Rpb25DaGlsZDogaXRlbS5kaXNwbGF5ID09PSAnZGl2aWRlZC1zZWN0aW9uJywgaXNGaXJzdDogaXNGaXJzdCwgaXNMYXN0OiBpc0xhc3R9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgPHAgY2xhc3M9XCJuby1kYXRhLW1lc3NhZ2VcIj57e25vRGF0YVRleHQgfCB0cmFuc2xhdGV9fTwvcD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQ2hpbGQgbWVudSAoUmVuZGVyZWQgdG8gdGhlIHJpZ2h0KSAtLT5cclxuICAgIDxlYy1tZW51ICpuZ0lmPVwic2VsZWN0ZWQ/Lml0ZW1zICYmIHNlbGVjdGVkPy5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgc2VsZWN0ZWQ/LmRpc3BsYXkgIT09ICdkaXZpZGVkLXNlY3Rpb24nXCJcclxuICAgICAgICAgICAgIGlkPVwie3tpZH19X2NoaWxkXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwiY2hpbGRcIlxyXG4gICAgICAgICAgICAgW3BhcmVudF09XCJzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICBbaXRlbXNdPVwic2VsZWN0ZWQ/Lml0ZW1zXCJcclxuICAgICAgICAgICAgIFtzaG93Tm9JdGVtc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFt0ZW1wbGF0ZVR5cGVdPVwidGVtcGxhdGVUeXBlXCJcclxuICAgICAgICAgICAgIFtlbmFibGVLZXlOYXZdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbdHJ1bmNhdGVJdGVtc109XCJ0cnVuY2F0ZUl0ZW1zXCJcclxuICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwib25TZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAobWVudUNsb3NlZCk9XCJ0b2dnbGVDaGlsZE1lbnUoZmFsc2UpXCI+XHJcbiAgICA8L2VjLW1lbnU+XHJcbjwvbmF2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGVcclxuICAgICAgICAgICAgIGxldC1pdGVtXHJcbiAgICAgICAgICAgICBsZXQtaT1cImluZGV4XCJcclxuICAgICAgICAgICAgIGxldC1pc0RpdmlkZWRTZWN0aW9uQ2hpbGQ9XCJpc0RpdmlkZWRTZWN0aW9uQ2hpbGRcIlxyXG4gICAgICAgICAgICAgbGV0LWlzRmlyc3Q9XCJpc0ZpcnN0XCJcclxuICAgICAgICAgICAgIGxldC1pc0xhc3Q9XCJpc0xhc3RcIj5cclxuICAgIDxsaSAqbmdJZj1cIiEoaXRlbS5oaWRlSWZOb0l0ZW1zICYmICFpdGVtLml0ZW1zPy5sZW5ndGgpICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIlxyXG4gICAgICAgIGlkPVwie3tpdGVtLmlkIHx8IGlkICsgJ19pdGVtJyArIGl9fVwiXHJcbiAgICAgICAgY2xhc3M9XCJ7e2l0ZW0uZGlzcGxheSB8fCAnaXRlbSd9fSB7e2l0ZW0uY2xhc3NMaXN0fX1cIlxyXG4gICAgICAgIFtjbGFzcy5kaXZpZGVyLXRvcF09XCJpdGVtLmRpc3BsYXkgPT09ICdkaXZpZGVyLXRvcCcgfHwgKGlzRGl2aWRlZFNlY3Rpb25DaGlsZCAmJiBpc0ZpcnN0KVwiXHJcbiAgICAgICAgW2NsYXNzLmRpdmlkZXJdPVwiaXRlbS5kaXNwbGF5ID09PSAnZGl2aWRlcicgfHwgKGlzRGl2aWRlZFNlY3Rpb25DaGlsZCAmJiBpc0xhc3QpXCJcclxuICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICBbaGlkZGVuXT1cIml0ZW0uaGlkZGVuXCJcclxuICAgICAgICBlY05hdkl0ZW1BY3RpdmU9XCJpcy1zZWxlY3RlZFwiXHJcbiAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZVF1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXNcIlxyXG4gICAgICAgIFtlY05hdkl0ZW1BY3RpdmVVcmxdPVwiaXRlbS51cmxcIlxyXG4gICAgICAgIFtlY05hdkl0ZW1BY3RpdmVFeGFjdE1hdGNoXT0naXRlbS5pc0FjdGl2ZUV4YWN0TWF0Y2gnXHJcbiAgICAgICAgKHJvdXRlckxpbmtBY3RpdmF0ZWQpPVwic2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWhpZ2hsaWdodGVkJzooc2VsZWN0ZWQgPT09IGl0ZW0gJiYgaXRlbT8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKSB8fCBoaWdobGlnaHRlZEl0ZW0gPT09IGl0ZW0sICdpcy1saW5rJzogaXRlbS51cmwsICdpcy1kaXNhYmxlZCc6IGl0ZW0uZGlzYWJsZWQsICdpcy1yZWFkb25seSc6IGl0ZW0ucmVhZG9ubHksICdpcy1jaGVja2VkJzogaXRlbS5jaGVja2VkLCAndGV4dC1oZWFkaW5nLTMnOiBpdGVtPy5kaXNwbGF5ID09PSAnaGVhZGluZyd9XCJcclxuICAgICAgICAoY2xpY2spPVwic2VsZWN0SXRlbSgkZXZlbnQsIGl0ZW0pXCI+XHJcblxyXG4gICAgICAgIDxhICpuZ0lmPVwiaXRlbS51cmwgJiYgIWl0ZW0uZXh0ZXJuYWxMaW5rXCJcclxuICAgICAgICAgICBpZD1cInt7aXRlbS5pZH19X2xpbmtcIlxyXG4gICAgICAgICAgIHRpdGxlPVwie3t0cnVuY2F0ZUl0ZW1zID8gaXRlbS5sYWJlbCA6ICcnfX1cIlxyXG4gICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCJcclxuICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiXHJcbiAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIml0ZW0ucXVlcnlQYXJhbXMgfHwgbnVsbFwiXHJcbiAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgPGEgKm5nSWY9XCJpdGVtLnVybCAmJiBpdGVtLmV4dGVybmFsTGlua1wiXHJcbiAgICAgICAgICAgaWQ9XCJ7e2l0ZW0uaWR9fV9saW5rXCJcclxuICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiXHJcbiAgICAgICAgICAgaHJlZj1cInt7aXRlbS51cmx9fVwiXHJcbiAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbGk+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdsYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNsYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2hlYWRpbmcnICYmIGl0ZW0uZGlzcGxheSAhPT0gJ2RpdmlkZWQtc2VjdGlvbidcIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICdjaGVja0FuZExhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2NoZWNrQW5kTGFiZWxcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWNoZWNrIGVjLWljb24tc21cIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtLmRpc3BsYXkgIT09ICdoZWFkaW5nJ1wiPjwvaT5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fSBtbC0yXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCI+PC9pPlxyXG5cclxuICAgIDxzcGFuIGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXMgJiYgaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgaXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJ1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwhLS0gJ2ljb25BbmRMYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNpY29uQW5kTGFiZWxcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG4gICAgPCEtLSBJZiBtZW51SXRlbS5pY29uIGV4aXN0cyBhbmQgaXMgbm90IGJsYW5rLCBzaG93IHRoZSBpY29uIGluIHRoZSBtZW51IC0tPlxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7aXRlbS5pY29ufX1cIlxyXG4gICAgICAgKm5nSWY9XCIoaXRlbS5pY29uICYmIGl0ZW0uaWNvbiAhPT0gJycpIHx8IHByZXNlcnZlSWNvblNwYWNlXCI+PC9pPlxyXG5cclxuICAgIDxzcGFuIGlkPVwie3tpdGVtLmlkfX1fbGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXMgJiYgaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgaXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJ1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkxhYmVsQ2FwdGlvblxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fVwiXHJcbiAgICAgICAqbmdJZj1cIihpdGVtLmljb24gJiYgaXRlbS5pY29uICE9PSAnJykgfHwgcHJlc2VydmVJY29uU3BhY2VcIj48L2k+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZydcIlxyXG4gICAgICAgICBjbGFzcz1cImxhYmVsIGZsZXgtZ3Jvd1wiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cInRleHQtYm9keS0xXCJcclxuICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0ubGFiZWx9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgaWQ9XCJ7e2l0ZW0uaWR9fV9jYXB0aW9uXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5jYXB0aW9uXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jYXB0aW9uLTFcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5jYXB0aW9ufX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGgzICpuZ0lmPVwiaXRlbS5kaXNwbGF5ID09PSAnaGVhZGluZydcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleC1ncm93IHRleHQtaGVhZGluZy0zIGFsaWduLXNlbGYtY2VudGVyXCJcclxuICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L2gzPlxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIGljb24tYW5nbGUtZG93biByb3RhdGUtMjcwIGFsaWduLXNlbGYtY2VudGVyXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbT8uaXRlbXMgJiYgaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycgJiYgaXRlbS5kaXNwbGF5ICE9PSAnZGl2aWRlZC1zZWN0aW9uJ1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|