@bimeister/pupakit.tree
Version:
PupaKit Tree
161 lines • 26.1 kB
JavaScript
import { Injectable } from '@angular/core';
import '@bimeister/pupakit.common';
import { getClampedValue, isNil } from '@bimeister/utilities';
import { BehaviorSubject, Subject, timer } from 'rxjs';
import { take, withLatestFrom } from 'rxjs/operators';
import '../interfaces/drop-event.interface';
import './flat-tree-item.class';
import * as i0 from "@angular/core";
export class TreeDragAndDropControl {
constructor() {
this.draggingHasStarted$ = new BehaviorSubject(false);
this.droppedSubject$ = new Subject();
this.draggableNode$ = new BehaviorSubject(null);
this.scrollDirection$ = new BehaviorSubject(null);
this.expandNodeWithDelay$ = new Subject();
this.hasDragAndDrop$ = new BehaviorSubject(false);
this.mouseDownPosition = null;
this.draggableElementBoundingBox = null;
this.draggableExpandableDescendants = [];
}
setHostAndRenderer(host, renderer) {
this.host = host;
this.renderer = renderer;
}
setHasDragAndDrop(hasDragAndDrop) {
this.hasDragAndDrop$.next(hasDragAndDrop);
}
mouseDown(treeNode, event) {
this.hasDragAndDrop$.pipe(take(1)).subscribe((hasDragAndDrop) => {
if (!hasDragAndDrop) {
return;
}
this.draggableNode$.next(treeNode);
this.mouseDownPosition = {
left: event.screenX,
top: event.screenY,
};
if (event.target instanceof HTMLElement) {
this.draggableElementBoundingBox = event.target.getBoundingClientRect();
}
});
}
mouseMove({ screenX, screenY }, draggableElement, data$) {
if (isNil(this.mouseDownPosition)) {
return;
}
this.draggingHasStarted$.pipe(take(1)).subscribe((draggingHasStarted) => {
const dragDistanceSqr = Math.pow(this.mouseDownPosition.left - screenX, 2) + Math.pow(this.mouseDownPosition.top - screenY, 2);
const druggingMustBeStarted = dragDistanceSqr > this.draggableElementBoundingBox?.height / 2;
if (!draggingHasStarted && druggingMustBeStarted) {
this.startDragging(draggableElement, data$);
this.draggingHasStarted$.next(true);
this.updateDraggablePosition(screenX, screenY, draggableElement);
}
if (draggingHasStarted) {
this.updateDraggablePosition(screenX, screenY, draggableElement);
}
});
}
mouseUp() {
this.draggingHasStarted$
.pipe(take(1), withLatestFrom(this.draggableNode$))
.subscribe(([draggingHasStarted, draggableNode]) => {
if (draggingHasStarted && !isNil(this.dropNode)) {
this.droppedSubject$.next({
draggedElement: draggableNode,
droppedElement: this.dropNode,
});
}
this.draggingHasStarted$.next(false);
this.draggableNode$.next(null);
this.dropNode = null;
this.mouseDownPosition = null;
this.draggableElementBoundingBox = null;
this.scrollDirection$.next(null);
this.draggableExpandableDescendants = [];
});
}
mouseEnter(node) {
this.draggingHasStarted$.pipe(take(1)).subscribe((draggingHasStarted) => {
if (!draggingHasStarted) {
return;
}
if (!node.isElement) {
this.dropNode = node;
}
if (this.canDrop(node)) {
this.expandNodeWithDelay$.next(node);
}
});
}
canDrop(node) {
if (isNil(node)) {
return false;
}
return node.isExpandable && !this.draggableExpandableDescendants.includes(node.id);
}
mouseLeave() {
this.draggingHasStarted$.pipe(take(1)).subscribe((draggingHasStarted) => {
if (!draggingHasStarted) {
return;
}
this.dropNode = null;
this.expandNodeWithDelay$.next(null);
});
}
startDragging(draggableElement, data$) {
this.setupWidthForDraggableElement(draggableElement);
this.setupDraggableExpandableDescendants(data$);
}
setupWidthForDraggableElement(draggableElement) {
timer(0)
.pipe(take(1))
.subscribe(() => {
this.renderer.setStyle(draggableElement.nativeElement, 'width', `${this.draggableElementBoundingBox.width}px`);
});
}
setupDraggableExpandableDescendants(data$) {
data$
.pipe(take(1), withLatestFrom(this.draggableNode$))
.subscribe(([treeItems, draggableNode]) => {
const targetLevel = draggableNode?.level ?? 0;
let currentIndex = treeItems.findIndex((dataPoint) => dataPoint.id === draggableNode?.id) + 1;
const endOfListNotReached = () => treeItems.length !== currentIndex;
const targetLevelNotReached = () => treeItems[currentIndex].level !== targetLevel;
const result = [draggableNode?.id];
while (endOfListNotReached() && targetLevelNotReached()) {
const currentNode = treeItems[currentIndex];
if (currentNode.isExpandable) {
result.push(currentNode.id);
}
currentIndex++;
}
this.draggableExpandableDescendants = result;
});
}
updateDraggablePosition(screenX, screenY, draggableElement) {
const draggableElementPositionShift = {
left: this.mouseDownPosition.left - this.draggableElementBoundingBox.left,
top: this.mouseDownPosition.top - this.draggableElementBoundingBox.top,
};
const bottomBorderPositionY = this.host.nativeElement.clientHeight - this.draggableElementBoundingBox.height;
const draggableElementPosition = {
left: screenX - this.draggableElementBoundingBox.left - draggableElementPositionShift.left,
top: getClampedValue(screenY - draggableElementPositionShift.top, 0, bottomBorderPositionY),
};
const isTopBorderReached = draggableElementPosition.top <= this.draggableElementBoundingBox.height;
const isBottomBorderReached = draggableElementPosition.top >= bottomBorderPositionY;
this.scrollDirection$.next(isTopBorderReached ? 'up' : isBottomBorderReached ? 'down' : null);
if (!isNil(draggableElement)) {
this.renderer.setStyle(draggableElement.nativeElement, 'left', `${draggableElementPosition.left}px`);
this.renderer.setStyle(draggableElement.nativeElement, 'top', `${draggableElementPosition.top}px`);
}
}
}
TreeDragAndDropControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TreeDragAndDropControl, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
TreeDragAndDropControl.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TreeDragAndDropControl });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TreeDragAndDropControl, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLWFuZC1kcm9wLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY2xhcmF0aW9ucy9jbGFzc2VzL3RyZWUtZHJhZy1hbmQtZHJvcC5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQXFCLDJCQUEyQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFZLE1BQU0sc0JBQXNCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBbUMsb0NBQW9DLENBQUM7QUFDeEUsT0FBNkIsd0JBQXdCLENBQUM7O0FBV3RELE1BQU0sT0FBTyxzQkFBc0I7SUFEbkM7UUFFa0Isd0JBQW1CLEdBQTZCLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3BGLG9CQUFlLEdBQThDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0UsbUJBQWMsR0FBNEMsSUFBSSxlQUFlLENBQzNGLElBQUksQ0FDTCxDQUFDO1FBQ2MscUJBQWdCLEdBQTZDLElBQUksZUFBZSxDQUU5RixJQUFJLENBQUMsQ0FBQztRQUNRLHlCQUFvQixHQUFpQyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztRQUV2RixvQkFBZSxHQUE2QixJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUloRixzQkFBaUIsR0FBb0IsSUFBSSxDQUFDO1FBRTFDLGdDQUEyQixHQUFtQixJQUFJLENBQUM7UUFDbkQsbUNBQThCLEdBQVcsRUFBRSxDQUFDO0tBMktyRDtJQXZLUSxrQkFBa0IsQ0FBQyxJQUE2QixFQUFFLFFBQW1CO1FBQzFFLElBQUksQ0FBQyxJQUFJLEdB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QUF3QixHQUFhO1lBQ3pDLElBQUksRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksR0FBRyw2QkFBNkIsQ0FBQyxJQUFJO1lBQzFGLEdBQUcsRUFBRSxlQUFlLENBQUMsT0FBTyxHQUFHLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUscUJBQXFCLENBQUM7U0FDNUYsQ0FBQztRQUVGLE1BQU0sa0JBQWtCLEdBQVksd0JBQXdCLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUM7UUFDNUcsTUFBTSxxQkFBcUIsR0FBWSx3QkFBd0IsQ0FBQyxHQUFHLElBQUkscUJBQXFCLENBQUM7UUFFN0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5RixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLHdCQUF3QixDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDcEc7SUFDSCxDQUFDOztvSEE1TFUsc0JBQXNCO3dIQUF0QixzQkFBc0I7NEZBQXRCLHNCQUFzQjtrQkFEbEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXVpZCB9IGZyb20gJ0BiaW1laXN0ZXIvcHVwYWtpdC5jb21tb24nO1xuaW1wb3J0IHsgZ2V0Q2xhbXBlZFZhbHVlLCBpc05pbCwgTnVsbGFibGUgfSBmcm9tICdAYmltZWlzdGVyL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERyb3BFdmVudEludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZHJvcC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmxhdFRyZWVJdGVtIH0gZnJvbSAnLi9mbGF0LXRyZWUtaXRlbS5jbGFzcyc7XG5cbmludGVyZmFjZSBQb3NpdGlvbiB7XG4gIHRvcDogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRyZWVEcmFnQW5kRHJvcENvbnRyb2wge1xuICBwdWJsaWMgcmVhZG9ubHkgZHJhZ2dpbmdIYXNTdGFydGVkJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBkcm9wcGVkU3ViamVjdCQ6IFN1YmplY3Q8RHJvcEV2ZW50SW50ZXJmYWNlPEZsYXRUcmVlSXRlbT4+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHVibGljIHJlYWRvbmx5IGRyYWdnYWJsZU5vZGUkOiBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8RmxhdFRyZWVJdGVtPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPEZsYXRUcmVlSXRlbT4+KFxuICAgIG51bGxcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IHNjcm9sbERpcmVjdGlvbiQ6IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTwndXAnIHwgJ2Rvd24nPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIE51bGxhYmxlPCd1cCcgfCAnZG93bic+XG4gID4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBleHBhbmROb2RlV2l0aERlbGF5JDogU3ViamVjdDxGbGF0VHJlZUl0ZW0gfCBudWxsPiA9IG5ldyBTdWJqZWN0PEZsYXRUcmVlSXRlbSB8IG51bGw+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYXNEcmFnQW5kRHJvcCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICAvKiogQGRlcHJlY2F0ZWQgbXV0YWJsZSBvYmplY3QgKi9cbiAgcHJpdmF0ZSBkcm9wTm9kZTogRmxhdFRyZWVJdGVtIHwgbnVsbDtcbiAgLyoqIEBkZXByZWNhdGVkIG11dGFibGUgb2JqZWN0ICovXG4gIHByaXZhdGUgbW91c2VEb3duUG9zaXRpb246IFBvc2l0aW9uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBAZGVwcmVjYXRlZCBtdXRhYmxlIG9iamVjdCAqL1xuICBwcml2YXRlIGRyYWdnYWJsZUVsZW1lbnRCb3VuZGluZ0JveDogRE9NUmVjdCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdnYWJsZUV4cGFuZGFibGVEZXNjZW5kYW50czogVXVpZFtdID0gW107XG4gIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMjtcbiAgcHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwdWJsaWMgc2V0SG9zdEFuZFJlbmRlcmVyKGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LCByZW5kZXJlcjogUmVuZGVyZXIyKTogdm9pZCB7XG4gICAgdGhpcy5ob3N0ID0gaG9zdDtcbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gIH1cblxuICBwdWJsaWMgc2V0SGFzRHJhZ0FuZERyb3AoaGFzRHJhZ0FuZERyb3A6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmhhc0RyYWdBbmREcm9wJC5uZXh0KGhhc0RyYWdBbmREcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VzZURvd24odHJlZU5vZGU6IEZsYXRUcmVlSXRlbSwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmhhc0RyYWdBbmREcm9wJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoaGFzRHJhZ0FuZERyb3A6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghaGFzRHJhZ0FuZERyb3ApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRyYWdnYWJsZU5vZGUkLm5leHQodHJlZU5vZGUpO1xuICAgICAgdGhpcy5tb3VzZURvd25Qb3NpdGlvbiA9IHtcbiAgICAgICAgbGVmdDogZXZlbnQuc2NyZWVuWCxcbiAgICAgICAgdG9wOiBldmVudC5zY3JlZW5ZLFxuICAgICAgfTtcbiAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZUVsZW1lbnRCb3VuZGluZ0JveCA9IGV2ZW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VzZU1vdmUoXG4gICAgeyBzY3JlZW5YLCBzY3JlZW5ZIH06IE1vdXNlRXZlbnQsXG4gICAgZHJhZ2dhYmxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgZGF0YSQ6IE9ic2VydmFibGU8RmxhdFRyZWVJdGVtW10+XG4gICk6IHZvaWQge1xuICAgIGlmIChpc05pbCh0aGlzLm1vdXNlRG93blBvc2l0aW9uKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ2dpbmdIYXNTdGFydGVkJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoZHJhZ2dpbmdIYXNTdGFydGVkOiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBkcmFnRGlzdGFuY2VTcXI6IG51bWJlciA9XG4gICAgICAgIE1hdGgucG93KHRoaXMubW91c2VEb3duUG9zaXRpb24ubGVmdCAtIHNjcmVlblgsIDIpICsgTWF0aC5wb3codGhpcy5tb3VzZURvd25Qb3NpdGlvbi50b3AgLSBzY3JlZW5ZLCAyKTtcblxuICAgICAgY29uc3QgZHJ1Z2dpbmdNdXN0QmVTdGFydGVkOiBib29sZWFuID0gZHJhZ0Rpc3RhbmNlU3FyID4gdGhpcy5kcmFnZ2FibGVFbGVtZW50Qm91bmRpbmdCb3g/LmhlaWdodCAvIDI7XG4gICAgICBpZiAoIWRyYWdnaW5nSGFzU3RhcnRlZCAmJiBkcnVnZ2luZ011c3RCZVN0YXJ0ZWQpIHtcbiAgICAgICAgdGhpcy5zdGFydERyYWdnaW5nKGRyYWdnYWJsZUVsZW1lbnQsIGRhdGEkKTtcbiAgICAgICAgdGhpcy5kcmFnZ2luZ0hhc1N0YXJ0ZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlRHJhZ2dhYmxlUG9zaXRpb24oc2NyZWVuWCwgc2NyZWVuWSwgZHJhZ2dhYmxlRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkcmFnZ2luZ0hhc1N0YXJ0ZWQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVEcmFnZ2FibGVQb3NpdGlvbihzY3JlZW5YLCBzY3JlZW5ZLCBkcmFnZ2FibGVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3VzZVVwKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dpbmdIYXNTdGFydGVkJFxuICAgICAgLnBpcGUodGFrZSgxKSwgd2l0aExhdGVzdEZyb20odGhpcy5kcmFnZ2FibGVOb2RlJCkpXG4gICAgICAuc3Vic2NyaWJlKChbZHJhZ2dpbmdIYXNTdGFydGVkLCBkcmFnZ2FibGVOb2RlXTogW2Jvb2xlYW4sIEZsYXRUcmVlSXRlbV0pID0+IHtcbiAgICAgICAgaWYgKGRyYWdnaW5nSGFzU3RhcnRlZCAmJiAhaXNOaWwodGhpcy5kcm9wTm9kZSkpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRTdWJqZWN0JC5uZXh0KHtcbiAgICAgICAgICAgIGRyYWdnZWRFbGVtZW50OiBkcmFnZ2FibGVOb2RlLFxuICAgICAgICAgICAgZHJvcHBlZEVsZW1lbnQ6IHRoaXMuZHJvcE5vZGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyYWdnaW5nSGFzU3RhcnRlZCQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlTm9kZSQubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5kcm9wTm9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMubW91c2VEb3duUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmRyYWdnYWJsZUVsZW1lbnRCb3VuZGluZ0JveCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aW9uJC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmRyYWdnYWJsZUV4cGFuZGFibGVEZXNjZW5kYW50cyA9IFtdO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW91c2VFbnRlcihub2RlOiBGbGF0VHJlZUl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdnaW5nSGFzU3RhcnRlZCQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGRyYWdnaW5nSGFzU3RhcnRlZDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKCFkcmFnZ2luZ0hhc1N0YXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5vZGUuaXNFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZHJvcE5vZGUgPSBub2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jYW5Ecm9wKG5vZGUpKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kTm9kZVdpdGhEZWxheSQubmV4dChub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5Ecm9wKG5vZGU6IEZsYXRUcmVlSXRlbSk6IGJvb2xlYW4ge1xuICAgIGlmIChpc05pbChub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5pc0V4cGFuZGFibGUgJiYgIXRoaXMuZHJhZ2dhYmxlRXhwYW5kYWJsZURlc2NlbmRhbnRzLmluY2x1ZGVzKG5vZGUuaWQpO1xuICB9XG5cbiAgcHVibGljIG1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZ0hhc1N0YXJ0ZWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChkcmFnZ2luZ0hhc1N0YXJ0ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghZHJhZ2dpbmdIYXNTdGFydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kcm9wTm9kZSA9IG51bGw7XG4gICAgICB0aGlzLmV4cGFuZE5vZGVXaXRoRGVsYXkkLm5leHQobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhZ2dpbmcoZHJhZ2dhYmxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIGRhdGEkOiBPYnNlcnZhYmxlPEZsYXRUcmVlSXRlbVtdPik6IHZvaWQge1xuICAgIHRoaXMuc2V0dXBXaWR0aEZvckRyYWdnYWJsZUVsZW1lbnQoZHJhZ2dhYmxlRWxlbWVudCk7XG4gICAgdGhpcy5zZXR1cERyYWdnYWJsZUV4cGFuZGFibGVEZXNjZW5kYW50cyhkYXRhJCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwV2lkdGhGb3JEcmFnZ2FibGVFbGVtZW50KGRyYWdnYWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTogdm9pZCB7XG4gICAgdGltZXIoMClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkcmFnZ2FibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd3aWR0aCcsIGAke3RoaXMuZHJhZ2dhYmxlRWxlbWVudEJvdW5kaW5nQm94LndpZHRofXB4YCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBEcmFnZ2FibGVFeHBhbmRhYmxlRGVzY2VuZGFudHMoZGF0YSQ6IE9ic2VydmFibGU8RmxhdFRyZWVJdGVtW10+KTogdm9pZCB7XG4gICAgZGF0YSRcbiAgICAgIC5waXBlKHRha2UoMSksIHdpdGhMYXRlc3RGcm9tKHRoaXMuZHJhZ2dhYmxlTm9kZSQpKVxuICAgICAgLnN1YnNjcmliZSgoW3RyZWVJdGVtcywgZHJhZ2dhYmxlTm9kZV06IFtGbGF0VHJlZUl0ZW1bXSwgRmxhdFRyZWVJdGVtXSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRMZXZlbDogbnVtYmVyID0gZHJhZ2dhYmxlTm9kZT8ubGV2ZWwgPz8gMDtcblxuICAgICAgICBsZXQgY3VycmVudEluZGV4OiBudW1iZXIgPVxuICAgICAgICAgIHRyZWVJdGVtcy5maW5kSW5kZXgoKGRhdGFQb2ludDogRmxhdFRyZWVJdGVtKSA9PiBkYXRhUG9pbnQuaWQgPT09IGRyYWdnYWJsZU5vZGU/LmlkKSArIDE7XG4gICAgICAgIGNvbnN0IGVuZE9mTGlzdE5vdFJlYWNoZWQgPSAoKTogYm9vbGVhbiA9PiB0cmVlSXRlbXMubGVuZ3RoICE9PSBjdXJyZW50SW5kZXg7XG4gICAgICAgIGNvbnN0IHRhcmdldExldmVsTm90UmVhY2hlZCA9ICgpOiBib29sZWFuID0+IHRyZWVJdGVtc1tjdXJyZW50SW5kZXhdLmxldmVsICE9PSB0YXJnZXRMZXZlbDtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBVdWlkW10gPSBbZHJhZ2dhYmxlTm9kZT8uaWRdO1xuXG4gICAgICAgIHdoaWxlIChlbmRPZkxpc3ROb3RSZWFjaGVkKCkgJiYgdGFyZ2V0TGV2ZWxOb3RSZWFjaGVkKCkpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZTogRmxhdFRyZWVJdGVtID0gdHJlZUl0ZW1zW2N1cnJlbnRJbmRleF07XG4gICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmlzRXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VycmVudE5vZGUuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlRXhwYW5kYWJsZURlc2NlbmRhbnRzID0gcmVzdWx0O1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURyYWdnYWJsZVBvc2l0aW9uKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyLCBkcmFnZ2FibGVFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik6IHZvaWQge1xuICAgIGNvbnN0IGRyYWdnYWJsZUVsZW1lbnRQb3NpdGlvblNoaWZ0OiBQb3NpdGlvbiA9IHtcbiAgICAgIGxlZnQ6IHRoaXMubW91c2VEb3duUG9zaXRpb24ubGVmdCAtIHRoaXMuZHJhZ2dhYmxlRWxlbWVudEJvdW5kaW5nQm94LmxlZnQsXG4gICAgICB0b3A6IHRoaXMubW91c2VEb3duUG9zaXRpb24udG9wIC0gdGhpcy5kcmFnZ2FibGVFbGVtZW50Qm91bmRpbmdCb3gudG9wLFxuICAgIH07XG5cbiAgICBjb25zdCBib3R0b21Cb3JkZXJQb3NpdGlvblk6IG51bWJlciA9XG4gICAgICB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgLSB0aGlzLmRyYWdnYWJsZUVsZW1lbnRCb3VuZGluZ0JveC5oZWlnaHQ7XG4gICAgY29uc3QgZHJhZ2dhYmxlRWxlbWVudFBvc2l0aW9uOiBQb3NpdGlvbiA9IHtcbiAgICAgIGxlZnQ6IHNjcmVlblggLSB0aGlzLmRyYWdnYWJsZUVsZW1lbnRCb3VuZGluZ0JveC5sZWZ0IC0gZHJhZ2dhYmxlRWxlbWVudFBvc2l0aW9uU2hpZnQubGVmdCxcbiAgICAgIHRvcDogZ2V0Q2xhbXBlZFZhbHVlKHNjcmVlblkgLSBkcmFnZ2FibGVFbGVtZW50UG9zaXRpb25TaGlmdC50b3AsIDAsIGJvdHRvbUJvcmRlclBvc2l0aW9uWSksXG4gICAgfTtcblxuICAgIGNvbnN0IGlzVG9wQm9yZGVyUmVhY2hlZDogYm9vbGVhbiA9IGRyYWdnYWJsZUVsZW1lbnRQb3NpdGlvbi50b3AgPD0gdGhpcy5kcmFnZ2FibGVFbGVtZW50Qm91bmRpbmdCb3guaGVpZ2h0O1xuICAgIGNvbnN0IGlzQm90dG9tQm9yZGVyUmVhY2hlZDogYm9vbGVhbiA9IGRyYWdnYWJsZUVsZW1lbnRQb3NpdGlvbi50b3AgPj0gYm90dG9tQm9yZGVyUG9zaXRpb25ZO1xuXG4gICAgdGhpcy5zY3JvbGxEaXJlY3Rpb24kLm5leHQoaXNUb3BCb3JkZXJSZWFjaGVkID8gJ3VwJyA6IGlzQm90dG9tQm9yZGVyUmVhY2hlZCA/ICdkb3duJyA6IG51bGwpO1xuXG4gICAgaWYgKCFpc05pbChkcmFnZ2FibGVFbGVtZW50KSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkcmFnZ2FibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7ZHJhZ2dhYmxlRWxlbWVudFBvc2l0aW9uLmxlZnR9cHhgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZHJhZ2dhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAndG9wJywgYCR7ZHJhZ2dhYmxlRWxlbWVudFBvc2l0aW9uLnRvcH1weGApO1xuICAgIH1cbiAgfVxufVxuIl19