@cluetec/ngcx-tree 0.1.0-angular-15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,323 @@
1
+ import { DragDropModule, } from '@angular/cdk/drag-drop';
2
+ import { CdkTreeModule, NestedTreeControl } from '@angular/cdk/tree';
3
+ import { NgIf } from '@angular/common';
4
+ import { Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
5
+ import { NgcxTreeDataSource } from './ngcx-tree-data.source';
6
+ import { NgcxTreeNodeComponent } from './ngcx-tree-node/ngcx-tree-node.component';
7
+ import { isParentOf } from './ngcx-tree-utils';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/cdk/tree";
10
+ import * as i2 from "@angular/cdk/drag-drop";
11
+ export class NgcxTreeComponent {
12
+ constructor() {
13
+ this.nodeMoved = new EventEmitter();
14
+ this.customEvent = new EventEmitter();
15
+ this.clickEvent = new EventEmitter();
16
+ this.selectEvent = new EventEmitter();
17
+ this.api = new NgcxTreeControl(this);
18
+ this.dataSource = new NgcxTreeDataSource([]);
19
+ this.treeControl = new NestedTreeControl((node) => node.children, {
20
+ trackBy: (node) => node.id,
21
+ });
22
+ this.DropType = DropType;
23
+ this.disable = () => false;
24
+ this.hasChild = (_, node) => node.children.length > 0;
25
+ }
26
+ ngOnInit() {
27
+ this.updateTree();
28
+ }
29
+ ngOnChanges(changes) {
30
+ if (changes['nodes']) {
31
+ if (this.treeControl) {
32
+ // initialized already
33
+ this.updateTree();
34
+ }
35
+ if (this.selectedNode) {
36
+ const selectedNodeId = this.selectedNode.id;
37
+ setTimeout(() => this.api.selectNodeById(selectedNodeId));
38
+ }
39
+ }
40
+ }
41
+ updateTree() {
42
+ const wrapperNodes = this.createWrapperNodes(this.nodes ?? []);
43
+ this.dataSource = new NgcxTreeDataSource(wrapperNodes);
44
+ this.treeControl.dataNodes = this.dataSource.data$.value;
45
+ }
46
+ createWrapperNodes(nodes, parent, depth = 0) {
47
+ const childCount = nodes.length;
48
+ const wrapperNodes = nodes.map((node, idx) => {
49
+ const nodeWrapper = {
50
+ id: node.id,
51
+ data: node,
52
+ isFirstChild: idx === 0,
53
+ isLastChild: idx === childCount - 1,
54
+ index: idx,
55
+ parent: parent,
56
+ depth: depth,
57
+ children: [],
58
+ };
59
+ nodeWrapper.children = node.children
60
+ ? this.createWrapperNodes(node.children, nodeWrapper, depth + 1)
61
+ : [];
62
+ return nodeWrapper;
63
+ });
64
+ wrapperNodes.forEach((wrapperNode) => {
65
+ if (!wrapperNode.isLastChild) {
66
+ wrapperNode.next = wrapperNodes[wrapperNode.index + 1];
67
+ }
68
+ if (!wrapperNode.isFirstChild) {
69
+ wrapperNode.previous = wrapperNodes[wrapperNode.index - 1];
70
+ }
71
+ if (this.config?.allowSelection?.(wrapperNode)) {
72
+ wrapperNode.isSelectable = true;
73
+ }
74
+ });
75
+ return wrapperNodes;
76
+ }
77
+ allowDrop(dropNode, dropType) {
78
+ if (!this.dragging ||
79
+ this.dragging.id === dropNode.id ||
80
+ isParentOf(this.dragging, dropNode)) {
81
+ return false;
82
+ }
83
+ if (dropType == DropType.DROP_INTO &&
84
+ dropNode.id === this.dragging.parent?.id) {
85
+ return false;
86
+ }
87
+ if (dropType == DropType.DROP_AFTER &&
88
+ dropNode.next?.id === this.dragging.id) {
89
+ return false;
90
+ }
91
+ if (dropType == DropType.DROP_BEFORE &&
92
+ dropNode.previous?.id === this.dragging.id) {
93
+ return false;
94
+ }
95
+ const intoNode = dropType == DropType.DROP_INTO ? dropNode : dropNode.parent;
96
+ if (this.config?.allowDrop) {
97
+ return this.config.allowDrop(this.dragging, intoNode);
98
+ }
99
+ return true;
100
+ }
101
+ // prevent drop directly after a node on same level, that is expanded
102
+ sortPredicate() {
103
+ return (index, _drag, drop) => {
104
+ return index == 0 || !this.treeControl.isExpanded(drop.data);
105
+ };
106
+ }
107
+ disableDrag(node) {
108
+ return this.config?.allowDrag ? !this.config.allowDrag(node) : false;
109
+ }
110
+ keyDownArrowUp(event) {
111
+ console.log('arrow up');
112
+ if (this.selectedNode) {
113
+ if (!this.selectedNode.isFirstChild) {
114
+ this.selectNode(this.selectedNode.previous);
115
+ }
116
+ else if (this.selectedNode.parent) {
117
+ this.selectNode(this.selectedNode.parent);
118
+ }
119
+ }
120
+ else {
121
+ const nodes = this.dataSource.data$.value;
122
+ if (nodes.length > 0) {
123
+ this.selectNode(nodes[nodes.length - 1]);
124
+ }
125
+ }
126
+ event.preventDefault();
127
+ }
128
+ keyDownArrowDown(event) {
129
+ if (this.selectedNode) {
130
+ if (!this.selectedNode.isLastChild) {
131
+ this.selectNode(this.selectedNode.next);
132
+ }
133
+ else if (this.selectedNode.parent?.next) {
134
+ this.selectNode(this.selectedNode.parent.next);
135
+ }
136
+ }
137
+ else {
138
+ const nodes = this.dataSource.data$.value;
139
+ if (nodes.length > 0) {
140
+ this.selectNode(nodes[0]);
141
+ }
142
+ }
143
+ event.preventDefault();
144
+ }
145
+ keyDownArrowLeft(event) {
146
+ if (this.selectedNode?.parent) {
147
+ this.selectNode(this.selectedNode.parent);
148
+ }
149
+ else if (!this.selectedNode) {
150
+ const nodes = this.dataSource.data$.value;
151
+ if (nodes.length > 0) {
152
+ this.selectNode(nodes[0]);
153
+ }
154
+ }
155
+ event.preventDefault();
156
+ }
157
+ keyDownArrowRight(event) {
158
+ if (this.selectedNode && this.selectedNode.children.length > 0) {
159
+ this.selectNode(this.selectedNode.children[0]);
160
+ }
161
+ else if (!this.selectedNode) {
162
+ const nodes = this.dataSource.data$.value;
163
+ if (nodes.length > 0) {
164
+ this.selectNode(nodes[0]);
165
+ }
166
+ }
167
+ event.preventDefault();
168
+ }
169
+ keyEscapeWhileDragging() {
170
+ if (this.dragging) {
171
+ this.canceledByEsq = true;
172
+ document.dispatchEvent(new Event('mouseup'));
173
+ }
174
+ }
175
+ handleDragRelease(event) {
176
+ this.dragging = undefined;
177
+ const movedNode = event.source.data;
178
+ const dropZoneId = event.event.target.id;
179
+ if (!dropZoneId) {
180
+ // no valid drop zone
181
+ return;
182
+ }
183
+ const dropZoneInfo = new DropZoneInfo(dropZoneId);
184
+ const toNode = this.api.findNodeById(dropZoneInfo.nodeId);
185
+ if (!toNode) {
186
+ console.error(`node with id '${dropZoneInfo.nodeId}' could not be found`);
187
+ return;
188
+ }
189
+ // dropType undefined can happen if dropped directly without moving
190
+ if (this.canceledByEsq || dropZoneInfo.dropType === undefined) {
191
+ this.canceledByEsq = false;
192
+ return;
193
+ }
194
+ const insertIntoNode = dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent;
195
+ const wrapperList = insertIntoNode?.children ?? this.dataSource.data$.value;
196
+ const addAtNodeIdx = this.findAddIndex(dropZoneInfo, insertIntoNode, wrapperList);
197
+ const removedFromIdx = this.removeElementFromPreviousPosition(movedNode);
198
+ // add element to new Position, subtract one if inserted in same list after the remove position
199
+ (insertIntoNode?.data.children ?? this.nodes).splice(movedNode.parent?.id === insertIntoNode?.id &&
200
+ removedFromIdx < addAtNodeIdx
201
+ ? addAtNodeIdx - 1
202
+ : addAtNodeIdx, 0, movedNode.data);
203
+ const afterNodeIdx = addAtNodeIdx - 1;
204
+ const afterNode = afterNodeIdx > -1 && wrapperList.length > afterNodeIdx
205
+ ? wrapperList[afterNodeIdx]
206
+ : undefined;
207
+ const beforeNode = addAtNodeIdx > -1 && wrapperList.length > addAtNodeIdx
208
+ ? wrapperList[addAtNodeIdx]
209
+ : undefined;
210
+ this.nodeMoved.emit({
211
+ node: movedNode,
212
+ parent: dropZoneInfo.dropType === DropType.DROP_INTO ? toNode : toNode.parent,
213
+ afterNode: afterNode,
214
+ beforeNode: beforeNode,
215
+ });
216
+ this.dataSource = new NgcxTreeDataSource(this.createWrapperNodes(this.nodes));
217
+ this.treeControl.dataNodes = this.dataSource.data$.value;
218
+ }
219
+ findAddIndex(dropZoneInfo, insertIntoNode, insertIntoList) {
220
+ if (insertIntoNode &&
221
+ dropZoneInfo.dropType === DropType.DROP_INTO &&
222
+ !insertIntoNode.data.children) {
223
+ insertIntoNode.data.children = [];
224
+ }
225
+ let addAtNodeIdx = 0;
226
+ if (dropZoneInfo.dropType === DropType.DROP_AFTER ||
227
+ dropZoneInfo.dropType === DropType.DROP_BEFORE) {
228
+ addAtNodeIdx = insertIntoList.findIndex((child) => child.id === dropZoneInfo.nodeId);
229
+ if (dropZoneInfo.dropType === DropType.DROP_AFTER) {
230
+ addAtNodeIdx++;
231
+ }
232
+ }
233
+ return addAtNodeIdx;
234
+ }
235
+ removeElementFromPreviousPosition(movedNode) {
236
+ const removeFromList = movedNode.parent?.data.children ?? this.nodes;
237
+ const removeIndex = removeFromList.findIndex((child) => child.id === movedNode.id);
238
+ removeFromList.splice(removeIndex, 1);
239
+ return removeIndex;
240
+ }
241
+ nodeClicked(nodeWrapper) {
242
+ this.clickEvent.emit(nodeWrapper);
243
+ if (nodeWrapper.isSelectable) {
244
+ this.selectedNode =
245
+ nodeWrapper.id === this.selectedNode?.id ? undefined : nodeWrapper;
246
+ this.selectEvent.emit(this.selectedNode);
247
+ }
248
+ }
249
+ selectNode(nodeWrapper) {
250
+ if (!nodeWrapper || nodeWrapper.isSelectable) {
251
+ this.selectedNode = nodeWrapper;
252
+ let expandNode = this.selectedNode?.parent;
253
+ while (expandNode) {
254
+ this.treeControl.expand(expandNode);
255
+ expandNode = expandNode.parent;
256
+ }
257
+ this.selectEvent.emit(this.selectedNode);
258
+ }
259
+ }
260
+ }
261
+ NgcxTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgcxTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
262
+ NgcxTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: NgcxTreeComponent, isStandalone: true, selector: "ngcx-tree", inputs: { nodes: "nodes", config: "config" }, outputs: { nodeMoved: "nodeMoved", customEvent: "customEvent", clickEvent: "clickEvent", selectEvent: "selectEvent" }, host: { listeners: { "window:keydown.escape": "keyEscapeWhileDragging()" } }, usesOnChanges: true, ngImport: i0, template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !dragging ||\n !allowDrop(node, DropType.DROP_AFTER) ||\n !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !dragging ||\n !node.isFirstChild ||\n !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!dragging || !allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n !dragging ||\n treeControl.isExpanded(node) ||\n !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:2;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:3;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:3;bottom:-10px;display:flex;justify-content:center;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CdkTreeModule }, { kind: "directive", type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["cdkNestedTreeNode"] }, { kind: "directive", type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { kind: "component", type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "trackBy"], exportAs: ["cdkTree"] }, { kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: NgcxTreeNodeComponent, selector: "ngcx-tree-node", inputs: ["nodeWrapper", "treeControl", "treeConfig", "isSelected"], outputs: ["customEvent", "clickEvent"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
263
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgcxTreeComponent, decorators: [{
264
+ type: Component,
265
+ args: [{ selector: 'ngcx-tree', standalone: true, imports: [CdkTreeModule, DragDropModule, NgcxTreeNodeComponent, NgIf], template: "<cdk-tree\n #tree\n class=\"ngcx-tree\"\n *ngIf=\"dataSource\"\n [dataSource]=\"dataSource\"\n [treeControl]=\"treeControl\"\n cdkDropListGroup\n [class.dragging]=\"dragging\"\n (keyup.arrowup)=\"keyDownArrowUp($event)\"\n (keydown.arrowdown)=\"keyDownArrowDown($event)\"\n (keydown.arrowleft)=\"keyDownArrowLeft($event)\"\n (keydown.arrowright)=\"keyDownArrowRight($event)\"\n tabindex=\"0\">\n <cdk-nested-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-expanded-node\"\n [class.hide]=\"\n !dragging ||\n !allowDrop(node, DropType.DROP_AFTER) ||\n !treeControl.isExpanded(node)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div class=\"tree-node-container\">\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_BEFORE\"\n class=\"tree-node-container-drop-zone before-node\"\n [class.hide]=\"\n !dragging ||\n !node.isFirstChild ||\n !allowDrop(node, DropType.DROP_BEFORE)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_INTO\"\n class=\"tree-node-container-drop-zone into-node\"\n [class.hide]=\"!dragging || !allowDrop(node, DropType.DROP_INTO)\"></div>\n <div\n cdkDropList\n [id]=\"node.id + '_' + DropType.DROP_AFTER\"\n class=\"tree-node-container-drop-zone after-node\"\n [class.last]=\"node.isLastChild\"\n [class.hide]=\"\n !dragging ||\n treeControl.isExpanded(node) ||\n !allowDrop(node, DropType.DROP_AFTER)\n \">\n <div class=\"drop-insert-line\"></div>\n </div>\n <div\n cdkDropList\n [cdkDropListData]=\"node\"\n [cdkDropListEnterPredicate]=\"disable\"\n [cdkDropListSortPredicate]=\"disable\">\n <div\n cdkDrag\n [cdkDragDisabled]=\"disableDrag(node)\"\n [cdkDragData]=\"node\"\n (cdkDragStarted)=\"dragging = node\"\n (cdkDragReleased)=\"handleDragRelease($event)\">\n <div *cdkDragPlaceholder></div>\n <div\n class=\"tree-node-content-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\"\n [class.expanded]=\"treeControl.isExpanded(node)\">\n <ngcx-tree-node\n style=\"width: 100%\"\n [nodeWrapper]=\"node\"\n [isSelected]=\"node.id === selectedNode?.id\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"\n (customEvent)=\"customEvent.emit($event)\"\n (clickEvent)=\"nodeClicked(node)\"></ngcx-tree-node>\n </div>\n </div>\n <ngcx-tree-node\n *ngIf=\"node.id === dragging?.id\"\n [nodeWrapper]=\"node\"\n [treeControl]=\"treeControl\"\n [treeConfig]=\"config\"></ngcx-tree-node>\n </div>\n </div>\n <div\n *ngIf=\"treeControl.isExpanded(node)\"\n class=\"tree-node-children-container\"\n [class.first]=\"node.isFirstChild\"\n [class.last]=\"node.isLastChild\">\n <div cdkTreeNodeOutlet></div>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".ngcx-tree{height:auto}.ngcx-tree ul,.ngcx-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.tree-node{display:flex;flex-direction:column;position:relative}.tree-node .tree-node{margin-left:20px}.tree-node-container{width:100%;min-height:30px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;position:relative;cursor:default}.tree-node-container .tree-node-content-container{width:100%}.tree-node-container .cdk-drag{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.tree-node-container-drop-zone{height:100%;left:25px;right:5px;position:absolute;z-index:1;display:flex;justify-content:center;flex-direction:column}.tree-node-container-drop-zone:hover.into-node{border:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone:hover .drop-insert-line{border-top:1.5px dashed rgba(0,0,0,.5)}.tree-node-container-drop-zone.hide{height:0!important}.tree-node-container-drop-zone.hide .drop-insert-line{border-top:solid transparent 0px!important}.tree-node-container-drop-zone.before-node{height:20px;z-index:2;top:-10px}.tree-node-container-drop-zone.after-node{height:20px;z-index:3;top:calc(100% - 10px)}.tree-node-container-drop-zone.after-node.last{height:10px}.tree-node-container-drop-zone.after-expanded-node{position:absolute;height:20px;z-index:3;bottom:-10px;display:flex;justify-content:center;flex-direction:column}\n"] }]
266
+ }], propDecorators: { nodes: [{
267
+ type: Input
268
+ }], config: [{
269
+ type: Input
270
+ }], nodeMoved: [{
271
+ type: Output
272
+ }], customEvent: [{
273
+ type: Output
274
+ }], clickEvent: [{
275
+ type: Output
276
+ }], selectEvent: [{
277
+ type: Output
278
+ }], keyEscapeWhileDragging: [{
279
+ type: HostListener,
280
+ args: ['window:keydown.escape']
281
+ }] } });
282
+ var DropType;
283
+ (function (DropType) {
284
+ DropType["DROP_AFTER"] = "DROP_AFTER";
285
+ DropType["DROP_BEFORE"] = "DROP_BEFORE";
286
+ DropType["DROP_INTO"] = "DROP_INTO";
287
+ })(DropType || (DropType = {}));
288
+ export class NgcxTreeControl {
289
+ constructor(treeComponent) {
290
+ this.treeComponent = treeComponent;
291
+ }
292
+ get treeControl() {
293
+ return this.treeComponent.treeControl;
294
+ }
295
+ selectNodeById(id) {
296
+ this.treeComponent.selectNode(this.findNodeById(id));
297
+ }
298
+ findNodeById(id) {
299
+ return this.findNodeByIdInNodes(this.treeComponent.dataSource.data$.value, id);
300
+ }
301
+ findNodeByIdInNodes(nodes, id) {
302
+ for (const node of nodes) {
303
+ if (node.id === id) {
304
+ return node;
305
+ }
306
+ if (node.children?.length > 0) {
307
+ const foundNode = this.findNodeByIdInNodes(node.children, id);
308
+ if (foundNode) {
309
+ return foundNode;
310
+ }
311
+ }
312
+ }
313
+ return undefined;
314
+ }
315
+ }
316
+ class DropZoneInfo {
317
+ constructor(id) {
318
+ const pos = id.indexOf('_');
319
+ this.nodeId = id.substring(0, pos);
320
+ this.dropType = id.substring(pos + 1);
321
+ }
322
+ }
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjeC10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvbGliL25nY3gtdHJlZS9uZ2N4LXRyZWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdjeC10cmVlL3NyYy9saWIvbmdjeC10cmVlL25nY3gtdHJlZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVE3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNsRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFTL0MsTUFBTSxPQUFPLGlCQUFpQjtJQVA5QjtRQVdZLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUM1RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQzFELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFFckQsUUFBRyxHQUFxQixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxlQUFVLEdBQ1IsSUFBSSxrQkFBa0IsQ0FBMkIsRUFBRSxDQUFDLENBQUM7UUFDdkQsZ0JBQVcsR0FDVCxJ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USxHQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENka0RyYWcsXG4gIENka0RyYWdSZWxlYXNlLFxuICBDZGtEcm9wTGlzdCxcbiAgRHJhZ0Ryb3BNb2R1bGUsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ2RrVHJlZU1vZHVsZSwgTmVzdGVkVHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nY3hUcmVlRGF0YVNvdXJjZSB9IGZyb20gJy4vbmdjeC10cmVlLWRhdGEuc291cmNlJztcbmltcG9ydCB7XG4gIE5nY3hUcmVlQXBpLFxuICBOZ2N4VHJlZUNvbmZpZyxcbiAgTmdjeFRyZWVOb2RlLFxuICBOZ2N4VHJlZU5vZGVNb3ZlZEV2ZW50LFxuICBOZ2N4VHJlZU5vZGVXcmFwcGVyLFxufSBmcm9tICcuL25nY3gtdHJlZS1tb2RlbHMnO1xuaW1wb3J0IHsgTmdjeFRyZWVOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9uZ2N4LXRyZWUtbm9kZS9uZ2N4LXRyZWUtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNQYXJlbnRPZiB9IGZyb20gJy4vbmdjeC10cmVlLXV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmdjeC10cmVlJyxcbiAgdGVtcGxhdGVVcmw6ICduZ2N4LXRyZWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbmdjeC10cmVlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDZGtUcmVlTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgTmdjeFRyZWVOb2RlQ29tcG9uZW50LCBOZ0lmXSxcbn0pXG5leHBvcnQgY2xhc3MgTmdjeFRyZWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIG5vZGVzPzogTmdjeFRyZWVOb2RlW107XG4gIEBJbnB1dCgpIGNvbmZpZz86IE5nY3hUcmVlQ29uZmlnPGFueT47XG5cbiAgQE91dHB1dCgpIG5vZGVNb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TmdjeFRyZWVOb2RlTW92ZWRFdmVudDxhbnk+PigpO1xuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Pj4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogTmdjeFRyZWVBcGk8YW55PiA9IG5ldyBOZ2N4VHJlZUNvbnRyb2wodGhpcyk7XG5cbiAgZGF0YVNvdXJjZTogTmdjeFRyZWVEYXRhU291cmNlPE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Pj4gPVxuICAgIG5ldyBOZ2N4VHJlZURhdGFTb3VyY2U8TmdjeFRyZWVOb2RlV3JhcHBlcjxhbnk+PihbXSk7XG4gIHRyZWVDb250cm9sOiBOZXN0ZWRUcmVlQ29udHJvbDxOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4sIHN0cmluZz4gPVxuICAgIG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4sIHN0cmluZz4oXG4gICAgICAobm9kZSkgPT4gbm9kZS5jaGlsZHJlbixcbiAgICAgIHtcbiAgICAgICAgdHJhY2tCeTogKG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PikgPT4gbm9kZS5pZCxcbiAgICAgIH1cbiAgICApO1xuICBkcmFnZ2luZz86IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PjtcblxuICBzZWxlY3RlZE5vZGU/OiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT47XG5cbiAgRHJvcFR5cGUgPSBEcm9wVHlwZTtcblxuICBkaXNhYmxlID0gKCkgPT4gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjYW5jZWxlZEJ5RXNxPzogYm9vbGVhbjtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVRyZWUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snbm9kZXMnXSkge1xuICAgICAgaWYgKHRoaXMudHJlZUNvbnRyb2wpIHtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYWxyZWFkeVxuICAgICAgICB0aGlzLnVwZGF0ZVRyZWUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZE5vZGVJZCA9IHRoaXMuc2VsZWN0ZWROb2RlLmlkO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYXBpLnNlbGVjdE5vZGVCeUlkKHNlbGVjdGVkTm9kZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVHJlZSgpIHtcbiAgICBjb25zdCB3cmFwcGVyTm9kZXMgPSB0aGlzLmNyZWF0ZVdyYXBwZXJOb2Rlcyh0aGlzLm5vZGVzID8/IFtdKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTmdjeFRyZWVEYXRhU291cmNlKHdyYXBwZXJOb2Rlcyk7XG4gICAgdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gIH1cblxuICBjcmVhdGVXcmFwcGVyTm9kZXMoXG4gICAgbm9kZXM6IE5nY3hUcmVlTm9kZVtdLFxuICAgIHBhcmVudD86IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PixcbiAgICBkZXB0aDogbnVtYmVyID0gMFxuICApOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT5bXSB7XG4gICAgY29uc3QgY2hpbGRDb3VudCA9IG5vZGVzLmxlbmd0aDtcbiAgICBjb25zdCB3cmFwcGVyTm9kZXMgPSBub2Rlcy5tYXAoKG5vZGUsIGlkeCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZVdyYXBwZXI6IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PiA9IHtcbiAgICAgICAgaWQ6IG5vZGUuaWQsXG4gICAgICAgIGRhdGE6IG5vZGUsXG4gICAgICAgIGlzRmlyc3RDaGlsZDogaWR4ID09PSAwLFxuICAgICAgICBpc0xhc3RDaGlsZDogaWR4ID09PSBjaGlsZENvdW50IC0gMSxcbiAgICAgICAgaW5kZXg6IGlkeCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICAgIG5vZGVXcmFwcGVyLmNoaWxkcmVuID0gbm9kZS5jaGlsZHJlblxuICAgICAgICA/IHRoaXMuY3JlYXRlV3JhcHBlck5vZGVzKG5vZGUuY2hpbGRyZW4sIG5vZGVXcmFwcGVyLCBkZXB0aCArIDEpXG4gICAgICAgIDogW107XG5cbiAgICAgIHJldHVybiBub2RlV3JhcHBlcjtcbiAgICB9KTtcbiAgICB3cmFwcGVyTm9kZXMuZm9yRWFjaCgod3JhcHBlck5vZGUpID0+IHtcbiAgICAgIGlmICghd3JhcHBlck5vZGUuaXNMYXN0Q2hpbGQpIHtcbiAgICAgICAgd3JhcHBlck5vZGUubmV4dCA9IHdyYXBwZXJOb2Rlc1t3cmFwcGVyTm9kZS5pbmRleCArIDFdO1xuICAgICAgfVxuICAgICAgaWYgKCF3cmFwcGVyTm9kZS5pc0ZpcnN0Q2hpbGQpIHtcbiAgICAgICAgd3JhcHBlck5vZGUucHJldmlvdXMgPSB3cmFwcGVyTm9kZXNbd3JhcHBlck5vZGUuaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZz8uYWxsb3dTZWxlY3Rpb24/Lih3cmFwcGVyTm9kZSkpIHtcbiAgICAgICAgd3JhcHBlck5vZGUuaXNTZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gd3JhcHBlck5vZGVzO1xuICB9XG5cbiAgaGFzQ2hpbGQgPSAoXzogbnVtYmVyLCBub2RlOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4pID0+XG4gICAgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwO1xuXG4gIGFsbG93RHJvcChkcm9wTm9kZTogTmdjeFRyZWVOb2RlV3JhcHBlcjxhbnk+LCBkcm9wVHlwZTogRHJvcFR5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5kcmFnZ2luZyB8fFxuICAgICAgdGhpcy5kcmFnZ2luZy5pZCA9PT0gZHJvcE5vZGUuaWQgfHxcbiAgICAgIGlzUGFyZW50T2YodGhpcy5kcmFnZ2luZywgZHJvcE5vZGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRyb3BUeXBlID09IERyb3BUeXBlLkRST1BfSU5UTyAmJlxuICAgICAgZHJvcE5vZGUuaWQgPT09IHRoaXMuZHJhZ2dpbmcucGFyZW50Py5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0FGVEVSICYmXG4gICAgICBkcm9wTm9kZS5uZXh0Py5pZCA9PT0gdGhpcy5kcmFnZ2luZy5pZFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkcm9wVHlwZSA9PSBEcm9wVHlwZS5EUk9QX0JFRk9SRSAmJlxuICAgICAgZHJvcE5vZGUucHJldmlvdXM/LmlkID09PSB0aGlzLmRyYWdnaW5nLmlkXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW50b05vZGUgPVxuICAgICAgZHJvcFR5cGUgPT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gZHJvcE5vZGUgOiBkcm9wTm9kZS5wYXJlbnQ7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5hbGxvd0Ryb3ApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5hbGxvd0Ryb3AodGhpcy5kcmFnZ2luZywgaW50b05vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHByZXZlbnQgZHJvcCBkaXJlY3RseSBhZnRlciBhIG5vZGUgb24gc2FtZSBsZXZlbCwgdGhhdCBpcyBleHBhbmRlZFxuICBzb3J0UHJlZGljYXRlKCk6IChcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGRyYWc6IENka0RyYWcsXG4gICAgZHJvcDogQ2RrRHJvcExpc3RcbiAgKSA9PiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIF9kcmFnOiBDZGtEcmFnPE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Pj4sXG4gICAgICBkcm9wOiBDZGtEcm9wTGlzdDxOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4+XG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4gaW5kZXggPT0gMCB8fCAhdGhpcy50cmVlQ29udHJvbC5pc0V4cGFuZGVkKGRyb3AuZGF0YSk7XG4gICAgfTtcbiAgfVxuXG4gIGRpc2FibGVEcmFnKG5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Pikge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8uYWxsb3dEcmFnID8gIXRoaXMuY29uZmlnLmFsbG93RHJhZyhub2RlKSA6IGZhbHNlO1xuICB9XG5cbiAga2V5RG93bkFycm93VXAoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2Fycm93IHVwJyk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGUuaXNGaXJzdENoaWxkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZSh0aGlzLnNlbGVjdGVkTm9kZS5wcmV2aW91cyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUobm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAga2V5RG93bkFycm93RG93bihldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGUuaXNMYXN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLm5leHQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQ/Lm5leHQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudC5uZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgICBpZiAobm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUobm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAga2V5RG93bkFycm93TGVmdChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGU/LnBhcmVudCkge1xuICAgICAgdGhpcy5zZWxlY3ROb2RlKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZE5vZGUpIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3ROb2RlKG5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIGtleURvd25BcnJvd1JpZ2h0KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSAmJiB0aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdE5vZGUodGhpcy5zZWxlY3RlZE5vZGUuY2hpbGRyZW5bMF0pO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlKSB7XG4gICAgICBjb25zdCBub2RlcyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZTtcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Tm9kZShub2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bi5lc2NhcGUnKVxuICBrZXlFc2NhcGVXaGlsZURyYWdnaW5nKCkge1xuICAgIGlmICh0aGlzLmRyYWdnaW5nKSB7XG4gICAgICB0aGlzLmNhbmNlbGVkQnlFc3EgPSB0cnVlO1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ21vdXNldXAnKSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRHJhZ1JlbGVhc2UoZXZlbnQ6IENka0RyYWdSZWxlYXNlPE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Pj4pIHtcbiAgICB0aGlzLmRyYWdnaW5nID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG1vdmVkTm9kZSA9IGV2ZW50LnNvdXJjZS5kYXRhO1xuICAgIGNvbnN0IGRyb3Bab25lSWQgPSAoPGFueT5ldmVudC5ldmVudC50YXJnZXQpLmlkO1xuICAgIGlmICghZHJvcFpvbmVJZCkge1xuICAgICAgLy8gbm8gdmFsaWQgZHJvcCB6b25lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcFpvbmVJbmZvID0gbmV3IERyb3Bab25lSW5mbyhkcm9wWm9uZUlkKTtcbiAgICBjb25zdCB0b05vZGUgPSB0aGlzLmFwaS5maW5kTm9kZUJ5SWQoZHJvcFpvbmVJbmZvLm5vZGVJZCk7XG4gICAgaWYgKCF0b05vZGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG5vZGUgd2l0aCBpZCAnJHtkcm9wWm9uZUluZm8ubm9kZUlkfScgY291bGQgbm90IGJlIGZvdW5kYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJvcFR5cGUgdW5kZWZpbmVkIGNhbiBoYXBwZW4gaWYgZHJvcHBlZCBkaXJlY3RseSB3aXRob3V0IG1vdmluZ1xuICAgIGlmICh0aGlzLmNhbmNlbGVkQnlFc3EgfHwgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsZWRCeUVzcSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluc2VydEludG9Ob2RlID1cbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9JTlRPID8gdG9Ob2RlIDogdG9Ob2RlLnBhcmVudDtcbiAgICBjb25zdCB3cmFwcGVyTGlzdCA9IGluc2VydEludG9Ob2RlPy5jaGlsZHJlbiA/PyB0aGlzLmRhdGFTb3VyY2UuZGF0YSQudmFsdWU7XG4gICAgY29uc3QgYWRkQXROb2RlSWR4ID0gdGhpcy5maW5kQWRkSW5kZXgoXG4gICAgICBkcm9wWm9uZUluZm8sXG4gICAgICBpbnNlcnRJbnRvTm9kZSxcbiAgICAgIHdyYXBwZXJMaXN0XG4gICAgKTtcblxuICAgIGNvbnN0IHJlbW92ZWRGcm9tSWR4ID0gdGhpcy5yZW1vdmVFbGVtZW50RnJvbVByZXZpb3VzUG9zaXRpb24obW92ZWROb2RlKTtcbiAgICAvLyBhZGQgZWxlbWVudCB0byBuZXcgUG9zaXRpb24sIHN1YnRyYWN0IG9uZSBpZiBpbnNlcnRlZCBpbiBzYW1lIGxpc3QgYWZ0ZXIgdGhlIHJlbW92ZSBwb3NpdGlvblxuICAgIChpbnNlcnRJbnRvTm9kZT8uZGF0YS5jaGlsZHJlbiA/PyB0aGlzLm5vZGVzISkuc3BsaWNlKFxuICAgICAgbW92ZWROb2RlLnBhcmVudD8uaWQgPT09IGluc2VydEludG9Ob2RlPy5pZCAmJlxuICAgICAgICByZW1vdmVkRnJvbUlkeCA8IGFkZEF0Tm9kZUlkeFxuICAgICAgICA/IGFkZEF0Tm9kZUlkeCAtIDFcbiAgICAgICAgOiBhZGRBdE5vZGVJZHgsXG4gICAgICAwLFxuICAgICAgbW92ZWROb2RlLmRhdGFcbiAgICApO1xuXG4gICAgY29uc3QgYWZ0ZXJOb2RlSWR4ID0gYWRkQXROb2RlSWR4IC0gMTtcbiAgICBjb25zdCBhZnRlck5vZGUgPVxuICAgICAgYWZ0ZXJOb2RlSWR4ID4gLTEgJiYgd3JhcHBlckxpc3QubGVuZ3RoID4gYWZ0ZXJOb2RlSWR4XG4gICAgICAgID8gd3JhcHBlckxpc3RbYWZ0ZXJOb2RlSWR4XVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGJlZm9yZU5vZGUgPVxuICAgICAgYWRkQXROb2RlSWR4ID4gLTEgJiYgd3JhcHBlckxpc3QubGVuZ3RoID4gYWRkQXROb2RlSWR4XG4gICAgICAgID8gd3JhcHBlckxpc3RbYWRkQXROb2RlSWR4XVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5vZGVNb3ZlZC5lbWl0KHtcbiAgICAgIG5vZGU6IG1vdmVkTm9kZSxcbiAgICAgIHBhcmVudDpcbiAgICAgICAgZHJvcFpvbmVJbmZvLmRyb3BUeXBlID09PSBEcm9wVHlwZS5EUk9QX0lOVE8gPyB0b05vZGUgOiB0b05vZGUucGFyZW50LFxuICAgICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGUsXG4gICAgICBiZWZvcmVOb2RlOiBiZWZvcmVOb2RlLFxuICAgIH0pO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBOZ2N4VHJlZURhdGFTb3VyY2UoXG4gICAgICB0aGlzLmNyZWF0ZVdyYXBwZXJOb2Rlcyh0aGlzLm5vZGVzISlcbiAgICApO1xuICAgIHRoaXMudHJlZUNvbnRyb2wuZGF0YU5vZGVzID0gdGhpcy5kYXRhU291cmNlLmRhdGEkLnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQWRkSW5kZXgoXG4gICAgZHJvcFpvbmVJbmZvOiBEcm9wWm9uZUluZm8sXG4gICAgaW5zZXJ0SW50b05vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PiB8IHVuZGVmaW5lZCxcbiAgICBpbnNlcnRJbnRvTGlzdDogTmdjeFRyZWVOb2RlV3JhcHBlcjxhbnk+W11cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgaW5zZXJ0SW50b05vZGUgJiZcbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9JTlRPICYmXG4gICAgICAhaW5zZXJ0SW50b05vZGUuZGF0YS5jaGlsZHJlblxuICAgICkge1xuICAgICAgaW5zZXJ0SW50b05vZGUuZGF0YS5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBsZXQgYWRkQXROb2RlSWR4ID0gMDtcbiAgICBpZiAoXG4gICAgICBkcm9wWm9uZUluZm8uZHJvcFR5cGUgPT09IERyb3BUeXBlLkRST1BfQUZURVIgfHxcbiAgICAgIGRyb3Bab25lSW5mby5kcm9wVHlwZSA9PT0gRHJvcFR5cGUuRFJPUF9CRUZPUkVcbiAgICApIHtcbiAgICAgIGFkZEF0Tm9kZUlkeCA9IGluc2VydEludG9MaXN0LmZpbmRJbmRleChcbiAgICAgICAgKGNoaWxkKSA9PiBjaGlsZC5pZCA9PT0gZHJvcFpvbmVJbmZvLm5vZGVJZFxuICAgICAgKTtcbiAgICAgIGlmIChkcm9wWm9uZUluZm8uZHJvcFR5cGUgPT09IERyb3BUeXBlLkRST1BfQUZURVIpIHtcbiAgICAgICAgYWRkQXROb2RlSWR4Kys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhZGRBdE5vZGVJZHg7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVsZW1lbnRGcm9tUHJldmlvdXNQb3NpdGlvbihcbiAgICBtb3ZlZE5vZGU6IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PlxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IHJlbW92ZUZyb21MaXN0ID0gbW92ZWROb2RlLnBhcmVudD8uZGF0YS5jaGlsZHJlbiA/PyB0aGlzLm5vZGVzITtcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IHJlbW92ZUZyb21MaXN0LmZpbmRJbmRleChcbiAgICAgIChjaGlsZDogYW55KSA9PiBjaGlsZC5pZCA9PT0gbW92ZWROb2RlLmlkXG4gICAgKTtcbiAgICByZW1vdmVGcm9tTGlzdC5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgIHJldHVybiByZW1vdmVJbmRleDtcbiAgfVxuXG4gIG5vZGVDbGlja2VkKG5vZGVXcmFwcGVyOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4pIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChub2RlV3JhcHBlcik7XG4gICAgaWYgKG5vZGVXcmFwcGVyLmlzU2VsZWN0YWJsZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZE5vZGUgPVxuICAgICAgICBub2RlV3JhcHBlci5pZCA9PT0gdGhpcy5zZWxlY3RlZE5vZGU/LmlkID8gdW5kZWZpbmVkIDogbm9kZVdyYXBwZXI7XG4gICAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQodGhpcy5zZWxlY3RlZE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdE5vZGUobm9kZVdyYXBwZXI6IE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghbm9kZVdyYXBwZXIgfHwgbm9kZVdyYXBwZXIuaXNTZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGVXcmFwcGVyO1xuICAgICAgbGV0IGV4cGFuZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZT8ucGFyZW50O1xuICAgICAgd2hpbGUgKGV4cGFuZE5vZGUpIHtcbiAgICAgICAgdGhpcy50cmVlQ29udHJvbC5leHBhbmQoZXhwYW5kTm9kZSk7XG4gICAgICAgIGV4cGFuZE5vZGUgPSBleHBhbmROb2RlLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0RXZlbnQuZW1pdCh0aGlzLnNlbGVjdGVkTm9kZSk7XG4gICAgfVxuICB9XG59XG5cbmVudW0gRHJvcFR5cGUge1xuICBEUk9QX0FGVEVSID0gJ0RST1BfQUZURVInLFxuICBEUk9QX0JFRk9SRSA9ICdEUk9QX0JFRk9SRScsXG4gIERST1BfSU5UTyA9ICdEUk9QX0lOVE8nLFxufVxuXG5leHBvcnQgY2xhc3MgTmdjeFRyZWVDb250cm9sIGltcGxlbWVudHMgTmdjeFRyZWVBcGk8YW55PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJlZUNvbXBvbmVudDogTmdjeFRyZWVDb21wb25lbnQpIHt9XG5cbiAgZ2V0IHRyZWVDb250cm9sKCk6IE5lc3RlZFRyZWVDb250cm9sPE5nY3hUcmVlTm9kZVdyYXBwZXI8YW55Piwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbXBvbmVudC50cmVlQ29udHJvbDtcbiAgfVxuXG4gIHNlbGVjdE5vZGVCeUlkKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRyZWVDb21wb25lbnQuc2VsZWN0Tm9kZSh0aGlzLmZpbmROb2RlQnlJZChpZCkpO1xuICB9XG5cbiAgZmluZE5vZGVCeUlkKGlkOiBzdHJpbmcpOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmROb2RlQnlJZEluTm9kZXMoXG4gICAgICB0aGlzLnRyZWVDb21wb25lbnQuZGF0YVNvdXJjZS5kYXRhJC52YWx1ZSxcbiAgICAgIGlkXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE5vZGVCeUlkSW5Ob2RlcyhcbiAgICBub2RlczogTmdjeFRyZWVOb2RlV3JhcHBlcjxhbnk+W10sXG4gICAgaWQ6IHN0cmluZ1xuICApOiBOZ2N4VHJlZU5vZGVXcmFwcGVyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgaWYgKG5vZGUuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZm91bmROb2RlID0gdGhpcy5maW5kTm9kZUJ5SWRJbk5vZGVzKG5vZGUuY2hpbGRyZW4sIGlkKTtcbiAgICAgICAgaWYgKGZvdW5kTm9kZSkge1xuICAgICAgICAgIHJldHVybiBmb3VuZE5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmNsYXNzIERyb3Bab25lSW5mbyB7XG4gIGRyb3BUeXBlOiBEcm9wVHlwZTtcbiAgbm9kZUlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHBvcyA9IGlkLmluZGV4T2YoJ18nKTtcbiAgICB0aGlzLm5vZGVJZCA9IGlkLnN1YnN0cmluZygwLCBwb3MpO1xuICAgIHRoaXMuZHJvcFR5cGUgPSA8YW55PmlkLnN1YnN0cmluZyhwb3MgKyAxKTtcbiAgfVxufVxuIiwiPGNkay10cmVlXG4gICN0cmVlXG4gIGNsYXNzPVwibmdjeC10cmVlXCJcbiAgKm5nSWY9XCJkYXRhU291cmNlXCJcbiAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gIFt0cmVlQ29udHJvbF09XCJ0cmVlQ29udHJvbFwiXG4gIGNka0Ryb3BMaXN0R3JvdXBcbiAgW2NsYXNzLmRyYWdnaW5nXT1cImRyYWdnaW5nXCJcbiAgKGtleXVwLmFycm93dXApPVwia2V5RG93bkFycm93VXAoJGV2ZW50KVwiXG4gIChrZXlkb3duLmFycm93ZG93bik9XCJrZXlEb3duQXJyb3dEb3duKCRldmVudClcIlxuICAoa2V5ZG93bi5hcnJvd2xlZnQpPVwia2V5RG93bkFycm93TGVmdCgkZXZlbnQpXCJcbiAgKGtleWRvd24uYXJyb3dyaWdodCk9XCJrZXlEb3duQXJyb3dSaWdodCgkZXZlbnQpXCJcbiAgdGFiaW5kZXg9XCIwXCI+XG4gIDxjZGstbmVzdGVkLXRyZWUtbm9kZSAqY2RrVHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiIGNsYXNzPVwidHJlZS1ub2RlXCI+XG4gICAgPGRpdlxuICAgICAgY2RrRHJvcExpc3RcbiAgICAgIFtpZF09XCJub2RlLmlkICsgJ18nICsgRHJvcFR5cGUuRFJPUF9BRlRFUlwiXG4gICAgICBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXItZHJvcC16b25lIGFmdGVyLWV4cGFuZGVkLW5vZGVcIlxuICAgICAgW2NsYXNzLmhpZGVdPVwiXG4gICAgICAgICFkcmFnZ2luZyB8fFxuICAgICAgICAhYWxsb3dEcm9wKG5vZGUsIERyb3BUeXBlLkRST1BfQUZURVIpIHx8XG4gICAgICAgICF0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXG4gICAgICBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWluc2VydC1saW5lXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2lkXT1cIm5vZGUuaWQgKyAnXycgKyBEcm9wVHlwZS5EUk9QX0JFRk9SRVwiXG4gICAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgYmVmb3JlLW5vZGVcIlxuICAgICAgICBbY2xhc3MuaGlkZV09XCJcbiAgICAgICAgICAhZHJhZ2dpbmcgfHxcbiAgICAgICAgICAhbm9kZS5pc0ZpcnN0Q2hpbGQgfHxcbiAgICAgICAgICAhYWxsb3dEcm9wKG5vZGUsIERyb3BUeXBlLkRST1BfQkVGT1JFKVxuICAgICAgICBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtaW5zZXJ0LWxpbmVcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbaWRdPVwibm9kZS5pZCArICdfJyArIERyb3BUeXBlLkRST1BfSU5UT1wiXG4gICAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNvbnRhaW5lci1kcm9wLXpvbmUgaW50by1ub2RlXCJcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWRyYWdnaW5nIHx8ICFhbGxvd0Ryb3Aobm9kZSwgRHJvcFR5cGUuRFJPUF9JTlRPKVwiPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICBbaWRdPVwibm9kZS5pZCArICdfJyArIERyb3BUeXBlLkRST1BfQUZURVJcIlxuICAgICAgICBjbGFzcz1cInRyZWUtbm9kZS1jb250YWluZXItZHJvcC16b25lIGFmdGVyLW5vZGVcIlxuICAgICAgICBbY2xhc3MubGFzdF09XCJub2RlLmlzTGFzdENoaWxkXCJcbiAgICAgICAgW2NsYXNzLmhpZGVdPVwiXG4gICAgICAgICAgIWRyYWdnaW5nIHx8XG4gICAgICAgICAgdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKSB8fFxuICAgICAgICAgICFhbGxvd0Ryb3Aobm9kZSwgRHJvcFR5cGUuRFJPUF9BRlRFUilcbiAgICAgICAgXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWluc2VydC1saW5lXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJub2RlXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RW50ZXJQcmVkaWNhdGVdPVwiZGlzYWJsZVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRQcmVkaWNhdGVdPVwiZGlzYWJsZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIFtjZGtEcmFnRGlzYWJsZWRdPVwiZGlzYWJsZURyYWcobm9kZSlcIlxuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJub2RlXCJcbiAgICAgICAgICAoY2RrRHJhZ1N0YXJ0ZWQpPVwiZHJhZ2dpbmcgPSBub2RlXCJcbiAgICAgICAgICAoY2RrRHJhZ1JlbGVhc2VkKT1cImhhbmRsZURyYWdSZWxlYXNlKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2ICpjZGtEcmFnUGxhY2Vob2xkZXI+PC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtY29udGVudC1jb250YWluZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmZpcnN0XT1cIm5vZGUuaXNGaXJzdENoaWxkXCJcbiAgICAgICAgICAgIFtjbGFzcy5sYXN0XT1cIm5vZGUuaXNMYXN0Q2hpbGRcIlxuICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cInRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSlcIj5cbiAgICAgICAgICAgIDxuZ2N4LXRyZWUtbm9kZVxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcbiAgICAgICAgICAgICAgW25vZGVXcmFwcGVyXT1cIm5vZGVcIlxuICAgICAgICAgICAgICBbaXNTZWxlY3RlZF09XCJub2RlLmlkID09PSBzZWxlY3RlZE5vZGU/LmlkXCJcbiAgICAgICAgICAgICAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgICAgICAgICAgICAgW3RyZWVDb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgICAgICAgKGN1c3RvbUV2ZW50KT1cImN1c3RvbUV2ZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjbGlja0V2ZW50KT1cIm5vZGVDbGlja2VkKG5vZGUpXCI+PC9uZ2N4LXRyZWUtbm9kZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZ2N4LXRyZWUtbm9kZVxuICAgICAgICAgICpuZ0lmPVwibm9kZS5pZCA9PT0gZHJhZ2dpbmc/LmlkXCJcbiAgICAgICAgICBbbm9kZVdyYXBwZXJdPVwibm9kZVwiXG4gICAgICAgICAgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCJcbiAgICAgICAgICBbdHJlZUNvbmZpZ109XCJjb25maWdcIj48L25nY3gtdHJlZS1ub2RlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJ0cmVlQ29udHJvbC5pc0V4cGFuZGVkKG5vZGUpXCJcbiAgICAgIGNsYXNzPVwidHJlZS1ub2RlLWNoaWxkcmVuLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3MuZmlyc3RdPVwibm9kZS5pc0ZpcnN0Q2hpbGRcIlxuICAgICAgW2NsYXNzLmxhc3RdPVwibm9kZS5pc0xhc3RDaGlsZFwiPlxuICAgICAgPGRpdiBjZGtUcmVlTm9kZU91dGxldD48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9jZGstbmVzdGVkLXRyZWUtbm9kZT5cbjwvY2RrLXRyZWU+XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Public API Surface of ngcx-tree
3
+ */
4
+ export * from './lib/ngcx-tree/ngcx-tree-models';
5
+ export * from './lib/ngcx-tree/ngcx-tree.component';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nY3gtdHJlZS9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgbmdjeC10cmVlXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmdjeC10cmVlL25nY3gtdHJlZS1tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbmdjeC10cmVlL25nY3gtdHJlZS5jb21wb25lbnQnO1xuIl19