pdm-ui-kit 0.1.50 → 0.2.0
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/README.md +189 -2
- package/esm2020/lib/components/alert-dialog/alert-dialog.component.mjs +3 -3
- package/esm2020/lib/components/breadcrumb/breadcrumb.component.mjs +37 -4
- package/esm2020/lib/components/calendar/calendar.component.mjs +3 -3
- package/esm2020/lib/components/card/card.component.mjs +36 -53
- package/esm2020/lib/components/command/command.component.mjs +3 -3
- package/esm2020/lib/components/context-menu/context-menu.component.mjs +3 -3
- package/esm2020/lib/components/data-table/data-table.component.mjs +214 -16
- package/esm2020/lib/components/dialog/dialog.component.mjs +133 -17
- package/esm2020/lib/components/draggable-table/draggable-table.component.mjs +300 -0
- package/esm2020/lib/components/drawer/drawer.component.mjs +123 -16
- package/esm2020/lib/components/dropdown-menu/dropdown-menu.component.mjs +3 -2
- package/esm2020/lib/components/hover-card/hover-card.component.mjs +3 -3
- package/esm2020/lib/components/menubar/menubar.component.mjs +3 -3
- package/esm2020/lib/components/navigation-menu/navigation-menu.component.mjs +25 -3
- package/esm2020/lib/components/pagination/pagination.component.mjs +3 -3
- package/esm2020/lib/components/popover/popover.component.mjs +5 -3
- package/esm2020/lib/components/select/select.component.mjs +5 -3
- package/esm2020/lib/components/sheet/sheet.component.mjs +68 -12
- package/esm2020/lib/components/sidebar/sidebar.component.mjs +52 -5
- package/esm2020/lib/components/table/table.component.mjs +152 -188
- package/esm2020/lib/components/tabs/tabs.component.mjs +3 -3
- package/esm2020/lib/components/tooltip/tooltip.component.mjs +3 -3
- package/esm2020/lib/pdm-ui-kit.module.mjs +5 -1
- package/esm2020/lib/utils/responsive.mjs +143 -0
- package/esm2020/lib/utils/z-index.mjs +93 -0
- package/esm2020/public-api.mjs +4 -1
- package/fesm2015/pdm-ui-kit.mjs +1430 -371
- package/fesm2015/pdm-ui-kit.mjs.map +1 -1
- package/fesm2020/pdm-ui-kit.mjs +1428 -369
- package/fesm2020/pdm-ui-kit.mjs.map +1 -1
- package/lib/components/breadcrumb/breadcrumb.component.d.ts +23 -1
- package/lib/components/card/card.component.d.ts +32 -19
- package/lib/components/data-table/data-table.component.d.ts +172 -14
- package/lib/components/dialog/dialog.component.d.ts +35 -1
- package/lib/components/draggable-table/draggable-table.component.d.ts +74 -0
- package/lib/components/drawer/drawer.component.d.ts +65 -7
- package/lib/components/navigation-menu/navigation-menu.component.d.ts +22 -1
- package/lib/components/sheet/sheet.component.d.ts +30 -3
- package/lib/components/sidebar/sidebar.component.d.ts +39 -1
- package/lib/components/table/table.component.d.ts +46 -25
- package/lib/pdm-ui-kit.module.d.ts +42 -41
- package/lib/utils/responsive.d.ts +107 -0
- package/lib/utils/z-index.d.ts +73 -0
- package/package.json +5 -3
- package/public-api.d.ts +3 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
/**
|
|
5
|
+
* Tabla con funcionalidad de reordenamiento de filas mediante drag & drop
|
|
6
|
+
*
|
|
7
|
+
* Extiende pdm-table agregando la capacidad de reordenar filas.
|
|
8
|
+
* Si no necesitás drag & drop, usá pdm-table directamente (más simple y liviano).
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* <pdm-draggable-table
|
|
12
|
+
* variant="interactive"
|
|
13
|
+
* [reorderRows]="true"
|
|
14
|
+
* (rowOrderChange)="onOrderChange($event)">
|
|
15
|
+
* <tbody>
|
|
16
|
+
* <tr data-row-id="1"><td>Row 1</td></tr>
|
|
17
|
+
* <tr data-row-id="2"><td>Row 2</td></tr>
|
|
18
|
+
* </tbody>
|
|
19
|
+
* </pdm-draggable-table>
|
|
20
|
+
*
|
|
21
|
+
* IMPORTANTE: Cada <tr> debe tener un atributo data-row-id único
|
|
22
|
+
*/
|
|
23
|
+
export class PdmDraggableTableComponent {
|
|
24
|
+
constructor(renderer) {
|
|
25
|
+
this.renderer = renderer;
|
|
26
|
+
this.variant = 'default';
|
|
27
|
+
this.responsiveStrategy = 'scroll';
|
|
28
|
+
this.className = '';
|
|
29
|
+
this.fullBleed = false;
|
|
30
|
+
/**
|
|
31
|
+
* Habilita el reordenamiento de filas mediante drag & drop
|
|
32
|
+
*/
|
|
33
|
+
this.reorderRows = false;
|
|
34
|
+
/**
|
|
35
|
+
* Selector CSS para identificar los handles de drag
|
|
36
|
+
* Por defecto busca: [data-drag-handle], [data-slot=row-drag-handle], .row-drag-handle
|
|
37
|
+
* Si no encuentra ninguno, inserta un handle automático
|
|
38
|
+
*/
|
|
39
|
+
this.dragHandleSelector = '[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle,[data-auto-drag-handle]';
|
|
40
|
+
/**
|
|
41
|
+
* Emite el nuevo orden de las filas cuando el usuario termina de arrastrar
|
|
42
|
+
* Array de data-row-id en el nuevo orden
|
|
43
|
+
*/
|
|
44
|
+
this.rowOrderChange = new EventEmitter();
|
|
45
|
+
this.cleanupListeners = [];
|
|
46
|
+
this.draggedRow = null;
|
|
47
|
+
}
|
|
48
|
+
ngAfterViewInit() {
|
|
49
|
+
this.syncReorderBehavior();
|
|
50
|
+
}
|
|
51
|
+
// Getters para clases CSS (mismo comportamiento que pdm-table)
|
|
52
|
+
get wrapperClasses() {
|
|
53
|
+
const baseClasses = ['relative', 'w-full'];
|
|
54
|
+
const strategyClasses = this.getResponsiveStrategyClasses();
|
|
55
|
+
const variantClasses = this.getVariantWrapperClasses();
|
|
56
|
+
if (this.fullBleed && this.responsiveStrategy === 'scroll') {
|
|
57
|
+
baseClasses.push('-mx-4', 'px-4', 'sm:mx-0', 'sm:px-0');
|
|
58
|
+
}
|
|
59
|
+
return [
|
|
60
|
+
...baseClasses,
|
|
61
|
+
...strategyClasses,
|
|
62
|
+
...variantClasses,
|
|
63
|
+
this.className
|
|
64
|
+
].filter(Boolean);
|
|
65
|
+
}
|
|
66
|
+
get tableClasses() {
|
|
67
|
+
const baseClasses = ['w-full', 'caption-bottom', 'text-sm'];
|
|
68
|
+
const variantClasses = this.getVariantTableClasses();
|
|
69
|
+
const cellClasses = this.getCellClasses();
|
|
70
|
+
return [...baseClasses, ...variantClasses, ...cellClasses].filter(Boolean);
|
|
71
|
+
}
|
|
72
|
+
getResponsiveStrategyClasses() {
|
|
73
|
+
if (this.responsiveStrategy === 'scroll' || this.responsiveStrategy === 'wrap' || this.responsiveStrategy === 'collapse') {
|
|
74
|
+
return ['overflow-x-auto'];
|
|
75
|
+
}
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
getVariantWrapperClasses() {
|
|
79
|
+
if (this.variant === 'interactive') {
|
|
80
|
+
return ['rounded-xl', 'border', 'border-border', 'bg-background'];
|
|
81
|
+
}
|
|
82
|
+
if (this.variant === 'data') {
|
|
83
|
+
return ['rounded-md', 'border', 'border-border', 'bg-background'];
|
|
84
|
+
}
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
getVariantTableClasses() {
|
|
88
|
+
if (this.variant === 'data') {
|
|
89
|
+
return [
|
|
90
|
+
'border-collapse', 'text-foreground',
|
|
91
|
+
'[&_thead_tr]:border-b', '[&_thead_tr]:border-border',
|
|
92
|
+
'[&_tbody_tr]:border-b', '[&_tbody_tr]:border-border',
|
|
93
|
+
'[&_tbody_tr:last-child]:border-b-0',
|
|
94
|
+
'[&_th]:h-10', '[&_th]:px-2', '[&_th]:text-left', '[&_th]:align-middle', '[&_th]:font-medium',
|
|
95
|
+
'[&_td]:p-2', '[&_td]:align-middle'
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
if (this.variant === 'interactive') {
|
|
99
|
+
return [
|
|
100
|
+
'text-foreground',
|
|
101
|
+
'[&_thead]:sticky', '[&_thead]:top-0', '[&_thead]:z-10', '[&_thead]:bg-muted/70',
|
|
102
|
+
'[&_thead_tr]:border-b', '[&_thead_tr]:border-border',
|
|
103
|
+
'[&_th]:h-12', '[&_th]:px-4', '[&_th]:text-left', '[&_th]:align-middle', '[&_th]:text-sm', '[&_th]:font-medium',
|
|
104
|
+
'[&_tbody_tr]:border-b', '[&_tbody_tr]:border-border',
|
|
105
|
+
'[&_tbody_tr]:transition-colors', '[&_tbody_tr:hover]:bg-muted/50',
|
|
106
|
+
'[&_tbody_tr:last-child]:border-b-0',
|
|
107
|
+
'[&_td]:h-14', '[&_td]:px-4', '[&_td]:align-middle', '[&_td]:text-sm',
|
|
108
|
+
'[&_svg]:text-muted-foreground'
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
getCellClasses() {
|
|
114
|
+
if (this.responsiveStrategy === 'scroll') {
|
|
115
|
+
return ['[&_td]:whitespace-normal', '[&_th]:whitespace-normal', 'sm:[&_td]:whitespace-nowrap', 'sm:[&_th]:whitespace-nowrap'];
|
|
116
|
+
}
|
|
117
|
+
if (this.responsiveStrategy === 'wrap') {
|
|
118
|
+
return ['[&_td]:whitespace-normal', '[&_td]:break-words', '[&_th]:whitespace-normal'];
|
|
119
|
+
}
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
ngOnChanges(changes) {
|
|
123
|
+
if (changes['reorderRows'] || changes['variant']) {
|
|
124
|
+
this.syncReorderBehavior();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
ngOnDestroy() {
|
|
128
|
+
this.cleanupReorderBehavior();
|
|
129
|
+
}
|
|
130
|
+
syncReorderBehavior() {
|
|
131
|
+
this.cleanupReorderBehavior();
|
|
132
|
+
if (!this.reorderRows) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const tbody = this.getTbody();
|
|
136
|
+
if (!tbody) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.setRowsDraggable(tbody, true);
|
|
140
|
+
this.cleanupListeners.push(this.renderer.listen(tbody, 'mousedown', (event) => this.armDragFromHandle(event)), this.renderer.listen(tbody, 'dragstart', (event) => this.onDragStart(event)), this.renderer.listen(tbody, 'dragover', (event) => this.onDragOver(event, tbody)), this.renderer.listen(tbody, 'drop', (event) => this.onDrop(event)), this.renderer.listen(tbody, 'dragend', () => this.onDragEnd()));
|
|
141
|
+
// Observer para detectar cambios en el DOM (filas agregadas/removidas)
|
|
142
|
+
this.observer = new MutationObserver(() => this.setRowsDraggable(tbody, true));
|
|
143
|
+
this.observer.observe(tbody, { childList: true });
|
|
144
|
+
}
|
|
145
|
+
cleanupReorderBehavior() {
|
|
146
|
+
this.cleanupListeners.forEach((dispose) => dispose());
|
|
147
|
+
this.cleanupListeners = [];
|
|
148
|
+
if (this.observer) {
|
|
149
|
+
this.observer.disconnect();
|
|
150
|
+
this.observer = undefined;
|
|
151
|
+
}
|
|
152
|
+
const tbody = this.getTbody();
|
|
153
|
+
if (tbody) {
|
|
154
|
+
this.setRowsDraggable(tbody, false);
|
|
155
|
+
}
|
|
156
|
+
this.draggedRow = null;
|
|
157
|
+
}
|
|
158
|
+
getTbody() {
|
|
159
|
+
return this.tableElement?.nativeElement.tBodies.item(0) ?? null;
|
|
160
|
+
}
|
|
161
|
+
setRowsDraggable(tbody, enabled) {
|
|
162
|
+
const rows = Array.from(tbody.rows);
|
|
163
|
+
rows.forEach((row) => {
|
|
164
|
+
this.syncAutoDragHandle(row, enabled);
|
|
165
|
+
row.draggable = false;
|
|
166
|
+
if (!enabled) {
|
|
167
|
+
delete row.dataset['dragging'];
|
|
168
|
+
delete row.dataset['dragArmed'];
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Inserta un handle de drag automático si no existe uno custom
|
|
174
|
+
*/
|
|
175
|
+
syncAutoDragHandle(row, enabled) {
|
|
176
|
+
const firstCell = row.cells.item(0);
|
|
177
|
+
if (!firstCell) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const existingAutoHandle = firstCell.querySelector('[data-auto-drag-handle]');
|
|
181
|
+
if (!enabled) {
|
|
182
|
+
existingAutoHandle?.remove();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const hasCustomHandle = !!firstCell.querySelector('[data-drag-handle],[data-slot=row-drag-handle],.row-drag-handle');
|
|
186
|
+
if (hasCustomHandle || existingAutoHandle) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Crear handle automático
|
|
190
|
+
const button = this.renderer.createElement('button');
|
|
191
|
+
this.renderer.setAttribute(button, 'type', 'button');
|
|
192
|
+
this.renderer.setAttribute(button, 'aria-label', 'Drag row');
|
|
193
|
+
this.renderer.setAttribute(button, 'data-auto-drag-handle', 'true');
|
|
194
|
+
this.renderer.addClass(button, 'inline-flex');
|
|
195
|
+
this.renderer.addClass(button, 'h-7');
|
|
196
|
+
this.renderer.addClass(button, 'w-7');
|
|
197
|
+
this.renderer.addClass(button, 'items-center');
|
|
198
|
+
this.renderer.addClass(button, 'justify-center');
|
|
199
|
+
this.renderer.addClass(button, 'cursor-grab');
|
|
200
|
+
this.renderer.addClass(button, 'active:cursor-grabbing');
|
|
201
|
+
this.renderer.addClass(button, 'text-muted-foreground');
|
|
202
|
+
const dots = this.renderer.createElement('span');
|
|
203
|
+
this.renderer.addClass(dots, 'text-sm');
|
|
204
|
+
this.renderer.addClass(dots, 'leading-none');
|
|
205
|
+
this.renderer.setProperty(dots, 'textContent', '⋮⋮');
|
|
206
|
+
this.renderer.appendChild(button, dots);
|
|
207
|
+
this.renderer.insertBefore(firstCell, button, firstCell.firstChild);
|
|
208
|
+
}
|
|
209
|
+
onDragStart(event) {
|
|
210
|
+
const target = event.target;
|
|
211
|
+
const row = target?.closest('tr');
|
|
212
|
+
if (!row) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const handle = target?.closest(this.dragHandleSelector);
|
|
216
|
+
const isArmed = row.dataset['dragArmed'] === 'true';
|
|
217
|
+
if ((!handle || !row.contains(handle)) && !isArmed) {
|
|
218
|
+
event.preventDefault();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
this.draggedRow = row;
|
|
222
|
+
this.draggedRow.dataset['dragging'] = 'true';
|
|
223
|
+
if (event.dataTransfer) {
|
|
224
|
+
event.dataTransfer.effectAllowed = 'move';
|
|
225
|
+
event.dataTransfer.setData('text/plain', '');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
onDragOver(event, tbody) {
|
|
229
|
+
if (!this.draggedRow) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
event.preventDefault();
|
|
233
|
+
const target = event.target;
|
|
234
|
+
const targetRow = target?.closest('tr');
|
|
235
|
+
if (!targetRow || targetRow === this.draggedRow) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const rect = targetRow.getBoundingClientRect();
|
|
239
|
+
const shouldInsertBefore = event.clientY < rect.top + rect.height / 2;
|
|
240
|
+
tbody.insertBefore(this.draggedRow, shouldInsertBefore ? targetRow : targetRow.nextSibling);
|
|
241
|
+
}
|
|
242
|
+
onDrop(event) {
|
|
243
|
+
event.preventDefault();
|
|
244
|
+
}
|
|
245
|
+
onDragEnd() {
|
|
246
|
+
const tbody = this.getTbody();
|
|
247
|
+
if (tbody) {
|
|
248
|
+
Array.from(tbody.rows).forEach((row) => {
|
|
249
|
+
row.draggable = false;
|
|
250
|
+
delete row.dataset['dragArmed'];
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
if (this.draggedRow) {
|
|
254
|
+
delete this.draggedRow.dataset['dragging'];
|
|
255
|
+
this.draggedRow = null;
|
|
256
|
+
}
|
|
257
|
+
if (!tbody) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const order = Array.from(tbody.rows).map((row, index) => row.getAttribute('data-row-id') || String(index));
|
|
261
|
+
this.rowOrderChange.emit(order);
|
|
262
|
+
}
|
|
263
|
+
armDragFromHandle(event) {
|
|
264
|
+
const target = event.target;
|
|
265
|
+
const handle = target?.closest(this.dragHandleSelector);
|
|
266
|
+
if (!handle) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const row = handle.closest('tr');
|
|
270
|
+
if (!row) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
row.draggable = true;
|
|
274
|
+
row.dataset['dragArmed'] = 'true';
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
PdmDraggableTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDraggableTableComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
278
|
+
PdmDraggableTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PdmDraggableTableComponent, selector: "pdm-draggable-table", inputs: { variant: "variant", responsiveStrategy: "responsiveStrategy", className: "className", fullBleed: "fullBleed", reorderRows: "reorderRows", dragHandleSelector: "dragHandleSelector" }, outputs: { rowOrderChange: "rowOrderChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["tableElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
279
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PdmDraggableTableComponent, decorators: [{
|
|
280
|
+
type: Component,
|
|
281
|
+
args: [{ selector: 'pdm-draggable-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"wrapperClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table-container' : null\">\n <table #tableElement [ngClass]=\"tableClasses\" [attr.data-slot]=\"variant === 'interactive' ? 'table' : null\">\n <ng-content></ng-content>\n </table>\n</div>\n" }]
|
|
282
|
+
}], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { variant: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], responsiveStrategy: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], className: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], fullBleed: [{
|
|
289
|
+
type: Input
|
|
290
|
+
}], reorderRows: [{
|
|
291
|
+
type: Input
|
|
292
|
+
}], dragHandleSelector: [{
|
|
293
|
+
type: Input
|
|
294
|
+
}], rowOrderChange: [{
|
|
295
|
+
type: Output
|
|
296
|
+
}], tableElement: [{
|
|
297
|
+
type: ViewChild,
|
|
298
|
+
args: ['tableElement']
|
|
299
|
+
}] } });
|
|
300
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kcmFnZ2FibGUtdGFibGUvZHJhZ2dhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kcmFnZ2FibGUtdGFibGUvZHJhZ2dhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQzs7O0FBSXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFNSCxNQUFNLE9BQU8sMEJBQTBCO0lBOEJyQyxZQUE2QixRQUFtQjtRQUFuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBN0J2QyxZQUFPLEdBQW9CLFNBQVMsQ0FBQztRQUNyQyx1QkFBa0IsR0FBNEIsUUFBUSxDQUFDO1FBQ3ZELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFN0I7Ozs7V0FJRztRQUNNLHVCQUFrQixHQUFHLHlGQUF5RixDQUFDO1FBRXhIOzs7V0FHRztRQUNPLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUloRCxxQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBRXpDLGVBQVUsR0FBK0IsSUFBSSxDQUFDO0lBRUgsQ0FBQztJQUVwRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7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QTBCLDZhQ3pDdkMsdVJBS0E7MkZEb0NhLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDRSxxQkFBcUIsbUJBRWQsdUJBQXVCLENBQUMsTUFBTTtnR0FHdEMsT0FBTztzQkFBZixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFPRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBTUksY0FBYztzQkFBdkIsTUFBTTtnQkFFb0IsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQZG1UYWJsZVZhcmlhbnQgfSBmcm9tICcuLi90YWJsZS90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFibGVSZXNwb25zaXZlU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi91dGlscy9yZXNwb25zaXZlJztcblxuLyoqXG4gKiBUYWJsYSBjb24gZnVuY2lvbmFsaWRhZCBkZSByZW9yZGVuYW1pZW50byBkZSBmaWxhcyBtZWRpYW50ZSBkcmFnICYgZHJvcFxuICogXG4gKiBFeHRpZW5kZSBwZG0tdGFibGUgYWdyZWdhbmRvIGxhIGNhcGFjaWRhZCBkZSByZW9yZGVuYXIgZmlsYXMuXG4gKiBTaSBubyBuZWNlc2l0w6FzIGRyYWcgJiBkcm9wLCB1c8OhIHBkbS10YWJsZSBkaXJlY3RhbWVudGUgKG3DoXMgc2ltcGxlIHkgbGl2aWFubykuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiA8cGRtLWRyYWdnYWJsZS10YWJsZSBcbiAqICAgdmFyaWFudD1cImludGVyYWN0aXZlXCJcbiAqICAgW3Jlb3JkZXJSb3dzXT1cInRydWVcIlxuICogICAocm93T3JkZXJDaGFuZ2UpPVwib25PcmRlckNoYW5nZSgkZXZlbnQpXCI+XG4gKiAgIDx0Ym9keT5cbiAqICAgICA8dHIgZGF0YS1yb3ctaWQ9XCIxXCI+PHRkPlJvdyAxPC90ZD48L3RyPlxuICogICAgIDx0ciBkYXRhLXJvdy1pZD1cIjJcIj48dGQ+Um93IDI8L3RkPjwvdHI+XG4gKiAgIDwvdGJvZHk+XG4gKiA8L3BkbS1kcmFnZ2FibGUtdGFibGU+XG4gKiBcbiAqIElNUE9SVEFOVEU6IENhZGEgPHRyPiBkZWJlIHRlbmVyIHVuIGF0cmlidXRvIGRhdGEtcm93LWlkIMO6bmljb1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwZG0tZHJhZ2dhYmxlLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RyYWdnYWJsZS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBkbURyYWdnYWJsZVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB2YXJpYW50OiBQZG1UYWJsZVZhcmlhbnQgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIHJlc3BvbnNpdmVTdHJhdGVneTogVGFibGVSZXNwb25zaXZlU3RyYXRlZ3kgPSAnc2Nyb2xsJztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpIGZ1bGxCbGVlZCA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIEhhYmlsaXRhIGVsIHJlb3JkZW5hbWllbnRvIGRlIGZpbGFzIG1lZGlhbnRlIGRyYWcgJiBkcm9wXG4gICAqL1xuICBASW5wdXQoKSByZW9yZGVyUm93cyA9IGZhbHNlO1xuICBcbiAgLyoqXG4gICAqIFNlbGVjdG9yIENTUyBwYXJhIGlkZW50aWZpY2FyIGxvcyBoYW5kbGVzIGRlIGRyYWdcbiAgICogUG9yIGRlZmVjdG8gYnVzY2E6IFtkYXRhLWRyYWctaGFuZGxlXSwgW2RhdGEtc2xvdD1yb3ctZHJhZy1oYW5kbGVdLCAucm93LWRyYWctaGFuZGxlXG4gICAqIFNpIG5vIGVuY3VlbnRyYSBuaW5ndW5vLCBpbnNlcnRhIHVuIGhhbmRsZSBhdXRvbcOhdGljb1xuICAgKi9cbiAgQElucHV0KCkgZHJhZ0hhbmRsZVNlbGVjdG9yID0gJ1tkYXRhLWRyYWctaGFuZGxlXSxbZGF0YS1zbG90PXJvdy1kcmFnLWhhbmRsZV0sLnJvdy1kcmFnLWhhbmRsZSxbZGF0YS1hdXRvLWRyYWctaGFuZGxlXSc7XG4gIFxuICAvKipcbiAgICogRW1pdGUgZWwgbnVldm8gb3JkZW4gZGUgbGFzIGZpbGFzIGN1YW5kbyBlbCB1c3VhcmlvIHRlcm1pbmEgZGUgYXJyYXN0cmFyXG4gICAqIEFycmF5IGRlIGRhdGEtcm93LWlkIGVuIGVsIG51ZXZvIG9yZGVuXG4gICAqL1xuICBAT3V0cHV0KCkgcm93T3JkZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlRWxlbWVudCcpIHRhYmxlRWxlbWVudD86IEVsZW1lbnRSZWY8SFRNTFRhYmxlRWxlbWVudD47XG5cbiAgcHJpdmF0ZSBjbGVhbnVwTGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICBwcml2YXRlIG9ic2VydmVyPzogTXV0YXRpb25PYnNlcnZlcjtcbiAgcHJpdmF0ZSBkcmFnZ2VkUm93OiBIVE1MVGFibGVSb3dFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNSZW9yZGVyQmVoYXZpb3IoKTtcbiAgfVxuXG4gIC8vIEdldHRlcnMgcGFyYSBjbGFzZXMgQ1NTIChtaXNtbyBjb21wb3J0YW1pZW50byBxdWUgcGRtLXRhYmxlKVxuICBnZXQgd3JhcHBlckNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gWydyZWxhdGl2ZScsICd3LWZ1bGwnXTtcbiAgICBjb25zdCBzdHJhdGVneUNsYXNzZXMgPSB0aGlzLmdldFJlc3BvbnNpdmVTdHJhdGVneUNsYXNzZXMoKTtcbiAgICBjb25zdCB2YXJpYW50Q2xhc3NlcyA9IHRoaXMuZ2V0VmFyaWFudFdyYXBwZXJDbGFzc2VzKCk7XG4gICAgXG4gICAgaWYgKHRoaXMuZnVsbEJsZWVkICYmIHRoaXMucmVzcG9uc2l2ZVN0cmF0ZWd5ID09PSAnc2Nyb2xsJykge1xuICAgICAgYmFzZUNsYXNzZXMucHVzaCgnLW14LTQnLCAncHgtNCcsICdzbTpteC0wJywgJ3NtOnB4LTAnKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmJhc2VDbGFzc2VzLFxuICAgICAgLi4uc3RyYXRlZ3lDbGFzc2VzLFxuICAgICAgLi4udmFyaWFudENsYXNzZXMsXG4gICAgICB0aGlzLmNsYXNzTmFtZVxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgZ2V0IHRhYmxlQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbJ3ctZnVsbCcsICdjYXB0aW9uLWJvdHRvbScsICd0ZXh0LXNtJ107XG4gICAgY29uc3QgdmFyaWFudENsYXNzZXMgPSB0aGlzLmdldFZhcmlhbnRUYWJsZUNsYXNzZXMoKTtcbiAgICBjb25zdCBjZWxsQ2xhc3NlcyA9IHRoaXMuZ2V0Q2VsbENsYXNzZXMoKTtcbiAgICBcbiAgICByZXR1cm4gWy4uLmJhc2VDbGFzc2VzLCAuLi52YXJpYW50Q2xhc3NlcywgLi4uY2VsbENsYXNzZXNdLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVzcG9uc2l2ZVN0cmF0ZWd5Q2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMucmVzcG9uc2l2ZVN0cmF0ZWd5ID09PSAnc2Nyb2xsJyB8fCB0aGlzLnJlc3BvbnNpdmVTdHJhdGVneSA9PT0gJ3dyYXAnIHx8IHRoaXMucmVzcG9uc2l2ZVN0cmF0ZWd5ID09PSAnY29sbGFwc2UnKSB7XG4gICAgICByZXR1cm4gWydvdmVyZmxvdy14LWF1dG8nXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWYXJpYW50V3JhcHBlckNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLnZhcmlhbnQgPT09ICdpbnRlcmFjdGl2ZScpIHtcbiAgICAgIHJldHVybiBbJ3JvdW5kZWQteGwnLCAnYm9yZGVyJywgJ2JvcmRlci1ib3JkZXInLCAnYmctYmFja2dyb3VuZCddO1xuICAgIH1cbiAgICBpZiAodGhpcy52YXJpYW50ID09PSAnZGF0YScpIHtcbiAgICAgIHJldHVybiBbJ3JvdW5kZWQtbWQnLCAnYm9yZGVyJywgJ2JvcmRlci1ib3JkZXInLCAnYmctYmFja2dyb3VuZCddO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcml2YXRlIGdldFZhcmlhbnRUYWJsZUNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLnZhcmlhbnQgPT09ICdkYXRhJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgJ2JvcmRlci1jb2xsYXBzZScsICd0ZXh0LWZvcmVncm91bmQnLFxuICAgICAgICAnWyZfdGhlYWRfdHJdOmJvcmRlci1iJywgJ1smX3RoZWFkX3RyXTpib3JkZXItYm9yZGVyJyxcbiAgICAgICAgJ1smX3Rib2R5X3RyXTpib3JkZXItYicsICdbJl90Ym9keV90cl06Ym9yZGVyLWJvcmRlcicsXG4gICAgICAgICdbJl90Ym9keV90cjpsYXN0LWNoaWxkXTpib3JkZXItYi0wJyxcbiAgICAgICAgJ1smX3RoXTpoLTEwJywgJ1smX3RoXTpweC0yJywgJ1smX3RoXTp0ZXh0LWxlZnQnLCAnWyZfdGhdOmFsaWduLW1pZGRsZScsICdbJl90aF06Zm9udC1tZWRpdW0nLFxuICAgICAgICAnWyZfdGRdOnAtMicsICdbJl90ZF06YWxpZ24tbWlkZGxlJ1xuICAgICAgXTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMudmFyaWFudCA9PT0gJ2ludGVyYWN0aXZlJykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgJ3RleHQtZm9yZWdyb3VuZCcsXG4gICAgICAgICdbJl90aGVhZF06c3RpY2t5JywgJ1smX3RoZWFkXTp0b3AtMCcsICdbJl90aGVhZF06ei0xMCcsICdbJl90aGVhZF06YmctbXV0ZWQvNzAnLFxuICAgICAgICAnWyZfdGhlYWRfdHJdOmJvcmRlci1iJywgJ1smX3RoZWFkX3RyXTpib3JkZXItYm9yZGVyJyxcbiAgICAgICAgJ1smX3RoXTpoLTEyJywgJ1smX3RoXTpweC00JywgJ1smX3RoXTp0ZXh0LWxlZnQnLCAnWyZfdGhdOmFsaWduLW1pZGRsZScsICdbJl90aF06dGV4dC1zbScsICdbJl90aF06Zm9udC1tZWRpdW0nLFxuICAgICAgICAnWyZfdGJvZHlfdHJdOmJvcmRlci1iJywgJ1smX3Rib2R5X3RyXTpib3JkZXItYm9yZGVyJyxcbiAgICAgICAgJ1smX3Rib2R5X3RyXTp0cmFuc2l0aW9uLWNvbG9ycycsICdbJl90Ym9keV90cjpob3Zlcl06YmctbXV0ZWQvNTAnLFxuICAgICAgICAnWyZfdGJvZHlfdHI6bGFzdC1jaGlsZF06Ym9yZGVyLWItMCcsXG4gICAgICAgICdbJl90ZF06aC0xNCcsICdbJl90ZF06cHgtNCcsICdbJl90ZF06YWxpZ24tbWlkZGxlJywgJ1smX3RkXTp0ZXh0LXNtJyxcbiAgICAgICAgJ1smX3N2Z106dGV4dC1tdXRlZC1mb3JlZ3JvdW5kJ1xuICAgICAgXTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDZWxsQ2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMucmVzcG9uc2l2ZVN0cmF0ZWd5ID09PSAnc2Nyb2xsJykge1xuICAgICAgcmV0dXJuIFsnWyZfdGRdOndoaXRlc3BhY2Utbm9ybWFsJywgJ1smX3RoXTp3aGl0ZXNwYWNlLW5vcm1hbCcsICdzbTpbJl90ZF06d2hpdGVzcGFjZS1ub3dyYXAnLCAnc206WyZfdGhdOndoaXRlc3BhY2Utbm93cmFwJ107XG4gICAgfVxuICAgIGlmICh0aGlzLnJlc3BvbnNpdmVTdHJhdGVneSA9PT0gJ3dyYXAnKSB7XG4gICAgICByZXR1cm4gWydbJl90ZF06d2hpdGVzcGFjZS1ub3JtYWwnLCAnWyZfdGRdOmJyZWFrLXdvcmRzJywgJ1smX3RoXTp3aGl0ZXNwYWNlLW5vcm1hbCddO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3Jlb3JkZXJSb3dzJ10gfHwgY2hhbmdlc1sndmFyaWFudCddKSB7XG4gICAgICB0aGlzLnN5bmNSZW9yZGVyQmVoYXZpb3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBSZW9yZGVyQmVoYXZpb3IoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Jlb3JkZXJCZWhhdmlvcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBSZW9yZGVyQmVoYXZpb3IoKTtcblxuICAgIGlmICghdGhpcy5yZW9yZGVyUm93cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRib2R5ID0gdGhpcy5nZXRUYm9keSgpO1xuICAgIGlmICghdGJvZHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFJvd3NEcmFnZ2FibGUodGJvZHksIHRydWUpO1xuXG4gICAgdGhpcy5jbGVhbnVwTGlzdGVuZXJzLnB1c2goXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0Ym9keSwgJ21vdXNlZG93bicsIChldmVudDogTW91c2VFdmVudCkgPT4gdGhpcy5hcm1EcmFnRnJvbUhhbmRsZShldmVudCkpLFxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGJvZHksICdkcmFnc3RhcnQnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5vbkRyYWdTdGFydChldmVudCkpLFxuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGJvZHksICdkcmFnb3ZlcicsIChldmVudDogRHJhZ0V2ZW50KSA9PiB0aGlzLm9uRHJhZ092ZXIoZXZlbnQsIHRib2R5KSksXG4gICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0Ym9keSwgJ2Ryb3AnLCAoZXZlbnQ6IERyYWdFdmVudCkgPT4gdGhpcy5vbkRyb3AoZXZlbnQpKSxcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRib2R5LCAnZHJhZ2VuZCcsICgpID0+IHRoaXMub25EcmFnRW5kKCkpXG4gICAgKTtcblxuICAgIC8vIE9ic2VydmVyIHBhcmEgZGV0ZWN0YXIgY2FtYmlvcyBlbiBlbCBET00gKGZpbGFzIGFncmVnYWRhcy9yZW1vdmlkYXMpXG4gICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHRoaXMuc2V0Um93c0RyYWdnYWJsZSh0Ym9keSwgdHJ1ZSkpO1xuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0Ym9keSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBSZW9yZGVyQmVoYXZpb3IoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwTGlzdGVuZXJzLmZvckVhY2goKGRpc3Bvc2UpID0+IGRpc3Bvc2UoKSk7XG4gICAgdGhpcy5jbGVhbnVwTGlzdGVuZXJzID0gW107XG5cbiAgICBpZiAodGhpcy5vYnNlcnZlcikge1xuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLm9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHRib2R5ID0gdGhpcy5nZXRUYm9keSgpO1xuICAgIGlmICh0Ym9keSkge1xuICAgICAgdGhpcy5zZXRSb3dzRHJhZ2dhYmxlKHRib2R5LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy5kcmFnZ2VkUm93ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGJvZHkoKTogSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQudEJvZGllcy5pdGVtKDApID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHNldFJvd3NEcmFnZ2FibGUodGJvZHk6IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50LCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGJvZHkucm93cyk7XG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIHRoaXMuc3luY0F1dG9EcmFnSGFuZGxlKHJvdywgZW5hYmxlZCk7XG4gICAgICByb3cuZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgICAgZGVsZXRlIHJvdy5kYXRhc2V0WydkcmFnZ2luZyddO1xuICAgICAgICBkZWxldGUgcm93LmRhdGFzZXRbJ2RyYWdBcm1lZCddO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydGEgdW4gaGFuZGxlIGRlIGRyYWcgYXV0b23DoXRpY28gc2kgbm8gZXhpc3RlIHVubyBjdXN0b21cbiAgICovXG4gIHByaXZhdGUgc3luY0F1dG9EcmFnSGFuZGxlKHJvdzogSFRNTFRhYmxlUm93RWxlbWVudCwgZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0Q2VsbCA9IHJvdy5jZWxscy5pdGVtKDApO1xuICAgIGlmICghZmlyc3RDZWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdBdXRvSGFuZGxlID0gZmlyc3RDZWxsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWF1dG8tZHJhZy1oYW5kbGVdJyk7XG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICBleGlzdGluZ0F1dG9IYW5kbGU/LnJlbW92ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0N1c3RvbUhhbmRsZSA9ICEhZmlyc3RDZWxsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRyYWctaGFuZGxlXSxbZGF0YS1zbG90PXJvdy1kcmFnLWhhbmRsZV0sLnJvdy1kcmFnLWhhbmRsZScpO1xuICAgIGlmIChoYXNDdXN0b21IYW5kbGUgfHwgZXhpc3RpbmdBdXRvSGFuZGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXIgaGFuZGxlIGF1dG9tw6F0aWNvXG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdidXR0b24nKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b24sICd0eXBlJywgJ2J1dHRvbicpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGJ1dHRvbiwgJ2FyaWEtbGFiZWwnLCAnRHJhZyByb3cnKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZShidXR0b24sICdkYXRhLWF1dG8tZHJhZy1oYW5kbGUnLCAndHJ1ZScpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnaW5saW5lLWZsZXgnKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ2gtNycpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAndy03Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICdpdGVtcy1jZW50ZXInKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGJ1dHRvbiwgJ2p1c3RpZnktY2VudGVyJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhidXR0b24sICdjdXJzb3ItZ3JhYicpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAnYWN0aXZlOmN1cnNvci1ncmFiYmluZycpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoYnV0dG9uLCAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyk7XG5cbiAgICBjb25zdCBkb3RzID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb3RzLCAndGV4dC1zbScpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG90cywgJ2xlYWRpbmctbm9uZScpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZG90cywgJ3RleHRDb250ZW50JywgJ+KLruKLricpO1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoYnV0dG9uLCBkb3RzKTtcblxuICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKGZpcnN0Q2VsbCwgYnV0dG9uLCBmaXJzdENlbGwuZmlyc3RDaGlsZCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IHJvdyA9IHRhcmdldD8uY2xvc2VzdCgndHInKTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZSA9IHRhcmdldD8uY2xvc2VzdCh0aGlzLmRyYWdIYW5kbGVTZWxlY3Rvcik7XG4gICAgY29uc3QgaXNBcm1lZCA9IHJvdy5kYXRhc2V0WydkcmFnQXJtZWQnXSA9PT0gJ3RydWUnO1xuICAgIGlmICgoIWhhbmRsZSB8fCAhcm93LmNvbnRhaW5zKGhhbmRsZSkpICYmICFpc0FybWVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ2dlZFJvdyA9IHJvdyBhcyBIVE1MVGFibGVSb3dFbGVtZW50O1xuICAgIHRoaXMuZHJhZ2dlZFJvdy5kYXRhc2V0WydkcmFnZ2luZyddID0gJ3RydWUnO1xuXG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dC9wbGFpbicsICcnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCwgdGJvZHk6IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnZWRSb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgdGFyZ2V0Um93ID0gdGFyZ2V0Py5jbG9zZXN0KCd0cicpIGFzIEhUTUxUYWJsZVJvd0VsZW1lbnQgfCBudWxsO1xuXG4gICAgaWYgKCF0YXJnZXRSb3cgfHwgdGFyZ2V0Um93ID09PSB0aGlzLmRyYWdnZWRSb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0Um93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNob3VsZEluc2VydEJlZm9yZSA9IGV2ZW50LmNsaWVudFkgPCByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMjtcbiAgICB0Ym9keS5pbnNlcnRCZWZvcmUodGhpcy5kcmFnZ2VkUm93LCBzaG91bGRJbnNlcnRCZWZvcmUgPyB0YXJnZXRSb3cgOiB0YXJnZXRSb3cubmV4dFNpYmxpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIG9uRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICBjb25zdCB0Ym9keSA9IHRoaXMuZ2V0VGJvZHkoKTtcbiAgICBpZiAodGJvZHkpIHtcbiAgICAgIEFycmF5LmZyb20odGJvZHkucm93cykuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIHJvdy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHJvdy5kYXRhc2V0WydkcmFnQXJtZWQnXTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyYWdnZWRSb3cpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRyYWdnZWRSb3cuZGF0YXNldFsnZHJhZ2dpbmcnXTtcbiAgICAgIHRoaXMuZHJhZ2dlZFJvdyA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0Ym9keSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyID0gQXJyYXkuZnJvbSh0Ym9keS5yb3dzKS5tYXAoKHJvdywgaW5kZXgpID0+IHJvdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm93LWlkJykgfHwgU3RyaW5nKGluZGV4KSk7XG4gICAgdGhpcy5yb3dPcmRlckNoYW5nZS5lbWl0KG9yZGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgYXJtRHJhZ0Zyb21IYW5kbGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGhhbmRsZSA9IHRhcmdldD8uY2xvc2VzdCh0aGlzLmRyYWdIYW5kbGVTZWxlY3Rvcik7XG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSBoYW5kbGUuY2xvc2VzdCgndHInKSBhcyBIVE1MVGFibGVSb3dFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXJvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJvdy5kcmFnZ2FibGUgPSB0cnVlO1xuICAgIHJvdy5kYXRhc2V0WydkcmFnQXJtZWQnXSA9ICd0cnVlJztcbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJ3cmFwcGVyQ2xhc3Nlc1wiIFthdHRyLmRhdGEtc2xvdF09XCJ2YXJpYW50ID09PSAnaW50ZXJhY3RpdmUnID8gJ3RhYmxlLWNvbnRhaW5lcicgOiBudWxsXCI+XG4gIDx0YWJsZSAjdGFibGVFbGVtZW50IFtuZ0NsYXNzXT1cInRhYmxlQ2xhc3Nlc1wiIFthdHRyLmRhdGEtc2xvdF09XCJ2YXJpYW50ID09PSAnaW50ZXJhY3RpdmUnID8gJ3RhYmxlJyA6IG51bGxcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvdGFibGU+XG48L2Rpdj5cbiJdfQ==
|