UNPKG

ng2-tree

Version:

angular2 component for visualizing data that can be naturally represented as a tree

121 lines 18.3 kB
import { LoadNextLevelEvent, MenuItemSelectedEvent, NodeCheckedEvent, NodeCollapsedEvent, NodeCreatedEvent, NodeExpandedEvent, NodeIndeterminedEvent, NodeMovedEvent, NodeRemovedEvent, NodeRenamedEvent, NodeSelectedEvent, NodeUncheckedEvent, NodeUnselectedEvent } from './tree.events'; import { Inject, Injectable } from '@angular/core'; import { NodeDraggableService } from './draggable/node-draggable.service'; import { isEmpty } from './utils/fn.utils'; import { Subject } from 'rxjs'; import { filter } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "./draggable/node-draggable.service"; export class TreeService { nodeDraggableService; nodeMoved$ = new Subject(); nodeRemoved$ = new Subject(); nodeRenamed$ = new Subject(); nodeCreated$ = new Subject(); nodeSelected$ = new Subject(); nodeUnselected$ = new Subject(); nodeExpanded$ = new Subject(); nodeCollapsed$ = new Subject(); menuItemSelected$ = new Subject(); loadNextLevel$ = new Subject(); nodeChecked$ = new Subject(); nodeUnchecked$ = new Subject(); nodeIndetermined$ = new Subject(); controllers = new Map(); constructor(nodeDraggableService) { this.nodeDraggableService = nodeDraggableService; this.nodeRemoved$.subscribe((e) => e.node.removeItselfFromParent()); } unselectStream(tree) { return this.nodeSelected$.pipe(filter((e) => tree !== e.node)); } fireNodeRemoved(tree) { this.nodeRemoved$.next(new NodeRemovedEvent(tree, tree.positionInParent)); } fireNodeCreated(tree) { this.nodeCreated$.next(new NodeCreatedEvent(tree)); } fireNodeSelected(tree) { this.nodeSelected$.next(new NodeSelectedEvent(tree)); } fireNodeUnselected(tree) { this.nodeUnselected$.next(new NodeUnselectedEvent(tree)); } fireNodeRenamed(oldValue, tree) { this.nodeRenamed$.next(new NodeRenamedEvent(tree, oldValue, tree.value)); } fireNodeMoved(tree, parent) { this.nodeMoved$.next(new NodeMovedEvent(tree, parent)); } fireMenuItemSelected(tree, selectedItem) { this.menuItemSelected$.next(new MenuItemSelectedEvent(tree, selectedItem)); } fireNodeSwitchFoldingType(tree) { if (tree.isNodeExpanded()) { this.fireNodeExpanded(tree); if (this.shouldFireLoadNextLevel(tree)) { this.fireLoadNextLevel(tree); } } else if (tree.isNodeCollapsed()) { this.fireNodeCollapsed(tree); } } fireNodeExpanded(tree) { this.nodeExpanded$.next(new NodeExpandedEvent(tree)); } fireNodeCollapsed(tree) { this.nodeCollapsed$.next(new NodeCollapsedEvent(tree)); } fireLoadNextLevel(tree) { this.loadNextLevel$.next(new LoadNextLevelEvent(tree)); } fireNodeChecked(tree) { this.nodeChecked$.next(new NodeCheckedEvent(tree)); } fireNodeUnchecked(tree) { this.nodeUnchecked$.next(new NodeUncheckedEvent(tree)); } draggedStream(tree, element) { return this.nodeDraggableService.draggableNodeEvents$.pipe(filter((e) => e.target === element), filter((e) => !e.captured.tree.hasChild(tree))); } setController(id, controller) { this.controllers.set(id, controller); } deleteController(id) { if (this.controllers.has(id)) { this.controllers.delete(id); } } getController(id) { if (this.controllers.has(id)) { return this.controllers.get(id); } return null; } hasController(id) { return this.controllers.has(id); } shouldFireLoadNextLevel(tree) { const shouldLoadNextLevel = tree.node.emitLoadNextLevel && !tree.node.loadChildren && !tree.childrenAreBeingLoaded() && isEmpty(tree.children); if (shouldLoadNextLevel) { tree.loadingChildrenRequested(); } return shouldLoadNextLevel; } fireNodeIndetermined(tree) { this.nodeIndetermined$.next(new NodeIndeterminedEvent(tree)); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeService, deps: [{ token: NodeDraggableService }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TreeService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.NodeDraggableService, decorators: [{ type: Inject, args: [NodeDraggableService] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RyZWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3hDLE1BQU0sT0FBTyxXQUFXO0lBaUJtQztJQWhCbEQsVUFBVSxHQUE0QixJQUFJLE9BQU8sRUFBa0IsQ0FBQztJQUNwRSxZQUFZLEdBQThCLElBQUksT0FBTyxFQUFvQixDQUFDO0lBQzFFLFlBQVksR0FBOEIsSUFBSSxPQUFPLEVBQW9CLENBQUM7SUFDMUUsWUFBWSxHQUE4QixJQUFJLE9BQU8sRUFBb0IsQ0FBQztJQUMxRSxhQUFhLEdBQStCLElBQUksT0FBTyxFQUFxQixDQUFDO0lBQzdFLGVBQWUsR0FBaUMsSUFBSSxPQUFPLEVBQXVCLENBQUM7SUFDbkYsYUFBYSxHQUErQixJQUFJLE9BQU8sRUFBcUIsQ0FBQztJQUM3RSxjQUFjLEdBQWdDLElBQUksT0FBTyxFQUFzQixDQUFDO0lBQ2hGLGlCQUFpQixHQUFtQyxJQUFJLE9B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QUNILENBQUM7SUFFTSxhQUFhLENBQUMsRUFBbUI7UUFDdEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sYUFBYSxDQUFDLEVBQW1CO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLHVCQUF1QixDQUFDLElBQVU7UUFDeEMsTUFBTSxtQkFBbUIsR0FDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFDM0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDdkIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QixJQUFJLG1CQUFtQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBVTtRQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO3dHQWpJVSxXQUFXLGtCQWlCSyxvQkFBb0I7NEdBakJwQyxXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFrQlcsTUFBTTsyQkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBMb2FkTmV4dExldmVsRXZlbnQsXG4gIE1lbnVJdGVtU2VsZWN0ZWRFdmVudCxcbiAgTm9kZUNoZWNrZWRFdmVudCxcbiAgTm9kZUNvbGxhcHNlZEV2ZW50LFxuICBOb2RlQ3JlYXRlZEV2ZW50LFxuICBOb2RlRXhwYW5kZWRFdmVudCxcbiAgTm9kZUluZGV0ZXJtaW5lZEV2ZW50LFxuICBOb2RlTW92ZWRFdmVudCxcbiAgTm9kZVJlbW92ZWRFdmVudCxcbiAgTm9kZVJlbmFtZWRFdmVudCxcbiAgTm9kZVNlbGVjdGVkRXZlbnQsXG4gIE5vZGVVbmNoZWNrZWRFdmVudCxcbiAgTm9kZVVuc2VsZWN0ZWRFdmVudFxufSBmcm9tICcuL3RyZWUuZXZlbnRzJztcbmltcG9ydCB7IFJlbmFtYWJsZU5vZGUgfSBmcm9tICcuL3RyZWUudHlwZXMnO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gJy4vdHJlZSc7XG5pbXBvcnQgeyBUcmVlQ29udHJvbGxlciB9IGZyb20gJy4vdHJlZS1jb250cm9sbGVyJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZURyYWdnYWJsZVNlcnZpY2UgfSBmcm9tICcuL2RyYWdnYWJsZS9ub2RlLWRyYWdnYWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vZGVEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4vZHJhZ2dhYmxlL2RyYWdnYWJsZS5ldmVudHMnO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJy4vdXRpbHMvZm4udXRpbHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHJlZVNlcnZpY2Uge1xuICBwdWJsaWMgbm9kZU1vdmVkJDogU3ViamVjdDxOb2RlTW92ZWRFdmVudD4gPSBuZXcgU3ViamVjdDxOb2RlTW92ZWRFdmVudD4oKTtcbiAgcHVibGljIG5vZGVSZW1vdmVkJDogU3ViamVjdDxOb2RlUmVtb3ZlZEV2ZW50PiA9IG5ldyBTdWJqZWN0PE5vZGVSZW1vdmVkRXZlbnQ+KCk7XG4gIHB1YmxpYyBub2RlUmVuYW1lZCQ6IFN1YmplY3Q8Tm9kZVJlbmFtZWRFdmVudD4gPSBuZXcgU3ViamVjdDxOb2RlUmVuYW1lZEV2ZW50PigpO1xuICBwdWJsaWMgbm9kZUNyZWF0ZWQkOiBTdWJqZWN0PE5vZGVDcmVhdGVkRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Tm9kZUNyZWF0ZWRFdmVudD4oKTtcbiAgcHVibGljIG5vZGVTZWxlY3RlZCQ6IFN1YmplY3Q8Tm9kZVNlbGVjdGVkRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Tm9kZVNlbGVjdGVkRXZlbnQ+KCk7XG4gIHB1YmxpYyBub2RlVW5zZWxlY3RlZCQ6IFN1YmplY3Q8Tm9kZVVuc2VsZWN0ZWRFdmVudD4gPSBuZXcgU3ViamVjdDxOb2RlVW5zZWxlY3RlZEV2ZW50PigpO1xuICBwdWJsaWMgbm9kZUV4cGFuZGVkJDogU3ViamVjdDxOb2RlRXhwYW5kZWRFdmVudD4gPSBuZXcgU3ViamVjdDxOb2RlRXhwYW5kZWRFdmVudD4oKTtcbiAgcHVibGljIG5vZGVDb2xsYXBzZWQkOiBTdWJqZWN0PE5vZGVDb2xsYXBzZWRFdmVudD4gPSBuZXcgU3ViamVjdDxOb2RlQ29sbGFwc2VkRXZlbnQ+KCk7XG4gIHB1YmxpYyBtZW51SXRlbVNlbGVjdGVkJDogU3ViamVjdDxNZW51SXRlbVNlbGVjdGVkRXZlbnQ+ID0gbmV3IFN1YmplY3Q8TWVudUl0ZW1TZWxlY3RlZEV2ZW50PigpO1xuICBwdWJsaWMgbG9hZE5leHRMZXZlbCQ6IFN1YmplY3Q8TG9hZE5leHRMZXZlbEV2ZW50PiA9IG5ldyBTdWJqZWN0PExvYWROZXh0TGV2ZWxFdmVudD4oKTtcbiAgcHVibGljIG5vZGVDaGVja2VkJDogU3ViamVjdDxOb2RlQ2hlY2tlZEV2ZW50PiA9IG5ldyBTdWJqZWN0PE5vZGVDaGVja2VkRXZlbnQ+KCk7XG4gIHB1YmxpYyBub2RlVW5jaGVja2VkJDogU3ViamVjdDxOb2RlVW5jaGVja2VkRXZlbnQ+ID0gbmV3IFN1YmplY3Q8Tm9kZVVuY2hlY2tlZEV2ZW50PigpO1xuICBwdWJsaWMgbm9kZUluZGV0ZXJtaW5lZCQ6IFN1YmplY3Q8Tm9kZUluZGV0ZXJtaW5lZEV2ZW50PiA9IG5ldyBTdWJqZWN0PE5vZGVJbmRldGVybWluZWRFdmVudD4oKTtcblxuICBwcml2YXRlIGNvbnRyb2xsZXJzOiBNYXA8c3RyaW5nIHwgbnVtYmVyLCBUcmVlQ29udHJvbGxlcj4gPSBuZXcgTWFwKCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKEBJbmplY3QoTm9kZURyYWdnYWJsZVNlcnZpY2UpIHByaXZhdGUgbm9kZURyYWdnYWJsZVNlcnZpY2U6IE5vZGVEcmFnZ2FibGVTZXJ2aWNlKSB7XG4gICAgdGhpcy5ub2RlUmVtb3ZlZCQuc3Vic2NyaWJlKChlOiBOb2RlUmVtb3ZlZEV2ZW50KSA9PiBlLm5vZGUucmVtb3ZlSXRzZWxmRnJvbVBhcmVudCgpKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnNlbGVjdFN0cmVhbSh0cmVlOiBUcmVlKTogT2JzZXJ2YWJsZTxOb2RlU2VsZWN0ZWRFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLm5vZGVTZWxlY3RlZCQucGlwZShmaWx0ZXIoKGU6IE5vZGVTZWxlY3RlZEV2ZW50KSA9PiB0cmVlICE9PSBlLm5vZGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlTm9kZVJlbW92ZWQodHJlZTogVHJlZSk6IHZvaWQge1xuICAgIHRoaXMubm9kZVJlbW92ZWQkLm5leHQobmV3IE5vZGVSZW1vdmVkRXZlbnQodHJlZSwgdHJlZS5wb3NpdGlvbkluUGFyZW50KSk7XG4gIH1cblxuICBwdWJsaWMgZmlyZU5vZGVDcmVhdGVkKHRyZWU6IFRyZWUpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVDcmVhdGVkJC5uZXh0KG5ldyBOb2RlQ3JlYXRlZEV2ZW50KHRyZWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlTm9kZVNlbGVjdGVkKHRyZWU6IFRyZWUpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVTZWxlY3RlZCQubmV4dChuZXcgTm9kZVNlbGVjdGVkRXZlbnQodHJlZSkpO1xuICB9XG5cbiAgcHVibGljIGZpcmVOb2RlVW5zZWxlY3RlZCh0cmVlOiBUcmVlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlVW5zZWxlY3RlZCQubmV4dChuZXcgTm9kZVVuc2VsZWN0ZWRFdmVudCh0cmVlKSk7XG4gIH1cblxuICBwdWJsaWMgZmlyZU5vZGVSZW5hbWVkKG9sZFZhbHVlOiBSZW5hbWFibGVOb2RlIHwgc3RyaW5nLCB0cmVlOiBUcmVlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlUmVuYW1lZCQubmV4dChuZXcgTm9kZVJlbmFtZWRFdmVudCh0cmVlLCBvbGRWYWx1ZSwgdHJlZS52YWx1ZSkpO1xuICB9XG5cbiAgcHVibGljIGZpcmVOb2RlTW92ZWQodHJlZTogVHJlZSwgcGFyZW50OiBUcmVlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlTW92ZWQkLm5leHQobmV3IE5vZGVNb3ZlZEV2ZW50KHRyZWUsIHBhcmVudCkpO1xuICB9XG5cbiAgcHVibGljIGZpcmVNZW51SXRlbVNlbGVjdGVkKHRyZWU6IFRyZWUsIHNlbGVjdGVkSXRlbTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZW51SXRlbVNlbGVjdGVkJC5uZXh0KG5ldyBNZW51SXRlbVNlbGVjdGVkRXZlbnQodHJlZSwgc2VsZWN0ZWRJdGVtKSk7XG4gIH1cblxuICBwdWJsaWMgZmlyZU5vZGVTd2l0Y2hGb2xkaW5nVHlwZSh0cmVlOiBUcmVlKTogdm9pZCB7XG4gICAgaWYgKHRyZWUuaXNOb2RlRXhwYW5kZWQoKSkge1xuICAgICAgdGhpcy5maXJlTm9kZUV4cGFuZGVkKHRyZWUpO1xuICAgICAgaWYgKHRoaXMuc2hvdWxkRmlyZUxvYWROZXh0TGV2ZWwodHJlZSkpIHtcbiAgICAgICAgdGhpcy5maXJlTG9hZE5leHRMZXZlbCh0cmVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyZWUuaXNOb2RlQ29sbGFwc2VkKCkpIHtcbiAgICAgIHRoaXMuZmlyZU5vZGVDb2xsYXBzZWQodHJlZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaXJlTm9kZUV4cGFuZGVkKHRyZWU6IFRyZWUpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVFeHBhbmRlZCQubmV4dChuZXcgTm9kZUV4cGFuZGVkRXZlbnQodHJlZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXJlTm9kZUNvbGxhcHNlZCh0cmVlOiBUcmVlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlQ29sbGFwc2VkJC5uZXh0KG5ldyBOb2RlQ29sbGFwc2VkRXZlbnQodHJlZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXJlTG9hZE5leHRMZXZlbCh0cmVlOiBUcmVlKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkTmV4dExldmVsJC5uZXh0KG5ldyBMb2FkTmV4dExldmVsRXZlbnQodHJlZSkpO1xuICB9XG5cbiAgcHVibGljIGZpcmVOb2RlQ2hlY2tlZCh0cmVlOiBUcmVlKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlQ2hlY2tlZCQubmV4dChuZXcgTm9kZUNoZWNrZWRFdmVudCh0cmVlKSk7XG4gIH1cblxuICBwdWJsaWMgZmlyZU5vZGVVbmNoZWNrZWQodHJlZTogVHJlZSk6IHZvaWQge1xuICAgIHRoaXMubm9kZVVuY2hlY2tlZCQubmV4dChuZXcgTm9kZVVuY2hlY2tlZEV2ZW50KHRyZWUpKTtcbiAgfVxuXG4gIHB1YmxpYyBkcmFnZ2VkU3RyZWFtKHRyZWU6IFRyZWUsIGVsZW1lbnQ6IEVsZW1lbnRSZWYpOiBPYnNlcnZhYmxlPE5vZGVEcmFnZ2FibGVFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLm5vZGVEcmFnZ2FibGVTZXJ2aWNlLmRyYWdnYWJsZU5vZGVFdmVudHMkLnBpcGUoXG4gICAgICBmaWx0ZXIoKGU6IE5vZGVEcmFnZ2FibGVFdmVudCkgPT4gZS50YXJnZXQgPT09IGVsZW1lbnQpLFxuICAgICAgZmlsdGVyKChlOiBOb2RlRHJhZ2dhYmxlRXZlbnQpID0+ICFlLmNhcHR1cmVkLnRyZWUuaGFzQ2hpbGQodHJlZSkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250cm9sbGVyKGlkOiBzdHJpbmcgfCBudW1iZXIsIGNvbnRyb2xsZXI6IFRyZWVDb250cm9sbGVyKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVycy5zZXQoaWQsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZUNvbnRyb2xsZXIoaWQ6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbnRyb2xsZXJzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29udHJvbGxlcihpZDogc3RyaW5nIHwgbnVtYmVyKTogVHJlZUNvbnRyb2xsZXIge1xuICAgIGlmICh0aGlzLmNvbnRyb2xsZXJzLmhhcyhpZCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzLmdldChpZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgaGFzQ29udHJvbGxlcihpZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlcnMuaGFzKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkRmlyZUxvYWROZXh0TGV2ZWwodHJlZTogVHJlZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNob3VsZExvYWROZXh0TGV2ZWwgPVxuICAgICAgdHJlZS5ub2RlLmVtaXRMb2FkTmV4dExldmVsICYmXG4gICAgICAhdHJlZS5ub2RlLmxvYWRDaGlsZHJlbiAmJlxuICAgICAgIXRyZWUuY2hpbGRyZW5BcmVCZWluZ0xvYWRlZCgpICYmXG4gICAgICBpc0VtcHR5KHRyZWUuY2hpbGRyZW4pO1xuXG4gICAgaWYgKHNob3VsZExvYWROZXh0TGV2ZWwpIHtcbiAgICAgIHRyZWUubG9hZGluZ0NoaWxkcmVuUmVxdWVzdGVkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNob3VsZExvYWROZXh0TGV2ZWw7XG4gIH1cblxuICBwdWJsaWMgZmlyZU5vZGVJbmRldGVybWluZWQodHJlZTogVHJlZSk6IHZvaWQge1xuICAgIHRoaXMubm9kZUluZGV0ZXJtaW5lZCQubmV4dChuZXcgTm9kZUluZGV0ZXJtaW5lZEV2ZW50KHRyZWUpKTtcbiAgfVxufVxuIl19