@oneteme/jquery-table 0.0.8 → 0.0.10

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.
@@ -1,477 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { MatIconModule } from '@angular/material/icon';
3
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, inject } from '@angular/core';
4
- import { JQT_I18N, JQT_I18N_DEFAULTS } from '../../jqt-i18n.token';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/material/icon";
8
- const EMPTY_CATEGORY_KEY = '__empty__';
9
- const EMPTY_CATEGORY_LABEL = 'Vide';
10
- export class SlicePanelComponent {
11
- constructor() {
12
- this.sliceConfigs = [];
13
- this.columns = [];
14
- this.data = [];
15
- this.lazyData = new Map();
16
- this.lazyStatus = new Map();
17
- this.showToggle = true;
18
- this.showCounts = true;
19
- this.collapsedByDefault = false;
20
- this.alwaysShow = false;
21
- this.filterChange = new EventEmitter();
22
- this.activeKeysChange = new EventEmitter();
23
- this.dynamicSliceKeysChange = new EventEmitter();
24
- this.collapsedChange = new EventEmitter();
25
- this._cdr = inject(ChangeDetectorRef);
26
- this._i18nRaw = inject(JQT_I18N, { optional: true });
27
- this.i18n = { ...JQT_I18N_DEFAULTS, ...(this._i18nRaw ?? {}) };
28
- this.isCollapsed = false;
29
- this.activeKeysBySlice = new Map();
30
- this._expandedSlices = new Set();
31
- this._dynamicSlices = [];
32
- // ── Cache
33
- this._cachedSlices = [];
34
- this._countCache = new Map();
35
- this.trackBySliceIndex = (index, _) => index;
36
- this.trackByCategoryKey = (_, cat) => cat.key;
37
- }
38
- // ── Lifecycle
39
- ngOnInit() {
40
- this.isCollapsed = this.collapsedByDefault;
41
- }
42
- ngOnChanges(changes) {
43
- if (changes['sliceConfigs'] || changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']) {
44
- this._refreshDynamicSlices();
45
- this._rebuildCache();
46
- const shouldReemitFilter = !!(changes['data'] || changes['columns'] || changes['lazyData'] || changes['lazyStatus']);
47
- const hasActiveFilters = [...this.activeKeysBySlice.values()].some(s => s.size > 0);
48
- if (hasActiveFilters && shouldReemitFilter) {
49
- this._emitFilter();
50
- }
51
- this._cdr.markForCheck();
52
- }
53
- }
54
- // ── Computed
55
- get showPanel() {
56
- const hasCfg = (this.sliceConfigs || []).length > 0 || this._dynamicSlices.length > 0;
57
- if (this.alwaysShow)
58
- return hasCfg;
59
- return hasCfg && (this.data?.length ?? 0) > 0;
60
- }
61
- get slices() {
62
- return this._cachedSlices;
63
- }
64
- get staticSliceCount() {
65
- return (this.sliceConfigs || []).length;
66
- }
67
- get staticSlicesForMenu() {
68
- return (this.sliceConfigs || [])
69
- .filter((s) => !!s.columnKey)
70
- .map((s) => ({ key: s.columnKey, title: s.title || s.columnKey }));
71
- }
72
- get activeDynamicSliceColumns() {
73
- return this._dynamicSlices
74
- .map((d) => (this.columns || []).find((c) => c.key === d.key))
75
- .filter((c) => !!c);
76
- }
77
- get availableColumnsForDynamicSlice() {
78
- const dynamicKeys = new Set(this._dynamicSlices.map((d) => d.key));
79
- const staticKeys = new Set((this.sliceConfigs || []).map((s) => s.columnKey).filter((k) => !!k));
80
- const existingKeys = new Set([...dynamicKeys, ...staticKeys]);
81
- const seen = new Set();
82
- return (this.columns || []).filter((c) => {
83
- if (existingKeys.has(c.key) || seen.has(c.key))
84
- return false;
85
- seen.add(c.key);
86
- return true;
87
- });
88
- }
89
- get activeSliceByLabel() {
90
- const staticActiveCount = (this.sliceConfigs || []).length;
91
- const total = staticActiveCount + this._dynamicSlices.length;
92
- if (total === 0)
93
- return 'Aucun';
94
- if (total === 1) {
95
- const first = (this.sliceConfigs || [])[0];
96
- if (first)
97
- return first.title || first.columnKey || '1';
98
- return this.activeDynamicSliceColumns[0]?.header || '1';
99
- }
100
- return `${total} actifs`;
101
- }
102
- // ── UI state
103
- isSliceCollapsed(sliceIndex) {
104
- if (this._cachedSlices.length === 1) {
105
- return this._expandedSlices.has(-1 - sliceIndex);
106
- }
107
- return !this._expandedSlices.has(sliceIndex);
108
- }
109
- toggleSliceCollapse(sliceIndex) {
110
- if (this.slices.length === 1) {
111
- const closedKey = -1 - sliceIndex;
112
- if (this._expandedSlices.has(closedKey)) {
113
- this._expandedSlices.delete(closedKey);
114
- }
115
- else {
116
- this._expandedSlices.add(closedKey);
117
- this._scrollSliceTitleIntoView(sliceIndex);
118
- }
119
- }
120
- else {
121
- if (this._expandedSlices.has(sliceIndex)) {
122
- this._expandedSlices.delete(sliceIndex);
123
- }
124
- else {
125
- this._expandedSlices.clear();
126
- this._expandedSlices.add(sliceIndex);
127
- this._scrollSliceTitleIntoView(sliceIndex);
128
- }
129
- }
130
- this._cdr.markForCheck();
131
- }
132
- togglePanel() {
133
- this.isCollapsed = !this.isCollapsed;
134
- this.collapsedChange.emit(this.isCollapsed);
135
- this._cdr.markForCheck();
136
- }
137
- isSliceDynamic(sliceIndex) {
138
- return sliceIndex >= this.staticSliceCount;
139
- }
140
- isSliceLoading(sliceIndex) {
141
- const staticSlice = (this.sliceConfigs || [])[sliceIndex];
142
- if (staticSlice?.columnKey) {
143
- const colDef = (this.columns || []).find(c => c.key === staticSlice.columnKey);
144
- if (colDef?.lazy) {
145
- const status = this.lazyStatus.get(staticSlice.columnKey) ?? 'idle';
146
- return status === 'loading' || status === 'idle';
147
- }
148
- return false;
149
- }
150
- const key = this._getDynamicSliceColumnKey(sliceIndex);
151
- if (!key)
152
- return false;
153
- const colDef = (this.columns || []).find(c => c.key === key);
154
- if (!colDef?.lazy)
155
- return false;
156
- const status = this.lazyStatus.get(key) ?? 'idle';
157
- return status === 'loading' || status === 'idle';
158
- }
159
- isStaticSliceVisible(_columnKey) {
160
- return true;
161
- }
162
- toggleStaticSlice(_columnKey) {
163
- // Délégué à table.component via _staticSliceHiddenKeys — ne rien faire ici.
164
- }
165
- // ── Selection
166
- getSliceIcon(slice) {
167
- if (slice.icon)
168
- return slice.icon;
169
- if (slice.columnKey) {
170
- return (this.columns || []).find(c => c.key === slice.columnKey)?.icon;
171
- }
172
- return undefined;
173
- }
174
- isSliceCategoryActive(sliceIndex, categoryKey) {
175
- return this.activeKeysBySlice.get(sliceIndex)?.has(categoryKey) ?? false;
176
- }
177
- isSliceAllActive(sliceIndex) {
178
- return !this.activeKeysBySlice.has(sliceIndex) || this.activeKeysBySlice.get(sliceIndex).size === 0;
179
- }
180
- sliceCategoryCount(sliceIndex, categoryKey) {
181
- const cacheKey = `${sliceIndex}:${categoryKey}`;
182
- if (this._countCache.has(cacheKey)) {
183
- return this._countCache.get(cacheKey);
184
- }
185
- const slice = this._cachedSlices[sliceIndex];
186
- if (!slice)
187
- return 0;
188
- const category = (slice.categories || []).find((c) => c.key === categoryKey);
189
- const count = category ? (this.data || []).filter((row) => category.filter(row)).length : 0;
190
- this._countCache.set(cacheKey, count);
191
- return count;
192
- }
193
- isSliceEmpty(sliceIndex) {
194
- const slice = this._cachedSlices[sliceIndex];
195
- if (!slice)
196
- return true;
197
- return (slice.categories || []).every(c => this.sliceCategoryCount(sliceIndex, c.key) === 0);
198
- }
199
- onSliceCategorySelected(sliceIndex, categoryKey) {
200
- const slice = this.slices[sliceIndex];
201
- if (!slice)
202
- return;
203
- if (!this.activeKeysBySlice.has(sliceIndex)) {
204
- this.activeKeysBySlice.set(sliceIndex, new Set());
205
- }
206
- const activeKeys = this.activeKeysBySlice.get(sliceIndex);
207
- if (slice.multiSelect === false) {
208
- if (activeKeys.has(categoryKey)) {
209
- activeKeys.clear();
210
- }
211
- else {
212
- activeKeys.clear();
213
- activeKeys.add(categoryKey);
214
- }
215
- }
216
- else {
217
- if (activeKeys.has(categoryKey)) {
218
- activeKeys.delete(categoryKey);
219
- }
220
- else {
221
- activeKeys.add(categoryKey);
222
- }
223
- }
224
- this._emitFilter();
225
- this._cdr.markForCheck();
226
- }
227
- onSliceAllSelected(sliceIndex) {
228
- if (this.activeKeysBySlice.has(sliceIndex)) {
229
- this.activeKeysBySlice.get(sliceIndex).clear();
230
- }
231
- this._emitFilter();
232
- this._cdr.markForCheck();
233
- }
234
- /** Retourne l'état des filtres actifs sous forme sérialisable (sliceIndex → tableau de clés).
235
- * Inclut les slices sans sélection (tableau vide) pour distinguer "aucune tranche sélectionnée"
236
- * (= filtre ouvert, rien coché) de "slice absente". */
237
- getActiveFilters() {
238
- const result = {};
239
- this._cachedSlices.forEach((_, idx) => {
240
- const keys = this.activeKeysBySlice.get(idx);
241
- result[idx] = keys ? [...keys] : [];
242
- });
243
- return result;
244
- }
245
- /** Restaure les filtres actifs depuis un snapshot sérialisé et réémet le filtre. */
246
- restoreFilters(filters) {
247
- this.activeKeysBySlice = new Map(Object.entries(filters).map(([idx, keys]) => [Number(idx), new Set(keys)]));
248
- this._emitFilter();
249
- this._cdr.markForCheck();
250
- }
251
- // ── Dynamic slice management
252
- addDynamicSlice(column) {
253
- const distinctValues = this._computeDistinctValues(column.key);
254
- const newSlice = {
255
- title: column.header,
256
- columnKey: column.key,
257
- categories: distinctValues.map((v) => this._buildCategoryFromValue(column.key, v)),
258
- };
259
- this._dynamicSlices = [...this._dynamicSlices, { key: column.key, slice: newSlice }];
260
- this._rebuildCache();
261
- this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));
262
- this._emitFilter();
263
- this._cdr.markForCheck();
264
- }
265
- removeDynamicSlice(sliceIndex) {
266
- const dynamicIndex = sliceIndex - this.staticSliceCount;
267
- if (dynamicIndex < 0)
268
- return;
269
- const newActiveKeys = new Map();
270
- this.activeKeysBySlice.forEach((keys, idx) => {
271
- if (idx < sliceIndex)
272
- newActiveKeys.set(idx, keys);
273
- else if (idx > sliceIndex)
274
- newActiveKeys.set(idx - 1, keys);
275
- });
276
- this.activeKeysBySlice = newActiveKeys;
277
- this._dynamicSlices = this._dynamicSlices.filter((_, i) => i !== dynamicIndex);
278
- this._rebuildCache();
279
- this.dynamicSliceKeysChange.emit(this._dynamicSlices.map(d => d.key));
280
- this._emitFilter();
281
- this._cdr.markForCheck();
282
- }
283
- removeDynamicSliceByKey(key) {
284
- const dynamicIndex = this._dynamicSlices.findIndex((d) => d.key === key);
285
- if (dynamicIndex < 0)
286
- return;
287
- const sliceIndex = this.staticSliceCount + dynamicIndex;
288
- this.removeDynamicSlice(sliceIndex);
289
- }
290
- // ── Private helpers
291
- _emitFilter() {
292
- const slices = this.slices;
293
- const activeKeysBySlice = this.activeKeysBySlice;
294
- this.activeKeysChange.emit(slices.map((_, i) => {
295
- const keys = activeKeysBySlice.get(i);
296
- return keys ? [...keys] : [];
297
- }));
298
- const pred = (row) => slices.every((slice, sliceIndex) => {
299
- const activeKeys = activeKeysBySlice.get(sliceIndex);
300
- if (!activeKeys || activeKeys.size === 0)
301
- return true;
302
- return [...activeKeys].some((key) => {
303
- const category = (slice.categories || []).find((c) => c.key === key);
304
- if (!category)
305
- return false;
306
- // Si pas de filter défini (usage chart), on ne filtre pas en mémoire
307
- if (!category?.filter)
308
- return true;
309
- return category.filter(row);
310
- });
311
- });
312
- this.filterChange.emit(pred);
313
- }
314
- _getDynamicSliceColumnKey(sliceIndex) {
315
- const dynamicIndex = sliceIndex - this.staticSliceCount;
316
- return this._dynamicSlices[dynamicIndex]?.key ?? null;
317
- }
318
- _getSliceIdentity(slice, fallbackIndex) {
319
- if (slice.columnKey) {
320
- return `column:${slice.columnKey}`;
321
- }
322
- if (slice.title) {
323
- return `title:${slice.title}`;
324
- }
325
- const categoryKeys = (slice.categories || []).map((category) => category.key).join('|');
326
- return `index:${fallbackIndex}|categories:${categoryKeys}`;
327
- }
328
- _materializeSlice(slice) {
329
- if (!slice.columnKey || (slice.categories && slice.categories.length > 0)) {
330
- return slice;
331
- }
332
- const col = (this.columns || []).find(c => c.key === slice.columnKey);
333
- const isLazy = !!col?.lazy;
334
- if (isLazy && this.lazyStatus.get(slice.columnKey) !== 'loaded') {
335
- return { ...slice, categories: [] };
336
- }
337
- if (slice.bucket) {
338
- const distinctValues = [...new Set((this.data || []).map(slice.bucket))].sort();
339
- return {
340
- ...slice,
341
- categories: distinctValues.map((v) => ({
342
- key: v,
343
- label: v,
344
- filter: (row) => slice.bucket(row) === v,
345
- })),
346
- };
347
- }
348
- const distinctValues = this._computeDistinctValues(slice.columnKey);
349
- return {
350
- ...slice,
351
- categories: distinctValues.map((v) => this._buildCategoryFromValue(slice.columnKey, v)),
352
- };
353
- }
354
- _buildCategoryFromValue(columnKey, v) {
355
- if (v === EMPTY_CATEGORY_KEY) {
356
- return {
357
- key: EMPTY_CATEGORY_KEY,
358
- label: EMPTY_CATEGORY_LABEL,
359
- filter: (row) => {
360
- const val = this._getLazyAwareValue(columnKey, row);
361
- return val == null || val === '';
362
- },
363
- };
364
- }
365
- return {
366
- key: v,
367
- label: v,
368
- filter: (row) => String(this._getLazyAwareValue(columnKey, row) ?? '') === v,
369
- };
370
- }
371
- _computeDistinctValues(columnKey) {
372
- const rawValues = (this.data || []).map((row) => {
373
- const val = this._getLazyAwareValue(columnKey, row);
374
- return val != null && val !== '' ? String(val) : null;
375
- });
376
- const distinct = [...new Set(rawValues.filter((v) => v !== null))].sort();
377
- if (rawValues.some(v => v === null)) {
378
- distinct.push(EMPTY_CATEGORY_KEY);
379
- }
380
- return distinct;
381
- }
382
- _getLazyAwareValue(columnKey, row) {
383
- const colDef = (this.columns || []).find(c => c.key === columnKey);
384
- if (colDef?.lazy) {
385
- return this.lazyData.get(columnKey)?.get(row) ?? null;
386
- }
387
- if (colDef?.value) {
388
- return colDef.value(row, 0);
389
- }
390
- return row[columnKey];
391
- }
392
- _rebuildCache() {
393
- const previousSlices = this._cachedSlices;
394
- const previousActiveKeys = this.activeKeysBySlice;
395
- const allSlices = [...(this.sliceConfigs || []), ...this._dynamicSlices.map((d) => d.slice)];
396
- this._cachedSlices = allSlices.map((slice) => this._materializeSlice(slice));
397
- const previousKeysByIdentity = new Map();
398
- previousSlices.forEach((slice, index) => {
399
- const activeKeys = previousActiveKeys.get(index);
400
- if (!activeKeys || activeKeys.size === 0)
401
- return;
402
- previousKeysByIdentity.set(this._getSliceIdentity(slice, index), new Set(activeKeys));
403
- });
404
- const nextActiveKeys = new Map();
405
- this._cachedSlices.forEach((slice, index) => {
406
- const previousKeys = previousKeysByIdentity.get(this._getSliceIdentity(slice, index));
407
- if (!previousKeys || previousKeys.size === 0)
408
- return;
409
- const availableKeys = new Set((slice.categories || []).map((category) => category.key));
410
- const matchingKeys = [...previousKeys].filter((key) => availableKeys.has(key));
411
- if (matchingKeys.length > 0) {
412
- nextActiveKeys.set(index, new Set(matchingKeys));
413
- }
414
- });
415
- this.activeKeysBySlice = nextActiveKeys;
416
- this._countCache.clear();
417
- }
418
- _refreshDynamicSlices() {
419
- this._dynamicSlices = this._dynamicSlices.map(({ key, slice }) => {
420
- const distinctValues = this._computeDistinctValues(key);
421
- return {
422
- key,
423
- slice: {
424
- ...slice,
425
- categories: distinctValues.map((v) => this._buildCategoryFromValue(key, v)),
426
- },
427
- };
428
- });
429
- }
430
- _scrollSliceTitleIntoView(sliceIndex) {
431
- setTimeout(() => {
432
- const container = this.slicePanelBodyRef?.nativeElement;
433
- if (!container)
434
- return;
435
- const row = container.querySelector(`[data-slice-index="${sliceIndex}"]`);
436
- if (!row)
437
- return;
438
- row.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
439
- }, 0);
440
- }
441
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlicePanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
442
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SlicePanelComponent, isStandalone: true, selector: "slice-panel", inputs: { sliceConfigs: "sliceConfigs", columns: "columns", data: "data", lazyData: "lazyData", lazyStatus: "lazyStatus", showToggle: "showToggle", showCounts: "showCounts", collapsedByDefault: "collapsedByDefault", alwaysShow: "alwaysShow" }, outputs: { filterChange: "filterChange", activeKeysChange: "activeKeysChange", dynamicSliceKeysChange: "dynamicSliceKeysChange", collapsedChange: "collapsedChange" }, viewQueries: [{ propertyName: "slicePanelBodyRef", first: true, predicate: ["slicePanelBody"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n {{ i18n.filterPanelTitle(slices.length) }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? i18n.expandFilterTitle : i18n.collapseFilterTitle\"\n (click)=\"togglePanel()\"\n >\n <mat-icon class=\"slice-toggle-mat-icon\">{{ isCollapsed ? 'filter_list' : 'filter_list_off' }}</mat-icon>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">\u203A</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || i18n.filterBlockDefaultTitle }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >\u00D7</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">{{ i18n.filterEmptyState }}</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box}.slice-panel-wrapper{height:100%;max-height:100%;overflow-y:auto;box-sizing:border-box}.slice-panel{margin-top:0;border:1px solid var(--jqt-border-color);border-radius:10px;background:var(--jqt-surface-color);display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden;box-sizing:border-box}.slice-panel-header{flex-shrink:0;display:flex;justify-content:flex-end;align-items:center;height:34px;padding:0 8px;margin-bottom:8px}.slice-panel-header:has(.slice-panel-title){justify-content:space-between;padding-left:12px}.slice-panel-body{flex:1 1 0;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:4px;padding:4px 10px 10px;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-panel-body::-webkit-scrollbar{width:2px}.slice-panel-body::-webkit-scrollbar-thumb{background:var(--jqt-primary-color);border-radius:4px}.slice-panel-title{margin:0;padding-top:2px;font-size:11px;font-weight:700;line-height:1;text-transform:uppercase;letter-spacing:.08em;color:var(--jqt-text-color);-webkit-user-select:none;user-select:none;align-self:center;display:inline-flex;align-items:center;gap:5px}.slice-panel-title .slice-panel-title-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.slice-section-items{display:flex;flex-direction:column;gap:2px;flex:0 0 auto;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-section-items::-webkit-scrollbar{width:2px}.slice-section-items .slice-empty-state{padding:8px 10px;font-size:12px;color:var(--jqt-text-muted, #9ca3af);font-style:italic;text-align:center}.slice-section-items::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.slice-toggle{border:0;background:var(--jqt-surface-color);color:var(--jqt-text-color);border-radius:6px;width:22px;height:22px;padding:0;font-size:14px;text-align:center;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1}.slice-toggle-mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.slice-panel.collapsed{border-color:transparent;background:transparent;overflow:visible}.slice-panel.collapsed .slice-panel-header{height:34px;padding:0;justify-content:center;align-items:center}.slice-panel.collapsed .slice-toggle{width:34px;height:34px;border:1px solid var(--jqt-border-color);background:var(--jqt-surface-color);border-radius:8px}.slice-panel.collapsed .slice-toggle:hover{border-color:var(--jqt-text-muted)}.slice-panel.collapsed .slice-toggle .slice-toggle-mat-icon{font-size:18px;width:18px;height:18px}.slice-title-row{display:flex;align-items:center;justify-content:space-between;gap:6px;margin:4px 0 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.slice-title-row:hover .slice-title{color:var(--jqt-text-color)}.slice-title-row:hover .slice-title-chevron{color:var(--jqt-text-secondary)}.slice-title-row:first-of-type .slice-title{margin-top:0}.slice-title-chevron{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:var(--jqt-text-muted);transition:transform .15s ease;transform:rotate(0);position:relative;top:-1px}.slice-title-chevron.expanded{transform:rotate(90deg)}.slice-title{flex:1 1 auto;margin:0;font-size:14px;font-weight:600;color:var(--jqt-title-color)}.slice-title-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-title-color)}.slice-remove-btn{background:none;border:none;cursor:pointer;color:var(--jqt-border-color);font-size:12px;padding:0 2px;line-height:1;flex-shrink:0;opacity:.5;transition:opacity .15s,color .15s}.slice-remove-btn:hover{color:var(--jqt-text-secondary);opacity:1}.slice-title-row:hover .slice-remove-btn{opacity:.8}.slice-item{display:flex;justify-content:space-between;align-items:center;text-align:left;width:100%;padding:5px 10px 5px 16px;background:transparent;border:0;cursor:pointer;border-radius:8px;color:var(--jqt-text-color);box-sizing:border-box;min-width:0;gap:8px}.slice-item.active{background:var(--jqt-row-hover-bg);font-weight:600}.slice-item.slice-multi{padding-left:6px}.slice-item span:first-child{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slice-item span:last-child{flex:0 0 auto;min-width:1.2em;text-align:right}.slice-check-box{flex:0 0 16px;width:16px;height:16px;border:1.5px solid var(--jqt-text-muted);border-radius:4px;background:var(--jqt-surface-color);display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;transition:background .15s,border-color .15s}.slice-check-box.checked{background:var(--jqt-text-secondary);border-color:var(--jqt-text-secondary)}.slice-check-box.checked:after{content:\"\";display:block;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translateY(-1px)}.slice-divider{border:none;border-top:1px solid var(--jqt-border-color);margin:6px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.slice-lazy-loading{display:flex;flex-direction:column;gap:8px;padding:8px 10px}.slice-lazy-loading .lazy-skeleton{width:80%}.slice-lazy-loading .lazy-skeleton:nth-child(2){width:60%}.slice-lazy-loading .lazy-skeleton:nth-child(3){width:45%}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
443
- }
444
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SlicePanelComponent, decorators: [{
445
- type: Component,
446
- args: [{ standalone: true, selector: 'slice-panel', imports: [CommonModule, MatIconModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"slice-panel-wrapper\" [class.collapsed]=\"isCollapsed\">\n <aside class=\"slice-panel\" [class.collapsed]=\"isCollapsed\">\n <div class=\"slice-panel-header\">\n <span *ngIf=\"!isCollapsed\" class=\"slice-panel-title\">\n {{ i18n.filterPanelTitle(slices.length) }}\n </span>\n <button\n *ngIf=\"showToggle\"\n type=\"button\"\n class=\"slice-toggle\"\n [attr.aria-label]=\"isCollapsed ? i18n.expandFilterTitle : i18n.collapseFilterTitle\"\n (click)=\"togglePanel()\"\n >\n <mat-icon class=\"slice-toggle-mat-icon\">{{ isCollapsed ? 'filter_list' : 'filter_list_off' }}</mat-icon>\n </button>\n </div>\n\n <div class=\"slice-panel-body\" *ngIf=\"!isCollapsed\" #slicePanelBody>\n <ng-container *ngFor=\"let slice of slices; let si = index; trackBy: trackBySliceIndex\">\n <div class=\"slice-title-row\" [attr.data-slice-index]=\"si\" (click)=\"toggleSliceCollapse(si)\">\n <span class=\"slice-title-chevron\" [class.expanded]=\"!isSliceCollapsed(si)\">\u203A</span>\n <mat-icon *ngIf=\"getSliceIcon(slice)\" class=\"slice-title-icon\">{{ getSliceIcon(slice) }}</mat-icon>\n <p class=\"slice-title\">{{ slice.title || i18n.filterBlockDefaultTitle }}</p>\n <button\n *ngIf=\"isSliceDynamic(si)\"\n type=\"button\"\n class=\"slice-remove-btn\"\n (click)=\"$event.stopPropagation(); removeDynamicSlice(si)\"\n >\u00D7</button>\n </div>\n\n <div class=\"slice-section-items\" *ngIf=\"!isSliceCollapsed(si)\">\n <ng-container *ngIf=\"isSliceLoading(si); else sliceContent\">\n <div class=\"slice-lazy-loading\">\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n <span class=\"lazy-skeleton\"></span>\n </div>\n </ng-container>\n <ng-template #sliceContent>\n <ng-container *ngFor=\"let category of slice.categories; trackBy: trackByCategoryKey\">\n <button\n *ngIf=\"sliceCategoryCount(si, category.key) > 0\"\n class=\"slice-item\"\n type=\"button\"\n [class.active]=\"isSliceCategoryActive(si, category.key)\"\n [attr.data-category-key]=\"category.key\"\n [title]=\"category.label\"\n (click)=\"onSliceCategorySelected(si, category.key)\"\n >\n <span>{{ category.label }}</span>\n <span *ngIf=\"showCounts\">{{ sliceCategoryCount(si, category.key) }}</span>\n </button>\n </ng-container>\n <div *ngIf=\"isSliceEmpty(si)\" class=\"slice-empty-state\">{{ i18n.filterEmptyState }}</div>\n </ng-template>\n </div>\n\n <hr *ngIf=\"si < slices.length - 1\" class=\"slice-divider\" />\n </ng-container>\n </div>\n </aside>\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0;box-sizing:border-box}.slice-panel-wrapper{height:100%;max-height:100%;overflow-y:auto;box-sizing:border-box}.slice-panel{margin-top:0;border:1px solid var(--jqt-border-color);border-radius:10px;background:var(--jqt-surface-color);display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden;box-sizing:border-box}.slice-panel-header{flex-shrink:0;display:flex;justify-content:flex-end;align-items:center;height:34px;padding:0 8px;margin-bottom:8px}.slice-panel-header:has(.slice-panel-title){justify-content:space-between;padding-left:12px}.slice-panel-body{flex:1 1 0;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:4px;padding:4px 10px 10px;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-panel-body::-webkit-scrollbar{width:2px}.slice-panel-body::-webkit-scrollbar-thumb{background:var(--jqt-primary-color);border-radius:4px}.slice-panel-title{margin:0;padding-top:2px;font-size:11px;font-weight:700;line-height:1;text-transform:uppercase;letter-spacing:.08em;color:var(--jqt-text-color);-webkit-user-select:none;user-select:none;align-self:center;display:inline-flex;align-items:center;gap:5px}.slice-panel-title .slice-panel-title-icon{font-size:16px;width:16px;height:16px;line-height:1;flex-shrink:0}.slice-section-items{display:flex;flex-direction:column;gap:2px;flex:0 0 auto;scrollbar-width:thin;scrollbar-color:var(--jqt-border-color) transparent}.slice-section-items::-webkit-scrollbar{width:2px}.slice-section-items .slice-empty-state{padding:8px 10px;font-size:12px;color:var(--jqt-text-muted, #9ca3af);font-style:italic;text-align:center}.slice-section-items::-webkit-scrollbar-thumb{background:var(--jqt-border-color);border-radius:4px}.slice-toggle{border:0;background:var(--jqt-surface-color);color:var(--jqt-text-color);border-radius:6px;width:22px;height:22px;padding:0;font-size:14px;text-align:center;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1}.slice-toggle-mat-icon{font-size:16px;width:16px;height:16px;line-height:1}.slice-panel.collapsed{border-color:transparent;background:transparent;overflow:visible}.slice-panel.collapsed .slice-panel-header{height:34px;padding:0;justify-content:center;align-items:center}.slice-panel.collapsed .slice-toggle{width:34px;height:34px;border:1px solid var(--jqt-border-color);background:var(--jqt-surface-color);border-radius:8px}.slice-panel.collapsed .slice-toggle:hover{border-color:var(--jqt-text-muted)}.slice-panel.collapsed .slice-toggle .slice-toggle-mat-icon{font-size:18px;width:18px;height:18px}.slice-title-row{display:flex;align-items:center;justify-content:space-between;gap:6px;margin:4px 0 6px;cursor:pointer;-webkit-user-select:none;user-select:none}.slice-title-row:hover .slice-title{color:var(--jqt-text-color)}.slice-title-row:hover .slice-title-chevron{color:var(--jqt-text-secondary)}.slice-title-row:first-of-type .slice-title{margin-top:0}.slice-title-chevron{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1;color:var(--jqt-text-muted);transition:transform .15s ease;transform:rotate(0);position:relative;top:-1px}.slice-title-chevron.expanded{transform:rotate(90deg)}.slice-title{flex:1 1 auto;margin:0;font-size:14px;font-weight:600;color:var(--jqt-title-color)}.slice-title-icon{flex-shrink:0;font-size:14px!important;width:14px!important;height:14px!important;color:var(--jqt-title-color)}.slice-remove-btn{background:none;border:none;cursor:pointer;color:var(--jqt-border-color);font-size:12px;padding:0 2px;line-height:1;flex-shrink:0;opacity:.5;transition:opacity .15s,color .15s}.slice-remove-btn:hover{color:var(--jqt-text-secondary);opacity:1}.slice-title-row:hover .slice-remove-btn{opacity:.8}.slice-item{display:flex;justify-content:space-between;align-items:center;text-align:left;width:100%;padding:5px 10px 5px 16px;background:transparent;border:0;cursor:pointer;border-radius:8px;color:var(--jqt-text-color);box-sizing:border-box;min-width:0;gap:8px}.slice-item.active{background:var(--jqt-row-hover-bg);font-weight:600}.slice-item.slice-multi{padding-left:6px}.slice-item span:first-child{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.slice-item span:last-child{flex:0 0 auto;min-width:1.2em;text-align:right}.slice-check-box{flex:0 0 16px;width:16px;height:16px;border:1.5px solid var(--jqt-text-muted);border-radius:4px;background:var(--jqt-surface-color);display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;transition:background .15s,border-color .15s}.slice-check-box.checked{background:var(--jqt-text-secondary);border-color:var(--jqt-text-secondary)}.slice-check-box.checked:after{content:\"\";display:block;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translateY(-1px)}.slice-divider{border:none;border-top:1px solid var(--jqt-border-color);margin:6px 0}.lazy-skeleton{display:block;height:12px;width:70%;border-radius:4px;background:linear-gradient(90deg,var(--jqt-border-color) 25%,var(--jqt-surface-alt-color) 50%,var(--jqt-border-color) 75%);background-size:200% 100%;animation:lazy-shimmer 1.4s ease-in-out infinite}.slice-lazy-loading{display:flex;flex-direction:column;gap:8px;padding:8px 10px}.slice-lazy-loading .lazy-skeleton{width:80%}.slice-lazy-loading .lazy-skeleton:nth-child(2){width:60%}.slice-lazy-loading .lazy-skeleton:nth-child(3){width:45%}@keyframes lazy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}\n"] }]
447
- }], propDecorators: { sliceConfigs: [{
448
- type: Input
449
- }], columns: [{
450
- type: Input
451
- }], data: [{
452
- type: Input
453
- }], lazyData: [{
454
- type: Input
455
- }], lazyStatus: [{
456
- type: Input
457
- }], showToggle: [{
458
- type: Input
459
- }], showCounts: [{
460
- type: Input
461
- }], collapsedByDefault: [{
462
- type: Input
463
- }], alwaysShow: [{
464
- type: Input
465
- }], filterChange: [{
466
- type: Output
467
- }], activeKeysChange: [{
468
- type: Output
469
- }], dynamicSliceKeysChange: [{
470
- type: Output
471
- }], collapsedChange: [{
472
- type: Output
473
- }], slicePanelBodyRef: [{
474
- type: ViewChild,
475
- args: ['slicePanelBody']
476
- }] } });
477
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktdGFibGUvc3JjL2xpYi9jb21wb25lbnQvc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUNyRCxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUMzQyxTQUFTLEVBQUUsTUFBTSxFQUNqQyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQVcsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFNUUsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUFDdkMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFVcEMsTUFBTSxPQUFPLG1CQUFtQjtJQVJoQztRQVVXLGlCQUFZLEdBQXFCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQXdCLEVBQUUsQ0FBQztRQUNsQyxTQUFJLEdBQVEsRUFBRSxDQUFDO1FBQ2YsYUFBUSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2pELGVBQVUsR0FBeUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM3RSxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsdUJBQWtC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QUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsVUFBVSxJQUFJLENBQWdCLENBQUM7WUFDekYsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTztZQUNqQixHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOytHQWhkVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw0bUJDckJoQyxpN0ZBK0RBLDBpTEQvQ1ksWUFBWSwrUEFBRSxhQUFhOzs0RkFLMUIsbUJBQW1CO2tCQVIvQixTQUFTO2lDQUNJLElBQUksWUFDTixhQUFhLFdBQ2QsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUl0QyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFc0IsaUJBQWlCO3NCQUE3QyxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTbGljZUNvbHVtbkRlZiwgU2xpY2VDb25maWcgfSBmcm9tICcuL3NsaWNlLXBhbmVsLm1vZGVsJztcbmltcG9ydCB7IEpxdEkxOG4sIEpRVF9JMThOLCBKUVRfSTE4Tl9ERUZBVUxUUyB9IGZyb20gJy4uLy4uL2pxdC1pMThuLnRva2VuJztcblxuY29uc3QgRU1QVFlfQ0FURUdPUllfS0VZID0gJ19fZW1wdHlfXyc7XG5jb25zdCBFTVBUWV9DQVRFR09SWV9MQUJFTCA9ICdWaWRlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnc2xpY2UtcGFuZWwnLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWNlLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2xpY2UtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNsaWNlUGFuZWxDb21wb25lbnQ8VCA9IGFueT4gaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgc2xpY2VDb25maWdzOiBTbGljZUNvbmZpZzxUPltdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IFNsaWNlQ29sdW1uRGVmPFQ+W10gPSBbXTtcbiAgQElucHV0KCkgZGF0YTogVFtdID0gW107XG4gIEBJbnB1dCgpIGxhenlEYXRhOiBNYXA8c3RyaW5nLCBNYXA8YW55LCBhbnk+PiA9IG5ldyBNYXAoKTtcbiAgQElucHV0KCkgbGF6eVN0YXR1czogTWFwPHN0cmluZywgJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ2xvYWRlZCcgfCAnZXJyb3InPiA9IG5ldyBNYXAoKTtcbiAgQElucHV0KCkgc2hvd1RvZ2dsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDb3VudHMgPSB0cnVlO1xuICBASW5wdXQoKSBjb2xsYXBzZWRCeURlZmF1bHQgPSBmYWxzZTtcbiAgQElucHV0KCkgYWx3YXlzU2hvdyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPChyb3c6IFQpID0+IGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBhY3RpdmVLZXlzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXVtdPigpO1xuICBAT3V0cHV0KCkgZHluYW1pY1NsaWNlS2V5c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIEBPdXRwdXQoKSBjb2xsYXBzZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQFZpZXdDaGlsZCgnc2xpY2VQYW5lbEJvZHknKSBzbGljZVBhbmVsQm9keVJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgX2NkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgX2kxOG5SYXcgPSBpbmplY3QoSlFUX0kxOE4sIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHJlYWRvbmx5IGkxOG46IEpxdEkxOG4gPSB7IC4uLkpRVF9JMThOX0RFRkFVTFRTLCAuLi4odGhpcy5faTE4blJhdyA/PyB7fSkgfTtcblxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xuICBhY3RpdmVLZXlzQnlTbGljZTogTWFwPG51bWJlciwgU2V0PHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9leHBhbmRlZFNsaWNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBfZHluYW1pY1NsaWNlczogQXJyYXk8eyBrZXk6IHN0cmluZzsgc2xpY2U6IFNsaWNlQ29uZmlnPFQ+IH0+ID0gW107XG5cbiAgLy8g4pSA4pSAIENhY2hlXG4gIF9jYWNoZWRTbGljZXM6IFNsaWNlQ29uZmlnPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBfY291bnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgcmVhZG9ubHkgdHJhY2tCeVNsaWNlSW5kZXggPSAoaW5kZXg6IG51bWJlciwgXzogYW55KTogbnVtYmVyID0+IGluZGV4O1xuICByZWFkb25seSB0cmFja0J5Q2F0ZWdvcnlLZXkgPSAoXzogbnVtYmVyLCBjYXQ6IGFueSk6IHN0cmluZyA9PiBjYXQua2V5O1xuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGVcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gdGhpcy5jb2xsYXBzZWRCeURlZmF1bHQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NsaWNlQ29uZmlncyddIHx8IGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snbGF6eURhdGEnXSB8fCBjaGFuZ2VzWydsYXp5U3RhdHVzJ10pIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hEeW5hbWljU2xpY2VzKCk7XG4gICAgICB0aGlzLl9yZWJ1aWxkQ2FjaGUoKTtcbiAgICAgIGNvbnN0IHNob3VsZFJlZW1pdEZpbHRlciA9ICEhKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10gfHwgY2hhbmdlc1snbGF6eURhdGEnXSB8fCBjaGFuZ2VzWydsYXp5U3RhdHVzJ10pO1xuICAgICAgY29uc3QgaGFzQWN0aXZlRmlsdGVycyA9IFsuLi50aGlzLmFjdGl2ZUtleXNCeVNsaWNlLnZhbHVlcygpXS5zb21lKHMgPT4gcy5zaXplID4gMCk7XG4gICAgICBpZiAoaGFzQWN0aXZlRmlsdGVycyAmJiBzaG91bGRSZWVtaXRGaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdEZpbHRlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21wdXRlZFxuXG4gIGdldCBzaG93UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzQ2ZnID0gKHRoaXMuc2xpY2VDb25maWdzIHx8IFtdKS5sZW5ndGggPiAwIHx8IHRoaXMuX2R5bmFtaWNTbGljZXMubGVuZ3RoID4gMDtcbiAgICBpZiAodGhpcy5hbHdheXNTaG93KSByZXR1cm4gaGFzQ2ZnO1xuICAgIHJldHVybiBoYXNDZmcgJiYgKHRoaXMuZGF0YT8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIGdldCBzbGljZXMoKTogU2xpY2VDb25maWc8VD5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFNsaWNlcztcbiAgfVxuXG4gIGdldCBzdGF0aWNTbGljZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHN0YXRpY1NsaWNlc0Zvck1lbnUoKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdGl0bGU6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSlcbiAgICAgIC5maWx0ZXIoKHMpID0+ICEhcy5jb2x1bW5LZXkpXG4gICAgICAubWFwKChzKSA9PiAoeyBrZXk6IHMuY29sdW1uS2V5ISwgdGl0bGU6IHMudGl0bGUgfHwgcy5jb2x1bW5LZXkhIH0pKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVEeW5hbWljU2xpY2VDb2x1bW5zKCk6IFNsaWNlQ29sdW1uRGVmPFQ+W10ge1xuICAgIHJldHVybiB0aGlzLl9keW5hbWljU2xpY2VzXG4gICAgICAubWFwKChkKSA9PiAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKChjKSA9PiBjLmtleSA9PT0gZC5rZXkpKVxuICAgICAgLmZpbHRlcigoYyk6IGMgaXMgU2xpY2VDb2x1bW5EZWY8VD4gPT4gISFjKTtcbiAgfVxuXG4gIGdldCBhdmFpbGFibGVDb2x1bW5zRm9yRHluYW1pY1NsaWNlKCk6IFNsaWNlQ29sdW1uRGVmPFQ+W10ge1xuICAgIGNvbnN0IGR5bmFtaWNLZXlzID0gbmV3IFNldCh0aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5rZXkpKTtcbiAgICBjb25zdCBzdGF0aWNLZXlzID0gbmV3IFNldChcbiAgICAgICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSkubWFwKChzKSA9PiBzLmNvbHVtbktleSkuZmlsdGVyKChrKTogayBpcyBzdHJpbmcgPT4gISFrKVxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChbLi4uZHluYW1pY0tleXMsIC4uLnN0YXRpY0tleXNdKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgcmV0dXJuICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoYykgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nS2V5cy5oYXMoYy5rZXkpIHx8IHNlZW4uaGFzKGMua2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgc2Vlbi5hZGQoYy5rZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgYWN0aXZlU2xpY2VCeUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhdGljQWN0aXZlQ291bnQgPSAodGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCB0b3RhbCA9IHN0YXRpY0FjdGl2ZUNvdW50ICsgdGhpcy5fZHluYW1pY1NsaWNlcy5sZW5ndGg7XG4gICAgaWYgKHRvdGFsID09PSAwKSByZXR1cm4gJ0F1Y3VuJztcbiAgICBpZiAodG90YWwgPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gKHRoaXMuc2xpY2VDb25maWdzIHx8IFtdKVswXTtcbiAgICAgIGlmIChmaXJzdCkgcmV0dXJuIGZpcnN0LnRpdGxlIHx8IGZpcnN0LmNvbHVtbktleSB8fCAnMSc7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVEeW5hbWljU2xpY2VDb2x1bW5zWzBdPy5oZWFkZXIgfHwgJzEnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dG90YWx9IGFjdGlmc2A7XG4gIH1cblxuICAvLyDilIDilIAgVUkgc3RhdGVcblxuICBpc1NsaWNlQ29sbGFwc2VkKHNsaWNlSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZWRTbGljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKC0xIC0gc2xpY2VJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiAhdGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKHNsaWNlSW5kZXgpO1xuICB9XG5cbiAgdG9nZ2xlU2xpY2VDb2xsYXBzZShzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zbGljZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjbG9zZWRLZXkgPSAtMSAtIHNsaWNlSW5kZXg7XG4gICAgICBpZiAodGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKGNsb3NlZEtleSkpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kZWRTbGljZXMuZGVsZXRlKGNsb3NlZEtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9leHBhbmRlZFNsaWNlcy5hZGQoY2xvc2VkS2V5KTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsU2xpY2VUaXRsZUludG9WaWV3KHNsaWNlSW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5fZXhwYW5kZWRTbGljZXMuaGFzKHNsaWNlSW5kZXgpKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmRlbGV0ZShzbGljZUluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2V4cGFuZGVkU2xpY2VzLmFkZChzbGljZUluZGV4KTtcbiAgICAgICAgdGhpcy5fc2Nyb2xsU2xpY2VUaXRsZUludG9WaWV3KHNsaWNlSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICB0b2dnbGVQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5jb2xsYXBzZWRDaGFuZ2UuZW1pdCh0aGlzLmlzQ29sbGFwc2VkKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpc1NsaWNlRHluYW1pYyhzbGljZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2xpY2VJbmRleCA+PSB0aGlzLnN0YXRpY1NsaWNlQ291bnQ7XG4gIH1cblxuICBpc1NsaWNlTG9hZGluZyhzbGljZUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGF0aWNTbGljZSA9ICh0aGlzLnNsaWNlQ29uZmlncyB8fCBbXSlbc2xpY2VJbmRleF07XG4gICAgaWYgKHN0YXRpY1NsaWNlPy5jb2x1bW5LZXkpIHtcbiAgICAgIGNvbnN0IGNvbERlZiA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0gc3RhdGljU2xpY2UuY29sdW1uS2V5KTtcbiAgICAgIGlmIChjb2xEZWY/LmxhenkpIHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5sYXp5U3RhdHVzLmdldChzdGF0aWNTbGljZS5jb2x1bW5LZXkhKSA/PyAnaWRsZSc7XG4gICAgICAgIHJldHVybiBzdGF0dXMgPT09ICdsb2FkaW5nJyB8fCBzdGF0dXMgPT09ICdpZGxlJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0RHluYW1pY1NsaWNlQ29sdW1uS2V5KHNsaWNlSW5kZXgpO1xuICAgIGlmICgha2V5KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29sRGVmID0gKHRoaXMuY29sdW1ucyB8fCBbXSkuZmluZChjID0+IGMua2V5ID09PSBrZXkpO1xuICAgIGlmICghY29sRGVmPy5sYXp5KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5sYXp5U3RhdHVzLmdldChrZXkpID8/ICdpZGxlJztcbiAgICByZXR1cm4gc3RhdHVzID09PSAnbG9hZGluZycgfHwgc3RhdHVzID09PSAnaWRsZSc7XG4gIH1cblxuICBpc1N0YXRpY1NsaWNlVmlzaWJsZShfY29sdW1uS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRvZ2dsZVN0YXRpY1NsaWNlKF9jb2x1bW5LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIETDqWzDqWd1w6kgw6AgdGFibGUuY29tcG9uZW50IHZpYSBfc3RhdGljU2xpY2VIaWRkZW5LZXlzIOKAlCBuZSByaWVuIGZhaXJlIGljaS5cbiAgfVxuXG4gIC8vIOKUgOKUgCBTZWxlY3Rpb25cbiAgZ2V0U2xpY2VJY29uKHNsaWNlOiBTbGljZUNvbmZpZzxUPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHNsaWNlLmljb24pIHJldHVybiBzbGljZS5pY29uO1xuICAgIGlmIChzbGljZS5jb2x1bW5LZXkpIHtcbiAgICAgIHJldHVybiAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IHNsaWNlLmNvbHVtbktleSk/Lmljb247XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaXNTbGljZUNhdGVnb3J5QWN0aXZlKHNsaWNlSW5kZXg6IG51bWJlciwgY2F0ZWdvcnlLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KT8uaGFzKGNhdGVnb3J5S2V5KSA/PyBmYWxzZTtcbiAgfVxuXG4gIGlzU2xpY2VBbGxBY3RpdmUoc2xpY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmhhcyhzbGljZUluZGV4KSB8fCB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KSEuc2l6ZSA9PT0gMDtcbiAgfVxuXG4gIHNsaWNlQ2F0ZWdvcnlDb3VudChzbGljZUluZGV4OiBudW1iZXIsIGNhdGVnb3J5S2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7c2xpY2VJbmRleH06JHtjYXRlZ29yeUtleX1gO1xuICAgIGlmICh0aGlzLl9jb3VudENhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3VudENhY2hlLmdldChjYWNoZUtleSkhO1xuICAgIH1cbiAgICBjb25zdCBzbGljZSA9IHRoaXMuX2NhY2hlZFNsaWNlc1tzbGljZUluZGV4XTtcbiAgICBpZiAoIXNsaWNlKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXRlZ29yeSA9IChzbGljZS5jYXRlZ29yaWVzIHx8IFtdKS5maW5kKChjKSA9PiBjLmtleSA9PT0gY2F0ZWdvcnlLZXkpO1xuICAgIGNvbnN0IGNvdW50ID0gY2F0ZWdvcnkgPyAodGhpcy5kYXRhIHx8IFtdKS5maWx0ZXIoKHJvdykgPT4gY2F0ZWdvcnkuZmlsdGVyKHJvdykpLmxlbmd0aCA6IDA7XG4gICAgdGhpcy5fY291bnRDYWNoZS5zZXQoY2FjaGVLZXksIGNvdW50KTtcbiAgICByZXR1cm4gY291bnQ7XG4gIH1cblxuICBpc1NsaWNlRW1wdHkoc2xpY2VJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLl9jYWNoZWRTbGljZXNbc2xpY2VJbmRleF07XG4gICAgaWYgKCFzbGljZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIChzbGljZS5jYXRlZ29yaWVzIHx8IFtdKS5ldmVyeShjID0+IHRoaXMuc2xpY2VDYXRlZ29yeUNvdW50KHNsaWNlSW5kZXgsIGMua2V5KSA9PT0gMCk7XG4gIH1cblxuICBvblNsaWNlQ2F0ZWdvcnlTZWxlY3RlZChzbGljZUluZGV4OiBudW1iZXIsIGNhdGVnb3J5S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzbGljZSA9IHRoaXMuc2xpY2VzW3NsaWNlSW5kZXhdO1xuICAgIGlmICghc2xpY2UpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuYWN0aXZlS2V5c0J5U2xpY2UuaGFzKHNsaWNlSW5kZXgpKSB7XG4gICAgICB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLnNldChzbGljZUluZGV4LCBuZXcgU2V0KCkpO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCkhO1xuICAgIGlmIChzbGljZS5tdWx0aVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChhY3RpdmVLZXlzLmhhcyhjYXRlZ29yeUtleSkpIHtcbiAgICAgICAgYWN0aXZlS2V5cy5jbGVhcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlS2V5cy5jbGVhcigpO1xuICAgICAgICBhY3RpdmVLZXlzLmFkZChjYXRlZ29yeUtleSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhY3RpdmVLZXlzLmhhcyhjYXRlZ29yeUtleSkpIHtcbiAgICAgICAgYWN0aXZlS2V5cy5kZWxldGUoY2F0ZWdvcnlLZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlS2V5cy5hZGQoY2F0ZWdvcnlLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbWl0RmlsdGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25TbGljZUFsbFNlbGVjdGVkKHNsaWNlSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZUtleXNCeVNsaWNlLmhhcyhzbGljZUluZGV4KSkge1xuICAgICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoc2xpY2VJbmRleCkhLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogUmV0b3VybmUgbCfDqXRhdCBkZXMgZmlsdHJlcyBhY3RpZnMgc291cyBmb3JtZSBzw6lyaWFsaXNhYmxlIChzbGljZUluZGV4IOKGkiB0YWJsZWF1IGRlIGNsw6lzKS5cbiAgICogSW5jbHV0IGxlcyBzbGljZXMgc2FucyBzw6lsZWN0aW9uICh0YWJsZWF1IHZpZGUpIHBvdXIgZGlzdGluZ3VlciBcImF1Y3VuZSB0cmFuY2hlIHPDqWxlY3Rpb25uw6llXCJcbiAgICogKD0gZmlsdHJlIG91dmVydCwgcmllbiBjb2Now6kpIGRlIFwic2xpY2UgYWJzZW50ZVwiLiAqL1xuICBnZXRBY3RpdmVGaWx0ZXJzKCk6IFJlY29yZDxudW1iZXIsIHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmdbXT4gPSB7fTtcbiAgICB0aGlzLl9jYWNoZWRTbGljZXMuZm9yRWFjaCgoXywgaWR4KSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5nZXQoaWR4KTtcbiAgICAgIHJlc3VsdFtpZHhdID0ga2V5cyA/IFsuLi5rZXlzXSA6IFtdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogUmVzdGF1cmUgbGVzIGZpbHRyZXMgYWN0aWZzIGRlcHVpcyB1biBzbmFwc2hvdCBzw6lyaWFsaXPDqSBldCByw6nDqW1ldCBsZSBmaWx0cmUuICovXG4gIHJlc3RvcmVGaWx0ZXJzKGZpbHRlcnM6IFJlY29yZDxudW1iZXIsIHN0cmluZ1tdPik6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlS2V5c0J5U2xpY2UgPSBuZXcgTWFwKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZmlsdGVycykubWFwKChbaWR4LCBrZXlzXSkgPT4gW051bWJlcihpZHgpLCBuZXcgU2V0KGtleXMpXSlcbiAgICApO1xuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyDilIDilIAgRHluYW1pYyBzbGljZSBtYW5hZ2VtZW50XG5cbiAgYWRkRHluYW1pY1NsaWNlKGNvbHVtbjogU2xpY2VDb2x1bW5EZWY8VD4pOiB2b2lkIHtcbiAgICBjb25zdCBkaXN0aW5jdFZhbHVlcyA9IHRoaXMuX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBuZXdTbGljZTogU2xpY2VDb25maWc8VD4gPSB7XG4gICAgICB0aXRsZTogY29sdW1uLmhlYWRlcixcbiAgICAgIGNvbHVtbktleTogY29sdW1uLmtleSxcbiAgICAgIGNhdGVnb3JpZXM6IGRpc3RpbmN0VmFsdWVzLm1hcCgodikgPT4gdGhpcy5fYnVpbGRDYXRlZ29yeUZyb21WYWx1ZShjb2x1bW4ua2V5LCB2KSksXG4gICAgfTtcbiAgICB0aGlzLl9keW5hbWljU2xpY2VzID0gWy4uLnRoaXMuX2R5bmFtaWNTbGljZXMsIHsga2V5OiBjb2x1bW4ua2V5LCBzbGljZTogbmV3U2xpY2UgfV07XG4gICAgdGhpcy5fcmVidWlsZENhY2hlKCk7XG4gICAgdGhpcy5keW5hbWljU2xpY2VLZXlzQ2hhbmdlLmVtaXQodGhpcy5fZHluYW1pY1NsaWNlcy5tYXAoZCA9PiBkLmtleSkpO1xuICAgIHRoaXMuX2VtaXRGaWx0ZXIoKTtcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZW1vdmVEeW5hbWljU2xpY2Uoc2xpY2VJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZHluYW1pY0luZGV4ID0gc2xpY2VJbmRleCAtIHRoaXMuc3RhdGljU2xpY2VDb3VudDtcbiAgICBpZiAoZHluYW1pY0luZGV4IDwgMCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0FjdGl2ZUtleXMgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XG4gICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZS5mb3JFYWNoKChrZXlzLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPCBzbGljZUluZGV4KSBuZXdBY3RpdmVLZXlzLnNldChpZHgsIGtleXMpO1xuICAgICAgZWxzZSBpZiAoaWR4ID4gc2xpY2VJbmRleCkgbmV3QWN0aXZlS2V5cy5zZXQoaWR4IC0gMSwga2V5cyk7XG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZSA9IG5ld0FjdGl2ZUtleXM7XG4gICAgdGhpcy5fZHluYW1pY1NsaWNlcyA9IHRoaXMuX2R5bmFtaWNTbGljZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBkeW5hbWljSW5kZXgpO1xuICAgIHRoaXMuX3JlYnVpbGRDYWNoZSgpO1xuICAgIHRoaXMuZHluYW1pY1NsaWNlS2V5c0NoYW5nZS5lbWl0KHRoaXMuX2R5bmFtaWNTbGljZXMubWFwKGQgPT4gZC5rZXkpKTtcbiAgICB0aGlzLl9lbWl0RmlsdGVyKCk7XG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVtb3ZlRHluYW1pY1NsaWNlQnlLZXkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkeW5hbWljSW5kZXggPSB0aGlzLl9keW5hbWljU2xpY2VzLmZpbmRJbmRleCgoZCkgPT4gZC5rZXkgPT09IGtleSk7XG4gICAgaWYgKGR5bmFtaWNJbmRleCA8IDApIHJldHVybjtcbiAgICBjb25zdCBzbGljZUluZGV4ID0gdGhpcy5zdGF0aWNTbGljZUNvdW50ICsgZHluYW1pY0luZGV4O1xuICAgIHRoaXMucmVtb3ZlRHluYW1pY1NsaWNlKHNsaWNlSW5kZXgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByaXZhdGUgaGVscGVyc1xuXG4gIHByaXZhdGUgX2VtaXRGaWx0ZXIoKTogdm9pZCB7XG4gICAgY29uc3Qgc2xpY2VzID0gdGhpcy5zbGljZXM7XG4gICAgY29uc3QgYWN0aXZlS2V5c0J5U2xpY2UgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlO1xuXG4gICAgdGhpcy5hY3RpdmVLZXlzQ2hhbmdlLmVtaXQoXG4gICAgICBzbGljZXMubWFwKChfLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhY3RpdmVLZXlzQnlTbGljZS5nZXQoaSk7XG4gICAgICAgIHJldHVybiBrZXlzID8gWy4uLmtleXNdIDogW107XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBwcmVkID0gKHJvdzogVCk6IGJvb2xlYW4gPT5cbiAgICAgIHNsaWNlcy5ldmVyeSgoc2xpY2UsIHNsaWNlSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlS2V5cyA9IGFjdGl2ZUtleXNCeVNsaWNlLmdldChzbGljZUluZGV4KTtcbiAgICAgICAgaWYgKCFhY3RpdmVLZXlzIHx8IGFjdGl2ZUtleXMuc2l6ZSA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBbLi4uYWN0aXZlS2V5c10uc29tZSgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnkgPSAoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkuZmluZCgoYykgPT4gYy5rZXkgPT09IGtleSk7XG4gICAgICAgICAgaWYgKCFjYXRlZ29yeSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIFNpIHBhcyBkZSBmaWx0ZXIgZMOpZmluaSAodXNhZ2UgY2hhcnQpLCBvbiBuZSBmaWx0cmUgcGFzIGVuIG3DqW1vaXJlXG4gICAgICAgICAgaWYgKCFjYXRlZ29yeT8uZmlsdGVyKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gY2F0ZWdvcnkuZmlsdGVyKHJvdyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdChwcmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldER5bmFtaWNTbGljZUNvbHVtbktleShzbGljZUluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkeW5hbWljSW5kZXggPSBzbGljZUluZGV4IC0gdGhpcy5zdGF0aWNTbGljZUNvdW50O1xuICAgIHJldHVybiB0aGlzLl9keW5hbWljU2xpY2VzW2R5bmFtaWNJbmRleF0/LmtleSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U2xpY2VJZGVudGl0eShzbGljZTogU2xpY2VDb25maWc8VD4sIGZhbGxiYWNrSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHNsaWNlLmNvbHVtbktleSkge1xuICAgICAgcmV0dXJuIGBjb2x1bW46JHtzbGljZS5jb2x1bW5LZXl9YDtcbiAgICB9XG4gICAgaWYgKHNsaWNlLnRpdGxlKSB7XG4gICAgICByZXR1cm4gYHRpdGxlOiR7c2xpY2UudGl0bGV9YDtcbiAgICB9XG4gICAgY29uc3QgY2F0ZWdvcnlLZXlzID0gKHNsaWNlLmNhdGVnb3JpZXMgfHwgW10pLm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LmtleSkuam9pbignfCcpO1xuICAgIHJldHVybiBgaW5kZXg6JHtmYWxsYmFja0luZGV4fXxjYXRlZ29yaWVzOiR7Y2F0ZWdvcnlLZXlzfWA7XG4gIH1cblxuICBwcml2YXRlIF9tYXRlcmlhbGl6ZVNsaWNlKHNsaWNlOiBTbGljZUNvbmZpZzxUPik6IFNsaWNlQ29uZmlnPFQ+IHtcbiAgICBpZiAoIXNsaWNlLmNvbHVtbktleSB8fCAoc2xpY2UuY2F0ZWdvcmllcyAmJiBzbGljZS5jYXRlZ29yaWVzLmxlbmd0aCA+IDApKSB7XG4gICAgICByZXR1cm4gc2xpY2U7XG4gICAgfVxuICAgIGNvbnN0IGNvbCA9ICh0aGlzLmNvbHVtbnMgfHwgW10pLmZpbmQoYyA9PiBjLmtleSA9PT0gc2xpY2UuY29sdW1uS2V5KTtcbiAgICBjb25zdCBpc0xhenkgPSAhIWNvbD8ubGF6eTtcbiAgICBpZiAoaXNMYXp5ICYmIHRoaXMubGF6eVN0YXR1cy5nZXQoc2xpY2UuY29sdW1uS2V5ISkgIT09ICdsb2FkZWQnKSB7XG4gICAgICByZXR1cm4geyAuLi5zbGljZSwgY2F0ZWdvcmllczogW10gfTtcbiAgICB9XG4gICAgaWYgKHNsaWNlLmJ1Y2tldCkge1xuICAgICAgY29uc3QgZGlzdGluY3RWYWx1ZXMgPSBbLi4ubmV3IFNldCgodGhpcy5kYXRhIHx8IFtdKS5tYXAoc2xpY2UuYnVja2V0KSldLnNvcnQoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNsaWNlLFxuICAgICAgICBjYXRlZ29yaWVzOiBkaXN0aW5jdFZhbHVlcy5tYXAoKHYpID0+ICh7XG4gICAgICAgICAga2V5OiB2LFxuICAgICAgICAgIGxhYmVsOiB2LFxuICAgICAgICAgIGZpbHRlcjogKHJvdzogVCkgPT4gc2xpY2UuYnVja2V0IShyb3cpID09PSB2LFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBkaXN0aW5jdFZhbHVlcyA9IHRoaXMuX2NvbXB1dGVEaXN0aW5jdFZhbHVlcyhzbGljZS5jb2x1bW5LZXkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2xpY2UsXG4gICAgICBjYXRlZ29yaWVzOiBkaXN0aW5jdFZhbHVlcy5tYXAoKHYpID0+IHRoaXMuX2J1aWxkQ2F0ZWdvcnlGcm9tVmFsdWUoc2xpY2UuY29sdW1uS2V5ISwgdikpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9idWlsZENhdGVnb3J5RnJvbVZhbHVlKGNvbHVtbktleTogc3RyaW5nLCB2OiBzdHJpbmcpOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBmaWx0ZXI6IChyb3c6IFQpID0+IGJvb2xlYW4gfSB7XG4gICAgaWYgKHYgPT09IEVNUFRZX0NBVEVHT1JZX0tFWSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBFTVBUWV9DQVRFR09SWV9LRVksXG4gICAgICAgIGxhYmVsOiBFTVBUWV9DQVRFR09SWV9MQUJFTCxcbiAgICAgICAgZmlsdGVyOiAocm93OiBUKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5fZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5LCByb3cpO1xuICAgICAgICAgIHJldHVybiB2YWwgPT0gbnVsbCB8fCB2YWwgPT09ICcnO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogdixcbiAgICAgIGxhYmVsOiB2LFxuICAgICAgZmlsdGVyOiAocm93OiBUKSA9PiBTdHJpbmcodGhpcy5fZ2V0TGF6eUF3YXJlVmFsdWUoY29sdW1uS2V5LCByb3cpID8/ICcnKSA9PT0gdixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcHV0ZURpc3RpbmN0VmFsdWVzKGNvbHVtbktleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJhd1ZhbHVlcyA9ICh0aGlzLmRhdGEgfHwgW10pLm1hcCgocm93KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLl9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXksIHJvdyk7XG4gICAgICByZXR1cm4gdmFsICE9IG51bGwgJiYgdmFsICE9PSAnJyA/IFN0cmluZyh2YWwpIDogbnVsbDtcbiAgICB9KTtcbiAgICBjb25zdCBkaXN0aW5jdCA9IFsuLi5uZXcgU2V0KHJhd1ZhbHVlcy5maWx0ZXIoKHYpOiB2IGlzIHN0cmluZyA9PiB2ICE9PSBudWxsKSldLnNvcnQoKTtcbiAgICBpZiAocmF3VmFsdWVzLnNvbWUodiA9PiB2ID09PSBudWxsKSkge1xuICAgICAgZGlzdGluY3QucHVzaChFTVBUWV9DQVRFR09SWV9LRVkpO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGluY3Q7XG4gIH1cblxuICBwcml2YXRlIF9nZXRMYXp5QXdhcmVWYWx1ZShjb2x1bW5LZXk6IHN0cmluZywgcm93OiBUKTogYW55IHtcbiAgICBjb25zdCBjb2xEZWYgPSAodGhpcy5jb2x1bW5zIHx8IFtdKS5maW5kKGMgPT4gYy5rZXkgPT09IGNvbHVtbktleSk7XG4gICAgaWYgKGNvbERlZj8ubGF6eSkge1xuICAgICAgcmV0dXJuIHRoaXMubGF6eURhdGEuZ2V0KGNvbHVtbktleSk/LmdldChyb3cpID8/IG51bGw7XG4gICAgfVxuICAgIGlmIChjb2xEZWY/LnZhbHVlKSB7XG4gICAgICByZXR1cm4gY29sRGVmLnZhbHVlKHJvdywgMCk7XG4gICAgfVxuICAgIHJldHVybiAocm93IGFzIGFueSlbY29sdW1uS2V5XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYnVpbGRDYWNoZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1NsaWNlcyA9IHRoaXMuX2NhY2hlZFNsaWNlcztcbiAgICBjb25zdCBwcmV2aW91c0FjdGl2ZUtleXMgPSB0aGlzLmFjdGl2ZUtleXNCeVNsaWNlO1xuICAgIGNvbnN0IGFsbFNsaWNlcyA9IFsuLi4odGhpcy5zbGljZUNvbmZpZ3MgfHwgW10pLCAuLi50aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoZCkgPT4gZC5zbGljZSldO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcyA9IGFsbFNsaWNlcy5tYXAoKHNsaWNlKSA9PiB0aGlzLl9tYXRlcmlhbGl6ZVNsaWNlKHNsaWNlKSk7XG5cbiAgICBjb25zdCBwcmV2aW91c0tleXNCeUlkZW50aXR5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgIHByZXZpb3VzU2xpY2VzLmZvckVhY2goKHNsaWNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlS2V5cyA9IHByZXZpb3VzQWN0aXZlS2V5cy5nZXQoaW5kZXgpO1xuICAgICAgaWYgKCFhY3RpdmVLZXlzIHx8IGFjdGl2ZUtleXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgICAgcHJldmlvdXNLZXlzQnlJZGVudGl0eS5zZXQodGhpcy5fZ2V0U2xpY2VJZGVudGl0eShzbGljZSwgaW5kZXgpLCBuZXcgU2V0KGFjdGl2ZUtleXMpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IG5leHRBY3RpdmVLZXlzID0gbmV3IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PigpO1xuICAgIHRoaXMuX2NhY2hlZFNsaWNlcy5mb3JFYWNoKChzbGljZSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHByZXZpb3VzS2V5cyA9IHByZXZpb3VzS2V5c0J5SWRlbnRpdHkuZ2V0KHRoaXMuX2dldFNsaWNlSWRlbnRpdHkoc2xpY2UsIGluZGV4KSk7XG4gICAgICBpZiAoIXByZXZpb3VzS2V5cyB8fCBwcmV2aW91c0tleXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhdmFpbGFibGVLZXlzID0gbmV3IFNldCgoc2xpY2UuY2F0ZWdvcmllcyB8fCBbXSkubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkua2V5KSk7XG4gICAgICBjb25zdCBtYXRjaGluZ0tleXMgPSBbLi4ucHJldmlvdXNLZXlzXS5maWx0ZXIoKGtleSkgPT4gYXZhaWxhYmxlS2V5cy5oYXMoa2V5KSk7XG4gICAgICBpZiAobWF0Y2hpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV4dEFjdGl2ZUtleXMuc2V0KGluZGV4LCBuZXcgU2V0KG1hdGNoaW5nS2V5cykpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hY3RpdmVLZXlzQnlTbGljZSA9IG5leHRBY3RpdmVLZXlzO1xuICAgIHRoaXMuX2NvdW50Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hEeW5hbWljU2xpY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2R5bmFtaWNTbGljZXMgPSB0aGlzLl9keW5hbWljU2xpY2VzLm1hcCgoeyBrZXksIHNsaWNlIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpc3RpbmN0VmFsdWVzID0gdGhpcy5fY29tcHV0ZURpc3RpbmN0VmFsdWVzKGtleSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXksXG4gICAgICAgIHNsaWNlOiB7XG4gICAgICAgICAgLi4uc2xpY2UsXG4gICAgICAgICAgY2F0ZWdvcmllczogZGlzdGluY3RWYWx1ZXMubWFwKCh2KSA9PiB0aGlzLl9idWlsZENhdGVnb3J5RnJvbVZhbHVlKGtleSwgdikpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Njcm9sbFNsaWNlVGl0bGVJbnRvVmlldyhzbGljZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuc2xpY2VQYW5lbEJvZHlSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgY29uc3Qgcm93ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXNsaWNlLWluZGV4PVwiJHtzbGljZUluZGV4fVwiXWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKCFyb3cpIHJldHVybjtcbiAgICAgIHJvdy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9LCAwKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNsaWNlLXBhbmVsLXdyYXBwZXJcIiBbY2xhc3MuY29sbGFwc2VkXT1cImlzQ29sbGFwc2VkXCI+XG4gIDxhc2lkZSBjbGFzcz1cInNsaWNlLXBhbmVsXCIgW2NsYXNzLmNvbGxhcHNlZF09XCJpc0NvbGxhcHNlZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzbGljZS1wYW5lbC1oZWFkZXJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ29sbGFwc2VkXCIgY2xhc3M9XCJzbGljZS1wYW5lbC10aXRsZVwiPlxuICAgICAgICB7eyBpMThuLmZpbHRlclBhbmVsVGl0bGUoc2xpY2VzLmxlbmd0aCkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJzaG93VG9nZ2xlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic2xpY2UtdG9nZ2xlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc0NvbGxhcHNlZCA/IGkxOG4uZXhwYW5kRmlsdGVyVGl0bGUgOiBpMThuLmNvbGxhcHNlRmlsdGVyVGl0bGVcIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNsaWNlLXRvZ2dsZS1tYXQtaWNvblwiPnt7IGlzQ29sbGFwc2VkID8gJ2ZpbHRlcl9saXN0JyA6ICdmaWx0ZXJfbGlzdF9vZmYnIH19PC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNsaWNlLXBhbmVsLWJvZHlcIiAqbmdJZj1cIiFpc0NvbGxhcHNlZFwiICNzbGljZVBhbmVsQm9keT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNsaWNlIG9mIHNsaWNlczsgbGV0IHNpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlTbGljZUluZGV4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbGljZS10aXRsZS1yb3dcIiBbYXR0ci5kYXRhLXNsaWNlLWluZGV4XT1cInNpXCIgKGNsaWNrKT1cInRvZ2dsZVNsaWNlQ29sbGFwc2Uoc2kpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbGljZS10aXRsZS1jaGV2cm9uXCIgW2NsYXNzLmV4cGFuZGVkXT1cIiFpc1NsaWNlQ29sbGFwc2VkKHNpKVwiPuKAujwvc3Bhbj5cbiAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJnZXRTbGljZUljb24oc2xpY2UpXCIgY2xhc3M9XCJzbGljZS10aXRsZS1pY29uXCI+e3sgZ2V0U2xpY2VJY29uKHNsaWNlKSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgPHAgY2xhc3M9XCJzbGljZS10aXRsZVwiPnt7IHNsaWNlLnRpdGxlIHx8IGkxOG4uZmlsdGVyQmxvY2tEZWZhdWx0VGl0bGUgfX08L3A+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJpc1NsaWNlRHluYW1pYyhzaSlcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInNsaWNlLXJlbW92ZS1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcmVtb3ZlRHluYW1pY1NsaWNlKHNpKVwiXG4gICAgICAgICAgPsOXPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbGljZS1zZWN0aW9uLWl0ZW1zXCIgKm5nSWY9XCIhaXNTbGljZUNvbGxhcHNlZChzaSlcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTbGljZUxvYWRpbmcoc2kpOyBlbHNlIHNsaWNlQ29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWNlLWxhenktbG9hZGluZ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhenktc2tlbGV0b25cIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGF6eS1za2VsZXRvblwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYXp5LXNrZWxldG9uXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzbGljZUNvbnRlbnQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBzbGljZS5jYXRlZ29yaWVzOyB0cmFja0J5OiB0cmFja0J5Q2F0ZWdvcnlLZXlcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2xpY2VDYXRlZ29yeUNvdW50KHNpLCBjYXRlZ29yeS5rZXkpID4gMFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbGljZS1pdGVtXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzU2xpY2VDYXRlZ29yeUFjdGl2ZShzaSwgY2F0ZWdvcnkua2V5KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jYXRlZ29yeS1rZXldPVwiY2F0ZWdvcnkua2V5XCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiY2F0ZWdvcnkubGFiZWxcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNsaWNlQ2F0ZWdvcnlTZWxlY3RlZChzaSwgY2F0ZWdvcnkua2V5KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBjYXRlZ29yeS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dDb3VudHNcIj57eyBzbGljZUNhdGVnb3J5Q291bnQoc2ksIGNhdGVnb3J5LmtleSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNTbGljZUVtcHR5KHNpKVwiIGNsYXNzPVwic2xpY2UtZW1wdHktc3RhdGVcIj57eyBpMThuLmZpbHRlckVtcHR5U3RhdGUgfX08L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aHIgKm5nSWY9XCJzaSA8IHNsaWNlcy5sZW5ndGggLSAxXCIgY2xhc3M9XCJzbGljZS1kaXZpZGVyXCIgLz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2FzaWRlPlxuPC9kaXY+XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtcGFuZWwubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS10YWJsZS9zcmMvbGliL2NvbXBvbmVudC9zbGljZS1wYW5lbC9zbGljZS1wYW5lbC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVByb3ZpZGVyIH0gZnJvbSAnQG9uZXRlbWUvanF1ZXJ5LWNvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKiogVW5lIGNhdMOpZ29yaWUgY2xpcXVhYmxlIGRhbnMgdW4gc2xpY2UgKGV4OiBcIkVuIGNvdXJzXCIsIFwiVGVybWluw6lcIikuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsaWNlQ2F0ZWdvcnk8VCA9IGFueT4ge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFByw6lkaWNhdCBkZSBmaWx0cmFnZSBlbiBtw6ltb2lyZSDigJQgKipvcHRpb25uZWwqKi5cbiAgICpcbiAgICogLSAqKlRhYmxlYXUqKiA6IHJlcXVpcy4gTGUgc2xpY2UtcGFuZWwgYXBwbGlxdWUgY2UgcHLDqWRpY2F0IHN1ciBsZXMgbGlnbmVzIGxvY2FsZXMuXG4gICAqIC0gKipHcmFwaGlxdWUqKiA6IG9taXMuIExlIHBhcmVudCDDqWNvdXRlIGAoYWN0aXZlS2V5c0NoYW5nZSlgIHBvdXIgZMOpY2xlbmNoZXJcbiAgICogICB1bmUgbm91dmVsbGUgcmVxdcOqdGUgQVBJIGF2ZWMgbGVzIGNsw6lzIHPDqWxlY3Rpb25uw6llcy5cbiAgICpcbiAgICogU2kgYGZpbHRlcmAgZXN0IGFic2VudCwgbGEgc8OpbGVjdGlvbiBuJ2EgYXVjdW4gZWZmZXQgc3VyIGxlcyBkb25uw6llcyBsb2NhbGVzIDtcbiAgICogYydlc3QgYXUgY29tcG9zYW50IHBhcmVudCBkZSByw6lhZ2lyIHZpYSBgKGFjdGl2ZUtleXNDaGFuZ2UpYC5cbiAgICovXG4gIGZpbHRlcj86IChyb3c6IFQpID0+IGJvb2xlYW47XG59XG5cbi8qKlxuICogR3JvdXBlIGRlIGZpbHRyZXMgYWZmaWNow6kgZGFucyBsZSBwYW5uZWF1IGxhdMOpcmFsLlxuICpcbiAqICoqTW9kZSBjb2xvbm5lKiogKGBjb2x1bW5LZXlgKSA6IGxlIHNsaWNlIGxpdCBhdXRvbWF0aXF1ZW1lbnQgbGVzIHZhbGV1cnMgZGlzdGluY3Rlc1xuICogZGUgbGEgY29sb25uZSBkw6lzaWduw6llIHBvdXIgZ8OpbsOpcmVyIGxlcyBjYXTDqWdvcmllcy4gYGJ1Y2tldGAgcGVybWV0IGRlIHJlZ3JvdXBlclxuICogZGVzIHZhbGV1cnMgY29udGludWVzIChleDogcGxhZ2VzIGRlIGR1csOpZSkuIGBoaWRkZW5gIGxlIG1hc3F1ZSBwYXIgZMOpZmF1dCBldFxuICogbGFpc3NlIGxhIHRhYmxlIGxlIHJlbmRyZSBkaXNwb25pYmxlIGRhbnMgbGUgbWVudSBcIkFqb3V0ZXIgdW4gZmlsdHJlXCIuXG4gKlxuICogKipNb2RlIG1hbnVlbCoqIChgY2F0ZWdvcmllc2ApIDogbGVzIGNhdMOpZ29yaWVzIHNvbnQgZMOpZmluaWVzIGV4cGxpY2l0ZW1lbnQgYXZlY1xuICogbGV1ciBwcm9wcmUgZm9uY3Rpb24gYGZpbHRlcmAuIGBjb2x1bW5LZXlgIHBldXQgY29leGlzdGVyIHBvdXIgbGUgbGllbiBhdmVjIGxhXG4gKiBjb2xvbm5lIChpY8O0bmUsIGxhYmVsKSwgbWFpcyBgY2F0ZWdvcmllc2AgcHJlbmQgbGUgZGVzc3VzIHN1ciBsZSBidWNrZXRpbmcgYXV0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUNvbmZpZzxUID0gYW55PiB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKiogSWPDtG5lIE1hdGVyaWFsIGFmZmljaMOpZSBkYW5zIGxlIHRpdHJlIGR1IHNsaWNlIChleDogJ3NjaGVkdWxlJywgJ2RucycpLiAqL1xuICBpY29uPzogc3RyaW5nO1xuICAvKiogQXV0b3Jpc2UgbGEgc8OpbGVjdGlvbiBzaW11bHRhbsOpZSBkZSBwbHVzaWV1cnMgY2F0w6lnb3JpZXMuIFBhciBkw6lmYXV0IDogYGZhbHNlYC4gKi9cbiAgbXVsdGlTZWxlY3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2zDqSBkZSBsYSBjb2xvbm5lIGFzc29jacOpZSDDoCBjZSBzbGljZS5cbiAgICogRW4gKiptb2RlIGNvbG9ubmUqKiwgbGVzIHZhbGV1cnMgZGlzdGluY3RlcyBkZSBjZXR0ZSBjb2xvbm5lIGfDqW7DqHJlbnQgbGVzIGNhdMOpZ29yaWVzLlxuICAgKiBFbiAqKm1vZGUgbWFudWVsKiosIHNlcnQgdW5pcXVlbWVudCDDoCBsaWVyIHZpc3VlbGxlbWVudCBsZSBzbGljZSDDoCBsYSBjb2xvbm5lLlxuICAgKi9cbiAgY29sdW1uS2V5Pzogc3RyaW5nO1xuICAvKiogTWFzcXXDqSBwYXIgZMOpZmF1dCA7IGRpc3BvbmlibGUgdmlhIGxlIG1lbnUgXCJBam91dGVyIHVuIGZpbHRyZVwiLiBQYXIgZMOpZmF1dCA6IGBmYWxzZWAuICovXG4gIGhpZGRlbj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1lIGNoYXF1ZSB2YWxldXIgZGUgbGlnbmUgZW4gbGFiZWwgZGUgdHJhbmNoZSBhdmFudCByZWdyb3VwZW1lbnQuXG4gICAqIFV0aWxpc8OpIGVuICoqbW9kZSBjb2xvbm5lKiogcG91ciBkZXMgdmFsZXVycyBjb250aW51ZXMgKGV4OiBkdXLDqWVzLCBtb250YW50cykuXG4gICAqIElnbm9yw6kgc2kgYGNhdGVnb3JpZXNgIGVzdCBkw6lmaW5pLlxuICAgKi9cbiAgYnVja2V0PzogKHJvdzogVCkgPT4gc3RyaW5nO1xuICAvKiogQ2F0w6lnb3JpZXMgZXhwbGljaXRlcyAoKiptb2RlIG1hbnVlbCoqKS4gU2kgYWJzZW50LCBnw6luw6lyw6llcyBhdXRvIGRlcHVpcyBgY29sdW1uS2V5YC4gKi9cbiAgY2F0ZWdvcmllcz86IFNsaWNlQ2F0ZWdvcnk8VD5bXTtcbn1cblxuLyoqXG4gKiBEZXNjcmlwdGlvbiBtaW5pbWFsZSBkJ3VuZSBjb2xvbm5lIG7DqWNlc3NhaXJlIGF1IHBhbm5lYXUgZGUgc2xpY2VzLlxuICogVXRpbGlzw6kgaW5kw6lwZW5kYW1tZW50IGRlIGxhIHRhYmxlIDogcGFzIGRlIHByb3ByacOpdMOpcyBkZSByZW5kdSAodHJpLCBzdXBwcmVzc2lvbiwgZ3JvdXBlbWVudC4uLikuXG4gKiBgVGFibGVDb2x1bW5Qcm92aWRlcmAgKGxpYnJhaXJpZSB0YWJsZSkgZXN0IHVuIHN1cGVyc2V0IHN0cnVjdHVyZWwgY29tcGF0aWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUNvbHVtbkRlZjxUID0gYW55PiB7XG4gIGtleTogc3RyaW5nO1xuICBoZWFkZXI/OiBzdHJpbmc7XG4gIGljb24/OiBzdHJpbmc7XG4gIHZhbHVlPzogRGF0YVByb3ZpZGVyPGFueT47XG4gIC8qKiBDaGFyZ2VtZW50IGRpZmbDqXLDqSA6IGxhIHByw6lzZW5jZSBkZSBjZXQgb2JqZXQgYWN0aXZlIGxlIG1vZGUgbGF6eS4gKi9cbiAgbGF6eT86IHtcbiAgICAvKiogRm9uY3Rpb24gYXBwZWzDqWUgcG91ciBjaGFyZ2VyIGxlcyB2YWxldXJzIGRlIGxhIGNvbG9ubmUuIFJldG91cm5lIHVuIHRhYmxlYXUgZGFucyBsZSBtw6ptZSBvcmRyZSBxdWUgbGVzIGxpZ25lcy4gKi9cbiAgICBmZXRjaEZuOiAoKSA9PiBPYnNlcnZhYmxlPGFueVtdPjtcbiAgfTtcbn1cblxuIl19