@noaestudio/forms
Version:
Dynamic forms extension for Covalent
290 lines (288 loc) • 25.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { TREE_ACTIONS } from 'angular-tree-component';
import { MatDialog } from '@angular/material';
import { TdLoadingService } from '@covalent/core/loading';
import { OrganizationDialogComponent } from '../../dialogs/organization-dialog/organization-dialog.component';
export class OrganizationComponent {
/**
* @param {?} dialog
* @param {?} loadingService
*/
constructor(dialog, loadingService) {
this.dialog = dialog;
this.loadingService = loadingService;
this.hasFilter = false;
this.hasButtons = false;
this.editable = false;
this.multiple = false;
this.saveable = true;
this.expandible = true;
this.collapsable = true;
this.nodes = [];
this.extraFields = [];
this.updater = new EventEmitter();
this.nextId = 1;
this.actionMapping = {
mouse: {
dblClick: (tree, node, event) => {
if (this.editable) {
this.editNode(tree, node);
}
},
click: (tree, node, event) => {
if (this.multiple) {
event.ctrlKey ? TREE_ACTIONS.TOGGLE_ACTIVE_MULTI(tree, node, event) : TREE_ACTIONS.TOGGLE_ACTIVE(tree, node, event);
}
else {
TREE_ACTIONS.TOGGLE_ACTIVE(tree, node, event);
}
}
}
};
this.customTemplateStringOptions = {
isExpandedField: 'expanded',
idField: 'id',
actionMapping: this.actionMapping,
nodeHeight: 40,
allowDrag: (node) => {
return !node.data.editing;
},
allowDrop: (node) => {
return !node.data.editing;
},
useVirtualScroll: true
};
this.editProfesion = (value) => {
let /** @type {?} */ dialogRef = this.dialog.open(OrganizationDialogComponent, {
panelClass: 'organization-modal',
data: {
value: value,
extraFields: this.extraFields
},
});
return dialogRef.afterClosed().toPromise();
};
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes["nodes"] && !changes["nodes"].isFirstChange()) {
this.nextId = this.getNextId();
}
}
/**
* @return {?}
*/
ngOnInit() {
this.nextId = this.getNextId();
}
/**
* @return {?}
*/
getNextId() {
let /** @type {?} */ maxId = 0;
let /** @type {?} */ openNodes = [];
for (let /** @type {?} */ node of this.nodes) {
openNodes.push(node);
}
while (openNodes.length > 0) {
let /** @type {?} */ currentNode = openNodes.pop();
maxId = Math.max(maxId, currentNode.id);
for (let /** @type {?} */ child of currentNode.children) {
openNodes.push(child);
}
}
return maxId + 1;
}
/**
* @param {?} node
* @return {?}
*/
finishName(node) {
node.data.editing = false;
}
/**
* @param {?} tree
* @return {?}
*/
addNode(tree) {
let /** @type {?} */ focused = tree.treeModel.getFocusedNode();
let /** @type {?} */ child = false;
if (this.nodes.length > 0) {
child = this.nodes[0];
}
if (focused) {
child = focused.data;
}
let /** @type {?} */ newNode = {
id: this.nextId,
name: 'Nuevo nodo',
children: [],
expanded: false,
residente: false
};
this.nextId++;
if (child) {
child.children.push(newNode);
}
else {
this.nodes.push(newNode);
}
if (this.updater) {
this.updater.emit(this.nodes);
}
tree.treeModel.update();
}
/**
* @param {?} text
* @param {?} tree
* @return {?}
*/
filterNodes(text, tree) {
tree.treeModel.filterNodes(text);
}
/**
* @param {?} treeModel
* @param {?} node
* @return {?}
*/
editNode(treeModel, node) {
this.editProfesion(node.data).then(res => {
for (let /** @type {?} */ field in res) {
node.data[field] = res[field];
}
treeModel.update();
}).catch(err => {
});
}
/**
* @param {?} tree
* @param {?} node
* @return {?}
*/
deleteNode(tree, node) {
event.stopPropagation();
let /** @type {?} */ siblings = node.parent.data.children;
node.parent.data.children = siblings.filter(x => x.id != node.data.id);
if (this.updater) {
this.updater.emit(this.nodes);
}
tree.treeModel.update();
}
/**
* @return {?}
*/
save() {
if (this.updater) {
this.updater.emit(this.nodes);
}
}
}
OrganizationComponent.decorators = [
{ type: Component, args: [{
selector: 'covalent-organization',
template: `<form *ngIf="hasFilter">
<mat-form-field fxFlex>
<input matInput #filter autocomplete="off"
(keyup)="filterNodes(filter.value, tree)" placeholder="{{'app.organization.filter' | translate}}">
</mat-form-field>
</form>
<div class="wrap">
<tree-root #tree [nodes]="nodes" [options]="customTemplateStringOptions" focused="true">
<ng-template #treeNodeTemplate let-node>
<span *ngIf="!node.data.editing" [class.root-node]="node.isRoot" title="{{node.data.name}}">{{ node.data.name }}</span>
<mat-icon *ngIf="!node.data.editing && !node.isRoot && editable" class="tree-icon" (click)="editNode(tree.treeModel,node)">edit</mat-icon>
<mat-icon *ngIf="!node.data.editing && !node.isRoot && editable" class="tree-icon" (click)="deleteNode(tree,node)">delete</mat-icon>
<mat-form-field *ngIf="node.data.editing" fxFlex>
<input autocomplete="off" matInput [(ngModel)]="node.data.name" (change)="finishName(node)" >
</mat-form-field>
</ng-template>
<ng-template #loadingTemplate>{{'app.organization.loading' | translate}}</ng-template>
</tree-root>
</div>
<div *ngIf="hasButtons">
<br>
<button *ngIf="editable" mat-raised-button color="primary" (click)="addNode(tree)">
{{'app.organization.add' | translate}}
</button>
<button *ngIf="expandible" mat-raised-button color="primary" (click)="tree.treeModel.expandAll()">
{{'app.organization.expand' | translate}}
</button>
<button *ngIf="collapsable" mat-raised-button color="primary" (click)="tree.treeModel.collapseAll()">
{{'app.organization.collapse' | translate}}
</button>
<button *ngIf="editable && saveable" mat-raised-button color="accent" (click)="save()">
{{'app.organization.save' | translate}}
</button>
</div>
`,
styles: [`:host .wrap{height:400px;max-width:300px;min-width:250px;position:relative}:host button[mat-raised-button]{margin-right:5px;margin-bottom:10px}.node-content-wrapper{line-height:37px}.tree-icon{margin-left:10px;vertical-align:middle}.root-node{font-weight:700}`],
},] },
];
/** @nocollapse */
OrganizationComponent.ctorParameters = () => [
{ type: MatDialog, },
{ type: TdLoadingService, },
];
OrganizationComponent.propDecorators = {
"hasFilter": [{ type: Input },],
"hasButtons": [{ type: Input },],
"editable": [{ type: Input },],
"multiple": [{ type: Input },],
"saveable": [{ type: Input },],
"expandible": [{ type: Input },],
"collapsable": [{ type: Input },],
"nodes": [{ type: Input },],
"extraFields": [{ type: Input },],
"updater": [{ type: Output },],
};
function OrganizationComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
OrganizationComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
OrganizationComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
OrganizationComponent.propDecorators;
/** @type {?} */
OrganizationComponent.prototype.hasFilter;
/** @type {?} */
OrganizationComponent.prototype.hasButtons;
/** @type {?} */
OrganizationComponent.prototype.editable;
/** @type {?} */
OrganizationComponent.prototype.multiple;
/** @type {?} */
OrganizationComponent.prototype.saveable;
/** @type {?} */
OrganizationComponent.prototype.expandible;
/** @type {?} */
OrganizationComponent.prototype.collapsable;
/** @type {?} */
OrganizationComponent.prototype.nodes;
/** @type {?} */
OrganizationComponent.prototype.extraFields;
/** @type {?} */
OrganizationComponent.prototype.updater;
/** @type {?} */
OrganizationComponent.prototype.nextId;
/** @type {?} */
OrganizationComponent.prototype.actionMapping;
/** @type {?} */
OrganizationComponent.prototype.customTemplateStringOptions;
/** @type {?} */
OrganizationComponent.prototype.editProfesion;
/** @type {?} */
OrganizationComponent.prototype.dialog;
/** @type {?} */
OrganizationComponent.prototype.loadingService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb3ZhbGVudC9keW5hbWljLWZvcm1zLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9vcmdhbml6YXRpb24vb3JnYW5pemF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBdUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTJCLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBVyxZQUFZLEVBQXVCLE1BQU0sd0JBQXdCLENBQUM7QUFDcEYsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBMEM5RyxNQUFNOzs7OztJQW9ETCxZQUFvQixNQUFpQixFQUFVLGNBQWlDO1FBQTVELFdBQU0sR0FBTixNQUFNLENBQVc7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7eUJBbERsRCxLQUFLOzBCQUNKLEtBQUs7d0JBQ1AsS0FBSzt3QkFDTCxLQUFLO3dCQUVMLElBQUk7MEJBQ0YsSUFBSTsyQkFDSCxJQUFJO3FCQUVaLEVBQUU7MkJBRU8sRUFBRTt1QkFFTSxJQUFJLFlBQVksRUFBUztzQkFFakQsQ0FBQzs2QkFFYztZQUMvQixLQUFLLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUMxQjtpQkFDRDtnQkFDRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFF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QjtnQkFDakMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1DVjtnQkFDQSxNQUFNLEVBQUUsQ0FBQyxxUUFBcVEsQ0FBQzthQUMvUTs7OztZQTVDTyxTQUFTO1lBRVIsZ0JBQWdCOzs7MEJBNkN2QixLQUFLOzJCQUNMLEtBQUs7eUJBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUVMLEtBQUs7MkJBQ0wsS0FBSzs0QkFDTCxLQUFLO3NCQUVMLEtBQUs7NEJBRUwsS0FBSzt3QkFFTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUcmVlTm9kZSwgVFJFRV9BQ1RJT05TLCBLRVlTLCBJQWN0aW9uTWFwcGluZ30gZnJvbSAnYW5ndWxhci10cmVlLWNvbXBvbmVudCc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5pbXBvcnQgeyBUZExvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnQGNvdmFsZW50L2NvcmUvbG9hZGluZyc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3Mvb3JnYW5pemF0aW9uLWRpYWxvZy9vcmdhbml6YXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvdmFsZW50LW9yZ2FuaXphdGlvbicsXHJcblx0dGVtcGxhdGU6IGA8Zm9ybSAqbmdJZj1cImhhc0ZpbHRlclwiPlxyXG5cdDxtYXQtZm9ybS1maWVsZCBmeEZsZXg+XHJcblx0XHQ8aW5wdXQgbWF0SW5wdXQgI2ZpbHRlciBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG5cdFx0XHQoa2V5dXApPVwiZmlsdGVyTm9kZXMoZmlsdGVyLnZhbHVlLCB0cmVlKVwiIHBsYWNlaG9sZGVyPVwie3snYXBwLm9yZ2FuaXphdGlvbi5maWx0ZXInIHwgdHJhbnNsYXRlfX1cIj5cclxuXHQ8L21hdC1mb3JtLWZpZWxkPlxyXG48L2Zvcm0+XHJcbjxkaXYgY2xhc3M9XCJ3cmFwXCI+XHJcblx0PHRyZWUtcm9vdCAjdHJlZSBbbm9kZXNdPVwibm9kZXNcIiBbb3B0aW9uc109XCJjdXN0b21UZW1wbGF0ZVN0cmluZ09wdGlvbnNcIiBmb2N1c2VkPVwidHJ1ZVwiPlxyXG5cdFx0PG5nLXRlbXBsYXRlICN0cmVlTm9kZVRlbXBsYXRlIGxldC1ub2RlPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIiFub2RlLmRhdGEuZWRpdGluZ1wiIFtjbGFzcy5yb290LW5vZGVdPVwibm9kZS5pc1Jvb3RcIiB0aXRsZT1cInt7bm9kZS5kYXRhLm5hbWV9fVwiPnt7IG5vZGUuZGF0YS5uYW1lIH19PC9zcGFuPlxyXG5cdFx0XHQ8bWF0LWljb24gKm5nSWY9XCIhbm9kZS5kYXRhLmVkaXRpbmcgJiYgIW5vZGUuaXNSb290ICYmIGVkaXRhYmxlXCIgY2xhc3M9XCJ0cmVlLWljb25cIiAoY2xpY2spPVwiZWRpdE5vZGUodHJlZS50cmVlTW9kZWwsbm9kZSlcIj5lZGl0PC9tYXQtaWNvbj5cclxuXHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiIW5vZGUuZGF0YS5lZGl0aW5nICYmICFub2RlLmlzUm9vdCAmJiBlZGl0YWJsZVwiIGNsYXNzPVwidHJlZS1pY29uXCIgKGNsaWNrKT1cImRlbGV0ZU5vZGUodHJlZSxub2RlKVwiPmRlbGV0ZTwvbWF0LWljb24+XHJcblx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIm5vZGUuZGF0YS5lZGl0aW5nXCIgZnhGbGV4PlxyXG5cdFx0XHRcdDxpbnB1dCBhdXRvY29tcGxldGU9XCJvZmZcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cIm5vZGUuZGF0YS5uYW1lXCIgKGNoYW5nZSk9XCJmaW5pc2hOYW1lKG5vZGUpXCIgPlxyXG5cdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RlbXBsYXRlPnt7J2FwcC5vcmdhbml6YXRpb24ubG9hZGluZycgfCB0cmFuc2xhdGV9fTwvbmctdGVtcGxhdGU+XHJcblx0PC90cmVlLXJvb3Q+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImhhc0J1dHRvbnNcIj5cclxuXHQ8YnI+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImVkaXRhYmxlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZE5vZGUodHJlZSlcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uYWRkJyB8IHRyYW5zbGF0ZX19XHJcblx0PC9idXR0b24+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImV4cGFuZGlibGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwidHJlZS50cmVlTW9kZWwuZXhwYW5kQWxsKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uZXhwYW5kJyB8IHRyYW5zbGF0ZX19XHJcblx0PC9idXR0b24+XHJcblx0PGJ1dHRvbiAqbmdJZj1cImNvbGxhcHNhYmxlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInRyZWUudHJlZU1vZGVsLmNvbGxhcHNlQWxsKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uY29sbGFwc2UnIHwgdHJhbnNsYXRlfX1cclxuXHQ8L2J1dHRvbj5cclxuXHQ8YnV0dG9uICpuZ0lmPVwiZWRpdGFibGUgJiYgc2F2ZWFibGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIChjbGljayk9XCJzYXZlKClcIj5cclxuXHRcdHt7J2FwcC5vcmdhbml6YXRpb24uc2F2ZScgfCB0cmFuc2xhdGV9fVxyXG5cdDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuYCxcclxuXHRzdHlsZXM6IFtgOmhvc3QgLndyYXB7aGVpZ2h0OjQwMHB4O21heC13aWR0aDozMDBweDttaW4td2lkdGg6MjUwcHg7cG9zaXRpb246cmVsYXRpdmV9Omhvc3QgYnV0dG9uW21hdC1yYWlzZWQtYnV0dG9uXXttYXJnaW4tcmlnaHQ6NXB4O21hcmdpbi1ib3R0b206MTBweH0ubm9kZS1jb250ZW50LXdyYXBwZXJ7bGluZS1oZWlnaHQ6MzdweH0udHJlZS1pY29ue21hcmdpbi1sZWZ0OjEwcHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5yb290LW5vZGV7Zm9udC13ZWlnaHQ6NzAwfWBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuXHRASW5wdXQoKSBoYXNGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBoYXNCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcblx0QElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKSBzYXZlYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgZXhwYW5kaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcblx0QElucHV0KCkgY29sbGFwc2FibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRASW5wdXQoKSBub2RlczogYW55W10gPSBbXTtcclxuXHJcblx0QElucHV0KCkgZXh0cmFGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdEBPdXRwdXQoKSB1cGRhdGVyOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcblx0bmV4dElkOiBudW1iZXIgPSAxO1xyXG5cclxuXHRhY3Rpb25NYXBwaW5nOiBJQWN0aW9uTWFwcGluZyA9IHtcclxuXHRcdG1vdXNlOiB7XHJcblx0XHRcdGRibENsaWNrOiAodHJlZSwgbm9kZSwgZXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5lZGl0YWJsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5lZGl0Tm9kZSh0cmVlLCBub2RlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdGNsaWNrOiAodHJlZSwgbm9kZSwgZXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5tdWx0aXBsZSkge1xyXG5cdFx0XHRcdFx0ZXZlbnQuY3RybEtleSA/IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFX01VTFRJKHRyZWUsIG5vZGUsIGV2ZW50KSA6IFRSRUVfQUNUSU9OUy5UT0dHTEVfQUNUSVZFKHRyZWUsIG5vZGUsIGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0XHRUUkVFX0FDVElPTlMuVE9HR0xFX0FDVElWRSh0cmVlLCBub2RlLCBldmVudCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdGN1c3RvbVRlbXBsYXRlU3RyaW5nT3B0aW9ucyA9IHtcclxuXHRcdGlzRXhwYW5kZWRGaWVsZDogJ2V4cGFuZGVkJyxcclxuXHRcdGlkRmllbGQ6ICdpZCcsXHJcblx0XHRhY3Rpb25NYXBwaW5nOiB0aGlzLmFjdGlvbk1hcHBpbmcsXHJcblx0XHRub2RlSGVpZ2h0OiA0MCxcclxuXHRcdGFsbG93RHJhZzogKG5vZGUpID0+IHtcclxuICAgICAgXHRcdHJldHVybiAhbm9kZS5kYXRhLmVkaXRpbmc7XHJcbiAgICBcdH0sXHJcbiAgICBcdGFsbG93RHJvcDogKG5vZGUpID0+IHtcclxuICAgICAgXHRcdHJldHVybiAhbm9kZS5kYXRhLmVkaXRpbmc7XHJcbiAgICBcdH0sXHJcblx0XHR1c2VWaXJ0dWFsU2Nyb2xsOiB0cnVlXHJcblx0fTtcclxuXHJcblx0Y29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBsb2FkaW5nU2VydmljZSA6IFRkTG9hZGluZ1NlcnZpY2UpIHtcclxuXHJcblx0fVxyXG5cclxuXHRuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAgICAgaWYgKGNoYW5nZXMubm9kZXMgJiYgIWNoYW5nZXMubm9kZXMuaXNGaXJzdENoYW5nZSgpKSB7XHJcblx0XHRcdHRoaXMubmV4dElkID0gdGhpcy5nZXROZXh0SWQoKTtcclxuXHRcdH1cclxuXHJcbiAgICB9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5uZXh0SWQgPSB0aGlzLmdldE5leHRJZCgpO1xyXG5cdH1cclxuXHJcblx0Z2V0TmV4dElkKCkgOiBudW1iZXIge1xyXG5cclxuXHRcdGxldCBtYXhJZCA9IDA7XHJcblxyXG5cdFx0bGV0IG9wZW5Ob2RlcyA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgbm9kZSBvZiB0aGlzLm5vZGVzKSB7XHJcblx0XHRcdG9wZW5Ob2Rlcy5wdXNoKG5vZGUpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHdoaWxlIChvcGVuTm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRsZXQgY3VycmVudE5vZGUgPSBvcGVuTm9kZXMucG9wKCk7XHJcblxyXG5cdFx0XHRtYXhJZCA9IE1hdGgubWF4KG1heElkLGN1cnJlbnROb2RlLmlkKTtcclxuXHRcdFx0Zm9yIChsZXQgY2hpbGQgb2YgY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuXHRcdFx0XHRvcGVuTm9kZXMucHVzaChjaGlsZCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbWF4SWQgKyAxO1xyXG5cdH1cclxuXHJcblx0ZmluaXNoTmFtZShub2RlKSB7XHJcblx0XHRub2RlLmRhdGEuZWRpdGluZyA9IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0YWRkTm9kZSh0cmVlKSB7XHJcblx0XHRsZXQgZm9jdXNlZCA9IHRyZWUudHJlZU1vZGVsLmdldEZvY3VzZWROb2RlKCk7XHJcblx0XHRsZXQgY2hpbGQ6IGFueSA9IGZhbHNlO1xyXG5cdFx0aWYgKHRoaXMubm9kZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRjaGlsZCA9IHRoaXMubm9kZXNbMF07XHJcblx0XHR9XHJcblx0XHRpZiAoZm9jdXNlZCkge1xyXG5cdFx0XHRjaGlsZCA9IGZvY3VzZWQuZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgbmV3Tm9kZSA9IHtcclxuXHRcdFx0aWQ6IHRoaXMubmV4dElkLFxyXG5cdFx0XHRuYW1lOiAnTnVldm8gbm9kbycsXHJcblx0XHRcdGNoaWxkcmVuOiBbXSxcclxuXHRcdFx0ZXhwYW5kZWQ6IGZhbHNlLFxyXG5cdFx0XHRyZXNpZGVudGU6IGZhbHNlXHJcblx0XHR9O1xyXG5cdFx0dGhpcy5uZXh0SWQrKztcclxuXHJcblx0XHRpZiAoY2hpbGQpIHtcclxuXHRcdFx0Y2hpbGQuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHR0aGlzLm5vZGVzLnB1c2gobmV3Tm9kZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudXBkYXRlcikge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZXIuZW1pdCh0aGlzLm5vZGVzKTtcclxuXHRcdH1cclxuXHJcblx0XHR0cmVlLnRyZWVNb2RlbC51cGRhdGUoKTtcclxuXHR9XHJcblxyXG5cdGZpbHRlck5vZGVzKHRleHQsIHRyZWUpIHtcclxuXHRcdHRyZWUudHJlZU1vZGVsLmZpbHRlck5vZGVzKHRleHQpO1xyXG5cdH1cclxuXHJcblx0ZWRpdE5vZGUodHJlZU1vZGVsLCBub2RlKSB7XHJcblx0XHR0aGlzLmVkaXRQcm9mZXNpb24obm9kZS5kYXRhKS50aGVuKCByZXMgPT4ge1xyXG5cdFx0XHRmb3IgKGxldCBmaWVsZCBpbiByZXMpIHtcclxuXHRcdFx0XHRub2RlLmRhdGFbZmllbGRdID0gcmVzW2ZpZWxkXTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0cmVlTW9kZWwudXBkYXRlKCk7XHJcblx0XHR9KS5jYXRjaCggZXJyID0+IHtcclxuXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHRlZGl0UHJvZmVzaW9uID0gKHZhbHVlOiBhbnkpID0+IHtcclxuXHRcdGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE9yZ2FuaXphdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG5cdFx0XHRwYW5lbENsYXNzOiAnb3JnYW5pemF0aW9uLW1vZGFsJyxcclxuXHRcdFx0ZGF0YToge1xyXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZSxcclxuXHRcdFx0XHRleHRyYUZpZWxkczogdGhpcy5leHRyYUZpZWxkc1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcblx0fTtcclxuXHJcblx0ZGVsZXRlTm9kZSh0cmVlLCBub2RlKSB7XHJcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdGxldCBzaWJsaW5ncyA6IGFueVtdID0gbm9kZS5wYXJlbnQuZGF0YS5jaGlsZHJlbjtcclxuXHRcdG5vZGUucGFyZW50LmRhdGEuY2hpbGRyZW4gPSBzaWJsaW5ncy5maWx0ZXIgKCB4ID0+IHguaWQgIT0gbm9kZS5kYXRhLmlkKTtcclxuXHJcblx0XHRpZiAodGhpcy51cGRhdGVyKSB7XHJcblx0XHRcdHRoaXMudXBkYXRlci5lbWl0KHRoaXMubm9kZXMpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyZWUudHJlZU1vZGVsLnVwZGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c2F2ZSgpIHtcclxuXHRcdGlmICh0aGlzLnVwZGF0ZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVyLmVtaXQodGhpcy5ub2Rlcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxufVxyXG4iXX0=