concepto-user-controls 0.0.11 → 0.0.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.
- package/esm2022/lib/concepto-tree/concepto-tree.component.mjs +35 -29
- package/esm2022/public-api.mjs +5 -1
- package/fesm2022/concepto-user-controls.mjs +34 -28
- package/fesm2022/concepto-user-controls.mjs.map +1 -1
- package/lib/concepto-tree/concepto-tree.component.d.ts +2 -3
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, signal } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, signal, computed } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
4
|
import { TreeRootComponent } from './components/tree-root/tree-root.component';
|
|
@@ -20,50 +20,56 @@ export class ConceptoTreeComponent {
|
|
|
20
20
|
loadChildren = new EventEmitter();
|
|
21
21
|
treeEvent = new EventEmitter();
|
|
22
22
|
treeRoot;
|
|
23
|
+
// Estado con Signals
|
|
23
24
|
isDropdownOpen = signal(false);
|
|
24
|
-
searchTerm = '';
|
|
25
|
+
searchTerm = signal(''); // Cambiamos a Signal
|
|
25
26
|
selectedNode = signal(null);
|
|
26
|
-
//
|
|
27
|
+
// Almacén de todos los nodos (no necesita ser signal porque no cambia tras la carga inicial)
|
|
27
28
|
allNodes = [];
|
|
28
|
-
|
|
29
|
+
// Signal computada: Se actualiza sola cuando cambia searchTerm o allNodes es asignado
|
|
30
|
+
filteredNodes = computed(() => {
|
|
31
|
+
const term = this.searchTerm().toLowerCase();
|
|
32
|
+
if (!term)
|
|
33
|
+
return this.allNodes;
|
|
34
|
+
return this.allNodes.filter(node => String(node.data[this.displayField]).toLowerCase().includes(term));
|
|
35
|
+
});
|
|
29
36
|
get displayField() {
|
|
30
37
|
return this.options.displayField || 'name';
|
|
31
38
|
}
|
|
32
39
|
toggleDropdown() {
|
|
33
40
|
this.isDropdownOpen.update(v => !v);
|
|
34
41
|
if (this.isDropdownOpen()) {
|
|
35
|
-
this.searchTerm
|
|
36
|
-
this.filterNodes();
|
|
42
|
+
this.searchTerm.set(''); // Reseteamos el término al abrir
|
|
37
43
|
}
|
|
38
44
|
}
|
|
39
45
|
closeDropdown() {
|
|
40
46
|
this.isDropdownOpen.set(false);
|
|
41
47
|
}
|
|
42
|
-
filterNodes() {
|
|
43
|
-
if (!this.searchTerm) {
|
|
44
|
-
this.filteredNodes.set(this.allNodes);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
const term = this.searchTerm.toLowerCase();
|
|
48
|
-
this.filteredNodes.set(this.allNodes.filter(node => String(node.data[this.displayField]).toLowerCase().includes(term)));
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
48
|
selectNode(node) {
|
|
52
49
|
this.selectedNode.set(node);
|
|
53
50
|
this.isDropdownOpen.set(false);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
if (this.treeRoot?.treeModel) {
|
|
52
|
+
// Usamos el API de la librería para activar
|
|
53
|
+
node.setActiveAndVisible();
|
|
54
|
+
// O si prefieres: this.treeRoot.treeModel.activateNode(node);
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
57
|
onTreeInitialized(event) {
|
|
61
58
|
this.initialized.emit(event);
|
|
62
|
-
//
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
// Mantenemos el setTimeout para evitar el error 'firstCreatePass'
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
if (event.treeModel) {
|
|
62
|
+
this.allNodes = event.treeModel.getAllNodes();
|
|
63
|
+
// Buscamos manualmente el nodo activo si existe
|
|
64
|
+
const activeNode = this.allNodes.find(n => n.isActive);
|
|
65
|
+
if (activeNode) {
|
|
66
|
+
this.selectedNode.set(activeNode);
|
|
67
|
+
}
|
|
68
|
+
// Forzamos una actualización inicial de la lista filtrada
|
|
69
|
+
// Al setear searchTerm de nuevo, disparas el computed
|
|
70
|
+
this.searchTerm.set('');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
67
73
|
}
|
|
68
74
|
onNodeActivated(event) {
|
|
69
75
|
this.activate.emit(event);
|
|
@@ -88,8 +94,8 @@ export class ConceptoTreeComponent {
|
|
|
88
94
|
<div class="search-input-wrapper" (click)="$event.stopPropagation()">
|
|
89
95
|
<input
|
|
90
96
|
type="text"
|
|
91
|
-
[
|
|
92
|
-
(ngModelChange)="
|
|
97
|
+
[ngModel]="searchTerm()"
|
|
98
|
+
(ngModelChange)="searchTerm.set($event)"
|
|
93
99
|
placeholder="Buscar..."
|
|
94
100
|
class="search-input"
|
|
95
101
|
#searchInput
|
|
@@ -147,8 +153,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
147
153
|
<div class="search-input-wrapper" (click)="$event.stopPropagation()">
|
|
148
154
|
<input
|
|
149
155
|
type="text"
|
|
150
|
-
[
|
|
151
|
-
(ngModelChange)="
|
|
156
|
+
[ngModel]="searchTerm()"
|
|
157
|
+
(ngModelChange)="searchTerm.set($event)"
|
|
152
158
|
placeholder="Buscar..."
|
|
153
159
|
class="search-input"
|
|
154
160
|
#searchInput
|
|
@@ -217,4 +223,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
217
223
|
type: ViewChild,
|
|
218
224
|
args: [TreeRootComponent]
|
|
219
225
|
}] } });
|
|
220
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2VwdG8tdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25jZXB0by11c2VyLWNvbnRyb2xzL3NyYy9saWIvY29uY2VwdG8tdHJlZS9jb25jZXB0by10cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7OztBQW9ML0UsTUFBTSxPQUFPLHFCQUFxQjtJQUN2QixLQUFLLEdBQVUsRUFBRSxDQUFDO0lBQ2xCLE9BQU8sR0FBeUIsRUFBRSxDQUFDO0lBRWxDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQzVDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQy9DLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQ3pDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQzNDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQ3ZDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQ3pDLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQ3RDLElBQUksR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQ3JDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQ3pDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO0lBQzdDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RFQscThDQXpEUyxZQUFZLCtQQUFFLFdBQVcsK21CQUFFLGlCQUFpQjs7NEZBNEszQyxxQkFBcUI7a0JBL0tqQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLG1CQUN0Qyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURUOzhCQW9IUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFdUIsUUFBUTtzQkFBckMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmVlUm9vdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy90cmVlLXJvb3QvdHJlZS1yb290LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyZWVPcHRpb25zIH0gZnJvbSAnLi9jb3JlL21vZGVscy90cmVlLW9wdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmVlRXZlbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL3RyZWUtZXZlbnRzLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICcuL2NvcmUvbW9kZWxzL3RyZWUtbm9kZS5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jb25jZXB0by10cmVlJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBUcmVlUm9vdENvbXBvbmVudF0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJjb25jZXB0by10cmVlLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWJhci1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiIFtjbGFzcy5vcGVuXT1cImlzRHJvcGRvd25PcGVuKClcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1vcHRpb25cIj5cclxuICAgICAgICAgICAgIHt7IHNlbGVjdGVkTm9kZSgpID8gc2VsZWN0ZWROb2RlKCk/LmRhdGE/LltkaXNwbGF5RmllbGRdIDogJ0J1c2NhciBub2RvLi4uJyB9fVxyXG4gICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvd1wiPjxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNNiA5TDEyIDE1TDE4IDlcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIvPjwvc3ZnPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYWNrZHJvcFwiICpuZ0lmPVwiaXNEcm9wZG93bk9wZW4oKVwiIChjbGljayk9XCJjbG9zZURyb3Bkb3duKClcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzRHJvcGRvd25PcGVuKClcIj5cclxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0LXdyYXBwZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGVybVwiIFxyXG4gICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJOb2RlcygpXCJcclxuICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJCdXNjYXIuLi5cIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dFxyXG4gICAgICAgICAgICAgICBhdXRvZm9jdXNcclxuICAgICAgICAgICAgID5cclxuICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy1saXN0XCI+XHJcbiAgICAgICAgICAgICA8ZGl2IFxyXG4gICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbm9kZSBvZiBmaWx0ZXJlZE5vZGVzKClcIiBcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJvcHRpb24taXRlbVwiIFxyXG4gICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Tm9kZShub2RlKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAge3sgbm9kZS5kYXRhW2Rpc3BsYXlGaWVsZF0gfX1cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkTm9kZXMoKS5sZW5ndGggPT09IDBcIiBjbGFzcz1cIm5vLXJlc3VsdHNcIj5cclxuICAgICAgICAgICAgICAgTm8gc2UgZW5jb250cmFyb24gcmVzdWx0YWRvc1xyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHRyZWUtcm9vdFxyXG4gICAgICAgIFtub2Rlc109XCJub2Rlc1wiXHJcbiAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXHJcbiAgICAgICAgKGluaXRpYWxpemVkKT1cIm9uVHJlZUluaXRpYWxpemVkKCRldmVudClcIlxyXG4gICAgICAgICh0b2dnbGVFeHBhbmRlZCk9XCJ0b2dnbGVFeHBhbmRlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChhY3RpdmF0ZSk9XCJvbk5vZGVBY3RpdmF0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGRlYWN0aXZhdGUpPVwiZGVhY3RpdmF0ZS5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChzZWxlY3QpPVwic2VsZWN0LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGRlc2VsZWN0KT1cImRlc2VsZWN0LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGZvY3VzKT1cImZvY3VzLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwiYmx1ci5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChtb3ZlTm9kZSk9XCJtb3ZlTm9kZS5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChsb2FkQ2hpbGRyZW4pPVwibG9hZENoaWxkcmVuLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgKHRyZWVFdmVudCk9XCJ0cmVlRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgPjwvdHJlZS1yb290PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuY29uY2VwdG8tdHJlZS1jb250YWluZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgIGdhcDogMTBweDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnNlYXJjaC1iYXItY29udGFpbmVyIHtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgei1pbmRleDogMTAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5jdXN0b20tc2VsZWN0IHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiA4cHggMTJweDtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIGJhY2tncm91bmQ6ICNlN2U3ZTc7XHJcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycztcclxuICAgIH1cclxuXHJcbiAgICAuY3VzdG9tLXNlbGVjdDpob3ZlciB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzg4ODtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLmN1c3RvbS1zZWxlY3Qub3BlbiB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzAwN2JmZjtcclxuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcclxuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLmJhY2tkcm9wIHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICB0b3A6IDA7XHJcbiAgICAgIGxlZnQ6IDA7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgIHotaW5kZXg6IDEwMTtcclxuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmRyb3Bkb3duLW1lbnUge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogMTAwJTtcclxuICAgICAgbGVmdDogMDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgICBib3JkZXItdG9wOiBub25lO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDtcclxuICAgICAgYm94LXNoYWRvdzogMCA0cHggNnB4IHJnYmEoMCwwLDAsMC4xKTtcclxuICAgICAgbWFyZ2luLXRvcDogMDtcclxuICAgICAgbWF4LWhlaWdodDogMzAwcHg7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIHotaW5kZXg6IDEwMjtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLWlucHV0LXdyYXBwZXIge1xyXG4gICAgICBwYWRkaW5nOiA4cHg7XHJcbiAgICAgIHBvc2l0aW9uOiBzdGlja3k7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlO1xyXG4gICAgICB6LWluZGV4OiAxMDM7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1pbnB1dCB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBwYWRkaW5nOiA4cHg7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgb3V0bGluZTogbm9uZTtcclxuICAgICAgYmFja2dyb3VuZDogI2U3ZTdlNztcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnNlYXJjaC1pbnB1dDpmb2N1cyB7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzAwN2JmZjtcclxuICAgIH1cclxuXHJcbiAgICAub3B0aW9ucy1saXN0IHtcclxuICAgICAgbWF4LWhlaWdodDogMjUwcHg7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1pdGVtIHtcclxuICAgICAgcGFkZGluZzogOHB4IDEycHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjFzO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24taXRlbTpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XHJcbiAgICB9XHJcblxyXG4gICAgLm5vLXJlc3VsdHMge1xyXG4gICAgICBwYWRkaW5nOiAxMnB4O1xyXG4gICAgICBjb2xvcjogIzg4ODtcclxuICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRyZWUtcm9vdCB7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB9XHJcbiAgYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbmNlcHRvVHJlZUNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgbm9kZXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgb3B0aW9uczogUGFydGlhbDxUcmVlT3B0aW9ucz4gPSB7fTtcclxuXHJcbiAgQE91dHB1dCgpIGluaXRpYWxpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIHRvZ2dsZUV4cGFuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGFjdGl2YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGRlYWN0aXZhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGRlc2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgbW92ZU5vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgbG9hZENoaWxkcmVuID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIHRyZWVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG5cclxuICBAVmlld0NoaWxkKFRyZWVSb290Q29tcG9uZW50KSB0cmVlUm9vdCE6IFRyZWVSb290Q29tcG9uZW50O1xyXG5cclxuICBpc0Ryb3Bkb3duT3BlbiA9IHNpZ25hbChmYWxzZSk7XHJcbiAgc2VhcmNoVGVybSA9ICcnO1xyXG4gIHNlbGVjdGVkTm9kZSA9IHNpZ25hbDxUcmVlTm9kZSB8IG51bGw+KG51bGwpO1xyXG5cclxuICAvLyBBbGwgbm9kZXMgZmxhdHRlbmVkXHJcbiAgcHJpdmF0ZSBhbGxOb2RlczogVHJlZU5vZGVbXSA9IFtdO1xyXG4gIGZpbHRlcmVkTm9kZXMgPSBzaWduYWw8VHJlZU5vZGVbXT4oW10pO1xyXG5cclxuICBnZXQgZGlzcGxheUZpZWxkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRpc3BsYXlGaWVsZCB8fCAnbmFtZSc7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4udXBkYXRlKHYgPT4gIXYpO1xyXG4gICAgaWYgKHRoaXMuaXNEcm9wZG93bk9wZW4oKSkge1xyXG4gICAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcclxuICAgICAgdGhpcy5maWx0ZXJOb2RlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4uc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck5vZGVzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlYXJjaFRlcm0pIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZE5vZGVzLnNldCh0aGlzLmFsbE5vZGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRlcm0gPSB0aGlzLnNlYXJjaFRlcm0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgdGhpcy5maWx0ZXJlZE5vZGVzLnNldChcclxuICAgICAgICB0aGlzLmFsbE5vZGVzLmZpbHRlcihub2RlID0+XHJcbiAgICAgICAgICBTdHJpbmcobm9kZS5kYXRhW3RoaXMuZGlzcGxheUZpZWxkXSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdE5vZGUobm9kZTogVHJlZU5vZGUpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWROb2RlLnNldChub2RlKTtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4uc2V0KGZhbHNlKTtcclxuXHJcbiAgICAvLyBBY3RpdmF0ZSBpbiB0cmVlXHJcbiAgICBpZiAodGhpcy50cmVlUm9vdCAmJiB0aGlzLnRyZWVSb290LnRyZWVNb2RlbCkge1xyXG4gICAgICB0aGlzLnRyZWVSb290LnRyZWVNb2RlbC5hY3RpdmF0ZU5vZGUobm9kZSk7XHJcbiAgICAgIG5vZGUuZW5zdXJlVmlzaWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25UcmVlSW5pdGlhbGl6ZWQoZXZlbnQ6IFRyZWVFdmVudCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplZC5lbWl0KGV2ZW50KTtcclxuICAgIC8vIEdldCBhbGwgbm9kZXMgZm9yIHRoZSBkcm9wZG93blxyXG4gICAgaWYgKGV2ZW50LnRyZWVNb2RlbCkge1xyXG4gICAgICB0aGlzLmFsbE5vZGVzID0gZXZlbnQudHJlZU1vZGVsLmdldEFsbE5vZGVzKCk7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWROb2Rlcy5zZXQodGhpcy5hbGxOb2Rlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk5vZGVBY3RpdmF0ZWQoZXZlbnQ6IFRyZWVFdmVudCkge1xyXG4gICAgdGhpcy5hY3RpdmF0ZS5lbWl0KGV2ZW50KTtcclxuICAgIGlmIChldmVudC5ub2RlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnNldChldmVudC5ub2RlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2VwdG8tdHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25jZXB0by11c2VyLWNvbnRyb2xzL3NyYy9saWIvY29uY2VwdG8tdHJlZS9jb25jZXB0by10cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7Ozs7QUFvTC9FLE1BQU0sT0FBTyxxQkFBcUI7SUFDdkIsS0FBSyxHQUFVLEVBQUUsQ0FBQztJQUNsQixPQUFPLEdBQXlCLEVBQUUsQ0FBQztJQUVsQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUM1QyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUMvQyxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUN6QyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUMzQyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUN2QyxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUN6QyxLQUFLLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUN0QyxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUNyQyxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUN6QyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztJQUM3QyxTQUFTLEdBQUcsSUFB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SUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7d0dBeEZVLHFCQUFxQjs0RkFBckIscUJBQXFCLG9iQWdCckIsaUJBQWlCLGdEQTFMbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RFQscThDQXpEUyxZQUFZLCtQQUFFLFdBQVcsK21CQUFFLGlCQUFpQjs7NEZBNEszQyxxQkFBcUI7a0JBL0tqQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLG1CQUN0Qyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURUOzhCQW9IUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFdUIsUUFBUTtzQkFBckMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJlZVJvb3RDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvdHJlZS1yb290L3RyZWUtcm9vdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmVlT3B0aW9ucyB9IGZyb20gJy4vY29yZS9tb2RlbHMvdHJlZS1vcHRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgVHJlZUV2ZW50IH0gZnJvbSAnLi9jb3JlL21vZGVscy90cmVlLWV2ZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi9jb3JlL21vZGVscy90cmVlLW5vZGUubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY29uY2VwdG8tdHJlZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgVHJlZVJvb3RDb21wb25lbnRdLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29uY2VwdG8tdHJlZS1jb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1iYXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIiBbY2xhc3Mub3Blbl09XCJpc0Ryb3Bkb3duT3BlbigpXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIj5cclxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICB7eyBzZWxlY3RlZE5vZGUoKSA/IHNlbGVjdGVkTm9kZSgpPy5kYXRhPy5bZGlzcGxheUZpZWxkXSA6ICdCdXNjYXIgbm9kby4uLicgfX1cclxuICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3dcIj48c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTYgOUwxMiAxNUwxOCA5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiLz48L3N2Zz48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFja2Ryb3BcIiAqbmdJZj1cImlzRHJvcGRvd25PcGVuKClcIiAoY2xpY2spPVwiY2xvc2VEcm9wZG93bigpXCI+PC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgKm5nSWY9XCJpc0Ryb3Bkb3duT3BlbigpXCI+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hUZXJtKClcIlxyXG4gICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hUZXJtLnNldCgkZXZlbnQpXCIgXHJcbiAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQnVzY2FyLi4uXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcclxuICAgICAgICAgICAgICAgYXV0b2ZvY3VzXHJcbiAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtbGlzdFwiPlxyXG4gICAgICAgICAgICAgPGRpdiBcclxuICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2YgZmlsdGVyZWROb2RlcygpXCIgXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uLWl0ZW1cIiBcclxuICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE5vZGUobm9kZSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgIHt7IG5vZGUuZGF0YVtkaXNwbGF5RmllbGRdIH19XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZE5vZGVzKCkubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXN1bHRzXCI+XHJcbiAgICAgICAgICAgICAgIE5vIHNlIGVuY29udHJhcm9uIHJlc3VsdGFkb3NcclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDx0cmVlLXJvb3RcclxuICAgICAgICBbbm9kZXNdPVwibm9kZXNcIlxyXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxyXG4gICAgICAgIChpbml0aWFsaXplZCk9XCJvblRyZWVJbml0aWFsaXplZCgkZXZlbnQpXCJcclxuICAgICAgICAodG9nZ2xlRXhwYW5kZWQpPVwidG9nZ2xlRXhwYW5kZWQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAoYWN0aXZhdGUpPVwib25Ob2RlQWN0aXZhdGVkKCRldmVudClcIlxyXG4gICAgICAgIChkZWFjdGl2YXRlKT1cImRlYWN0aXZhdGUuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAoc2VsZWN0KT1cInNlbGVjdC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChkZXNlbGVjdCk9XCJkZXNlbGVjdC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJmb2N1cy5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIChibHVyKT1cImJsdXIuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAobW92ZU5vZGUpPVwibW92ZU5vZGUuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAobG9hZENoaWxkcmVuKT1cImxvYWRDaGlsZHJlbi5lbWl0KCRldmVudClcIlxyXG4gICAgICAgICh0cmVlRXZlbnQpPVwidHJlZUV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgID48L3RyZWUtcm9vdD5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmNvbmNlcHRvLXRyZWUtY29udGFpbmVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICBnYXA6IDEwcHg7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zZWFyY2gtYmFyLWNvbnRhaW5lciB7XHJcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIHotaW5kZXg6IDEwMDtcclxuICAgIH1cclxuXHJcbiAgICAuY3VzdG9tLXNlbGVjdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgcGFkZGluZzogOHB4IDEycHg7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBiYWNrZ3JvdW5kOiAjZTdlN2U3O1xyXG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnM7XHJcbiAgICB9XHJcblxyXG4gICAgLmN1c3RvbS1zZWxlY3Q6aG92ZXIge1xyXG4gICAgICBib3JkZXItY29sb3I6ICM4ODg7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5jdXN0b20tc2VsZWN0Lm9wZW4ge1xyXG4gICAgICBib3JkZXItY29sb3I6ICMwMDdiZmY7XHJcbiAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XHJcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5iYWNrZHJvcCB7XHJcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgdG9wOiAwO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICB6LWluZGV4OiAxMDE7XHJcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5kcm9wZG93bi1tZW51IHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB0b3A6IDEwMCU7XHJcbiAgICAgIGxlZnQ6IDA7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgICAgYm9yZGVyLXRvcDogbm9uZTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDRweCA0cHg7XHJcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDZweCByZ2JhKDAsMCwwLDAuMSk7XHJcbiAgICAgIG1hcmdpbi10b3A6IDA7XHJcbiAgICAgIG1heC1oZWlnaHQ6IDMwMHB4O1xyXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICB6LWluZGV4OiAxMDI7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1pbnB1dC13cmFwcGVyIHtcclxuICAgICAgcGFkZGluZzogOHB4O1xyXG4gICAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgICB0b3A6IDA7XHJcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTtcclxuICAgICAgei1pbmRleDogMTAzO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtaW5wdXQge1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgcGFkZGluZzogOHB4O1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgICAgIGJhY2tncm91bmQ6ICNlN2U3ZTc7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zZWFyY2gtaW5wdXQ6Zm9jdXMge1xyXG4gICAgICBib3JkZXItY29sb3I6ICMwMDdiZmY7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbnMtbGlzdCB7XHJcbiAgICAgIG1heC1oZWlnaHQ6IDI1MHB4O1xyXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24taXRlbSB7XHJcbiAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xcztcclxuICAgIH1cclxuXHJcbiAgICAub3B0aW9uLWl0ZW06aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xyXG4gICAgfVxyXG5cclxuICAgIC5uby1yZXN1bHRzIHtcclxuICAgICAgcGFkZGluZzogMTJweDtcclxuICAgICAgY29sb3I6ICM4ODg7XHJcbiAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcclxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0cmVlLXJvb3Qge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25jZXB0b1RyZWVDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIG5vZGVzOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFBhcnRpYWw8VHJlZU9wdGlvbnM+ID0ge307XHJcblxyXG4gIEBPdXRwdXQoKSBpbml0aWFsaXplZCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSB0b2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBhY3RpdmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBkZWFjdGl2YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBkZXNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIG1vdmVOb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmVlRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIGxvYWRDaGlsZHJlbiA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSB0cmVlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVFdmVudD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChUcmVlUm9vdENvbXBvbmVudCkgdHJlZVJvb3QhOiBUcmVlUm9vdENvbXBvbmVudDtcclxuXHJcbiAgLy8gRXN0YWRvIGNvbiBTaWduYWxzXHJcbiAgaXNEcm9wZG93bk9wZW4gPSBzaWduYWwoZmFsc2UpO1xyXG4gIHNlYXJjaFRlcm0gPSBzaWduYWwoJycpOyAvLyBDYW1iaWFtb3MgYSBTaWduYWxcclxuICBzZWxlY3RlZE5vZGUgPSBzaWduYWw8VHJlZU5vZGUgfCBudWxsPihudWxsKTtcclxuICBcclxuICAvLyBBbG1hY8OpbiBkZSB0b2RvcyBsb3Mgbm9kb3MgKG5vIG5lY2VzaXRhIHNlciBzaWduYWwgcG9ycXVlIG5vIGNhbWJpYSB0cmFzIGxhIGNhcmdhIGluaWNpYWwpXHJcbiAgcHJpdmF0ZSBhbGxOb2RlczogVHJlZU5vZGVbXSA9IFtdO1xyXG5cclxuICAvLyBTaWduYWwgY29tcHV0YWRhOiBTZSBhY3R1YWxpemEgc29sYSBjdWFuZG8gY2FtYmlhIHNlYXJjaFRlcm0gbyBhbGxOb2RlcyBlcyBhc2lnbmFkb1xyXG4gIGZpbHRlcmVkTm9kZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5zZWFyY2hUZXJtKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMuYWxsTm9kZXM7XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLmFsbE5vZGVzLmZpbHRlcihub2RlID0+XHJcbiAgICAgIFN0cmluZyhub2RlLmRhdGFbdGhpcy5kaXNwbGF5RmllbGRdKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pXHJcbiAgICApO1xyXG4gIH0pO1xyXG5cclxuICBnZXQgZGlzcGxheUZpZWxkKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmRpc3BsYXlGaWVsZCB8fCAnbmFtZSc7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4udXBkYXRlKHYgPT4gIXYpO1xyXG4gICAgaWYgKHRoaXMuaXNEcm9wZG93bk9wZW4oKSkge1xyXG4gICAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTsgLy8gUmVzZXRlYW1vcyBlbCB0w6lybWlubyBhbCBhYnJpclxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VEcm9wZG93bigpIHtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4uc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdE5vZGUobm9kZTogVHJlZU5vZGUpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWROb2RlLnNldChub2RlKTtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4uc2V0KGZhbHNlKTtcclxuXHJcbiAgICBpZiAodGhpcy50cmVlUm9vdD8udHJlZU1vZGVsKSB7XHJcbiAgICAgIC8vIFVzYW1vcyBlbCBBUEkgZGUgbGEgbGlicmVyw61hIHBhcmEgYWN0aXZhclxyXG4gICAgICBub2RlLnNldEFjdGl2ZUFuZFZpc2libGUoKTsgXHJcbiAgICAgIC8vIE8gc2kgcHJlZmllcmVzOiB0aGlzLnRyZWVSb290LnRyZWVNb2RlbC5hY3RpdmF0ZU5vZGUobm9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblRyZWVJbml0aWFsaXplZChldmVudDogVHJlZUV2ZW50KSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVkLmVtaXQoZXZlbnQpO1xyXG4gIFxyXG4gICAgLy8gTWFudGVuZW1vcyBlbCBzZXRUaW1lb3V0IHBhcmEgZXZpdGFyIGVsIGVycm9yICdmaXJzdENyZWF0ZVBhc3MnXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRyZWVNb2RlbCkge1xyXG4gICAgICAgIHRoaXMuYWxsTm9kZXMgPSBldmVudC50cmVlTW9kZWwuZ2V0QWxsTm9kZXMoKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBCdXNjYW1vcyBtYW51YWxtZW50ZSBlbCBub2RvIGFjdGl2byBzaSBleGlzdGVcclxuICAgICAgICBjb25zdCBhY3RpdmVOb2RlID0gdGhpcy5hbGxOb2Rlcy5maW5kKG4gPT4gbi5pc0FjdGl2ZSk7XHJcbiAgICAgICAgaWYgKGFjdGl2ZU5vZGUpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnNldChhY3RpdmVOb2RlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRm9yemFtb3MgdW5hIGFjdHVhbGl6YWNpw7NuIGluaWNpYWwgZGUgbGEgbGlzdGEgZmlsdHJhZGFcclxuICAgICAgICAvLyBBbCBzZXRlYXIgc2VhcmNoVGVybSBkZSBudWV2bywgZGlzcGFyYXMgZWwgY29tcHV0ZWRcclxuICAgICAgICB0aGlzLnNlYXJjaFRlcm0uc2V0KCcnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbk5vZGVBY3RpdmF0ZWQoZXZlbnQ6IFRyZWVFdmVudCkge1xyXG4gICAgdGhpcy5hY3RpdmF0ZS5lbWl0KGV2ZW50KTtcclxuICAgIGlmIChldmVudC5ub2RlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnNldChldmVudC5ub2RlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -6,7 +6,11 @@ export * from './lib/concepto-user-controls.component';
|
|
|
6
6
|
export * from './lib/concepto-message/concepto-message.component';
|
|
7
7
|
export * from './lib/concepto-context-menu/concepto-context-menu.component';
|
|
8
8
|
export * from './lib/concepto-tree/concepto-tree.component';
|
|
9
|
+
export * from './lib/concepto-tree/core/models/tree.model';
|
|
10
|
+
export * from './lib/concepto-tree/core/models/tree-node.model';
|
|
11
|
+
export * from './lib/concepto-tree/core/models/tree-options.model';
|
|
12
|
+
export * from './lib/concepto-tree/core/models/tree-events.model';
|
|
9
13
|
export * from './lib/entity-comparison/components/entity-comparison.component';
|
|
10
14
|
export * from './lib/entity-comparison/core/services/entity-comparison.service';
|
|
11
15
|
export * from './lib/concepto-input/concepto-input.component';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLDZEQUE2RCxDQUFDO0FBQzVFLGNBQWMsNkNBQTZDLENBQUM7QUFDNUQsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLGlEQUFpRCxDQUFDO0FBQ2hFLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLGdFQUFnRSxDQUFDO0FBQy9FLGNBQWMsaUVBQWlFLENBQUM7QUFDaEYsY0FBYywrQ0FBK0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb25jZXB0by1tZXNzYWdlXHJcbiAqL1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uY2VwdG8tdXNlci1jb250cm9scy5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uY2VwdG8tdXNlci1jb250cm9scy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25jZXB0by1tZXNzYWdlL2NvbmNlcHRvLW1lc3NhZ2UuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uY2VwdG8tY29udGV4dC1tZW51L2NvbmNlcHRvLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25jZXB0by10cmVlL2NvbmNlcHRvLXRyZWUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uY2VwdG8tdHJlZS9jb3JlL21vZGVscy90cmVlLm1vZGVsJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uY2VwdG8tdHJlZS9jb3JlL21vZGVscy90cmVlLW5vZGUubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25jZXB0by10cmVlL2NvcmUvbW9kZWxzL3RyZWUtb3B0aW9ucy5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmNlcHRvLXRyZWUvY29yZS9tb2RlbHMvdHJlZS1ldmVudHMubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9lbnRpdHktY29tcGFyaXNvbi9jb21wb25lbnRzL2VudGl0eS1jb21wYXJpc29uLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2VudGl0eS1jb21wYXJpc29uL2NvcmUvc2VydmljZXMvZW50aXR5LWNvbXBhcmlzb24uc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmNlcHRvLWlucHV0L2NvbmNlcHRvLWlucHV0LmNvbXBvbmVudCc7Il19
|
|
@@ -1755,50 +1755,56 @@ class ConceptoTreeComponent {
|
|
|
1755
1755
|
loadChildren = new EventEmitter();
|
|
1756
1756
|
treeEvent = new EventEmitter();
|
|
1757
1757
|
treeRoot;
|
|
1758
|
+
// Estado con Signals
|
|
1758
1759
|
isDropdownOpen = signal(false);
|
|
1759
|
-
searchTerm = '';
|
|
1760
|
+
searchTerm = signal(''); // Cambiamos a Signal
|
|
1760
1761
|
selectedNode = signal(null);
|
|
1761
|
-
//
|
|
1762
|
+
// Almacén de todos los nodos (no necesita ser signal porque no cambia tras la carga inicial)
|
|
1762
1763
|
allNodes = [];
|
|
1763
|
-
|
|
1764
|
+
// Signal computada: Se actualiza sola cuando cambia searchTerm o allNodes es asignado
|
|
1765
|
+
filteredNodes = computed(() => {
|
|
1766
|
+
const term = this.searchTerm().toLowerCase();
|
|
1767
|
+
if (!term)
|
|
1768
|
+
return this.allNodes;
|
|
1769
|
+
return this.allNodes.filter(node => String(node.data[this.displayField]).toLowerCase().includes(term));
|
|
1770
|
+
});
|
|
1764
1771
|
get displayField() {
|
|
1765
1772
|
return this.options.displayField || 'name';
|
|
1766
1773
|
}
|
|
1767
1774
|
toggleDropdown() {
|
|
1768
1775
|
this.isDropdownOpen.update(v => !v);
|
|
1769
1776
|
if (this.isDropdownOpen()) {
|
|
1770
|
-
this.searchTerm
|
|
1771
|
-
this.filterNodes();
|
|
1777
|
+
this.searchTerm.set(''); // Reseteamos el término al abrir
|
|
1772
1778
|
}
|
|
1773
1779
|
}
|
|
1774
1780
|
closeDropdown() {
|
|
1775
1781
|
this.isDropdownOpen.set(false);
|
|
1776
1782
|
}
|
|
1777
|
-
filterNodes() {
|
|
1778
|
-
if (!this.searchTerm) {
|
|
1779
|
-
this.filteredNodes.set(this.allNodes);
|
|
1780
|
-
}
|
|
1781
|
-
else {
|
|
1782
|
-
const term = this.searchTerm.toLowerCase();
|
|
1783
|
-
this.filteredNodes.set(this.allNodes.filter(node => String(node.data[this.displayField]).toLowerCase().includes(term)));
|
|
1784
|
-
}
|
|
1785
|
-
}
|
|
1786
1783
|
selectNode(node) {
|
|
1787
1784
|
this.selectedNode.set(node);
|
|
1788
1785
|
this.isDropdownOpen.set(false);
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1786
|
+
if (this.treeRoot?.treeModel) {
|
|
1787
|
+
// Usamos el API de la librería para activar
|
|
1788
|
+
node.setActiveAndVisible();
|
|
1789
|
+
// O si prefieres: this.treeRoot.treeModel.activateNode(node);
|
|
1793
1790
|
}
|
|
1794
1791
|
}
|
|
1795
1792
|
onTreeInitialized(event) {
|
|
1796
1793
|
this.initialized.emit(event);
|
|
1797
|
-
//
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1794
|
+
// Mantenemos el setTimeout para evitar el error 'firstCreatePass'
|
|
1795
|
+
setTimeout(() => {
|
|
1796
|
+
if (event.treeModel) {
|
|
1797
|
+
this.allNodes = event.treeModel.getAllNodes();
|
|
1798
|
+
// Buscamos manualmente el nodo activo si existe
|
|
1799
|
+
const activeNode = this.allNodes.find(n => n.isActive);
|
|
1800
|
+
if (activeNode) {
|
|
1801
|
+
this.selectedNode.set(activeNode);
|
|
1802
|
+
}
|
|
1803
|
+
// Forzamos una actualización inicial de la lista filtrada
|
|
1804
|
+
// Al setear searchTerm de nuevo, disparas el computed
|
|
1805
|
+
this.searchTerm.set('');
|
|
1806
|
+
}
|
|
1807
|
+
});
|
|
1802
1808
|
}
|
|
1803
1809
|
onNodeActivated(event) {
|
|
1804
1810
|
this.activate.emit(event);
|
|
@@ -1823,8 +1829,8 @@ class ConceptoTreeComponent {
|
|
|
1823
1829
|
<div class="search-input-wrapper" (click)="$event.stopPropagation()">
|
|
1824
1830
|
<input
|
|
1825
1831
|
type="text"
|
|
1826
|
-
[
|
|
1827
|
-
(ngModelChange)="
|
|
1832
|
+
[ngModel]="searchTerm()"
|
|
1833
|
+
(ngModelChange)="searchTerm.set($event)"
|
|
1828
1834
|
placeholder="Buscar..."
|
|
1829
1835
|
class="search-input"
|
|
1830
1836
|
#searchInput
|
|
@@ -1882,8 +1888,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
1882
1888
|
<div class="search-input-wrapper" (click)="$event.stopPropagation()">
|
|
1883
1889
|
<input
|
|
1884
1890
|
type="text"
|
|
1885
|
-
[
|
|
1886
|
-
(ngModelChange)="
|
|
1891
|
+
[ngModel]="searchTerm()"
|
|
1892
|
+
(ngModelChange)="searchTerm.set($event)"
|
|
1887
1893
|
placeholder="Buscar..."
|
|
1888
1894
|
class="search-input"
|
|
1889
1895
|
#searchInput
|
|
@@ -2300,5 +2306,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
2300
2306
|
* Generated bundle index. Do not edit.
|
|
2301
2307
|
*/
|
|
2302
2308
|
|
|
2303
|
-
export { ConceptoContextMenuComponent, ConceptoInputComponent, ConceptoMessageComponent, ConceptoTreeComponent, ConceptoUserControls, ConceptoUserControlsService, EntityComparisonComponent, EntityComparisonService };
|
|
2309
|
+
export { ConceptoContextMenuComponent, ConceptoInputComponent, ConceptoMessageComponent, ConceptoTreeComponent, ConceptoUserControls, ConceptoUserControlsService, DEFAULT_TREE_OPTIONS, EntityComparisonComponent, EntityComparisonService, TreeModel, TreeNode };
|
|
2304
2310
|
//# sourceMappingURL=concepto-user-controls.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concepto-user-controls.mjs","sources":["../../../projects/concepto-user-controls/src/lib/concepto-user-controls.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-user-controls.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.html","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.html","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-node.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-options.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-expander/tree-node-expander.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-checkbox/tree-node-checkbox.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-content/tree-node-content.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/services/tree-drag-drop.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drag.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drop.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node/tree-node.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-viewport/tree-viewport.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-node-template.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-root/tree-root.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/concepto-tree.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/core/services/entity-comparison.service.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.html","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.html","../../../projects/concepto-user-controls/src/public-api.ts","../../../projects/concepto-user-controls/src/concepto-user-controls.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConceptoUserControlsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-concepto-message',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n concepto-message works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class ConceptoUserControls {\r\n\r\n}\r\n","import { NgIf } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\r\n\r\n\r\n@Component({\r\n selector: 'concepto-message',\r\n standalone: true,\r\n imports: [NgIf],\r\n templateUrl: './concepto-message.component.html',\r\n styleUrl: './concepto-message.component.css'\r\n})\r\nexport class ConceptoMessageComponent {\r\n @Input() title: string = 'Mensaje';\r\n @Input() message: string = 'Este es un mensaje';\r\n @Input() visible: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n @Output() accepted = new EventEmitter<void>();\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n\r\n accept() {\r\n this.accepted.emit();\r\n }\r\n\r\n show() {\r\n this.visible = true;\r\n }\r\n}\r\n","<div class=\"modal-backdrop\" *ngIf=\"visible\">\r\n <div class=\"modal\">\r\n <div class=\"modal-header\">\r\n <h3>{{ title }}</h3>\r\n <button class=\"close-button\" (click)=\"close()\">×</button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>{{ message }}</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button (click)=\"accept()\">Aceptar</button>\r\n </div>\r\n </div>\r\n</div>","import { Component, ElementRef, HostListener, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nexport interface NodeOption {\r\n NodesId: string;\r\n NodesText: string;\r\n NodesParentId: string;\r\n NodesImg: string;\r\n children?: NodeOption[];\r\n}\r\n\r\n@Component({\r\n selector: 'concepto-context-menu',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './concepto-context-menu.component.html',\r\n styleUrl: './concepto-context-menu.component.css'\r\n})\r\nexport class ConceptoContextMenuComponent {\r\n\r\n @Input() nodes: NodeOption[] = [];\r\n menuTree: NodeOption[] = [];\r\n visible = false;\r\n pos = { x: 0, y: 0 };\r\n\r\n constructor(private elRef: ElementRef) {}\r\n\r\n ngOnChanges(): void {\r\n const map = new Map<string, NodeOption>();\r\n this.nodes.forEach(n => map.set(n.NodesId, { ...n, children: [] }));\r\n\r\n const roots: NodeOption[] = [];\r\n map.forEach(n => {\r\n if (n.NodesParentId && map.has(n.NodesParentId)) {\r\n map.get(n.NodesParentId)?.children?.push(n);\r\n } else {\r\n roots.push(n);\r\n }\r\n });\r\n this.menuTree = roots;\r\n }\r\n\r\n showAtEvent(event: MouseEvent): void {\r\n event.preventDefault();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n this.visible = true;\r\n setTimeout(() => {\r\n const menu = this.elRef.nativeElement.querySelector('.context-menu');\r\n const rect = menu.getBoundingClientRect();\r\n this.pos.x = x + rect.width > window.innerWidth ? window.innerWidth - rect.width - 10 : x;\r\n this.pos.y = y + rect.height > window.innerHeight ? window.innerHeight - rect.height - 10 : y;\r\n });\r\n }\r\n\r\n hide(): void {\r\n this.visible = false;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onOutsideClick(event: MouseEvent): void {\r\n if (!this.elRef.nativeElement.contains(event.target)) {\r\n this.hide();\r\n }\r\n }\r\n\r\n onOptionClick(option: NodeOption): void {\r\n if (!option.children || option.children.length === 0) {\r\n console.log('Selected:', option);\r\n this.hide();\r\n }\r\n }\r\n\r\n hasChildren(option: NodeOption): boolean {\r\n return !!option.children && option.children.length > 0;\r\n }\r\n}\r\n\r\n","<div class=\"context-menu\" *ngIf=\"visible\" [ngStyle]=\"{ top: pos.y + 'px', left: pos.x + 'px' }\">\r\n <ul class=\"menu-root\">\r\n <ng-container *ngFor=\"let item of menuTree\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n</div>\r\n\r\n<ng-template #renderNode let-node>\r\n <li class=\"menu-item\" [class.has-children]=\"hasChildren(node)\">\r\n <div (click)=\"onOptionClick(node)\">\r\n @if (node.NodesImg) {\r\n <img [src]=\"node.NodesImg\" class=\"icon\" />\r\n }\r\n @if (!node.NodesImg) {\r\n <div class=\"icon\"></div>\r\n }\r\n {{ node.NodesText }}\r\n </div>\r\n <ul class=\"submenu\" *ngIf=\"hasChildren(node)\">\r\n <ng-container *ngFor=\"let child of node.children\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: child }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n</ng-template>","// lib/core/models/tree-node.model.ts\r\nimport { signal, computed, Signal } from '@angular/core';\r\nimport { TreeOptions } from './tree-options.model';\r\n\r\nexport interface TreeNodeData {\r\n id: string | number;\r\n [key: string]: any;\r\n}\r\n\r\nexport class TreeNode {\r\n // Signals for reactive state\r\n readonly isExpanded = signal(false);\r\n readonly isActive = signal(false);\r\n readonly isSelected = signal(false);\r\n readonly isFocused = signal(false);\r\n readonly isHidden = signal(false);\r\n readonly isLoading = signal(false);\r\n \r\n // Computed signals\r\n readonly isCollapsed = computed(() => !this.isExpanded());\r\n readonly isLeaf = computed(() => !this.hasChildren);\r\n readonly isVisible = computed(() => !this.isHidden());\r\n \r\n id: string | number;\r\n data: TreeNodeData;\r\n parent: TreeNode | null;\r\n children: TreeNode[] = [];\r\n level: number;\r\n path: Array<string | number>;\r\n index: number;\r\n hasChildren: boolean;\r\n icon?: string;\r\n \r\n constructor(\r\n data: TreeNodeData,\r\n parent: TreeNode | null,\r\n level: number,\r\n index: number,\r\n options: TreeOptions\r\n ) {\r\n this.data = data;\r\n this.parent = parent;\r\n this.level = level;\r\n this.index = index;\r\n this.id = data[options.idField || 'id'];\r\n this.icon = data[options.iconField || 'icon'];\r\n\r\n const childrenData = data[options.childrenField || 'children'];\r\n this.hasChildren = Array.isArray(childrenData) && childrenData.length > 0;\r\n \r\n // Initialize expanded state\r\n if (options.isExpandedField && data[options.isExpandedField]) {\r\n this.isExpanded.set(true);\r\n }\r\n \r\n // Build path\r\n this.path = parent ? [...parent.path, this.id] : [this.id];\r\n }\r\n \r\n // Actions\r\n expand(): void {\r\n if (this.hasChildren) {\r\n this.isExpanded.set(true);\r\n }\r\n }\r\n \r\n collapse(): void {\r\n this.isExpanded.set(false);\r\n }\r\n \r\n toggle(): void {\r\n this.isExpanded.update(value => !value);\r\n }\r\n \r\n setActive(value: boolean): void {\r\n this.isActive.set(value);\r\n }\r\n \r\n setSelected(value: boolean): void {\r\n this.isSelected.set(value);\r\n }\r\n \r\n setFocus(value: boolean): void {\r\n this.isFocused.set(value);\r\n }\r\n \r\n setHidden(value: boolean): void {\r\n this.isHidden.set(value);\r\n }\r\n \r\n setLoading(value: boolean): void {\r\n this.isLoading.set(value);\r\n }\r\n \r\n // Helper methods\r\n ensureVisible(): void {\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n node.expand();\r\n node = node.parent;\r\n }\r\n }\r\n \r\n setActiveAndVisible(): void {\r\n this.ensureVisible();\r\n this.setActive(true);\r\n }\r\n \r\n // Get all ancestors\r\n getAncestors(): TreeNode[] {\r\n const ancestors: TreeNode[] = [];\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n ancestors.unshift(node);\r\n node = node.parent;\r\n }\r\n return ancestors;\r\n }\r\n \r\n // Get all descendants\r\n getDescendants(): TreeNode[] {\r\n const descendants: TreeNode[] = [];\r\n const traverse = (node: TreeNode) => {\r\n node.children.forEach(child => {\r\n descendants.push(child);\r\n traverse(child);\r\n });\r\n };\r\n traverse(this);\r\n return descendants;\r\n }\r\n}","// lib/core/models/tree.model.ts\r\nimport { signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { TreeNode } from './tree-node.model';\r\nimport { TreeOptions } from './tree-options.model';\r\nimport { TreeEvent } from './tree-events.model';\r\n\r\nexport class TreeModel {\r\n // Reactive state with signals\r\n readonly roots = signal<TreeNode[]>([]);\r\n readonly focusedNodeId = signal<string | number | null>(null);\r\n readonly expandedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly activeNodeIds = signal<Set<string | number>>(new Set());\r\n readonly selectedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly hiddenNodeIds = signal<Set<string | number>>(new Set());\r\n \r\n // Computed signals\r\n readonly focusedNode = computed(() => {\r\n const id = this.focusedNodeId();\r\n return id ? this.getNodeById(id) : null;\r\n });\r\n \r\n readonly expandedNodes = computed(() => \r\n this.getAllNodes().filter(node => \r\n this.expandedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly activeNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.activeNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly selectedNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.selectedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly visibleNodes = computed(() =>\r\n this.getAllNodes().filter(node => !node.isHidden())\r\n );\r\n \r\n readonly flattenedNodes = computed(() => {\r\n const flattened: TreeNode[] = [];\r\n const traverse = (nodes: TreeNode[]) => {\r\n nodes.forEach(node => {\r\n if (!node.isHidden()) {\r\n flattened.push(node);\r\n if (node.isExpanded() && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return flattened;\r\n });\r\n \r\n // Event streams\r\n readonly events$ = new Subject<TreeEvent>();\r\n \r\n // Virtual root for unified handling\r\n virtualRoot: TreeNode | null = null;\r\n \r\n // Node registry for quick lookup\r\n private nodeRegistry = new Map<string | number, TreeNode>();\r\n \r\n constructor(public options: TreeOptions) {\r\n // Constructor sin effects - se sincronizan en las operaciones\r\n }\r\n \r\n // Data management\r\n setData(data: any[]): void {\r\n this.nodeRegistry.clear();\r\n const roots = this.buildNodes(data, null, 0);\r\n this.roots.set(roots);\r\n this.emitEvent({ type: 'initialized', treeModel: this });\r\n }\r\n \r\n private buildNodes(\r\n data: any[],\r\n parent: TreeNode | null,\r\n level: number\r\n ): TreeNode[] {\r\n return data.map((item, index) => {\r\n const node = new TreeNode(item, parent, level, index, this.options);\r\n this.nodeRegistry.set(node.id, node);\r\n \r\n // Recursively build children\r\n const childrenData = item[this.options.childrenField || 'children'];\r\n if (Array.isArray(childrenData) && childrenData.length > 0) {\r\n node.children = this.buildNodes(childrenData, node, level + 1);\r\n }\r\n \r\n return node;\r\n });\r\n }\r\n \r\n update(): void {\r\n // Trigger change detection by creating new signal values\r\n this.roots.set([...this.roots()]);\r\n this.emitEvent({ type: 'update', treeModel: this });\r\n }\r\n \r\n // Node lookup\r\n getNodeById(id: string | number): TreeNode | null {\r\n return this.nodeRegistry.get(id) || null;\r\n }\r\n \r\n getNodeBy(predicate: (node: TreeNode) => boolean): TreeNode | null {\r\n return this.getAllNodes().find(predicate) || null;\r\n }\r\n \r\n getAllNodes(): TreeNode[] {\r\n const nodes: TreeNode[] = [];\r\n const traverse = (nodeList: TreeNode[]) => {\r\n nodeList.forEach(node => {\r\n nodes.push(node);\r\n if (node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return nodes;\r\n }\r\n \r\n // Navigation\r\n focusNode(node: TreeNode | null): void {\r\n if (this.focusedNode()) {\r\n this.focusedNode()!.setFocus(false);\r\n }\r\n if (node) {\r\n this.focusedNodeId.set(node.id);\r\n node.setFocus(true);\r\n this.emitEvent({ type: 'focus', node });\r\n } else {\r\n this.focusedNodeId.set(null);\r\n }\r\n }\r\n \r\n focusNextNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex < flattened.length - 1) {\r\n this.focusNode(flattened[currentIndex + 1]);\r\n }\r\n }\r\n \r\n focusPreviousNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex > 0) {\r\n this.focusNode(flattened[currentIndex - 1]);\r\n }\r\n }\r\n \r\n focusDrillDown(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (!focused.isExpanded() && focused.hasChildren) {\r\n focused.expand();\r\n } else if (focused.children.length > 0) {\r\n this.focusNode(focused.children[0]);\r\n }\r\n }\r\n }\r\n \r\n focusDrillUp(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (focused.isExpanded() && focused.hasChildren) {\r\n focused.collapse();\r\n } else if (focused.parent) {\r\n this.focusNode(focused.parent);\r\n }\r\n }\r\n }\r\n \r\n // Operations\r\n expandAll(): void {\r\n const ids = new Set(this.getAllNodes().map(n => n.id));\r\n this.expandedNodeIds.set(ids);\r\n this.emitEvent({ type: 'expandAll', treeModel: this });\r\n }\r\n \r\n collapseAll(): void {\r\n this.expandedNodeIds.set(new Set());\r\n this.emitEvent({ type: 'collapseAll', treeModel: this });\r\n }\r\n \r\n expandNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(true);\r\n this.emitEvent({ type: 'expand', node });\r\n }\r\n\r\n collapseNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(false);\r\n this.emitEvent({ type: 'collapse', node });\r\n }\r\n\r\n activateNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.activeNodeIds.set(new Set([node.id]));\r\n this.getAllNodes().forEach(n => n.isActive.set(n.id === node.id));\r\n } else {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(true);\r\n }\r\n this.emitEvent({ type: 'activate', node });\r\n }\r\n \r\n deactivateNode(node: TreeNode): void {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(false);\r\n this.emitEvent({ type: 'deactivate', node });\r\n }\r\n \r\n selectNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.selectedNodeIds.set(new Set([node.id]));\r\n } else {\r\n this.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (ids.has(node.id)) {\r\n newIds.delete(node.id);\r\n } else {\r\n newIds.add(node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n this.emitEvent({ type: 'select', node });\r\n }\r\n \r\n // Filtering\r\n filterNodes(filterFn: (node: TreeNode) => boolean, autoShow = true): void {\r\n const hiddenIds = new Set<string | number>();\r\n \r\n this.getAllNodes().forEach(node => {\r\n const matches = filterFn(node);\r\n if (!matches) {\r\n hiddenIds.add(node.id);\r\n } else if (autoShow) {\r\n // Show ancestors of matching nodes\r\n node.getAncestors().forEach(ancestor => {\r\n hiddenIds.delete(ancestor.id);\r\n });\r\n }\r\n });\r\n \r\n this.hiddenNodeIds.set(hiddenIds);\r\n this.emitEvent({ type: 'filter', treeModel: this });\r\n }\r\n \r\n clearFilter(): void {\r\n this.hiddenNodeIds.set(new Set());\r\n this.emitEvent({ type: 'clearFilter', treeModel: this });\r\n }\r\n \r\n // Drag & Drop\r\n canMoveNode(\r\n node: TreeNode,\r\n to: { parent: TreeNode; index: number }\r\n ): boolean {\r\n // Prevent moving to itself or descendants\r\n if (node === to.parent) return false;\r\n if (to.parent.getAncestors().includes(node)) return false;\r\n \r\n // Custom validation\r\n if (this.options.allowDrop) {\r\n if (typeof this.options.allowDrop === 'function') {\r\n return this.options.allowDrop(node, to);\r\n }\r\n return this.options.allowDrop;\r\n }\r\n \r\n return true;\r\n }\r\n \r\n moveNode(node: TreeNode, to: { parent: TreeNode; index: number }): void {\r\n if (!this.canMoveNode(node, to)) return;\r\n\r\n // Remove from old parent\r\n if (node.parent) {\r\n const oldIndex = node.parent.children.indexOf(node);\r\n if (oldIndex !== -1) {\r\n // Create new array to trigger change detection\r\n node.parent.children = [\r\n ...node.parent.children.slice(0, oldIndex),\r\n ...node.parent.children.slice(oldIndex + 1)\r\n ];\r\n }\r\n } else {\r\n // Handle root nodes\r\n const rootIndex = this.roots().indexOf(node);\r\n if (rootIndex !== -1) {\r\n this.roots.set([\r\n ...this.roots().slice(0, rootIndex),\r\n ...this.roots().slice(rootIndex + 1)\r\n ]);\r\n }\r\n }\r\n\r\n // Add to new parent - create new array to trigger change detection\r\n const newChildren = [...to.parent.children];\r\n newChildren.splice(to.index, 0, node);\r\n to.parent.children = newChildren;\r\n node.parent = to.parent;\r\n\r\n // Update levels\r\n this.updateNodeLevels(node);\r\n\r\n this.emitEvent({ type: 'moveNode', node, to });\r\n this.update();\r\n }\r\n \r\n private updateNodeLevels(node: TreeNode): void {\r\n const newLevel = node.parent ? node.parent.level + 1 : 0;\r\n node.level = newLevel;\r\n \r\n node.children.forEach(child => this.updateNodeLevels(child));\r\n }\r\n \r\n // Async children loading\r\n async loadChildren(node: TreeNode): Promise<void> {\r\n if (!this.options.getChildren) return;\r\n \r\n node.setLoading(true);\r\n \r\n try {\r\n const childrenData = await this.options.getChildren(node);\r\n node.children = this.buildNodes(childrenData, node, node.level + 1);\r\n node.hasChildren = node.children.length > 0;\r\n \r\n this.emitEvent({ type: 'loadChildren', node });\r\n this.update();\r\n } catch (error) {\r\n this.emitEvent({ type: 'loadChildrenError', node, error });\r\n } finally {\r\n node.setLoading(false);\r\n }\r\n }\r\n \r\n // Events\r\n private emitEvent(event: TreeEvent): void {\r\n this.events$.next(event);\r\n }\r\n}","// lib/core/models/tree-options.model.ts\r\nimport { TreeNode } from './tree-node.model';\r\n\r\nexport interface TreeOptions {\r\n // Field mappings\r\n idField?: string;\r\n childrenField?: string;\r\n displayField?: string;\r\n isExpandedField?: string;\r\n hasChildrenField?: string;\r\n iconField?: string;\r\n \r\n // Behavior\r\n allowDrag?: boolean | ((node: TreeNode) => boolean);\r\n allowDrop?: boolean | ((node: TreeNode, to: any) => boolean);\r\n useCheckbox?: boolean;\r\n useTriState?: boolean;\r\n levelPadding?: number;\r\n \r\n // Virtual scroll\r\n useVirtualScroll?: boolean;\r\n nodeHeight?: number | ((node: TreeNode) => number);\r\n scrollContainerHeight?: number;\r\n bufferAmount?: number;\r\n \r\n // Async loading\r\n getChildren?: (node: TreeNode) => Promise<any[]>;\r\n \r\n // Animations\r\n animateExpand?: boolean;\r\n animateSpeed?: number;\r\n animateAcceleration?: number;\r\n \r\n // Scroll behavior\r\n scrollOnActivate?: boolean;\r\n scrollContainer?: HTMLElement;\r\n \r\n // Keyboard\r\n rtl?: boolean;\r\n \r\n // Selection\r\n multiSelect?: boolean;\r\n useMetaKey?: boolean;\r\n}\r\n\r\nexport const DEFAULT_TREE_OPTIONS: TreeOptions = {\r\n idField: 'id',\r\n childrenField: 'children',\r\n displayField: 'name',\r\n isExpandedField: 'isExpanded',\r\n hasChildrenField: 'hasChildren',\r\n iconField: 'icon',\r\n allowDrag: false,\r\n allowDrop: false,\r\n useCheckbox: false,\r\n useTriState: false,\r\n levelPadding: 20,\r\n useVirtualScroll: false,\r\n nodeHeight: 22,\r\n bufferAmount: 5,\r\n animateExpand: false,\r\n animateSpeed: 1,\r\n animateAcceleration: 1.2,\r\n scrollOnActivate: true,\r\n rtl: false,\r\n multiSelect: false,\r\n useMetaKey: true,\r\n};","// lib/components/tree-node-expander/tree-node-expander.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-expander',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-expander\"\r\n [class.tree-node-expander-loading]=\"node.isLoading()\"\r\n (click)=\"onExpanderClick($event)\">\r\n @if (node.isLoading()) {\r\n <span class=\"expander-spinner\"></span>\r\n } @else if (node.hasChildren) {\r\n <svg \r\n class=\"expander-icon\"\r\n [class.expander-icon-expanded]=\"node.isExpanded()\"\r\n width=\"16\" \r\n height=\"16\" \r\n viewBox=\"0 0 16 16\">\r\n <path d=\"M6 4l4 4-4 4\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n stroke-width=\"2\" \r\n stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else {\r\n <span class=\"expander-placeholder\"></span>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-expander {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n transition: background-color 0.15s;\r\n flex-shrink: 0;\r\n }\r\n \r\n .tree-node-expander:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n \r\n .expander-icon {\r\n transition: transform 0.2s ease;\r\n transform: rotate(0deg);\r\n }\r\n \r\n .expander-icon-expanded {\r\n transform: rotate(90deg);\r\n }\r\n \r\n .expander-placeholder {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n \r\n .expander-spinner {\r\n display: inline-block;\r\n width: 14px;\r\n height: 14px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n})\r\nexport class TreeNodeExpanderComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Output() toggle = new EventEmitter<void>();\r\n \r\n onExpanderClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.toggle.emit();\r\n }\r\n}","// lib/components/tree-node-checkbox/tree-node-checkbox.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-checkbox\"\r\n (click)=\"onCheckboxClick($event)\">\r\n <input \r\n type=\"checkbox\"\r\n [checked]=\"isChecked()\"\r\n [indeterminate]=\"isIndeterminate()\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-checkbox {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n flex-shrink: 0;\r\n }\r\n \r\n input[type=\"checkbox\"] {\r\n cursor: pointer;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeCheckboxComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() useTriState = false;\r\n @Output() change = new EventEmitter<boolean>();\r\n \r\n readonly isChecked = computed(() => {\r\n return this.treeModel.selectedNodeIds().has(this.node.id);\r\n });\r\n \r\n readonly isIndeterminate = computed(() => {\r\n if (!this.useTriState || !this.node.hasChildren) {\r\n return false;\r\n }\r\n \r\n const selectedIds = this.treeModel.selectedNodeIds();\r\n const descendants = this.node.getDescendants();\r\n \r\n if (descendants.length === 0) return false;\r\n \r\n const selectedCount = descendants.filter(d => \r\n selectedIds.has(d.id)\r\n ).length;\r\n \r\n return selectedCount > 0 && selectedCount < descendants.length;\r\n });\r\n \r\n onCheckboxClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n }\r\n \r\n onCheckboxChange(event: Event): void {\r\n event.stopPropagation();\r\n const checked = (event.target as HTMLInputElement).checked;\r\n \r\n if (this.useTriState) {\r\n // Update node and all descendants\r\n this.updateNodeAndDescendants(this.node, checked);\r\n } else {\r\n this.change.emit(checked);\r\n }\r\n }\r\n \r\n private updateNodeAndDescendants(node: TreeNode, checked: boolean): void {\r\n this.treeModel.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n \r\n if (checked) {\r\n newIds.add(node.id);\r\n node.getDescendants().forEach(d => newIds.add(d.id));\r\n } else {\r\n newIds.delete(node.id);\r\n node.getDescendants().forEach(d => newIds.delete(d.id));\r\n }\r\n \r\n return newIds;\r\n });\r\n \r\n this.change.emit(checked);\r\n }\r\n}","// lib/components/tree-node-content/tree-node-content.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-content',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n @if (template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"template; context: templateContext\">\r\n </ng-container>\r\n } @else {\r\n <span class=\"tree-node-content-default\">\r\n @if (node.icon) {\r\n <img [src]=\"node.icon\" alt=\"\" class=\"tree-node-icon\" />\r\n }\r\n <span class=\"tree-node-text\">{{ node.data[displayField] }}</span>\r\n </span>\r\n }\r\n `,\r\n styles: [`\r\n .tree-node-content-default {\r\n flex: 1;\r\n padding: 0 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n .tree-node-icon {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n object-fit: contain;\r\n }\r\n\r\n .tree-node-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeContentComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() template?: TemplateRef<any>;\r\n @Input() displayField = 'name';\r\n \r\n NgOnInit(){\r\n console.log(\"Tree node:\", this.node);\r\n }\r\n\r\n get templateContext() {\r\n console.log(\"Tree node:\", this.node);\r\n return {\r\n $implicit: this.node,\r\n node: this.node,\r\n treeModel: this.treeModel,\r\n };\r\n }\r\n}","// lib/core/services/tree-drag-drop.service.ts\r\nimport { Injectable, signal } from '@angular/core';\r\nimport { TreeNode } from '../models/tree-node.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TreeDragDropService {\r\n private readonly draggedNode = signal<TreeNode | null>(null);\r\n \r\n setDraggedNode(node: TreeNode): void {\r\n this.draggedNode.set(node);\r\n }\r\n \r\n getDraggedNode(): TreeNode | null {\r\n return this.draggedNode();\r\n }\r\n \r\n clearDraggedNode(): void {\r\n this.draggedNode.set(null);\r\n }\r\n \r\n isDragging(): boolean {\r\n return this.draggedNode() !== null;\r\n }\r\n}","// lib/directives/tree-drag.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\n@Directive({\r\n selector: '[treeDrag]',\r\n standalone: true,\r\n})\r\nexport class TreeDragDirective {\r\n @Input({ required: true, alias: 'treeDrag' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n @HostBinding('attr.draggable')\r\n get draggable(): boolean {\r\n if (typeof this.options.allowDrag === 'function') {\r\n return this.options.allowDrag(this.node);\r\n }\r\n return this.options.allowDrag || false;\r\n }\r\n \r\n @HostListener('dragstart', ['$event'])\r\n onDragStart(event: DragEvent): void {\r\n if (!this.draggable) {\r\n event.preventDefault();\r\n return;\r\n }\r\n \r\n this.dragDropService.setDraggedNode(this.node);\r\n \r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.setData('text/plain', this.node.id.toString());\r\n \r\n // Create drag image\r\n const dragImage = this.elementRef.nativeElement.cloneNode(true) as HTMLElement;\r\n dragImage.style.opacity = '0.7';\r\n document.body.appendChild(dragImage);\r\n event.dataTransfer.setDragImage(dragImage, 0, 0);\r\n \r\n setTimeout(() => document.body.removeChild(dragImage), 0);\r\n }\r\n \r\n this.elementRef.nativeElement.classList.add('tree-node-dragging');\r\n }\r\n \r\n @HostListener('dragend', ['$event'])\r\n onDragEnd(event: DragEvent): void {\r\n this.dragDropService.clearDraggedNode();\r\n this.elementRef.nativeElement.classList.remove('tree-node-dragging');\r\n }\r\n}","// lib/directives/tree-drop.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n signal,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\ntype DropPosition = 'before' | 'after' | 'inside';\r\n\r\n@Directive({\r\n selector: '[treeDrop]',\r\n standalone: true,\r\n})\r\nexport class TreeDropDirective {\r\n @Input({ required: true, alias: 'treeDrop' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() dropPosition: DropPosition = 'inside';\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n readonly isDraggingOver = signal(false);\r\n readonly canDrop = signal(false);\r\n \r\n @HostBinding('class.tree-drop-target')\r\n get isDropTarget(): boolean {\r\n return this.isDraggingOver() && this.canDrop();\r\n }\r\n \r\n @HostBinding('class.tree-drop-disabled')\r\n get isDropDisabled(): boolean {\r\n return this.isDraggingOver() && !this.canDrop();\r\n }\r\n \r\n @HostListener('dragenter', ['$event'])\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode) return;\r\n \r\n this.isDraggingOver.set(true);\r\n \r\n const dropTarget = this.getDropTarget();\r\n const canDrop = this.treeModel.canMoveNode(draggedNode, dropTarget);\r\n this.canDrop.set(canDrop);\r\n \r\n if (canDrop && event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n \r\n @HostListener('dragover', ['$event'])\r\n onDragOver(event: DragEvent): void {\r\n if (this.canDrop()) {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n }\r\n \r\n @HostListener('dragleave', ['$event'])\r\n onDragLeave(event: DragEvent): void {\r\n // Check if we're really leaving (not just entering a child element)\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n \r\n if (x < rect.left || x >= rect.right || y < rect.top || y >= rect.bottom) {\r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n }\r\n }\r\n \r\n @HostListener('drop', ['$event'])\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode || !this.canDrop()) return;\r\n \r\n const dropTarget = this.getDropTarget();\r\n this.treeModel.moveNode(draggedNode, dropTarget);\r\n \r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n this.dragDropService.clearDraggedNode();\r\n }\r\n \r\n private getDropTarget(): { parent: TreeNode; index: number } {\r\n switch (this.dropPosition) {\r\n case 'before':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index,\r\n };\r\n case 'after':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index + 1,\r\n };\r\n case 'inside':\r\n default:\r\n return {\r\n parent: this.node,\r\n index: this.node.children.length,\r\n };\r\n }\r\n }\r\n}","// lib/components/tree-node/tree-node.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeExpanderComponent } from '../tree-node-expander/tree-node-expander.component';\r\nimport { TreeNodeCheckboxComponent } from '../tree-node-checkbox/tree-node-checkbox.component';\r\nimport { TreeNodeContentComponent } from '../tree-node-content/tree-node-content.component';\r\nimport { TreeDragDirective } from '../../directives/tree-drag.directive';\r\nimport { TreeDropDirective } from '../../directives/tree-drop.directive';\r\n\r\n@Component({\r\n selector: 'tree-node',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeExpanderComponent,\r\n TreeNodeCheckboxComponent,\r\n TreeNodeContentComponent,\r\n TreeDragDirective,\r\n TreeDropDirective,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div \r\n class=\"tree-node\"\r\n [class.tree-node-expanded]=\"node.isExpanded()\"\r\n [class.tree-node-collapsed]=\"node.isCollapsed()\"\r\n [class.tree-node-active]=\"node.isActive()\"\r\n [class.tree-node-focused]=\"node.isFocused()\"\r\n [class.tree-node-leaf]=\"node.isLeaf()\"\r\n [class.tree-node-loading]=\"node.isLoading()\"\r\n [style.padding-left.px]=\"paddingLeft()\">\r\n \r\n <div class=\"tree-node-wrapper\"\r\n [treeDrag]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\">\r\n \r\n <!-- Drop zone before node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-before\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'before'\"\r\n [options]=\"options\">\r\n </div>\r\n \r\n <!-- Node content wrapper -->\r\n <div class=\"tree-node-content-wrapper\"\r\n (click)=\"onNodeClick($event)\"\r\n (dblclick)=\"onNodeDoubleClick($event)\"\r\n (contextmenu)=\"onNodeContextMenu($event)\">\r\n \r\n <!-- Expander -->\r\n @if (node.hasChildren) {\r\n <tree-node-expander\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n (toggle)=\"onToggleExpanded()\">\r\n </tree-node-expander>\r\n }\r\n \r\n <!-- Checkbox -->\r\n @if (options.useCheckbox) {\r\n <tree-node-checkbox\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [useTriState]=\"options.useTriState ?? false\"\r\n (change)=\"onCheckboxChange($event)\">\r\n </tree-node-checkbox>\r\n }\r\n \r\n <!-- Content -->\r\n <tree-node-content\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [template]=\"nodeTemplate\"\r\n [displayField]=\"options.displayField || 'name'\">\r\n </tree-node-content>\r\n </div>\r\n \r\n <!-- Drop zone after node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-after\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'after'\"\r\n [options]=\"options\">\r\n </div>\r\n </div>\r\n \r\n <!-- Children container -->\r\n @if (node.isExpanded() && node.children.length > 0) {\r\n <div class=\"tree-node-children\"\r\n [@expandCollapse]=\"node.isExpanded() ? 'expanded' : 'collapsed'\">\r\n @for (child of node.children; track child.id) {\r\n <tree-node\r\n [node]=\"child\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n </div>\r\n }\r\n \r\n <!-- Loading indicator -->\r\n @if (node.isLoading()) {\r\n <div class=\"tree-node-loading\">\r\n <span class=\"loading-spinner\"></span>\r\n Loading...\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node {\r\n position: relative;\r\n }\r\n \r\n .tree-node-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n min-height: 22px;\r\n }\r\n \r\n .tree-node-content-wrapper {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n padding: 2px 4px;\r\n transition: background-color 0.15s;\r\n }\r\n \r\n .tree-node-content-wrapper:hover {\r\n background-color: #f5f5f5;\r\n }\r\n \r\n .tree-node-active .tree-node-content-wrapper {\r\n background-color: #e3f2fd;\r\n }\r\n \r\n .tree-node-focused .tree-node-content-wrapper {\r\n outline: 2px solid #2196f3;\r\n outline-offset: -2px;\r\n }\r\n \r\n .tree-node-children {\r\n overflow: hidden;\r\n }\r\n \r\n .tree-node-drop-slot {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n z-index: 10;\r\n }\r\n \r\n .tree-node-drop-slot-before {\r\n top: -1px;\r\n }\r\n \r\n .tree-node-drop-slot-after {\r\n bottom: -1px;\r\n }\r\n \r\n .tree-node-loading {\r\n padding: 8px 24px;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #666;\r\n font-size: 14px;\r\n }\r\n \r\n .loading-spinner {\r\n display: inline-block;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n animations: [\r\n trigger('expandCollapse', [\r\n state('collapsed', style({\r\n height: '0',\r\n overflow: 'hidden',\r\n opacity: '0'\r\n })),\r\n state('expanded', style({\r\n height: '*',\r\n overflow: 'visible',\r\n opacity: '1'\r\n })),\r\n transition('collapsed <=> expanded', [\r\n animate('200ms ease-in-out')\r\n ])\r\n ])\r\n ],\r\n})\r\nexport class TreeNodeComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n readonly paddingLeft = computed(() => {\r\n return this.options.levelPadding || 40;\r\n });\r\n \r\n onNodeClick(event: MouseEvent): void {\r\n const useMetaKey = this.options.useMetaKey !== false;\r\n const multiSelect = this.options.multiSelect || false;\r\n \r\n const isMetaKeyPressed = event.ctrlKey || event.metaKey;\r\n const shouldMultiSelect = multiSelect && (!useMetaKey || isMetaKeyPressed);\r\n \r\n this.treeModel.activateNode(this.node, shouldMultiSelect);\r\n this.treeModel.focusNode(this.node);\r\n }\r\n \r\n onNodeDoubleClick(event: MouseEvent): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n this.treeModel.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (this.node.isExpanded()) {\r\n newIds.add(this.node.id);\r\n } else {\r\n newIds.delete(this.node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n }\r\n \r\n onNodeContextMenu(event: MouseEvent): void {\r\n event.preventDefault();\r\n // Emit context menu event\r\n }\r\n \r\n onToggleExpanded(): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n \r\n if (this.node.isExpanded()) {\r\n // Load children if needed\r\n if (this.options.getChildren && this.node.children.length === 0) {\r\n this.treeModel.loadChildren(this.node);\r\n }\r\n this.treeModel.expandNode(this.node);\r\n } else {\r\n this.treeModel.collapseNode(this.node);\r\n }\r\n }\r\n }\r\n \r\n onCheckboxChange(checked: boolean): void {\r\n this.treeModel.selectNode(this.node, this.options.multiSelect || false);\r\n }\r\n}","// lib/components/tree-viewport/tree-viewport.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectionStrategy,\r\n signal,\r\n computed,\r\n TemplateRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'tree-viewport',\r\n standalone: true,\r\n imports: [CommonModule, TreeNodeComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div \r\n #scrollContainer\r\n class=\"tree-viewport-container\"\r\n [style.height.px]=\"options.scrollContainerHeight || 400\"\r\n (scroll)=\"onScroll()\">\r\n \r\n <div class=\"tree-viewport-content\"\r\n [style.height.px]=\"totalHeight()\">\r\n \r\n <div class=\"tree-viewport-padding-top\"\r\n [style.height.px]=\"paddingTop()\">\r\n </div>\r\n \r\n @for (node of visibleNodes(); track node.id) {\r\n <tree-node\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n \r\n <div class=\"tree-viewport-padding-bottom\"\r\n [style.height.px]=\"paddingBottom()\">\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-viewport-container {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n position: relative;\r\n }\r\n \r\n .tree-viewport-content {\r\n position: relative;\r\n width: 100%;\r\n }\r\n \r\n .tree-viewport-padding-top,\r\n .tree-viewport-padding-bottom {\r\n width: 100%;\r\n }\r\n `],\r\n})\r\nexport class TreeViewportComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n @ViewChild('scrollContainer', { static: true }) \r\n scrollContainer!: ElementRef<HTMLElement>;\r\n \r\n private destroy$ = new Subject<void>();\r\n \r\n readonly scrollTop = signal(0);\r\n readonly viewportHeight = signal(0);\r\n \r\n readonly flattenedNodes = computed(() => {\r\n return this.treeModel.flattenedNodes();\r\n });\r\n \r\n readonly totalHeight = computed(() => {\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n if (typeof nodeHeight === 'number') {\r\n return nodes.length * nodeHeight;\r\n }\r\n \r\n return nodes.reduce((sum, node) => sum + nodeHeight(node), 0);\r\n });\r\n \r\n readonly visibleRange = computed(() => {\r\n const scrollTop = this.scrollTop();\r\n const viewportHeight = this.viewportHeight();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const bufferAmount = this.options.bufferAmount || 5;\r\n \r\n let startIndex = 0;\r\n let accumulatedHeight = 0;\r\n \r\n // Find start index\r\n for (let i = 0; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n \r\n if (accumulatedHeight + height > scrollTop) {\r\n startIndex = Math.max(0, i - bufferAmount);\r\n break;\r\n }\r\n accumulatedHeight += height;\r\n }\r\n \r\n // Find end index\r\n let endIndex = startIndex;\r\n accumulatedHeight = 0;\r\n \r\n for (let i = startIndex; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n \r\n accumulatedHeight += height;\r\n \r\n if (accumulatedHeight > viewportHeight + (bufferAmount * (typeof nodeHeight === 'number' ? nodeHeight : 22))) {\r\n endIndex = i;\r\n break;\r\n }\r\n }\r\n \r\n if (endIndex === startIndex) {\r\n endIndex = nodes.length;\r\n }\r\n \r\n return { startIndex, endIndex };\r\n });\r\n \r\n readonly visibleNodes = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n return nodes.slice(range.startIndex, range.endIndex);\r\n });\r\n \r\n readonly paddingTop = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n let height = 0;\r\n for (let i = 0; i < range.startIndex; i++) {\r\n height += typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return height;\r\n });\r\n \r\n readonly paddingBottom = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const totalHeight = this.totalHeight();\r\n \r\n let visibleHeight = this.paddingTop();\r\n \r\n for (let i = range.startIndex; i < range.endIndex; i++) {\r\n visibleHeight += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return Math.max(0, totalHeight - visibleHeight);\r\n });\r\n \r\n constructor() {\r\n // Update viewport when tree changes\r\n effect(() => {\r\n this.flattenedNodes(); // Subscribe to changes\r\n this.updateViewport();\r\n });\r\n }\r\n \r\n ngOnInit(): void {\r\n this.setupScrollListener();\r\n this.updateViewportHeight();\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n \r\n private setupScrollListener(): void {\r\n fromEvent(this.scrollContainer.nativeElement, 'scroll')\r\n .pipe(\r\n debounceTime(10),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n this.onScroll();\r\n });\r\n }\r\n \r\n private updateViewportHeight(): void {\r\n const height = this.scrollContainer.nativeElement.clientHeight;\r\n this.viewportHeight.set(height);\r\n }\r\n \r\n onScroll(): void {\r\n const scrollTop = this.scrollContainer.nativeElement.scrollTop;\r\n this.scrollTop.set(scrollTop);\r\n }\r\n \r\n private updateViewport(): void {\r\n // Force recalculation\r\n this.scrollTop.set(this.scrollContainer.nativeElement.scrollTop);\r\n }\r\n \r\n scrollToNode(node: TreeNode): void {\r\n const nodes = this.flattenedNodes();\r\n const index = nodes.findIndex(n => n.id === node.id);\r\n \r\n if (index === -1) return;\r\n \r\n const nodeHeight = this.options.nodeHeight || 22;\r\n let targetScrollTop = 0;\r\n \r\n for (let i = 0; i < index; i++) {\r\n targetScrollTop += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n this.scrollContainer.nativeElement.scrollTop = targetScrollTop;\r\n }\r\n}","// lib/directives/tree-node-template.directive.ts\r\nimport { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[treeNodeTemplate]',\r\n standalone: true,\r\n})\r\nexport class TreeNodeTemplateDirective {\r\n constructor(public template: TemplateRef<any>) {}\r\n}","// lib/components/tree-root/tree-root.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n HostListener,\r\n signal,\r\n contentChild,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions, DEFAULT_TREE_OPTIONS } from '../../core/models/tree-options.model';\r\nimport { TreeEvent } from '../../core/models/tree-events.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { TreeViewportComponent } from '../tree-viewport/tree-viewport.component';\r\nimport { TreeNodeTemplateDirective } from '../../directives/tree-node-template.directive';\r\n\r\n@Component({\r\n selector: 'tree-root',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeComponent,\r\n TreeViewportComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tree-container\"\r\n [class.tree-rtl]=\"mergedOptions?.rtl\"\r\n tabindex=\"0\">\r\n\r\n @if (mergedOptions?.useVirtualScroll) {\r\n <tree-viewport\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-viewport>\r\n } @else {\r\n @for (root of treeModel.roots(); track root.id) {\r\n <tree-node\r\n [node]=\"root\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-node>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-container {\r\n width: 100%;\r\n height: 100%;\r\n outline: none;\r\n }\r\n \r\n .tree-rtl {\r\n direction: rtl;\r\n }\r\n `],\r\n host: {\r\n '[class.tree-focused]': 'isFocused()',\r\n },\r\n})\r\nexport class TreeRootComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n \r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n \r\n // Content queries\r\n readonly nodeTemplate = contentChild(TreeNodeTemplateDirective, {\r\n read: TemplateRef\r\n });\r\n \r\n treeModel!: TreeModel;\r\n mergedOptions!: TreeOptions;\r\n isFocused = signal(false);\r\n\r\n private eventsSubscription?: Subscription;\r\n \r\n ngOnInit(): void {\r\n this.initializeTreeModel();\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['options'] && !changes['options'].firstChange) {\r\n this.initializeTreeModel();\r\n }\r\n \r\n if (changes['nodes'] && !changes['nodes'].firstChange) {\r\n this.treeModel.setData(this.nodes);\r\n }\r\n }\r\n \r\n private initializeTreeModel(): void {\r\n // Unsubscribe from previous subscription if exists\r\n this.eventsSubscription?.unsubscribe();\r\n\r\n this.mergedOptions = {\r\n ...DEFAULT_TREE_OPTIONS,\r\n ...this.options,\r\n };\r\n\r\n this.treeModel = new TreeModel(this.mergedOptions);\r\n this.treeModel.setData(this.nodes);\r\n\r\n // Subscribe to tree events\r\n this.eventsSubscription = this.treeModel.events$.subscribe(event => {\r\n this.handleTreeEvent(event);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up subscription\r\n this.eventsSubscription?.unsubscribe();\r\n }\r\n \r\n private handleTreeEvent(event: TreeEvent): void {\r\n this.treeEvent.emit(event);\r\n \r\n switch (event.type) {\r\n case 'initialized':\r\n this.initialized.emit(event);\r\n break;\r\n case 'expand':\r\n case 'collapse':\r\n this.toggleExpanded.emit(event);\r\n break;\r\n case 'activate':\r\n this.activate.emit(event);\r\n break;\r\n case 'deactivate':\r\n this.deactivate.emit(event);\r\n break;\r\n case 'select':\r\n this.select.emit(event);\r\n break;\r\n case 'deselect':\r\n this.deselect.emit(event);\r\n break;\r\n case 'focus':\r\n this.focus.emit(event);\r\n break;\r\n case 'blur':\r\n this.blur.emit(event);\r\n break;\r\n case 'moveNode':\r\n this.moveNode.emit(event);\r\n break;\r\n case 'loadChildren':\r\n this.loadChildren.emit(event);\r\n break;\r\n }\r\n }\r\n \r\n // Keyboard navigation\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (!this.isFocused()) return;\r\n \r\n const key = event.key;\r\n const isRtl = this.options.rtl;\r\n \r\n switch (key) {\r\n case 'ArrowDown':\r\n this.treeModel.focusNextNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.treeModel.focusPreviousNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n isRtl ? this.treeModel.focusDrillUp() : this.treeModel.focusDrillDown();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowLeft':\r\n isRtl ? this.treeModel.focusDrillDown() : this.treeModel.focusDrillUp();\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n const focused = this.treeModel.focusedNode();\r\n if (focused) {\r\n this.treeModel.activateNode(focused);\r\n }\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n \r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused.set(true);\r\n }\r\n \r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused.set(false);\r\n }\r\n}","import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TreeRootComponent } from './components/tree-root/tree-root.component';\r\nimport { TreeOptions } from './core/models/tree-options.model';\r\nimport { TreeEvent } from './core/models/tree-events.model';\r\nimport { TreeNode } from './core/models/tree-node.model';\r\n\r\n@Component({\r\n selector: 'lib-concepto-tree',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, TreeRootComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"concepto-tree-container\">\r\n <div class=\"search-bar-container\">\r\n <div class=\"custom-select\" [class.open]=\"isDropdownOpen()\" (click)=\"toggleDropdown()\">\r\n <div class=\"selected-option\">\r\n {{ selectedNode() ? selectedNode()?.data?.[displayField] : 'Buscar nodo...' }}\r\n </div>\r\n <div class=\"arrow\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 9L12 15L18 9\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"currentColor\"/></svg></div>\r\n </div>\r\n \r\n <div class=\"backdrop\" *ngIf=\"isDropdownOpen()\" (click)=\"closeDropdown()\"></div>\r\n\r\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen()\">\r\n <div class=\"search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchTerm\" \r\n (ngModelChange)=\"filterNodes()\"\r\n placeholder=\"Buscar...\"\r\n class=\"search-input\"\r\n #searchInput\r\n autofocus\r\n >\r\n </div>\r\n <div class=\"options-list\">\r\n <div \r\n *ngFor=\"let node of filteredNodes()\" \r\n class=\"option-item\" \r\n (click)=\"selectNode(node); $event.stopPropagation()\"\r\n >\r\n {{ node.data[displayField] }}\r\n </div>\r\n <div *ngIf=\"filteredNodes().length === 0\" class=\"no-results\">\r\n No se encontraron resultados\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <tree-root\r\n [nodes]=\"nodes\"\r\n [options]=\"options\"\r\n (initialized)=\"onTreeInitialized($event)\"\r\n (toggleExpanded)=\"toggleExpanded.emit($event)\"\r\n (activate)=\"onNodeActivated($event)\"\r\n (deactivate)=\"deactivate.emit($event)\"\r\n (select)=\"select.emit($event)\"\r\n (deselect)=\"deselect.emit($event)\"\r\n (focus)=\"focus.emit($event)\"\r\n (blur)=\"blur.emit($event)\"\r\n (moveNode)=\"moveNode.emit($event)\"\r\n (loadChildren)=\"loadChildren.emit($event)\"\r\n (treeEvent)=\"treeEvent.emit($event)\"\r\n ></tree-root>\r\n </div>\r\n `,\r\n styles: [`\r\n .concepto-tree-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n gap: 10px;\r\n }\r\n \r\n .search-bar-container {\r\n position: relative;\r\n width: 100%;\r\n z-index: 100;\r\n }\r\n\r\n .custom-select {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n background: #e7e7e7;\r\n user-select: none;\r\n transition: border-color 0.2s;\r\n }\r\n\r\n .custom-select:hover {\r\n border-color: #888;\r\n }\r\n \r\n .custom-select.open {\r\n border-color: #007bff;\r\n border-bottom-left-radius: 0;\r\n border-bottom-right-radius: 0;\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 101;\r\n background: transparent;\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n width: 100%;\r\n background: white;\r\n border: 1px solid #ccc;\r\n border-top: none;\r\n border-radius: 0 0 4px 4px;\r\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n margin-top: 0;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n z-index: 102;\r\n }\r\n\r\n .search-input-wrapper {\r\n padding: 8px;\r\n position: sticky;\r\n top: 0;\r\n background: white;\r\n border-bottom: 1px solid #eee;\r\n z-index: 103;\r\n }\r\n\r\n .search-input {\r\n width: 100%;\r\n padding: 8px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n box-sizing: border-box;\r\n outline: none;\r\n background: #e7e7e7;\r\n }\r\n \r\n .search-input:focus {\r\n border-color: #007bff;\r\n }\r\n\r\n .options-list {\r\n max-height: 250px;\r\n overflow-y: auto;\r\n }\r\n\r\n .option-item {\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: background-color 0.1s;\r\n }\r\n\r\n .option-item:hover {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n .no-results {\r\n padding: 12px;\r\n color: #888;\r\n font-style: italic;\r\n text-align: center;\r\n }\r\n \r\n tree-root {\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n `]\r\n})\r\nexport class ConceptoTreeComponent {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n\r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n\r\n @ViewChild(TreeRootComponent) treeRoot!: TreeRootComponent;\r\n\r\n isDropdownOpen = signal(false);\r\n searchTerm = '';\r\n selectedNode = signal<TreeNode | null>(null);\r\n\r\n // All nodes flattened\r\n private allNodes: TreeNode[] = [];\r\n filteredNodes = signal<TreeNode[]>([]);\r\n\r\n get displayField(): string {\r\n return this.options.displayField || 'name';\r\n }\r\n\r\n toggleDropdown() {\r\n this.isDropdownOpen.update(v => !v);\r\n if (this.isDropdownOpen()) {\r\n this.searchTerm = '';\r\n this.filterNodes();\r\n }\r\n }\r\n\r\n closeDropdown() {\r\n this.isDropdownOpen.set(false);\r\n }\r\n\r\n filterNodes() {\r\n if (!this.searchTerm) {\r\n this.filteredNodes.set(this.allNodes);\r\n } else {\r\n const term = this.searchTerm.toLowerCase();\r\n this.filteredNodes.set(\r\n this.allNodes.filter(node =>\r\n String(node.data[this.displayField]).toLowerCase().includes(term)\r\n )\r\n );\r\n }\r\n }\r\n\r\n selectNode(node: TreeNode) {\r\n this.selectedNode.set(node);\r\n this.isDropdownOpen.set(false);\r\n\r\n // Activate in tree\r\n if (this.treeRoot && this.treeRoot.treeModel) {\r\n this.treeRoot.treeModel.activateNode(node);\r\n node.ensureVisible();\r\n }\r\n }\r\n\r\n onTreeInitialized(event: TreeEvent) {\r\n this.initialized.emit(event);\r\n // Get all nodes for the dropdown\r\n if (event.treeModel) {\r\n this.allNodes = event.treeModel.getAllNodes();\r\n this.filteredNodes.set(this.allNodes);\r\n }\r\n }\r\n\r\n onNodeActivated(event: TreeEvent) {\r\n this.activate.emit(event);\r\n if (event.node) {\r\n this.selectedNode.set(event.node);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ComparisonResult } from '../../components/entity-comparison.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EntityComparisonService {\r\n\r\n parseEntities(xmlString: string): any[] {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\r\n \r\n const exportItems = xmlDoc.querySelectorAll('ExportItem[Type=\"Entity\"]');\r\n const entities: any[] = [];\r\n \r\n exportItems.forEach((item) => {\r\n const entity = item.querySelector('Entity_WithoutRedundancies');\r\n if (!entity) return;\r\n \r\n const structureJson = entity.querySelector('EntityStructureJson')?.textContent;\r\n if (!structureJson) return;\r\n \r\n try {\r\n const structure = JSON.parse(structureJson);\r\n entities.push({\r\n id: entity.querySelector('EntityId')?.textContent || '',\r\n name: entity.querySelector('EntityName')?.textContent || '',\r\n structure: structure\r\n });\r\n } catch (e) {\r\n console.error('Error parsing EntityStructureJson:', e);\r\n }\r\n });\r\n \r\n return entities;\r\n }\r\n\r\n compareStructures(leftStructure: any[], rightStructure: any[]): ComparisonResult {\r\n const leftOnly: any[] = [];\r\n const rightOnly: any[] = [];\r\n const modified: any[] = [];\r\n const unchanged: any[] = [];\r\n \r\n // Create maps for quick lookup\r\n const leftMap = this.createNodeMap(leftStructure);\r\n const rightMap = this.createNodeMap(rightStructure);\r\n \r\n // Find nodes only in left or modified\r\n for (const [key, leftNode] of leftMap.entries()) {\r\n if (!rightMap.has(key)) {\r\n leftOnly.push(leftNode);\r\n } else {\r\n const rightNode = rightMap.get(key);\r\n const diff = this.compareNodes(leftNode, rightNode!);\r\n if (diff.length > 0) {\r\n modified.push({ ...leftNode, modifiedProperties: diff });\r\n } else {\r\n unchanged.push(leftNode);\r\n }\r\n }\r\n }\r\n \r\n // Find nodes only in right\r\n for (const [key, rightNode] of rightMap.entries()) {\r\n if (!leftMap.has(key)) {\r\n rightOnly.push(rightNode);\r\n }\r\n }\r\n \r\n return { leftOnly, rightOnly, modified, unchanged };\r\n }\r\n\r\n private createNodeMap(structure: any[], parentPath: string = ''): Map<string, any> {\r\n const map = new Map<string, any>();\r\n \r\n for (const node of structure) {\r\n const nodePath = parentPath ? `${parentPath}/${node.Id}-${node.name}` : `${node.Id}-${node.name}`;\r\n map.set(nodePath, node);\r\n \r\n if (node.Children) {\r\n try {\r\n const children = JSON.parse(node.Children);\r\n const childMap = this.createNodeMap(children, nodePath);\r\n for (const [key, value] of childMap.entries()) {\r\n map.set(key, value);\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n }\r\n }\r\n \r\n return map;\r\n }\r\n\r\n private compareNodes(left: any, right: any): string[] {\r\n const modifiedProps: string[] = [];\r\n \r\n try {\r\n const leftProps = JSON.parse(left.Properties || '{}');\r\n const rightProps = JSON.parse(right.Properties || '{}');\r\n \r\n const allKeys = new Set([\r\n ...Object.keys(leftProps),\r\n ...Object.keys(rightProps)\r\n ]);\r\n \r\n for (const key of allKeys) {\r\n if (leftProps[key] !== rightProps[key]) {\r\n modifiedProps.push(key);\r\n }\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n \r\n return modifiedProps;\r\n }\r\n}","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EntityComparisonService } from '../core/services/entity-comparison.service';\r\n\r\nexport interface ComparisonResult {\r\n leftOnly: any[];\r\n rightOnly: any[];\r\n modified: any[];\r\n unchanged: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'app-entity-comparison',\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [EntityComparisonService],\r\n templateUrl: './entity-comparison.component.html',\r\n styleUrls: ['./entity-comparison.component.css']\r\n})\r\nexport class EntityComparisonComponent {\r\n leftFile: string = '';\r\n rightFile: string = '';\r\n leftEntities: any[] = [];\r\n rightEntities: any[] = [];\r\n selectedLeftEntity: any = null;\r\n selectedRightEntity: any = null;\r\n comparisonResult: ComparisonResult | null = null;\r\n expandedNodes = new Set<string>();\r\n isFullScreen = false;\r\n currentDifferenceIndex = 0;\r\n differences: any[] = [];\r\n\r\n constructor(private comparisonService: EntityComparisonService) {}\r\n\r\n onLeftFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.leftFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.leftEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedLeftEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n onRightFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.rightFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.rightEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedRightEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n selectLeftEntity(entity: any): void {\r\n this.selectedLeftEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n selectRightEntity(entity: any): void {\r\n this.selectedRightEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n private compareIfBothSelected(): void {\r\n if (this.selectedLeftEntity && this.selectedRightEntity) {\r\n this.comparisonResult = this.comparisonService.compareStructures(\r\n this.selectedLeftEntity.structure,\r\n this.selectedRightEntity.structure\r\n );\r\n this.buildDifferencesList();\r\n this.currentDifferenceIndex = 0;\r\n }\r\n }\r\n\r\n private buildDifferencesList(): void {\r\n if (!this.comparisonResult) {\r\n this.differences = [];\r\n return;\r\n }\r\n\r\n this.differences = [\r\n ...this.comparisonResult.leftOnly.map(node => ({ node, type: 'removed' })),\r\n ...this.comparisonResult.rightOnly.map(node => ({ node, type: 'added' })),\r\n ...this.comparisonResult.modified.map(node => ({ node, type: 'modified' }))\r\n ];\r\n }\r\n\r\n navigateToNextDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = (this.currentDifferenceIndex + 1) % this.differences.length;\r\n this.scrollToDifference();\r\n }\r\n\r\n navigateToPreviousDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = this.currentDifferenceIndex === 0\r\n ? this.differences.length - 1\r\n : this.currentDifferenceIndex - 1;\r\n this.scrollToDifference();\r\n }\r\n\r\n private scrollToDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n const currentDiff = this.differences[this.currentDifferenceIndex];\r\n const nodeId = `${currentDiff.node.Id}-${currentDiff.node.name}`;\r\n\r\n // Expand parent nodes FIRST to make the difference visible\r\n this.expandPathToNode(currentDiff.node);\r\n\r\n // Wait for DOM to update after expansion, then scroll\r\n setTimeout(() => {\r\n const leftElement = document.querySelector(`[data-node-id=\"left-${nodeId}\"]`);\r\n const rightElement = document.querySelector(`[data-node-id=\"right-${nodeId}\"]`);\r\n\r\n if (leftElement) {\r\n leftElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n if (rightElement) {\r\n rightElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n\r\n private expandPathToNode(node: any): void {\r\n // Find and expand all parent nodes in both structures\r\n this.expandParentsInStructure(this.selectedLeftEntity.structure, node, 'left');\r\n this.expandParentsInStructure(this.selectedRightEntity.structure, node, 'right');\r\n }\r\n\r\n private expandParentsInStructure(structure: any[], targetNode: any, side: string): boolean {\r\n for (const node of structure) {\r\n const nodeId = `${side}-${node.Id}-${node.name}`;\r\n const targetId = `${targetNode.Id}-${targetNode.name}`;\r\n const currentId = `${node.Id}-${node.name}`;\r\n\r\n // If this is the target node, we found it\r\n if (currentId === targetId) {\r\n return true;\r\n }\r\n\r\n // Check children if they exist\r\n if (this.hasChildren(node)) {\r\n const children = this.getChildren(node);\r\n if (this.expandParentsInStructure(children, targetNode, side)) {\r\n // If the target is in this branch, expand this node\r\n this.expandedNodes.add(nodeId);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get hasDifferences(): boolean {\r\n return this.differences.length > 0;\r\n }\r\n\r\n get currentDifferenceNumber(): number {\r\n return this.currentDifferenceIndex + 1;\r\n }\r\n\r\n get totalDifferences(): number {\r\n return this.differences.length;\r\n }\r\n\r\n toggleNode(nodeId: string): void {\r\n if (this.expandedNodes.has(nodeId)) {\r\n this.expandedNodes.delete(nodeId);\r\n } else {\r\n this.expandedNodes.add(nodeId);\r\n }\r\n }\r\n\r\n isExpanded(nodeId: string): boolean {\r\n return this.expandedNodes.has(nodeId);\r\n }\r\n\r\n getNodeId(node: any, prefix: string): string {\r\n return `${prefix}-${node.Id}-${node.name}`;\r\n }\r\n\r\n hasChildren(node: any): boolean {\r\n return node.Children && JSON.parse(node.Children).length > 0;\r\n }\r\n\r\n getChildren(node: any): any[] {\r\n if (!node.Children) return [];\r\n try {\r\n return JSON.parse(node.Children);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n getProperties(node: any): any {\r\n if (!node.Properties) return {};\r\n try {\r\n return JSON.parse(node.Properties);\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n getPropertyKeys(node: any): string[] {\r\n const props = this.getProperties(node);\r\n return Object.keys(props);\r\n }\r\n\r\n getChangeType(node: any): string {\r\n if (!this.comparisonResult) return '';\r\n \r\n const nodeId = `${node.Id}-${node.name}`;\r\n \r\n if (this.comparisonResult.leftOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'removed';\r\n }\r\n if (this.comparisonResult.rightOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'added';\r\n }\r\n if (this.comparisonResult.modified.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'modified';\r\n }\r\n return 'unchanged';\r\n }\r\n\r\n getModifiedProperties(node: any): string[] {\r\n if (!this.comparisonResult) return [];\r\n\r\n const nodeId = `${node.Id}-${node.name}`;\r\n const modified = this.comparisonResult.modified.find(n => `${n.Id}-${n.name}` === nodeId);\r\n\r\n return modified?.modifiedProperties || [];\r\n }\r\n\r\n toggleFullScreen(): void {\r\n this.isFullScreen = !this.isFullScreen;\r\n }\r\n}","<div class=\"comparison-container\" [class.fullscreen]=\"isFullScreen\">\r\n <header class=\"header\">\r\n <h1>Entity Structure Comparison</h1>\r\n <p class=\"subtitle\">Compare EntityStructureJson between two entity exports</p>\r\n </header>\r\n\r\n <div class=\"file-selection\">\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label left\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onLeftFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Left Entity\r\n </label>\r\n <span *ngIf=\"leftFile\" class=\"file-name\">{{ leftFile }}</span>\r\n </div>\r\n\r\n <div class=\"vs-separator\">VS</div>\r\n\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label right\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onRightFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Right Entity\r\n </label>\r\n <span *ngIf=\"rightFile\" class=\"file-name\">{{ rightFile }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-selection\" *ngIf=\"leftEntities.length > 0 || rightEntities.length > 0\">\r\n <div class=\"entity-list\">\r\n <h3>Left Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of leftEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedLeftEntity === entity\" (click)=\"selectLeftEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-list\">\r\n <h3>Right Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of rightEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedRightEntity === entity\" (click)=\"selectRightEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"summary-section\" *ngIf=\"comparisonResult\">\r\n <div class=\"summary\">\r\n <div class=\"summary-item added\">\r\n <span class=\"count\">{{ comparisonResult.rightOnly.length }}</span>\r\n <span class=\"label\">Added</span>\r\n </div>\r\n <div class=\"summary-item removed\">\r\n <span class=\"count\">{{ comparisonResult.leftOnly.length }}</span>\r\n <span class=\"label\">Removed</span>\r\n </div>\r\n <div class=\"summary-item modified\">\r\n <span class=\"count\">{{ comparisonResult.modified.length }}</span>\r\n <span class=\"label\">Modified</span>\r\n </div>\r\n <div class=\"summary-item unchanged\">\r\n <span class=\"count\">{{ comparisonResult.unchanged.length }}</span>\r\n <span class=\"label\">Unchanged</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-results\" *ngIf=\"comparisonResult\">\r\n <div class=\"results-header\">\r\n <div class=\"header-title\">\r\n <h2>Comparison Results</h2>\r\n <div class=\"header-actions\">\r\n <div class=\"diff-navigation\" *ngIf=\"hasDifferences\">\r\n <button class=\"nav-btn\" (click)=\"navigateToPreviousDifference()\" title=\"Previous Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"18 15 12 9 6 15\" />\r\n </svg>\r\n </button>\r\n <span class=\"diff-counter\">{{ currentDifferenceNumber }} / {{ totalDifferences }}</span>\r\n <button class=\"nav-btn\" (click)=\"navigateToNextDifference()\" title=\"Next Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <button class=\"fullscreen-btn\" (click)=\"toggleFullScreen()\" [title]=\"isFullScreen ? 'Exit Full Screen' : 'Enter Full Screen'\">\r\n <svg *ngIf=\"!isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\r\n </svg>\r\n <svg *ngIf=\"isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"structure-comparison\">\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedLeftEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedLeftEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'left' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedRightEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedRightEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'right' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #nodeTemplate let-node let-side=\"side\">\r\n <div class=\"tree-node\" [class]=\"getChangeType(node)\" [attr.data-node-id]=\"getNodeId(node, side)\">\r\n <div class=\"node-header\">\r\n <button *ngIf=\"hasChildren(node)\" class=\"expand-btn\" (click)=\"toggleNode(getNodeId(node, side))\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline *ngIf=\"!isExpanded(getNodeId(node, side))\" points=\"9 18 15 12 9 6\" />\r\n <polyline *ngIf=\"isExpanded(getNodeId(node, side))\" points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n <div *ngIf=\"!hasChildren(node)\" class=\"spacer\"></div>\r\n\r\n <div class=\"node-icon\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path *ngIf=\"node.nodeType === 'Group'\"\r\n d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n <circle *ngIf=\"node.nodeType === 'Attribute'\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"node-content\">\r\n <span class=\"node-name\">{{ node.name }}</span>\r\n <span class=\"node-type\">{{ node.nodeType }}</span>\r\n <span class=\"change-badge\" *ngIf=\"getChangeType(node) !== 'unchanged'\">\r\n {{ getChangeType(node) }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-properties\" *ngIf=\"getPropertyKeys(node).length > 0\">\r\n <div *ngFor=\"let key of getPropertyKeys(node)\" class=\"property\"\r\n [class.modified]=\"getModifiedProperties(node).includes(key)\">\r\n <span class=\"property-key\">{{ key }}:</span>\r\n <span class=\"property-value\">{{ getProperties(node)[key] }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-children\" *ngIf=\"hasChildren(node) && isExpanded(getNodeId(node, side))\">\r\n <ng-container *ngFor=\"let child of getChildren(node)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: child, side: side }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>","import { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'concepto-input',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './concepto-input.component.html',\r\n styleUrl: './concepto-input.component.css'\r\n})\r\nexport class ConceptoInputComponent {\r\n @Input() labelText: string = 'Date';\r\n @Input() name: string = 'date-input';\r\n @Input() type: string = 'text';\r\n}\r\n","<div class=\"field\">\r\n @if(labelText !== '') {\r\n <label [for]=\"name\" class=\"label\">{{labelText}}</label>\r\n }\r\n @if(type === 'text') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"text\" class=\"text-input\" />\r\n } @else if(type === 'date') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"date\" class=\"date-input\" />\r\n } @else if(type === 'dropdown') {\r\n <select [name]=\"name\" [id]=\"name\" class=\"dropdown-input\">\r\n <option value=\"\" disabled selected>Select an option</option>\r\n </select>\r\n }\r\n</div>","/*\r\n * Public API Surface of concepto-message\r\n */\r\n\r\nexport * from './lib/concepto-user-controls.service';\r\nexport * from './lib/concepto-user-controls.component';\r\nexport * from './lib/concepto-message/concepto-message.component';\r\nexport * from './lib/concepto-context-menu/concepto-context-menu.component';\r\nexport * from './lib/concepto-tree/concepto-tree.component';\r\nexport * from './lib/entity-comparison/components/entity-comparison.component';\r\nexport * from './lib/entity-comparison/core/services/entity-comparison.service';\r\nexport * from './lib/concepto-input/concepto-input.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EntityComparisonService","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"concepto-user-controls.mjs","sources":["../../../projects/concepto-user-controls/src/lib/concepto-user-controls.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-user-controls.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.html","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.html","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-node.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-options.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-expander/tree-node-expander.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-checkbox/tree-node-checkbox.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-content/tree-node-content.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/services/tree-drag-drop.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drag.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drop.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node/tree-node.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-viewport/tree-viewport.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-node-template.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-root/tree-root.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/concepto-tree.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/core/services/entity-comparison.service.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.html","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.html","../../../projects/concepto-user-controls/src/public-api.ts","../../../projects/concepto-user-controls/src/concepto-user-controls.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConceptoUserControlsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-concepto-message',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n concepto-message works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class ConceptoUserControls {\r\n\r\n}\r\n","import { NgIf } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\r\n\r\n\r\n@Component({\r\n selector: 'concepto-message',\r\n standalone: true,\r\n imports: [NgIf],\r\n templateUrl: './concepto-message.component.html',\r\n styleUrl: './concepto-message.component.css'\r\n})\r\nexport class ConceptoMessageComponent {\r\n @Input() title: string = 'Mensaje';\r\n @Input() message: string = 'Este es un mensaje';\r\n @Input() visible: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n @Output() accepted = new EventEmitter<void>();\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n\r\n accept() {\r\n this.accepted.emit();\r\n }\r\n\r\n show() {\r\n this.visible = true;\r\n }\r\n}\r\n","<div class=\"modal-backdrop\" *ngIf=\"visible\">\r\n <div class=\"modal\">\r\n <div class=\"modal-header\">\r\n <h3>{{ title }}</h3>\r\n <button class=\"close-button\" (click)=\"close()\">×</button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>{{ message }}</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button (click)=\"accept()\">Aceptar</button>\r\n </div>\r\n </div>\r\n</div>","import { Component, ElementRef, HostListener, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nexport interface NodeOption {\r\n NodesId: string;\r\n NodesText: string;\r\n NodesParentId: string;\r\n NodesImg: string;\r\n children?: NodeOption[];\r\n}\r\n\r\n@Component({\r\n selector: 'concepto-context-menu',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './concepto-context-menu.component.html',\r\n styleUrl: './concepto-context-menu.component.css'\r\n})\r\nexport class ConceptoContextMenuComponent {\r\n\r\n @Input() nodes: NodeOption[] = [];\r\n menuTree: NodeOption[] = [];\r\n visible = false;\r\n pos = { x: 0, y: 0 };\r\n\r\n constructor(private elRef: ElementRef) {}\r\n\r\n ngOnChanges(): void {\r\n const map = new Map<string, NodeOption>();\r\n this.nodes.forEach(n => map.set(n.NodesId, { ...n, children: [] }));\r\n\r\n const roots: NodeOption[] = [];\r\n map.forEach(n => {\r\n if (n.NodesParentId && map.has(n.NodesParentId)) {\r\n map.get(n.NodesParentId)?.children?.push(n);\r\n } else {\r\n roots.push(n);\r\n }\r\n });\r\n this.menuTree = roots;\r\n }\r\n\r\n showAtEvent(event: MouseEvent): void {\r\n event.preventDefault();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n this.visible = true;\r\n setTimeout(() => {\r\n const menu = this.elRef.nativeElement.querySelector('.context-menu');\r\n const rect = menu.getBoundingClientRect();\r\n this.pos.x = x + rect.width > window.innerWidth ? window.innerWidth - rect.width - 10 : x;\r\n this.pos.y = y + rect.height > window.innerHeight ? window.innerHeight - rect.height - 10 : y;\r\n });\r\n }\r\n\r\n hide(): void {\r\n this.visible = false;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onOutsideClick(event: MouseEvent): void {\r\n if (!this.elRef.nativeElement.contains(event.target)) {\r\n this.hide();\r\n }\r\n }\r\n\r\n onOptionClick(option: NodeOption): void {\r\n if (!option.children || option.children.length === 0) {\r\n console.log('Selected:', option);\r\n this.hide();\r\n }\r\n }\r\n\r\n hasChildren(option: NodeOption): boolean {\r\n return !!option.children && option.children.length > 0;\r\n }\r\n}\r\n\r\n","<div class=\"context-menu\" *ngIf=\"visible\" [ngStyle]=\"{ top: pos.y + 'px', left: pos.x + 'px' }\">\r\n <ul class=\"menu-root\">\r\n <ng-container *ngFor=\"let item of menuTree\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n</div>\r\n\r\n<ng-template #renderNode let-node>\r\n <li class=\"menu-item\" [class.has-children]=\"hasChildren(node)\">\r\n <div (click)=\"onOptionClick(node)\">\r\n @if (node.NodesImg) {\r\n <img [src]=\"node.NodesImg\" class=\"icon\" />\r\n }\r\n @if (!node.NodesImg) {\r\n <div class=\"icon\"></div>\r\n }\r\n {{ node.NodesText }}\r\n </div>\r\n <ul class=\"submenu\" *ngIf=\"hasChildren(node)\">\r\n <ng-container *ngFor=\"let child of node.children\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: child }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n</ng-template>","// lib/core/models/tree-node.model.ts\r\nimport { signal, computed, Signal } from '@angular/core';\r\nimport { TreeOptions } from './tree-options.model';\r\n\r\nexport interface TreeNodeData {\r\n id: string | number;\r\n [key: string]: any;\r\n}\r\n\r\nexport class TreeNode {\r\n // Signals for reactive state\r\n readonly isExpanded = signal(false);\r\n readonly isActive = signal(false);\r\n readonly isSelected = signal(false);\r\n readonly isFocused = signal(false);\r\n readonly isHidden = signal(false);\r\n readonly isLoading = signal(false);\r\n \r\n // Computed signals\r\n readonly isCollapsed = computed(() => !this.isExpanded());\r\n readonly isLeaf = computed(() => !this.hasChildren);\r\n readonly isVisible = computed(() => !this.isHidden());\r\n \r\n id: string | number;\r\n data: TreeNodeData;\r\n parent: TreeNode | null;\r\n children: TreeNode[] = [];\r\n level: number;\r\n path: Array<string | number>;\r\n index: number;\r\n hasChildren: boolean;\r\n icon?: string;\r\n \r\n constructor(\r\n data: TreeNodeData,\r\n parent: TreeNode | null,\r\n level: number,\r\n index: number,\r\n options: TreeOptions\r\n ) {\r\n this.data = data;\r\n this.parent = parent;\r\n this.level = level;\r\n this.index = index;\r\n this.id = data[options.idField || 'id'];\r\n this.icon = data[options.iconField || 'icon'];\r\n\r\n const childrenData = data[options.childrenField || 'children'];\r\n this.hasChildren = Array.isArray(childrenData) && childrenData.length > 0;\r\n \r\n // Initialize expanded state\r\n if (options.isExpandedField && data[options.isExpandedField]) {\r\n this.isExpanded.set(true);\r\n }\r\n \r\n // Build path\r\n this.path = parent ? [...parent.path, this.id] : [this.id];\r\n }\r\n \r\n // Actions\r\n expand(): void {\r\n if (this.hasChildren) {\r\n this.isExpanded.set(true);\r\n }\r\n }\r\n \r\n collapse(): void {\r\n this.isExpanded.set(false);\r\n }\r\n \r\n toggle(): void {\r\n this.isExpanded.update(value => !value);\r\n }\r\n \r\n setActive(value: boolean): void {\r\n this.isActive.set(value);\r\n }\r\n \r\n setSelected(value: boolean): void {\r\n this.isSelected.set(value);\r\n }\r\n \r\n setFocus(value: boolean): void {\r\n this.isFocused.set(value);\r\n }\r\n \r\n setHidden(value: boolean): void {\r\n this.isHidden.set(value);\r\n }\r\n \r\n setLoading(value: boolean): void {\r\n this.isLoading.set(value);\r\n }\r\n \r\n // Helper methods\r\n ensureVisible(): void {\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n node.expand();\r\n node = node.parent;\r\n }\r\n }\r\n \r\n setActiveAndVisible(): void {\r\n this.ensureVisible();\r\n this.setActive(true);\r\n }\r\n \r\n // Get all ancestors\r\n getAncestors(): TreeNode[] {\r\n const ancestors: TreeNode[] = [];\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n ancestors.unshift(node);\r\n node = node.parent;\r\n }\r\n return ancestors;\r\n }\r\n \r\n // Get all descendants\r\n getDescendants(): TreeNode[] {\r\n const descendants: TreeNode[] = [];\r\n const traverse = (node: TreeNode) => {\r\n node.children.forEach(child => {\r\n descendants.push(child);\r\n traverse(child);\r\n });\r\n };\r\n traverse(this);\r\n return descendants;\r\n }\r\n}","// lib/core/models/tree.model.ts\r\nimport { signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { TreeNode } from './tree-node.model';\r\nimport { TreeOptions } from './tree-options.model';\r\nimport { TreeEvent } from './tree-events.model';\r\n\r\nexport class TreeModel {\r\n // Reactive state with signals\r\n readonly roots = signal<TreeNode[]>([]);\r\n readonly focusedNodeId = signal<string | number | null>(null);\r\n readonly expandedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly activeNodeIds = signal<Set<string | number>>(new Set());\r\n readonly selectedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly hiddenNodeIds = signal<Set<string | number>>(new Set());\r\n \r\n // Computed signals\r\n readonly focusedNode = computed(() => {\r\n const id = this.focusedNodeId();\r\n return id ? this.getNodeById(id) : null;\r\n });\r\n \r\n readonly expandedNodes = computed(() => \r\n this.getAllNodes().filter(node => \r\n this.expandedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly activeNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.activeNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly selectedNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.selectedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly visibleNodes = computed(() =>\r\n this.getAllNodes().filter(node => !node.isHidden())\r\n );\r\n \r\n readonly flattenedNodes = computed(() => {\r\n const flattened: TreeNode[] = [];\r\n const traverse = (nodes: TreeNode[]) => {\r\n nodes.forEach(node => {\r\n if (!node.isHidden()) {\r\n flattened.push(node);\r\n if (node.isExpanded() && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return flattened;\r\n });\r\n \r\n // Event streams\r\n readonly events$ = new Subject<TreeEvent>();\r\n \r\n // Virtual root for unified handling\r\n virtualRoot: TreeNode | null = null;\r\n \r\n // Node registry for quick lookup\r\n private nodeRegistry = new Map<string | number, TreeNode>();\r\n \r\n constructor(public options: TreeOptions) {\r\n // Constructor sin effects - se sincronizan en las operaciones\r\n }\r\n \r\n // Data management\r\n setData(data: any[]): void {\r\n this.nodeRegistry.clear();\r\n const roots = this.buildNodes(data, null, 0);\r\n this.roots.set(roots);\r\n this.emitEvent({ type: 'initialized', treeModel: this });\r\n }\r\n \r\n private buildNodes(\r\n data: any[],\r\n parent: TreeNode | null,\r\n level: number\r\n ): TreeNode[] {\r\n return data.map((item, index) => {\r\n const node = new TreeNode(item, parent, level, index, this.options);\r\n this.nodeRegistry.set(node.id, node);\r\n \r\n // Recursively build children\r\n const childrenData = item[this.options.childrenField || 'children'];\r\n if (Array.isArray(childrenData) && childrenData.length > 0) {\r\n node.children = this.buildNodes(childrenData, node, level + 1);\r\n }\r\n \r\n return node;\r\n });\r\n }\r\n \r\n update(): void {\r\n // Trigger change detection by creating new signal values\r\n this.roots.set([...this.roots()]);\r\n this.emitEvent({ type: 'update', treeModel: this });\r\n }\r\n \r\n // Node lookup\r\n getNodeById(id: string | number): TreeNode | null {\r\n return this.nodeRegistry.get(id) || null;\r\n }\r\n \r\n getNodeBy(predicate: (node: TreeNode) => boolean): TreeNode | null {\r\n return this.getAllNodes().find(predicate) || null;\r\n }\r\n \r\n getAllNodes(): TreeNode[] {\r\n const nodes: TreeNode[] = [];\r\n const traverse = (nodeList: TreeNode[]) => {\r\n nodeList.forEach(node => {\r\n nodes.push(node);\r\n if (node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return nodes;\r\n }\r\n \r\n // Navigation\r\n focusNode(node: TreeNode | null): void {\r\n if (this.focusedNode()) {\r\n this.focusedNode()!.setFocus(false);\r\n }\r\n if (node) {\r\n this.focusedNodeId.set(node.id);\r\n node.setFocus(true);\r\n this.emitEvent({ type: 'focus', node });\r\n } else {\r\n this.focusedNodeId.set(null);\r\n }\r\n }\r\n \r\n focusNextNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex < flattened.length - 1) {\r\n this.focusNode(flattened[currentIndex + 1]);\r\n }\r\n }\r\n \r\n focusPreviousNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex > 0) {\r\n this.focusNode(flattened[currentIndex - 1]);\r\n }\r\n }\r\n \r\n focusDrillDown(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (!focused.isExpanded() && focused.hasChildren) {\r\n focused.expand();\r\n } else if (focused.children.length > 0) {\r\n this.focusNode(focused.children[0]);\r\n }\r\n }\r\n }\r\n \r\n focusDrillUp(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (focused.isExpanded() && focused.hasChildren) {\r\n focused.collapse();\r\n } else if (focused.parent) {\r\n this.focusNode(focused.parent);\r\n }\r\n }\r\n }\r\n \r\n // Operations\r\n expandAll(): void {\r\n const ids = new Set(this.getAllNodes().map(n => n.id));\r\n this.expandedNodeIds.set(ids);\r\n this.emitEvent({ type: 'expandAll', treeModel: this });\r\n }\r\n \r\n collapseAll(): void {\r\n this.expandedNodeIds.set(new Set());\r\n this.emitEvent({ type: 'collapseAll', treeModel: this });\r\n }\r\n \r\n expandNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(true);\r\n this.emitEvent({ type: 'expand', node });\r\n }\r\n\r\n collapseNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(false);\r\n this.emitEvent({ type: 'collapse', node });\r\n }\r\n\r\n activateNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.activeNodeIds.set(new Set([node.id]));\r\n this.getAllNodes().forEach(n => n.isActive.set(n.id === node.id));\r\n } else {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(true);\r\n }\r\n this.emitEvent({ type: 'activate', node });\r\n }\r\n \r\n deactivateNode(node: TreeNode): void {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(false);\r\n this.emitEvent({ type: 'deactivate', node });\r\n }\r\n \r\n selectNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.selectedNodeIds.set(new Set([node.id]));\r\n } else {\r\n this.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (ids.has(node.id)) {\r\n newIds.delete(node.id);\r\n } else {\r\n newIds.add(node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n this.emitEvent({ type: 'select', node });\r\n }\r\n \r\n // Filtering\r\n filterNodes(filterFn: (node: TreeNode) => boolean, autoShow = true): void {\r\n const hiddenIds = new Set<string | number>();\r\n \r\n this.getAllNodes().forEach(node => {\r\n const matches = filterFn(node);\r\n if (!matches) {\r\n hiddenIds.add(node.id);\r\n } else if (autoShow) {\r\n // Show ancestors of matching nodes\r\n node.getAncestors().forEach(ancestor => {\r\n hiddenIds.delete(ancestor.id);\r\n });\r\n }\r\n });\r\n \r\n this.hiddenNodeIds.set(hiddenIds);\r\n this.emitEvent({ type: 'filter', treeModel: this });\r\n }\r\n \r\n clearFilter(): void {\r\n this.hiddenNodeIds.set(new Set());\r\n this.emitEvent({ type: 'clearFilter', treeModel: this });\r\n }\r\n \r\n // Drag & Drop\r\n canMoveNode(\r\n node: TreeNode,\r\n to: { parent: TreeNode; index: number }\r\n ): boolean {\r\n // Prevent moving to itself or descendants\r\n if (node === to.parent) return false;\r\n if (to.parent.getAncestors().includes(node)) return false;\r\n \r\n // Custom validation\r\n if (this.options.allowDrop) {\r\n if (typeof this.options.allowDrop === 'function') {\r\n return this.options.allowDrop(node, to);\r\n }\r\n return this.options.allowDrop;\r\n }\r\n \r\n return true;\r\n }\r\n \r\n moveNode(node: TreeNode, to: { parent: TreeNode; index: number }): void {\r\n if (!this.canMoveNode(node, to)) return;\r\n\r\n // Remove from old parent\r\n if (node.parent) {\r\n const oldIndex = node.parent.children.indexOf(node);\r\n if (oldIndex !== -1) {\r\n // Create new array to trigger change detection\r\n node.parent.children = [\r\n ...node.parent.children.slice(0, oldIndex),\r\n ...node.parent.children.slice(oldIndex + 1)\r\n ];\r\n }\r\n } else {\r\n // Handle root nodes\r\n const rootIndex = this.roots().indexOf(node);\r\n if (rootIndex !== -1) {\r\n this.roots.set([\r\n ...this.roots().slice(0, rootIndex),\r\n ...this.roots().slice(rootIndex + 1)\r\n ]);\r\n }\r\n }\r\n\r\n // Add to new parent - create new array to trigger change detection\r\n const newChildren = [...to.parent.children];\r\n newChildren.splice(to.index, 0, node);\r\n to.parent.children = newChildren;\r\n node.parent = to.parent;\r\n\r\n // Update levels\r\n this.updateNodeLevels(node);\r\n\r\n this.emitEvent({ type: 'moveNode', node, to });\r\n this.update();\r\n }\r\n \r\n private updateNodeLevels(node: TreeNode): void {\r\n const newLevel = node.parent ? node.parent.level + 1 : 0;\r\n node.level = newLevel;\r\n \r\n node.children.forEach(child => this.updateNodeLevels(child));\r\n }\r\n \r\n // Async children loading\r\n async loadChildren(node: TreeNode): Promise<void> {\r\n if (!this.options.getChildren) return;\r\n \r\n node.setLoading(true);\r\n \r\n try {\r\n const childrenData = await this.options.getChildren(node);\r\n node.children = this.buildNodes(childrenData, node, node.level + 1);\r\n node.hasChildren = node.children.length > 0;\r\n \r\n this.emitEvent({ type: 'loadChildren', node });\r\n this.update();\r\n } catch (error) {\r\n this.emitEvent({ type: 'loadChildrenError', node, error });\r\n } finally {\r\n node.setLoading(false);\r\n }\r\n }\r\n \r\n // Events\r\n private emitEvent(event: TreeEvent): void {\r\n this.events$.next(event);\r\n }\r\n}","// lib/core/models/tree-options.model.ts\r\nimport { TreeNode } from './tree-node.model';\r\n\r\nexport interface TreeOptions {\r\n // Field mappings\r\n idField?: string;\r\n childrenField?: string;\r\n displayField?: string;\r\n isExpandedField?: string;\r\n hasChildrenField?: string;\r\n iconField?: string;\r\n \r\n // Behavior\r\n allowDrag?: boolean | ((node: TreeNode) => boolean);\r\n allowDrop?: boolean | ((node: TreeNode, to: any) => boolean);\r\n useCheckbox?: boolean;\r\n useTriState?: boolean;\r\n levelPadding?: number;\r\n \r\n // Virtual scroll\r\n useVirtualScroll?: boolean;\r\n nodeHeight?: number | ((node: TreeNode) => number);\r\n scrollContainerHeight?: number;\r\n bufferAmount?: number;\r\n \r\n // Async loading\r\n getChildren?: (node: TreeNode) => Promise<any[]>;\r\n \r\n // Animations\r\n animateExpand?: boolean;\r\n animateSpeed?: number;\r\n animateAcceleration?: number;\r\n \r\n // Scroll behavior\r\n scrollOnActivate?: boolean;\r\n scrollContainer?: HTMLElement;\r\n \r\n // Keyboard\r\n rtl?: boolean;\r\n \r\n // Selection\r\n multiSelect?: boolean;\r\n useMetaKey?: boolean;\r\n}\r\n\r\nexport const DEFAULT_TREE_OPTIONS: TreeOptions = {\r\n idField: 'id',\r\n childrenField: 'children',\r\n displayField: 'name',\r\n isExpandedField: 'isExpanded',\r\n hasChildrenField: 'hasChildren',\r\n iconField: 'icon',\r\n allowDrag: false,\r\n allowDrop: false,\r\n useCheckbox: false,\r\n useTriState: false,\r\n levelPadding: 20,\r\n useVirtualScroll: false,\r\n nodeHeight: 22,\r\n bufferAmount: 5,\r\n animateExpand: false,\r\n animateSpeed: 1,\r\n animateAcceleration: 1.2,\r\n scrollOnActivate: true,\r\n rtl: false,\r\n multiSelect: false,\r\n useMetaKey: true,\r\n};","// lib/components/tree-node-expander/tree-node-expander.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-expander',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-expander\"\r\n [class.tree-node-expander-loading]=\"node.isLoading()\"\r\n (click)=\"onExpanderClick($event)\">\r\n @if (node.isLoading()) {\r\n <span class=\"expander-spinner\"></span>\r\n } @else if (node.hasChildren) {\r\n <svg \r\n class=\"expander-icon\"\r\n [class.expander-icon-expanded]=\"node.isExpanded()\"\r\n width=\"16\" \r\n height=\"16\" \r\n viewBox=\"0 0 16 16\">\r\n <path d=\"M6 4l4 4-4 4\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n stroke-width=\"2\" \r\n stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else {\r\n <span class=\"expander-placeholder\"></span>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-expander {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n transition: background-color 0.15s;\r\n flex-shrink: 0;\r\n }\r\n \r\n .tree-node-expander:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n \r\n .expander-icon {\r\n transition: transform 0.2s ease;\r\n transform: rotate(0deg);\r\n }\r\n \r\n .expander-icon-expanded {\r\n transform: rotate(90deg);\r\n }\r\n \r\n .expander-placeholder {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n \r\n .expander-spinner {\r\n display: inline-block;\r\n width: 14px;\r\n height: 14px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n})\r\nexport class TreeNodeExpanderComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Output() toggle = new EventEmitter<void>();\r\n \r\n onExpanderClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.toggle.emit();\r\n }\r\n}","// lib/components/tree-node-checkbox/tree-node-checkbox.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-checkbox\"\r\n (click)=\"onCheckboxClick($event)\">\r\n <input \r\n type=\"checkbox\"\r\n [checked]=\"isChecked()\"\r\n [indeterminate]=\"isIndeterminate()\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-checkbox {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n flex-shrink: 0;\r\n }\r\n \r\n input[type=\"checkbox\"] {\r\n cursor: pointer;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeCheckboxComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() useTriState = false;\r\n @Output() change = new EventEmitter<boolean>();\r\n \r\n readonly isChecked = computed(() => {\r\n return this.treeModel.selectedNodeIds().has(this.node.id);\r\n });\r\n \r\n readonly isIndeterminate = computed(() => {\r\n if (!this.useTriState || !this.node.hasChildren) {\r\n return false;\r\n }\r\n \r\n const selectedIds = this.treeModel.selectedNodeIds();\r\n const descendants = this.node.getDescendants();\r\n \r\n if (descendants.length === 0) return false;\r\n \r\n const selectedCount = descendants.filter(d => \r\n selectedIds.has(d.id)\r\n ).length;\r\n \r\n return selectedCount > 0 && selectedCount < descendants.length;\r\n });\r\n \r\n onCheckboxClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n }\r\n \r\n onCheckboxChange(event: Event): void {\r\n event.stopPropagation();\r\n const checked = (event.target as HTMLInputElement).checked;\r\n \r\n if (this.useTriState) {\r\n // Update node and all descendants\r\n this.updateNodeAndDescendants(this.node, checked);\r\n } else {\r\n this.change.emit(checked);\r\n }\r\n }\r\n \r\n private updateNodeAndDescendants(node: TreeNode, checked: boolean): void {\r\n this.treeModel.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n \r\n if (checked) {\r\n newIds.add(node.id);\r\n node.getDescendants().forEach(d => newIds.add(d.id));\r\n } else {\r\n newIds.delete(node.id);\r\n node.getDescendants().forEach(d => newIds.delete(d.id));\r\n }\r\n \r\n return newIds;\r\n });\r\n \r\n this.change.emit(checked);\r\n }\r\n}","// lib/components/tree-node-content/tree-node-content.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-content',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n @if (template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"template; context: templateContext\">\r\n </ng-container>\r\n } @else {\r\n <span class=\"tree-node-content-default\">\r\n @if (node.icon) {\r\n <img [src]=\"node.icon\" alt=\"\" class=\"tree-node-icon\" />\r\n }\r\n <span class=\"tree-node-text\">{{ node.data[displayField] }}</span>\r\n </span>\r\n }\r\n `,\r\n styles: [`\r\n .tree-node-content-default {\r\n flex: 1;\r\n padding: 0 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n .tree-node-icon {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n object-fit: contain;\r\n }\r\n\r\n .tree-node-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeContentComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() template?: TemplateRef<any>;\r\n @Input() displayField = 'name';\r\n \r\n NgOnInit(){\r\n console.log(\"Tree node:\", this.node);\r\n }\r\n\r\n get templateContext() {\r\n console.log(\"Tree node:\", this.node);\r\n return {\r\n $implicit: this.node,\r\n node: this.node,\r\n treeModel: this.treeModel,\r\n };\r\n }\r\n}","// lib/core/services/tree-drag-drop.service.ts\r\nimport { Injectable, signal } from '@angular/core';\r\nimport { TreeNode } from '../models/tree-node.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TreeDragDropService {\r\n private readonly draggedNode = signal<TreeNode | null>(null);\r\n \r\n setDraggedNode(node: TreeNode): void {\r\n this.draggedNode.set(node);\r\n }\r\n \r\n getDraggedNode(): TreeNode | null {\r\n return this.draggedNode();\r\n }\r\n \r\n clearDraggedNode(): void {\r\n this.draggedNode.set(null);\r\n }\r\n \r\n isDragging(): boolean {\r\n return this.draggedNode() !== null;\r\n }\r\n}","// lib/directives/tree-drag.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\n@Directive({\r\n selector: '[treeDrag]',\r\n standalone: true,\r\n})\r\nexport class TreeDragDirective {\r\n @Input({ required: true, alias: 'treeDrag' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n @HostBinding('attr.draggable')\r\n get draggable(): boolean {\r\n if (typeof this.options.allowDrag === 'function') {\r\n return this.options.allowDrag(this.node);\r\n }\r\n return this.options.allowDrag || false;\r\n }\r\n \r\n @HostListener('dragstart', ['$event'])\r\n onDragStart(event: DragEvent): void {\r\n if (!this.draggable) {\r\n event.preventDefault();\r\n return;\r\n }\r\n \r\n this.dragDropService.setDraggedNode(this.node);\r\n \r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.setData('text/plain', this.node.id.toString());\r\n \r\n // Create drag image\r\n const dragImage = this.elementRef.nativeElement.cloneNode(true) as HTMLElement;\r\n dragImage.style.opacity = '0.7';\r\n document.body.appendChild(dragImage);\r\n event.dataTransfer.setDragImage(dragImage, 0, 0);\r\n \r\n setTimeout(() => document.body.removeChild(dragImage), 0);\r\n }\r\n \r\n this.elementRef.nativeElement.classList.add('tree-node-dragging');\r\n }\r\n \r\n @HostListener('dragend', ['$event'])\r\n onDragEnd(event: DragEvent): void {\r\n this.dragDropService.clearDraggedNode();\r\n this.elementRef.nativeElement.classList.remove('tree-node-dragging');\r\n }\r\n}","// lib/directives/tree-drop.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n signal,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\ntype DropPosition = 'before' | 'after' | 'inside';\r\n\r\n@Directive({\r\n selector: '[treeDrop]',\r\n standalone: true,\r\n})\r\nexport class TreeDropDirective {\r\n @Input({ required: true, alias: 'treeDrop' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() dropPosition: DropPosition = 'inside';\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n readonly isDraggingOver = signal(false);\r\n readonly canDrop = signal(false);\r\n \r\n @HostBinding('class.tree-drop-target')\r\n get isDropTarget(): boolean {\r\n return this.isDraggingOver() && this.canDrop();\r\n }\r\n \r\n @HostBinding('class.tree-drop-disabled')\r\n get isDropDisabled(): boolean {\r\n return this.isDraggingOver() && !this.canDrop();\r\n }\r\n \r\n @HostListener('dragenter', ['$event'])\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode) return;\r\n \r\n this.isDraggingOver.set(true);\r\n \r\n const dropTarget = this.getDropTarget();\r\n const canDrop = this.treeModel.canMoveNode(draggedNode, dropTarget);\r\n this.canDrop.set(canDrop);\r\n \r\n if (canDrop && event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n \r\n @HostListener('dragover', ['$event'])\r\n onDragOver(event: DragEvent): void {\r\n if (this.canDrop()) {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n }\r\n \r\n @HostListener('dragleave', ['$event'])\r\n onDragLeave(event: DragEvent): void {\r\n // Check if we're really leaving (not just entering a child element)\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n \r\n if (x < rect.left || x >= rect.right || y < rect.top || y >= rect.bottom) {\r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n }\r\n }\r\n \r\n @HostListener('drop', ['$event'])\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode || !this.canDrop()) return;\r\n \r\n const dropTarget = this.getDropTarget();\r\n this.treeModel.moveNode(draggedNode, dropTarget);\r\n \r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n this.dragDropService.clearDraggedNode();\r\n }\r\n \r\n private getDropTarget(): { parent: TreeNode; index: number } {\r\n switch (this.dropPosition) {\r\n case 'before':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index,\r\n };\r\n case 'after':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index + 1,\r\n };\r\n case 'inside':\r\n default:\r\n return {\r\n parent: this.node,\r\n index: this.node.children.length,\r\n };\r\n }\r\n }\r\n}","// lib/components/tree-node/tree-node.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeExpanderComponent } from '../tree-node-expander/tree-node-expander.component';\r\nimport { TreeNodeCheckboxComponent } from '../tree-node-checkbox/tree-node-checkbox.component';\r\nimport { TreeNodeContentComponent } from '../tree-node-content/tree-node-content.component';\r\nimport { TreeDragDirective } from '../../directives/tree-drag.directive';\r\nimport { TreeDropDirective } from '../../directives/tree-drop.directive';\r\n\r\n@Component({\r\n selector: 'tree-node',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeExpanderComponent,\r\n TreeNodeCheckboxComponent,\r\n TreeNodeContentComponent,\r\n TreeDragDirective,\r\n TreeDropDirective,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div \r\n class=\"tree-node\"\r\n [class.tree-node-expanded]=\"node.isExpanded()\"\r\n [class.tree-node-collapsed]=\"node.isCollapsed()\"\r\n [class.tree-node-active]=\"node.isActive()\"\r\n [class.tree-node-focused]=\"node.isFocused()\"\r\n [class.tree-node-leaf]=\"node.isLeaf()\"\r\n [class.tree-node-loading]=\"node.isLoading()\"\r\n [style.padding-left.px]=\"paddingLeft()\">\r\n \r\n <div class=\"tree-node-wrapper\"\r\n [treeDrag]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\">\r\n \r\n <!-- Drop zone before node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-before\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'before'\"\r\n [options]=\"options\">\r\n </div>\r\n \r\n <!-- Node content wrapper -->\r\n <div class=\"tree-node-content-wrapper\"\r\n (click)=\"onNodeClick($event)\"\r\n (dblclick)=\"onNodeDoubleClick($event)\"\r\n (contextmenu)=\"onNodeContextMenu($event)\">\r\n \r\n <!-- Expander -->\r\n @if (node.hasChildren) {\r\n <tree-node-expander\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n (toggle)=\"onToggleExpanded()\">\r\n </tree-node-expander>\r\n }\r\n \r\n <!-- Checkbox -->\r\n @if (options.useCheckbox) {\r\n <tree-node-checkbox\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [useTriState]=\"options.useTriState ?? false\"\r\n (change)=\"onCheckboxChange($event)\">\r\n </tree-node-checkbox>\r\n }\r\n \r\n <!-- Content -->\r\n <tree-node-content\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [template]=\"nodeTemplate\"\r\n [displayField]=\"options.displayField || 'name'\">\r\n </tree-node-content>\r\n </div>\r\n \r\n <!-- Drop zone after node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-after\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'after'\"\r\n [options]=\"options\">\r\n </div>\r\n </div>\r\n \r\n <!-- Children container -->\r\n @if (node.isExpanded() && node.children.length > 0) {\r\n <div class=\"tree-node-children\"\r\n [@expandCollapse]=\"node.isExpanded() ? 'expanded' : 'collapsed'\">\r\n @for (child of node.children; track child.id) {\r\n <tree-node\r\n [node]=\"child\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n </div>\r\n }\r\n \r\n <!-- Loading indicator -->\r\n @if (node.isLoading()) {\r\n <div class=\"tree-node-loading\">\r\n <span class=\"loading-spinner\"></span>\r\n Loading...\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node {\r\n position: relative;\r\n }\r\n \r\n .tree-node-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n min-height: 22px;\r\n }\r\n \r\n .tree-node-content-wrapper {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n padding: 2px 4px;\r\n transition: background-color 0.15s;\r\n }\r\n \r\n .tree-node-content-wrapper:hover {\r\n background-color: #f5f5f5;\r\n }\r\n \r\n .tree-node-active .tree-node-content-wrapper {\r\n background-color: #e3f2fd;\r\n }\r\n \r\n .tree-node-focused .tree-node-content-wrapper {\r\n outline: 2px solid #2196f3;\r\n outline-offset: -2px;\r\n }\r\n \r\n .tree-node-children {\r\n overflow: hidden;\r\n }\r\n \r\n .tree-node-drop-slot {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n z-index: 10;\r\n }\r\n \r\n .tree-node-drop-slot-before {\r\n top: -1px;\r\n }\r\n \r\n .tree-node-drop-slot-after {\r\n bottom: -1px;\r\n }\r\n \r\n .tree-node-loading {\r\n padding: 8px 24px;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #666;\r\n font-size: 14px;\r\n }\r\n \r\n .loading-spinner {\r\n display: inline-block;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n animations: [\r\n trigger('expandCollapse', [\r\n state('collapsed', style({\r\n height: '0',\r\n overflow: 'hidden',\r\n opacity: '0'\r\n })),\r\n state('expanded', style({\r\n height: '*',\r\n overflow: 'visible',\r\n opacity: '1'\r\n })),\r\n transition('collapsed <=> expanded', [\r\n animate('200ms ease-in-out')\r\n ])\r\n ])\r\n ],\r\n})\r\nexport class TreeNodeComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n readonly paddingLeft = computed(() => {\r\n return this.options.levelPadding || 40;\r\n });\r\n \r\n onNodeClick(event: MouseEvent): void {\r\n const useMetaKey = this.options.useMetaKey !== false;\r\n const multiSelect = this.options.multiSelect || false;\r\n \r\n const isMetaKeyPressed = event.ctrlKey || event.metaKey;\r\n const shouldMultiSelect = multiSelect && (!useMetaKey || isMetaKeyPressed);\r\n \r\n this.treeModel.activateNode(this.node, shouldMultiSelect);\r\n this.treeModel.focusNode(this.node);\r\n }\r\n \r\n onNodeDoubleClick(event: MouseEvent): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n this.treeModel.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (this.node.isExpanded()) {\r\n newIds.add(this.node.id);\r\n } else {\r\n newIds.delete(this.node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n }\r\n \r\n onNodeContextMenu(event: MouseEvent): void {\r\n event.preventDefault();\r\n // Emit context menu event\r\n }\r\n \r\n onToggleExpanded(): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n \r\n if (this.node.isExpanded()) {\r\n // Load children if needed\r\n if (this.options.getChildren && this.node.children.length === 0) {\r\n this.treeModel.loadChildren(this.node);\r\n }\r\n this.treeModel.expandNode(this.node);\r\n } else {\r\n this.treeModel.collapseNode(this.node);\r\n }\r\n }\r\n }\r\n \r\n onCheckboxChange(checked: boolean): void {\r\n this.treeModel.selectNode(this.node, this.options.multiSelect || false);\r\n }\r\n}","// lib/components/tree-viewport/tree-viewport.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectionStrategy,\r\n signal,\r\n computed,\r\n TemplateRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'tree-viewport',\r\n standalone: true,\r\n imports: [CommonModule, TreeNodeComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div \r\n #scrollContainer\r\n class=\"tree-viewport-container\"\r\n [style.height.px]=\"options.scrollContainerHeight || 400\"\r\n (scroll)=\"onScroll()\">\r\n \r\n <div class=\"tree-viewport-content\"\r\n [style.height.px]=\"totalHeight()\">\r\n \r\n <div class=\"tree-viewport-padding-top\"\r\n [style.height.px]=\"paddingTop()\">\r\n </div>\r\n \r\n @for (node of visibleNodes(); track node.id) {\r\n <tree-node\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n \r\n <div class=\"tree-viewport-padding-bottom\"\r\n [style.height.px]=\"paddingBottom()\">\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-viewport-container {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n position: relative;\r\n }\r\n \r\n .tree-viewport-content {\r\n position: relative;\r\n width: 100%;\r\n }\r\n \r\n .tree-viewport-padding-top,\r\n .tree-viewport-padding-bottom {\r\n width: 100%;\r\n }\r\n `],\r\n})\r\nexport class TreeViewportComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n @ViewChild('scrollContainer', { static: true }) \r\n scrollContainer!: ElementRef<HTMLElement>;\r\n \r\n private destroy$ = new Subject<void>();\r\n \r\n readonly scrollTop = signal(0);\r\n readonly viewportHeight = signal(0);\r\n \r\n readonly flattenedNodes = computed(() => {\r\n return this.treeModel.flattenedNodes();\r\n });\r\n \r\n readonly totalHeight = computed(() => {\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n if (typeof nodeHeight === 'number') {\r\n return nodes.length * nodeHeight;\r\n }\r\n \r\n return nodes.reduce((sum, node) => sum + nodeHeight(node), 0);\r\n });\r\n \r\n readonly visibleRange = computed(() => {\r\n const scrollTop = this.scrollTop();\r\n const viewportHeight = this.viewportHeight();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const bufferAmount = this.options.bufferAmount || 5;\r\n \r\n let startIndex = 0;\r\n let accumulatedHeight = 0;\r\n \r\n // Find start index\r\n for (let i = 0; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n \r\n if (accumulatedHeight + height > scrollTop) {\r\n startIndex = Math.max(0, i - bufferAmount);\r\n break;\r\n }\r\n accumulatedHeight += height;\r\n }\r\n \r\n // Find end index\r\n let endIndex = startIndex;\r\n accumulatedHeight = 0;\r\n \r\n for (let i = startIndex; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n \r\n accumulatedHeight += height;\r\n \r\n if (accumulatedHeight > viewportHeight + (bufferAmount * (typeof nodeHeight === 'number' ? nodeHeight : 22))) {\r\n endIndex = i;\r\n break;\r\n }\r\n }\r\n \r\n if (endIndex === startIndex) {\r\n endIndex = nodes.length;\r\n }\r\n \r\n return { startIndex, endIndex };\r\n });\r\n \r\n readonly visibleNodes = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n return nodes.slice(range.startIndex, range.endIndex);\r\n });\r\n \r\n readonly paddingTop = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n let height = 0;\r\n for (let i = 0; i < range.startIndex; i++) {\r\n height += typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return height;\r\n });\r\n \r\n readonly paddingBottom = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const totalHeight = this.totalHeight();\r\n \r\n let visibleHeight = this.paddingTop();\r\n \r\n for (let i = range.startIndex; i < range.endIndex; i++) {\r\n visibleHeight += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return Math.max(0, totalHeight - visibleHeight);\r\n });\r\n \r\n constructor() {\r\n // Update viewport when tree changes\r\n effect(() => {\r\n this.flattenedNodes(); // Subscribe to changes\r\n this.updateViewport();\r\n });\r\n }\r\n \r\n ngOnInit(): void {\r\n this.setupScrollListener();\r\n this.updateViewportHeight();\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n \r\n private setupScrollListener(): void {\r\n fromEvent(this.scrollContainer.nativeElement, 'scroll')\r\n .pipe(\r\n debounceTime(10),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n this.onScroll();\r\n });\r\n }\r\n \r\n private updateViewportHeight(): void {\r\n const height = this.scrollContainer.nativeElement.clientHeight;\r\n this.viewportHeight.set(height);\r\n }\r\n \r\n onScroll(): void {\r\n const scrollTop = this.scrollContainer.nativeElement.scrollTop;\r\n this.scrollTop.set(scrollTop);\r\n }\r\n \r\n private updateViewport(): void {\r\n // Force recalculation\r\n this.scrollTop.set(this.scrollContainer.nativeElement.scrollTop);\r\n }\r\n \r\n scrollToNode(node: TreeNode): void {\r\n const nodes = this.flattenedNodes();\r\n const index = nodes.findIndex(n => n.id === node.id);\r\n \r\n if (index === -1) return;\r\n \r\n const nodeHeight = this.options.nodeHeight || 22;\r\n let targetScrollTop = 0;\r\n \r\n for (let i = 0; i < index; i++) {\r\n targetScrollTop += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n this.scrollContainer.nativeElement.scrollTop = targetScrollTop;\r\n }\r\n}","// lib/directives/tree-node-template.directive.ts\r\nimport { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[treeNodeTemplate]',\r\n standalone: true,\r\n})\r\nexport class TreeNodeTemplateDirective {\r\n constructor(public template: TemplateRef<any>) {}\r\n}","// lib/components/tree-root/tree-root.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n HostListener,\r\n signal,\r\n contentChild,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions, DEFAULT_TREE_OPTIONS } from '../../core/models/tree-options.model';\r\nimport { TreeEvent } from '../../core/models/tree-events.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { TreeViewportComponent } from '../tree-viewport/tree-viewport.component';\r\nimport { TreeNodeTemplateDirective } from '../../directives/tree-node-template.directive';\r\n\r\n@Component({\r\n selector: 'tree-root',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeComponent,\r\n TreeViewportComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tree-container\"\r\n [class.tree-rtl]=\"mergedOptions?.rtl\"\r\n tabindex=\"0\">\r\n\r\n @if (mergedOptions?.useVirtualScroll) {\r\n <tree-viewport\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-viewport>\r\n } @else {\r\n @for (root of treeModel.roots(); track root.id) {\r\n <tree-node\r\n [node]=\"root\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-node>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-container {\r\n width: 100%;\r\n height: 100%;\r\n outline: none;\r\n }\r\n \r\n .tree-rtl {\r\n direction: rtl;\r\n }\r\n `],\r\n host: {\r\n '[class.tree-focused]': 'isFocused()',\r\n },\r\n})\r\nexport class TreeRootComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n \r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n \r\n // Content queries\r\n readonly nodeTemplate = contentChild(TreeNodeTemplateDirective, {\r\n read: TemplateRef\r\n });\r\n \r\n treeModel!: TreeModel;\r\n mergedOptions!: TreeOptions;\r\n isFocused = signal(false);\r\n\r\n private eventsSubscription?: Subscription;\r\n \r\n ngOnInit(): void {\r\n this.initializeTreeModel();\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['options'] && !changes['options'].firstChange) {\r\n this.initializeTreeModel();\r\n }\r\n \r\n if (changes['nodes'] && !changes['nodes'].firstChange) {\r\n this.treeModel.setData(this.nodes);\r\n }\r\n }\r\n \r\n private initializeTreeModel(): void {\r\n // Unsubscribe from previous subscription if exists\r\n this.eventsSubscription?.unsubscribe();\r\n\r\n this.mergedOptions = {\r\n ...DEFAULT_TREE_OPTIONS,\r\n ...this.options,\r\n };\r\n\r\n this.treeModel = new TreeModel(this.mergedOptions);\r\n this.treeModel.setData(this.nodes);\r\n\r\n // Subscribe to tree events\r\n this.eventsSubscription = this.treeModel.events$.subscribe(event => {\r\n this.handleTreeEvent(event);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up subscription\r\n this.eventsSubscription?.unsubscribe();\r\n }\r\n \r\n private handleTreeEvent(event: TreeEvent): void {\r\n this.treeEvent.emit(event);\r\n \r\n switch (event.type) {\r\n case 'initialized':\r\n this.initialized.emit(event);\r\n break;\r\n case 'expand':\r\n case 'collapse':\r\n this.toggleExpanded.emit(event);\r\n break;\r\n case 'activate':\r\n this.activate.emit(event);\r\n break;\r\n case 'deactivate':\r\n this.deactivate.emit(event);\r\n break;\r\n case 'select':\r\n this.select.emit(event);\r\n break;\r\n case 'deselect':\r\n this.deselect.emit(event);\r\n break;\r\n case 'focus':\r\n this.focus.emit(event);\r\n break;\r\n case 'blur':\r\n this.blur.emit(event);\r\n break;\r\n case 'moveNode':\r\n this.moveNode.emit(event);\r\n break;\r\n case 'loadChildren':\r\n this.loadChildren.emit(event);\r\n break;\r\n }\r\n }\r\n \r\n // Keyboard navigation\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (!this.isFocused()) return;\r\n \r\n const key = event.key;\r\n const isRtl = this.options.rtl;\r\n \r\n switch (key) {\r\n case 'ArrowDown':\r\n this.treeModel.focusNextNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.treeModel.focusPreviousNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n isRtl ? this.treeModel.focusDrillUp() : this.treeModel.focusDrillDown();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowLeft':\r\n isRtl ? this.treeModel.focusDrillDown() : this.treeModel.focusDrillUp();\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n const focused = this.treeModel.focusedNode();\r\n if (focused) {\r\n this.treeModel.activateNode(focused);\r\n }\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n \r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused.set(true);\r\n }\r\n \r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused.set(false);\r\n }\r\n}","import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TreeRootComponent } from './components/tree-root/tree-root.component';\r\nimport { TreeOptions } from './core/models/tree-options.model';\r\nimport { TreeEvent } from './core/models/tree-events.model';\r\nimport { TreeNode } from './core/models/tree-node.model';\r\n\r\n@Component({\r\n selector: 'lib-concepto-tree',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, TreeRootComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"concepto-tree-container\">\r\n <div class=\"search-bar-container\">\r\n <div class=\"custom-select\" [class.open]=\"isDropdownOpen()\" (click)=\"toggleDropdown()\">\r\n <div class=\"selected-option\">\r\n {{ selectedNode() ? selectedNode()?.data?.[displayField] : 'Buscar nodo...' }}\r\n </div>\r\n <div class=\"arrow\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 9L12 15L18 9\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"currentColor\"/></svg></div>\r\n </div>\r\n \r\n <div class=\"backdrop\" *ngIf=\"isDropdownOpen()\" (click)=\"closeDropdown()\"></div>\r\n\r\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen()\">\r\n <div class=\"search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [ngModel]=\"searchTerm()\"\r\n (ngModelChange)=\"searchTerm.set($event)\" \r\n placeholder=\"Buscar...\"\r\n class=\"search-input\"\r\n #searchInput\r\n autofocus\r\n >\r\n </div>\r\n <div class=\"options-list\">\r\n <div \r\n *ngFor=\"let node of filteredNodes()\" \r\n class=\"option-item\" \r\n (click)=\"selectNode(node); $event.stopPropagation()\"\r\n >\r\n {{ node.data[displayField] }}\r\n </div>\r\n <div *ngIf=\"filteredNodes().length === 0\" class=\"no-results\">\r\n No se encontraron resultados\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <tree-root\r\n [nodes]=\"nodes\"\r\n [options]=\"options\"\r\n (initialized)=\"onTreeInitialized($event)\"\r\n (toggleExpanded)=\"toggleExpanded.emit($event)\"\r\n (activate)=\"onNodeActivated($event)\"\r\n (deactivate)=\"deactivate.emit($event)\"\r\n (select)=\"select.emit($event)\"\r\n (deselect)=\"deselect.emit($event)\"\r\n (focus)=\"focus.emit($event)\"\r\n (blur)=\"blur.emit($event)\"\r\n (moveNode)=\"moveNode.emit($event)\"\r\n (loadChildren)=\"loadChildren.emit($event)\"\r\n (treeEvent)=\"treeEvent.emit($event)\"\r\n ></tree-root>\r\n </div>\r\n `,\r\n styles: [`\r\n .concepto-tree-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n gap: 10px;\r\n }\r\n \r\n .search-bar-container {\r\n position: relative;\r\n width: 100%;\r\n z-index: 100;\r\n }\r\n\r\n .custom-select {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n background: #e7e7e7;\r\n user-select: none;\r\n transition: border-color 0.2s;\r\n }\r\n\r\n .custom-select:hover {\r\n border-color: #888;\r\n }\r\n \r\n .custom-select.open {\r\n border-color: #007bff;\r\n border-bottom-left-radius: 0;\r\n border-bottom-right-radius: 0;\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 101;\r\n background: transparent;\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n width: 100%;\r\n background: white;\r\n border: 1px solid #ccc;\r\n border-top: none;\r\n border-radius: 0 0 4px 4px;\r\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n margin-top: 0;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n z-index: 102;\r\n }\r\n\r\n .search-input-wrapper {\r\n padding: 8px;\r\n position: sticky;\r\n top: 0;\r\n background: white;\r\n border-bottom: 1px solid #eee;\r\n z-index: 103;\r\n }\r\n\r\n .search-input {\r\n width: 100%;\r\n padding: 8px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n box-sizing: border-box;\r\n outline: none;\r\n background: #e7e7e7;\r\n }\r\n \r\n .search-input:focus {\r\n border-color: #007bff;\r\n }\r\n\r\n .options-list {\r\n max-height: 250px;\r\n overflow-y: auto;\r\n }\r\n\r\n .option-item {\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: background-color 0.1s;\r\n }\r\n\r\n .option-item:hover {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n .no-results {\r\n padding: 12px;\r\n color: #888;\r\n font-style: italic;\r\n text-align: center;\r\n }\r\n \r\n tree-root {\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n `]\r\n})\r\nexport class ConceptoTreeComponent {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n\r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n\r\n @ViewChild(TreeRootComponent) treeRoot!: TreeRootComponent;\r\n\r\n // Estado con Signals\r\n isDropdownOpen = signal(false);\r\n searchTerm = signal(''); // Cambiamos a Signal\r\n selectedNode = signal<TreeNode | null>(null);\r\n \r\n // Almacén de todos los nodos (no necesita ser signal porque no cambia tras la carga inicial)\r\n private allNodes: TreeNode[] = [];\r\n\r\n // Signal computada: Se actualiza sola cuando cambia searchTerm o allNodes es asignado\r\n filteredNodes = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n if (!term) return this.allNodes;\r\n \r\n return this.allNodes.filter(node =>\r\n String(node.data[this.displayField]).toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n get displayField(): string {\r\n return this.options.displayField || 'name';\r\n }\r\n\r\n toggleDropdown() {\r\n this.isDropdownOpen.update(v => !v);\r\n if (this.isDropdownOpen()) {\r\n this.searchTerm.set(''); // Reseteamos el término al abrir\r\n }\r\n }\r\n\r\n closeDropdown() {\r\n this.isDropdownOpen.set(false);\r\n }\r\n\r\n selectNode(node: TreeNode) {\r\n this.selectedNode.set(node);\r\n this.isDropdownOpen.set(false);\r\n\r\n if (this.treeRoot?.treeModel) {\r\n // Usamos el API de la librería para activar\r\n node.setActiveAndVisible(); \r\n // O si prefieres: this.treeRoot.treeModel.activateNode(node);\r\n }\r\n }\r\n\r\n onTreeInitialized(event: TreeEvent) {\r\n this.initialized.emit(event);\r\n \r\n // Mantenemos el setTimeout para evitar el error 'firstCreatePass'\r\n setTimeout(() => {\r\n if (event.treeModel) {\r\n this.allNodes = event.treeModel.getAllNodes();\r\n \r\n // Buscamos manualmente el nodo activo si existe\r\n const activeNode = this.allNodes.find(n => n.isActive);\r\n if (activeNode) {\r\n this.selectedNode.set(activeNode);\r\n }\r\n \r\n // Forzamos una actualización inicial de la lista filtrada\r\n // Al setear searchTerm de nuevo, disparas el computed\r\n this.searchTerm.set('');\r\n }\r\n });\r\n }\r\n\r\n onNodeActivated(event: TreeEvent) {\r\n this.activate.emit(event);\r\n if (event.node) {\r\n this.selectedNode.set(event.node);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ComparisonResult } from '../../components/entity-comparison.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EntityComparisonService {\r\n\r\n parseEntities(xmlString: string): any[] {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\r\n \r\n const exportItems = xmlDoc.querySelectorAll('ExportItem[Type=\"Entity\"]');\r\n const entities: any[] = [];\r\n \r\n exportItems.forEach((item) => {\r\n const entity = item.querySelector('Entity_WithoutRedundancies');\r\n if (!entity) return;\r\n \r\n const structureJson = entity.querySelector('EntityStructureJson')?.textContent;\r\n if (!structureJson) return;\r\n \r\n try {\r\n const structure = JSON.parse(structureJson);\r\n entities.push({\r\n id: entity.querySelector('EntityId')?.textContent || '',\r\n name: entity.querySelector('EntityName')?.textContent || '',\r\n structure: structure\r\n });\r\n } catch (e) {\r\n console.error('Error parsing EntityStructureJson:', e);\r\n }\r\n });\r\n \r\n return entities;\r\n }\r\n\r\n compareStructures(leftStructure: any[], rightStructure: any[]): ComparisonResult {\r\n const leftOnly: any[] = [];\r\n const rightOnly: any[] = [];\r\n const modified: any[] = [];\r\n const unchanged: any[] = [];\r\n \r\n // Create maps for quick lookup\r\n const leftMap = this.createNodeMap(leftStructure);\r\n const rightMap = this.createNodeMap(rightStructure);\r\n \r\n // Find nodes only in left or modified\r\n for (const [key, leftNode] of leftMap.entries()) {\r\n if (!rightMap.has(key)) {\r\n leftOnly.push(leftNode);\r\n } else {\r\n const rightNode = rightMap.get(key);\r\n const diff = this.compareNodes(leftNode, rightNode!);\r\n if (diff.length > 0) {\r\n modified.push({ ...leftNode, modifiedProperties: diff });\r\n } else {\r\n unchanged.push(leftNode);\r\n }\r\n }\r\n }\r\n \r\n // Find nodes only in right\r\n for (const [key, rightNode] of rightMap.entries()) {\r\n if (!leftMap.has(key)) {\r\n rightOnly.push(rightNode);\r\n }\r\n }\r\n \r\n return { leftOnly, rightOnly, modified, unchanged };\r\n }\r\n\r\n private createNodeMap(structure: any[], parentPath: string = ''): Map<string, any> {\r\n const map = new Map<string, any>();\r\n \r\n for (const node of structure) {\r\n const nodePath = parentPath ? `${parentPath}/${node.Id}-${node.name}` : `${node.Id}-${node.name}`;\r\n map.set(nodePath, node);\r\n \r\n if (node.Children) {\r\n try {\r\n const children = JSON.parse(node.Children);\r\n const childMap = this.createNodeMap(children, nodePath);\r\n for (const [key, value] of childMap.entries()) {\r\n map.set(key, value);\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n }\r\n }\r\n \r\n return map;\r\n }\r\n\r\n private compareNodes(left: any, right: any): string[] {\r\n const modifiedProps: string[] = [];\r\n \r\n try {\r\n const leftProps = JSON.parse(left.Properties || '{}');\r\n const rightProps = JSON.parse(right.Properties || '{}');\r\n \r\n const allKeys = new Set([\r\n ...Object.keys(leftProps),\r\n ...Object.keys(rightProps)\r\n ]);\r\n \r\n for (const key of allKeys) {\r\n if (leftProps[key] !== rightProps[key]) {\r\n modifiedProps.push(key);\r\n }\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n \r\n return modifiedProps;\r\n }\r\n}","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EntityComparisonService } from '../core/services/entity-comparison.service';\r\n\r\nexport interface ComparisonResult {\r\n leftOnly: any[];\r\n rightOnly: any[];\r\n modified: any[];\r\n unchanged: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'app-entity-comparison',\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [EntityComparisonService],\r\n templateUrl: './entity-comparison.component.html',\r\n styleUrls: ['./entity-comparison.component.css']\r\n})\r\nexport class EntityComparisonComponent {\r\n leftFile: string = '';\r\n rightFile: string = '';\r\n leftEntities: any[] = [];\r\n rightEntities: any[] = [];\r\n selectedLeftEntity: any = null;\r\n selectedRightEntity: any = null;\r\n comparisonResult: ComparisonResult | null = null;\r\n expandedNodes = new Set<string>();\r\n isFullScreen = false;\r\n currentDifferenceIndex = 0;\r\n differences: any[] = [];\r\n\r\n constructor(private comparisonService: EntityComparisonService) {}\r\n\r\n onLeftFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.leftFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.leftEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedLeftEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n onRightFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.rightFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.rightEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedRightEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n selectLeftEntity(entity: any): void {\r\n this.selectedLeftEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n selectRightEntity(entity: any): void {\r\n this.selectedRightEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n private compareIfBothSelected(): void {\r\n if (this.selectedLeftEntity && this.selectedRightEntity) {\r\n this.comparisonResult = this.comparisonService.compareStructures(\r\n this.selectedLeftEntity.structure,\r\n this.selectedRightEntity.structure\r\n );\r\n this.buildDifferencesList();\r\n this.currentDifferenceIndex = 0;\r\n }\r\n }\r\n\r\n private buildDifferencesList(): void {\r\n if (!this.comparisonResult) {\r\n this.differences = [];\r\n return;\r\n }\r\n\r\n this.differences = [\r\n ...this.comparisonResult.leftOnly.map(node => ({ node, type: 'removed' })),\r\n ...this.comparisonResult.rightOnly.map(node => ({ node, type: 'added' })),\r\n ...this.comparisonResult.modified.map(node => ({ node, type: 'modified' }))\r\n ];\r\n }\r\n\r\n navigateToNextDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = (this.currentDifferenceIndex + 1) % this.differences.length;\r\n this.scrollToDifference();\r\n }\r\n\r\n navigateToPreviousDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = this.currentDifferenceIndex === 0\r\n ? this.differences.length - 1\r\n : this.currentDifferenceIndex - 1;\r\n this.scrollToDifference();\r\n }\r\n\r\n private scrollToDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n const currentDiff = this.differences[this.currentDifferenceIndex];\r\n const nodeId = `${currentDiff.node.Id}-${currentDiff.node.name}`;\r\n\r\n // Expand parent nodes FIRST to make the difference visible\r\n this.expandPathToNode(currentDiff.node);\r\n\r\n // Wait for DOM to update after expansion, then scroll\r\n setTimeout(() => {\r\n const leftElement = document.querySelector(`[data-node-id=\"left-${nodeId}\"]`);\r\n const rightElement = document.querySelector(`[data-node-id=\"right-${nodeId}\"]`);\r\n\r\n if (leftElement) {\r\n leftElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n if (rightElement) {\r\n rightElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n\r\n private expandPathToNode(node: any): void {\r\n // Find and expand all parent nodes in both structures\r\n this.expandParentsInStructure(this.selectedLeftEntity.structure, node, 'left');\r\n this.expandParentsInStructure(this.selectedRightEntity.structure, node, 'right');\r\n }\r\n\r\n private expandParentsInStructure(structure: any[], targetNode: any, side: string): boolean {\r\n for (const node of structure) {\r\n const nodeId = `${side}-${node.Id}-${node.name}`;\r\n const targetId = `${targetNode.Id}-${targetNode.name}`;\r\n const currentId = `${node.Id}-${node.name}`;\r\n\r\n // If this is the target node, we found it\r\n if (currentId === targetId) {\r\n return true;\r\n }\r\n\r\n // Check children if they exist\r\n if (this.hasChildren(node)) {\r\n const children = this.getChildren(node);\r\n if (this.expandParentsInStructure(children, targetNode, side)) {\r\n // If the target is in this branch, expand this node\r\n this.expandedNodes.add(nodeId);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get hasDifferences(): boolean {\r\n return this.differences.length > 0;\r\n }\r\n\r\n get currentDifferenceNumber(): number {\r\n return this.currentDifferenceIndex + 1;\r\n }\r\n\r\n get totalDifferences(): number {\r\n return this.differences.length;\r\n }\r\n\r\n toggleNode(nodeId: string): void {\r\n if (this.expandedNodes.has(nodeId)) {\r\n this.expandedNodes.delete(nodeId);\r\n } else {\r\n this.expandedNodes.add(nodeId);\r\n }\r\n }\r\n\r\n isExpanded(nodeId: string): boolean {\r\n return this.expandedNodes.has(nodeId);\r\n }\r\n\r\n getNodeId(node: any, prefix: string): string {\r\n return `${prefix}-${node.Id}-${node.name}`;\r\n }\r\n\r\n hasChildren(node: any): boolean {\r\n return node.Children && JSON.parse(node.Children).length > 0;\r\n }\r\n\r\n getChildren(node: any): any[] {\r\n if (!node.Children) return [];\r\n try {\r\n return JSON.parse(node.Children);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n getProperties(node: any): any {\r\n if (!node.Properties) return {};\r\n try {\r\n return JSON.parse(node.Properties);\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n getPropertyKeys(node: any): string[] {\r\n const props = this.getProperties(node);\r\n return Object.keys(props);\r\n }\r\n\r\n getChangeType(node: any): string {\r\n if (!this.comparisonResult) return '';\r\n \r\n const nodeId = `${node.Id}-${node.name}`;\r\n \r\n if (this.comparisonResult.leftOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'removed';\r\n }\r\n if (this.comparisonResult.rightOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'added';\r\n }\r\n if (this.comparisonResult.modified.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'modified';\r\n }\r\n return 'unchanged';\r\n }\r\n\r\n getModifiedProperties(node: any): string[] {\r\n if (!this.comparisonResult) return [];\r\n\r\n const nodeId = `${node.Id}-${node.name}`;\r\n const modified = this.comparisonResult.modified.find(n => `${n.Id}-${n.name}` === nodeId);\r\n\r\n return modified?.modifiedProperties || [];\r\n }\r\n\r\n toggleFullScreen(): void {\r\n this.isFullScreen = !this.isFullScreen;\r\n }\r\n}","<div class=\"comparison-container\" [class.fullscreen]=\"isFullScreen\">\r\n <header class=\"header\">\r\n <h1>Entity Structure Comparison</h1>\r\n <p class=\"subtitle\">Compare EntityStructureJson between two entity exports</p>\r\n </header>\r\n\r\n <div class=\"file-selection\">\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label left\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onLeftFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Left Entity\r\n </label>\r\n <span *ngIf=\"leftFile\" class=\"file-name\">{{ leftFile }}</span>\r\n </div>\r\n\r\n <div class=\"vs-separator\">VS</div>\r\n\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label right\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onRightFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Right Entity\r\n </label>\r\n <span *ngIf=\"rightFile\" class=\"file-name\">{{ rightFile }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-selection\" *ngIf=\"leftEntities.length > 0 || rightEntities.length > 0\">\r\n <div class=\"entity-list\">\r\n <h3>Left Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of leftEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedLeftEntity === entity\" (click)=\"selectLeftEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-list\">\r\n <h3>Right Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of rightEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedRightEntity === entity\" (click)=\"selectRightEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"summary-section\" *ngIf=\"comparisonResult\">\r\n <div class=\"summary\">\r\n <div class=\"summary-item added\">\r\n <span class=\"count\">{{ comparisonResult.rightOnly.length }}</span>\r\n <span class=\"label\">Added</span>\r\n </div>\r\n <div class=\"summary-item removed\">\r\n <span class=\"count\">{{ comparisonResult.leftOnly.length }}</span>\r\n <span class=\"label\">Removed</span>\r\n </div>\r\n <div class=\"summary-item modified\">\r\n <span class=\"count\">{{ comparisonResult.modified.length }}</span>\r\n <span class=\"label\">Modified</span>\r\n </div>\r\n <div class=\"summary-item unchanged\">\r\n <span class=\"count\">{{ comparisonResult.unchanged.length }}</span>\r\n <span class=\"label\">Unchanged</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-results\" *ngIf=\"comparisonResult\">\r\n <div class=\"results-header\">\r\n <div class=\"header-title\">\r\n <h2>Comparison Results</h2>\r\n <div class=\"header-actions\">\r\n <div class=\"diff-navigation\" *ngIf=\"hasDifferences\">\r\n <button class=\"nav-btn\" (click)=\"navigateToPreviousDifference()\" title=\"Previous Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"18 15 12 9 6 15\" />\r\n </svg>\r\n </button>\r\n <span class=\"diff-counter\">{{ currentDifferenceNumber }} / {{ totalDifferences }}</span>\r\n <button class=\"nav-btn\" (click)=\"navigateToNextDifference()\" title=\"Next Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <button class=\"fullscreen-btn\" (click)=\"toggleFullScreen()\" [title]=\"isFullScreen ? 'Exit Full Screen' : 'Enter Full Screen'\">\r\n <svg *ngIf=\"!isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\r\n </svg>\r\n <svg *ngIf=\"isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"structure-comparison\">\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedLeftEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedLeftEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'left' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedRightEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedRightEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'right' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #nodeTemplate let-node let-side=\"side\">\r\n <div class=\"tree-node\" [class]=\"getChangeType(node)\" [attr.data-node-id]=\"getNodeId(node, side)\">\r\n <div class=\"node-header\">\r\n <button *ngIf=\"hasChildren(node)\" class=\"expand-btn\" (click)=\"toggleNode(getNodeId(node, side))\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline *ngIf=\"!isExpanded(getNodeId(node, side))\" points=\"9 18 15 12 9 6\" />\r\n <polyline *ngIf=\"isExpanded(getNodeId(node, side))\" points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n <div *ngIf=\"!hasChildren(node)\" class=\"spacer\"></div>\r\n\r\n <div class=\"node-icon\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path *ngIf=\"node.nodeType === 'Group'\"\r\n d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n <circle *ngIf=\"node.nodeType === 'Attribute'\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"node-content\">\r\n <span class=\"node-name\">{{ node.name }}</span>\r\n <span class=\"node-type\">{{ node.nodeType }}</span>\r\n <span class=\"change-badge\" *ngIf=\"getChangeType(node) !== 'unchanged'\">\r\n {{ getChangeType(node) }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-properties\" *ngIf=\"getPropertyKeys(node).length > 0\">\r\n <div *ngFor=\"let key of getPropertyKeys(node)\" class=\"property\"\r\n [class.modified]=\"getModifiedProperties(node).includes(key)\">\r\n <span class=\"property-key\">{{ key }}:</span>\r\n <span class=\"property-value\">{{ getProperties(node)[key] }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-children\" *ngIf=\"hasChildren(node) && isExpanded(getNodeId(node, side))\">\r\n <ng-container *ngFor=\"let child of getChildren(node)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: child, side: side }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>","import { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'concepto-input',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './concepto-input.component.html',\r\n styleUrl: './concepto-input.component.css'\r\n})\r\nexport class ConceptoInputComponent {\r\n @Input() labelText: string = 'Date';\r\n @Input() name: string = 'date-input';\r\n @Input() type: string = 'text';\r\n}\r\n","<div class=\"field\">\r\n @if(labelText !== '') {\r\n <label [for]=\"name\" class=\"label\">{{labelText}}</label>\r\n }\r\n @if(type === 'text') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"text\" class=\"text-input\" />\r\n } @else if(type === 'date') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"date\" class=\"date-input\" />\r\n } @else if(type === 'dropdown') {\r\n <select [name]=\"name\" [id]=\"name\" class=\"dropdown-input\">\r\n <option value=\"\" disabled selected>Select an option</option>\r\n </select>\r\n }\r\n</div>","/*\r\n * Public API Surface of concepto-message\r\n */\r\n\r\nexport * from './lib/concepto-user-controls.service';\r\nexport * from './lib/concepto-user-controls.component';\r\nexport * from './lib/concepto-message/concepto-message.component';\r\nexport * from './lib/concepto-context-menu/concepto-context-menu.component';\r\nexport * from './lib/concepto-tree/concepto-tree.component';\r\nexport * from './lib/concepto-tree/core/models/tree.model';\r\nexport * from './lib/concepto-tree/core/models/tree-node.model';\r\nexport * from './lib/concepto-tree/core/models/tree-options.model';\r\nexport * from './lib/concepto-tree/core/models/tree-events.model';\r\nexport * from './lib/entity-comparison/components/entity-comparison.component';\r\nexport * from './lib/entity-comparison/core/services/entity-comparison.service';\r\nexport * from './lib/concepto-input/concepto-input.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EntityComparisonService","i2"],"mappings":";;;;;;;;;;MAKa,2BAA2B,CAAA;AAEtC,IAAA,WAAA,GAAA;wGAFW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCSY,oBAAoB,CAAA;wGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAPrB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAGU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAXhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACpB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,EAAE,EACD,QAAA,EAAA,CAAA;;;;AAIT,EAAA,CAAA,EAAA;;;MCCU,wBAAwB,CAAA;IAC1B,KAAK,GAAW,SAAS;IACzB,OAAO,GAAW,oBAAoB;IACtC,OAAO,GAAY,KAAK;AAEvB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AACjC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;IAE7C,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;IAGpB,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;IAGtB,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;;wGAjBV,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXrC,0eAaM,EAAA,MAAA,EAAA,CAAA,83EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNM,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIH,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAChB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,IAAI,CAAC,EAAA,QAAA,EAAA,0eAAA,EAAA,MAAA,EAAA,CAAA,83EAAA,CAAA,EAAA;8BAKN,KAAK,EAAA,CAAA;sBAAb;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAES,MAAM,EAAA,CAAA;sBAAf;gBACS,QAAQ,EAAA,CAAA;sBAAjB;;;MEEU,4BAA4B,CAAA;AAOnB,IAAA,KAAA;IALX,KAAK,GAAiB,EAAE;IACjC,QAAQ,GAAiB,EAAE;IAC3B,OAAO,GAAG,KAAK;IACf,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAEpB,IAAA,WAAA,CAAoB,KAAiB,EAAA;QAAjB,IAAK,CAAA,KAAA,GAAL,KAAK;;IAEzB,WAAW,GAAA;AACT,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsB;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAEnE,MAAM,KAAK,GAAiB,EAAE;AAC9B,QAAA,GAAG,CAAC,OAAO,CAAC,CAAC,IAAG;AACd,YAAA,IAAI,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE;AAC/C,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;;iBACtC;AACL,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;;AAEjB,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;;AAGvB,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO;AACvB,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO;AACvB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,eAAe,CAAC;AACpE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACzC,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC;AACzF,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,CAAC;AAC/F,SAAC,CAAC;;IAGJ,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;AAItB,IAAA,cAAc,CAAC,KAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACpD,IAAI,CAAC,IAAI,EAAE;;;AAIf,IAAA,aAAa,CAAC,MAAkB,EAAA;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACpD,YAAA,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE;;;AAIf,IAAA,WAAW,CAAC,MAAkB,EAAA;AAC5B,QAAA,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;;wGAxD7C,4BAA4B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBzC,mlCAyBc,EAAA,MAAA,EAAA,CAAA,ssBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDVF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAIX,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EACrB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,mlCAAA,EAAA,MAAA,EAAA,CAAA,ssBAAA,CAAA,EAAA;+EAMd,KAAK,EAAA,CAAA;sBAAb;gBAwCD,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;;AE5D5C;MASa,QAAQ,CAAA;;AAEV,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACxB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;AACzB,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACxB,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;;AAGzB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAChD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;AAC1C,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AAErD,IAAA,EAAE;AACF,IAAA,IAAI;AACJ,IAAA,MAAM;IACN,QAAQ,GAAe,EAAE;AACzB,IAAA,KAAK;AACL,IAAA,IAAI;AACJ,IAAA,KAAK;AACL,IAAA,WAAW;AACX,IAAA,IAAI;IAEJ,WACE,CAAA,IAAkB,EAClB,MAAuB,EACvB,KAAa,EACb,KAAa,EACb,OAAoB,EAAA;AAEpB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;QAE7C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,UAAU,CAAC;AAC9D,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;;QAGzE,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAC5D,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;;QAI3B,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;;;IAI5D,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;;;IAI7B,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;;IAG5B,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;;AAGzC,IAAA,SAAS,CAAC,KAAc,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG1B,IAAA,WAAW,CAAC,KAAc,EAAA;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG5B,IAAA,QAAQ,CAAC,KAAc,EAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG3B,IAAA,SAAS,CAAC,KAAc,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG1B,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;;IAI3B,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,GAAoB,IAAI,CAAC,MAAM;QACvC,OAAO,IAAI,EAAE;YACX,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,GAAG,IAAI,CAAC,MAAM;;;IAItB,mBAAmB,GAAA;QACjB,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;IAItB,YAAY,GAAA;QACV,MAAM,SAAS,GAAe,EAAE;AAChC,QAAA,IAAI,IAAI,GAAoB,IAAI,CAAC,MAAM;QACvC,OAAO,IAAI,EAAE;AACX,YAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,GAAG,IAAI,CAAC,MAAM;;AAEpB,QAAA,OAAO,SAAS;;;IAIlB,cAAc,GAAA;QACZ,MAAM,WAAW,GAAe,EAAE;AAClC,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAc,KAAI;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,gBAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBACvB,QAAQ,CAAC,KAAK,CAAC;AACjB,aAAC,CAAC;AACJ,SAAC;QACD,QAAQ,CAAC,IAAI,CAAC;AACd,QAAA,OAAO,WAAW;;AAErB;;ACnID;MAOa,SAAS,CAAA;AA8DD,IAAA,OAAA;;AA5DV,IAAA,KAAK,GAAG,MAAM,CAAa,EAAE,CAAC;AAC9B,IAAA,aAAa,GAAG,MAAM,CAAyB,IAAI,CAAC;AACpD,IAAA,eAAe,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,CAAC;AACzD,IAAA,aAAa,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,CAAC;AACvD,IAAA,eAAe,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,CAAC;AACzD,IAAA,aAAa,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,CAAC;;AAGvD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;AAC/B,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,IAAI;AACzC,KAAC,CAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAC5B,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACpC,CACF;AAEQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAC5B,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAClC,CACF;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAC5B,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CACpC,CACF;IAEQ,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CACpD;AAEQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,SAAS,GAAe,EAAE;AAChC,QAAA,MAAM,QAAQ,GAAG,CAAC,KAAiB,KAAI;AACrC,YAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,oBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACpB,oBAAA,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACjD,wBAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;;AAG7B,aAAC,CAAC;AACJ,SAAC;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,QAAA,OAAO,SAAS;AAClB,KAAC,CAAC;;AAGO,IAAA,OAAO,GAAG,IAAI,OAAO,EAAa;;IAG3C,WAAW,GAAoB,IAAI;;AAG3B,IAAA,YAAY,GAAG,IAAI,GAAG,EAA6B;AAE3D,IAAA,WAAA,CAAmB,OAAoB,EAAA;QAApB,IAAO,CAAA,OAAA,GAAP,OAAO;;;;AAK1B,IAAA,OAAO,CAAC,IAAW,EAAA;AACjB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;AAGlD,IAAA,UAAU,CAChB,IAAW,EACX,MAAuB,EACvB,KAAa,EAAA;QAEb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;YACnE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;;AAGpC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,UAAU,CAAC;AACnE,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;;AAGhE,YAAA,OAAO,IAAI;AACb,SAAC,CAAC;;IAGJ,MAAM,GAAA;;AAEJ,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;;AAIrD,IAAA,WAAW,CAAC,EAAmB,EAAA;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;;AAG1C,IAAA,SAAS,CAAC,SAAsC,EAAA;QAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI;;IAGnD,WAAW,GAAA;QACT,MAAM,KAAK,GAAe,EAAE;AAC5B,QAAA,MAAM,QAAQ,GAAG,CAAC,QAAoB,KAAI;AACxC,YAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAG;AACtB,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,oBAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAE3B,aAAC,CAAC;AACJ,SAAC;AACD,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACtB,QAAA,OAAO,KAAK;;;AAId,IAAA,SAAS,CAAC,IAAqB,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,IAAI,CAAC,WAAW,EAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;;QAErC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;aAClC;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;;;IAIhC,aAAa,GAAA;AACX,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE;AACvC,QAAA,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CACtC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,CACnC;QACD,IAAI,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;;;IAI/C,iBAAiB,GAAA;AACf,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE;AACvC,QAAA,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CACtC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,CACnC;AACD,QAAA,IAAI,YAAY,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;;;IAI/C,cAAc,GAAA;AACZ,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;QAClC,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE;gBAChD,OAAO,CAAC,MAAM,EAAE;;iBACX,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;;;;IAKzC,YAAY,GAAA;AACV,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;QAClC,IAAI,OAAO,EAAE;YACX,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE;gBAC/C,OAAO,CAAC,QAAQ,EAAE;;AACb,iBAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AACzB,gBAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;;;;;IAMpC,SAAS,GAAA;QACP,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;IAGxD,WAAW,GAAA;QACT,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;AAG1D,IAAA,UAAU,CAAC,IAAc,EAAA;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAG;AAChC,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,YAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,YAAA,OAAO,MAAM;AACf,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG1C,IAAA,YAAY,CAAC,IAAc,EAAA;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAG;AAChC,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACtB,YAAA,OAAO,MAAM;AACf,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;AAG5C,IAAA,YAAY,CAAC,IAAc,EAAE,KAAA,GAAiB,KAAK,EAAA;QACjD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;;aAC5D;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,IAAG;AAC9B,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,gBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,gBAAA,OAAO,MAAM;AACf,aAAC,CAAC;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;;QAEzB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;AAG5C,IAAA,cAAc,CAAC,IAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,IAAG;AAC9B,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACtB,YAAA,OAAO,MAAM;AACf,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;;AAG9C,IAAA,UAAU,CAAC,IAAc,EAAE,KAAA,GAAiB,KAAK,EAAA;QAC/C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;;aACvC;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAG;AAChC,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;gBAC3B,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AACpB,oBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;;qBACjB;AACL,oBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;;AAErB,gBAAA,OAAO,MAAM;AACf,aAAC,CAAC;;QAEJ,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;AAI1C,IAAA,WAAW,CAAC,QAAqC,EAAE,QAAQ,GAAG,IAAI,EAAA;AAChE,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB;QAE5C,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,IAAG;AAChC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;;iBACjB,IAAI,QAAQ,EAAE;;gBAEnB,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAG;AACrC,oBAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC/B,iBAAC,CAAC;;AAEN,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;IAGrD,WAAW,GAAA;QACT,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;;IAI1D,WAAW,CACT,IAAc,EACd,EAAuC,EAAA;;AAGvC,QAAA,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;QACpC,IAAI,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK;;AAGzD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YAC1B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE;gBAChD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;;AAEzC,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS;;AAG/B,QAAA,OAAO,IAAI;;IAGb,QAAQ,CAAC,IAAc,EAAE,EAAuC,EAAA;QAC9D,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAAE;;AAGjC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AACnD,YAAA,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;;AAEnB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG;oBACrB,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;oBAC1C,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC;iBAC3C;;;aAEE;;YAEL,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;AAC5C,YAAA,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;AACpB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;oBACb,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;oBACnC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC;AACpC,iBAAA,CAAC;;;;QAKN,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC;AACrC,QAAA,EAAE,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW;AAChC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;;AAGvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAE3B,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE;;AAGP,IAAA,gBAAgB,CAAC,IAAc,EAAA;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC;AACxD,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;AAErB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;;;IAI9D,MAAM,YAAY,CAAC,IAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE;AAE/B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AAErB,QAAA,IAAI;YACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;AACzD,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACnE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAE3C,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,EAAE;;QACb,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;gBAClD;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;;;;AAKlB,IAAA,SAAS,CAAC,KAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;AAE3B;;ACvUY,MAAA,oBAAoB,GAAgB;AAC/C,IAAA,OAAO,EAAE,IAAI;AACb,IAAA,aAAa,EAAE,UAAU;AACzB,IAAA,YAAY,EAAE,MAAM;AACpB,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,gBAAgB,EAAE,aAAa;AAC/B,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,YAAY,EAAE,EAAE;AAChB,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,aAAa,EAAE,KAAK;AACpB,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,mBAAmB,EAAE,GAAG;AACxB,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,WAAW,EAAE,KAAK;AAClB,IAAA,UAAU,EAAE,IAAI;;;AClElB;MAwFa,yBAAyB,CAAA;AACT,IAAA,IAAI;AACJ,IAAA,SAAS;AAC1B,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAE3C,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;wGAPT,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAvE1B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,qnBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzBS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAyEX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA5ErC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACN,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,qnBAAA,CAAA,EAAA;8BAiD0B,IAAI,EAAA,CAAA;sBAA9B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACf,MAAM,EAAA,CAAA;sBAAf;;;AC3FH;MA+Ca,yBAAyB,CAAA;AACT,IAAA,IAAI;AACJ,IAAA,SAAS;IAC3B,WAAW,GAAG,KAAK;AAClB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAW;AAErC,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3D,KAAC,CAAC;AAEO,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC/C,YAAA,OAAO,KAAK;;QAGd,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAE9C,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAE1C,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IACxC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACtB,CAAC,MAAM;QAER,OAAO,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,WAAW,CAAC,MAAM;AAChE,KAAC,CAAC;AAEF,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;;AAGzB,IAAA,gBAAgB,CAAC,KAAY,EAAA;QAC3B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAE1D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;;YAEpB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;;aAC5C;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;;;IAIrB,wBAAwB,CAAC,IAAc,EAAE,OAAgB,EAAA;QAC/D,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAG;AAC1C,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;YAE3B,IAAI,OAAO,EAAE;AACX,gBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;;iBAC/C;AACL,gBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACtB,gBAAA,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;;AAGzD,YAAA,OAAO,MAAM;AACf,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;;wGA1DhB,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EA7B1B,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAZS,YAAY,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA+BX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAlCrC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACN,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wLAAA,CAAA,EAAA;8BAoB0B,IAAI,EAAA,CAAA;sBAA9B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,WAAW,EAAA,CAAA;sBAAnB;gBACS,MAAM,EAAA,CAAA;sBAAf;;;ACnDH;MAuDa,wBAAwB,CAAA;AACR,IAAA,IAAI;AACJ,IAAA,SAAS;AAC3B,IAAA,QAAQ;IACR,YAAY,GAAG,MAAM;IAE9B,QAAQ,GAAA;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC;;AAGtC,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC;QACpC,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B;;wGAhBQ,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAvCzB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;AAaT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAfS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAyCX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA5CpC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EACN,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;AAaT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wSAAA,CAAA,EAAA;8BA2B0B,IAAI,EAAA,CAAA;sBAA9B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,YAAY,EAAA,CAAA;sBAApB;;;AC3DH;MAOa,mBAAmB,CAAA;AACb,IAAA,WAAW,GAAG,MAAM,CAAkB,IAAI,CAAC;AAE7D,IAAA,cAAc,CAAC,IAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG5B,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;;IAG3B,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;;IAG5B,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI;;wGAhBzB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACND;MAkBa,iBAAiB,CAAA;AACkB,IAAA,IAAI;AACvB,IAAA,SAAS;AACT,IAAA,OAAO;;AAGjB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAE9D,IAAA,IACI,SAAS,GAAA;QACX,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE;YAChD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;AAE1C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK;;AAIxC,IAAA,WAAW,CAAC,KAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,KAAK,CAAC,cAAc,EAAE;YACtB;;QAGF,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAE9C,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,YAAA,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM;AACzC,YAAA,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;;AAGjE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAgB;AAC9E,YAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK;AAC/B,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YACpC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;AAEhD,YAAA,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;;QAG3D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;;AAInE,IAAA,SAAS,CAAC,KAAgB,EAAA;AACxB,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;QACvC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,oBAAoB,CAAC;;wGA7C3D,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;8BAE+C,IAAI,EAAA,CAAA;sBAAjD,KAAK;AAAC,gBAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;gBACjB,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,OAAO,EAAA,CAAA;sBAAjC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAOrB,SAAS,EAAA,CAAA;sBADZ,WAAW;uBAAC,gBAAgB;gBAS7B,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;gBA0BrC,SAAS,EAAA,CAAA;sBADR,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;;;AC5DrC;MAqBa,iBAAiB,CAAA;AACkB,IAAA,IAAI;AACvB,IAAA,SAAS;AACT,IAAA,OAAO;IACzB,YAAY,GAAiB,QAAQ;;AAG7B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAErD,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAEhC,IAAA,IACI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;;AAGhD,IAAA,IACI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;;AAIjD,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,KAAK,CAAC,cAAc,EAAE;QAEtB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACzD,QAAA,IAAI,CAAC,WAAW;YAAE;AAElB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAE7B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC;AACnE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAEzB,QAAA,IAAI,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE;AACjC,YAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;;;AAK1C,IAAA,UAAU,CAAC,KAAgB,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YAClB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACtB,gBAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM;;;;AAM5C,IAAA,WAAW,CAAC,KAAgB,EAAA;;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAClE,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO;AACvB,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO;QAEvB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;AACxE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;;AAK3B,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACzD,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AAErC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE;QACvC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;AAEhD,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;;IAGjC,aAAa,GAAA;AACnB,QAAA,QAAQ,IAAI,CAAC,YAAY;AACvB,YAAA,KAAK,QAAQ;gBACX,OAAO;AACL,oBAAA,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAO;AACzB,oBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;iBACvB;AACH,YAAA,KAAK,OAAO;gBACV,OAAO;AACL,oBAAA,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAO;AACzB,oBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;iBAC3B;AACH,YAAA,KAAK,QAAQ;AACb,YAAA;gBACE,OAAO;oBACL,MAAM,EAAE,IAAI,CAAC,IAAI;AACjB,oBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;iBACjC;;;wGAjGI,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;8BAE+C,IAAI,EAAA,CAAA;sBAAjD,KAAK;AAAC,gBAAA,IAAA,EAAA,CAAA,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;gBACjB,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,OAAO,EAAA,CAAA;sBAAjC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,YAAY,EAAA,CAAA;sBAApB;gBAUG,YAAY,EAAA,CAAA;sBADf,WAAW;uBAAC,wBAAwB;gBAMjC,cAAc,EAAA,CAAA;sBADjB,WAAW;uBAAC,0BAA0B;gBAMvC,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;gBAmBrC,UAAU,EAAA,CAAA;sBADT,YAAY;uBAAC,UAAU,EAAE,CAAC,QAAQ,CAAC;gBAWpC,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;gBAcrC,MAAM,EAAA,CAAA;sBADL,YAAY;uBAAC,MAAM,EAAE,CAAC,QAAQ,CAAC;;;ACrFlC;MA2Na,iBAAiB,CAAA;AACD,IAAA,IAAI;AACJ,IAAA,SAAS;AACT,IAAA,OAAO;AACzB,IAAA,YAAY;AAEZ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE;AACxC,KAAC,CAAC;AAEF,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,KAAK;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK;QAErD,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;QACvD,MAAM,iBAAiB,GAAG,WAAW,KAAK,CAAC,UAAU,IAAI,gBAAgB,CAAC;QAE1E,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACzD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;AAGrC,IAAA,iBAAiB,CAAC,KAAiB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAClB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAG;AAC1C,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,gBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;oBAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;;qBACnB;oBACL,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;;AAE7B,gBAAA,OAAO,MAAM;AACf,aAAC,CAAC;;;AAIN,IAAA,iBAAiB,CAAC,KAAiB,EAAA;QACjC,KAAK,CAAC,cAAc,EAAE;;;IAIxB,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAElB,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;;AAE1B,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC/D,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;gBAExC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;iBAC/B;gBACL,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;AAK5C,IAAA,gBAAgB,CAAC,OAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;;wGA1D9D,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EA5LlB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0FT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAkGU,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApM1B,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,iBAAiB,EA6KP,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA;YACV,OAAO,CAAC,gBAAgB,EAAE;AACxB,gBAAA,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;AACvB,oBAAA,MAAM,EAAE,GAAG;AACX,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC,CAAC;AACH,gBAAA,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;AACtB,oBAAA,MAAM,EAAE,GAAG;AACX,oBAAA,QAAQ,EAAE,SAAS;AACnB,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC,CAAC;gBACH,UAAU,CAAC,wBAAwB,EAAE;oBACnC,OAAO,CAAC,mBAAmB;iBAC5B;aACF;AACF,SAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAxM7B,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,yBAAyB;wBACzB,yBAAyB;wBACzB,wBAAwB;wBACxB,iBAAiB;wBACjB,iBAAiB;qBAClB,EACgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FT,EAgFW,UAAA,EAAA;wBACV,OAAO,CAAC,gBAAgB,EAAE;AACxB,4BAAA,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;AACvB,gCAAA,MAAM,EAAE,GAAG;AACX,gCAAA,QAAQ,EAAE,QAAQ;AAClB,gCAAA,OAAO,EAAE;AACV,6BAAA,CAAC,CAAC;AACH,4BAAA,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;AACtB,gCAAA,MAAM,EAAE,GAAG;AACX,gCAAA,QAAQ,EAAE,SAAS;AACnB,gCAAA,OAAO,EAAE;AACV,6BAAA,CAAC,CAAC;4BACH,UAAU,CAAC,wBAAwB,EAAE;gCACnC,OAAO,CAAC,mBAAmB;6BAC5B;yBACF;AACF,qBAAA,EAAA,MAAA,EAAA,CAAA,m/BAAA,CAAA,EAAA;8BAG0B,IAAI,EAAA,CAAA;sBAA9B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,OAAO,EAAA,CAAA;sBAAjC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,YAAY,EAAA,CAAA;sBAApB;;;AC/NH;MA0Ea,qBAAqB,CAAA;AACL,IAAA,SAAS;AACT,IAAA,OAAO;AACzB,IAAA,YAAY;AAGrB,IAAA,eAAe;AAEP,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAE7B,IAAA,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;AACrB,IAAA,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC;AAE1B,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;AACxC,KAAC,CAAC;AAEO,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;AAEhD,QAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AAClC,YAAA,OAAO,KAAK,CAAC,MAAM,GAAG,UAAU;;QAGlC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/D,KAAC,CAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;AAC5C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC;QAEnD,IAAI,UAAU,GAAG,CAAC;QAClB,IAAI,iBAAiB,GAAG,CAAC;;AAGzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK;AACnC,kBAAE;kBACA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAExB,YAAA,IAAI,iBAAiB,GAAG,MAAM,GAAG,SAAS,EAAE;gBAC1C,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC;gBAC1C;;YAEF,iBAAiB,IAAI,MAAM;;;QAI7B,IAAI,QAAQ,GAAG,UAAU;QACzB,iBAAiB,GAAG,CAAC;AAErB,QAAA,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,YAAA,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK;AACnC,kBAAE;kBACA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAExB,iBAAiB,IAAI,MAAM;YAE3B,IAAI,iBAAiB,GAAG,cAAc,IAAI,YAAY,IAAI,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAC,CAAC,EAAE;gBAC5G,QAAQ,GAAG,CAAC;gBACZ;;;AAIJ,QAAA,IAAI,QAAQ,KAAK,UAAU,EAAE;AAC3B,YAAA,QAAQ,GAAG,KAAK,CAAC,MAAM;;AAGzB,QAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE;AACjC,KAAC,CAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;AACtD,KAAC,CAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAEhD,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;AACzC,YAAA,MAAM,IAAI,OAAO,UAAU,KAAK;AAC9B,kBAAE;kBACA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;AAG1B,QAAA,OAAO,MAAM;AACf,KAAC,CAAC;AAEO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;AAChD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AAEtC,QAAA,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE;AAErC,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;AACtD,YAAA,aAAa,IAAI,OAAO,UAAU,KAAK;AACrC,kBAAE;kBACA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;QAG1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC;AACjD,KAAC,CAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE;AACvB,SAAC,CAAC;;IAGJ,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,oBAAoB,EAAE;;IAG7B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;;IAGlB,mBAAmB,GAAA;QACzB,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ;AACnD,aAAA,IAAI,CACH,YAAY,CAAC,EAAE,CAAC,EAChB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAEzB,SAAS,CAAC,MAAK;YACd,IAAI,CAAC,QAAQ,EAAE;AACjB,SAAC,CAAC;;IAGE,oBAAoB,GAAA;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,YAAY;AAC9D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;;IAGjC,QAAQ,GAAA;QACN,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS;AAC9D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;;IAGvB,cAAc,GAAA;;AAEpB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC;;AAGlE,IAAA,YAAY,CAAC,IAAc,EAAA;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAEpD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE;QAElB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE;QAChD,IAAI,eAAe,GAAG,CAAC;AAEvB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;AAC9B,YAAA,eAAe,IAAI,OAAO,UAAU,KAAK;AACvC,kBAAE;kBACA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;QAG1B,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,GAAG,eAAe;;wGA5KrD,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EA/CtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BT,EA9BS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,+BAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAiD9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBApDjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EACb,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,iBAAiB,CAAC,EACzB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yMAAA,CAAA,EAAA;wDAoB0B,SAAS,EAAA,CAAA;sBAAnC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,OAAO,EAAA,CAAA;sBAAjC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAChB,YAAY,EAAA,CAAA;sBAApB;gBAGD,eAAe,EAAA,CAAA;sBADd,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;AC/EhD;MAOa,yBAAyB,CAAA;AACjB,IAAA,QAAA;AAAnB,IAAA,WAAA,CAAmB,QAA0B,EAAA;QAA1B,IAAQ,CAAA,QAAA,GAAR,QAAQ;;wGADhB,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACND;MAyEa,iBAAiB,CAAA;IACnB,KAAK,GAAU,EAAE;IACjB,OAAO,GAAyB,EAAE;AAEjC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAa;AAC3C,IAAA,cAAc,GAAG,IAAI,YAAY,EAAa;AAC9C,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAa;AACxC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAa;AAC1C,IAAA,MAAM,GAAG,IAAI,YAAY,EAAa;AACtC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAa;AACxC,IAAA,KAAK,GAAG,IAAI,YAAY,EAAa;AACrC,IAAA,IAAI,GAAG,IAAI,YAAY,EAAa;AACpC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAa;AACxC,IAAA,YAAY,GAAG,IAAI,YAAY,EAAa;AAC5C,IAAA,SAAS,GAAG,IAAI,YAAY,EAAa;;AAG1C,IAAA,YAAY,GAAG,YAAY,CAAC,yBAAyB,EAAE;AAC9D,QAAA,IAAI,EAAE;AACP,KAAA,CAAC;AAEF,IAAA,SAAS;AACT,IAAA,aAAa;AACb,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;AAEjB,IAAA,kBAAkB;IAE1B,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,EAAE;;AAG5B,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;YACzD,IAAI,CAAC,mBAAmB,EAAE;;AAG5B,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YACrD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;;IAI9B,mBAAmB,GAAA;;AAEzB,QAAA,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE;QAEtC,IAAI,CAAC,aAAa,GAAG;AACnB,YAAA,GAAG,oBAAoB;YACvB,GAAG,IAAI,CAAC,OAAO;SAChB;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGlC,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAG;AACjE,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7B,SAAC,CAAC;;IAGJ,WAAW,GAAA;;AAET,QAAA,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE;;AAGhC,IAAA,eAAe,CAAC,KAAgB,EAAA;AACtC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AAE1B,QAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,YAAA,KAAK,aAAa;AAChB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B;AACF,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,UAAU;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/B;AACF,YAAA,KAAK,UAAU;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC3B;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBACvB;AACF,YAAA,KAAK,UAAU;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBACtB;AACF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrB;AACF,YAAA,KAAK,UAAU;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC7B;;;;AAMN,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AAEvB,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG;QAE9B,QAAQ,GAAG;AACT,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;gBAC9B,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;gBAClC,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,YAAY;AACf,gBAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;gBACvE,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,WAAW;AACd,gBAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;gBACvE,KAAK,CAAC,cAAc,EAAE;gBACtB;AACF,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,GAAG;gBACN,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;gBAC5C,IAAI,OAAO,EAAE;AACX,oBAAA,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC;;gBAEtC,KAAK,CAAC,cAAc,EAAE;gBACtB;;;IAKN,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;;IAI1B,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;;wGAjJhB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAiBS,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,yBAAyB,EACtD,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,WAAW,EAzDT,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5BC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,qBAAqB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA0CZ,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAhD7B,SAAS;+BACE,WAAW,EAAA,UAAA,EACT,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,iBAAiB;wBACjB,qBAAqB;qBACtB,EACgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBT,EAYK,IAAA,EAAA;AACJ,wBAAA,sBAAsB,EAAE,aAAa;AACtC,qBAAA,EAAA,MAAA,EAAA,CAAA,gFAAA,CAAA,EAAA;8BAGQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAES,WAAW,EAAA,CAAA;sBAApB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,UAAU,EAAA,CAAA;sBAAnB;gBACS,MAAM,EAAA,CAAA;sBAAf;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,KAAK,EAAA,CAAA;sBAAd;gBACS,IAAI,EAAA,CAAA;sBAAb;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBACS,SAAS,EAAA,CAAA;sBAAlB;gBA0FD,SAAS,EAAA,CAAA;sBADR,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC;gBAoCnC,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO;gBAMrB,MAAM,EAAA,CAAA;sBADL,YAAY;uBAAC,MAAM;;;MCjCT,qBAAqB,CAAA;IACvB,KAAK,GAAU,EAAE;IACjB,OAAO,GAAyB,EAAE;AAEjC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAa;AAC3C,IAAA,cAAc,GAAG,IAAI,YAAY,EAAa;AAC9C,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAa;AACxC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAa;AAC1C,IAAA,MAAM,GAAG,IAAI,YAAY,EAAa;AACtC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAa;AACxC,IAAA,KAAK,GAAG,IAAI,YAAY,EAAa;AACrC,IAAA,IAAI,GAAG,IAAI,YAAY,EAAa;AACpC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAa;AACxC,IAAA,YAAY,GAAG,IAAI,YAAY,EAAa;AAC5C,IAAA,SAAS,GAAG,IAAI,YAAY,EAAa;AAErB,IAAA,QAAQ;;AAGtC,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AACxB,IAAA,YAAY,GAAG,MAAM,CAAkB,IAAI,CAAC;;IAGpC,QAAQ,GAAe,EAAE;;AAGjC,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE;AAC5C,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,QAAQ;AAE/B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAClE;AACH,KAAC,CAAC;AAEF,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,MAAM;;IAG5C,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;;IAI5B,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGhC,IAAA,UAAU,CAAC,IAAc,EAAA;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAE9B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE;;YAE5B,IAAI,CAAC,mBAAmB,EAAE;;;;AAK9B,IAAA,iBAAiB,CAAC,KAAgB,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;;QAG5B,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,KAAK,CAAC,SAAS,EAAE;gBACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;;AAG7C,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;gBACtD,IAAI,UAAU,EAAE;AACd,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;;;;AAKnC,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;;AAE3B,SAAC,CAAC;;AAGJ,IAAA,eAAe,CAAC,KAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;;wGAtF1B,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAgBrB,iBAAiB,EA1LlB,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,83CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzDS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FA4K3C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA/KjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EACjB,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAA,eAAA,EACtC,uBAAuB,CAAC,MAAM,EACrC,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,83CAAA,CAAA,EAAA;8BAoHQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAES,WAAW,EAAA,CAAA;sBAApB;gBACS,cAAc,EAAA,CAAA;sBAAvB;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,UAAU,EAAA,CAAA;sBAAnB;gBACS,MAAM,EAAA,CAAA;sBAAf;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,KAAK,EAAA,CAAA;sBAAd;gBACS,IAAI,EAAA,CAAA;sBAAb;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBACS,SAAS,EAAA,CAAA;sBAAlB;gBAE6B,QAAQ,EAAA,CAAA;sBAArC,SAAS;uBAAC,iBAAiB;;;MCjMjB,uBAAuB,CAAA;AAElC,IAAA,aAAa,CAAC,SAAiB,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC;QAE5D,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,CAAC;QACxE,MAAM,QAAQ,GAAU,EAAE;AAE1B,QAAA,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,4BAA4B,CAAC;AAC/D,YAAA,IAAI,CAAC,MAAM;gBAAE;YAEb,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAAE,WAAW;AAC9E,YAAA,IAAI,CAAC,aAAa;gBAAE;AAEpB,YAAA,IAAI;gBACF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,WAAW,IAAI,EAAE;oBACvD,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,WAAW,IAAI,EAAE;AAC3D,oBAAA,SAAS,EAAE;AACZ,iBAAA,CAAC;;YACF,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,CAAC,CAAC;;AAE1D,SAAC,CAAC;AAEF,QAAA,OAAO,QAAQ;;IAGjB,iBAAiB,CAAC,aAAoB,EAAE,cAAqB,EAAA;QAC3D,MAAM,QAAQ,GAAU,EAAE;QAC1B,MAAM,SAAS,GAAU,EAAE;QAC3B,MAAM,QAAQ,GAAU,EAAE;QAC1B,MAAM,SAAS,GAAU,EAAE;;QAG3B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;;AAGnD,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;YAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,gBAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;iBAClB;gBACL,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAU,CAAC;AACpD,gBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACnB,oBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;;qBACnD;AACL,oBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;;AAM9B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;YACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACrB,gBAAA,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;;;QAI7B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;;AAG7C,IAAA,aAAa,CAAC,SAAgB,EAAE,UAAA,GAAqB,EAAE,EAAA;AAC7D,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAe;AAElC,QAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,YAAA,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAG,EAAA,UAAU,CAAI,CAAA,EAAA,IAAI,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAE,CAAA,GAAG,CAAG,EAAA,IAAI,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,EAAE;AACjG,YAAA,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC;AAEvB,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACvD,oBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;AAC7C,wBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;;;gBAErB,OAAO,CAAC,EAAE;;;;;AAMhB,QAAA,OAAO,GAAG;;IAGJ,YAAY,CAAC,IAAS,EAAE,KAAU,EAAA;QACxC,MAAM,aAAa,GAAa,EAAE;AAElC,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;AACrD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC;AAEvD,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC;AACtB,gBAAA,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;AACzB,gBAAA,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU;AAC1B,aAAA,CAAC;AAEF,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;gBACzB,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,EAAE;AACtC,oBAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;;;;QAG3B,OAAO,CAAC,EAAE;;;AAIZ,QAAA,OAAO,aAAa;;wGA9GX,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;4FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCcY,yBAAyB,CAAA;AAahB,IAAA,iBAAA;IAZpB,QAAQ,GAAW,EAAE;IACrB,SAAS,GAAW,EAAE;IACtB,YAAY,GAAU,EAAE;IACxB,aAAa,GAAU,EAAE;IACzB,kBAAkB,GAAQ,IAAI;IAC9B,mBAAmB,GAAQ,IAAI;IAC/B,gBAAgB,GAA4B,IAAI;AAChD,IAAA,aAAa,GAAG,IAAI,GAAG,EAAU;IACjC,YAAY,GAAG,KAAK;IACpB,sBAAsB,GAAG,CAAC;IAC1B,WAAW,GAAU,EAAE;AAEvB,IAAA,WAAA,CAAoB,iBAA0C,EAAA;QAA1C,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;;AAErC,IAAA,kBAAkB,CAAC,KAAU,EAAA;QAC3B,MAAM,IAAI,GAAS,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI;YAAE;AAEX,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAE/B,QAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAM,KAAI;AACzB,YAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC;AACpE,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC9B,SAAC;AAED,QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;AAGzB,IAAA,mBAAmB,CAAC,KAAU,EAAA;QAC5B,MAAM,IAAI,GAAS,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI;YAAE;AAEX,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAE/B,QAAA,MAAM,CAAC,MAAM,GAAG,CAAC,CAAM,KAAI;AACzB,YAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM;YAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,CAAC;AACrE,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC9B,SAAC;AAED,QAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;;AAGzB,IAAA,gBAAgB,CAAC,MAAW,EAAA;AAC1B,QAAA,IAAI,CAAC,kBAAkB,GAAG,MAAM;QAChC,IAAI,CAAC,qBAAqB,EAAE;;AAG9B,IAAA,iBAAiB,CAAC,MAAW,EAAA;AAC3B,QAAA,IAAI,CAAC,mBAAmB,GAAG,MAAM;QACjC,IAAI,CAAC,qBAAqB,EAAE;;IAGtB,qBAAqB,GAAA;QAC3B,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,mBAAmB,EAAE;YACvD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAC9D,IAAI,CAAC,kBAAkB,CAAC,SAAS,EACjC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CACnC;YACD,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,IAAI,CAAC,sBAAsB,GAAG,CAAC;;;IAI3B,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE;YACrB;;QAGF,IAAI,CAAC,WAAW,GAAG;YACjB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1E,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACzE,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;SAC3E;;IAGH,wBAAwB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE;AAEnC,QAAA,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM;QACzF,IAAI,CAAC,kBAAkB,EAAE;;IAG3B,4BAA4B,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE;AAEnC,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,KAAK;AAC5D,cAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG;AAC5B,cAAE,IAAI,CAAC,sBAAsB,GAAG,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE;;IAGnB,kBAAkB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE;QAEnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACjE,QAAA,MAAM,MAAM,GAAG,CAAG,EAAA,WAAW,CAAC,IAAI,CAAC,EAAE,CAAA,CAAA,EAAI,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;;AAGhE,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;;QAGvC,UAAU,CAAC,MAAK;YACd,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAuB,oBAAA,EAAA,MAAM,CAAI,EAAA,CAAA,CAAC;YAC7E,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAwB,qBAAA,EAAA,MAAM,CAAI,EAAA,CAAA,CAAC;YAE/E,IAAI,WAAW,EAAE;AACf,gBAAA,WAAW,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;YAErE,IAAI,YAAY,EAAE;AAChB,gBAAA,YAAY,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;SAEvE,EAAE,GAAG,CAAC;;AAGD,IAAA,gBAAgB,CAAC,IAAS,EAAA;;AAEhC,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC;AAC9E,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;;AAG1E,IAAA,wBAAwB,CAAC,SAAgB,EAAE,UAAe,EAAE,IAAY,EAAA;AAC9E,QAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,IAAI,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,EAAE;YAChD,MAAM,QAAQ,GAAG,CAAA,EAAG,UAAU,CAAC,EAAE,CAAA,CAAA,EAAI,UAAU,CAAC,IAAI,CAAA,CAAE;YACtD,MAAM,SAAS,GAAG,CAAA,EAAG,IAAI,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE;;AAG3C,YAAA,IAAI,SAAS,KAAK,QAAQ,EAAE;AAC1B,gBAAA,OAAO,IAAI;;;AAIb,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvC,IAAI,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE;;AAE7D,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9B,oBAAA,OAAO,IAAI;;;;AAKjB,QAAA,OAAO,KAAK;;AAGd,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;;AAGpC,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,sBAAsB,GAAG,CAAC;;AAGxC,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM;;AAGhC,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;;aAC5B;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;;;AAIlC,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;;IAGvC,SAAS,CAAC,IAAS,EAAE,MAAc,EAAA;QACjC,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE;;AAG5C,IAAA,WAAW,CAAC,IAAS,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;;AAG9D,IAAA,WAAW,CAAC,IAAS,EAAA;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AAC7B,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAChC,QAAA,MAAM;AACN,YAAA,OAAO,EAAE;;;AAIb,IAAA,aAAa,CAAC,IAAS,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,EAAE;AAC/B,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;;AAClC,QAAA,MAAM;AACN,YAAA,OAAO,EAAE;;;AAIb,IAAA,eAAe,CAAC,IAAS,EAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACtC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;AAG3B,IAAA,aAAa,CAAC,IAAS,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,EAAE;QAErC,MAAM,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE;QAExC,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAA,CAAA,EAAI,CAAC,CAAC,IAAI,CAAA,CAAE,KAAK,MAAM,CAAC,EAAE;AAC5E,YAAA,OAAO,SAAS;;QAElB,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAA,CAAA,EAAI,CAAC,CAAC,IAAI,CAAA,CAAE,KAAK,MAAM,CAAC,EAAE;AAC7E,YAAA,OAAO,OAAO;;QAEhB,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAA,CAAA,EAAI,CAAC,CAAC,IAAI,CAAA,CAAE,KAAK,MAAM,CAAC,EAAE;AAC5E,YAAA,OAAO,UAAU;;AAEnB,QAAA,OAAO,WAAW;;AAGpB,IAAA,qBAAqB,CAAC,IAAS,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,EAAE;QAErC,MAAM,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAG,EAAA,CAAC,CAAC,EAAE,CAAI,CAAA,EAAA,CAAC,CAAC,IAAI,CAAE,CAAA,KAAK,MAAM,CAAC;AAEzF,QAAA,OAAO,QAAQ,EAAE,kBAAkB,IAAI,EAAE;;IAG3C,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;;wGA3O7B,yBAAyB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,uBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,oEAJzB,CAAC,uBAAuB,CAAC,ECftC,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,q4WA8Mc,i/MDhMF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBARrC,SAAS;+BACE,uBAAuB,EAAA,UAAA,EACrB,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,CAAC,EAAA,SAAA,EACZ,CAAC,uBAAuB,CAAC,EAAA,QAAA,EAAA,q4WAAA,EAAA,MAAA,EAAA,CAAA,07MAAA,CAAA,EAAA;;;MENzB,sBAAsB,CAAA;IACxB,SAAS,GAAW,MAAM;IAC1B,IAAI,GAAW,YAAY;IAC3B,IAAI,GAAW,MAAM;wGAHnB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,0ICTnC,ukBAaM,EAAA,MAAA,EAAA,CAAA,27CAAA,CAAA,EAAA,CAAA;;4FDJO,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EAAA,ukBAAA,EAAA,MAAA,EAAA,CAAA,27CAAA,CAAA,EAAA;8BAKF,SAAS,EAAA,CAAA;sBAAjB;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBACQ,IAAI,EAAA,CAAA;sBAAZ;;;AEZH;;AAEG;;ACFH;;AAEG;;;;"}
|
|
@@ -20,14 +20,13 @@ export declare class ConceptoTreeComponent {
|
|
|
20
20
|
treeEvent: EventEmitter<TreeEvent>;
|
|
21
21
|
treeRoot: TreeRootComponent;
|
|
22
22
|
isDropdownOpen: import("@angular/core").WritableSignal<boolean>;
|
|
23
|
-
searchTerm: string
|
|
23
|
+
searchTerm: import("@angular/core").WritableSignal<string>;
|
|
24
24
|
selectedNode: import("@angular/core").WritableSignal<TreeNode | null>;
|
|
25
25
|
private allNodes;
|
|
26
|
-
filteredNodes: import("@angular/core").
|
|
26
|
+
filteredNodes: import("@angular/core").Signal<TreeNode[]>;
|
|
27
27
|
get displayField(): string;
|
|
28
28
|
toggleDropdown(): void;
|
|
29
29
|
closeDropdown(): void;
|
|
30
|
-
filterNodes(): void;
|
|
31
30
|
selectNode(node: TreeNode): void;
|
|
32
31
|
onTreeInitialized(event: TreeEvent): void;
|
|
33
32
|
onNodeActivated(event: TreeEvent): void;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -3,6 +3,10 @@ export * from './lib/concepto-user-controls.component';
|
|
|
3
3
|
export * from './lib/concepto-message/concepto-message.component';
|
|
4
4
|
export * from './lib/concepto-context-menu/concepto-context-menu.component';
|
|
5
5
|
export * from './lib/concepto-tree/concepto-tree.component';
|
|
6
|
+
export * from './lib/concepto-tree/core/models/tree.model';
|
|
7
|
+
export * from './lib/concepto-tree/core/models/tree-node.model';
|
|
8
|
+
export * from './lib/concepto-tree/core/models/tree-options.model';
|
|
9
|
+
export * from './lib/concepto-tree/core/models/tree-events.model';
|
|
6
10
|
export * from './lib/entity-comparison/components/entity-comparison.component';
|
|
7
11
|
export * from './lib/entity-comparison/core/services/entity-comparison.service';
|
|
8
12
|
export * from './lib/concepto-input/concepto-input.component';
|