mis-crystal-design-system 18.0.7-test → 18.0.8-test-2
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/assets/icons/sort-asc.svg +5 -0
- package/assets/icons/sort-desc.svg +5 -0
- package/assets/icons/sprite.svg +12 -0
- package/esm2022/table/public_api.mjs +5 -3
- package/esm2022/table/sort-icons.directive.mjs +151 -0
- package/esm2022/table/table.component.mjs +77 -51
- package/esm2022/table/table.config.mjs +6 -0
- package/esm2022/table/table.module.mjs +25 -4
- package/fesm2022/mis-crystal-design-system-table.mjs +254 -55
- package/fesm2022/mis-crystal-design-system-table.mjs.map +1 -1
- package/package.json +17 -17
- package/table/filter/filter.component.d.ts +1 -1
- package/table/public_api.d.ts +4 -2
- package/table/sort-icons.directive.d.ts +38 -0
- package/table/table.component.d.ts +11 -1
- package/table/table.config.d.ts +2 -0
- package/table/table.module.d.ts +5 -4
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path d="M4 6L8 2L12 6" stroke="#181F33" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
<path d="M8 2V14" stroke="#181F33" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<path d="M4 10L8 14L12 10" stroke="#181F33" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
4
|
+
<path d="M8 14V2" stroke="#181F33" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
|
|
3
|
+
<!-- Sort Ascending Icon -->
|
|
4
|
+
<symbol id="sort-asc" viewBox="0 0 24 24" fill="none">
|
|
5
|
+
<path d="M7 14l5-5 5 5z" fill="currentColor"/>
|
|
6
|
+
</symbol>
|
|
7
|
+
|
|
8
|
+
<!-- Sort Descending Icon -->
|
|
9
|
+
<symbol id="sort-desc" viewBox="0 0 24 24" fill="none">
|
|
10
|
+
<path d="M7 10l5 5 5-5z" fill="currentColor"/>
|
|
11
|
+
</symbol>
|
|
12
|
+
</svg>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * from './table.component';
|
|
2
|
+
export * from './table.module';
|
|
3
|
+
export * from './table.config';
|
|
4
|
+
export * from './sort-icons.directive';
|
|
2
5
|
export { SubTableComponent } from "./sub-table/sub-table.component";
|
|
3
6
|
export { CustomTableCellDirective } from "./custom-table-cell.directive";
|
|
4
|
-
export { TableModule } from "./table.module";
|
|
5
7
|
export { TableFilterComponent } from "./filter/filter.component";
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL3RhYmxlL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUd6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vdGFibGUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vdGFibGUubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vdGFibGUuY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vc29ydC1pY29ucy5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgU3ViVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi9zdWItdGFibGUvc3ViLXRhYmxlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgQ3VzdG9tVGFibGVDZWxsRGlyZWN0aXZlIH0gZnJvbSBcIi4vY3VzdG9tLXRhYmxlLWNlbGwuZGlyZWN0aXZlXCI7XG5leHBvcnQgeyBUYWJsZUNvbmZpZywgUGFnaW5hdGlvbkNvbmZpZywgUm93Q29uZmlnLCBDb2xIZWFkZXJDb25maWcsIENvbENvbmZpZyB9IGZyb20gXCIuL3RhYmxlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgU3ViVGFibGVDb25maWcsIFN1YlRhYmxlQ29sQ29uZmlnLCBTdWJUYWJsZUNvbEhlYWRlckNvbmZpZywgU3ViVGFibGVSb3dDb25maWcgfSBmcm9tIFwiLi9zdWItdGFibGUvc3ViLXRhYmxlLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgVGFibGVGaWx0ZXJDb21wb25lbnQgfSBmcm9tIFwiLi9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudFwiO1xuZXhwb3J0IHsgRmlsdGVyIH0gZnJvbSBcIi4vZmlsdGVyL2ZpbHRlci5jb21wb25lbnRcIjtcbiJdfQ==
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { Directive, input, output, signal, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class SortIconsDirective {
|
|
4
|
+
constructor(el, renderer) {
|
|
5
|
+
this.el = el;
|
|
6
|
+
this.renderer = renderer;
|
|
7
|
+
// Convert inputs to signals
|
|
8
|
+
this.column = input();
|
|
9
|
+
this.activeSort = input();
|
|
10
|
+
this.activeSorts = input();
|
|
11
|
+
this.multiColumnSort = input(false);
|
|
12
|
+
// Convert output to signal
|
|
13
|
+
this.sortChange = output();
|
|
14
|
+
this.multiSortChange = output();
|
|
15
|
+
// Internal state as signals
|
|
16
|
+
this.currentDirection = signal('');
|
|
17
|
+
this.columnNumber = signal(0);
|
|
18
|
+
}
|
|
19
|
+
ngOnInit() {
|
|
20
|
+
// Get column number from data-column attribute
|
|
21
|
+
const columnAttr = this.el.nativeElement.getAttribute('data-column');
|
|
22
|
+
if (columnAttr) {
|
|
23
|
+
this.columnNumber.set(parseInt(columnAttr, 10));
|
|
24
|
+
}
|
|
25
|
+
// Create a container for the icons
|
|
26
|
+
const container = this.renderer.createElement('div');
|
|
27
|
+
this.renderer?.setStyle(container, 'display', 'inline-flex');
|
|
28
|
+
this.renderer?.setStyle(container, 'align-items', 'center');
|
|
29
|
+
this.renderer?.setStyle(container, 'gap', '0.5rem');
|
|
30
|
+
const iconContainer = this.renderer.createElement('div');
|
|
31
|
+
this.renderer?.setStyle(iconContainer, 'display', 'inline-flex');
|
|
32
|
+
this.renderer?.setStyle(iconContainer, 'flex-direction', 'column');
|
|
33
|
+
this.renderer?.setStyle(iconContainer, 'align-items', 'center');
|
|
34
|
+
this.renderer?.setStyle(iconContainer, 'gap', '5px');
|
|
35
|
+
this.upIcon = this.renderer.createElement('img');
|
|
36
|
+
this.renderer?.setAttribute(this.upIcon, 'src', this.column()?.sortAscIcon);
|
|
37
|
+
this.renderer?.setStyle(this.upIcon, 'opacity', '0.5');
|
|
38
|
+
this.renderer?.setStyle(this.upIcon, 'transition', 'opacity 0.3s ease');
|
|
39
|
+
this.renderer?.setStyle(this.upIcon, 'width', '9px');
|
|
40
|
+
this.renderer?.setStyle(this.upIcon, 'cursor', 'pointer');
|
|
41
|
+
this.renderer?.listen(this.upIcon, 'click', () => this.setSortDirection('ASC'));
|
|
42
|
+
this.downIcon = this.renderer.createElement('img');
|
|
43
|
+
this.renderer?.setAttribute(this.downIcon, 'src', this.column()?.sortDescIcon);
|
|
44
|
+
this.renderer?.setStyle(this.downIcon, 'opacity', '0.5');
|
|
45
|
+
this.renderer?.setStyle(this.downIcon, 'transition', 'opacity 0.3s ease');
|
|
46
|
+
this.renderer?.setStyle(this.downIcon, 'width', '9px');
|
|
47
|
+
this.renderer?.setStyle(this.downIcon, 'cursor', 'pointer');
|
|
48
|
+
this.renderer?.listen(this.downIcon, 'click', () => this.setSortDirection('DESC'));
|
|
49
|
+
this.renderer?.appendChild(iconContainer, this.upIcon);
|
|
50
|
+
this.renderer?.appendChild(iconContainer, this.downIcon);
|
|
51
|
+
this.renderer?.appendChild(container, iconContainer);
|
|
52
|
+
if (this.multiColumnSort()) {
|
|
53
|
+
this.sortOrderElement = this.renderer.createElement('span');
|
|
54
|
+
this.renderer?.setStyle(this.sortOrderElement, 'font-size', '12px');
|
|
55
|
+
this.renderer?.setStyle(this.sortOrderElement, 'font-weight', 'bold');
|
|
56
|
+
this.renderer?.setStyle(this.sortOrderElement, 'color', '#000');
|
|
57
|
+
this.renderer?.appendChild(container, this.sortOrderElement);
|
|
58
|
+
}
|
|
59
|
+
this.renderer?.appendChild(this.el.nativeElement, container);
|
|
60
|
+
this.updateIconStyles();
|
|
61
|
+
}
|
|
62
|
+
ngOnChanges(changes) {
|
|
63
|
+
if (changes['activeSort'] || changes['activeSorts']) {
|
|
64
|
+
this.updateIconStyles();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
setSortDirection(direction) {
|
|
68
|
+
if (this.multiColumnSort()) {
|
|
69
|
+
this.handleMultiColumnSort(direction);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
this.handleSingleColumnSort(direction);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
handleSingleColumnSort(direction) {
|
|
76
|
+
if (this.currentDirection() === direction) {
|
|
77
|
+
this.currentDirection.set(''); // Reset sorting if the same direction is clicked
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.currentDirection.set(direction);
|
|
81
|
+
}
|
|
82
|
+
this.sortChange.emit({
|
|
83
|
+
column: this.column()?.data || '',
|
|
84
|
+
direction: this.currentDirection(),
|
|
85
|
+
columnNumber: this.columnNumber()
|
|
86
|
+
});
|
|
87
|
+
this.updateIconStyles();
|
|
88
|
+
}
|
|
89
|
+
handleMultiColumnSort(direction) {
|
|
90
|
+
const existingSortIndex = this.activeSorts().findIndex(sort => sort.column === this.column()?.data);
|
|
91
|
+
if (existingSortIndex !== -1) {
|
|
92
|
+
if (this.activeSorts()[existingSortIndex].direction !== direction) {
|
|
93
|
+
this.activeSorts()[existingSortIndex].direction = direction;
|
|
94
|
+
this.activeSorts()[existingSortIndex].columnNumber = this.columnNumber();
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
this.activeSorts().push({
|
|
102
|
+
column: this.column()?.data || '',
|
|
103
|
+
direction,
|
|
104
|
+
columnNumber: this.columnNumber()
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
this.multiSortChange.emit([...this.activeSorts()]);
|
|
108
|
+
this.updateIconStyles();
|
|
109
|
+
}
|
|
110
|
+
updateIconStyles() {
|
|
111
|
+
console.log("Col", this.column()?.data);
|
|
112
|
+
if (this.multiColumnSort()) {
|
|
113
|
+
this.updateMultiColumnIconStyles();
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.updateSingleColumnIconStyles();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
updateSingleColumnIconStyles() {
|
|
120
|
+
const isActiveColumn = this.activeSort()?.column === this.column()?.data;
|
|
121
|
+
setTimeout(() => {
|
|
122
|
+
this.renderer?.setStyle(this.upIcon, 'opacity', isActiveColumn && this.currentDirection() === 'ASC' ? '1' : '0.5');
|
|
123
|
+
this.renderer?.setStyle(this.downIcon, 'opacity', isActiveColumn && this.currentDirection() === 'DESC' ? '1' : '0.5');
|
|
124
|
+
}, 0);
|
|
125
|
+
}
|
|
126
|
+
updateMultiColumnIconStyles() {
|
|
127
|
+
const columnSort = this.activeSorts().find(sort => sort.column === this.column()?.data);
|
|
128
|
+
setTimeout(() => {
|
|
129
|
+
this.renderer?.setStyle(this.upIcon, 'opacity', columnSort?.direction === 'ASC' ? '1' : '0.5');
|
|
130
|
+
this.renderer?.setStyle(this.downIcon, 'opacity', columnSort?.direction === 'DESC' ? '1' : '0.5');
|
|
131
|
+
if (this.sortOrderElement) {
|
|
132
|
+
const sortIndex = this.activeSorts().findIndex(sort => sort.column === this.column()?.data);
|
|
133
|
+
if (sortIndex !== -1) {
|
|
134
|
+
this.renderer?.setProperty(this.sortOrderElement, 'textContent', (sortIndex + 1).toString());
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.renderer?.setProperty(this.sortOrderElement, 'textContent', '');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}, 0);
|
|
141
|
+
}
|
|
142
|
+
static { this.ɵfac = function SortIconsDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SortIconsDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.Renderer2)); }; }
|
|
143
|
+
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: SortIconsDirective, selectors: [["", "appSortIcons", ""]], inputs: { column: [1, "column"], activeSort: [1, "activeSort"], activeSorts: [1, "activeSorts"], multiColumnSort: [1, "multiColumnSort"] }, outputs: { sortChange: "sortChange", multiSortChange: "multiSortChange" }, features: [i0.ɵɵNgOnChangesFeature] }); }
|
|
144
|
+
}
|
|
145
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SortIconsDirective, [{
|
|
146
|
+
type: Directive,
|
|
147
|
+
args: [{
|
|
148
|
+
selector: '[appSortIcons]',
|
|
149
|
+
}]
|
|
150
|
+
}], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], null); })();
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1pY29ucy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9taXMtY29tcG9uZW50cy90YWJsZS9zb3J0LWljb25zLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQVNULEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOztBQWlCdkIsTUFBTSxPQUFPLGtCQUFrQjtJQW9CN0IsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbkIvRCw0QkFBNEI7UUFDNUIsV0FBTSxHQUFHLEtBQUssRUFBYyxDQUFDO1FBQzdCLGVBQVUsR0FBRyxLQUFLLEVBQWEsQ0FBQztRQUNoQyxnQkFBVyxHQUFHLEtBQUssRUFBZSxDQUFDO1FBQ25DLG9CQUFlLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXhDLDJCQUEyQjtRQUMzQixlQUFVLEdBQUcsTUFBTSxFQUFhLENBQUM7UUFDakMsb0JBQWUsR0FBRyxNQUFNLEVBQWUsQ0FBQztRQUV4Qyw0QkFBNEI7UUFDNUIscUJBQWdCLEdBQUcsTUFBTSxDQUFzQixFQUFFLENBQUMsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztJQU95QixDQUFDO0lBRW5FLFFBQVE7UUFFTiwrQ0FBK0M7UUFDL0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELG1DQUFtQztR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Q0FDL0MsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO21IQTlLVSxrQkFBa0I7b0VBQWxCLGtCQUFrQjs7aUZBQWxCLGtCQUFrQjtjQUg5QixTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjthQUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRTdGF0ZSB7XG4gIGNvbHVtbjogc3RyaW5nO1xuICBkaXJlY3Rpb246ICdBU0MnIHwgJ0RFU0MnIHwgJyc7XG4gIGNvbHVtbk51bWJlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3J0Q29sdW1uIHtcbiAgZGF0YTogc3RyaW5nO1xuICBzb3J0QXNjSWNvbj86IHN0cmluZztcbiAgc29ydERlc2NJY29uPzogc3RyaW5nO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYXBwU29ydEljb25zXScsXG59KVxuZXhwb3J0IGNsYXNzIFNvcnRJY29uc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLy8gQ29udmVydCBpbnB1dHMgdG8gc2lnbmFsc1xuICBjb2x1bW4gPSBpbnB1dDxTb3J0Q29sdW1uPigpO1xuICBhY3RpdmVTb3J0ID0gaW5wdXQ8U29ydFN0YXRlPigpO1xuICBhY3RpdmVTb3J0cyA9IGlucHV0PFNvcnRTdGF0ZVtdPigpO1xuICBtdWx0aUNvbHVtblNvcnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIFxuICAvLyBDb252ZXJ0IG91dHB1dCB0byBzaWduYWxcbiAgc29ydENoYW5nZSA9IG91dHB1dDxTb3J0U3RhdGU+KCk7XG4gIG11bHRpU29ydENoYW5nZSA9IG91dHB1dDxTb3J0U3RhdGVbXT4oKTtcblxuICAvLyBJbnRlcm5hbCBzdGF0ZSBhcyBzaWduYWxzXG4gIGN1cnJlbnREaXJlY3Rpb24gPSBzaWduYWw8J0FTQycgfCAnREVTQycgfCAnJz4oJycpO1xuICBwcml2YXRlIGNvbHVtbk51bWJlciA9IHNpZ25hbDxudW1iZXI+KDApO1xuXG4gIC8vIEFzc2V0c1xuICBwcml2YXRlIHVwSWNvbiE6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gIHByaXZhdGUgZG93bkljb24hOiBIVE1MSW1hZ2VFbGVtZW50O1xuICBwcml2YXRlIHNvcnRPcmRlckVsZW1lbnQ/OiBIVE1MU3BhbkVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIFxuICAgIC8vIEdldCBjb2x1bW4gbnVtYmVyIGZyb20gZGF0YS1jb2x1bW4gYXR0cmlidXRlXG4gICAgY29uc3QgY29sdW1uQXR0ciA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29sdW1uJyk7XG4gICAgaWYgKGNvbHVtbkF0dHIpIHtcbiAgICAgIHRoaXMuY29sdW1uTnVtYmVyLnNldChwYXJzZUludChjb2x1bW5BdHRyLCAxMCkpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lciBmb3IgdGhlIGljb25zXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJlbmRlcmVyPy5zZXRTdHlsZShjb250YWluZXIsICdkaXNwbGF5JywgJ2lubGluZS1mbGV4Jyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoY29udGFpbmVyLCAnYWxpZ24taXRlbXMnLCAnY2VudGVyJyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoY29udGFpbmVyLCAnZ2FwJywgJzAuNXJlbScpO1xuXG4gICAgY29uc3QgaWNvbkNvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoaWNvbkNvbnRhaW5lciwgJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTtcbiAgICB0aGlzLnJlbmRlcmVyPy5zZXRTdHlsZShpY29uQ29udGFpbmVyLCAnZmxleC1kaXJlY3Rpb24nLCAnY29sdW1uJyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoaWNvbkNvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKGljb25Db250YWluZXIsICdnYXAnLCAnNXB4Jyk7XG5cbiAgICB0aGlzLnVwSWNvbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0QXR0cmlidXRlKHRoaXMudXBJY29uLCAnc3JjJywgdGhpcy5jb2x1bW4oKT8uc29ydEFzY0ljb24pO1xuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMudXBJY29uLCAnb3BhY2l0eScsICcwLjUnKTtcbiAgICB0aGlzLnJlbmRlcmVyPy5zZXRTdHlsZSh0aGlzLnVwSWNvbiwgJ3RyYW5zaXRpb24nLCAnb3BhY2l0eSAwLjNzIGVhc2UnKTtcbiAgICB0aGlzLnJlbmRlcmVyPy5zZXRTdHlsZSh0aGlzLnVwSWNvbiwgJ3dpZHRoJywgJzlweCcpO1xuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMudXBJY29uLCAnY3Vyc29yJywgJ3BvaW50ZXInKTtcbiAgICB0aGlzLnJlbmRlcmVyPy5saXN0ZW4odGhpcy51cEljb24sICdjbGljaycsICgpID0+IHRoaXMuc2V0U29ydERpcmVjdGlvbignQVNDJykpO1xuXG4gICAgdGhpcy5kb3duSWNvbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0QXR0cmlidXRlKHRoaXMuZG93bkljb24sICdzcmMnLCB0aGlzLmNvbHVtbigpPy5zb3J0RGVzY0ljb24pO1xuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMuZG93bkljb24sICdvcGFjaXR5JywgJzAuNScpO1xuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMuZG93bkljb24sICd0cmFuc2l0aW9uJywgJ29wYWNpdHkgMC4zcyBlYXNlJyk7XG4gICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUodGhpcy5kb3duSWNvbiwgJ3dpZHRoJywgJzlweCcpO1xuICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMuZG93bkljb24sICdjdXJzb3InLCAncG9pbnRlcicpO1xuICAgIHRoaXMucmVuZGVyZXI/Lmxpc3Rlbih0aGlzLmRvd25JY29uLCAnY2xpY2snLCAoKSA9PiB0aGlzLnNldFNvcnREaXJlY3Rpb24oJ0RFU0MnKSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyPy5hcHBlbmRDaGlsZChpY29uQ29udGFpbmVyLCB0aGlzLnVwSWNvbik7XG4gICAgdGhpcy5yZW5kZXJlcj8uYXBwZW5kQ2hpbGQoaWNvbkNvbnRhaW5lciwgdGhpcy5kb3duSWNvbik7XG4gICAgdGhpcy5yZW5kZXJlcj8uYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBpY29uQ29udGFpbmVyKTtcblxuICAgIGlmICh0aGlzLm11bHRpQ29sdW1uU29ydCgpKSB7XG4gICAgICB0aGlzLnNvcnRPcmRlckVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKHRoaXMuc29ydE9yZGVyRWxlbWVudCwgJ2ZvbnQtc2l6ZScsICcxMnB4Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyPy5zZXRTdHlsZSh0aGlzLnNvcnRPcmRlckVsZW1lbnQsICdmb250LXdlaWdodCcsICdib2xkJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyPy5zZXRTdHlsZSh0aGlzLnNvcnRPcmRlckVsZW1lbnQsICdjb2xvcicsICcjMDAwJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyPy5hcHBlbmRDaGlsZChjb250YWluZXIsIHRoaXMuc29ydE9yZGVyRWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlcj8uYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBjb250YWluZXIpO1xuICAgIHRoaXMudXBkYXRlSWNvblN0eWxlcygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydhY3RpdmVTb3J0J10gfHwgY2hhbmdlc1snYWN0aXZlU29ydHMnXSkge1xuICAgICAgdGhpcy51cGRhdGVJY29uU3R5bGVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTb3J0RGlyZWN0aW9uKGRpcmVjdGlvbjogJ0FTQycgfCAnREVTQycpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aUNvbHVtblNvcnQoKSkge1xuICAgICAgdGhpcy5oYW5kbGVNdWx0aUNvbHVtblNvcnQoZGlyZWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVTaW5nbGVDb2x1bW5Tb3J0KGRpcmVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTaW5nbGVDb2x1bW5Tb3J0KGRpcmVjdGlvbjogJ0FTQycgfCAnREVTQycpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50RGlyZWN0aW9uKCkgPT09IGRpcmVjdGlvbikge1xuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uLnNldCgnJyk7IC8vIFJlc2V0IHNvcnRpbmcgaWYgdGhlIHNhbWUgZGlyZWN0aW9uIGlzIGNsaWNrZWRcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uLnNldChkaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgXG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uKCk/LmRhdGEgfHwgJycsIFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnREaXJlY3Rpb24oKSxcbiAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIoKVxuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlSWNvblN0eWxlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNdWx0aUNvbHVtblNvcnQoZGlyZWN0aW9uOiAnQVNDJyB8ICdERVNDJyk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nU29ydEluZGV4ID0gdGhpcy5hY3RpdmVTb3J0cygpLmZpbmRJbmRleChzb3J0ID0+IHNvcnQuY29sdW1uID09PSB0aGlzLmNvbHVtbigpPy5kYXRhKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdTb3J0SW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVTb3J0cygpW2V4aXN0aW5nU29ydEluZGV4XS5kaXJlY3Rpb24gIT09IGRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLmFjdGl2ZVNvcnRzKClbZXhpc3RpbmdTb3J0SW5kZXhdLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgdGhpcy5hY3RpdmVTb3J0cygpW2V4aXN0aW5nU29ydEluZGV4XS5jb2x1bW5OdW1iZXIgPSB0aGlzLmNvbHVtbk51bWJlcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVNvcnRzKCkucHVzaCh7IFxuICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uKCk/LmRhdGEgfHwgJycsIFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIoKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubXVsdGlTb3J0Q2hhbmdlLmVtaXQoWy4uLnRoaXMuYWN0aXZlU29ydHMoKV0pO1xuICAgIHRoaXMudXBkYXRlSWNvblN0eWxlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJY29uU3R5bGVzKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiQ29sXCIsdGhpcy5jb2x1bW4oKT8uZGF0YSlcbiAgICBpZiAodGhpcy5tdWx0aUNvbHVtblNvcnQoKSkge1xuICAgICAgdGhpcy51cGRhdGVNdWx0aUNvbHVtbkljb25TdHlsZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTaW5nbGVDb2x1bW5JY29uU3R5bGVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTaW5nbGVDb2x1bW5JY29uU3R5bGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGlzQWN0aXZlQ29sdW1uID0gdGhpcy5hY3RpdmVTb3J0KCk/LmNvbHVtbiA9PT0gdGhpcy5jb2x1bW4oKT8uZGF0YTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoXG4gICAgICAgIHRoaXMudXBJY29uLFxuICAgICAgICAnb3BhY2l0eScsXG4gICAgICAgIGlzQWN0aXZlQ29sdW1uICYmIHRoaXMuY3VycmVudERpcmVjdGlvbigpID09PSAnQVNDJyA/ICcxJyA6ICcwLjUnXG4gICAgICApO1xuICAgICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoXG4gICAgICAgIHRoaXMuZG93bkljb24sXG4gICAgICAgICdvcGFjaXR5JyxcbiAgICAgICAgaXNBY3RpdmVDb2x1bW4gJiYgdGhpcy5jdXJyZW50RGlyZWN0aW9uKCkgPT09ICdERVNDJyA/ICcxJyA6ICcwLjUnXG4gICAgICApO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNdWx0aUNvbHVtbkljb25TdHlsZXMoKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uU29ydCA9IHRoaXMuYWN0aXZlU29ydHMoKS5maW5kKHNvcnQgPT4gc29ydC5jb2x1bW4gPT09IHRoaXMuY29sdW1uKCk/LmRhdGEpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlcj8uc2V0U3R5bGUoXG4gICAgICAgIHRoaXMudXBJY29uLFxuICAgICAgICAnb3BhY2l0eScsXG4gICAgICAgIGNvbHVtblNvcnQ/LmRpcmVjdGlvbiA9PT0gJ0FTQycgPyAnMScgOiAnMC41J1xuICAgICAgKTtcbiAgICAgIHRoaXMucmVuZGVyZXI/LnNldFN0eWxlKFxuICAgICAgICB0aGlzLmRvd25JY29uLFxuICAgICAgICAnb3BhY2l0eScsXG4gICAgICAgIGNvbHVtblNvcnQ/LmRpcmVjdGlvbiA9PT0gJ0RFU0MnID8gJzEnIDogJzAuNSdcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLnNvcnRPcmRlckVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc29ydEluZGV4ID0gdGhpcy5hY3RpdmVTb3J0cygpLmZpbmRJbmRleChzb3J0ID0+IHNvcnQuY29sdW1uID09PSB0aGlzLmNvbHVtbigpPy5kYXRhKTtcbiAgICAgICAgaWYgKHNvcnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyPy5zZXRQcm9wZXJ0eSh0aGlzLnNvcnRPcmRlckVsZW1lbnQsICd0ZXh0Q29udGVudCcsIChzb3J0SW5kZXggKyAxKS50b1N0cmluZygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyPy5zZXRQcm9wZXJ0eSh0aGlzLnNvcnRPcmRlckVsZW1lbnQsICd0ZXh0Q29udGVudCcsICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG59Il19
|