@energycap/components 0.37.4-ECAP-18945-record-view-mask.20230829-1745 → 0.37.4

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.
@@ -394,10 +394,10 @@ export class MenuComponent {
394
394
  }
395
395
  }
396
396
  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 class=\"label flex-grow\">\r\n <p id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</p>\r\n <p id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</p>\r\n </div>\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-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{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}ul li.is-disabled .item-wrapper{color:var(--ec-color-secondary-dark);opacity:.65}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" }] });
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-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{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}ul li.is-disabled .item-wrapper{color:var(--ec-color-secondary-dark);opacity:.65}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" }] });
398
398
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, decorators: [{
399
399
  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 class=\"label flex-grow\">\r\n <p id=\"{{item.id}}_label\"\r\n class=\"text-body-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.label}}</p>\r\n <p id=\"{{item.id}}_caption\"\r\n *ngIf=\"item.caption\"\r\n class=\"text-caption-1\"\r\n [class.text-truncate]=\"truncateItems\">{{item.caption}}</p>\r\n </div>\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-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{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}ul li.is-disabled .item-wrapper{color:var(--ec-color-secondary-dark);opacity:.65}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"] }]
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-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{background-color:var(--ec-color-disabled-dark);position:relative;z-index:1;outline:none}ul li.is-disabled .item-wrapper{color:var(--ec-color-secondary-dark);opacity:.65}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"] }]
401
401
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.WindowService }, { type: i2.ScrollService }]; }, propDecorators: { id: [{
402
402
  type: Input
403
403
  }], attrId: [{
@@ -448,4 +448,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
448
448
  type: ViewChild,
449
449
  args: ['iconLabelCaption', { static: true }]
450
450
  }] } });
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUEwQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBMEIvSixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBRXRDOzs7O0dBSUc7QUFNSCxNQUFNLE9BQU8sYUFBYTtJQTRLdEIsWUFDWSxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsYUFBNEI7UUFINUIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqS3hDOzs7O1dBSUc7UUFDYSxVQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUc1Qzs7Ozs7V0FLRztRQUNhLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBVWpEOzs7O1dBSUc7UUFDYSxpQkFBWSxHQUFxQixPQUFPLENBQUM7UUFtQnpEOztXQUVHO1FBQ2EsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0M7O1dBRUc7UUFDYSxlQUFVLEdBQVcsWUFBWSxDQUFDO1FBR2xEOztXQUVHO1FBQ2EsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFHL0M7O1dBRUc7UUFDYSxvQkFBZSxHQUFvQixJQUFJLENBQUM7UUFFeEQ7Ozs7V0FJRztRQUNhLHlCQUFvQixH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QWlCO3NCQUFoQyxLQUFLO2dCQUtVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFPVyxlQUFlO3NCQUEvQixNQUFNO2dCQU9VLFVBQVU7c0JBQTFCLE1BQU07Z0JBbUJ3QyxhQUFhO3NCQUExRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTWdCLG9CQUFvQjtzQkFBeEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1XLHFCQUFxQjtzQkFBMUUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUthLHdCQUF3QjtzQkFBaEYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51VGVtcGxhdGVUeXBlID0gXCJsYWJlbFwiIHwgXCJpY29uQW5kTGFiZWxcIiB8IFwiY2hlY2tBbmRMYWJlbFwiIHwgXCJpY29uTGFiZWxDYXB0aW9uXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51SG9zdEVsZW1lbnRDbGFzc2VzID0gJ2JnLXRyYW5zcGFyZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW08VFZhbHVlPWFueSwgU0l0ZW1zPWFueT4gZXh0ZW5kcyBOYXZJdGVtIHtcclxuICAvLyBMYWJlbCBpcyBvcHRpb25hbCBpbiBOYXZJdGVtIGJ1dCB3YXMgbm90IGluIE1lbnVJdGVtLFxyXG4gIC8vIG92ZXJyaWRpbmcgdG8gYmUgcmVxdWlyZWRcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGNhcHRpb24/OiBzdHJpbmcsXHJcbiAgaXRlbXM/OiBNZW51SXRlbTxTSXRlbXM+W10sXHJcbiAgY2hlY2tlZD86IGJvb2xlYW4sXHJcbiAgZGlzcGxheT86ICdkZWZhdWx0J3wnaGVhZGluZyd8J2RpdmlkZXInLFxyXG4gIHZhbHVlPzpUVmFsdWUsXHJcbiAgY2xhc3NMaXN0PzpzdHJpbmcsXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gIGhpZGRlbj86IGJvb2xlYW4sXHJcbiAgcmVhZG9ubHk/OiBib29sZWFuXHJcbiAgdGFyZ2V0PzogTGlua1RhcmdldCxcclxuICBleHRlcm5hbExpbms/OiBib29sZWFuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbWVudUFuaW1hdGlvblNwZWVkID0gMzUwO1xyXG5cclxuLyoqXHJcbiAqIFByaW1pdGl2ZSBNZW51IGNvbXBvbmVudCB0aGF0IGVuY2Fwc3VsYXRlcyBrbm93biB0ZW1wbGF0ZXNcclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW1lbnUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dCBmb3IgdGhlIG1lbnUncyB0ZW1wbGF0ZSBpZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgYm91bmQgdG8gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBwdWJsaWMgYXR0cklkPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIGl0ZW1zIHRvIGRpc3BsYXlcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqICBTZWxlY3RlZCBpdGVtOyBhbm5vdGF0ZXMgdGhlIGl0ZW1cclxuICAgICAqICB3aGVuIGRpc3BsYXllZCB3aXRoICdzZWxlY3RlZCcgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBhcmVudCBtZW51IGl0ZW0uIElmIGRlZmluZWQsIGEgaGVhZGVyIHdpdGggdGhlIHBhcmVudCdzIGxhYmVsIGFuZCBhXHJcbiAgICAgKiBiYWNrIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhcmVudD86IE1lbnVJdGVtO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXkgdGVtcGxhdGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcblx0LyoqXHJcbiAgICAgKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBtZW51IGl0ZW1zLiBNdXN0IGRlY2xhcmUgYSB0ZW1wbGF0ZVxyXG5cdCAqIGlucHV0IHZhcmlhYmxlIGNhbGxlZCBcIml0ZW1cIiBsaWtlIHNvOiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlTmFtZSBsZXQtaXRlbT4sXHJcblx0ICogd2hlcmUgaXRlbSByZXByZXNlbnRzIHRoZSBtZW51SXRlbS5cclxuICAgICAqIFdpbGwgb3ZlcnJpZGUgdGhlIGNob2ljZSBmb3IgdGVtcGxhdGVUeXBlIGlmIHByb3ZpZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZW51J3MgdGl0bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRpdGxlPzpzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Tm9JdGVtcz86Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBzaG93IHdoZW4gbWVudSBpcyBlbXB0eSBhbmQgc2hvd05vSXRlbXMgaXMgdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbm9EYXRhVGV4dDogc3RyaW5nID0gJ05vSXRlbXNfVEMnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVLZXlOYXY/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXRlbSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlnaGxpZ2h0ZWRJdGVtOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgdGhlIG1lbnUgdG8gbWFpbnRhaW4gdGhlIHNlbGVjdGVkL2xhc3RTZWxlY3RlZCBpdGVtLiBUdXJuaW5nIHRoaXMgb2ZmIGlzIHVzZWZ1bCBmb3JcclxuICAgICAqIGFjdGlvbiB0eXBlIG1lbnVzIHRoYXQgYXJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIGF0IGFsbCB0aW1lcyBhbmQgeW91IGRvIG5vdFxyXG4gICAgICogd2FudCB0aGUgaXRlbSB0byBiZSBzZWxlY3RlZCB3aGVuIGNsaWNrZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYWludGFpblNlbGVjdGVkSXRlbTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxsIHByZXZlbnQgdGV4dC13cmFwcGluZyBvZiBtZW51IGl0ZW1zIGFuZCB0cnVuY2F0ZSBpbnN0ZWFkLiBBbHNvIHR1cm5zIG9uIGEgdG9vbHRpcCBmb3IgdGhlIG1lbnUgaXRlbS4gRGVmYXVsdDogZmFsc2U7XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cnVuY2F0ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRydWUsIHRoZSBzcGFjZSBmb3IgdGhlIGljb24gaXMgcHJlc2VydmVkIGZvciBtZW51IGl0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaWNvbnMuXHJcbiAgICAgKiBPbmx5IGFwcGxpY2FibGUgZm9yIGljb25BbmRMYWJlbCBtZW51cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHByZXNlcnZlSWNvblNwYWNlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRvZ2dsZSBidXR0b24uICBTZXQgd2hlbiBtZW51IGlzIHVzZWQgYXMgcGFydCBvZiBhIERyb3Bkb3duQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25Ub2dnbGVCdXR0b24/OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHRlZCB3aGVuIGBzZWxlY3RlZGAgaXMgY2hhbmdlZC4gRW1pdHMgdGhlIHJlZmVyZW5jZWQgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8TWVudUl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4oKTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIG1lbnUgaGFzIGEgcGFyZW50IGFuZCBiYWNrIGlzIGNsaWNrZWRcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbWVudUNsb3NlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpdGVtIHRlbXBsYXRlIHRoYXQgaXMgbG9hZGVkIGludG8gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcm5hbGl6ZWRUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRleCBvZiB0aGUgaXRlbSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgdXNpbmcga2V5Ym9hcmQgbmF2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW1JbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgIEBWaWV3Q2hpbGQoJ2xhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBsYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBpY29uIGFuZCBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdpY29uQW5kTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25BbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBjaGVjayBhbmQgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tBbmRMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2hlY2tBbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGljb24sIGxhYmVsIGFuZCBjYXB0aW9uIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25MYWJlbENhcHRpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25MYWJlbENhcHRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyB0aGUgZnVuY3Rpb24gdXNlZCB0byByZW1vdmUgdGhlIGV2ZW4gbGlzdGVuZXIgZnJvbSB0aGUgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVLZXlkb3duTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGFzdCBpdGVtIHRoaXMuc2VsZWN0ZWQgd2FzIHNldCB0byB2aWEgc2VsZWN0SXRlbSgpLlxyXG4gICAgICogVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGlzLnNlbGVjdGVkLCBiZWNhdXNlIHRoaXMuc2VsZWN0ZWQgaXMgYW4gaW5wdXQgcHJvcGVydHlcclxuICAgICAqIGFuZCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBieSBhIGNvbnN1bWVyIHRocm91Z2ggc29tZSBtZWFucyBvdGhlciB0aGFuIHNlbGVjdEl0ZW0oKS5cclxuICAgICAqIFRoaXMgYWxsb3dzIHVzIHRvIHByZXZlbnQgZG91YmxlLWNhbGxzIHRvIHNlbGVjdEl0ZW0oKSB3aXRoIHRoZSBzYW1lIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxhc3RTZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG4gICAgKXtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgJiBkaXNwbGF5cyB0aGUgaW50ZXJhbGl6ZWQgdGVtcGxhdGUgYmFzZWQgb25cclxuICAgICAqIHRoZSBzZXQgdGVtcGxhdGUuXHJcbiAgICAgKiBAc2VlIHsgQGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc3xBbmd1bGFyIExpZmVjeWNsZSBIb29rc31cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50ZW1wbGF0ZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAoXCJsYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25BbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkFuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkFuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJjaGVja0FuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuY2hlY2tBbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkxhYmVsQ2FwdGlvblwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25MYWJlbENhcHRpb25UZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlVHlwZSBmb3IgTWVudUNvbXBvbmVudC4gUGxlYXNlIHVzZSBlaXRoZXI6ICdsYWJlbCcsICdpY29uQW5kTGFiZWwnIG9yICdjaGVja0FuZExhYmVsJ2ApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIHRoZSBjb25zdW1lciBwcm92aWRlZCBhIG1lbnVJdGVtVGVtcGxhdGUsIG92ZXJyaWRlIHRoZSBpbnRlcm5hbGl6ZWRUZW1wbGF0ZSB3aXRoIHRoYXQuXHJcbiAgICAgICAgaWYodGhpcy5jdXN0b21NZW51VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuY3VzdG9tTWVudVRlbXBsYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hdHRySWQgPSB0aGlzLmlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtSWRzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbSAmJiB0aGlzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB7IHJldHVybiB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9PT0gaXRlbX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZGRLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXHJcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gYSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQsIG9wZW4gYSBjaGlsZCBtZW51IGlmIHRoZSBpdGVtIGhhcyBpdGVtcywgY2FsbFxyXG4gICAgICogdGhlIGl0ZW0ncyBjbGljayBtZXRob2QgaWYgZGVmaW5lZCwgb3IgZW1pdCB0aGUgc2VsZWN0ZWQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgc2VsZWN0ZWQgaXRlbVxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oZXZlbnQ6IEV2ZW50LCBpdGVtOiBNZW51SXRlbSwgaXNLZXlFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgLy9JbiB0aGUgY2FzZSB0aGF0IHRoZSB1c2VyIGNsaWNrcyBhbiBpdGVtLCBzZWxlY3RJdGVtKCkgd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgY2xpY2sgaGFuZGxlclxyXG4gICAgICAgIC8vYW5kIHRocm91Z2ggb25Sb3V0ZXJMaW5rQWN0aXZhdGVkLiBPbmx5IG9uZSBvZiB0aGVzZSB3aWxsIG1ha2UgaXQgdGhyb3VnaCB0aGlzIGlmIHN0YXRlbWVudFxyXG4gICAgICAgIC8vYmVjYXVzZSB0aGUgZmlyc3Qgb25lIHdpbGwgc2V0IHRoaXMubGFzdFNlbGVjdGVkID0gaXRlbS5cclxuICAgICAgICBpZighaXRlbS5kaXNhYmxlZCAmJiAhaXRlbS5yZWFkb25seSAmJiB0aGlzLmxhc3RTZWxlY3RlZCAhPT0gaXRlbSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLnVybCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ub25DbGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub25DbGljayhpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNoaWxkTWVudSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbihpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBoYW5kbGUgdGhlIHVybCBuYXZpZ2F0aW9uIGlmIHRoZSBrZXlib2FyZCB3YXMgdXNlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzS2V5RXZlbnQgfHwgKDxFbGVtZW50PmV2ZW50LnRhcmdldCk/LnRhZ05hbWUgPT09ICdMSScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0udXJsLCBpdGVtLnRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2luZG93U2VydmljZS5uYXZpZ2F0ZVRvVXJsKGl0ZW0udXJsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIEVtaXQgc28gdXBzdHJlYW0gY29tcG9uZW50cyBrbm93IGFuIGl0ZW0gd2FzIHNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbihpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWFpbnRhaW5TZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZSB0aGUgY3VycmVudCBtZW51IGFuZCBvcGVuIHRoZSBwYXJlbnQgbWVudVxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJhY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQub25DbGljayhudWxsLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZW51Q2xvc2VkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IHRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgc2VsZWN0ZWQgaXRlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TZWxlY3Rpb24oaXRlbTogTWVudUl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZWQuZW1pdChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBvciBjbG9zZSB0aGUgY2hpbGQgbWVudS4gV2hlbiB0aGUgY2hpbGQgbWVudSBjbG9zZXMsIHRoZSBzZWxlY3RlZFxyXG4gICAgICogaXRlbSBpcyByZXNldC5cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVDaGlsZE1lbnUob3Blbjpib29sZWFuKTp2b2lkIHtcclxuICAgICAgICBsZXQgbmF2RWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignbmF2Jyk7XHJcblxyXG4gICAgICAgIGlmIChvcGVuKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdGVuZXIgb24gdGhlIHBhcmVudCBtZW51IHdoZW4gYSBjaGlsZCBtZW51IGlzIG9wZW5lZFxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRvIGF2b2lkIGludGVyZmVyZW5jZSBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG1lbnVzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhlaWdodDpudW1iZXIgPSBuYXZFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCB3aWR0aDpudW1iZXIgPSBuYXZFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGFuaW1hdGUgdGhlIGNoaWxkIG1lbnUsIHdlIG5lZWQgdG8gc2V0IGhlaWdodCBvbiB0aGUgbmF2IGVsZW1lbnRcclxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIGFic29sdXRlbHkgcG9zaXRpb24gdGhlIHR3byBtZW51cyBhbmQgbWFpbnRhaW4gdGhlIGN1cnJlbnQgbWVudSdzIGhlaWdodFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICd3aWR0aCcsIGAke3dpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4nKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUmUtYWRkIHRoZSBsaXN0ZW5lciBvbmNlIHRoZSBjaGlsZCBtZW51IGNsb3Nlc1xyXG4gICAgICAgICAgICB0aGlzLmFkZEtleWRvd25MaXN0ZW5lcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBuYXYgZWxlbWVudCdzIGhlaWdodCB0byBhdXRvXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnaGVpZ2h0JywgJzEwMCUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9LCBtZW51QW5pbWF0aW9uU3BlZWQpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGtleSBwcmVzc2VzIHRvIG5hdmlnYXRlIHRoZSBtZW51XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlOYXZpZ2F0ZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUtleU5hdiAmJiBldmVudC50YXJnZXQgPT09IHRoaXMuZHJvcGRvd25Ub2dnbGVCdXR0b24/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnVXAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0ZWRVcE9yRG93bihldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdSaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0gaWYgaXQgaGFzIGNoaWxkIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5oaWdobGlnaHRlZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnTGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbWVudSBpZiBpdCBpcyBhIGNoaWxkIG1lbnVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdTcGFjZWJhcic6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCAnZW50ZXInIGZyb20gZG9pbmcgd2hhdGV2ZXIgaXQgZG9lcyBvbiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5oaWdobGlnaHRlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLmhpZ2hsaWdodGVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciBpcyBoaWdobGlnaHRlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA9PT0gLTEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZW51IGlmIGl0J3MgYSBjaGlsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY3JvbGwgdG8gdGhlIGl0ZW0gY3VycmVudGx5IG1hcmtlZCBhcyAnaXMtc2VsZWN0ZWQnLiBXYWl0IGEgdGljayBmb3IgdGhlXHJcbiAgICAgKiBOZ0NsYXNzRGlyZWNpdHZlIG9yIE5hdkl0ZW1BY3RpdmVEaXJlY3RpdmUgdG8gcmVzcG9uZCB0byB0aGUgbW9kZWwgY2hhbmdlc1xyXG4gICAgICogYW5kIHVwZGF0ZSB0aGUgdmlldy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGlua1NlbGVjdG9yID0gYGxpLmlzLXNlbGVjdGVkYDtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbShgIyR7dGhpcy5pZH1fbGlzdGAsIGxpbmtTZWxlY3Rvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb3ZlSGlnaGxpZ2h0ZWRVcE9yRG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICBjYXNlICdVcCc6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5pdGVtc1t0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4XS5kaXNwbGF5ID09PSAnaGVhZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSAmJiB0aGlzLml0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgaXRlbSBhdCB0aGUgY3VycmVudCBoaWdobGlnaHQgaW5kZXhcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSB0aGlzLml0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0hpZ2hsaWdodGVkSXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIFNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS5cclxuICAgKiBJZiBubyBpdGVtIGlzIHByb3ZpZGVkLCBpdCB3aWxsIHNjcm9sbCB0byB0aGUgZmlyc3QgaXRlbS5cclxuXHQgKlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdG8gc2Nyb2xsIHRvLlxyXG5cdCAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzY3JvbGxNZW51KGl0ZW0/OiBNZW51SXRlbSB8IG51bGwpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW0gPyBpdGVtIDogdGhpcy5pdGVtc1swXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1JbmRleCA9IHRoaXMuZmluZEl0ZW1JbmRleChpdGVtKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbVNlbGVjdG9yID0gaXRlbS5pZCA/IGAjJHtpdGVtLmlkfWAgOiBgIyR7dGhpcy5pZH1faXRlbSR7aXRlbUluZGV4fWA7XHJcblx0XHRcdFx0dGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbEl0ZW1DZW50ZXJlZChgIyR7dGhpcy5pZH1fbGlzdGAsIGl0ZW1TZWxlY3Rvcik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcm9sbFRvSGlnaGxpZ2h0ZWRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsTWVudSh0aGlzLmhpZ2hsaWdodGVkSXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZFxyXG5cdCAqIEBwYXJhbSBpdGVtVG9GaW5kIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG5cdCAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kSXRlbUluZGV4KGl0ZW1Ub0ZpbmQ/OiBNZW51SXRlbSB8IG51bGwpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChpdGVtVG9GaW5kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmxhYmVsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkS2V5ZG93bkxpc3RlbmVyKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIE9ubHkgYXR0ZW1wdCB0byBhZGQgdGhlIGxpc3RlbmVyIGlmIGtleWJvYXJkIG5hdiBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2KSB7XHJcbiAgICAgICAgICAgIC8vIHJlbmRlcmVyLmxpc3RlbiBhZGRzIHRoZSBsaXN0ZW5lciBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgICAgLy8gVGhlIGxpc3RlbmVyIHJlbWFpbnMgYWN0aXZlIHVudGlsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLlxyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleU5hdmlnYXRlKGV2ZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWVudSBpdGVtIGlkcyB1c2luZyBpdHMgaW5kZXggaWYgaXRlbSBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRJdGVtSWRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaWQgPSBpdGVtLmlkID8gaXRlbS5pZCA6IHRoaXMuaWQgKyAnX2l0ZW0nICsgaW5kZXg7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8bmF2PlxyXG4gICAgPGRpdiBjbGFzcz1cInBhcmVudFwiXHJcbiAgICAgICAgIFtjbGFzcy5uby1kYXRhXT1cInNob3dOb0l0ZW1zICYmICghaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKVwiPlxyXG4gICAgICAgIDxoZWFkZXIgaWQ9XCJ7e2lkfX1faGVhZGVyXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1oZWFkaW5nLTMgcC0xXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJoaWdobGlnaHRlZEl0ZW1JbmRleCA9PT0gLTFcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS05MCBmbGV4LXNocmlua1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgdGV4dC10cnVuY2F0ZSBmbGV4LWdyb3dcIj57e3BhcmVudD8ubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9oZWFkZXI+XHJcblxyXG4gICAgICAgIDx1bCBpZD1cInt7aWR9fV9saXN0XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJweS0xXCI+XHJcbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgaW5kZXggYXMgaVwiXHJcbiAgICAgICAgICAgICAgICBpZD1cInt7aXRlbS5pZCB8fCBpZCArICdfaXRlbScgKyBpfX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2l0ZW0uZGlzcGxheSB8fCAnaXRlbSd9fSB7e2l0ZW0uY2xhc3NMaXN0fX1cIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIml0ZW0uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgIGVjTmF2SXRlbUFjdGl2ZT1cImlzLXNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgIFtlY05hdkl0ZW1BY3RpdmVRdWVyeVBhcmFtc109XCJpdGVtLnF1ZXJ5UGFyYW1zXCJcclxuICAgICAgICAgICAgICAgIFtlY05hdkl0ZW1BY3RpdmVVcmxdPVwiaXRlbS51cmxcIlxyXG4gICAgICAgICAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZUV4YWN0TWF0Y2hdPSdpdGVtLmlzQWN0aXZlRXhhY3RNYXRjaCdcclxuICAgICAgICAgICAgICAgIChyb3V0ZXJMaW5rQWN0aXZhdGVkKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWhpZ2hsaWdodGVkJzooc2VsZWN0ZWQgPT09IGl0ZW0gJiYgaXRlbT8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKSB8fCBoaWdobGlnaHRlZEl0ZW0gPT09IGl0ZW0sICdpcy1saW5rJzogaXRlbS51cmwsICdpcy1kaXNhYmxlZCc6IGl0ZW0uZGlzYWJsZWQsICdpcy1yZWFkb25seSc6IGl0ZW0ucmVhZG9ubHksICdpcy1jaGVja2VkJzogaXRlbS5jaGVja2VkLCAndGV4dC1oZWFkaW5nLTMnOiBpdGVtPy5kaXNwbGF5ID09PSAnaGVhZGluZyd9XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJdGVtKCRldmVudCwgaXRlbSlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIml0ZW0udXJsICYmICFpdGVtLmV4dGVybmFsTGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICBpZD1cInt7aXRlbS5pZH19X2xpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7e3RydW5jYXRlSXRlbXMgPyBpdGVtLmxhYmVsIDogJyd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiXHJcbiAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiaXRlbS5xdWVyeVBhcmFtcyB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgIHRhcmdldD1cInt7aXRlbS50YXJnZXQgfHwgJ19zZWxmJ319XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIml0ZW0udXJsICYmIGl0ZW0uZXh0ZXJuYWxMaW5rXCJcclxuICAgICAgICAgICAgICAgICAgIGlkPVwie3tpdGVtLmlkfX1fbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCJcclxuICAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7e2l0ZW0udXJsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbS51cmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG5cclxuICAgICAgICA8cCBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPnt7bm9EYXRhVGV4dCB8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBDaGlsZCBtZW51IChSZW5kZXJlZCB0byB0aGUgcmlnaHQpIC0tPlxyXG4gICAgPGVjLW1lbnUgKm5nSWY9XCJzZWxlY3RlZD8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fY2hpbGRcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJjaGlsZFwiXHJcbiAgICAgICAgICAgICBbcGFyZW50XT1cInNlbGVjdGVkXCJcclxuICAgICAgICAgICAgIFtpdGVtc109XCJzZWxlY3RlZD8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgW3Nob3dOb0l0ZW1zXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgW3RlbXBsYXRlVHlwZV09XCJ0ZW1wbGF0ZVR5cGVcIlxyXG4gICAgICAgICAgICAgW2VuYWJsZUtleU5hdl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFt0cnVuY2F0ZUl0ZW1zXT1cInRydW5jYXRlSXRlbXNcIlxyXG4gICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvblNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChtZW51Q2xvc2VkKT1cInRvZ2dsZUNoaWxkTWVudShmYWxzZSlcIj5cclxuICAgIDwvZWMtbWVudT5cclxuPC9uYXY+XHJcblxyXG48IS0tICdsYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNsYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSAnY2hlY2tBbmRMYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNjaGVja0FuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1jaGVjayBlYy1pY29uLXNtXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZydcIj48L2k+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7aXRlbS5pY29ufX0gbWwtMlwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSAnaWNvbkFuZExhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2ljb25BbmRMYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8IS0tIElmIG1lbnVJdGVtLmljb24gZXhpc3RzIGFuZCBpcyBub3QgYmxhbmssIHNob3cgdGhlIGljb24gaW4gdGhlIG1lbnUgLS0+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fVwiXHJcbiAgICAgICAqbmdJZj1cIihpdGVtLmljb24gJiYgaXRlbS5pY29uICE9PSAnJykgfHwgcHJlc2VydmVJY29uU3BhY2VcIj48L2k+XHJcblxyXG4gICAgPHNwYW4gaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS0yNzBcIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtPy5pdGVtc1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkxhYmVsQ2FwdGlvblxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fVwiXHJcbiAgICAgICAqbmdJZj1cIihpdGVtLmljb24gJiYgaXRlbS5pY29uICE9PSAnJykgfHwgcHJlc2VydmVJY29uU3BhY2VcIj48L2k+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGFiZWwgZmxleC1ncm93XCI+XHJcbiAgICAgICAgPHAgaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktMVwiXHJcbiAgICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9wPlxyXG4gICAgICAgIDxwIGlkPVwie3tpdGVtLmlkfX1fY2FwdGlvblwiXHJcbiAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNhcHRpb25cIlxyXG4gICAgICAgICAgIGNsYXNzPVwidGV4dC1jYXB0aW9uLTFcIlxyXG4gICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0uY2FwdGlvbn19PC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS0yNzAgYWxpZ24tc2VsZi1jZW50ZXJcIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtPy5pdGVtc1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvY29udHJvbHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUEwQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBMEIvSixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0FBRXRDOzs7O0dBSUc7QUFNSCxNQUFNLE9BQU8sYUFBYTtJQTRLdEIsWUFDWSxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsYUFBNEI7UUFINUIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqS3hDOzs7O1dBSUc7UUFDYSxVQUFLLEdBQW9CLEVBQUUsQ0FBQztRQUc1Qzs7Ozs7V0FLRztRQUNhLGFBQVEsR0FBb0IsSUFBSSxDQUFDO1FBVWpEOzs7O1dBSUc7UUFDYSxpQkFBWSxHQUFxQixPQUFPLENBQUM7UUFtQnpEOztXQUVHO1FBQ2EsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0M7O1dBRUc7UUFDYSxlQUFVLEdBQVcsWUFBWSxDQUFDO1FBR2xEOztXQUVHO1FBQ2EsaUJBQVksR0FBYSxLQUFLLENBQUM7UUFHL0M7O1dBRUc7UUFDYSxvQkFBZSxHQUFvQixJQUFJLENBQUM7UUFFeEQ7Ozs7V0FJRztRQUNhLHlCQUFvQixH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QWlCO3NCQUFoQyxLQUFLO2dCQUtVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFPVyxlQUFlO3NCQUEvQixNQUFNO2dCQU9VLFVBQVU7c0JBQTFCLE1BQU07Z0JBbUJ3QyxhQUFhO3NCQUExRCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTWdCLG9CQUFvQjtzQkFBeEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1XLHFCQUFxQjtzQkFBMUUsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUthLHdCQUF3QjtzQkFBaEYsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdpbmRvd1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlua1RhcmdldCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFncy90YWcnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51VGVtcGxhdGVUeXBlID0gXCJsYWJlbFwiIHwgXCJpY29uQW5kTGFiZWxcIiB8IFwiY2hlY2tBbmRMYWJlbFwiIHwgXCJpY29uTGFiZWxDYXB0aW9uXCI7XHJcblxyXG5leHBvcnQgdHlwZSBNZW51SG9zdEVsZW1lbnRDbGFzc2VzID0gJ2JnLXRyYW5zcGFyZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVudUl0ZW08VFZhbHVlPWFueSwgU0l0ZW1zPWFueT4gZXh0ZW5kcyBOYXZJdGVtIHtcclxuICAvLyBMYWJlbCBpcyBvcHRpb25hbCBpbiBOYXZJdGVtIGJ1dCB3YXMgbm90IGluIE1lbnVJdGVtLFxyXG4gIC8vIG92ZXJyaWRpbmcgdG8gYmUgcmVxdWlyZWRcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGNhcHRpb24/OiBzdHJpbmcsXHJcbiAgaXRlbXM/OiBNZW51SXRlbTxTSXRlbXM+W10sXHJcbiAgY2hlY2tlZD86IGJvb2xlYW4sXHJcbiAgZGlzcGxheT86ICdkZWZhdWx0J3wnaGVhZGluZyd8J2RpdmlkZXInLFxyXG4gIHZhbHVlPzpUVmFsdWUsXHJcbiAgY2xhc3NMaXN0PzpzdHJpbmcsXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuLFxyXG4gIGhpZGRlbj86IGJvb2xlYW4sXHJcbiAgcmVhZG9ubHk/OiBib29sZWFuXHJcbiAgdGFyZ2V0PzogTGlua1RhcmdldCxcclxuICBleHRlcm5hbExpbms/OiBib29sZWFuXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgbWVudUFuaW1hdGlvblNwZWVkID0gMzUwO1xyXG5cclxuLyoqXHJcbiAqIFByaW1pdGl2ZSBNZW51IGNvbXBvbmVudCB0aGF0IGVuY2Fwc3VsYXRlcyBrbm93biB0ZW1wbGF0ZXNcclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLW1lbnUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnB1dCBmb3IgdGhlIG1lbnUncyB0ZW1wbGF0ZSBpZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgYm91bmQgdG8gdGhlIGhvc3QgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKSBwdWJsaWMgYXR0cklkPzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmF5IG9mIGl0ZW1zIHRvIGRpc3BsYXlcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbXM6IEFycmF5PE1lbnVJdGVtPiA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqICBTZWxlY3RlZCBpdGVtOyBhbm5vdGF0ZXMgdGhlIGl0ZW1cclxuICAgICAqICB3aGVuIGRpc3BsYXllZCB3aXRoICdzZWxlY3RlZCcgY2xhc3NcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBhcmVudCBtZW51IGl0ZW0uIElmIGRlZmluZWQsIGEgaGVhZGVyIHdpdGggdGhlIHBhcmVudCdzIGxhYmVsIGFuZCBhXHJcbiAgICAgKiBiYWNrIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhcmVudD86IE1lbnVJdGVtO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3BsYXkgdGVtcGxhdGVcclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdGVtcGxhdGVUeXBlOiBNZW51VGVtcGxhdGVUeXBlID0gJ2xhYmVsJztcclxuXHJcblx0LyoqXHJcbiAgICAgKiBPcHRpb25hbCBjdXN0b20gdGVtcGxhdGUgZm9yIHRoZSBtZW51IGl0ZW1zLiBNdXN0IGRlY2xhcmUgYSB0ZW1wbGF0ZVxyXG5cdCAqIGlucHV0IHZhcmlhYmxlIGNhbGxlZCBcIml0ZW1cIiBsaWtlIHNvOiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlTmFtZSBsZXQtaXRlbT4sXHJcblx0ICogd2hlcmUgaXRlbSByZXByZXNlbnRzIHRoZSBtZW51SXRlbS5cclxuICAgICAqIFdpbGwgb3ZlcnJpZGUgdGhlIGNob2ljZSBmb3IgdGVtcGxhdGVUeXBlIGlmIHByb3ZpZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21NZW51VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZW51J3MgdGl0bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHRpdGxlPzpzdHJpbmc7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIGl0ZW1zXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Tm9JdGVtcz86Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGV4dCB0byBzaG93IHdoZW4gbWVudSBpcyBlbXB0eSBhbmQgc2hvd05vSXRlbXMgaXMgdHJ1ZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbm9EYXRhVGV4dDogc3RyaW5nID0gJ05vSXRlbXNfVEMnO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBlbmFibGVkXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVLZXlOYXY/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXRlbSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvblxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlnaGxpZ2h0ZWRJdGVtOiBNZW51SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVsbHMgdGhlIG1lbnUgdG8gbWFpbnRhaW4gdGhlIHNlbGVjdGVkL2xhc3RTZWxlY3RlZCBpdGVtLiBUdXJuaW5nIHRoaXMgb2ZmIGlzIHVzZWZ1bCBmb3JcclxuICAgICAqIGFjdGlvbiB0eXBlIG1lbnVzIHRoYXQgYXJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuIGF0IGFsbCB0aW1lcyBhbmQgeW91IGRvIG5vdFxyXG4gICAgICogd2FudCB0aGUgaXRlbSB0byBiZSBzZWxlY3RlZCB3aGVuIGNsaWNrZWQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYWludGFpblNlbGVjdGVkSXRlbTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxsIHByZXZlbnQgdGV4dC13cmFwcGluZyBvZiBtZW51IGl0ZW1zIGFuZCB0cnVuY2F0ZSBpbnN0ZWFkLiBBbHNvIHR1cm5zIG9uIGEgdG9vbHRpcCBmb3IgdGhlIG1lbnUgaXRlbS4gRGVmYXVsdDogZmFsc2U7XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cnVuY2F0ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIHRydWUsIHRoZSBzcGFjZSBmb3IgdGhlIGljb24gaXMgcHJlc2VydmVkIGZvciBtZW51IGl0ZW1zIHRoYXQgZG8gbm90IGhhdmUgaWNvbnMuXHJcbiAgICAgKiBPbmx5IGFwcGxpY2FibGUgZm9yIGljb25BbmRMYWJlbCBtZW51cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHByZXNlcnZlSWNvblNwYWNlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRvZ2dsZSBidXR0b24uICBTZXQgd2hlbiBtZW51IGlzIHVzZWQgYXMgcGFydCBvZiBhIERyb3Bkb3duQ29tcG9uZW50LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZHJvcGRvd25Ub2dnbGVCdXR0b24/OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHRlZCB3aGVuIGBzZWxlY3RlZGAgaXMgY2hhbmdlZC4gRW1pdHMgdGhlIHJlZmVyZW5jZWQgb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8TWVudUl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxNZW51SXRlbT4oKTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIG1lbnUgaGFzIGEgcGFyZW50IGFuZCBiYWNrIGlzIGNsaWNrZWRcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbWVudUNsb3NlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBpdGVtIHRlbXBsYXRlIHRoYXQgaXMgbG9hZGVkIGludG8gdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbnRlcm5hbGl6ZWRUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRleCBvZiB0aGUgaXRlbSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgdXNpbmcga2V5Ym9hcmQgbmF2XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoaWdobGlnaHRlZEl0ZW1JbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1lbnUgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgIEBWaWV3Q2hpbGQoJ2xhYmVsJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBsYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBpY29uIGFuZCBsYWJlbCB0ZW1wbGF0ZVxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdpY29uQW5kTGFiZWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25BbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbWVudSBjaGVjayBhbmQgbGFiZWwgdGVtcGxhdGVcclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnY2hlY2tBbmRMYWJlbCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2hlY2tBbmRMYWJlbFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtZW51IGljb24sIGxhYmVsIGFuZCBjYXB0aW9uIHRlbXBsYXRlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2ljb25MYWJlbENhcHRpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGljb25MYWJlbENhcHRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyB0aGUgZnVuY3Rpb24gdXNlZCB0byByZW1vdmUgdGhlIGV2ZW4gbGlzdGVuZXIgZnJvbSB0aGUgcmVuZGVyZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVLZXlkb3duTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTGFzdCBpdGVtIHRoaXMuc2VsZWN0ZWQgd2FzIHNldCB0byB2aWEgc2VsZWN0SXRlbSgpLlxyXG4gICAgICogVGhpcyBpc24ndCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGlzLnNlbGVjdGVkLCBiZWNhdXNlIHRoaXMuc2VsZWN0ZWQgaXMgYW4gaW5wdXQgcHJvcGVydHlcclxuICAgICAqIGFuZCBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCBieSBhIGNvbnN1bWVyIHRocm91Z2ggc29tZSBtZWFucyBvdGhlciB0aGFuIHNlbGVjdEl0ZW0oKS5cclxuICAgICAqIFRoaXMgYWxsb3dzIHVzIHRvIHByZXZlbnQgZG91YmxlLWNhbGxzIHRvIHNlbGVjdEl0ZW0oKSB3aXRoIHRoZSBzYW1lIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxhc3RTZWxlY3RlZDogTWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICAgICAgcHJpdmF0ZSB3aW5kb3dTZXJ2aWNlOiBXaW5kb3dTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxyXG4gICAgKXtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgJiBkaXNwbGF5cyB0aGUgaW50ZXJhbGl6ZWQgdGVtcGxhdGUgYmFzZWQgb25cclxuICAgICAqIHRoZSBzZXQgdGVtcGxhdGUuXHJcbiAgICAgKiBAc2VlIHsgQGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc3xBbmd1bGFyIExpZmVjeWNsZSBIb29rc31cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgTWVudUNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy50ZW1wbGF0ZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAoXCJsYWJlbFwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25BbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkFuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuaWNvbkFuZExhYmVsVGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAoXCJjaGVja0FuZExhYmVsXCIpOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuY2hlY2tBbmRMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgKFwiaWNvbkxhYmVsQ2FwdGlvblwiKTpcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxpemVkVGVtcGxhdGUgPSB0aGlzLmljb25MYWJlbENhcHRpb25UZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlVHlwZSBmb3IgTWVudUNvbXBvbmVudC4gUGxlYXNlIHVzZSBlaXRoZXI6ICdsYWJlbCcsICdpY29uQW5kTGFiZWwnIG9yICdjaGVja0FuZExhYmVsJ2ApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIHRoZSBjb25zdW1lciBwcm92aWRlZCBhIG1lbnVJdGVtVGVtcGxhdGUsIG92ZXJyaWRlIHRoZSBpbnRlcm5hbGl6ZWRUZW1wbGF0ZSB3aXRoIHRoYXQuXHJcbiAgICAgICAgaWYodGhpcy5jdXN0b21NZW51VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRUZW1wbGF0ZSA9IHRoaXMuY3VzdG9tTWVudVRlbXBsYXRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hdHRySWQgPSB0aGlzLmlkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtSWRzKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbSAmJiB0aGlzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoaXRlbSA9PiB7IHJldHVybiB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9PT0gaXRlbX0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZGRLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXHJcbiAgICAgICAgaWYgKHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlS2V5ZG93bkxpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gYSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQsIG9wZW4gYSBjaGlsZCBtZW51IGlmIHRoZSBpdGVtIGhhcyBpdGVtcywgY2FsbFxyXG4gICAgICogdGhlIGl0ZW0ncyBjbGljayBtZXRob2QgaWYgZGVmaW5lZCwgb3IgZW1pdCB0aGUgc2VsZWN0ZWQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgc2VsZWN0ZWQgaXRlbVxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oZXZlbnQ6IEV2ZW50LCBpdGVtOiBNZW51SXRlbSwgaXNLZXlFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgLy9JbiB0aGUgY2FzZSB0aGF0IHRoZSB1c2VyIGNsaWNrcyBhbiBpdGVtLCBzZWxlY3RJdGVtKCkgd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgY2xpY2sgaGFuZGxlclxyXG4gICAgICAgIC8vYW5kIHRocm91Z2ggb25Sb3V0ZXJMaW5rQWN0aXZhdGVkLiBPbmx5IG9uZSBvZiB0aGVzZSB3aWxsIG1ha2UgaXQgdGhyb3VnaCB0aGlzIGlmIHN0YXRlbWVudFxyXG4gICAgICAgIC8vYmVjYXVzZSB0aGUgZmlyc3Qgb25lIHdpbGwgc2V0IHRoaXMubGFzdFNlbGVjdGVkID0gaXRlbS5cclxuICAgICAgICBpZighaXRlbS5kaXNhYmxlZCAmJiAhaXRlbS5yZWFkb25seSAmJiB0aGlzLmxhc3RTZWxlY3RlZCAhPT0gaXRlbSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCFpdGVtLnVybCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ub25DbGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub25DbGljayhpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNoaWxkTWVudSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbihpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBoYW5kbGUgdGhlIHVybCBuYXZpZ2F0aW9uIGlmIHRoZSBrZXlib2FyZCB3YXMgdXNlZFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzS2V5RXZlbnQgfHwgKDxFbGVtZW50PmV2ZW50LnRhcmdldCk/LnRhZ05hbWUgPT09ICdMSScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnRhcmdldCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGl0ZW0udXJsLCBpdGVtLnRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2luZG93U2VydmljZS5uYXZpZ2F0ZVRvVXJsKGl0ZW0udXJsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIEVtaXQgc28gdXBzdHJlYW0gY29tcG9uZW50cyBrbm93IGFuIGl0ZW0gd2FzIHNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uKGl0ZW0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbihpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWFpbnRhaW5TZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBpdGVtO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZSB0aGUgY3VycmVudCBtZW51IGFuZCBvcGVuIHRoZSBwYXJlbnQgbWVudVxyXG4gICAgICogQG1lbWJlcm9mIE1lbnVDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGJhY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50Lm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQub25DbGljayhudWxsLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZW51Q2xvc2VkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IHRoZSBzZWxlY3RlZCBpdGVtXHJcbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgc2VsZWN0ZWQgaXRlbVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TZWxlY3Rpb24oaXRlbTogTWVudUl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZycpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZWQuZW1pdChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3BlbiBvciBjbG9zZSB0aGUgY2hpbGQgbWVudS4gV2hlbiB0aGUgY2hpbGQgbWVudSBjbG9zZXMsIHRoZSBzZWxlY3RlZFxyXG4gICAgICogaXRlbSBpcyByZXNldC5cclxuICAgICAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVDaGlsZE1lbnUob3Blbjpib29sZWFuKTp2b2lkIHtcclxuICAgICAgICBsZXQgbmF2RWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignbmF2Jyk7XHJcblxyXG4gICAgICAgIGlmIChvcGVuKSB7XHJcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdGVuZXIgb24gdGhlIHBhcmVudCBtZW51IHdoZW4gYSBjaGlsZCBtZW51IGlzIG9wZW5lZFxyXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRvIGF2b2lkIGludGVyZmVyZW5jZSBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG1lbnVzXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXlkb3duTGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGhlaWdodDpudW1iZXIgPSBuYXZFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCB3aWR0aDpudW1iZXIgPSBuYXZFbC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGFuaW1hdGUgdGhlIGNoaWxkIG1lbnUsIHdlIG5lZWQgdG8gc2V0IGhlaWdodCBvbiB0aGUgbmF2IGVsZW1lbnRcclxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIGFic29sdXRlbHkgcG9zaXRpb24gdGhlIHR3byBtZW51cyBhbmQgbWFpbnRhaW4gdGhlIGN1cnJlbnQgbWVudSdzIGhlaWdodFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF2RWwsICd3aWR0aCcsIGAke3dpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4nKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ29wZW4tYWN0aXZlJyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gUmUtYWRkIHRoZSBsaXN0ZW5lciBvbmNlIHRoZSBjaGlsZCBtZW51IGNsb3Nlc1xyXG4gICAgICAgICAgICB0aGlzLmFkZEtleWRvd25MaXN0ZW5lcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdvcGVuLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnb3BlbicpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBuYXYgZWxlbWVudCdzIGhlaWdodCB0byBhdXRvXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdkVsLCAnaGVpZ2h0JywgJzEwMCUnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9LCBtZW51QW5pbWF0aW9uU3BlZWQpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGtleSBwcmVzc2VzIHRvIG5hdmlnYXRlIHRoZSBtZW51XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBrZXlOYXZpZ2F0ZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUtleU5hdiAmJiBldmVudC50YXJnZXQgPT09IHRoaXMuZHJvcGRvd25Ub2dnbGVCdXR0b24/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnVXAnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0ZWRVcE9yRG93bihldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdSaWdodCc6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGl0ZW0gaWYgaXQgaGFzIGNoaWxkIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtICYmIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgdGhpcy5oaWdobGlnaHRlZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnTGVmdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgbWVudSBpZiBpdCBpcyBhIGNoaWxkIG1lbnVcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdTcGFjZWJhcic6XHJcbiAgICAgICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCAnZW50ZXInIGZyb20gZG9pbmcgd2hhdGV2ZXIgaXQgZG9lcyBvbiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5oaWdobGlnaHRlZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLmhpZ2hsaWdodGVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciBpcyBoaWdobGlnaHRlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA9PT0gLTEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZW51IGlmIGl0J3MgYSBjaGlsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY3JvbGwgdG8gdGhlIGl0ZW0gY3VycmVudGx5IG1hcmtlZCBhcyAnaXMtc2VsZWN0ZWQnLiBXYWl0IGEgdGljayBmb3IgdGhlXHJcbiAgICAgKiBOZ0NsYXNzRGlyZWNpdHZlIG9yIE5hdkl0ZW1BY3RpdmVEaXJlY3RpdmUgdG8gcmVzcG9uZCB0byB0aGUgbW9kZWwgY2hhbmdlc1xyXG4gICAgICogYW5kIHVwZGF0ZSB0aGUgdmlldy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGlua1NlbGVjdG9yID0gYGxpLmlzLXNlbGVjdGVkYDtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbShgIyR7dGhpcy5pZH1fbGlzdGAsIGxpbmtTZWxlY3Rvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtb3ZlSGlnaGxpZ2h0ZWRVcE9yRG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICBjYXNlICdVcCc6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYW55IGluLW1lbnUgaGVhZGluZyBpdGVtc1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5pdGVtc1t0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4XS5kaXNwbGF5ID09PSAnaGVhZGluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICAgICAgY2FzZSAnRG93bic6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSAmJiB0aGlzLml0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAvLyBTdG9yZSB0aGUgaXRlbSBhdCB0aGUgY3VycmVudCBoaWdobGlnaHQgaW5kZXhcclxuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW0gPSB0aGlzLml0ZW1zW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0hpZ2hsaWdodGVkSXRlbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG5cdCAqIFNjcm9sbCB0byB0aGUgc3BlY2lmaWVkIG1lbnUgaXRlbS5cclxuICAgKiBJZiBubyBpdGVtIGlzIHByb3ZpZGVkLCBpdCB3aWxsIHNjcm9sbCB0byB0aGUgZmlyc3QgaXRlbS5cclxuXHQgKlxyXG4gICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdG8gc2Nyb2xsIHRvLlxyXG5cdCAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzY3JvbGxNZW51KGl0ZW0/OiBNZW51SXRlbSB8IG51bGwpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaXRlbSA9IGl0ZW0gPyBpdGVtIDogdGhpcy5pdGVtc1swXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1JbmRleCA9IHRoaXMuZmluZEl0ZW1JbmRleChpdGVtKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbVNlbGVjdG9yID0gaXRlbS5pZCA/IGAjJHtpdGVtLmlkfWAgOiBgIyR7dGhpcy5pZH1faXRlbSR7aXRlbUluZGV4fWA7XHJcblx0XHRcdFx0dGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbEl0ZW1DZW50ZXJlZChgIyR7dGhpcy5pZH1fbGlzdGAsIGl0ZW1TZWxlY3Rvcik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcm9sbFRvSGlnaGxpZ2h0ZWRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsTWVudSh0aGlzLmhpZ2hsaWdodGVkSXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogRmluZCBhIGdpdmVuIGl0ZW0ncyBpbmRleCBpbiB0aGUgZmlsdGVyZWQgaXRlbXMgYXJyYXkuXHJcblx0ICpcclxuXHQgKiBSZXR1cm5zIC0xIGlmIG5vdCBmb3VuZFxyXG5cdCAqIEBwYXJhbSBpdGVtVG9GaW5kIFRoZSBtYXRjaGluZyBpdGVtIHRvIGZpbmQgaW4gdGhlIGl0ZW1zIGFycmF5LlxyXG5cdCAqIEBtZW1iZXJvZiBNZW51Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kSXRlbUluZGV4KGl0ZW1Ub0ZpbmQ/OiBNZW51SXRlbSB8IG51bGwpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChpdGVtVG9GaW5kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbmRJbmRleChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmxhYmVsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkS2V5ZG93bkxpc3RlbmVyKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIE9ubHkgYXR0ZW1wdCB0byBhZGQgdGhlIGxpc3RlbmVyIGlmIGtleWJvYXJkIG5hdiBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlS2V5TmF2KSB7XHJcbiAgICAgICAgICAgIC8vIHJlbmRlcmVyLmxpc3RlbiBhZGRzIHRoZSBsaXN0ZW5lciBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSByZW5kZXJlci5cclxuICAgICAgICAgICAgLy8gVGhlIGxpc3RlbmVyIHJlbWFpbnMgYWN0aXZlIHVudGlsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLlxyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUtleWRvd25MaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmtleU5hdmlnYXRlKGV2ZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgbWVudSBpdGVtIGlkcyB1c2luZyBpdHMgaW5kZXggaWYgaXRlbSBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRJdGVtSWRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uaWQgPSBpdGVtLmlkID8gaXRlbS5pZCA6IHRoaXMuaWQgKyAnX2l0ZW0nICsgaW5kZXg7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8bmF2PlxyXG4gICAgPGRpdiBjbGFzcz1cInBhcmVudFwiXHJcbiAgICAgICAgIFtjbGFzcy5uby1kYXRhXT1cInNob3dOb0l0ZW1zICYmICghaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKVwiPlxyXG4gICAgICAgIDxoZWFkZXIgaWQ9XCJ7e2lkfX1faGVhZGVyXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1oZWFkaW5nLTMgcC0xXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJoaWdobGlnaHRlZEl0ZW1JbmRleCA9PT0gLTFcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS05MCBmbGV4LXNocmlua1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwgdGV4dC10cnVuY2F0ZSBmbGV4LWdyb3dcIj57e3BhcmVudD8ubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9oZWFkZXI+XHJcblxyXG4gICAgICAgIDx1bCBpZD1cInt7aWR9fV9saXN0XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJweS0xXCI+XHJcbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgaW5kZXggYXMgaVwiXHJcbiAgICAgICAgICAgICAgICBpZD1cInt7aXRlbS5pZCB8fCBpZCArICdfaXRlbScgKyBpfX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2l0ZW0uZGlzcGxheSB8fCAnaXRlbSd9fSB7e2l0ZW0uY2xhc3NMaXN0fX1cIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXRlbS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIml0ZW0uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgIGVjTmF2SXRlbUFjdGl2ZT1cImlzLXNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgIFtlY05hdkl0ZW1BY3RpdmVRdWVyeVBhcmFtc109XCJpdGVtLnF1ZXJ5UGFyYW1zXCJcclxuICAgICAgICAgICAgICAgIFtlY05hdkl0ZW1BY3RpdmVVcmxdPVwiaXRlbS51cmxcIlxyXG4gICAgICAgICAgICAgICAgW2VjTmF2SXRlbUFjdGl2ZUV4YWN0TWF0Y2hdPSdpdGVtLmlzQWN0aXZlRXhhY3RNYXRjaCdcclxuICAgICAgICAgICAgICAgIChyb3V0ZXJMaW5rQWN0aXZhdGVkKT1cInNlbGVjdEl0ZW0oJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWhpZ2hsaWdodGVkJzooc2VsZWN0ZWQgPT09IGl0ZW0gJiYgaXRlbT8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKSB8fCBoaWdobGlnaHRlZEl0ZW0gPT09IGl0ZW0sICdpcy1saW5rJzogaXRlbS51cmwsICdpcy1kaXNhYmxlZCc6IGl0ZW0uZGlzYWJsZWQsICdpcy1yZWFkb25seSc6IGl0ZW0ucmVhZG9ubHksICdpcy1jaGVja2VkJzogaXRlbS5jaGVja2VkLCAndGV4dC1oZWFkaW5nLTMnOiBpdGVtPy5kaXNwbGF5ID09PSAnaGVhZGluZyd9XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJdGVtKCRldmVudCwgaXRlbSlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIml0ZW0udXJsICYmICFpdGVtLmV4dGVybmFsTGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICBpZD1cInt7aXRlbS5pZH19X2xpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7e3RydW5jYXRlSXRlbXMgPyBpdGVtLmxhYmVsIDogJyd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0td3JhcHBlclwiXHJcbiAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiXHJcbiAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiaXRlbS5xdWVyeVBhcmFtcyB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgIHRhcmdldD1cInt7aXRlbS50YXJnZXQgfHwgJ19zZWxmJ319XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRUZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgICAgICA8YSAqbmdJZj1cIml0ZW0udXJsICYmIGl0ZW0uZXh0ZXJuYWxMaW5rXCJcclxuICAgICAgICAgICAgICAgICAgIGlkPVwie3tpdGVtLmlkfX1fbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS13cmFwcGVyXCJcclxuICAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7e2l0ZW0udXJsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCAnX3NlbGYnfX1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImludGVybmFsaXplZFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbS51cmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7dHJ1bmNhdGVJdGVtcyA/IGl0ZW0ubGFiZWwgOiAnJ319XCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG5cclxuICAgICAgICA8cCBjbGFzcz1cIm5vLWRhdGEtbWVzc2FnZVwiPnt7bm9EYXRhVGV4dCB8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBDaGlsZCBtZW51IChSZW5kZXJlZCB0byB0aGUgcmlnaHQpIC0tPlxyXG4gICAgPGVjLW1lbnUgKm5nSWY9XCJzZWxlY3RlZD8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fY2hpbGRcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJjaGlsZFwiXHJcbiAgICAgICAgICAgICBbcGFyZW50XT1cInNlbGVjdGVkXCJcclxuICAgICAgICAgICAgIFtpdGVtc109XCJzZWxlY3RlZD8uaXRlbXNcIlxyXG4gICAgICAgICAgICAgW3Nob3dOb0l0ZW1zXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgW3RlbXBsYXRlVHlwZV09XCJ0ZW1wbGF0ZVR5cGVcIlxyXG4gICAgICAgICAgICAgW2VuYWJsZUtleU5hdl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgIFt0cnVuY2F0ZUl0ZW1zXT1cInRydW5jYXRlSXRlbXNcIlxyXG4gICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvblNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChtZW51Q2xvc2VkKT1cInRvZ2dsZUNoaWxkTWVudShmYWxzZSlcIj5cclxuICAgIDwvZWMtbWVudT5cclxuPC9uYXY+XHJcblxyXG48IS0tICdsYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNsYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSAnY2hlY2tBbmRMYWJlbCcgSXRlbSBUZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNjaGVja0FuZExhYmVsXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1jaGVjayBlYy1pY29uLXNtXCJcclxuICAgICAgICpuZ0lmPVwiaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZydcIj48L2k+XHJcblxyXG4gICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7aXRlbS5pY29ufX0gbWwtMlwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiPjwvaT5cclxuXHJcbiAgICA8c3BhbiBpZD1cInt7aXRlbS5pZH19X2xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9zcGFuPlxyXG5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MFwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLSAnaWNvbkFuZExhYmVsJyBJdGVtIFRlbXBsYXRlIC0tPlxyXG48bmctdGVtcGxhdGUgI2ljb25BbmRMYWJlbFxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8IS0tIElmIG1lbnVJdGVtLmljb24gZXhpc3RzIGFuZCBpcyBub3QgYmxhbmssIHNob3cgdGhlIGljb24gaW4gdGhlIG1lbnUgLS0+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fVwiXHJcbiAgICAgICAqbmdJZj1cIihpdGVtLmljb24gJiYgaXRlbS5pY29uICE9PSAnJykgfHwgcHJlc2VydmVJY29uU3BhY2VcIj48L2k+XHJcblxyXG4gICAgPHNwYW4gaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0ubGFiZWx9fTwvc3Bhbj5cclxuXHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24gaWNvbi1hbmdsZS1kb3duIHJvdGF0ZS0yNzBcIlxyXG4gICAgICAgKm5nSWY9XCJpdGVtPy5pdGVtc1wiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaWNvbkxhYmVsQ2FwdGlvblxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICA8aSBjbGFzcz1cImVjLWljb24ge3tpdGVtLmljb259fVwiXHJcbiAgICAgICAqbmdJZj1cIihpdGVtLmljb24gJiYgaXRlbS5pY29uICE9PSAnJykgfHwgcHJlc2VydmVJY29uU3BhY2VcIj48L2k+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5kaXNwbGF5ICE9PSAnaGVhZGluZydcIlxyXG4gICAgICAgICBjbGFzcz1cImxhYmVsIGZsZXgtZ3Jvd1wiPlxyXG4gICAgICAgIDxkaXYgaWQ9XCJ7e2l0ZW0uaWR9fV9sYWJlbFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTFcIlxyXG4gICAgICAgICAgICBbY2xhc3MudGV4dC10cnVuY2F0ZV09XCJ0cnVuY2F0ZUl0ZW1zXCI+e3tpdGVtLmxhYmVsfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGlkPVwie3tpdGVtLmlkfX1fY2FwdGlvblwiXHJcbiAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uY2FwdGlvblwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2FwdGlvbi0xXCJcclxuICAgICAgICAgICAgIFtjbGFzcy50ZXh0LXRydW5jYXRlXT1cInRydW5jYXRlSXRlbXNcIj57e2l0ZW0uY2FwdGlvbn19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxoMyAqbmdJZj1cIml0ZW0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnXCJcclxuICAgICAgICBjbGFzcz1cImZsZXgtZ3JvdyB0ZXh0LWhlYWRpbmctMyBhbGlnbi1zZWxmLWNlbnRlclwiXHJcbiAgICAgICAgW2NsYXNzLnRleHQtdHJ1bmNhdGVdPVwidHJ1bmNhdGVJdGVtc1wiPnt7aXRlbS5sYWJlbH19PC9oMz5cclxuICAgIDxpIGNsYXNzPVwiZWMtaWNvbiBpY29uLWFuZ2xlLWRvd24gcm90YXRlLTI3MCBhbGlnbi1zZWxmLWNlbnRlclwiXHJcbiAgICAgICAqbmdJZj1cIml0ZW0/Lml0ZW1zXCI+PC9pPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
@@ -74,4 +74,4 @@ export class DialogResult {
74
74
  }
