@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
422 lines • 45.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: data-table-cell.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ChangeDetectorRef, Component, ComponentFactoryResolver, ElementRef, Input, NgZone, ViewChild } from '@angular/core';
import { InputNumberComponent } from '@duoduo-oba/ng-devui/input-number';
import { SelectComponent } from '@duoduo-oba/ng-devui/select';
import { TreeSelectComponent } from '@duoduo-oba/ng-devui/tree-select';
import { stopPropagationIfExist } from '@duoduo-oba/ng-devui/utils';
import { DataTableRowComponent } from './data-table-row.component';
import { DataTableComponent } from './data-table.component';
import { EditorDirective } from './editor-host.directive';
import { DataTableColumnTmplComponent } from './tmpl/data-table-column-tmpl.component';
export class DataTableCellComponent {
// 动态生成的编辑控件激活
/**
* @param {?} dt
* @param {?} changeDetectorRef
* @param {?} componentFactoryResolver
* @param {?} rowComponent
* @param {?} cellRef
* @param {?} ngZone
*/
constructor(dt, changeDetectorRef, componentFactoryResolver, rowComponent, cellRef, ngZone) {
this.dt = dt;
this.changeDetectorRef = changeDetectorRef;
this.componentFactoryResolver = componentFactoryResolver;
this.rowComponent = rowComponent;
this.cellRef = cellRef;
this.ngZone = ngZone;
this.clickCount = 0; // 记录点击次数
}
/**
* @return {?}
*/
ngOnInit() {
this.forceUpdateSubscription = this.rowComponent.forceUpdateEvent.subscribe((/**
* @param {?} _
* @return {?}
*/
_ => this.forceUpdate()));
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => {
this.cellRef.nativeElement.addEventListener('click', this.onCellClick.bind(this));
this.cellRef.nativeElement.addEventListener('dblclick', this.onCellDBClick.bind(this));
}));
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
const rowItem = changes['rowItem'];
if (rowItem) {
this.updateEditable(rowItem);
}
}
/**
* @param {?} rowItem
* @return {?}
*/
updateEditable(rowItem) {
/** @type {?} */
const currentConfig = rowItem.currentValue['$editDeniedConfig'];
if (!currentConfig) {
if (this.fieldEditDenied) {
this.fieldEditDenied = false;
}
}
else {
/** @type {?} */
const index = currentConfig.findIndex((/**
* @param {?} config
* @return {?}
*/
(config) => {
return config === this.column.field;
}));
if (index === -1) {
if (this.fieldEditDenied) {
this.fieldEditDenied = false;
}
}
else {
if (!this.fieldEditDenied) {
this.fieldEditDenied = true;
}
}
}
}
/**
* @param {?} $event
* @return {?}
*/
onCellClick($event) {
/** @type {?} */
const cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
};
this.clickCount++;
if (this.clickCount === 1) {
this.timeoutId = setTimeout((/**
* @return {?}
*/
() => {
if (this.clickCount === 1) {
this.dt.onCellClick(cellSelectedEventArg);
}
this.clickCount = 0;
clearTimeout(this.timeoutId);
}), this.timeout);
}
}
/**
* @param {?} $event
* @return {?}
*/
onCellDBClick($event) {
/** @type {?} */
const cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
};
this.dt.onCellDBClick(cellSelectedEventArg);
}
/**
* @return {?}
*/
forceUpdate() {
this.changeDetectorRef.markForCheck();
}
/**
* @param {?=} $event
* @return {?}
*/
finishCellEdit($event) {
if (this.editModel !== 'cell') {
return;
}
this.isCellEdit = false;
this.editorHost.viewContainerRef.clear();
this.dynamicEditorActive = false;
this.templateEditorActive = false;
// tslint:disable-next-line:no-unused-expression
this.documentClickSubscription && this.unSubscription(this.documentClickSubscription);
// tslint:disable-next-line:no-unused-expression
this.cellEditorClickSubscription && this.unSubscription(this.cellEditorClickSubscription);
stopPropagationIfExist($event);
this.dt.onCellEditEnd({
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
});
}
/**
* @param {?} column
* @param {?} rowItem
* @return {?}
*/
isCellEditEnable(column, rowItem) {
if (this.editModel === 'cell') {
return this.isCellEdit;
}
return this.isEditRow;
}
/**
* @return {?}
*/
ngOnDestroy() {
// tslint:disable-next-line:no-unused-expression
this.forceUpdateSubscription && this.unSubscription(this.forceUpdateSubscription);
// tslint:disable-next-line:no-unused-expression
this.documentClickSubscription && this.unSubscription(this.documentClickSubscription);
// tslint:disable-next-line:no-unused-expression
this.cellEditorClickSubscription && this.unSubscription(this.cellEditorClickSubscription);
// tslint:disable-next-line:no-unused-expression
this.cellActionSubscription && this.unSubscription(this.cellActionSubscription);
}
/**
* @private
* @param {?} sbscription
* @return {?}
*/
unSubscription(sbscription) {
if (sbscription) {
sbscription.unsubscribe();
sbscription = null;
}
}
/**
* @return {?}
*/
creatCellEditor() {
/** @type {?} */
let componentFactory;
/** @type {?} */
let editorComponent;
switch (this.column.fieldType) {
case 'number':
editorComponent = InputNumberComponent;
break;
case 'select':
editorComponent = SelectComponent;
break;
case 'treeSelect':
editorComponent = TreeSelectComponent;
break;
default:
this.templateEditorActive = true;
break;
}
if (editorComponent) {
componentFactory = this.componentFactoryResolver.resolveComponentFactory(editorComponent);
/** @type {?} */
const viewContainerRef = this.editorHost.viewContainerRef;
viewContainerRef.clear();
/** @type {?} */
const componentRef = viewContainerRef.createComponent(componentFactory);
/** @type {?} */
const componentInstance = componentRef.instance;
if (this.column.extraOptions) {
componentFactory.inputs.forEach((/**
* @param {?} input
* @return {?}
*/
(input) => {
if (this.column.extraOptions[input.templateName]) {
componentInstance[input.propName] = this.column.extraOptions[input.templateName];
}
}));
}
componentInstance.writeValue(this.rowItem[this.column.field]);
componentInstance.registerOnChange((/**
* @param {?} value
* @return {?}
*/
(value) => {
this.rowItem[this.column.field] = value;
if (this.column.extraOptions && this.column.extraOptions.finishEditingAfterValueChange) {
this.finishCellEdit();
}
}));
this.dynamicEditorActive = true;
}
}
/**
* @param {?} $event
* @return {?}
*/
cellEditing($event) {
$event.stopPropagation();
$event.preventDefault();
/** @type {?} */
let beforeEdit = Promise.resolve();
if (this.dt.beforeCellEdit) {
beforeEdit = this.dt.beforeCellEdit(this.rowItem, this.column);
}
beforeEdit.then((/**
* @param {?=} extraOptions
* @return {?}
*/
(extraOptions) => {
if (extraOptions) {
this.column.extraOptions = extraOptions;
}
this.dt.cellEditorClickEvent.emit($event);
/** @type {?} */
const cellSelectedEventArg = {
rowIndex: this.rowIndex,
colIndex: this.colIndex,
column: this.column,
rowItem: this.rowItem,
cellComponent: this,
rowComponent: this.rowComponent
};
if (this.column.editable && this.editModel === 'cell') {
this.isCellEdit = true;
this.creatCellEditor();
this.documentClickSubscription = this.dt.documentClickEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
if (event === 'cancel' || !this.cellRef.nativeElement.contains(event.target)) {
this.ngZone.run((/**
* @return {?}
*/
() => {
this.finishCellEdit();
}));
}
}));
this.cellEditorClickSubscription = this.dt.cellEditorClickEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
if (!this.cellRef.nativeElement.contains(event.target)) {
this.finishCellEdit();
}
}));
this.dt.onCellEditStart(cellSelectedEventArg);
}
}));
}
/**
* @param {?} rowItem
* @return {?}
*/
toggleChildTable(rowItem) {
rowItem.$isChildTableOpen = !rowItem.$isChildTableOpen;
this.dt.onToggleChildrenTable(rowItem, rowItem.$isChildTableOpen);
}
}
DataTableCellComponent.decorators = [
{ type: Component, args: [{
selector: 'd-data-table-cell,[dDataTableCell]',
template: "<ng-template *ngIf=\"!column.editable || fieldEditDenied\" [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n\r\n<ng-container *ngIf=\"column.editable && !fieldEditDenied\">\r\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip === 'btn'\" class=\"cell-container\">\r\n <div class=\"cell-container-inner not-break modify-holder\">\r\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n <span class=\"cell-modify\" (click)=\"cellEditing($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\r\n <g id=\"cell-modify\" fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\r\n <path\r\n id=\"cell-modify-copy\"\r\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\r\n />\r\n </g>\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isCellEdit && column.extraOptions?.editableTip !== 'btn'\" class=\"cell-editable\" (click)=\"cellEditing($event)\">\r\n <ng-template [ngTemplateOutlet]=\"cellViewTemp\"></ng-template>\r\n </div>\r\n <div [ngClass]=\"{ 'edit-padding-fix': dynamicEditorActive }\">\r\n <ng-template dEditorHost></ng-template>\r\n </div>\r\n <ng-template\r\n *ngIf=\"templateEditorActive\"\r\n [ngTemplateOutlet]=\"column.cellEditCmp ? column.cellEditCmp.template : column.fieldType === 'date' ? dateEditTempate : textEditTempate\"\r\n [ngTemplateOutletContext]=\"{\r\n rowIndex:rowIndex,\r\n colIndex:colIndex,\r\n column: column,\r\n rowItem:rowItem,\r\n $implicit: this,\r\n row: rowComponent\r\n }\"\r\n >\r\n </ng-template>\r\n</ng-container>\r\n\r\n<ng-template #cellViewTemp>\r\n <ng-container *ngIf=\"column.nestedColumn\">\r\n <span *ngIf=\"tableLevel > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: tableLevel * 16 + 'px' }\"></span>\r\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\r\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\r\n <svg\r\n *ngIf=\"!column.extraOptions?.iconFoldTable\"\r\n class=\"svg-icon-close-folder\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 16 16\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n >\r\n <g id=\"b-closeFolder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <path\r\n d=\"M3,2 L13,2 C13.5522847,2 14,2.44771525 14,3 L14,13 C14,13.5522847 13.5522847,14 13,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L2,3 C2,2.44771525 2.44771525,2 3,2 Z M12,7 L4,7 L4,9 L12,9 L12,7 Z\"\r\n fill-rule=\"nonzero\"\r\n ></path>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"column.extraOptions?.iconFoldTable\" [innerHTML]=\"column.extraOptions?.iconFoldTable | safe: 'html'\"></span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\r\n <svg\r\n *ngIf=\"!column.extraOptions?.iconUnFoldTable\"\r\n class=\"svg-icon-open-folder\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 16 16\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n >\r\n <g id=\"b-openFolder\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\r\n <path\r\n d=\"M3,2 L13,2 C13.5522847,2 14,2.44771525 14,3 L14,13 C14,13.5522847 13.5522847,14 13,14 L3,14 C2.44771525,14 2,13.5522847 2,13 L2,3 C2,2.44771525 2.44771525,2 3,2 Z M7,7 L4,7 L4,9 L7,9 L7,12 L9,12 L9,9 L12,9 L12,7 L9,7 L9,4 L7,4 L7,7 Z\"\r\n fill-rule=\"nonzero\"\r\n ></path>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"column.extraOptions?.iconUnFoldTable\" [innerHTML]=\"column.extraOptions?.iconUnFoldTable | safe: 'html'\"></span>\r\n </ng-container>\r\n </span>\r\n </ng-container>\r\n <ng-template\r\n [ngTemplateOutlet]=\"column.cellCmp ? column.cellCmp.template : textViewTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n rowIndex:rowIndex,\r\n colIndex:colIndex,\r\n column: column,\r\n rowItem: rowItem,\r\n cellItem: rowItem[column.field],\r\n cellValue: rowItem | disPlayCellValuePipe:rowIndex:column,\r\n $implicit: this,\r\n row: rowComponent,\r\n tableLevel: tableLevel\r\n }\"\r\n >\r\n </ng-template>\r\n</ng-template>\r\n\r\n<ng-template let-cellValue=\"cellValue\" #textViewTemplate>\r\n <span [attr.title]=\"cellValue\">{{ cellValue }}</span>\r\n</ng-template>\r\n\r\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #textEditTempate>\r\n <form class=\"form-inline edit-padding-fix\">\r\n <div class=\"form-group full-width\">\r\n <div class=\"input-group full-width\">\r\n <input\r\n [dAutoFocus]=\"cell && cell.isCellEdit\"\r\n [type]=\"column.fieldType\"\r\n class=\"devui-form-control\"\r\n [name]=\"column.field\"\r\n [(ngModel)]=\"rowItem[column.field]\"\r\n [attr.maxlength]=\"column.extraOptions?.maxlength\"\r\n [attr.minlength]=\"column.extraOptions?.minlength\"\r\n [attr.pattern]=\"column.extraOptions?.pattern\"\r\n (keydown.enter)=\"cell && cell.finishCellEdit($event)\"\r\n [placeholder]=\"column.placeholder || ''\"\r\n />\r\n </div>\r\n </div>\r\n </form>\r\n</ng-template>\r\n\r\n<ng-template let-rowIndex=\"rowIndex\" let-colIndex=\"colIndex\" let-rowItem=\"rowItem\" let-column=\"column\" let-cell=\"\" #dateEditTempate>\r\n <form class=\"form-inline edit-padding-fix\">\r\n <div class=\"devui-form-group\">\r\n <div class=\"devui-input-group\">\r\n <input\r\n class=\"devui-form-control search\"\r\n [name]=\"column.field\"\r\n [(ngModel)]=\"rowItem[column.field]\"\r\n dDatepicker\r\n appendToBody\r\n [dateFormat]=\"column.extraOptions?.dateFormat\"\r\n #datePicker=\"datepicker\"\r\n (ngModelChange)=\"!column.extraOptions?.showTime && cell && cell.finishCellEdit()\"\r\n [maxDate]=\"column.extraOptions?.maxDate\"\r\n [minDate]=\"column.extraOptions?.minDate\"\r\n [cssClass]=\"column.extraOptions?.cssClass\"\r\n [dateConfig]=\"column.extraOptions?.dateConfig\"\r\n [locale]=\"column.extraOptions?.locale\"\r\n [customViewTemplate]=\"column.extraOptions?.customViewTemplate\"\r\n [disabled]=\"column.extraOptions?.disabled\"\r\n [yearNumber]=\"column.extraOptions?.yearNumber || 12\"\r\n [placeholder]=\"column.placeholder || ''\"\r\n [autoOpen]=\"true\"\r\n [showTime]=\"column.extraOptions?.showTime\"\r\n />\r\n <div class=\"devui-input-group-addon\" (click)=\"datePicker.toggle($event, true)\">\r\n <i class=\"icon icon-calendar\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</ng-template>\r\n",
styles: [""]
}] }
];
/** @nocollapse */
DataTableCellComponent.ctorParameters = () => [
{ type: DataTableComponent },
{ type: ChangeDetectorRef },
{ type: ComponentFactoryResolver },
{ type: DataTableRowComponent },
{ type: ElementRef },
{ type: NgZone }
];
DataTableCellComponent.propDecorators = {
editorHost: [{ type: ViewChild, args: [EditorDirective, { static: false },] }],
rowIndex: [{ type: Input }],
colIndex: [{ type: Input }],
column: [{ type: Input }],
rowItem: [{ type: Input }],
editModel: [{ type: Input }],
isEditRow: [{ type: Input }],
timeout: [{ type: Input }],
tableLevel: [{ type: Input }]
};
if (false) {
/** @type {?} */
DataTableCellComponent.prototype.editorHost;
/** @type {?} */
DataTableCellComponent.prototype.rowIndex;
/** @type {?} */
DataTableCellComponent.prototype.colIndex;
/** @type {?} */
DataTableCellComponent.prototype.column;
/** @type {?} */
DataTableCellComponent.prototype.rowItem;
/** @type {?} */
DataTableCellComponent.prototype.editModel;
/** @type {?} */
DataTableCellComponent.prototype.isEditRow;
/** @type {?} */
DataTableCellComponent.prototype.timeout;
/** @type {?} */
DataTableCellComponent.prototype.tableLevel;
/** @type {?} */
DataTableCellComponent.prototype.isCellEdit;
/** @type {?} */
DataTableCellComponent.prototype.forceUpdateSubscription;
/** @type {?} */
DataTableCellComponent.prototype.documentClickSubscription;
/** @type {?} */
DataTableCellComponent.prototype.cellEditorClickSubscription;
/** @type {?} */
DataTableCellComponent.prototype.cellActionSubscription;
/** @type {?} */
DataTableCellComponent.prototype.clickCount;
/** @type {?} */
DataTableCellComponent.prototype.timeoutId;
/** @type {?} */
DataTableCellComponent.prototype.fieldEditDenied;
/** @type {?} */
DataTableCellComponent.prototype.templateEditorActive;
/** @type {?} */
DataTableCellComponent.prototype.dynamicEditorActive;
/** @type {?} */
DataTableCellComponent.prototype.dt;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.componentFactoryResolver;
/** @type {?} */
DataTableCellComponent.prototype.rowComponent;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.cellRef;
/**
* @type {?}
* @private
*/
DataTableCellComponent.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RhdGEtdGFibGUvIiwic291cmNlcyI6WyJkYXRhLXRhYmxlLWNlbGwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFDdkQsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFPdkYsTUFBTSxPQUFPLHNCQUFzQjs7Ozs7Ozs7OztJQXFCakMsWUFBbUIsRUFBc0IsRUFBVSxpQkFBb0MsRUFDN0Usd0JBQWtELEVBQ25ELFlBQW1DLEVBQVUsT0FBbUIsRUFBVSxNQUFjO1FBRjlFLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUM3RSw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ25ELGlCQUFZLEdBQVosWUFBWSxDQUF1QjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFR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Ozs7WUEvUEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQ0FBb0M7Z0JBQzlDLHM0T0FBK0M7O2FBRWhEOzs7O1lBUlEsa0JBQWtCO1lBUmxCLGlCQUFpQjtZQUFhLHdCQUF3QjtZQU90RCxxQkFBcUI7WUFQbUMsVUFBVTtZQUFTLE1BQU07Ozt5QkFrQnZGLFNBQVMsU0FBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3VCQUM1QyxLQUFLO3VCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLO3dCQUNMLEtBQUs7d0JBQ0wsS0FBSztzQkFDTCxLQUFLO3lCQUNMLEtBQUs7Ozs7SUFSTiw0Q0FBMkU7O0lBQzNFLDBDQUEwQjs7SUFDMUIsMENBQTBCOztJQUMxQix3Q0FBOEM7O0lBQzlDLHlDQUFzQjs7SUFDdEIsMkNBQTJCOztJQUMzQiwyQ0FBNEI7O0lBQzVCLHlDQUF5Qjs7SUFDekIsNENBQTRCOztJQUM1Qiw0Q0FBb0I7O0lBQ3BCLHlEQUFzQzs7SUFDdEMsMkRBQXdDOztJQUN4Qyw2REFBMEM7O0lBQzFDLHdEQUFxQzs7SUFDckMsNENBQWU7O0lBQ2YsMkNBQVU7O0lBQ1YsaURBQXlCOztJQUN6QixzREFBOEI7O0lBQzlCLHFEQUE2Qjs7SUFFakIsb0NBQTZCOzs7OztJQUFFLG1EQUE0Qzs7Ozs7SUFDckYsMERBQTBEOztJQUMxRCw4Q0FBMEM7Ozs7O0lBQUUseUNBQTJCOzs7OztJQUFFLHdDQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRWxlbWVudFJlZiwgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSwgT25Jbml0LCBTaW1wbGVDaGFuZ2UsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSW5wdXROdW1iZXJDb21wb25lbnQgfSBmcm9tICduZy1kZXZ1aS9pbnB1dC1udW1iZXInO1xyXG5pbXBvcnQgeyBTZWxlY3RDb21wb25lbnQgfSBmcm9tICduZy1kZXZ1aS9zZWxlY3QnO1xyXG5pbXBvcnQgeyBUcmVlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnbmctZGV2dWkvdHJlZS1zZWxlY3QnO1xyXG5pbXBvcnQgeyBzdG9wUHJvcGFnYXRpb25JZkV4aXN0IH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xyXG5pbXBvcnQgeyBEYXRhVGFibGVSb3dDb21wb25lbnQgfSBmcm9tICcuL2RhdGEtdGFibGUtcm93LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2VkaXRvci1ob3N0LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtblRtcGxDb21wb25lbnQgfSBmcm9tICcuL3RtcGwvZGF0YS10YWJsZS1jb2x1bW4tdG1wbC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWRhdGEtdGFibGUtY2VsbCxbZERhdGFUYWJsZUNlbGxdJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS1jZWxsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLWNlbGwuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ2VsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoRWRpdG9yRGlyZWN0aXZlLCB7IHN0YXRpYzogZmFsc2UgfSkgZWRpdG9ySG9zdDogRWRpdG9yRGlyZWN0aXZlO1xyXG4gIEBJbnB1dCgpIHJvd0luZGV4OiBudW1iZXI7XHJcbiAgQElucHV0KCkgY29sSW5kZXg6IG51bWJlcjtcclxuICBASW5wdXQoKSBjb2x1bW46IERhdGFUYWJsZUNvbHVtblRtcGxDb21wb25lbnQ7XHJcbiAgQElucHV0KCkgcm93SXRlbTogYW55O1xyXG4gIEBJbnB1dCgpIGVkaXRNb2RlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzRWRpdFJvdzogYm9vbGVhbjtcclxuICBASW5wdXQoKSB0aW1lb3V0OiBudW1iZXI7XHJcbiAgQElucHV0KCkgdGFibGVMZXZlbDogbnVtYmVyO1xyXG4gIGlzQ2VsbEVkaXQ6IGJvb2xlYW47XHJcbiAgZm9yY2VVcGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBkb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY2VsbEFjdGlvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNsaWNrQ291bnQgPSAwOyAvLyDorrDlvZXngrnlh7vmrKHmlbBcclxuICB0aW1lb3V0SWQ7IC8vIOW7tuaXtmlkXHJcbiAgZmllbGRFZGl0RGVuaWVkOiBib29sZWFuO1xyXG4gIHRlbXBsYXRlRWRpdG9yQWN0aXZlOiBib29sZWFuOyAvLyDpgJrov4fmqKHmnb/nlJ/miJDnmoTnvJbovpHmjqfku7bmv4DmtLtcclxuICBkeW5hbWljRWRpdG9yQWN0aXZlOiBib29sZWFuOyAvLyDliqjmgIHnlJ/miJDnmoTnvJbovpHmjqfku7bmv4DmtLtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGR0OiBEYXRhVGFibGVDb21wb25lbnQsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHB1YmxpYyByb3dDb21wb25lbnQ6IERhdGFUYWJsZVJvd0NvbXBvbmVudCwgcHJpdmF0ZSBjZWxsUmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcmNlVXBkYXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3dDb21wb25lbnQuZm9yY2VVcGRhdGVFdmVudC5zdWJzY3JpYmUoXyA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpO1xyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNlbGxSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICdjbGljaycsXHJcbiAgICAgICAgdGhpcy5vbkNlbGxDbGljay5iaW5kKHRoaXMpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuY2VsbFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2RibGNsaWNrJyxcclxuICAgICAgICB0aGlzLm9uQ2VsbERCQ2xpY2suYmluZCh0aGlzKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtwcm9wS2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfSkge1xyXG4gICAgY29uc3Qgcm93SXRlbSA9IGNoYW5nZXNbJ3Jvd0l0ZW0nXTtcclxuICAgIGlmIChyb3dJdGVtKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlRWRpdGFibGUocm93SXRlbSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFZGl0YWJsZShyb3dJdGVtKSB7XHJcbiAgICBjb25zdCBjdXJyZW50Q29uZmlnID0gcm93SXRlbS5jdXJyZW50VmFsdWVbJyRlZGl0RGVuaWVkQ29uZmlnJ107XHJcbiAgICBpZiAoIWN1cnJlbnRDb25maWcpIHtcclxuICAgICAgaWYgKHRoaXMuZmllbGRFZGl0RGVuaWVkKSB7XHJcbiAgICAgICAgdGhpcy5maWVsZEVkaXREZW5pZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50Q29uZmlnLmZpbmRJbmRleCgoY29uZmlnOiBzdHJpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4gY29uZmlnID09PSB0aGlzLmNvbHVtbi5maWVsZDtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICBpZiAodGhpcy5maWVsZEVkaXREZW5pZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5maWVsZEVkaXREZW5pZWQpIHtcclxuICAgICAgICAgIHRoaXMuZmllbGRFZGl0RGVuaWVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2VsbENsaWNrKCRldmVudCkge1xyXG4gICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgIHJvd0luZGV4OiB0aGlzLnJvd0luZGV4LFxyXG4gICAgICBjb2xJbmRleDogdGhpcy5jb2xJbmRleCxcclxuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgcm93SXRlbTogdGhpcy5yb3dJdGVtLFxyXG4gICAgICBjZWxsQ29tcG9uZW50OiB0aGlzLFxyXG4gICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY2xpY2tDb3VudCsrO1xyXG4gICAgaWYgKHRoaXMuY2xpY2tDb3VudCA9PT0gMSkge1xyXG4gICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNsaWNrQ291bnQgPT09IDEpIHtcclxuICAgICAgICAgIHRoaXMuZHQub25DZWxsQ2xpY2soY2VsbFNlbGVjdGVkRXZlbnRBcmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNsaWNrQ291bnQgPSAwO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XHJcbiAgICAgIH0sIHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNlbGxEQkNsaWNrKCRldmVudCkge1xyXG4gICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgIHJvd0luZGV4OiB0aGlzLnJvd0luZGV4LFxyXG4gICAgICBjb2xJbmRleDogdGhpcy5jb2xJbmRleCxcclxuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgcm93SXRlbTogdGhpcy5yb3dJdGVtLFxyXG4gICAgICBjZWxsQ29tcG9uZW50OiB0aGlzLFxyXG4gICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50XHJcbiAgICB9O1xyXG4gICAgdGhpcy5kdC5vbkNlbGxEQkNsaWNrKGNlbGxTZWxlY3RlZEV2ZW50QXJnKTtcclxuICB9XHJcblxyXG4gIGZvcmNlVXBkYXRlKCkge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGZpbmlzaENlbGxFZGl0KCRldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lZGl0TW9kZWwgIT09ICdjZWxsJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0NlbGxFZGl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmVkaXRvckhvc3Qudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG4gICAgdGhpcy5keW5hbWljRWRpdG9yQWN0aXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRlbXBsYXRlRWRpdG9yQWN0aXZlID0gZmFsc2U7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24pO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uKTtcclxuICAgIHN0b3BQcm9wYWdhdGlvbklmRXhpc3QoJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmR0Lm9uQ2VsbEVkaXRFbmQoe1xyXG4gICAgICByb3dJbmRleDogdGhpcy5yb3dJbmRleCxcclxuICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXHJcbiAgICAgIHJvd0l0ZW06IHRoaXMucm93SXRlbSxcclxuICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgcm93Q29tcG9uZW50OiB0aGlzLnJvd0NvbXBvbmVudFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0NlbGxFZGl0RW5hYmxlKGNvbHVtbiwgcm93SXRlbSkge1xyXG4gICAgaWYgKHRoaXMuZWRpdE1vZGVsID09PSAnY2VsbCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaXNDZWxsRWRpdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRSb3c7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5mb3JjZVVwZGF0ZVN1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuZm9yY2VVcGRhdGVTdWJzY3JpcHRpb24pO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24gJiYgdGhpcy51blN1YnNjcmlwdGlvbih0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24pO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXHJcbiAgICB0aGlzLmNlbGxFZGl0b3JDbGlja1N1YnNjcmlwdGlvbiAmJiB0aGlzLnVuU3Vic2NyaXB0aW9uKHRoaXMuY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uKTtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxyXG4gICAgdGhpcy5jZWxsQWN0aW9uU3Vic2NyaXB0aW9uICYmIHRoaXMudW5TdWJzY3JpcHRpb24odGhpcy5jZWxsQWN0aW9uU3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5TdWJzY3JpcHRpb24oc2JzY3JpcHRpb246IFN1YnNjcmlwdGlvbikge1xyXG4gICAgaWYgKHNic2NyaXB0aW9uKSB7XHJcbiAgICAgIHNic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHNic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjcmVhdENlbGxFZGl0b3IoKSB7XHJcbiAgICBsZXQgY29tcG9uZW50RmFjdG9yeTtcclxuICAgIGxldCBlZGl0b3JDb21wb25lbnQ7XHJcbiAgICBzd2l0Y2ggKHRoaXMuY29sdW1uLmZpZWxkVHlwZSkge1xyXG4gICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgIGVkaXRvckNvbXBvbmVudCA9IElucHV0TnVtYmVyQ29tcG9uZW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgIGVkaXRvckNvbXBvbmVudCA9IFNlbGVjdENvbXBvbmVudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAndHJlZVNlbGVjdCc6XHJcbiAgICAgICAgZWRpdG9yQ29tcG9uZW50ID0gVHJlZVNlbGVjdENvbXBvbmVudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWRpdG9yQ29tcG9uZW50KSB7XHJcbiAgICAgIGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShlZGl0b3JDb21wb25lbnQpO1xyXG4gICAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gdGhpcy5lZGl0b3JIb3N0LnZpZXdDb250YWluZXJSZWY7XHJcbiAgICAgIHZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcclxuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQ8eyB3cml0ZVZhbHVlOiBGdW5jdGlvbiwgcmVnaXN0ZXJPbkNoYW5nZTogRnVuY3Rpb24gfT4oY29tcG9uZW50RmFjdG9yeSk7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlO1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zKSB7XHJcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbi5leHRyYU9wdGlvbnNbaW5wdXQudGVtcGxhdGVOYW1lXSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZVtpbnB1dC5wcm9wTmFtZV0gPSB0aGlzLmNvbHVtbi5leHRyYU9wdGlvbnNbaW5wdXQudGVtcGxhdGVOYW1lXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBjb21wb25lbnRJbnN0YW5jZS53cml0ZVZhbHVlKHRoaXMucm93SXRlbVt0aGlzLmNvbHVtbi5maWVsZF0pO1xyXG4gICAgICBjb21wb25lbnRJbnN0YW5jZS5yZWdpc3Rlck9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMucm93SXRlbVt0aGlzLmNvbHVtbi5maWVsZF0gPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW4uZXh0cmFPcHRpb25zICYmIHRoaXMuY29sdW1uLmV4dHJhT3B0aW9ucy5maW5pc2hFZGl0aW5nQWZ0ZXJWYWx1ZUNoYW5nZSkge1xyXG4gICAgICAgICAgdGhpcy5maW5pc2hDZWxsRWRpdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZHluYW1pY0VkaXRvckFjdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjZWxsRWRpdGluZygkZXZlbnQpIHtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgbGV0IGJlZm9yZUVkaXQgPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgIGlmICh0aGlzLmR0LmJlZm9yZUNlbGxFZGl0KSB7XHJcbiAgICAgIGJlZm9yZUVkaXQgPSB0aGlzLmR0LmJlZm9yZUNlbGxFZGl0KHRoaXMucm93SXRlbSwgdGhpcy5jb2x1bW4pO1xyXG4gICAgfVxyXG4gICAgYmVmb3JlRWRpdC50aGVuKChleHRyYU9wdGlvbnM/OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGV4dHJhT3B0aW9ucykge1xyXG4gICAgICAgIHRoaXMuY29sdW1uLmV4dHJhT3B0aW9ucyA9IGV4dHJhT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmR0LmNlbGxFZGl0b3JDbGlja0V2ZW50LmVtaXQoJGV2ZW50KTtcclxuICAgICAgY29uc3QgY2VsbFNlbGVjdGVkRXZlbnRBcmcgPSB7XHJcbiAgICAgICAgcm93SW5kZXg6IHRoaXMucm93SW5kZXgsXHJcbiAgICAgICAgY29sSW5kZXg6IHRoaXMuY29sSW5kZXgsXHJcbiAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcclxuICAgICAgICByb3dJdGVtOiB0aGlzLnJvd0l0ZW0sXHJcbiAgICAgICAgY2VsbENvbXBvbmVudDogdGhpcyxcclxuICAgICAgICByb3dDb21wb25lbnQ6IHRoaXMucm93Q29tcG9uZW50XHJcbiAgICAgIH07XHJcbiAgICAgIGlmICh0aGlzLmNvbHVtbi5lZGl0YWJsZSAmJiB0aGlzLmVkaXRNb2RlbCA9PT0gJ2NlbGwnKSB7XHJcbiAgICAgICAgdGhpcy5pc0NlbGxFZGl0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNyZWF0Q2VsbEVkaXRvcigpO1xyXG4gICAgICAgIHRoaXMuZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbiA9IHRoaXMuZHQuZG9jdW1lbnRDbGlja0V2ZW50LnN1YnNjcmliZShcclxuICAgICAgICAgIGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50ID09PSAnY2FuY2VsJyB8fCAhdGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaENlbGxFZGl0KCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY2VsbEVkaXRvckNsaWNrU3Vic2NyaXB0aW9uID0gdGhpcy5kdC5jZWxsRWRpdG9yQ2xpY2tFdmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICBldmVudCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jZWxsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmluaXNoQ2VsbEVkaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5kdC5vbkNlbGxFZGl0U3RhcnQoY2VsbFNlbGVjdGVkRXZlbnRBcmcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNoaWxkVGFibGUocm93SXRlbSkge1xyXG4gICAgcm93SXRlbS4kaXNDaGlsZFRhYmxlT3BlbiA9ICFyb3dJdGVtLiRpc0NoaWxkVGFibGVPcGVuO1xyXG4gICAgdGhpcy5kdC5vblRvZ2dsZUNoaWxkcmVuVGFibGUocm93SXRlbSwgcm93SXRlbS4kaXNDaGlsZFRhYmxlT3Blbik7XHJcbiAgfVxyXG59XHJcbiJdfQ==