ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
696 lines • 58 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: tree-node.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __metadata } from "tslib";
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Host, Input, NgZone, Optional, Output, Renderer2, TemplateRef } from '@angular/core';
import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation';
import { NzTreeBaseService, NzTreeNode } from 'ng-zorro-antd/core/tree';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { fromEvent, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
export class NzTreeNodeComponent {
/**
* @param {?} nzTreeService
* @param {?} ngZone
* @param {?} renderer
* @param {?} elementRef
* @param {?} cdr
* @param {?=} noAnimation
*/
constructor(nzTreeService, ngZone, renderer, elementRef, cdr, noAnimation) {
this.nzTreeService = nzTreeService;
this.ngZone = ngZone;
this.renderer = renderer;
this.elementRef = elementRef;
this.cdr = cdr;
this.noAnimation = noAnimation;
/**
* for global property
*/
this.icon = '';
this.title = '';
this.isLoading = false;
this.isSelected = false;
this.isDisabled = false;
this.isMatched = false;
this.nzHideUnMatched = false;
this.nzNoAnimation = false;
this.nzSelectMode = false;
this.nzShowIcon = false;
this.nzTreeTemplate = null;
this.nzSearchValue = '';
this.nzDraggable = false;
this.nzClick = new EventEmitter();
this.nzDblClick = new EventEmitter();
this.nzContextMenu = new EventEmitter();
this.nzCheckBoxChange = new EventEmitter();
this.nzExpandChange = new EventEmitter();
this.nzOnDragStart = new EventEmitter();
this.nzOnDragEnter = new EventEmitter();
this.nzOnDragOver = new EventEmitter();
this.nzOnDragLeave = new EventEmitter();
this.nzOnDrop = new EventEmitter();
this.nzOnDragEnd = new EventEmitter();
/**
* drag var
*/
this.destroy$ = new Subject();
this.dragPos = 2;
this.dragPosClass = {
'0': 'drag-over',
'1': 'drag-over-gap-bottom',
'-1': 'drag-over-gap-top'
};
}
/**
* default set
* @return {?}
*/
get displayStyle() {
// to hide unmatched nodes
return this.nzSearchValue && this.nzHideUnMatched && !this.isMatched && !this.isExpanded && this.canHide ? 'none' : '';
}
/**
* @return {?}
*/
get isSwitcherOpen() {
return this.isExpanded && !this.isLeaf;
}
/**
* @return {?}
*/
get isSwitcherClose() {
return !this.isExpanded && !this.isLeaf;
}
/**
* @param {?} event
* @return {?}
*/
onMousedown(event) {
if (this.nzSelectMode) {
event.preventDefault();
}
}
/**
* collapse node
* @param {?} event
* @return {?}
*/
clickExpand(event) {
event.preventDefault();
if (!this.isLoading && !this.isLeaf) {
// set async state
if (this.nzAsyncData && this.nzTreeNode.children.length === 0 && !this.isExpanded) {
this.nzTreeNode.isLoading = true;
}
this.nzTreeNode.setExpanded(!this.isExpanded);
}
this.nzTreeService.setExpandedNodeList(this.nzTreeNode);
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('expand', this.nzTreeNode, event);
this.nzExpandChange.emit(eventNext);
}
/**
* @param {?} event
* @return {?}
*/
clickSelect(event) {
event.preventDefault();
if (this.isSelectable && !this.isDisabled) {
this.nzTreeNode.isSelected = !this.nzTreeNode.isSelected;
}
this.nzTreeService.setSelectedNodeList(this.nzTreeNode);
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('click', this.nzTreeNode, event);
this.nzClick.emit(eventNext);
}
/**
* @param {?} event
* @return {?}
*/
dblClick(event) {
event.preventDefault();
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('dblclick', this.nzTreeNode, event);
this.nzDblClick.emit(eventNext);
}
/**
* @param {?} event
* @return {?}
*/
contextMenu(event) {
event.preventDefault();
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('contextmenu', this.nzTreeNode, event);
this.nzContextMenu.emit(eventNext);
}
/**
* check node
* @param {?} event
* @return {?}
*/
clickCheckBox(event) {
event.preventDefault();
// return if node is disabled
if (this.isDisabled || this.isDisableCheckbox) {
return;
}
this.nzTreeNode.isChecked = !this.nzTreeNode.isChecked;
this.nzTreeNode.isHalfChecked = false;
this.nzTreeService.setCheckedNodeList(this.nzTreeNode);
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('check', this.nzTreeNode, event);
this.nzCheckBoxChange.emit(eventNext);
}
/**
* @return {?}
*/
clearDragClass() {
/** @type {?} */
const dragClass = ['drag-over-gap-top', 'drag-over-gap-bottom', 'drag-over'];
dragClass.forEach((/**
* @param {?} e
* @return {?}
*/
e => {
this.renderer.removeClass(this.elementRef.nativeElement, e);
}));
}
/**
* drag event
* @param {?} e
* @return {?}
*/
handleDragStart(e) {
try {
// ie throw error
// firefox-need-it
(/** @type {?} */ (e.dataTransfer)).setData('text/plain', (/** @type {?} */ (this.nzTreeNode.key)));
}
catch (error) {
// empty
}
this.nzTreeService.setSelectedNode(this.nzTreeNode);
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('dragstart', this.nzTreeNode, e);
this.nzOnDragStart.emit(eventNext);
}
/**
* @param {?} e
* @return {?}
*/
handleDragEnter(e) {
e.preventDefault();
// reset position
this.dragPos = 2;
this.ngZone.run((/**
* @return {?}
*/
() => {
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('dragenter', this.nzTreeNode, e);
this.nzOnDragEnter.emit(eventNext);
}));
}
/**
* @param {?} e
* @return {?}
*/
handleDragOver(e) {
e.preventDefault();
/** @type {?} */
const dropPosition = this.nzTreeService.calcDropPosition(e);
if (this.dragPos !== dropPosition) {
this.clearDragClass();
this.dragPos = dropPosition;
// leaf node will pass
if (!(this.dragPos === 0 && this.isLeaf)) {
this.renderer.addClass(this.elementRef.nativeElement, this.dragPosClass[this.dragPos]);
}
}
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('dragover', this.nzTreeNode, e);
this.nzOnDragOver.emit(eventNext);
}
/**
* @param {?} e
* @return {?}
*/
handleDragLeave(e) {
e.preventDefault();
this.clearDragClass();
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('dragleave', this.nzTreeNode, e);
this.nzOnDragLeave.emit(eventNext);
}
/**
* @param {?} e
* @return {?}
*/
handleDragDrop(e) {
this.ngZone.run((/**
* @return {?}
*/
() => {
this.clearDragClass();
/** @type {?} */
const node = this.nzTreeService.getSelectedNode();
if (!node || (node && node.key === this.nzTreeNode.key) || (this.dragPos === 0 && this.isLeaf)) {
return;
}
// pass if node is leafNo
/** @type {?} */
const dropEvent = this.nzTreeService.formatEvent('drop', this.nzTreeNode, e);
/** @type {?} */
const dragEndEvent = this.nzTreeService.formatEvent('dragend', this.nzTreeNode, e);
if (this.nzBeforeDrop) {
this.nzBeforeDrop({
dragNode: (/** @type {?} */ (this.nzTreeService.getSelectedNode())),
node: this.nzTreeNode,
pos: this.dragPos
}).subscribe((/**
* @param {?} canDrop
* @return {?}
*/
(canDrop) => {
if (canDrop) {
this.nzTreeService.dropAndApply(this.nzTreeNode, this.dragPos);
}
this.nzOnDrop.emit(dropEvent);
this.nzOnDragEnd.emit(dragEndEvent);
}));
}
else if (this.nzTreeNode) {
this.nzTreeService.dropAndApply(this.nzTreeNode, this.dragPos);
this.nzOnDrop.emit(dropEvent);
}
}));
}
/**
* @param {?} e
* @return {?}
*/
handleDragEnd(e) {
e.preventDefault();
this.ngZone.run((/**
* @return {?}
*/
() => {
// if user do not custom beforeDrop
if (!this.nzBeforeDrop) {
/** @type {?} */
const eventNext = this.nzTreeService.formatEvent('dragend', this.nzTreeNode, e);
this.nzOnDragEnd.emit(eventNext);
}
}));
}
/**
* Listening to dragging events.
* @return {?}
*/
handDragEvent() {
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
if (this.nzDraggable) {
/** @type {?} */
const nativeElement = this.elementRef.nativeElement;
this.destroy$ = new Subject();
fromEvent(nativeElement, 'dragstart')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} e
* @return {?}
*/
(e) => this.handleDragStart(e)));
fromEvent(nativeElement, 'dragenter')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} e
* @return {?}
*/
(e) => this.handleDragEnter(e)));
fromEvent(nativeElement, 'dragover')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} e
* @return {?}
*/
(e) => this.handleDragOver(e)));
fromEvent(nativeElement, 'dragleave')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} e
* @return {?}
*/
(e) => this.handleDragLeave(e)));
fromEvent(nativeElement, 'drop')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} e
* @return {?}
*/
(e) => this.handleDragDrop(e)));
fromEvent(nativeElement, 'dragend')
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} e
* @return {?}
*/
(e) => this.handleDragEnd(e)));
}
else {
this.destroy$.next();
this.destroy$.complete();
}
}));
}
/**
* @return {?}
*/
markForCheck() {
this.cdr.markForCheck();
}
/**
* @return {?}
*/
ngOnInit() {
this.nzTreeNode.component = this;
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
const { nzDraggable } = changes;
if (nzDraggable) {
this.handDragEvent();
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
NzTreeNodeComponent.decorators = [
{ type: Component, args: [{
selector: 'nz-tree-node',
exportAs: 'nzTreeNode',
template: `
<nz-tree-indent [nzTreeLevel]="nzTreeNode.level" [nzSelectMode]="nzSelectMode" [nzIsStart]="isStart" [nzIsEnd]="isEnd"></nz-tree-indent>
<nz-tree-node-switcher
*ngIf="nzShowExpand"
[nzShowExpand]="nzShowExpand"
[nzShowLine]="nzShowLine"
[nzExpandedIcon]="nzExpandedIcon"
[nzSelectMode]="nzSelectMode"
[context]="nzTreeNode"
[isLeaf]="isLeaf"
[isExpanded]="isExpanded"
[isLoading]="isLoading"
(click)="clickExpand($event)"
></nz-tree-node-switcher>
<nz-tree-node-checkbox
*ngIf="nzCheckable"
(click)="clickCheckBox($event)"
[nzSelectMode]="nzSelectMode"
[isChecked]="isChecked"
[isHalfChecked]="isHalfChecked"
[isDisabled]="isDisabled"
[isDisableCheckbox]="isDisableCheckbox"
></nz-tree-node-checkbox>
<nz-tree-node-title
[icon]="icon"
[title]="title"
[isLoading]="isLoading"
[isSelected]="isSelected"
[isDisabled]="isDisabled"
[isMatched]="isMatched"
[isExpanded]="isExpanded"
[isLeaf]="isLeaf"
[searchValue]="nzSearchValue"
[treeTemplate]="nzTreeTemplate"
[draggable]="nzDraggable"
[showIcon]="nzShowIcon"
[selectMode]="nzSelectMode"
[context]="nzTreeNode"
(dblclick)="dblClick($event)"
(click)="clickSelect($event)"
(contextmenu)="contextMenu($event)"
></nz-tree-node-title>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
host: {
'[class.ant-select-tree-treenode]': `nzSelectMode`,
'[class.ant-select-tree-treenode-disabled]': `nzSelectMode && isDisabled`,
'[class.ant-select-tree-treenode-switcher-open]': `nzSelectMode && isSwitcherOpen`,
'[class.ant-select-tree-treenode-switcher-close]': `nzSelectMode && isSwitcherClose`,
'[class.ant-select-tree-treenode-checkbox-checked]': `nzSelectMode && isChecked`,
'[class.ant-select-tree-treenode-checkbox-indeterminate]': `nzSelectMode && isHalfChecked`,
'[class.ant-select-tree-treenode-selected]': `nzSelectMode && isSelected`,
'[class.ant-select-tree-treenode-loading]': `nzSelectMode && isLoading`,
'[class.ant-tree-treenode]': `!nzSelectMode`,
'[class.ant-tree-treenode-disabled]': `!nzSelectMode && isDisabled`,
'[class.ant-tree-treenode-switcher-open]': `!nzSelectMode && isSwitcherOpen`,
'[class.ant-tree-treenode-switcher-close]': `!nzSelectMode && isSwitcherClose`,
'[class.ant-tree-treenode-checkbox-checked]': `!nzSelectMode && isChecked`,
'[class.ant-tree-treenode-checkbox-indeterminate]': `!nzSelectMode && isHalfChecked`,
'[class.ant-tree-treenode-selected]': `!nzSelectMode && isSelected`,
'[class.ant-tree-treenode-loading]': `!nzSelectMode && isLoading`,
'[style.display]': 'displayStyle',
'(mousedown)': 'onMousedown($event)'
}
}] }
];
/** @nocollapse */
NzTreeNodeComponent.ctorParameters = () => [
{ type: NzTreeBaseService },
{ type: NgZone },
{ type: Renderer2 },
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] }
];
NzTreeNodeComponent.propDecorators = {
icon: [{ type: Input }],
title: [{ type: Input }],
isLoading: [{ type: Input }],
isSelected: [{ type: Input }],
isDisabled: [{ type: Input }],
isMatched: [{ type: Input }],
isExpanded: [{ type: Input }],
isLeaf: [{ type: Input }],
isChecked: [{ type: Input }],
isHalfChecked: [{ type: Input }],
isDisableCheckbox: [{ type: Input }],
isSelectable: [{ type: Input }],
canHide: [{ type: Input }],
isStart: [{ type: Input }],
isEnd: [{ type: Input }],
nzTreeNode: [{ type: Input }],
nzShowLine: [{ type: Input }],
nzShowExpand: [{ type: Input }],
nzCheckable: [{ type: Input }],
nzAsyncData: [{ type: Input }],
nzHideUnMatched: [{ type: Input }],
nzNoAnimation: [{ type: Input }],
nzSelectMode: [{ type: Input }],
nzShowIcon: [{ type: Input }],
nzExpandedIcon: [{ type: Input }],
nzTreeTemplate: [{ type: Input }],
nzBeforeDrop: [{ type: Input }],
nzSearchValue: [{ type: Input }],
nzDraggable: [{ type: Input }],
nzClick: [{ type: Output }],
nzDblClick: [{ type: Output }],
nzContextMenu: [{ type: Output }],
nzCheckBoxChange: [{ type: Output }],
nzExpandChange: [{ type: Output }],
nzOnDragStart: [{ type: Output }],
nzOnDragEnter: [{ type: Output }],
nzOnDragOver: [{ type: Output }],
nzOnDragLeave: [{ type: Output }],
nzOnDrop: [{ type: Output }],
nzOnDragEnd: [{ type: Output }]
};
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzTreeNodeComponent.prototype, "nzShowLine", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzTreeNodeComponent.prototype, "nzShowExpand", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzTreeNodeComponent.prototype, "nzCheckable", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzTreeNodeComponent.prototype, "nzAsyncData", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzTreeNodeComponent.prototype, "nzHideUnMatched", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzTreeNodeComponent.prototype, "nzNoAnimation", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzTreeNodeComponent.prototype, "nzSelectMode", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzTreeNodeComponent.prototype, "nzShowIcon", void 0);
if (false) {
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzShowLine;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzShowExpand;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzCheckable;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzAsyncData;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzHideUnMatched;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzNoAnimation;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzSelectMode;
/** @type {?} */
NzTreeNodeComponent.ngAcceptInputType_nzShowIcon;
/**
* for global property
* @type {?}
*/
NzTreeNodeComponent.prototype.icon;
/** @type {?} */
NzTreeNodeComponent.prototype.title;
/** @type {?} */
NzTreeNodeComponent.prototype.isLoading;
/** @type {?} */
NzTreeNodeComponent.prototype.isSelected;
/** @type {?} */
NzTreeNodeComponent.prototype.isDisabled;
/** @type {?} */
NzTreeNodeComponent.prototype.isMatched;
/** @type {?} */
NzTreeNodeComponent.prototype.isExpanded;
/** @type {?} */
NzTreeNodeComponent.prototype.isLeaf;
/** @type {?} */
NzTreeNodeComponent.prototype.isChecked;
/** @type {?} */
NzTreeNodeComponent.prototype.isHalfChecked;
/** @type {?} */
NzTreeNodeComponent.prototype.isDisableCheckbox;
/** @type {?} */
NzTreeNodeComponent.prototype.isSelectable;
/** @type {?} */
NzTreeNodeComponent.prototype.canHide;
/** @type {?} */
NzTreeNodeComponent.prototype.isStart;
/** @type {?} */
NzTreeNodeComponent.prototype.isEnd;
/** @type {?} */
NzTreeNodeComponent.prototype.nzTreeNode;
/** @type {?} */
NzTreeNodeComponent.prototype.nzShowLine;
/** @type {?} */
NzTreeNodeComponent.prototype.nzShowExpand;
/** @type {?} */
NzTreeNodeComponent.prototype.nzCheckable;
/** @type {?} */
NzTreeNodeComponent.prototype.nzAsyncData;
/** @type {?} */
NzTreeNodeComponent.prototype.nzHideUnMatched;
/** @type {?} */
NzTreeNodeComponent.prototype.nzNoAnimation;
/** @type {?} */
NzTreeNodeComponent.prototype.nzSelectMode;
/** @type {?} */
NzTreeNodeComponent.prototype.nzShowIcon;
/** @type {?} */
NzTreeNodeComponent.prototype.nzExpandedIcon;
/** @type {?} */
NzTreeNodeComponent.prototype.nzTreeTemplate;
/** @type {?} */
NzTreeNodeComponent.prototype.nzBeforeDrop;
/** @type {?} */
NzTreeNodeComponent.prototype.nzSearchValue;
/** @type {?} */
NzTreeNodeComponent.prototype.nzDraggable;
/** @type {?} */
NzTreeNodeComponent.prototype.nzClick;
/** @type {?} */
NzTreeNodeComponent.prototype.nzDblClick;
/** @type {?} */
NzTreeNodeComponent.prototype.nzContextMenu;
/** @type {?} */
NzTreeNodeComponent.prototype.nzCheckBoxChange;
/** @type {?} */
NzTreeNodeComponent.prototype.nzExpandChange;
/** @type {?} */
NzTreeNodeComponent.prototype.nzOnDragStart;
/** @type {?} */
NzTreeNodeComponent.prototype.nzOnDragEnter;
/** @type {?} */
NzTreeNodeComponent.prototype.nzOnDragOver;
/** @type {?} */
NzTreeNodeComponent.prototype.nzOnDragLeave;
/** @type {?} */
NzTreeNodeComponent.prototype.nzOnDrop;
/** @type {?} */
NzTreeNodeComponent.prototype.nzOnDragEnd;
/**
* drag var
* @type {?}
*/
NzTreeNodeComponent.prototype.destroy$;
/** @type {?} */
NzTreeNodeComponent.prototype.dragPos;
/** @type {?} */
NzTreeNodeComponent.prototype.dragPosClass;
/** @type {?} */
NzTreeNodeComponent.prototype.nzTreeService;
/**
* @type {?}
* @private
*/
NzTreeNodeComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
NzTreeNodeComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
NzTreeNodeComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
NzTreeNodeComponent.prototype.cdr;
/** @type {?} */
NzTreeNodeComponent.prototype.noAnimation;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvdHJlZS8iLCJzb3VyY2VzIjpbInRyZWUtbm9kZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUlOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RSxPQUFPLEVBQThDLGlCQUFpQixFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUV2SSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBdUUzQyxNQUFNLE9BQU8sbUJBQW1COzs7Ozs7Ozs7SUFxUjlCLFlBQ1MsYUFBZ0MsRUFDL0IsTUFBYyxFQUNkLFFBQW1CLEVBQ25CLFVBQXNCLEVBQ3RCLEdBQXNCLEVBQ0gsV0FBb0M7UUFMeEQsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDSCxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7Ozs7UUE5UXhELFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUNuQixjQUFTLEdBQVksS0FBSyxDQUFD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LGdEQUFxQzs7SUFDckMsMkNBQWdDOztJQUNoQyxzQ0FBMkI7O0lBQzNCLHNDQUE2Qjs7SUFDN0Isb0NBQTJCOztJQUMzQix5Q0FBaUM7O0lBQ2pDLHlDQUE4Qzs7SUFDOUMsMkNBQWdEOztJQUNoRCwwQ0FBK0M7O0lBQy9DLDBDQUErQzs7SUFDL0MsOENBQWlEOztJQUNqRCw0Q0FBK0M7O0lBQy9DLDJDQUE4Qzs7SUFDOUMseUNBQTRDOztJQUM1Qyw2Q0FBNEY7O0lBQzVGLDZDQUF5Rzs7SUFDekcsMkNBQWtGOztJQUNsRiw0Q0FBNEI7O0lBQzVCLDBDQUFzQzs7SUFDdEMsc0NBQW1FOztJQUNuRSx5Q0FBc0U7O0lBQ3RFLDRDQUF5RTs7SUFDekUsK0NBQTRFOztJQUM1RSw2Q0FBMEU7O0lBQzFFLDRDQUF5RTs7SUFDekUsNENBQXlFOztJQUN6RSwyQ0FBd0U7O0lBQ3hFLDRDQUF5RTs7SUFDekUsdUNBQW9FOztJQUNwRSwwQ0FBdUU7Ozs7O0lBS3ZFLHVDQUF5Qjs7SUFDekIsc0NBQVk7O0lBQ1osMkNBSUU7O0lBdU5BLDRDQUF1Qzs7Ozs7SUFDdkMscUNBQXNCOzs7OztJQUN0Qix1Q0FBMkI7Ozs7O0lBQzNCLHlDQUE4Qjs7Ozs7SUFDOUIsa0NBQThCOztJQUM5QiwwQ0FBK0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2UsXG4gIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuXG5pbXBvcnQgeyBOekZvcm1hdEJlZm9yZURyb3BFdmVudCwgTnpGb3JtYXRFbWl0RXZlbnQsIE56VHJlZUJhc2VTZXJ2aWNlLCBOelRyZWVOb2RlLCBOelRyZWVOb2RlT3B0aW9ucyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90cmVlJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotdHJlZS1ub2RlJyxcbiAgZXhwb3J0QXM6ICduelRyZWVOb2RlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bnotdHJlZS1pbmRlbnQgW256VHJlZUxldmVsXT1cIm56VHJlZU5vZGUubGV2ZWxcIiBbbnpTZWxlY3RNb2RlXT1cIm56U2VsZWN0TW9kZVwiIFtueklzU3RhcnRdPVwiaXNTdGFydFwiIFtueklzRW5kXT1cImlzRW5kXCI+PC9uei10cmVlLWluZGVudD5cbiAgICA8bnotdHJlZS1ub2RlLXN3aXRjaGVyXG4gICAgICAqbmdJZj1cIm56U2hvd0V4cGFuZFwiXG4gICAgICBbbnpTaG93RXhwYW5kXT1cIm56U2hvd0V4cGFuZFwiXG4gICAgICBbbnpTaG93TGluZV09XCJuelNob3dMaW5lXCJcbiAgICAgIFtuekV4cGFuZGVkSWNvbl09XCJuekV4cGFuZGVkSWNvblwiXG4gICAgICBbbnpTZWxlY3RNb2RlXT1cIm56U2VsZWN0TW9kZVwiXG4gICAgICBbY29udGV4dF09XCJuelRyZWVOb2RlXCJcbiAgICAgIFtpc0xlYWZdPVwiaXNMZWFmXCJcbiAgICAgIFtpc0V4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxuICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIlxuICAgICAgKGNsaWNrKT1cImNsaWNrRXhwYW5kKCRldmVudClcIlxuICAgID48L256LXRyZWUtbm9kZS1zd2l0Y2hlcj5cbiAgICA8bnotdHJlZS1ub2RlLWNoZWNrYm94XG4gICAgICAqbmdJZj1cIm56Q2hlY2thYmxlXCJcbiAgICAgIChjbGljayk9XCJjbGlja0NoZWNrQm94KCRldmVudClcIlxuICAgICAgW256U2VsZWN0TW9kZV09XCJuelNlbGVjdE1vZGVcIlxuICAgICAgW2lzQ2hlY2tlZF09XCJpc0NoZWNrZWRcIlxuICAgICAgW2lzSGFsZkNoZWNrZWRdPVwiaXNIYWxmQ2hlY2tlZFwiXG4gICAgICBbaXNEaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAgIFtpc0Rpc2FibGVDaGVja2JveF09XCJpc0Rpc2FibGVDaGVja2JveFwiXG4gICAgPjwvbnotdHJlZS1ub2RlLWNoZWNrYm94PlxuICAgIDxuei10cmVlLW5vZGUtdGl0bGVcbiAgICAgIFtpY29uXT1cImljb25cIlxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCJcbiAgICAgIFtpc1NlbGVjdGVkXT1cImlzU2VsZWN0ZWRcIlxuICAgICAgW2lzRGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gICAgICBbaXNNYXRjaGVkXT1cImlzTWF0Y2hlZFwiXG4gICAgICBbaXNFeHBhbmRlZF09XCJpc0V4cGFuZGVkXCJcbiAgICAgIFtpc0xlYWZdPVwiaXNMZWFmXCJcbiAgICAgIFtzZWFyY2hWYWx1ZV09XCJuelNlYXJjaFZhbHVlXCJcbiAgICAgIFt0cmVlVGVtcGxhdGVdPVwibnpUcmVlVGVtcGxhdGVcIlxuICAgICAgW2RyYWdnYWJsZV09XCJuekRyYWdnYWJsZVwiXG4gICAgICBbc2hvd0ljb25dPVwibnpTaG93SWNvblwiXG4gICAgICBbc2VsZWN0TW9kZV09XCJuelNlbGVjdE1vZGVcIlxuICAgICAgW2NvbnRleHRdPVwibnpUcmVlTm9kZVwiXG4gICAgICAoZGJsY2xpY2spPVwiZGJsQ2xpY2soJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwiY2xpY2tTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAoY29udGV4dG1lbnUpPVwiY29udGV4dE1lbnUoJGV2ZW50KVwiXG4gICAgPjwvbnotdHJlZS1ub2RlLXRpdGxlPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC1zZWxlY3QtdHJlZS10cmVlbm9kZV0nOiBgbnpTZWxlY3RNb2RlYCxcbiAgICAnW2NsYXNzLmFudC1zZWxlY3QtdHJlZS10cmVlbm9kZS1kaXNhYmxlZF0nOiBgbnpTZWxlY3RNb2RlICYmIGlzRGlzYWJsZWRgLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlLXN3aXRjaGVyLW9wZW5dJzogYG56U2VsZWN0TW9kZSAmJiBpc1N3aXRjaGVyT3BlbmAsXG4gICAgJ1tjbGFzcy5hbnQtc2VsZWN0LXRyZWUtdHJlZW5vZGUtc3dpdGNoZXItY2xvc2VdJzogYG56U2VsZWN0TW9kZSAmJiBpc1N3aXRjaGVyQ2xvc2VgLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlLWNoZWNrYm94LWNoZWNrZWRdJzogYG56U2VsZWN0TW9kZSAmJiBpc0NoZWNrZWRgLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVdJzogYG56U2VsZWN0TW9kZSAmJiBpc0hhbGZDaGVja2VkYCxcbiAgICAnW2NsYXNzLmFudC1zZWxlY3QtdHJlZS10cmVlbm9kZS1zZWxlY3RlZF0nOiBgbnpTZWxlY3RNb2RlICYmIGlzU2VsZWN0ZWRgLFxuICAgICdbY2xhc3MuYW50LXNlbGVjdC10cmVlLXRyZWVub2RlLWxvYWRpbmddJzogYG56U2VsZWN0TW9kZSAmJiBpc0xvYWRpbmdgLFxuICAgICdbY2xhc3MuYW50LXRyZWUtdHJlZW5vZGVdJzogYCFuelNlbGVjdE1vZGVgLFxuICAgICdbY2xhc3MuYW50LXRyZWUtdHJlZW5vZGUtZGlzYWJsZWRdJzogYCFuelNlbGVjdE1vZGUgJiYgaXNEaXNhYmxlZGAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZS1zd2l0Y2hlci1vcGVuXSc6IGAhbnpTZWxlY3RNb2RlICYmIGlzU3dpdGNoZXJPcGVuYCxcbiAgICAnW2NsYXNzLmFudC10cmVlLXRyZWVub2RlLXN3aXRjaGVyLWNsb3NlXSc6IGAhbnpTZWxlY3RNb2RlICYmIGlzU3dpdGNoZXJDbG9zZWAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZS1jaGVja2JveC1jaGVja2VkXSc6IGAhbnpTZWxlY3RNb2RlICYmIGlzQ2hlY2tlZGAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZS1jaGVja2JveC1pbmRldGVybWluYXRlXSc6IGAhbnpTZWxlY3RNb2RlICYmIGlzSGFsZkNoZWNrZWRgLFxuICAgICdbY2xhc3MuYW50LXRyZWUtdHJlZW5vZGUtc2VsZWN0ZWRdJzogYCFuelNlbGVjdE1vZGUgJiYgaXNTZWxlY3RlZGAsXG4gICAgJ1tjbGFzcy5hbnQtdHJlZS10cmVlbm9kZS1sb2FkaW5nXSc6IGAhbnpTZWxlY3RNb2RlICYmIGlzTG9hZGluZ2AsXG4gICAgJ1tzdHlsZS5kaXNwbGF5XSc6ICdkaXNwbGF5U3R5bGUnLFxuICAgICcobW91c2Vkb3duKSc6ICdvbk1vdXNlZG93bigkZXZlbnQpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56VHJlZU5vZGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256U2hvd0xpbmU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256U2hvd0V4cGFuZDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpDaGVja2FibGU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256QXN5bmNEYXRhOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekhpZGVVbk1hdGNoZWQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256Tm9BbmltYXRpb246IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256U2VsZWN0TW9kZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpTaG93SWNvbjogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBmb3IgZ2xvYmFsIHByb3BlcnR5XG4gICAqL1xuICBASW5wdXQoKSBpY29uOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzTWF0Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0V4cGFuZGVkITogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNMZWFmITogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNDaGVja2VkPzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNIYWxmQ2hlY2tlZD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzRGlzYWJsZUNoZWNrYm94PzogYm9vbGVhbjtcbiAgQElucHV0KCkgaXNTZWxlY3RhYmxlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgY2FuSGlkZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzU3RhcnQ/OiBib29sZWFuW107XG4gIEBJbnB1dCgpIGlzRW5kPzogYm9vbGVhbltdO1xuICBASW5wdXQoKSBuelRyZWVOb2RlITogTnpUcmVlTm9kZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56U2hvd0xpbmU/OiBib29sZWFuO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTaG93RXhwYW5kPzogYm9vbGVhbjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56Q2hlY2thYmxlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56QXN5bmNEYXRhPzogYm9vbGVhbjtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56SGlkZVVuTWF0Y2hlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpOb0FuaW1hdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTZWxlY3RNb2RlID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelNob3dJY29uID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RXhwYW5kZWRJY29uPzogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IE56VHJlZU5vZGU7IG9yaWdpbjogTnpUcmVlTm9kZU9wdGlvbnMgfT47XG4gIEBJbnB1dCgpIG56VHJlZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogTnpUcmVlTm9kZTsgb3JpZ2luOiBOelRyZWVOb2RlT3B0aW9ucyB9PiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuekJlZm9yZURyb3A/OiAoY29uZmlybTogTnpGb3JtYXRCZWZvcmVEcm9wRXZlbnQpID0+IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIEBJbnB1dCgpIG56U2VhcmNoVmFsdWUgPSAnJztcbiAgQElucHV0KCkgbnpEcmFnZ2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpEYmxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuekNvbnRleHRNZW51ID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56Q2hlY2tCb3hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpFeHBhbmRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE56Rm9ybWF0RW1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ0VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnT3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8TnpGb3JtYXRFbWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uRHJhZ0xlYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25Ecm9wID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56T25EcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxOekZvcm1hdEVtaXRFdmVudD4oKTtcblxuICAvKipcbiAgICogZHJhZyB2YXJcbiAgICovXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgZHJhZ1BvcyA9IDI7XG4gIGRyYWdQb3NDbGFzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAnMCc6ICdkcmFnLW92ZXInLFxuICAgICcxJzogJ2RyYWctb3Zlci1nYXAtYm90dG9tJyxcbiAgICAnLTEnOiAnZHJhZy1vdmVyLWdhcC10b3AnXG4gIH07XG5cbiAgLyoqXG4gICAqIGRlZmF1bHQgc2V0XG4gICAqL1xuICBnZXQgZGlzcGxheVN0eWxlKCk6IHN0cmluZyB7XG4gICAgLy8gdG8gaGlkZSB1bm1hdGNoZWQgbm9kZXNcbiAgICByZXR1cm4gdGhpcy5uelNlYXJjaFZhbHVlICYmIHRoaXMubnpIaWRlVW5NYXRjaGVkICYmICF0aGlzLmlzTWF0Y2hlZCAmJiAhdGhpcy5pc0V4cGFuZGVkICYmIHRoaXMuY2FuSGlkZSA/ICdub25lJyA6ICcnO1xuICB9XG5cbiAgZ2V0IGlzU3dpdGNoZXJPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRXhwYW5kZWQgJiYgIXRoaXMuaXNMZWFmO1xuICB9XG5cbiAgZ2V0IGlzU3dpdGNoZXJDbG9zZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFeHBhbmRlZCAmJiAhdGhpcy5pc0xlYWY7XG4gIH1cblxuICBvbk1vdXNlZG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56U2VsZWN0TW9kZSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY29sbGFwc2Ugbm9kZVxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIGNsaWNrRXhwYW5kKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nICYmICF0aGlzLmlzTGVhZikge1xuICAgICAgLy8gc2V0IGFzeW5jIHN0YXRlXG4gICAgICBpZiAodGhpcy5uekFzeW5jRGF0YSAmJiB0aGlzLm56VHJlZU5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICF0aGlzLmlzRXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5uelRyZWVOb2RlLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLm56VHJlZU5vZGUuc2V0RXhwYW5kZWQoIXRoaXMuaXNFeHBhbmRlZCk7XG4gICAgfVxuICAgIHRoaXMubnpUcmVlU2VydmljZS5zZXRFeHBhbmRlZE5vZGVMaXN0KHRoaXMubnpUcmVlTm9kZSk7XG4gICAgY29uc3QgZXZlbnROZXh0ID0gdGhpcy5uelRyZWVTZXJ2aWNlLmZvcm1hdEV2ZW50KCdleHBhbmQnLCB0aGlzLm56VHJlZU5vZGUsIGV2ZW50KTtcbiAgICB0aGlzLm56RXhwYW5kQ2hhbmdlLmVtaXQoZXZlbnROZXh0KTtcbiAgfVxuXG4gIGNsaWNrU2VsZWN0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGFibGUgJiYgIXRoaXMuaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy5uelRyZWVOb2RlLmlzU2VsZWN0ZWQgPSAhdGhpcy5uelRyZWVOb2RlLmlzU2VsZWN0ZWQ7XG4gICAgfVxuICAgIHRoaXMubnpUcmVlU2VydmljZS5zZXRTZWxlY3RlZE5vZGVMaXN0KHRoaXMubnpUcmVlTm9kZSk7XG4gICAgY29uc3QgZXZlbnROZXh0ID0gdGhpcy5uelRyZWVTZXJ2aWNlLmZvcm1hdEV2ZW50KCdjbGljaycsIHRoaXMubnpUcmVlTm9kZSwgZXZlbnQpO1xuICAgIHRoaXMubnpDbGljay5lbWl0KGV2ZW50TmV4dCk7XG4gIH1cblxuICBkYmxDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXZlbnROZXh0ID0gdGhpcy5uelRyZWVTZXJ2aWNlLmZvcm1hdEV2ZW50KCdkYmxjbGljaycsIHRoaXMubnpUcmVlTm9kZSwgZXZlbnQpO1xuICAgIHRoaXMubnpEYmxDbGljay5lbWl0KGV2ZW50TmV4dCk7XG4gIH1cblxuICBjb250ZXh0TWV