75
75
  }
76
76
  ;
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvZGlhbG9nL2RpYWxvZy10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBR2xDOztHQUVHO0FBQ0YsTUFBTSxPQUFPLFdBQVc7SUFDdkI7SUFDRSxxSEFBcUg7SUFDOUcsT0FBZ0I7SUFFdkI7O01BRUU7SUFDSyxXQUFtQixFQUFFO0lBRTVCOztPQUVHO0lBQ0ksZUFBOEQsV0FBVztRQVZ6RSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBS2hCLGFBQVEsR0FBUixRQUFRLENBQWE7UUFLckIsaUJBQVksR0FBWixZQUFZLENBQTZEO0lBQy9FLENBQUM7Q0FDTDtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG9CQUF3QixTQUFRLFdBQVc7SUFDdEQsWUFBbUIsT0FBa0QsRUFBUyxPQUFXLEVBQVMsT0FBdUI7UUFDdkgsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFERCxZQUFPLEdBQVAsT0FBTyxDQUEyQztRQUFTLFlBQU8sR0FBUCxPQUFPLENBQUk7UUFBUyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtJQUV6SCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFdBQVc7SUFDakQsWUFBWSxPQUFnQixFQUFFLFFBQWlCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxnQkFBb0IsU0FBUSxXQUFXO0lBR2xELFlBQVksT0FBZ0IsRUFBRSxRQUFpQixFQUFFLElBQUksR0FBQyxLQUFLLEVBQUUsT0FBVztRQUN0RSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sc0JBQTBCLFNBQVEsV0FBVztJQUl4RCxZQUFZLE1BQXVCO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQXNERDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixZQUFtQixJQUFhLEVBQVMsT0FBVztRQUFqQyxTQUFJLEdBQUosSUFBSSxDQUFTO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBSTtJQUFJLENBQUM7Q0FDMUQ7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBEaWFsb2dDb250ZW50IH0gZnJvbSAnLi9kaWFsb2ctY29udGVudCc7XHJcblxyXG4vKipBIGJhc2UgY2xhc3MgZnJvbSB3aGljaCBhbGwgZGlhbG9nIGV2ZW50cyBleHRlbmQuIFRoaXMgY2xhc3MgbW9kZWxzIHRoZSBkaWFsb2cgYWN0aW9ucyB2ZXJ5IG11Y2hcclxuICogbGlrZSB0aGUgQW5ndWxhciBSb3V0ZXJFdmVudHMuXHJcbiAqL1xyXG4gZXhwb3J0IGNsYXNzIERpYWxvZ0V2ZW50IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8qKkEgdW5pcXVlIHZhbHVlIHJlcHJlc2VudGluZyB0aGlzIHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhlIGV2ZW50LCB1c2VkIHRvIG1hdGNoIG9wZW4gYW5kIGNsb3NlIGV2ZW50cyB0b2dldGhlciAqL1xyXG4gICAgcHVibGljIGV2ZW50SWQ/OiBzdHJpbmcsIFxyXG5cclxuICAgIC8qKlRoZSBJRCBvZiB0aGUgZGlhbG9nIGl0c2VsZiwgdHlwaWNhbGx5IG1hdGNoaW5nIHRoZSBEaWFsb2dDb250ZW50LiBTb21ldGhpbmcgbGlrZSBcIkRlbGV0ZUNvbmZpcm1hdGlvblwiIG9yIFwiRWRpdFJlYWRpbmdcIiBldGMuIFxyXG4gICAgICogVXNlZnVsIGZvciB0ZWxlbWV0cnkgbG9nZ2luZyB0byB0cmFjayB1c2VycyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRpYWxvZ3NcclxuICAgICovXHJcbiAgICBwdWJsaWMgZGlhbG9nSWQ6IHN0cmluZyA9ICcnLFxyXG5cclxuICAgIC8qKiBUaGUgYWN0aW9uIHRoZSBkaWFsb2cgZXZlbnQgcmVwcmVzZW50cy4gQ2FuIGFsc28gYmUgZGV0ZXJtaW5lZCBieSB1c2luZyB0aGUgY2xhc3Mgb2YgdGhlIGV2ZW50IHdpdGggdGhlXHJcbiAgICAgKiBpbnN0YW5jZW9mIG9wZXJhdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlhbG9nQWN0aW9uOiAnb3BlblN0YXJ0JyB8J29wZW4nIHwgJ2Nsb3NlJyB8ICdjbG9zZUxhdGVzdCcgPSAnb3BlblN0YXJ0JyxcclxuICApIHt9XHJcbn1cclxuXHJcbi8qKkVtaXR0ZWQgd2hlbiB0aGUgZGlhbG9nIG9wZW4gaGFzIGJlZW4gdHJpZ2dlcmVkLCBidXQgdGhlIGRpYWxvZyBpdHNlbGYgaGFzbid0IGluaXRpYWxpemVkIHlldC5cclxuICogVGhpcyBldmVudCBjcmVhdGVzIGl0cyBvd24gdW5pcXVlIGlkZW50aWZpZXIgc28gdGhhdCB0aGF0IHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhlIGRpYWxvZyBjYW4gYmUgZm91bmRcclxuICogd2hlbiBjbG9zZWQgbGF0ZXIgb24uIFRoZSBjb250ZXh0IGlzIHVzZWQgdG8gZmlsbCB0aGUgZGlhbG9nIGl0c2VsZiwgYW5kIG1heSBpbmNsdWRlIHN0YXRlIG9yIGNhbGxiYWNrcy5cclxuICogVmFyaW91cyBvcHRpb25zIGFyZSBhdmFpbGFibGUgdG8gY2hhbmdlIHRoZSBkaWFsb2cgYXBwZWFyYW5jZS4gVGhlc2UgZXZlbnRzIGFyZSBnZW5lcmFsbHkgY3JlYXRlZFxyXG4gKiBieSB0aGUgQHNlZSBEaWFsb2dTZXJ2aWNlLm9wZW4oKSBjYWxsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nT3BlblN0YXJ0RXZlbnQ8VD4gZXh0ZW5kcyBEaWFsb2dFdmVudCB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IFR5cGU8RGlhbG9nQ29udGVudDxUPj4gfCBUZW1wbGF0ZVJlZjxhbnk+LCBwdWJsaWMgY29udGV4dD86IFQsIHB1YmxpYyBvcHRpb25zPzogRGlhbG9nT3B0aW9ucykge1xyXG4gICAgc3VwZXIodW5pcXVlSWQoKSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipFbWl0dGVkIHdoZW4gdGhlIGRpYWxvZyBoYXMgZmluaXNoZWQgb3BlbmluZyBhbmQgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4gSXQgaW5jbHVkZXNcclxuICogdGhlIGV2ZW50SWQsIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhlIGRpYWxvZyBvcGVuIGV2ZW50IHNvIHRoYXQgd2UgY2FuIFxyXG4gKiBjbG9zZSB0aGF0IHNwZWNpZmljIGRpYWxvZyBsYXRlciBvbi4gVGhlIGRpYWxvZ0lkIGNhbiBiZSB1c2VkIGZvciB0ZWxlbWV0cnksIGFuZCBtYXkgYmUgc2V0IHRvIHNvbWV0aGluZyBcclxuICogbGlrZSBcIkNvbmZpcm0gRGVsZXRlXCIgb3IgXCJFZGl0IFJlYWRpbmdcIiBldGMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nT3BlbkVuZEV2ZW50IGV4dGVuZHMgRGlhbG9nRXZlbnQge1xyXG4gIGNvbnN0cnVjdG9yKGV2ZW50SWQ/OiBzdHJpbmcsIGRpYWxvZ0lkPzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihldmVudElkLCBkaWFsb2dJZCwgJ29wZW4nKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKkVtaXR0ZWQgd2hlbiB0aGUgZGlhbG9nIGNsb3NlIGhhcyBjb21wbGV0ZWQgYW5kIGEgcmVzdWx0IGlzIGF2YWlsYWJsZS4gQ2hlY2sgcmVzdWx0LnNhdmUgdG8ga25vdyBpZiB0aGUgZGlhbG9nIGNoYW5nZVxyXG4gKiB3YXMgY29tbWl0dGVkICh0cnVlKSBvciBjYW5jZWxsZWQgKGZhbHNlKS4gQ2FuY2VsIGNhbiBiZSBzZXQgaWYgdGhlIGRpYWxvZyB3YXMgYXV0b21hdGljYWxseSBjbG9zZWQgYnkgY2xpY2tpbmcgaW4gdGhlIFxyXG4gKiBiYWNrZ3JvdW5kIG9yIHJlc2l6aW5nIHRoZSB3aW5kb3cgd2hlbiB1c2luZyB0aGUgcGFuZWwgdmlldyBvciBjbG9zZU9uUmVzaXplLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERpYWxvZ0Nsb3NlRXZlbnQ8VD4gZXh0ZW5kcyBEaWFsb2dFdmVudCB7XHJcbiAgLyoqVGhlIHJlc3VsdCBvZiB0aGUgZGlhbG9nIGV2ZW50LCBpbmNsdWRpbmcgd2VhdGhlciBpdCB3YXMgc2F2ZWQgb3IgY2FuY2VsbGVkIGFuZCB0aGUgY29udGV4dCdzIGZpbmFsIHN0YXRlKi9cclxuICBwdWJsaWMgZGlhbG9nUmVzdWx0OiBEaWFsb2dSZXN1bHQ8YW55PjtcclxuICBjb25zdHJ1Y3RvcihldmVudElkPzogc3RyaW5nLCBkaWFsb2dJZD86IHN0cmluZywgc2F2ZT1mYWxzZSwgY29udGV4dD86IFQpIHtcclxuICAgIHN1cGVyKGV2ZW50SWQsIGRpYWxvZ0lkLCAnY2xvc2UnKTtcclxuICAgIHRoaXMuZGlhbG9nUmVzdWx0ID0gbmV3IERpYWxvZ1Jlc3VsdChzYXZlLCBjb250ZXh0KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlVzZWQgdG8gdGVsbCB0aGUgZGlhbG9nIGdyb3VwIHRvIGNsb3NlIHdoYXRldmVyIGRpYWxvZyB3YXMgb3BlbmVkIG1vc3QgcmVjZW50bHkgd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0XHJcbiAqIFRoaXMgYWxsb3dzIGEgVGVtcGxhdGVSZWYgYmFzZWQgcGFuZWwgKHRoYXQncyBub3QgY29taW5nIGZyb20gRGlhbG9nQ29tcG9uZW50KSB0byBjbG9zZSBpdHNlbGYgb3IgXHJcbiAqIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gY2xvc2UgYSBkaWFsb2cgdGhhdCBpcyBvcGVuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nQ2xvc2VMYXRlc3RFdmVudDxUPiBleHRlbmRzIERpYWxvZ0V2ZW50IHtcclxuICAvKipUaGUgcmVzdWx0IG9mIHRoZSBkaWFsb2cgZXZlbnQsIGluY2x1ZGluZyB3ZWF0aGVyIGl0IHdhcyBzYXZlZCBvciBjYW5jZWxsZWQgYW5kIHRoZSBjb250ZXh0J3MgZmluYWwgc3RhdGUqL1xyXG4gIHB1YmxpYyBkaWFsb2dSZXN1bHQ6IERpYWxvZ1Jlc3VsdDxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihyZXN1bHQ6IERpYWxvZ1Jlc3VsdDxUPikge1xyXG4gICAgc3VwZXIoJ2xhdGVzdCcsICdsYXRlc3QnLCAnY2xvc2VMYXRlc3QnKTtcclxuICAgIHRoaXMuZGlhbG9nUmVzdWx0ID0gcmVzdWx0O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyBleHRyYSBvcHRpb25zIHRvIGNvbmZpZ3VyZSBiZWhhdmlvciBvZiB0aGUgRGlhbG9nIENvbXBvbmVudFxyXG4gKi9cclxuIGV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gdG8gZXhlY3V0ZSBiZWZvcmUgZGlhbG9nIG9wZW5zLiAgTGVhdmUgYHVuZGVmaW5lZGAgb3IgcmV0dXJuIHRydWUgdG8gYWxsb3dcclxuICAgKiBkaWFsb2cgdG8gb3Blbi5cclxuICAgKlxyXG4gICAqIENhbiBiZSB1c2VkIHRvIGNoZWNrIGZvciB1bnNhdmVkIGNoYW5nZXMgb24gdGhlIHVuZGVybHlpbmcgcGFnZSBiZWZvcmUgb3BlbmluZy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICAgY29uc3RydWN0b3IoIHByaXZhdGUgdW5zYXZlZENoYW5nZXNHdWFyZDogQ2FuRGVhY3RpdmF0ZVVuc2F2ZWRDaGFuZ2VzR3VhcmQgKXt9O1xyXG4gICAgIC8vLi4uXHJcbiAgICAgY29uc3Qgb3B0aW9uczogRGlhbG9nT3B0aW9ucyA9IHsgY2FuT3BlbkRpYWxvZzogdGhpcy51bnNhdmVkQ2hhbmdlc0d1YXJkLmNhbkRlYWN0aXZhdGUgfTtcclxuICAgKi9cclxuICBjYW5PcGVuRGlhbG9nPzogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcclxuXHJcbiAgLyoqIENvbmZpZ3VyZXMgd2hlbiB0aGUgZGlhbG9nIGVtaXRzIGl0cyByZXN1bHQgaW4gcmVsYXRpb24gdG8gYSBjbG9zaW5nIGFuaW1hdGlvbiBldmVudCAqL1xyXG4gIGVtaXRSZXN1bHRPbj86IERpYWxvZ0FuaW1hdGlvbkV2ZW50O1xyXG5cclxuICAvKiogRGlzcGxheSB0aGUgZGlhbG9nIGFzIGEgc2lkZSBwYW5lbCB0aGF0IHNsaWRlcyBpbiAqL1xyXG4gIGRpc3BsYXlBc1BhbmVsPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFNldCB0aGUgZGlhbG9nIG1hc2sgY29sb3IgdG8gdHJhbnNwYXJlbnQuIERlZmF1bHRzIHRvIHRydWUgd2hlbiBkaWFsb2cgaXMgZGlzcGxheWVkIGFzIGEgcGFuZWwgKi9cclxuICB0cmFuc3BhcmVudE1hc2s/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGRpYWxvZyBtYXNrIHRvIG5vdCBkaXNwbGF5IGF0IGFsbC4gQWxsb3dzIHRoZSB1c2VyIHRvIGNsaWNrIG9uIGVsZW1lbnRzIGJlaGluZCB0aGUgZGlhbG9nLlxyXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIGRpc3BsYXlBc1BhbmVsIGlzIHRydWUuXHJcbiAgICogRGVmYXVsdHMgdG8gZmFsc2UuXHJcbiAgICovXHJcbiAgbm9NYXNrPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIEFsaWduIHRoZSBkaWFsb2cgd2luZG93IHRvIHRoZSB0b3AgaW5zdGVhZCBvZiBjZW50ZXJlZC4gKi9cclxuICBhbGlnblRvVG9wPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgaWYgdGhlIGRpYWxvZyBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZC5cclxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGNvbmRpdGlvbmFsbHkgc2hvd2luZy9oaWRpbmcgdGhlIGRpYWxvZyBjb250ZW50IGFzIGEgc3RhdGljIHBhcnQgb2YgdGhlIHBhZ2VcclxuICAgKiB3aGVuIHRoZSBzY3JlZW4gZ2V0cyB3aWRlIGVub3VnaFxyXG4gICAqL1xyXG4gIGNsb3NlT25SZXNpemU/OiBib29sZWFuO1xyXG5cclxuICBzaXplPzogRGlhbG9nU2l6ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBzcGVjaWZ5IGEgY3VzdG9tIG1pbi13aWR0aCBvZiB0aGUgZGlhbG9nLiBPbmx5IHRha2VzIGVmZmVjdCBpZiBzaXplIGlzIHNldCB0byBkeW5hbWljLlxyXG4gICAqIE11c3QgaW5jbHVkZSB1bml0cywgaS5lLiBcIjMycmVtXCIgb3IgXCI2NDBweFwiXHJcbiAgICovXHJcbiAgbWluV2lkdGg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5lZCB3aGVuIGEgZGlhbG9nIGlzIGNsb3NlZC5cclxuICogU3BlY2lmaWVzIGlmIHRoZSBkaWFsb2cgd2FzIHNhdmVkIGFuZCBjb250YWlucyBhbiBvcHRpb25hbCBjb250ZXh0LlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERpYWxvZ1Jlc3VsdDxUPiB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHNhdmU6IGJvb2xlYW4sIHB1YmxpYyBjb250ZXh0PzogVCkgeyB9XHJcbn07XHJcblxyXG5cclxuLyoqIE9wdGlvbnMgZm9yIHNpemUgb2YgZGlhbG9nICovXHJcbmV4cG9ydCB0eXBlIERpYWxvZ1NpemUgPSBudW1iZXIgfCAneHNtYWxsJyB8ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgfCAneGxhcmdlJyB8ICdmdWxsJyB8ICdkeW5hbWljJztcclxuXHJcbi8qKlxyXG4gKiBEaWFsb2cgQW5pbWF0aW9uIEV2ZW50czpcclxuICogLSBCZWdpbkNsb3NlOiBXaGVuIHRoZSBjbG9zZSBhbmltYXRpb24gc3RhcnRzLlxyXG4gKiAtIEVuZENsb3NlOiBXaGVuIHRoZSBjbG9zZSBhbmltYXRpb24gZmluaXNoZXNcclxuICovXHJcbmV4cG9ydCB0eXBlIERpYWxvZ0FuaW1hdGlvbkV2ZW50ID0gJ0JlZ2luQ2xvc2UnIHwgJ0VuZENsb3NlJ1xyXG4iXX0=
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2Rpc3BsYXkvZGlhbG9nL2RpYWxvZy10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBR2xDOztHQUVHO0FBQ0YsTUFBTSxPQUFPLFdBQVc7SUFDdkI7SUFDRSxxSEFBcUg7SUFDOUcsT0FBZ0I7SUFFdkI7O01BRUU7SUFDSyxXQUFtQixFQUFFO0lBRTVCOztPQUVHO0lBQ0ksZUFBOEQsV0FBVztRQVZ6RSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBS2hCLGFBQVEsR0FBUixRQUFRLENBQWE7UUFLckIsaUJBQVksR0FBWixZQUFZLENBQTZEO0lBQy9FLENBQUM7Q0FDTDtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG9CQUF3QixTQUFRLFdBQVc7SUFDdEQsWUFBbUIsT0FBa0QsRUFBUyxPQUFXLEVBQVMsT0FBdUI7UUFDdkgsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFERCxZQUFPLEdBQVAsT0FBTyxDQUEyQztRQUFTLFlBQU8sR0FBUCxPQUFPLENBQUk7UUFBUyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtJQUV6SCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFdBQVc7SUFDakQsWUFBWSxPQUFnQixFQUFFLFFBQWlCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxnQkFBb0IsU0FBUSxXQUFXO0lBR2xELFlBQVksT0FBZ0IsRUFBRSxRQUFpQixFQUFFLElBQUksR0FBQyxLQUFLLEVBQUUsT0FBVztRQUN0RSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sc0JBQTBCLFNBQVEsV0FBVztJQUl4RCxZQUFZLE1BQXVCO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQStDRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixZQUFtQixJQUFhLEVBQVMsT0FBVztRQUFqQyxTQUFJLEdBQUosSUFBSSxDQUFTO1FBQVMsWUFBTyxHQUFQLE9BQU8sQ0FBSTtJQUFJLENBQUM7Q0FDMUQ7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBEaWFsb2dDb250ZW50IH0gZnJvbSAnLi9kaWFsb2ctY29udGVudCc7XHJcblxyXG4vKipBIGJhc2UgY2xhc3MgZnJvbSB3aGljaCBhbGwgZGlhbG9nIGV2ZW50cyBleHRlbmQuIFRoaXMgY2xhc3MgbW9kZWxzIHRoZSBkaWFsb2cgYWN0aW9ucyB2ZXJ5IG11Y2hcclxuICogbGlrZSB0aGUgQW5ndWxhciBSb3V0ZXJFdmVudHMuXHJcbiAqL1xyXG4gZXhwb3J0IGNsYXNzIERpYWxvZ0V2ZW50IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8qKkEgdW5pcXVlIHZhbHVlIHJlcHJlc2VudGluZyB0aGlzIHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhlIGV2ZW50LCB1c2VkIHRvIG1hdGNoIG9wZW4gYW5kIGNsb3NlIGV2ZW50cyB0b2dldGhlciAqL1xyXG4gICAgcHVibGljIGV2ZW50SWQ/OiBzdHJpbmcsIFxyXG5cclxuICAgIC8qKlRoZSBJRCBvZiB0aGUgZGlhbG9nIGl0c2VsZiwgdHlwaWNhbGx5IG1hdGNoaW5nIHRoZSBEaWFsb2dDb250ZW50LiBTb21ldGhpbmcgbGlrZSBcIkRlbGV0ZUNvbmZpcm1hdGlvblwiIG9yIFwiRWRpdFJlYWRpbmdcIiBldGMuIFxyXG4gICAgICogVXNlZnVsIGZvciB0ZWxlbWV0cnkgbG9nZ2luZyB0byB0cmFjayB1c2VycyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRpYWxvZ3NcclxuICAgICovXHJcbiAgICBwdWJsaWMgZGlhbG9nSWQ6IHN0cmluZyA9ICcnLFxyXG5cclxuICAgIC8qKiBUaGUgYWN0aW9uIHRoZSBkaWFsb2cgZXZlbnQgcmVwcmVzZW50cy4gQ2FuIGFsc28gYmUgZGV0ZXJtaW5lZCBieSB1c2luZyB0aGUgY2xhc3Mgb2YgdGhlIGV2ZW50IHdpdGggdGhlXHJcbiAgICAgKiBpbnN0YW5jZW9mIG9wZXJhdG9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGlhbG9nQWN0aW9uOiAnb3BlblN0YXJ0JyB8J29wZW4nIHwgJ2Nsb3NlJyB8ICdjbG9zZUxhdGVzdCcgPSAnb3BlblN0YXJ0JyxcclxuICApIHt9XHJcbn1cclxuXHJcbi8qKkVtaXR0ZWQgd2hlbiB0aGUgZGlhbG9nIG9wZW4gaGFzIGJlZW4gdHJpZ2dlcmVkLCBidXQgdGhlIGRpYWxvZyBpdHNlbGYgaGFzbid0IGluaXRpYWxpemVkIHlldC5cclxuICogVGhpcyBldmVudCBjcmVhdGVzIGl0cyBvd24gdW5pcXVlIGlkZW50aWZpZXIgc28gdGhhdCB0aGF0IHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhlIGRpYWxvZyBjYW4gYmUgZm91bmRcclxuICogd2hlbiBjbG9zZWQgbGF0ZXIgb24uIFRoZSBjb250ZXh0IGlzIHVzZWQgdG8gZmlsbCB0aGUgZGlhbG9nIGl0c2VsZiwgYW5kIG1heSBpbmNsdWRlIHN0YXRlIG9yIGNhbGxiYWNrcy5cclxuICogVmFyaW91cyBvcHRpb25zIGFyZSBhdmFpbGFibGUgdG8gY2hhbmdlIHRoZSBkaWFsb2cgYXBwZWFyYW5jZS4gVGhlc2UgZXZlbnRzIGFyZSBnZW5lcmFsbHkgY3JlYXRlZFxyXG4gKiBieSB0aGUgQHNlZSBEaWFsb2dTZXJ2aWNlLm9wZW4oKSBjYWxsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nT3BlblN0YXJ0RXZlbnQ8VD4gZXh0ZW5kcyBEaWFsb2dFdmVudCB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IFR5cGU8RGlhbG9nQ29udGVudDxUPj4gfCBUZW1wbGF0ZVJlZjxhbnk+LCBwdWJsaWMgY29udGV4dD86IFQsIHB1YmxpYyBvcHRpb25zPzogRGlhbG9nT3B0aW9ucykge1xyXG4gICAgc3VwZXIodW5pcXVlSWQoKSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipFbWl0dGVkIHdoZW4gdGhlIGRpYWxvZyBoYXMgZmluaXNoZWQgb3BlbmluZyBhbmQgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4gSXQgaW5jbHVkZXNcclxuICogdGhlIGV2ZW50SWQsIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgaW5zdGFuY2Ugb2YgdGhlIGRpYWxvZyBvcGVuIGV2ZW50IHNvIHRoYXQgd2UgY2FuIFxyXG4gKiBjbG9zZSB0aGF0IHNwZWNpZmljIGRpYWxvZyBsYXRlciBvbi4gVGhlIGRpYWxvZ0lkIGNhbiBiZSB1c2VkIGZvciB0ZWxlbWV0cnksIGFuZCBtYXkgYmUgc2V0IHRvIHNvbWV0aGluZyBcclxuICogbGlrZSBcIkNvbmZpcm0gRGVsZXRlXCIgb3IgXCJFZGl0IFJlYWRpbmdcIiBldGMuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nT3BlbkVuZEV2ZW50IGV4dGVuZHMgRGlhbG9nRXZlbnQge1xyXG4gIGNvbnN0cnVjdG9yKGV2ZW50SWQ/OiBzdHJpbmcsIGRpYWxvZ0lkPzogc3RyaW5nKSB7XHJcbiAgICBzdXBlcihldmVudElkLCBkaWFsb2dJZCwgJ29wZW4nKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKkVtaXR0ZWQgd2hlbiB0aGUgZGlhbG9nIGNsb3NlIGhhcyBjb21wbGV0ZWQgYW5kIGEgcmVzdWx0IGlzIGF2YWlsYWJsZS4gQ2hlY2sgcmVzdWx0LnNhdmUgdG8ga25vdyBpZiB0aGUgZGlhbG9nIGNoYW5nZVxyXG4gKiB3YXMgY29tbWl0dGVkICh0cnVlKSBvciBjYW5jZWxsZWQgKGZhbHNlKS4gQ2FuY2VsIGNhbiBiZSBzZXQgaWYgdGhlIGRpYWxvZyB3YXMgYXV0b21hdGljYWxseSBjbG9zZWQgYnkgY2xpY2tpbmcgaW4gdGhlIFxyXG4gKiBiYWNrZ3JvdW5kIG9yIHJlc2l6aW5nIHRoZSB3aW5kb3cgd2hlbiB1c2luZyB0aGUgcGFuZWwgdmlldyBvciBjbG9zZU9uUmVzaXplLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERpYWxvZ0Nsb3NlRXZlbnQ8VD4gZXh0ZW5kcyBEaWFsb2dFdmVudCB7XHJcbiAgLyoqVGhlIHJlc3VsdCBvZiB0aGUgZGlhbG9nIGV2ZW50LCBpbmNsdWRpbmcgd2VhdGhlciBpdCB3YXMgc2F2ZWQgb3IgY2FuY2VsbGVkIGFuZCB0aGUgY29udGV4dCdzIGZpbmFsIHN0YXRlKi9cclxuICBwdWJsaWMgZGlhbG9nUmVzdWx0OiBEaWFsb2dSZXN1bHQ8YW55PjtcclxuICBjb25zdHJ1Y3RvcihldmVudElkPzogc3RyaW5nLCBkaWFsb2dJZD86IHN0cmluZywgc2F2ZT1mYWxzZSwgY29udGV4dD86IFQpIHtcclxuICAgIHN1cGVyKGV2ZW50SWQsIGRpYWxvZ0lkLCAnY2xvc2UnKTtcclxuICAgIHRoaXMuZGlhbG9nUmVzdWx0ID0gbmV3IERpYWxvZ1Jlc3VsdChzYXZlLCBjb250ZXh0KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlVzZWQgdG8gdGVsbCB0aGUgZGlhbG9nIGdyb3VwIHRvIGNsb3NlIHdoYXRldmVyIGRpYWxvZyB3YXMgb3BlbmVkIG1vc3QgcmVjZW50bHkgd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0XHJcbiAqIFRoaXMgYWxsb3dzIGEgVGVtcGxhdGVSZWYgYmFzZWQgcGFuZWwgKHRoYXQncyBub3QgY29taW5nIGZyb20gRGlhbG9nQ29tcG9uZW50KSB0byBjbG9zZSBpdHNlbGYgb3IgXHJcbiAqIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gY2xvc2UgYSBkaWFsb2cgdGhhdCBpcyBvcGVuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nQ2xvc2VMYXRlc3RFdmVudDxUPiBleHRlbmRzIERpYWxvZ0V2ZW50IHtcclxuICAvKipUaGUgcmVzdWx0IG9mIHRoZSBkaWFsb2cgZXZlbnQsIGluY2x1ZGluZyB3ZWF0aGVyIGl0IHdhcyBzYXZlZCBvciBjYW5jZWxsZWQgYW5kIHRoZSBjb250ZXh0J3MgZmluYWwgc3RhdGUqL1xyXG4gIHB1YmxpYyBkaWFsb2dSZXN1bHQ6IERpYWxvZ1Jlc3VsdDxhbnk+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihyZXN1bHQ6IERpYWxvZ1Jlc3VsdDxUPikge1xyXG4gICAgc3VwZXIoJ2xhdGVzdCcsICdsYXRlc3QnLCAnY2xvc2VMYXRlc3QnKTtcclxuICAgIHRoaXMuZGlhbG9nUmVzdWx0ID0gcmVzdWx0O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyBleHRyYSBvcHRpb25zIHRvIGNvbmZpZ3VyZSBiZWhhdmlvciBvZiB0aGUgRGlhbG9nIENvbXBvbmVudFxyXG4gKi9cclxuIGV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogRnVuY3Rpb24gdG8gZXhlY3V0ZSBiZWZvcmUgZGlhbG9nIG9wZW5zLiAgTGVhdmUgYHVuZGVmaW5lZGAgb3IgcmV0dXJuIHRydWUgdG8gYWxsb3dcclxuICAgKiBkaWFsb2cgdG8gb3Blbi5cclxuICAgKlxyXG4gICAqIENhbiBiZSB1c2VkIHRvIGNoZWNrIGZvciB1bnNhdmVkIGNoYW5nZXMgb24gdGhlIHVuZGVybHlpbmcgcGFnZSBiZWZvcmUgb3BlbmluZy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICAgY29uc3RydWN0b3IoIHByaXZhdGUgdW5zYXZlZENoYW5nZXNHdWFyZDogQ2FuRGVhY3RpdmF0ZVVuc2F2ZWRDaGFuZ2VzR3VhcmQgKXt9O1xyXG4gICAgIC8vLi4uXHJcbiAgICAgY29uc3Qgb3B0aW9uczogRGlhbG9nT3B0aW9ucyA9IHsgY2FuT3BlbkRpYWxvZzogdGhpcy51bnNhdmVkQ2hhbmdlc0d1YXJkLmNhbkRlYWN0aXZhdGUgfTtcclxuICAgKi9cclxuICBjYW5PcGVuRGlhbG9nPzogKCkgPT4gUHJvbWlzZTxib29sZWFuPjtcclxuXHJcbiAgLyoqIENvbmZpZ3VyZXMgd2hlbiB0aGUgZGlhbG9nIGVtaXRzIGl0cyByZXN1bHQgaW4gcmVsYXRpb24gdG8gYSBjbG9zaW5nIGFuaW1hdGlvbiBldmVudCAqL1xyXG4gIGVtaXRSZXN1bHRPbj86IERpYWxvZ0FuaW1hdGlvbkV2ZW50O1xyXG5cclxuICAvKiogRGlzcGxheSB0aGUgZGlhbG9nIGFzIGEgc2lkZSBwYW5lbCB0aGF0IHNsaWRlcyBpbiAqL1xyXG4gIGRpc3BsYXlBc1BhbmVsPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFNldCB0aGUgZGlhbG9nIG1hc2sgY29sb3IgdG8gdHJhbnNwYXJlbnQuIERlZmF1bHRzIHRvIHRydWUgd2hlbiBkaWFsb2cgaXMgZGlzcGxheWVkIGFzIGEgcGFuZWwgKi9cclxuICB0cmFuc3BhcmVudE1hc2s/OiBib29sZWFuO1xyXG5cclxuICAvKiogQWxpZ24gdGhlIGRpYWxvZyB3aW5kb3cgdG8gdGhlIHRvcCBpbnN0ZWFkIG9mIGNlbnRlcmVkLiAqL1xyXG4gIGFsaWduVG9Ub3A/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdG8gdHJ1ZSBpZiB0aGUgZGlhbG9nIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNsb3NlIHdoZW4gdGhlIHdpbmRvdyBpcyByZXNpemVkLlxyXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgY29uZGl0aW9uYWxseSBzaG93aW5nL2hpZGluZyB0aGUgZGlhbG9nIGNvbnRlbnQgYXMgYSBzdGF0aWMgcGFydCBvZiB0aGUgcGFnZVxyXG4gICAqIHdoZW4gdGhlIHNjcmVlbiBnZXRzIHdpZGUgZW5vdWdoXHJcbiAgICovXHJcbiAgY2xvc2VPblJlc2l6ZT86IGJvb2xlYW47XHJcblxyXG4gIHNpemU/OiBEaWFsb2dTaXplO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIHNwZWNpZnkgYSBjdXN0b20gbWluLXdpZHRoIG9mIHRoZSBkaWFsb2cuIE9ubHkgdGFrZXMgZWZmZWN0IGlmIHNpemUgaXMgc2V0IHRvIGR5bmFtaWMuXHJcbiAgICogTXVzdCBpbmNsdWRlIHVuaXRzLCBpLmUuIFwiMzJyZW1cIiBvciBcIjY0MHB4XCJcclxuICAgKi9cclxuICBtaW5XaWR0aD86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybmVkIHdoZW4gYSBkaWFsb2cgaXMgY2xvc2VkLlxyXG4gKiBTcGVjaWZpZXMgaWYgdGhlIGRpYWxvZyB3YXMgc2F2ZWQgYW5kIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGNvbnRleHQuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRGlhbG9nUmVzdWx0PFQ+IHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2F2ZTogYm9vbGVhbiwgcHVibGljIGNvbnRleHQ/OiBUKSB7IH1cclxufTtcclxuXHJcblxyXG4vKiogT3B0aW9ucyBmb3Igc2l6ZSBvZiBkaWFsb2cgKi9cclxuZXhwb3J0IHR5cGUgRGlhbG9nU2l6ZSA9IG51bWJlciB8ICd4c21hbGwnIHwgJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJyB8ICd4bGFyZ2UnIHwgJ2Z1bGwnIHwgJ2R5bmFtaWMnO1xyXG5cclxuLyoqXHJcbiAqIERpYWxvZyBBbmltYXRpb24gRXZlbnRzOlxyXG4gKiAtIEJlZ2luQ2xvc2U6IFdoZW4gdGhlIGNsb3NlIGFuaW1hdGlvbiBzdGFydHMuXHJcbiAqIC0gRW5kQ2xvc2U6IFdoZW4gdGhlIGNsb3NlIGFuaW1hdGlvbiBmaW5pc2hlc1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgRGlhbG9nQW5pbWF0aW9uRXZlbnQgPSAnQmVnaW5DbG9zZScgfCAnRW5kQ2xvc2UnXHJcbiJdfQ==