mis-crystal-design-system 18.1.8 → 18.1.10-test

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,6 +1,6 @@
1
- import { Component, signal, input, output } from '@angular/core';
2
- import { slideFromRight } from '../animations/slideFromRight';
1
+ import { Component, effect, signal, computed, input, output } from '@angular/core';
3
2
  import { FormControl, FormGroup } from '@angular/forms';
3
+ import { slideFromRight } from '../animations/slideFromRight';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../has-value.pipe";
6
6
  import * as i2 from "@angular/common";
@@ -12,6 +12,7 @@ import * as i7 from "mis-crystal-design-system/input";
12
12
  import * as i8 from "mis-crystal-design-system/datepicker_v2";
13
13
  import * as i9 from "mis-crystal-design-system/daterangepicker_v2";
14
14
  import * as i10 from "mis-crystal-design-system/checkbox";
15
+ const _c0 = () => [];
15
16
  function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_3_Template(rf, ctx) { if (rf & 1) {
16
17
  const _r3 = i0.ɵɵgetCurrentView();
17
18
  i0.ɵɵelementContainerStart(0);
@@ -20,10 +21,11 @@ function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_3_Template
20
21
  i0.ɵɵelementEnd()();
21
22
  i0.ɵɵelementContainerEnd();
22
23
  } if (rf & 2) {
24
+ let tmp_7_0;
23
25
  const filter_r4 = i0.ɵɵnextContext(2).$implicit;
24
26
  const ctx_r1 = i0.ɵɵnextContext(2);
25
27
  i0.ɵɵadvance(2);
26
- i0.ɵɵproperty("label", filter_r4.placeholder || "Select")("selectedItems", ctx_r1.filterForm.get(filter_r4.key).value)("data", filter_r4.options)("searchEnabled", true)("showSelectedCount", true)("enableSelectAll", true)("hideApplyButton", false);
28
+ i0.ɵɵproperty("label", filter_r4.placeholder || "Select")("selectedItems", ((tmp_7_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : tmp_7_0.value) || i0.ɵɵpureFunction0(7, _c0))("data", filter_r4.options)("searchEnabled", true)("showSelectedCount", true)("enableSelectAll", true)("hideApplyButton", false);
27
29
  } }
28
30
  function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_4_Template(rf, ctx) { if (rf & 1) {
29
31
  const _r5 = i0.ɵɵgetCurrentView();
@@ -33,10 +35,11 @@ function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_4_Template
33
35
  i0.ɵɵelementEnd()();
34
36
  i0.ɵɵelementContainerEnd();
35
37
  } if (rf & 2) {
38
+ let tmp_8_0;
36
39
  const filter_r4 = i0.ɵɵnextContext(2).$implicit;
37
40
  const ctx_r1 = i0.ɵɵnextContext(2);
38
41
  i0.ɵɵadvance(2);
39
- i0.ɵɵproperty("data", filter_r4.options)("searchEnabled", true)("selectedItem", ctx_r1.filterForm.get(filter_r4.key).value);
42
+ i0.ɵɵproperty("data", filter_r4.options)("searchEnabled", true)("selectedItem", (tmp_8_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : tmp_8_0.value);
40
43
  } }
41
44
  function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_5_div_2_Template(rf, ctx) { if (rf & 1) {
42
45
  const _r6 = i0.ɵɵgetCurrentView();
@@ -52,7 +55,7 @@ function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_5_div_2_Te
52
55
  const filter_r4 = i0.ɵɵnextContext(3).$implicit;
53
56
  const ctx_r1 = i0.ɵɵnextContext(2);
54
57
  i0.ɵɵadvance();
55
- i0.ɵɵproperty("type", "Default")("checked", (tmp_9_0 = ctx_r1.filterForm.get(filter_r4.key).value) == null ? null : tmp_9_0.includes(option_r7.value));
58
+ i0.ɵɵproperty("type", "Default")("checked", (tmp_9_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : tmp_9_0.value == null ? null : tmp_9_0.value.includes(option_r7.value));
56
59
  i0.ɵɵadvance(2);
57
60
  i0.ɵɵtextInterpolate(option_r7.label);
58
61
  } }
@@ -70,18 +73,18 @@ function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_5_Template
70
73
  function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_6_Template(rf, ctx) { if (rf & 1) {
71
74
  const _r8 = i0.ɵɵgetCurrentView();
72
75
  i0.ɵɵelementContainerStart(0);
73
- i0.ɵɵtext(1);
74
- i0.ɵɵelementStart(2, "mis-input", 25)(3, "input", 26);
75
- i0.ɵɵlistener("dateChange", function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_6_Template_input_dateChange_3_listener($event) { i0.ɵɵrestoreView(_r8); const filter_r4 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDateChange($event, filter_r4.key, filter_r4)); });
76
+ i0.ɵɵelementStart(1, "mis-input", 25)(2, "input", 26);
77
+ i0.ɵɵlistener("dateChange", function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_6_Template_input_dateChange_2_listener($event) { i0.ɵɵrestoreView(_r8); const filter_r4 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDateChange($event, filter_r4.key, filter_r4)); });
76
78
  i0.ɵɵelementEnd()();
77
79
  i0.ɵɵelementContainerEnd();
78
80
  } if (rf & 2) {
81
+ let tmp_7_0;
82
+ let tmp_8_0;
83
+ let tmp_9_0;
79
84
  const filter_r4 = i0.ɵɵnextContext(2).$implicit;
80
85
  const ctx_r1 = i0.ɵɵnextContext(2);
81
- i0.ɵɵadvance();
82
- i0.ɵɵtextInterpolate1(" ", filter_r4.placeholder, " ");
83
86
  i0.ɵɵadvance(2);
84
- i0.ɵɵproperty("dpConfig", filter_r4.datepickerConfig)("placeholder", ctx_r1.filterForm.get(filter_r4.key).value ? ctx_r1.filterForm.get(filter_r4.key).value : filter_r4.placeholder || "Select")("value", ctx_r1.filterForm.get(filter_r4.key).value ? ctx_r1.filterForm.get(filter_r4.key).value : filter_r4.placeholder || "Select")("selectedDate", ctx_r1.filterForm.get(filter_r4.key).value)("positionX", "end")("offsetX", -10);
87
+ i0.ɵɵproperty("dpConfig", filter_r4.datePickerConfig)("placeholder", ((tmp_7_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : tmp_7_0.value) || filter_r4.placeholder || "Select")("value", ((tmp_8_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : tmp_8_0.value) || filter_r4.placeholder || "Select")("selectedDate", (tmp_9_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : tmp_9_0.value)("positionX", "end")("offsetX", -10);
85
88
  } }
86
89
  function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_7_Template(rf, ctx) { if (rf & 1) {
87
90
  const _r9 = i0.ɵɵgetCurrentView();
@@ -144,7 +147,7 @@ function FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_10_Templat
144
147
  i0.ɵɵadvance(3);
145
148
  i0.ɵɵtextInterpolate((filter_r4 == null ? null : filter_r4.options == null ? null : filter_r4.options[1] == null ? null : filter_r4.options[1].label) || "Max");
146
149
  i0.ɵɵadvance();
147
- i0.ɵɵproperty("placeholder", filter_r4.placeholder || "Type here")("min", (ctx_r1.filterForm.get == null ? null : (tmp_11_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : (tmp_11_0 = tmp_11_0.get("min")) == null ? null : tmp_11_0.value) || 0);
150
+ i0.ɵɵproperty("placeholder", filter_r4.placeholder || "Type here")("min", ((tmp_11_0 = ctx_r1.filterForm.get(filter_r4.key)) == null ? null : (tmp_11_0 = tmp_11_0.get("min")) == null ? null : tmp_11_0.value) || 0);
148
151
  } }
149
152
  function FilterPanelComponent_div_0_ng_container_9_div_1_div_11_Template(rf, ctx) { if (rf & 1) {
150
153
  i0.ɵɵelement(0, "div", 34);
@@ -153,7 +156,7 @@ function FilterPanelComponent_div_0_ng_container_9_div_1_Template(rf, ctx) { if
153
156
  i0.ɵɵelementStart(0, "div", 13)(1, "span", 14);
154
157
  i0.ɵɵtext(2);
155
158
  i0.ɵɵelementEnd();
156
- i0.ɵɵtemplate(3, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_3_Template, 3, 7, "ng-container", 15)(4, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_4_Template, 3, 3, "ng-container", 15)(5, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_5_Template, 3, 1, "ng-container", 15)(6, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_6_Template, 4, 7, "ng-container", 15)(7, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_7_Template, 3, 6, "ng-container", 15)(8, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_8_Template, 3, 2, "ng-container", 15)(9, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_9_Template, 3, 2, "ng-container", 15)(10, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_10_Template, 10, 6, "ng-container", 15)(11, FilterPanelComponent_div_0_ng_container_9_div_1_div_11_Template, 1, 0, "div", 16);
159
+ i0.ɵɵtemplate(3, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_3_Template, 3, 8, "ng-container", 15)(4, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_4_Template, 3, 3, "ng-container", 15)(5, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_5_Template, 3, 1, "ng-container", 15)(6, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_6_Template, 3, 6, "ng-container", 15)(7, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_7_Template, 3, 6, "ng-container", 15)(8, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_8_Template, 3, 2, "ng-container", 15)(9, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_9_Template, 3, 2, "ng-container", 15)(10, FilterPanelComponent_div_0_ng_container_9_div_1_ng_container_10_Template, 10, 6, "ng-container", 15)(11, FilterPanelComponent_div_0_ng_container_9_div_1_div_11_Template, 1, 0, "div", 16);
157
160
  i0.ɵɵelementEnd();
158
161
  } if (rf & 2) {
159
162
  const ctx_r9 = i0.ɵɵnextContext();
@@ -226,92 +229,161 @@ function FilterPanelComponent_div_0_Template(rf, ctx) { if (rf & 1) {
226
229
  export class FilterPanelComponent {
227
230
  constructor(hasValue) {
228
231
  this.hasValue = hasValue;
229
- // Signal inputs replacing @Input()
232
+ this.isInitialized = false;
233
+ /* --- signal-based Inputs / Outputs --- */
230
234
  this.show = input(false);
231
235
  this.config = input.required();
232
236
  this.emitFiltersAfterSettingNewValues = input(false);
233
- // Signal outputs replacing @Output()
234
237
  this.onClose = output();
235
238
  this.onApply = output();
239
+ /* --- form + internal state --- */
236
240
  this.filterForm = new FormGroup({});
241
+ // keep a signal snapshot of form value so computed can react
242
+ this._formValueSignal = signal({});
243
+ // last applied snapshot (signal so template/logic can read reliably)
244
+ this.lastAppliedData = signal(null);
245
+ // date range readable for template
237
246
  this.dateRangeSelectedDates = signal({
238
247
  startDate: '',
239
- endDate: '',
248
+ endDate: ''
240
249
  });
241
- }
242
- // Method to calculate filter count (not a computed signal because form values aren't reactive)
243
- getFilterCount() {
244
- let count = 0;
245
- const formValue = this.filterForm.value;
246
- this.config().forEach((filter) => {
247
- const value = formValue[filter.key];
248
- // Special handling for range type - only count if at least one value is set
249
- if (filter.type === 'range') {
250
- if (value && (value.min !== null || value.max !== null)) {
250
+ /* computed filterCount */
251
+ this.filterCount = computed(() => {
252
+ const formValue = this._formValueSignal();
253
+ const cfg = this.config();
254
+ let count = 0;
255
+ for (const filter of cfg) {
256
+ const value = formValue[filter.key];
257
+ if (filter.type === 'range') {
258
+ if (value && (value.min !== null || value.max !== null)) {
259
+ count++;
260
+ }
261
+ continue;
262
+ }
263
+ if (filter.type === 'multiSelect' || filter.type === 'checkbox') {
264
+ if (Array.isArray(value) && value.length > 0) {
265
+ count++;
266
+ }
267
+ continue;
268
+ }
269
+ if (this.hasValue.transform(value)) {
251
270
  count++;
252
271
  }
253
- return;
254
272
  }
255
- // Special handling for multiSelect/checkbox - check array length directly
256
- if (filter.type === 'multiSelect' || filter.type === 'checkbox') {
257
- if (Array.isArray(value) && value.length > 0) {
258
- count++;
273
+ return count;
274
+ });
275
+ // Effect to react to config changes - must allow signal writes since we update internal signals
276
+ effect(() => {
277
+ try {
278
+ const cfg = this.config();
279
+ if (cfg && Array.isArray(cfg) && cfg.length > 0) {
280
+ // Only initialize form if not already done, or if config structure changed
281
+ if (!this.isInitialized || this.hasConfigChanged(cfg)) {
282
+ this.initializeFormControls(cfg);
283
+ this.isInitialized = true;
284
+ }
285
+ // Always check for selectedValue changes
286
+ this.setFilterValue(cfg);
259
287
  }
260
- return;
261
288
  }
262
- // For other types, use hasValue pipe
263
- if (this.hasValue.transform(value)) {
264
- count++;
289
+ catch (error) {
290
+ console.warn('FilterPanel: Error in config effect', error);
265
291
  }
266
- });
267
- return count;
292
+ }, { allowSignalWrites: true });
268
293
  }
294
+ /* --- Lifecycle --- */
269
295
  ngOnInit() {
270
- // Access the config signal value by calling it like a function
271
- this.initializeFormControls(this.config());
296
+ // subscribe form changes so computed/filterCount update
297
+ this.subscribeFormChanges();
272
298
  }
299
+ ngOnDestroy() {
300
+ this.formSubscription?.unsubscribe();
301
+ }
302
+ /* --- Form init & helpers --- */
273
303
  initializeFormControls(config) {
274
- this.filterForm = new FormGroup({});
275
- config.forEach((filter) => {
276
- let control;
277
- if (filter.type === 'range') {
278
- control = new FormGroup({
279
- min: new FormControl(null),
280
- max: new FormControl(null),
281
- }, {
282
- validators: (group) => {
283
- const min = group.get('min').value;
284
- const max = group.get('max').value;
285
- if (min !== null && max !== null && min > max) {
286
- return { rangeError: 'Min value should be less than max value' };
287
- }
288
- return null;
289
- }
290
- });
291
- }
292
- else if (filter.type === 'multiSelect' || filter.type === 'checkbox') {
293
- control = new FormControl([]);
294
- }
295
- else if (filter.type === 'select') {
296
- control = new FormControl('');
304
+ // build a fresh form to match config
305
+ const newForm = new FormGroup({});
306
+ const rangeValidator = (group) => {
307
+ const min = group.get('min')?.value;
308
+ const max = group.get('max')?.value;
309
+ if (min !== null && max !== null && min > max) {
310
+ return { rangeError: 'Min value should be less than max value' };
297
311
  }
298
- else {
299
- control = new FormControl(null);
312
+ return null;
313
+ };
314
+ for (const filter of config) {
315
+ let control;
316
+ switch (filter.type) {
317
+ case 'range':
318
+ control = new FormGroup({
319
+ min: new FormControl(null),
320
+ max: new FormControl(null)
321
+ }, { validators: rangeValidator });
322
+ break;
323
+ case 'multiSelect':
324
+ case 'checkbox':
325
+ control = new FormControl(Array.isArray(filter.defaultValue) ? filter.defaultValue : []);
326
+ break;
327
+ case 'select':
328
+ control = new FormControl(filter.defaultValue ?? '');
329
+ break;
330
+ default:
331
+ control = new FormControl(filter.defaultValue ?? null);
300
332
  }
301
333
  if (this.hasValue.transform(filter.defaultValue)) {
302
334
  control.setValue(filter.defaultValue);
303
335
  }
304
- this.filterForm.addControl(filter.key, control);
336
+ newForm.addControl(filter.key, control);
337
+ }
338
+ // replace form safely
339
+ // preserve subscription so valueChanges continues to update _formValueSignal
340
+ this.filterForm = newForm;
341
+ // update signal snapshot immediately
342
+ this._formValueSignal.set({ ...this.filterForm.value });
343
+ // re-subscribe to new form's valueChanges
344
+ this.subscribeFormChanges();
345
+ }
346
+ subscribeFormChanges() {
347
+ // unsubscribe previous subscription if any
348
+ this.formSubscription?.unsubscribe();
349
+ // subscribe to valueChanges; set snapshot signal
350
+ this.formSubscription = this.filterForm.valueChanges?.subscribe((value) => {
351
+ this._formValueSignal.set({ ...value });
305
352
  });
353
+ // also set initial snapshot in case valueChanges doesn't emit immediately
354
+ this._formValueSignal.set({ ...this.filterForm.value });
355
+ }
356
+ getControl(key) {
357
+ return this.filterForm.get(key);
358
+ }
359
+ /**
360
+ * Check if config structure has changed (new keys or removed keys)
361
+ * Used to determine if form needs to be rebuilt
362
+ */
363
+ hasConfigChanged(newConfig) {
364
+ const currentKeys = Object.keys(this.filterForm.controls).sort();
365
+ const newKeys = newConfig.map(f => f.key).sort();
366
+ if (currentKeys.length !== newKeys.length) {
367
+ return true;
368
+ }
369
+ return currentKeys.some((key, index) => key !== newKeys[index]);
306
370
  }
371
+ /* --- Actions / UI handlers --- */
307
372
  closePanel() {
308
- if (this.lastAppliedData) {
309
- this.filterForm.setValue(this.lastAppliedData);
373
+ const last = this.lastAppliedData();
374
+ if (last) {
375
+ try {
376
+ // prefer setValue (ensures shape matches); fallback to patchValue
377
+ this.filterForm.setValue(last);
378
+ }
379
+ catch {
380
+ this.filterForm.patchValue(last);
381
+ }
310
382
  }
311
383
  else {
312
384
  this.clearFormValues();
313
385
  }
314
- // Emit the close event using the signal output
386
+ // emit close event
315
387
  this.onClose.emit();
316
388
  }
317
389
  applyFilters() {
@@ -319,70 +391,102 @@ export class FilterPanelComponent {
319
391
  this.filterForm.markAllAsTouched();
320
392
  return;
321
393
  }
322
- this.lastAppliedData = { ...this.filterForm.value };
323
- // Emit the apply event with the filter data using the signal output
394
+ const snapshot = { ...this.filterForm.value };
395
+ this.lastAppliedData.set(snapshot);
324
396
  this.onApply.emit({
325
- filterData: this.filterForm.value,
326
- filterCount: this.getFilterCount()
397
+ filterData: snapshot,
398
+ filterCount: this.filterCount()
327
399
  });
400
+ // consistent behavior with earlier implementation:
401
+ // hide panel (parent should read show() to close) and restore form state via closePanel
402
+ // Note: we don't mutate show() here; parent owns show signal
328
403
  this.closePanel();
329
404
  }
405
+ resetFilters() {
406
+ this.clearFormValues();
407
+ // call applyFilters to maintain previous behavior (validation + emit)
408
+ this.applyFilters();
409
+ }
410
+ /* --- Value setters --- */
330
411
  handleSelect(event, filterKey, filter) {
331
- this.filterForm.get(filterKey).setValue(event);
412
+ const ctrl = this.getControl(filterKey);
413
+ // For multiSelect, extract values from array of objects (if needed)
414
+ let valueToSet = event;
415
+ if (filter.type === 'multiSelect' && Array.isArray(event)) {
416
+ // Check if it's an array of objects with 'value' property
417
+ if (event.length > 0 && typeof event[0] === 'object' && 'value' in event[0]) {
418
+ valueToSet = event.map((item) => item.value || item);
419
+ }
420
+ }
421
+ ctrl?.setValue(valueToSet);
332
422
  if (filter.onChange) {
423
+ // keep same callback contract: pass event, config and form snapshot
333
424
  filter.onChange(event, this.config(), this.filterForm.value);
334
425
  }
335
426
  }
336
- onDateChange(event, filterKey, filter) {
337
- this.filterForm.get(filterKey).setValue(event);
338
- if (typeof event === 'object') {
339
- this.dateRangeSelectedDates.set({
340
- startDate: event.startDate,
341
- endDate: event.endDate,
342
- });
343
- }
344
- }
345
427
  handleCheckbox(event, filterKey, checkboxValue, filter) {
346
- const currentValues = this.filterForm.get(filterKey).value;
347
- if (event.value) {
348
- this.filterForm.get(filterKey).setValue([...currentValues, checkboxValue]);
428
+ const ctrl = this.getControl(filterKey);
429
+ const current = Array.isArray(ctrl?.value) ? [...ctrl.value] : [];
430
+ if (event?.value) {
431
+ ctrl?.setValue([...current, checkboxValue]);
349
432
  }
350
433
  else {
351
- this.filterForm.get(filterKey).setValue(currentValues.filter((value) => value !== checkboxValue));
434
+ ctrl?.setValue(current.filter((v) => v !== checkboxValue));
352
435
  }
353
436
  if (filter.onChange) {
354
437
  filter.onChange(event, this.config(), this.filterForm.value);
355
438
  }
356
439
  }
440
+ onDateChange(event, filterKey, filter) {
441
+ const ctrl = this.getControl(filterKey);
442
+ ctrl?.setValue(event);
443
+ if (event && typeof event === 'object' && 'startDate' in event && 'endDate' in event) {
444
+ this.dateRangeSelectedDates.set({
445
+ startDate: event.startDate,
446
+ endDate: event.endDate
447
+ });
448
+ }
449
+ }
450
+ /* --- Clear / Set values helpers --- */
357
451
  clearFormValues() {
358
- const resetValues = {};
359
- this.config().forEach((filter) => {
360
- let defaultValue = filter.defaultValue || null;
452
+ const resets = {};
453
+ for (const filter of this.config()) {
454
+ let defaultValue = filter.defaultValue ?? null;
361
455
  if (filter.type === 'multiSelect' || filter.type === 'checkbox') {
362
- defaultValue = filter.defaultValue || [];
456
+ defaultValue = filter.defaultValue ?? [];
363
457
  }
364
458
  if (filter.type === 'range') {
365
- defaultValue = filter.defaultValue || { min: null, max: null };
459
+ defaultValue = filter.defaultValue ?? { min: null, max: null };
366
460
  }
367
- resetValues[filter.key] = defaultValue;
368
- });
369
- this.filterForm.patchValue(resetValues);
370
- }
371
- resetFilters() {
372
- this.clearFormValues();
373
- this.applyFilters();
461
+ resets[filter.key] = defaultValue;
462
+ }
463
+ // patch to avoid shape mismatch errors
464
+ this.filterForm.patchValue(resets);
465
+ this._formValueSignal.set({ ...this.filterForm.value });
374
466
  }
467
+ /**
468
+ * Applies filter.selectedValue when parent provides selectedValue.
469
+ * Called by the config effect (so runs on initial load and on config changes).
470
+ */
375
471
  setFilterValue(config) {
376
472
  let anyValueSet = false;
377
473
  for (const filter of config) {
378
- if (filter?.selectedValue) {
379
- this.filterForm.get(filter.key).setValue(filter.selectedValue);
380
- anyValueSet = true;
474
+ if (this.hasValue.transform(filter?.selectedValue)) {
475
+ const ctrl = this.getControl(filter.key);
476
+ if (ctrl) {
477
+ ctrl.setValue(filter.selectedValue);
478
+ anyValueSet = true;
479
+ }
381
480
  }
382
481
  }
383
482
  if (anyValueSet && this.emitFiltersAfterSettingNewValues()) {
483
+ // respect the parent flag — apply and emit
384
484
  this.applyFilters();
385
485
  }
486
+ else {
487
+ // make sure our snapshot signal is fresh
488
+ this._formValueSignal.set({ ...this.filterForm.value });
489
+ }
386
490
  }
387
491
  static { this.ɵfac = function FilterPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FilterPanelComponent)(i0.ɵɵdirectiveInject(i1.HasValuePipe)); }; }
388
492
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FilterPanelComponent, selectors: [["mis-filter-panel"]], inputs: { show: [1, "show"], config: [1, "config"], emitFiltersAfterSettingNewValues: [1, "emitFiltersAfterSettingNewValues"] }, outputs: { onClose: "onClose", onApply: "onApply" }, decls: 1, vars: 1, consts: [["class", "filter-panel-container", 4, "ngIf"], [1, "filter-panel-container"], [1, "panel-header"], ["width", "25", "height", "25", "viewBox", "0 0 25 25", "fill", "none", "xmlns", "http://www.w3.org/2000/svg", 1, "close-icon", 3, "click"], ["id", "ic-navigation-cancel-24"], ["id", "Union", "fill-rule", "evenodd", "clip-rule", "evenodd", "d", "M8.60468 6.64355C8.09036 6.12923 7.25649 6.12923 6.74218 6.64355C6.22787 7.15786 6.22787 7.99173 6.74218 8.50604L10.4938 12.2576L6.7431 16.0083C6.22879 16.5226 6.22879 17.3564 6.7431 17.8708C7.25742 18.3851 8.09129 18.3851 8.60560 17.8708L12.3562 14.1201L16.1068 17.8707C16.6211 18.3850 17.4550 18.3850 17.9693 17.8707C18.4836 17.3564 18.4836 16.5225 17.9693 16.0082L14.2187 12.2576L17.9702 8.50613C18.4845 7.99181 18.4845 7.15794 17.9702 6.64363C17.4559 6.12932 16.6220 6.12932 16.1077 6.64363L12.3562 10.3951L8.60468 6.64355Z", "fill", "#181F33"], [1, "horizontal-divider", "first"], [1, "filters", 3, "formGroup"], [4, "ngFor", "ngForOf"], [1, "actions"], [3, "click", "name", "size", "type"], [3, "click", "name", "size", "type", "disabled"], ["class", "filter", 4, "ngIf"], [1, "filter"], [1, "filter-title"], [4, "ngIf"], ["class", "horizontal-divider", 4, "ngIf"], [1, "multiselect-filter"], ["width", "100%", "height", "44px", 1, "no-padding", 3, "onChange", "label", "selectedItems", "data", "searchEnabled", "showSelectedCount", "enableSelectAll", "hideApplyButton"], ["width", "100%", "height", "44px", 3, "onChange", "data", "searchEnabled", "selectedItem"], [1, "checkbox-row"], ["class", "checkbox-container", 4, "ngFor", "ngForOf"], [1, "checkbox-container"], [3, "valueChange", "type", "checked"], [1, "checkbox-label"], ["type", "rounded"], ["misTzDp", "", "misInput", "", "type", "text", "readonly", "", 1, "mis-input", 3, "dateChange", "dpConfig", "placeholder", "value", "selectedDate", "positionX", "offsetX"], ["misTzDrp", "", "misInput", "", "type", "text", "readonly", "", 1, "mis-input", 3, "dateChange", "placeholder", "value", "positionX", "positionY", "selectedDates", "dpConfig"], ["misInput", "", "type", "text", 1, "input", 3, "placeholder", "formControlName"], ["misInput", "", "type", "number", 1, "input", 3, "placeholder", "formControlName"], [1, "range-container", 3, "formGroup"], [1, "range-inner-container"], ["misInput", "", "type", "number", "formControlName", "min", 1, "input", 3, "placeholder"], ["misInput", "", "type", "number", "formControlName", "max", 1, "input", 3, "placeholder", "min"], [1, "horizontal-divider"]], template: function FilterPanelComponent_Template(rf, ctx) { if (rf & 1) {
@@ -393,7 +497,7 @@ export class FilterPanelComponent {
393
497
  }
394
498
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FilterPanelComponent, [{
395
499
  type: Component,
396
- args: [{ selector: 'mis-filter-panel', animations: [slideFromRight], template: "<div class=\"filter-panel-container\" *ngIf=\"show()\" @slideFromRight>\n <div class=\"panel-header\">\n <span>Filters</span>\n <svg class=\"close-icon\" (click)=\"closePanel()\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"ic-navigation-cancel-24\">\n <path id=\"Union\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.60468 6.64355C8.09036 6.12923 7.25649 6.12923 6.74218 6.64355C6.22787 7.15786 6.22787 7.99173 6.74218 8.50604L10.4938 12.2576L6.7431 16.0083C6.22879 16.5226 6.22879 17.3564 6.7431 17.8708C7.25742 18.3851 8.09129 18.3851 8.60560 17.8708L12.3562 14.1201L16.1068 17.8707C16.6211 18.3850 17.4550 18.3850 17.9693 17.8707C18.4836 17.3564 18.4836 16.5225 17.9693 16.0082L14.2187 12.2576L17.9702 8.50613C18.4845 7.99181 18.4845 7.15794 17.9702 6.64363C17.4559 6.12932 16.6220 6.12932 16.1077 6.64363L12.3562 10.3951L8.60468 6.64355Z\" fill=\"#181F33\" />\n </g>\n </svg>\n </div>\n\n <div class=\"horizontal-divider first\"></div>\n\n <div class=\"filters\" [formGroup]=\"filterForm\">\n <ng-container *ngFor=\"let filter of config(); let last = last\">\n <div class=\"filter\" *ngIf=\"!filter.hidden\">\n <span class=\"filter-title\">{{filter.title}}</span>\n <ng-container *ngIf=\"filter.type === 'multiSelect'\">\n <div class=\"multiselect-filter\">\n <mis-multi-select-dropdown class=\"no-padding\" [label]=\"filter.placeholder || 'Select'\" [selectedItems]=\"filterForm.get(filter.key).value\" (onChange)=\"handleSelect($event, filter.key, filter)\" [data]=\"filter.options\" [searchEnabled]=\"true\"\n [showSelectedCount]=\"true\" [enableSelectAll]=\"true\"\n [hideApplyButton]=\"false\" width=\"100%\" height=\"44px\"></mis-multi-select-dropdown>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'select'\">\n <div class=\"multiselect-filter\">\n <mis-dropdown [data]=\"filter.options\" [searchEnabled]=\"true\" width=\"100%\" height=\"44px\"\n (onChange)=\"handleSelect($event, filter.key, filter)\" [selectedItem]=\"filterForm.get(filter.key).value\">\n </mis-dropdown>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'checkbox'\">\n <div class=\"checkbox-row\">\n <div *ngFor=\"let option of filter.options\" class=\"checkbox-container\">\n <mis-checkbox [type]=\"'Default'\" [checked]=\"filterForm.get(filter.key).value?.includes(option.value)\" (valueChange)=\"handleCheckbox($event, filter.key, option.value, filter)\"></mis-checkbox>\n <span class=\"checkbox-label\">{{option.label}}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'datePicker'\">\n {{filter.placeholder}}\n <mis-input type=\"rounded\">\n <input misTzDp misInput type=\"text\" readonly class=\"mis-input\" [dpConfig]=\"filter.datepickerConfig\" [placeholder]=\"filterForm.get(filter.key).value ? filterForm.get(filter.key).value : (filter.placeholder || 'Select')\" [value]=\"filterForm.get(filter.key).value ? filterForm.get(filter.key).value : (filter.placeholder || 'Select')\" (dateChange)=\"onDateChange($event, filter.key, filter)\" [selectedDate]=\"filterForm.get(filter.key).value\" [positionX]=\"'end'\" [offsetX]=\"-10\">\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'dateRangePicker'\">\n <mis-input type=\"rounded\">\n <input misTzDrp misInput type=\"text\" class=\"mis-input\" readonly\n [placeholder]=\"(!dateRangeSelectedDates().startDate && !dateRangeSelectedDates().endDate) ? (filter.placeholder || 'Select') : dateRangeSelectedDates().startDate + ' - ' + dateRangeSelectedDates().endDate\"\n [value]=\"(!dateRangeSelectedDates().startDate && !dateRangeSelectedDates().endDate) ? (filter.placeholder || 'Select') : dateRangeSelectedDates().startDate + ' - ' + dateRangeSelectedDates().endDate\" [positionX]=\"'start'\"\n [positionY]=\"'top'\" [selectedDates]=\"dateRangeSelectedDates()\" (dateChange)=\"onDateChange($event, filter.key, filter)\"\n [dpConfig]=\"filter.dateRangePickerConfig\" />\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'text'\">\n <mis-input type=\"rounded\">\n <input misInput type=\"text\" class=\"input\" [placeholder]=\"filter.placeholder || 'Type here'\" [formControlName]=\"filter.key\">\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'number'\">\n <mis-input type=\"rounded\">\n <input misInput type=\"number\" class=\"input\" [placeholder]=\"filter.placeholder || 'Type here'\" [formControlName]=\"filter.key\">\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'range'\">\n <div class=\"range-container\" [formGroup]=\"filterForm.get(filter.key)\">\n <div class=\"range-inner-container\">\n <span>{{ filter?.options?.[0]?.label || 'Min' }}</span>\n <input\n misInput\n type=\"number\"\n class=\"input\"\n [placeholder]=\"filter.placeholder || 'Type here'\"\n formControlName=\"min\"\n />\n </div>\n <div class=\"range-inner-container\">\n <span>{{ filter?.options?.[1]?.label || 'Max' }}</span>\n <input\n misInput\n type=\"number\"\n class=\"input\"\n [placeholder]=\"filter.placeholder || 'Type here'\"\n formControlName=\"max\"\n [min]=\"filterForm.get?.(filter.key)?.get('min')?.value || 0\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"horizontal-divider\" *ngIf=\"!last\"></div>\n </div>\n </ng-container>\n </div>\n\n <div class=\"actions\">\n <mis-button [name]=\"'Clear All'\" [size]=\"'Small'\" [type]=\"'Text'\" (click)=\"resetFilters()\"></mis-button>\n <mis-button [name]=\"'Apply'\" [size]=\"'Small'\" [type]=\"'Solid'\" (click)=\"applyFilters()\" [disabled]=\"filterForm.invalid\"></mis-button>\n </div>\n</div>\n\n", styles: [":root{--pmry-200: #99BAF7;--pmry-100: #CBDDFB;--pmry-500: #0937B2;--pmry-400: #3C68D0;--pmry-600: #062A99;--pmry-700: #041F80;--pmry-300: #638FE7;--pmry-800: #021567;--pmry-900: #010F55;--sec-d-purple: #40447F;--sec-maroon: #6B034E;--sec-mud-red: #B23600;--sec-orange: #ED711C;--sec-purple: #815FD5;--sec-teal: #10ADAE;--sec-yellow: #D4900C;--sec-green: #547F40;--sec-bright-green: #27D22E;--sec-dark-teal: #035F6B;--sec-chocolate: #7C2F33;--sec-rube-pink: #C13D6D;--sec-cerulean: #0087B2;--sem-error: #B00020;--sem-info: #0091FF;--sem-warning: #FF9D00;--sem-success: #38AF49;--grey-bg-1: #FAFAFA;--grey-bg: #F5F5F5;--grey-seperators: #E0E0E0;--grey-disabled: #C8CDD3;--grey-hover: #F5F7FC;--grey-pressed: #E6EBF7;--grey-row: #F5F7FC;--dec-light-yellow: #F4E7C3;--dec-light-purple: #DACFF9;--dec-light-green: #E4F5E9;--dec-light-green2: #F1FFF3;--dec-light-pink: #FAE1EA;--dec-: #F4CBC1;--dec-lt-orange: #FAEFED;--dec-light-blue: #CFECF9;--dec-row-selection: #F1FDF8;--dec-row-selection2: #F2FBFF;--dec-row-lines: #D3E1E9;--text-white: #FFFFFF;--text-muted: #6A737D;--text-black: #181F33;--MR-solid-blue2:#C8D5F6;--MR-solid-purple:#C9C3FB;--MR-solid-orange:#EEAC9F;--MR-solid-green:#ACDADA;--MR-solid-brown:#E8C8AF;--MR-solid-yellow:#FFEFC7;--MR-solid-blue:#BBE6FF;--MR-solid-pink:#FFC6F2;--tr-hover:#F0F3FA;--tr-pressed:#DAE1F3;--brand-primary: #0937B2;--brand-primary-light: #3C68D0;--brand-primary-dark: #062A99;--brand-primary-darker: #041F80;--brand-primary-lighter: #638FE7;--brand-primary-lightest: #CBDDFB;--brand-primary-hover: #F0F3FA;--brand-primary-active: #DAE1F3;--brand-secondary: #ED711C;--brand-secondary-light: #F09E65;--brand-secondary-dark: #B23600;--brand-secondary-lighter: #FFC6F2;--brand-accent: #10ADAE;--brand-accent-light: #16CBBC;--brand-accent-dark: #035F6B;--brand-accent-lighter: #ACDADA;--brand-success: #38AF49;--brand-success-light: #4CAF50;--brand-success-dark: #216531;--brand-success-lighter: #E4F5E9;--brand-success-lightest: #F1FFF3;--brand-error: #B00020;--brand-error-light: #F04E4E;--brand-error-dark: #A60060;--brand-error-lighter: #FAE1EA;--brand-error-lightest: #FDF2F2;--brand-warning: #FF9D00;--brand-warning-light: #D4900C;--brand-warning-dark: #624000;--brand-warning-lighter: #F4E7C3;--brand-warning-lightest: #FAEFED;--brand-info: #0091FF;--brand-info-light: #35A1FF;--brand-info-dark: #0087B2;--brand-info-lighter: #CFECF9;--text-primary: #181F33;--text-secondary: #6A737D;--text-tertiary: #929DAB;--text-disabled: #929DAB;--text-primary-87: rgba(24, 31, 51, .87);--text-primary-60: rgba(24, 31, 51, .6);--text-primary-38: rgba(24, 31, 51, .38);--text-primary-12: rgba(24, 31, 51, .12);--bg-primary: #FFFFFF;--bg-secondary: #FAFAFA;--bg-tertiary: #F5F5F5;--bg-overlay: rgba(0, 0, 0, .32);--bg-overlay-light: rgba(0, 0, 0, .12);--bg-overlay-lighter: rgba(0, 0, 0, .08);--bg-overlay-lightest: rgba(0, 0, 0, .04);--border-primary: #E0E0E0;--border-secondary: #D6DCE2;--border-tertiary: #C8CDD3;--border-light: #F1F4F8;--border-primary-12: rgba(0, 0, 0, .12);--border-primary-08: rgba(0, 0, 0, .08);--border-primary-06: rgba(0, 0, 0, .06);--shadow-primary: rgba(0, 0, 0, .12);--shadow-secondary: rgba(0, 0, 0, .08);--shadow-tertiary: rgba(0, 0, 0, .04);--shadow-light: rgba(0, 0, 0, .06);--status-available: #929DAB;--status-unavailable: #CCD3DA;--status-hotseat: #857BFF;--status-multiteam: #10ADAE;--status-selected: #10ADAE;--status-upcoming: #D4900C;--status-room: #38AF49;--status-room-booked: #B23600;--status-room-unavailable: #181F33;--team-color-1: #F8C52E;--team-color-2: #FA8E20;--team-color-3: #987CDD;--team-color-4: #16CBBC;--team-color-5: #E65010;--team-color-6: #A60060;--team-color-7: #ED323B;--team-color-8: #35A1FF;--team-color-9: #80D348}.filter-panel-container{display:flex;flex-direction:column;height:100%;max-width:100%;min-width:20rem;position:absolute;right:0;background:var(--bg-primary, #FFFFFF);top:0;z-index:999;box-shadow:0 0 5px #000000a6;transition:all .3s ease}.filter-panel-container .panel-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;font-weight:700;margin:0 1rem;flex-basis:5%}.filter-panel-container .panel-header span{font-size:1.25rem}.filter-panel-container .panel-header .close-icon{cursor:pointer;border-radius:50%;transform:scale(1.4);padding:.3rem;transition:all .3s ease}.filter-panel-container .panel-header .close-icon:hover{background:var(--bg-tertiary, #F5F5F5)}.filter-panel-container .panel-header .close-icon:active{background:var(--border-primary, #E0E0E0)}.filter-panel-container .mat-divider.horizontal{margin:1rem}.filters{display:flex;flex-direction:column;flex:1;row-gap:.5rem;overflow:auto;padding:0 1rem}.filters .filter{display:flex;flex-direction:column}.filters .filter .filter-title{color:var(--text-secondary, #6A737D);font-size:.875rem;font-weight:700;line-height:20px;letter-spacing:.25px}.filters .filter .checkbox-row{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:.8rem 0}.filters .filter .checkbox-row .checkbox-container{display:flex;flex-direction:row;align-items:center;gap:.5rem}.filters .filter .checkbox-row .checkbox-label{display:block;width:8rem}.filters .filter .checkbox-row ::ng-deep .mat-checkbox-inner-container{width:20px;height:20px}.filters .filter .checkbox-row ::ng-deep .mat-checkbox-frame{border-radius:5px}.filters .filter .multiselect-filter,.filters .filter mis-input{padding:.7rem 0}.horizontal-divider{display:block;width:100%;height:1px;margin:.5rem 0;background:var(--border-primary, #E0E0E0)}.first{margin-top:0}.actions{display:flex;flex-direction:row;justify-content:end;align-items:center;gap:1rem;border-top:1px solid var(--border-primary, #E0E0E0);flex-basis:4%;padding:.5rem}.actions button{font-weight:700;border-radius:.5rem;width:6rem}.no-padding ::ng-deep .container{padding:0!important}.range-container{display:flex;justify-content:space-between;padding:.8rem 0}.range-container .range-inner-container{display:flex;flex-direction:column}.range-container .range-inner-container input{height:2.2rem;outline:none;border-radius:.375rem;border:1px solid var(--border-primary, #E0E0E0);width:8rem;padding:0 .5rem}.range-container .range-inner-container span{margin-bottom:.2rem}input.ng-invalid.ng-touched{border:1px solid var(--brand-error, #B00020);background-color:var(--brand-error-lightest, #FDF2F2)}\n"] }]
500
+ args: [{ selector: 'mis-filter-panel', animations: [slideFromRight], template: "<div class=\"filter-panel-container\" *ngIf=\"show()\" @slideFromRight>\n <div class=\"panel-header\">\n <span>Filters</span>\n <svg class=\"close-icon\" (click)=\"closePanel()\" width=\"25\" height=\"25\" viewBox=\"0 0 25 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"ic-navigation-cancel-24\">\n <path id=\"Union\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.60468 6.64355C8.09036 6.12923 7.25649 6.12923 6.74218 6.64355C6.22787 7.15786 6.22787 7.99173 6.74218 8.50604L10.4938 12.2576L6.7431 16.0083C6.22879 16.5226 6.22879 17.3564 6.7431 17.8708C7.25742 18.3851 8.09129 18.3851 8.60560 17.8708L12.3562 14.1201L16.1068 17.8707C16.6211 18.3850 17.4550 18.3850 17.9693 17.8707C18.4836 17.3564 18.4836 16.5225 17.9693 16.0082L14.2187 12.2576L17.9702 8.50613C18.4845 7.99181 18.4845 7.15794 17.9702 6.64363C17.4559 6.12932 16.6220 6.12932 16.1077 6.64363L12.3562 10.3951L8.60468 6.64355Z\" fill=\"#181F33\" />\n </g>\n </svg>\n </div>\n \n <div class=\"horizontal-divider first\"></div>\n \n <div class=\"filters\" [formGroup]=\"filterForm\">\n <ng-container *ngFor=\"let filter of config(); let last = last\">\n <div class=\"filter\" *ngIf=\"!filter.hidden\">\n <span class=\"filter-title\">{{filter.title}}</span>\n <ng-container *ngIf=\"filter.type === 'multiSelect'\">\n <div class=\"multiselect-filter\">\n <mis-multi-select-dropdown class=\"no-padding\" [label]=\"filter.placeholder || 'Select'\" [selectedItems]=\"filterForm.get(filter.key)?.value || []\" (onChange)=\"handleSelect($event, filter.key, filter)\" [data]=\"filter.options\" [searchEnabled]=\"true\"\n [showSelectedCount]=\"true\" [enableSelectAll]=\"true\"\n [hideApplyButton]=\"false\" width=\"100%\" height=\"44px\"></mis-multi-select-dropdown>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'select'\">\n <div class=\"multiselect-filter\">\n <mis-dropdown [data]=\"filter.options\" [searchEnabled]=\"true\" width=\"100%\" height=\"44px\"\n (onChange)=\"handleSelect($event, filter.key, filter)\" [selectedItem]=\"filterForm.get(filter.key)?.value\">\n </mis-dropdown>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'checkbox'\">\n <div class=\"checkbox-row\">\n <div *ngFor=\"let option of filter.options\" class=\"checkbox-container\">\n <mis-checkbox [type]=\"'Default'\" [checked]=\"filterForm.get(filter.key)?.value?.includes(option.value)\" (valueChange)=\"handleCheckbox($event, filter.key, option.value, filter)\"></mis-checkbox>\n <span class=\"checkbox-label\">{{option.label}}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'datePicker'\">\n <mis-input type=\"rounded\">\n <input misTzDp misInput type=\"text\" readonly class=\"mis-input\" [dpConfig]=\"filter.datePickerConfig\" [placeholder]=\"filterForm.get(filter.key)?.value || filter.placeholder || 'Select'\" [value]=\"filterForm.get(filter.key)?.value || filter.placeholder || 'Select'\" (dateChange)=\"onDateChange($event, filter.key, filter)\" [selectedDate]=\"filterForm.get(filter.key)?.value\" [positionX]=\"'end'\" [offsetX]=\"-10\">\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'dateRangePicker'\">\n <mis-input type=\"rounded\">\n <input misTzDrp misInput type=\"text\" class=\"mis-input\" readonly\n [placeholder]=\"(!dateRangeSelectedDates().startDate && !dateRangeSelectedDates().endDate) ? (filter.placeholder || 'Select') : dateRangeSelectedDates().startDate + ' - ' + dateRangeSelectedDates().endDate\"\n [value]=\"(!dateRangeSelectedDates().startDate && !dateRangeSelectedDates().endDate) ? (filter.placeholder || 'Select') : dateRangeSelectedDates().startDate + ' - ' + dateRangeSelectedDates().endDate\" [positionX]=\"'start'\"\n [positionY]=\"'top'\" [selectedDates]=\"dateRangeSelectedDates()\" (dateChange)=\"onDateChange($event, filter.key, filter)\"\n [dpConfig]=\"filter.dateRangePickerConfig\" />\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'text'\">\n <mis-input type=\"rounded\">\n <input misInput type=\"text\" class=\"input\" [placeholder]=\"filter.placeholder || 'Type here'\" [formControlName]=\"filter.key\">\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'number'\">\n <mis-input type=\"rounded\">\n <input misInput type=\"number\" class=\"input\" [placeholder]=\"filter.placeholder || 'Type here'\" [formControlName]=\"filter.key\">\n </mis-input>\n </ng-container>\n <ng-container *ngIf=\"filter.type === 'range'\">\n <div class=\"range-container\" [formGroup]=\"filterForm.get(filter.key)\">\n <div class=\"range-inner-container\">\n <span>{{ filter?.options?.[0]?.label || 'Min' }}</span>\n <input\n misInput\n type=\"number\"\n class=\"input\"\n [placeholder]=\"filter.placeholder || 'Type here'\"\n formControlName=\"min\"\n />\n </div>\n <div class=\"range-inner-container\">\n <span>{{ filter?.options?.[1]?.label || 'Max' }}</span>\n <input\n misInput\n type=\"number\"\n class=\"input\"\n [placeholder]=\"filter.placeholder || 'Type here'\"\n formControlName=\"max\"\n [min]=\"filterForm.get(filter.key)?.get('min')?.value || 0\"\n />\n </div>\n </div>\n </ng-container>\n <div class=\"horizontal-divider\" *ngIf=\"!last\"></div>\n </div>\n </ng-container>\n </div>\n \n <div class=\"actions\">\n <mis-button [name]=\"'Clear All'\" [size]=\"'Small'\" [type]=\"'Text'\" (click)=\"resetFilters()\"></mis-button>\n <mis-button [name]=\"'Apply'\" [size]=\"'Small'\" [type]=\"'Solid'\" (click)=\"applyFilters()\" [disabled]=\"filterForm.invalid\"></mis-button>\n </div>\n </div>", styles: [":root{--pmry-200: #99BAF7;--pmry-100: #CBDDFB;--pmry-500: #0937B2;--pmry-400: #3C68D0;--pmry-600: #062A99;--pmry-700: #041F80;--pmry-300: #638FE7;--pmry-800: #021567;--pmry-900: #010F55;--sec-d-purple: #40447F;--sec-maroon: #6B034E;--sec-mud-red: #B23600;--sec-orange: #ED711C;--sec-purple: #815FD5;--sec-teal: #10ADAE;--sec-yellow: #D4900C;--sec-green: #547F40;--sec-bright-green: #27D22E;--sec-dark-teal: #035F6B;--sec-chocolate: #7C2F33;--sec-rube-pink: #C13D6D;--sec-cerulean: #0087B2;--sem-error: #B00020;--sem-info: #0091FF;--sem-warning: #FF9D00;--sem-success: #38AF49;--grey-bg-1: #FAFAFA;--grey-bg: #F5F5F5;--grey-seperators: #E0E0E0;--grey-disabled: #C8CDD3;--grey-hover: #F5F7FC;--grey-pressed: #E6EBF7;--grey-row: #F5F7FC;--dec-light-yellow: #F4E7C3;--dec-light-purple: #DACFF9;--dec-light-green: #E4F5E9;--dec-light-green2: #F1FFF3;--dec-light-pink: #FAE1EA;--dec-: #F4CBC1;--dec-lt-orange: #FAEFED;--dec-light-blue: #CFECF9;--dec-row-selection: #F1FDF8;--dec-row-selection2: #F2FBFF;--dec-row-lines: #D3E1E9;--text-white: #FFFFFF;--text-muted: #6A737D;--text-black: #181F33;--MR-solid-blue2:#C8D5F6;--MR-solid-purple:#C9C3FB;--MR-solid-orange:#EEAC9F;--MR-solid-green:#ACDADA;--MR-solid-brown:#E8C8AF;--MR-solid-yellow:#FFEFC7;--MR-solid-blue:#BBE6FF;--MR-solid-pink:#FFC6F2;--tr-hover:#F0F3FA;--tr-pressed:#DAE1F3;--brand-primary: #0937B2;--brand-primary-light: #3C68D0;--brand-primary-dark: #062A99;--brand-primary-darker: #041F80;--brand-primary-lighter: #638FE7;--brand-primary-lightest: #CBDDFB;--brand-primary-hover: #F0F3FA;--brand-primary-active: #DAE1F3;--brand-secondary: #ED711C;--brand-secondary-light: #F09E65;--brand-secondary-dark: #B23600;--brand-secondary-lighter: #FFC6F2;--brand-accent: #10ADAE;--brand-accent-light: #16CBBC;--brand-accent-dark: #035F6B;--brand-accent-lighter: #ACDADA;--brand-success: #38AF49;--brand-success-light: #4CAF50;--brand-success-dark: #216531;--brand-success-lighter: #E4F5E9;--brand-success-lightest: #F1FFF3;--brand-error: #B00020;--brand-error-light: #F04E4E;--brand-error-dark: #A60060;--brand-error-lighter: #FAE1EA;--brand-error-lightest: #FDF2F2;--brand-warning: #FF9D00;--brand-warning-light: #D4900C;--brand-warning-dark: #624000;--brand-warning-lighter: #F4E7C3;--brand-warning-lightest: #FAEFED;--brand-info: #0091FF;--brand-info-light: #35A1FF;--brand-info-dark: #0087B2;--brand-info-lighter: #CFECF9;--text-primary: #181F33;--text-secondary: #6A737D;--text-tertiary: #929DAB;--text-disabled: #929DAB;--text-primary-87: rgba(24, 31, 51, .87);--text-primary-60: rgba(24, 31, 51, .6);--text-primary-38: rgba(24, 31, 51, .38);--text-primary-12: rgba(24, 31, 51, .12);--bg-primary: #FFFFFF;--bg-secondary: #FAFAFA;--bg-tertiary: #F5F5F5;--bg-overlay: rgba(0, 0, 0, .32);--bg-overlay-light: rgba(0, 0, 0, .12);--bg-overlay-lighter: rgba(0, 0, 0, .08);--bg-overlay-lightest: rgba(0, 0, 0, .04);--border-primary: #E0E0E0;--border-secondary: #D6DCE2;--border-tertiary: #C8CDD3;--border-light: #F1F4F8;--border-primary-12: rgba(0, 0, 0, .12);--border-primary-08: rgba(0, 0, 0, .08);--border-primary-06: rgba(0, 0, 0, .06);--shadow-primary: rgba(0, 0, 0, .12);--shadow-secondary: rgba(0, 0, 0, .08);--shadow-tertiary: rgba(0, 0, 0, .04);--shadow-light: rgba(0, 0, 0, .06);--status-available: #929DAB;--status-unavailable: #CCD3DA;--status-hotseat: #857BFF;--status-multiteam: #10ADAE;--status-selected: #10ADAE;--status-upcoming: #D4900C;--status-room: #38AF49;--status-room-booked: #B23600;--status-room-unavailable: #181F33;--team-color-1: #F8C52E;--team-color-2: #FA8E20;--team-color-3: #987CDD;--team-color-4: #16CBBC;--team-color-5: #E65010;--team-color-6: #A60060;--team-color-7: #ED323B;--team-color-8: #35A1FF;--team-color-9: #80D348}.filter-panel-container{display:flex;flex-direction:column;height:100%;max-width:100%;min-width:20rem;position:absolute;right:0;background:var(--bg-primary, #FFFFFF);top:0;z-index:999;box-shadow:0 0 5px #000000a6;transition:all .3s ease}.filter-panel-container .panel-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;font-weight:700;margin:0 1rem;flex-basis:5%}.filter-panel-container .panel-header span{font-size:1.25rem}.filter-panel-container .panel-header .close-icon{cursor:pointer;border-radius:50%;transform:scale(1.4);padding:.3rem;transition:all .3s ease}.filter-panel-container .panel-header .close-icon:hover{background:var(--bg-tertiary, #F5F5F5)}.filter-panel-container .panel-header .close-icon:active{background:var(--border-primary, #E0E0E0)}.filter-panel-container .mat-divider.horizontal{margin:1rem}.filters{display:flex;flex-direction:column;flex:1;row-gap:.5rem;overflow:auto;padding:0 1rem}.filters .filter{display:flex;flex-direction:column}.filters .filter .filter-title{color:var(--text-secondary, #6A737D);font-size:.875rem;font-weight:700;line-height:20px;letter-spacing:.25px}.filters .filter .checkbox-row{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:.8rem 0}.filters .filter .checkbox-row .checkbox-container{display:flex;flex-direction:row;align-items:center;gap:.5rem}.filters .filter .checkbox-row .checkbox-label{display:block;width:8rem}.filters .filter .checkbox-row ::ng-deep .mat-checkbox-inner-container{width:20px;height:20px}.filters .filter .checkbox-row ::ng-deep .mat-checkbox-frame{border-radius:5px}.filters .filter .multiselect-filter,.filters .filter mis-input{padding:.7rem 0}.horizontal-divider{display:block;width:100%;height:1px;margin:.5rem 0;background:var(--border-primary, #E0E0E0)}.first{margin-top:0}.actions{display:flex;flex-direction:row;justify-content:end;align-items:center;gap:1rem;border-top:1px solid var(--border-primary, #E0E0E0);flex-basis:4%;padding:.5rem}.actions button{font-weight:700;border-radius:.5rem;width:6rem}.no-padding ::ng-deep .container{padding:0!important}.range-container{display:flex;justify-content:space-between;padding:.8rem 0}.range-container .range-inner-container{display:flex;flex-direction:column}.range-container .range-inner-container input{height:2.2rem;outline:none;border-radius:.375rem;border:1px solid var(--border-primary, #E0E0E0);width:8rem;padding:0 .5rem}.range-container .range-inner-container span{margin-bottom:.2rem}input.ng-invalid.ng-touched{border:1px solid var(--brand-error, #B00020);background-color:var(--brand-error-lightest, #FDF2F2)}\n"] }]
397
501
  }], () => [{ type: i1.HasValuePipe }], null); })();
398
502
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FilterPanelComponent, { className: "FilterPanelComponent" }); })();
399
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItcGFuZWwvZmlsdGVyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItcGFuZWwvZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUE0QixLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7OztJQ2MxQyw2QkFBb0Q7SUFFNUMsQUFESiwrQkFBZ0Msb0NBRzZCO0lBRmlGLHFTQUFZLHFEQUF3QyxLQUFDO0lBR25NLEFBRDZELGlCQUE0QixFQUNuRjs7Ozs7SUFINEMsZUFBd0M7SUFFbEYsQUFEMkIsQUFBM0IsQUFEb04sQUFBeEIsQUFBekcsQUFBekMseURBQXdDLDZEQUFtRCwyQkFBOEUsdUJBQXVCLDJCQUNoTix5QkFBeUIsMEJBQzFCOzs7O0lBR3JDLDZCQUErQztJQUV2QyxBQURKLCtCQUFnQyx1QkFFb0Y7SUFBeEcsd1JBQVkscURBQXdDLEtBQUM7SUFFakUsQUFESSxpQkFBZSxFQUNiOzs7OztJQUhZLGVBQXVCO0lBQ3lCLEFBRHhCLEFBQXhCLHdDQUF1Qix1QkFBdUIsNERBQ21EOzs7O0lBTzNHLEFBREosK0JBQXNFLHVCQUM2RztJQUF6RSxnVUFBZSx3RUFBd0QsS0FBQztJQUFDLGlCQUFlO0lBQzlMLGdDQUE2QjtJQUFBLFlBQWdCO0lBQ2pELEFBRGlELGlCQUFPLEVBQ2xE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TUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMvRCxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7cUhBL0tVLG9CQUFvQjtvRUFBcEIsb0JBQW9CO1lDakNqQyx1RUFBbUU7O1lBQTlCLGlDQUFZOysxUEQrQm5DLENBQUMsY0FBYyxDQUFDOztpRkFFakIsb0JBQW9CO2NBTmhDLFNBQVM7MkJBQ0Usa0JBQWtCLGNBR2hCLENBQUMsY0FBYyxDQUFDOztrRkFFakIsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGNvbXB1dGVkLCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzbGlkZUZyb21SaWdodCB9IGZyb20gJy4uL2FuaW1hdGlvbnMvc2xpZGVGcm9tUmlnaHQnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElEYXRlUGlja2VyQ29uZmlnIH0gZnJvbSAnbWlzLWNyeXN0YWwtZGVzaWduLXN5c3RlbS9kYXRlcGlja2VyX3YyJztcbmltcG9ydCB7IElSU2VsZWN0ZWREYXRlc0NvbmZpZyB9IGZyb20gJ21pcy1jcnlzdGFsLWRlc2lnbi1zeXN0ZW0vc3BlY2lmaWNkYXRlcGlja2VyJztcbmltcG9ydCB7IElEYXRlUGlja2VyQ29uZmlnIGFzIElEYXRlUmFuZ2VQaWNrZXJDb25maWcgfSBmcm9tIFwibWlzLWNyeXN0YWwtZGVzaWduLXN5c3RlbS9kYXRlcmFuZ2VwaWNrZXJfdjJcIjtcbmltcG9ydCB7IEhhc1ZhbHVlUGlwZSB9IGZyb20gJy4uL2hhcy12YWx1ZS5waXBlJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclBhbmVsQ29uZmlnIHtcbiAga2V5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6ICdtdWx0aVNlbGVjdCcgfCAnc2VsZWN0JyB8ICdkYXRlUGlja2VyJyB8ICdkYXRlUmFuZ2VQaWNrZXInIHwgJ2NoZWNrYm94JyB8ICdyYWRpbycgfCAndGV4dCcgfCAnbnVtYmVyJyB8ICdyYW5nZSc7XG4gIG9wdGlvbnM/OiBBcnJheTx7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIGRhdGE/OiBhbnlbXTtcbiAgfT47XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBoaWRkZW4/OiBib29sZWFuO1xuICBkYXRlUGlja2VyQ29uZmlnPzogSURhdGVQaWNrZXJDb25maWc7XG4gIGRhdGVSYW5nZVBpY2tlckNvbmZpZz86IElEYXRlUmFuZ2VQaWNrZXJDb25maWc7XG4gIG9uQ2hhbmdlPzogKGV2ZW50OiBhbnksIGNvbmZpZz86IEZpbHRlclBhbmVsQ29uZmlnW10sIGZvcm1WYWx1ZT86IGFueSkgPT4gdm9pZDtcbiAgZGVmYXVsdFZhbHVlPzogYW55O1xuICBzZWxlY3RlZFZhbHVlPzogYW55O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtaXMtZmlsdGVyLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbc2xpZGVGcm9tUmlnaHRdXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlclBhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBoYXNWYWx1ZTogSGFzVmFsdWVQaXBlKSB7fVxuXG4gIC8vIFNpZ25hbCBpbnB1dHMgcmVwbGFjaW5nIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgY29uZmlnID0gaW5wdXQucmVxdWlyZWQ8RmlsdGVyUGFuZWxDb25maWdbXT4oKTtcbiAgcHVibGljIGVtaXRGaWx0ZXJzQWZ0ZXJTZXR0aW5nTmV3VmFsdWVzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFNpZ25hbCBvdXRwdXRzIHJlcGxhY2luZyBAT3V0cHV0KClcbiAgcHVibGljIG9uQ2xvc2UgPSBvdXRwdXQoKTtcbiAgcHVibGljIG9uQXBwbHkgPSBvdXRwdXQ8eyBmaWx0ZXJEYXRhOiBhbnksIGZpbHRlckNvdW50OiBudW1iZXIgfT4oKTtcblxuICBmaWx0ZXJGb3JtOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgbGFzdEFwcGxpZWREYXRhOiBhbnk7XG5cbiAgcHVibGljIGRhdGVSYW5nZVNlbGVjdGVkRGF0ZXM6IFdyaXRhYmxlU2lnbmFsPElSU2VsZWN0ZWREYXRlc0NvbmZpZz4gPSBzaWduYWwoe1xuICAgIHN0YXJ0RGF0ZTogJycsXG4gICAgZW5kRGF0ZTogJycsXG4gIH0pO1xuXG4gIC8vIE1ldGhvZCB0byBjYWxjdWxhdGUgZmlsdGVyIGNvdW50IChub3QgYSBjb21wdXRlZCBzaWduYWwgYmVjYXVzZSBmb3JtIHZhbHVlcyBhcmVuJ3QgcmVhY3RpdmUpXG4gIGdldEZpbHRlckNvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZpbHRlckZvcm0udmFsdWU7XG4gICAgXG4gICAgdGhpcy5jb25maWcoKS5mb3JFYWNoKChmaWx0ZXI6IEZpbHRlclBhbmVsQ29uZmlnKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZvcm1WYWx1ZVtmaWx0ZXIua2V5XTtcbiAgICAgIFxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgcmFuZ2UgdHlwZSAtIG9ubHkgY291bnQgaWYgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHNldFxuICAgICAgaWYgKGZpbHRlci50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAodmFsdWUubWluICE9PSBudWxsIHx8IHZhbHVlLm1heCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgbXVsdGlTZWxlY3QvY2hlY2tib3ggLSBjaGVjayBhcnJheSBsZW5ndGggZGlyZWN0bHlcbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gJ211bHRpU2VsZWN0JyB8fCBmaWx0ZXIudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3Igb3RoZXIgdHlwZXMsIHVzZSBoYXNWYWx1ZSBwaXBlXG4gICAgICBpZiAodGhpcy5oYXNWYWx1ZS50cmFuc2Zvcm0odmFsdWUpKSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gQWNjZXNzIHRoZSBjb25maWcgc2lnbmFsIHZhbHVlIGJ5IGNhbGxpbmcgaXQgbGlrZSBhIGZ1bmN0aW9uXG4gICAgdGhpcy5pbml0aWFsaXplRm9ybUNvbnRyb2xzKHRoaXMuY29uZmlnKCkpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUZvcm1Db250cm9scyhjb25maWc6IEZpbHRlclBhbmVsQ29uZmlnW10pIHtcbiAgICB0aGlzLmZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgICBjb25maWcuZm9yRWFjaCgoZmlsdGVyOiBGaWx0ZXJQYW5lbENvbmZpZykgPT4ge1xuICAgICAgbGV0IGNvbnRyb2w6IGFueTtcbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICBjb250cm9sID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgbWluOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICAgICAgbWF4OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICB2YWxpZGF0b3JzOiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWluID0gZ3JvdXAuZ2V0KCdtaW4nKS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IGdyb3VwLmdldCgnbWF4JykudmFsdWU7XG4gICAgICAgICAgICBpZiAobWluICE9PSBudWxsICYmIG1heCAhPT0gbnVsbCAmJiBtaW4gPiBtYXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2VFcnJvcjogJ01pbiB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIG1heCB2YWx1ZScgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09PSAnbXVsdGlTZWxlY3QnIHx8IGZpbHRlci50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woW10pO1xuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWUudHJhbnNmb3JtKGZpbHRlci5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlckZvcm0uYWRkQ29udHJvbChmaWx0ZXIua2V5LCBjb250cm9sKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsb3NlUGFuZWwoKSB7XG4gICAgaWYgKHRoaXMubGFzdEFwcGxpZWREYXRhKSB7XG4gICAgICB0aGlzLmZpbHRlckZvcm0uc2V0VmFsdWUodGhpcy5sYXN0QXBwbGllZERhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsZWFyRm9ybVZhbHVlcygpO1xuICAgIH1cbiAgICAvLyBFbWl0IHRoZSBjbG9zZSBldmVudCB1c2luZyB0aGUgc2lnbmFsIG91dHB1dFxuICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyRm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgXG4gICAgdGhpcy5sYXN0QXBwbGllZERhdGEgPSB7IC4uLnRoaXMuZmlsdGVyRm9ybS52YWx1ZSB9O1xuICAgIC8vIEVtaXQgdGhlIGFwcGx5IGV2ZW50IHdpdGggdGhlIGZpbHRlciBkYXRhIHVzaW5nIHRoZSBzaWduYWwgb3V0cHV0XG4gICAgdGhpcy5vbkFwcGx5LmVtaXQoe1xuICAgICAgZmlsdGVyRGF0YTogdGhpcy5maWx0ZXJGb3JtLnZhbHVlLFxuICAgICAgZmlsdGVyQ291bnQ6IHRoaXMuZ2V0RmlsdGVyQ291bnQoKVxuICAgIH0pO1xuICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICB9XG5cbiAgaGFuZGxlU2VsZWN0KGV2ZW50OiBhbnksIGZpbHRlcktleTogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlclBhbmVsQ29uZmlnKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldChmaWx0ZXJLZXkpLnNldFZhbHVlKGV2ZW50KTtcbiAgICBpZiAoZmlsdGVyLm9uQ2hhbmdlKSB7XG4gICAgICBmaWx0ZXIub25DaGFuZ2UoZXZlbnQsIHRoaXMuY29uZmlnKCksIHRoaXMuZmlsdGVyRm9ybS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBhbnksIGZpbHRlcktleTogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlclBhbmVsQ29uZmlnKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldChmaWx0ZXJLZXkpLnNldFZhbHVlKGV2ZW50KTtcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5kYXRlUmFuZ2VTZWxlY3RlZERhdGVzLnNldCh7XG4gICAgICAgIHN0YXJ0RGF0ZTogZXZlbnQuc3RhcnREYXRlLFxuICAgICAgICBlbmREYXRlOiBldmVudC5lbmREYXRlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2hlY2tib3goZXZlbnQ6IGFueSwgZmlsdGVyS2V5OiBzdHJpbmcsIGNoZWNrYm94VmFsdWU6IHN0cmluZywgZmlsdGVyOiBGaWx0ZXJQYW5lbENvbmZpZykge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSB0aGlzLmZpbHRlckZvcm0uZ2V0KGZpbHRlcktleSkudmFsdWU7XG4gICAgaWYgKGV2ZW50LnZhbHVlKSB7XG4gICAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KGZpbHRlcktleSkuc2V0VmFsdWUoWy4uLmN1cnJlbnRWYWx1ZXMsIGNoZWNrYm94VmFsdWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldChmaWx0ZXJLZXkpLnNldFZhbHVlKGN1cnJlbnRWYWx1ZXMuZmlsdGVyKCh2YWx1ZTogc3RyaW5nKSA9PiB2YWx1ZSAhPT0gY2hlY2tib3hWYWx1ZSkpO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLm9uQ2hhbmdlKSB7XG4gICAgICBmaWx0ZXIub25DaGFuZ2UoZXZlbnQsIHRoaXMuY29uZmlnKCksIHRoaXMuZmlsdGVyRm9ybS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJGb3JtVmFsdWVzKCkge1xuICAgIGNvbnN0IHJlc2V0VmFsdWVzOiBhbnkgPSB7fTtcbiAgICB0aGlzLmNvbmZpZygpLmZvckVhY2goKGZpbHRlcjogRmlsdGVyUGFuZWxDb25maWcpID0+IHtcbiAgICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueSA9IGZpbHRlci5kZWZhdWx0VmFsdWUgfHwgbnVsbDtcbiAgICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gJ211bHRpU2VsZWN0JyB8fCBmaWx0ZXIudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSBmaWx0ZXIuZGVmYXVsdFZhbHVlIHx8IFtdO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlci50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZpbHRlci5kZWZhdWx0VmFsdWUgfHwgeyBtaW46IG51bGwsIG1heDogbnVsbCB9O1xuICAgICAgfVxuICAgICAgcmVzZXRWYWx1ZXNbZmlsdGVyLmtleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUocmVzZXRWYWx1ZXMpO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuY2xlYXJGb3JtVmFsdWVzKCk7XG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgfVxuXG4gIHNldEZpbHRlclZhbHVlKGNvbmZpZzogRmlsdGVyUGFuZWxDb25maWdbXSkge1xuICAgIGxldCBhbnlWYWx1ZVNldCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNvbmZpZykge1xuICAgICAgaWYgKGZpbHRlcj8uc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KGZpbHRlci5rZXkpLnNldFZhbHVlKGZpbHRlci5zZWxlY3RlZFZhbHVlKTtcbiAgICAgICAgYW55VmFsdWVTZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYW55VmFsdWVTZXQgJiYgdGhpcy5lbWl0RmlsdGVyc0FmdGVyU2V0dGluZ05ld1ZhbHVlcygpKSB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiZmlsdGVyLXBhbmVsLWNvbnRhaW5lclwiICpuZ0lmPVwic2hvdygpXCIgQHNsaWRlRnJvbVJpZ2h0PlxuICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGVyXCI+XG4gICAgICA8c3Bhbj5GaWx0ZXJzPC9zcGFuPlxuICAgICAgPHN2ZyBjbGFzcz1cImNsb3NlLWljb25cIiAoY2xpY2spPVwiY2xvc2VQYW5lbCgpXCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxnIGlkPVwiaWMtbmF2aWdhdGlvbi1jYW5jZWwtMjRcIj5cbiAgICAgICAgICAgICAgPHBhdGggaWQ9XCJVbmlvblwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk04LjYwNDY4IDYuNjQzNTVDOC4wOTAzNiA2LjEyOTIzIDcuMjU2NDkgNi4xMjkyMyA2Ljc0MjE4IDYuNjQzNTVDNi4yMjc4NyA3LjE1Nzg2IDYuMjI3ODcgNy45OTE3MyA2Ljc0MjE4IDguNTA2MDRMMTAuNDkzOCAxMi4yNTc2TDYuNzQzMSAxNi4wMDgzQzYuMjI4NzkgMTYuNTIyNiA2LjIyODc5IDE3LjM1NjQgNi43NDMxIDE3Ljg3MDhDNy4yNTc0MiAxOC4zODUxIDguMDkxMjkgMTguMzg1MSA4LjYwNTYwIDE3Ljg3MDhMMTIuMzU2MiAxNC4xMjAxTDE2LjEwNjggMTcuODcwN0MxNi42MjExIDE4LjM4NTAgMTcuNDU1MCAxOC4zODUwIDE3Ljk2OTMgMTcuODcwN0MxOC40ODM2IDE3LjM1NjQgMTguNDgzNiAxNi41MjI1IDE3Ljk2OTMgMTYuMDA4MkwxNC4yMTg3IDEyLjI1NzZMMTcuOTcwMiA4LjUwNjEzQzE4LjQ4NDUgNy45OTE4MSAxOC40ODQ1IDcuMTU3OTQgMTcuOTcwMiA2LjY0MzYzQzE3LjQ1NTkgNi4xMjkzMiAxNi42MjIwIDYuMTI5MzIgMTYuMTA3NyA2LjY0MzYzTDEyLjM1NjIgMTAuMzk1MUw4LjYwNDY4IDYuNjQzNTVaXCIgZmlsbD1cIiMxODFGMzNcIiAvPlxuICAgICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaXZpZGVyIGZpcnN0XCI+PC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZpbHRlcnNcIiBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBjb25maWcoKTsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlclwiICpuZ0lmPVwiIWZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItdGl0bGVcIj57e2ZpbHRlci50aXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdtdWx0aVNlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aXNlbGVjdC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWlzLW11bHRpLXNlbGVjdC1kcm9wZG93biBjbGFzcz1cIm5vLXBhZGRpbmdcIiBbbGFiZWxdPVwiZmlsdGVyLnBsYWNlaG9sZGVyIHx8ICdTZWxlY3QnXCIgW3NlbGVjdGVkSXRlbXNdPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSkudmFsdWVcIiAob25DaGFuZ2UpPVwiaGFuZGxlU2VsZWN0KCRldmVudCwgZmlsdGVyLmtleSwgZmlsdGVyKVwiIFtkYXRhXT1cImZpbHRlci5vcHRpb25zXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0ZWRDb3VudF09XCJ0cnVlXCIgW2VuYWJsZVNlbGVjdEFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVBcHBseUJ1dHRvbl09XCJmYWxzZVwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjQ0cHhcIj48L21pcy1tdWx0aS1zZWxlY3QtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3NlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aXNlbGVjdC1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWlzLWRyb3Bkb3duIFtkYXRhXT1cImZpbHRlci5vcHRpb25zXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjQ0cHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImhhbmRsZVNlbGVjdCgkZXZlbnQsIGZpbHRlci5rZXksIGZpbHRlcilcIiBbc2VsZWN0ZWRJdGVtXT1cImZpbHRlckZvcm0uZ2V0KGZpbHRlci5rZXkpLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9taXMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXIub3B0aW9uc1wiIGNsYXNzPVwiY2hlY2tib3gtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxtaXMtY2hlY2tib3ggW3R5cGVdPVwiJ0RlZmF1bHQnXCIgW2NoZWNrZWRdPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSkudmFsdWU/LmluY2x1ZGVzKG9wdGlvbi52YWx1ZSlcIiAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlQ2hlY2tib3goJGV2ZW50LCBmaWx0ZXIua2V5LCBvcHRpb24udmFsdWUsIGZpbHRlcilcIj48L21pcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPnt7b3B0aW9uLmxhYmVsfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ2RhdGVQaWNrZXInXCI+XG4gICAgICAgICAgICAgICAgICB7e2ZpbHRlci5wbGFjZWhvbGRlcn19XG4gICAgICAgICAgICAgICAgICA8bWlzLWlucHV0IHR5cGU9XCJyb3VuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1pc1R6RHAgbWlzSW5wdXQgdHlwZT1cInRleHRcIiByZWFkb25seSBjbGFzcz1cIm1pcy1pbnB1dFwiIFtkcENvbmZpZ109XCJmaWx0ZXIuZGF0ZXBpY2tlckNvbmZpZ1wiIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXJGb3JtLmdldChmaWx0ZXIua2V5KS52YWx1ZSA/IGZpbHRlckZvcm0uZ2V0KGZpbHRlci5rZXkpLnZhbHVlIDogKGZpbHRlci5wbGFjZWhvbGRlciB8fCAnU2VsZWN0JylcIiBbdmFsdWVdPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSkudmFsdWUgPyBmaWx0ZXJGb3JtLmdldChmaWx0ZXIua2V5KS52YWx1ZSA6IChmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1NlbGVjdCcpXCIgKGRhdGVDaGFuZ2UpPVwib25EYXRlQ2hhbmdlKCRldmVudCwgZmlsdGVyLmtleSwgZmlsdGVyKVwiIFtzZWxlY3RlZERhdGVdPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSkudmFsdWVcIiBbcG9zaXRpb25YXT1cIidlbmQnXCIgW29mZnNldFhdPVwiLTEwXCI+XG4gICAgICAgICAgICAgICAgICA8L21pcy1pbnB1dD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ2RhdGVSYW5nZVBpY2tlcidcIj5cbiAgICAgICAgICAgICAgICAgIDxtaXMtaW5wdXQgdHlwZT1cInJvdW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWlzVHpEcnAgbWlzSW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cIm1pcy1pbnB1dFwiIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIoIWRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMoKS5zdGFydERhdGUgJiYgIWRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMoKS5lbmREYXRlKSA/IChmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1NlbGVjdCcpIDogZGF0ZVJhbmdlU2VsZWN0ZWREYXRlcygpLnN0YXJ0RGF0ZSArICcgLSAnICsgZGF0ZVJhbmdlU2VsZWN0ZWREYXRlcygpLmVuZERhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiKCFkYXRlUmFuZ2VTZWxlY3RlZERhdGVzKCkuc3RhcnREYXRlICYmICFkYXRlUmFuZ2VTZWxlY3RlZERhdGVzKCkuZW5kRGF0ZSkgPyAoZmlsdGVyLnBsYWNlaG9sZGVyIHx8ICdTZWxlY3QnKSA6IGRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMoKS5zdGFydERhdGUgKyAnIC0gJyArIGRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMoKS5lbmREYXRlXCIgW3Bvc2l0aW9uWF09XCInc3RhcnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bvc2l0aW9uWV09XCIndG9wJ1wiIFtzZWxlY3RlZERhdGVzXT1cImRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMoKVwiIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQsIGZpbHRlci5rZXksIGZpbHRlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZHBDb25maWddPVwiZmlsdGVyLmRhdGVSYW5nZVBpY2tlckNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICA8L21pcy1pbnB1dD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICA8bWlzLWlucHV0IHR5cGU9XCJyb3VuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1pc0lucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1R5cGUgaGVyZSdcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5rZXlcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWlzLWlucHV0PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAnbnVtYmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgPG1pcy1pbnB1dCB0eXBlPVwicm91bmRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtaXNJbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJpbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1R5cGUgaGVyZSdcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5rZXlcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWlzLWlucHV0PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAncmFuZ2UnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFuZ2UtY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtLmdldChmaWx0ZXIua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1pbm5lci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZmlsdGVyPy5vcHRpb25zPy5bMF0/LmxhYmVsIHx8ICdNaW4nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc0lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbHRlci5wbGFjZWhvbGRlciB8fCAnVHlwZSBoZXJlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYW5nZS1pbm5lci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZmlsdGVyPy5vcHRpb25zPy5bMV0/LmxhYmVsIHx8ICdNYXgnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc0lucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbHRlci5wbGFjZWhvbGRlciB8fCAnVHlwZSBoZXJlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJmaWx0ZXJGb3JtLmdldD8uKGZpbHRlci5rZXkpPy5nZXQoJ21pbicpPy52YWx1ZSB8fCAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvcml6b250YWwtZGl2aWRlclwiICpuZ0lmPVwiIWxhc3RcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgPG1pcy1idXR0b24gW25hbWVdPVwiJ0NsZWFyIEFsbCdcIiBbc2l6ZV09XCInU21hbGwnXCIgW3R5cGVdPVwiJ1RleHQnXCIgKGNsaWNrKT1cInJlc2V0RmlsdGVycygpXCI+PC9taXMtYnV0dG9uPlxuICAgICAgPG1pcy1idXR0b24gW25hbWVdPVwiJ0FwcGx5J1wiIFtzaXplXT1cIidTbWFsbCdcIiBbdHlwZV09XCInU29saWQnXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCIgW2Rpc2FibGVkXT1cImZpbHRlckZvcm0uaW52YWxpZFwiPjwvbWlzLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19
503
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItcGFuZWwvZmlsdGVyLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItcGFuZWwvZmlsdGVyLXBhbmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBa0QsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztJQ0c5Qyw2QkFBb0Q7SUFFNUMsQUFESiwrQkFBZ0Msb0NBRzZCO0lBRndGLHFTQUFZLHFEQUF3QyxLQUFDO0lBRzFNLEFBRDZELGlCQUE0QixFQUNuRjs7Ozs7O0lBSDRDLGVBQXdDO0lBRWxGLEFBRDJCLEFBQTNCLEFBRDJOLEFBQXhCLEFBQWhILEFBQXpDLHlEQUF3QyxrSUFBMEQsMkJBQThFLHVCQUF1QiwyQkFDdk4seUJBQXlCLDBCQUMxQjs7OztJQUdyQyw2QkFBK0M7SUFFdkMsQUFESiwrQkFBZ0MsdUJBRXFGO0lBQXpHLHdSQUFZLHFEQUF3QyxLQUFDO0lBRWpFLEFBREksaUJBQWUsRUFDYjs7Ozs7O0lBSFksZUFBdUI7SUFDeUIsQUFEeEIsQUFBeEIsd0NBQXVCLHVCQUF1QixpR0FDb0Q7Ozs7SUFPNUcsQUFESiwrQkFBc0UsdUJBQzhHO0lBQXpFLGdVQUFlLHdFQUF3RCxLQUFDO0lBQUMsaUJBQWU7SUFDL0wsZ0NBQTZCO0lBQUEsWUFBZ0I7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Q0FBQztRQUV4QixLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNwQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxDQUFDO1lBQzNELDJDQUEyQztZQUMzQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQzthQUFNLENBQUM7WUFDTix5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO3FIQXhUVSxvQkFBb0I7b0VBQXBCLG9CQUFvQjtZQ3hEakMsdUVBQW1FOztZQUE5QixpQ0FBWTsrMVBEc0RuQyxDQUFDLGNBQWMsQ0FBQzs7aUZBRWpCLG9CQUFvQjtjQU5oQyxTQUFTOzJCQUNFLGtCQUFrQixjQUdoQixDQUFDLGNBQWMsQ0FBQzs7a0ZBRWpCLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIGVmZmVjdCxcbiAgc2lnbmFsLFxuICBjb21wdXRlZCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgV3JpdGFibGVTaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzbGlkZUZyb21SaWdodCB9IGZyb20gJy4uL2FuaW1hdGlvbnMvc2xpZGVGcm9tUmlnaHQnO1xuaW1wb3J0IHsgSURhdGVQaWNrZXJDb25maWcgfSBmcm9tICdtaXMtY3J5c3RhbC1kZXNpZ24tc3lzdGVtL2RhdGVwaWNrZXJfdjInO1xuaW1wb3J0IHsgSVJTZWxlY3RlZERhdGVzQ29uZmlnIH0gZnJvbSAnbWlzLWNyeXN0YWwtZGVzaWduLXN5c3RlbS9zcGVjaWZpY2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgSURhdGVQaWNrZXJDb25maWcgYXMgSURhdGVSYW5nZVBpY2tlckNvbmZpZyB9IGZyb20gJ21pcy1jcnlzdGFsLWRlc2lnbi1zeXN0ZW0vZGF0ZXJhbmdlcGlja2VyX3YyJztcbmltcG9ydCB7IEhhc1ZhbHVlUGlwZSB9IGZyb20gJy4uL2hhcy12YWx1ZS5waXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJPcHRpb24ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBkYXRhPzogYW55W107XG59XG5cbmV4cG9ydCB0eXBlIEZpbHRlclR5cGUgPVxuICB8ICdtdWx0aVNlbGVjdCdcbiAgfCAnc2VsZWN0J1xuICB8ICdkYXRlUGlja2VyJ1xuICB8ICdkYXRlUmFuZ2VQaWNrZXInXG4gIHwgJ2NoZWNrYm94J1xuICB8ICdyYWRpbydcbiAgfCAndGV4dCdcbiAgfCAnbnVtYmVyJ1xuICB8ICdyYW5nZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyUGFuZWxDb25maWcge1xuICBrZXk6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdHlwZTogRmlsdGVyVHlwZTtcbiAgb3B0aW9ucz86IEZpbHRlck9wdGlvbltdO1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgaGlkZGVuPzogYm9vbGVhbjtcbiAgZGF0ZVBpY2tlckNvbmZpZz86IElEYXRlUGlja2VyQ29uZmlnO1xuICBkYXRlUmFuZ2VQaWNrZXJDb25maWc/OiBJRGF0ZVJhbmdlUGlja2VyQ29uZmlnO1xuICBvbkNoYW5nZT86IChldmVudDogYW55LCBjb25maWc/OiBGaWx0ZXJQYW5lbENvbmZpZ1tdLCBmb3JtVmFsdWU/OiBhbnkpID0+IHZvaWQ7XG4gIGRlZmF1bHRWYWx1ZT86IGFueTtcbiAgc2VsZWN0ZWRWYWx1ZT86IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWlzLWZpbHRlci1wYW5lbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXItcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXItcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW3NsaWRlRnJvbVJpZ2h0XVxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBoYXNWYWx1ZTogSGFzVmFsdWVQaXBlKSB7XG4gICAgLy8gRWZmZWN0IHRvIHJlYWN0IHRvIGNvbmZpZyBjaGFuZ2VzIC0gbXVzdCBhbGxvdyBzaWduYWwgd3JpdGVzIHNpbmNlIHdlIHVwZGF0ZSBpbnRlcm5hbCBzaWduYWxzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNmZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgICAgIGlmIChjZmcgJiYgQXJyYXkuaXNBcnJheShjZmcpICYmIGNmZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gT25seSBpbml0aWFsaXplIGZvcm0gaWYgbm90IGFscmVhZHkgZG9uZSwgb3IgaWYgY29uZmlnIHN0cnVjdHVyZSBjaGFuZ2VkXG4gICAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgfHwgdGhpcy5oYXNDb25maWdDaGFuZ2VkKGNmZykpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1Db250cm9scyhjZmcpO1xuICAgICAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWx3YXlzIGNoZWNrIGZvciBzZWxlY3RlZFZhbHVlIGNoYW5nZXNcbiAgICAgICAgICB0aGlzLnNldEZpbHRlclZhbHVlKGNmZyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmlsdGVyUGFuZWw6IEVycm9yIGluIGNvbmZpZyBlZmZlY3QnLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qIC0tLSBzaWduYWwtYmFzZWQgSW5wdXRzIC8gT3V0cHV0cyAtLS0gKi9cbiAgcHVibGljIHNob3cgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBjb25maWcgPSBpbnB1dC5yZXF1aXJlZDxGaWx0ZXJQYW5lbENvbmZpZ1tdPigpO1xuICBwdWJsaWMgZW1pdEZpbHRlcnNBZnRlclNldHRpbmdOZXdWYWx1ZXMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIG9uQ2xvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcHVibGljIG9uQXBwbHkgPSBvdXRwdXQ8eyBmaWx0ZXJEYXRhOiBhbnk7IGZpbHRlckNvdW50OiBudW1iZXIgfT4oKTtcblxuICAvKiAtLS0gZm9ybSArIGludGVybmFsIHN0YXRlIC0tLSAqL1xuICBmaWx0ZXJGb3JtOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgcHJpdmF0ZSBmb3JtU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8vIGtlZXAgYSBzaWduYWwgc25hcHNob3Qgb2YgZm9ybSB2YWx1ZSBzbyBjb21wdXRlZCBjYW4gcmVhY3RcbiAgcHJpdmF0ZSBfZm9ybVZhbHVlU2lnbmFsOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHNpZ25hbCh7fSk7XG5cbiAgLy8gbGFzdCBhcHBsaWVkIHNuYXBzaG90IChzaWduYWwgc28gdGVtcGxhdGUvbG9naWMgY2FuIHJlYWQgcmVsaWFibHkpXG4gIHB1YmxpYyBsYXN0QXBwbGllZERhdGE6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsPiA9IHNpZ25hbChudWxsKTtcblxuICAvLyBkYXRlIHJhbmdlIHJlYWRhYmxlIGZvciB0ZW1wbGF0ZVxuICBwdWJsaWMgZGF0ZVJhbmdlU2VsZWN0ZWREYXRlczogV3JpdGFibGVTaWduYWw8SVJTZWxlY3RlZERhdGVzQ29uZmlnPiA9IHNpZ25hbCh7XG4gICAgc3RhcnREYXRlOiAnJyxcbiAgICBlbmREYXRlOiAnJ1xuICB9KTtcblxuICAvKiBjb21wdXRlZCBmaWx0ZXJDb3VudCAqL1xuICBwdWJsaWMgZmlsdGVyQ291bnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5fZm9ybVZhbHVlU2lnbmFsKCk7XG4gICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcoKTtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY2ZnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGZvcm1WYWx1ZVtmaWx0ZXIua2V5XTtcblxuICAgICAgaWYgKGZpbHRlci50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAodmFsdWUubWluICE9PSBudWxsIHx8IHZhbHVlLm1heCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdtdWx0aVNlbGVjdCcgfHwgZmlsdGVyLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNWYWx1ZS50cmFuc2Zvcm0odmFsdWUpKSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9KTtcblxuICAvKiAtLS0gTGlmZWN5Y2xlIC0tLSAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBzdWJzY3JpYmUgZm9ybSBjaGFuZ2VzIHNvIGNvbXB1dGVkL2ZpbHRlckNvdW50IHVwZGF0ZVxuICAgIHRoaXMuc3Vic2NyaWJlRm9ybUNoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qIC0tLSBGb3JtIGluaXQgJiBoZWxwZXJzIC0tLSAqL1xuICBpbml0aWFsaXplRm9ybUNvbnRyb2xzKGNvbmZpZzogRmlsdGVyUGFuZWxDb25maWdbXSk6IHZvaWQge1xuICAgIC8vIGJ1aWxkIGEgZnJlc2ggZm9ybSB0byBtYXRjaCBjb25maWdcbiAgICBjb25zdCBuZXdGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgICBjb25zdCByYW5nZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoZ3JvdXA6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IG1pbiA9IChncm91cC5nZXQoJ21pbicpIGFzIEZvcm1Db250cm9sKT8udmFsdWU7XG4gICAgICBjb25zdCBtYXggPSAoZ3JvdXAuZ2V0KCdtYXgnKSBhcyBGb3JtQ29udHJvbCk/LnZhbHVlO1xuICAgICAgaWYgKG1pbiAhPT0gbnVsbCAmJiBtYXggIT09IG51bGwgJiYgbWluID4gbWF4KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlRXJyb3I6ICdNaW4gdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiBtYXggdmFsdWUnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29uZmlnKSB7XG4gICAgICBsZXQgY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xuXG4gICAgICBzd2l0Y2ggKGZpbHRlci50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICBjb250cm9sID0gbmV3IEZvcm1Hcm91cChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbWluOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXG4gICAgICAgICAgICAgIG1heDogbmV3IEZvcm1Db250cm9sKG51bGwpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiByYW5nZVZhbGlkYXRvciB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtdWx0aVNlbGVjdCc6XG4gICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKEFycmF5LmlzQXJyYXkoZmlsdGVyLmRlZmF1bHRWYWx1ZSkgPyBmaWx0ZXIuZGVmYXVsdFZhbHVlIDogW10pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChmaWx0ZXIuZGVmYXVsdFZhbHVlID8/ICcnKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woZmlsdGVyLmRlZmF1bHRWYWx1ZSA/PyBudWxsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzVmFsdWUudHJhbnNmb3JtKGZpbHRlci5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmlsdGVyLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIG5ld0Zvcm0uYWRkQ29udHJvbChmaWx0ZXIua2V5LCBjb250cm9sKTtcbiAgICB9XG5cbiAgICAvLyByZXBsYWNlIGZvcm0gc2FmZWx5XG4gICAgLy8gcHJlc2VydmUgc3Vic2NyaXB0aW9uIHNvIHZhbHVlQ2hhbmdlcyBjb250aW51ZXMgdG8gdXBkYXRlIF9mb3JtVmFsdWVTaWduYWxcbiAgICB0aGlzLmZpbHRlckZvcm0gPSBuZXdGb3JtO1xuICAgIC8vIHVwZGF0ZSBzaWduYWwgc25hcHNob3QgaW1tZWRpYXRlbHlcbiAgICB0aGlzLl9mb3JtVmFsdWVTaWduYWwuc2V0KHsgLi4udGhpcy5maWx0ZXJGb3JtLnZhbHVlIH0pO1xuXG4gICAgLy8gcmUtc3Vic2NyaWJlIHRvIG5ldyBmb3JtJ3MgdmFsdWVDaGFuZ2VzXG4gICAgdGhpcy5zdWJzY3JpYmVGb3JtQ2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVGb3JtQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyB1bnN1YnNjcmliZSBwcmV2aW91cyBzdWJzY3JpcHRpb24gaWYgYW55XG4gICAgdGhpcy5mb3JtU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgLy8gc3Vic2NyaWJlIHRvIHZhbHVlQ2hhbmdlczsgc2V0IHNuYXBzaG90IHNpZ25hbFxuICAgIHRoaXMuZm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXM/LnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuX2Zvcm1WYWx1ZVNpZ25hbC5zZXQoeyAuLi52YWx1ZSB9KTtcbiAgICB9KTtcblxuICAgIC8vIGFsc28gc2V0IGluaXRpYWwgc25hcHNob3QgaW4gY2FzZSB2YWx1ZUNoYW5nZXMgZG9lc24ndCBlbWl0IGltbWVkaWF0ZWx5XG4gICAgdGhpcy5fZm9ybVZhbHVlU2lnbmFsLnNldCh7IC4uLnRoaXMuZmlsdGVyRm9ybS52YWx1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udHJvbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0uZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY29uZmlnIHN0cnVjdHVyZSBoYXMgY2hhbmdlZCAobmV3IGtleXMgb3IgcmVtb3ZlZCBrZXlzKVxuICAgKiBVc2VkIHRvIGRldGVybWluZSBpZiBmb3JtIG5lZWRzIHRvIGJlIHJlYnVpbHRcbiAgICovXG4gIHByaXZhdGUgaGFzQ29uZmlnQ2hhbmdlZChuZXdDb25maWc6IEZpbHRlclBhbmVsQ29uZmlnW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50S2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyRm9ybS5jb250cm9scykuc29ydCgpO1xuICAgIGNvbnN0IG5ld0tleXMgPSBuZXdDb25maWcubWFwKGYgPT4gZi5rZXkpLnNvcnQoKTtcbiAgICBcbiAgICBpZiAoY3VycmVudEtleXMubGVuZ3RoICE9PSBuZXdLZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjdXJyZW50S2V5cy5zb21lKChrZXksIGluZGV4KSA9PiBrZXkgIT09IG5ld0tleXNbaW5kZXhdKTtcbiAgfVxuXG4gIC8qIC0tLSBBY3Rpb25zIC8gVUkgaGFuZGxlcnMgLS0tICovXG4gIGNsb3NlUGFuZWwoKTogdm9pZCB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdEFwcGxpZWREYXRhKCk7XG4gICAgaWYgKGxhc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHByZWZlciBzZXRWYWx1ZSAoZW5zdXJlcyBzaGFwZSBtYXRjaGVzKTsgZmFsbGJhY2sgdG8gcGF0Y2hWYWx1ZVxuICAgICAgICB0aGlzLmZpbHRlckZvcm0uc2V0VmFsdWUobGFzdCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUobGFzdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJGb3JtVmFsdWVzKCk7XG4gICAgfVxuXG4gICAgLy8gZW1pdCBjbG9zZSBldmVudFxuICAgIHRoaXMub25DbG9zZS5lbWl0KCk7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmlsdGVyRm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNuYXBzaG90ID0geyAuLi50aGlzLmZpbHRlckZvcm0udmFsdWUgfTtcbiAgICB0aGlzLmxhc3RBcHBsaWVkRGF0YS5zZXQoc25hcHNob3QpO1xuXG4gICAgdGhpcy5vbkFwcGx5LmVtaXQoe1xuICAgICAgZmlsdGVyRGF0YTogc25hcHNob3QsXG4gICAgICBmaWx0ZXJDb3VudDogdGhpcy5maWx0ZXJDb3VudCgpXG4gICAgfSk7XG5cbiAgICAvLyBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggZWFybGllciBpbXBsZW1lbnRhdGlvbjpcbiAgICAvLyBoaWRlIHBhbmVsIChwYXJlbnQgc2hvdWxkIHJlYWQgc2hvdygpIHRvIGNsb3NlKSBhbmQgcmVzdG9yZSBmb3JtIHN0YXRlIHZpYSBjbG9zZVBhbmVsXG4gICAgLy8gTm90ZTogd2UgZG9uJ3QgbXV0YXRlIHNob3coKSBoZXJlOyBwYXJlbnQgb3ducyBzaG93IHNpZ25hbFxuICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJGb3JtVmFsdWVzKCk7XG4gICAgLy8gY2FsbCBhcHBseUZpbHRlcnMgdG8gbWFpbnRhaW4gcHJldmlvdXMgYmVoYXZpb3IgKHZhbGlkYXRpb24gKyBlbWl0KVxuICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gIH1cblxuICAvKiAtLS0gVmFsdWUgc2V0dGVycyAtLS0gKi9cbiAgaGFuZGxlU2VsZWN0KGV2ZW50OiBhbnksIGZpbHRlcktleTogc3RyaW5nLCBmaWx0ZXI6IEZpbHRlclBhbmVsQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgY3RybCA9IHRoaXMuZ2V0Q29udHJvbChmaWx0ZXJLZXkpO1xuICAgIFxuICAgIC8vIEZvciBtdWx0aVNlbGVjdCwgZXh0cmFjdCB2YWx1ZXMgZnJvbSBhcnJheSBvZiBvYmplY3RzIChpZiBuZWVkZWQpXG4gICAgbGV0IHZhbHVlVG9TZXQgPSBldmVudDtcbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdtdWx0aVNlbGVjdCcgJiYgQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICd2YWx1ZScgcHJvcGVydHlcbiAgICAgIGlmIChldmVudC5sZW5ndGggPiAwICYmIHR5cGVvZiBldmVudFswXSA9PT0gJ29iamVjdCcgJiYgJ3ZhbHVlJyBpbiBldmVudFswXSkge1xuICAgICAgICB2YWx1ZVRvU2V0ID0gZXZlbnQubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0udmFsdWUgfHwgaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGN0cmw/LnNldFZhbHVlKHZhbHVlVG9TZXQpO1xuICAgIGlmIChmaWx0ZXIub25DaGFuZ2UpIHtcbiAgICAgIC8vIGtlZXAgc2FtZSBjYWxsYmFjayBjb250cmFjdDogcGFzcyBldmVudCwgY29uZmlnIGFuZCBmb3JtIHNuYXBzaG90XG4gICAgICBmaWx0ZXIub25DaGFuZ2UoZXZlbnQsIHRoaXMuY29uZmlnKCksIHRoaXMuZmlsdGVyRm9ybS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2hlY2tib3goZXZlbnQ6IGFueSwgZmlsdGVyS2V5OiBzdHJpbmcsIGNoZWNrYm94VmFsdWU6IHN0cmluZywgZmlsdGVyOiBGaWx0ZXJQYW5lbENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmdldENvbnRyb2woZmlsdGVyS2V5KTtcbiAgICBjb25zdCBjdXJyZW50ID0gQXJyYXkuaXNBcnJheShjdHJsPy52YWx1ZSkgPyBbLi4uY3RybC52YWx1ZV0gOiBbXTtcbiAgICBpZiAoZXZlbnQ/LnZhbHVlKSB7XG4gICAgICBjdHJsPy5zZXRWYWx1ZShbLi4uY3VycmVudCwgY2hlY2tib3hWYWx1ZV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHJsPy5zZXRWYWx1ZShjdXJyZW50LmZpbHRlcigodikgPT4gdiAhPT0gY2hlY2tib3hWYWx1ZSkpO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXIub25DaGFuZ2UpIHtcbiAgICAgIGZpbHRlci5vbkNoYW5nZShldmVudCwgdGhpcy5jb25maWcoKSwgdGhpcy5maWx0ZXJGb3JtLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvbkRhdGVDaGFuZ2UoZXZlbnQ6IGFueSwgZmlsdGVyS2V5OiBzdHJpbmcsIGZpbHRlcjogRmlsdGVyUGFuZWxDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBjdHJsID0gdGhpcy5nZXRDb250cm9sKGZpbHRlcktleSk7XG4gICAgY3RybD8uc2V0VmFsdWUoZXZlbnQpO1xuXG4gICAgaWYgKGV2ZW50ICYmIHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcgJiYgJ3N0YXJ0RGF0ZScgaW4gZXZlbnQgJiYgJ2VuZERhdGUnIGluIGV2ZW50KSB7XG4gICAgICB0aGlzLmRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMuc2V0KHtcbiAgICAgICAgc3RhcnREYXRlOiBldmVudC5zdGFydERhdGUsXG4gICAgICAgIGVuZERhdGU6IGV2ZW50LmVuZERhdGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tLSBDbGVhciAvIFNldCB2YWx1ZXMgaGVscGVycyAtLS0gKi9cbiAgY2xlYXJGb3JtVmFsdWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc2V0czogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5jb25maWcoKSkge1xuICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55ID0gZmlsdGVyLmRlZmF1bHRWYWx1ZSA/PyBudWxsO1xuICAgICAgaWYgKGZpbHRlci50eXBlID09PSAnbXVsdGlTZWxlY3QnIHx8IGZpbHRlci50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IGZpbHRlci5kZWZhdWx0VmFsdWUgPz8gW107XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gZmlsdGVyLmRlZmF1bHRWYWx1ZSA/PyB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07XG4gICAgICB9XG4gICAgICByZXNldHNbZmlsdGVyLmtleV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgLy8gcGF0Y2ggdG8gYXZvaWQgc2hhcGUgbWlzbWF0Y2ggZXJyb3JzXG4gICAgdGhpcy5maWx0ZXJGb3JtLnBhdGNoVmFsdWUocmVzZXRzKTtcbiAgICB0aGlzLl9mb3JtVmFsdWVTaWduYWwuc2V0KHsgLi4udGhpcy5maWx0ZXJGb3JtLnZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZmlsdGVyLnNlbGVjdGVkVmFsdWUgd2hlbiBwYXJlbnQgcHJvdmlkZXMgc2VsZWN0ZWRWYWx1ZS5cbiAgICogQ2FsbGVkIGJ5IHRoZSBjb25maWcgZWZmZWN0IChzbyBydW5zIG9uIGluaXRpYWwgbG9hZCBhbmQgb24gY29uZmlnIGNoYW5nZXMpLlxuICAgKi9cbiAgc2V0RmlsdGVyVmFsdWUoY29uZmlnOiBGaWx0ZXJQYW5lbENvbmZpZ1tdKTogdm9pZCB7XG4gICAgbGV0IGFueVZhbHVlU2V0ID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBjb25maWcpIHtcbiAgICAgIGlmICh0aGlzLmhhc1ZhbHVlLnRyYW5zZm9ybShmaWx0ZXI/LnNlbGVjdGVkVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGN0cmwgPSB0aGlzLmdldENvbnRyb2woZmlsdGVyLmtleSk7XG4gICAgICAgIGlmIChjdHJsKSB7XG4gICAgICAgICAgY3RybC5zZXRWYWx1ZShmaWx0ZXIuc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgICAgYW55VmFsdWVTZXQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFueVZhbHVlU2V0ICYmIHRoaXMuZW1pdEZpbHRlcnNBZnRlclNldHRpbmdOZXdWYWx1ZXMoKSkge1xuICAgICAgLy8gcmVzcGVjdCB0aGUgcGFyZW50IGZsYWcg4oCUIGFwcGx5IGFuZCBlbWl0XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBtYWtlIHN1cmUgb3VyIHNuYXBzaG90IHNpZ25hbCBpcyBmcmVzaFxuICAgICAgdGhpcy5fZm9ybVZhbHVlU2lnbmFsLnNldCh7IC4uLnRoaXMuZmlsdGVyRm9ybS52YWx1ZSB9KTtcbiAgICB9XG4gIH1cbn0iLCI8ZGl2IGNsYXNzPVwiZmlsdGVyLXBhbmVsLWNvbnRhaW5lclwiICpuZ0lmPVwic2hvdygpXCIgQHNsaWRlRnJvbVJpZ2h0PlxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkZXJcIj5cbiAgICAgICAgPHNwYW4+RmlsdGVyczwvc3Bhbj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cImNsb3NlLWljb25cIiAoY2xpY2spPVwiY2xvc2VQYW5lbCgpXCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPGcgaWQ9XCJpYy1uYXZpZ2F0aW9uLWNhbmNlbC0yNFwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGlkPVwiVW5pb25cIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNOC42MDQ2OCA2LjY0MzU1QzguMDkwMzYgNi4xMjkyMyA3LjI1NjQ5IDYuMTI5MjMgNi43NDIxOCA2LjY0MzU1QzYuMjI3ODcgNy4xNTc4NiA2LjIyNzg3IDcuOTkxNzMgNi43NDIxOCA4LjUwNjA0TDEwLjQ5MzggMTIuMjU3Nkw2Ljc0MzEgMTYuMDA4M0M2LjIyODc5IDE2LjUyMjYgNi4yMjg3OSAxNy4zNTY0IDYuNzQzMSAxNy44NzA4QzcuMjU3NDIgMTguMzg1MSA4LjA5MTI5IDE4LjM4NTEgOC42MDU2MCAxNy44NzA4TDEyLjM1NjIgMTQuMTIwMUwxNi4xMDY4IDE3Ljg3MDdDMTYuNjIxMSAxOC4zODUwIDE3LjQ1NTAgMTguMzg1MCAxNy45NjkzIDE3Ljg3MDdDMTguNDgzNiAxNy4zNTY0IDE4LjQ4MzYgMTYuNTIyNSAxNy45NjkzIDE2LjAwODJMMTQuMjE4NyAxMi4yNTc2TDE3Ljk3MDIgOC41MDYxM0MxOC40ODQ1IDcuOTkxODEgMTguNDg0NSA3LjE1Nzk0IDE3Ljk3MDIgNi42NDM2M0MxNy40NTU5IDYuMTI5MzIgMTYuNjIyMCA2LjEyOTMyIDE2LjEwNzcgNi42NDM2M0wxMi4zNTYyIDEwLjM5NTFMOC42MDQ2OCA2LjY0MzU1WlwiIGZpbGw9XCIjMTgxRjMzXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJob3Jpem9udGFsLWRpdmlkZXIgZmlyc3RcIj48L2Rpdj5cbiAgXG4gICAgPGRpdiBjbGFzcz1cImZpbHRlcnNcIiBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIGNvbmZpZygpOyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJcIiAqbmdJZj1cIiFmaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItdGl0bGVcIj57e2ZpbHRlci50aXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ211bHRpU2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGlzZWxlY3QtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWlzLW11bHRpLXNlbGVjdC1kcm9wZG93biBjbGFzcz1cIm5vLXBhZGRpbmdcIiBbbGFiZWxdPVwiZmlsdGVyLnBsYWNlaG9sZGVyIHx8ICdTZWxlY3QnXCIgW3NlbGVjdGVkSXRlbXNdPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSk/LnZhbHVlIHx8IFtdXCIgKG9uQ2hhbmdlKT1cImhhbmRsZVNlbGVjdCgkZXZlbnQsIGZpbHRlci5rZXksIGZpbHRlcilcIiBbZGF0YV09XCJmaWx0ZXIub3B0aW9uc1wiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2VsZWN0ZWRDb3VudF09XCJ0cnVlXCIgW2VuYWJsZVNlbGVjdEFsbF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZUFwcGx5QnV0dG9uXT1cImZhbHNlXCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiNDRweFwiPjwvbWlzLW11bHRpLXNlbGVjdC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGlzZWxlY3QtZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWlzLWRyb3Bkb3duIFtkYXRhXT1cImZpbHRlci5vcHRpb25zXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjQ0cHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiaGFuZGxlU2VsZWN0KCRldmVudCwgZmlsdGVyLmtleSwgZmlsdGVyKVwiIFtzZWxlY3RlZEl0ZW1dPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21pcy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAnY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXIub3B0aW9uc1wiIGNsYXNzPVwiY2hlY2tib3gtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1pcy1jaGVja2JveCBbdHlwZV09XCInRGVmYXVsdCdcIiBbY2hlY2tlZF09XCJmaWx0ZXJGb3JtLmdldChmaWx0ZXIua2V5KT8udmFsdWU/LmluY2x1ZGVzKG9wdGlvbi52YWx1ZSlcIiAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlQ2hlY2tib3goJGV2ZW50LCBmaWx0ZXIua2V5LCBvcHRpb24udmFsdWUsIGZpbHRlcilcIj48L21pcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+e3tvcHRpb24ubGFiZWx9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLnR5cGUgPT09ICdkYXRlUGlja2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWlzLWlucHV0IHR5cGU9XCJyb3VuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWlzVHpEcCBtaXNJbnB1dCB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IGNsYXNzPVwibWlzLWlucHV0XCIgW2RwQ29uZmlnXT1cImZpbHRlci5kYXRlUGlja2VyQ29uZmlnXCIgW3BsYWNlaG9sZGVyXT1cImZpbHRlckZvcm0uZ2V0KGZpbHRlci5rZXkpPy52YWx1ZSB8fCBmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1NlbGVjdCdcIiBbdmFsdWVdPVwiZmlsdGVyRm9ybS5nZXQoZmlsdGVyLmtleSk/LnZhbHVlIHx8IGZpbHRlci5wbGFjZWhvbGRlciB8fCAnU2VsZWN0J1wiIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQsIGZpbHRlci5rZXksIGZpbHRlcilcIiBbc2VsZWN0ZWREYXRlXT1cImZpbHRlckZvcm0uZ2V0KGZpbHRlci5rZXkpPy52YWx1ZVwiIFtwb3NpdGlvblhdPVwiJ2VuZCdcIiBbb2Zmc2V0WF09XCItMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9taXMtaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAnZGF0ZVJhbmdlUGlja2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWlzLWlucHV0IHR5cGU9XCJyb3VuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWlzVHpEcnAgbWlzSW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cIm1pcy1pbnB1dFwiIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIighZGF0ZVJhbmdlU2VsZWN0ZWREYXRlcygpLnN0YXJ0RGF0ZSAmJiAhZGF0ZVJhbmdlU2VsZWN0ZWREYXRlcygpLmVuZERhdGUpID8gKGZpbHRlci5wbGFjZWhvbGRlciB8fCAnU2VsZWN0JykgOiBkYXRlUmFuZ2VTZWxlY3RlZERhdGVzKCkuc3RhcnREYXRlICsgJyAtICcgKyBkYXRlUmFuZ2VTZWxlY3RlZERhdGVzKCkuZW5kRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIighZGF0ZVJhbmdlU2VsZWN0ZWREYXRlcygpLnN0YXJ0RGF0ZSAmJiAhZGF0ZVJhbmdlU2VsZWN0ZWREYXRlcygpLmVuZERhdGUpID8gKGZpbHRlci5wbGFjZWhvbGRlciB8fCAnU2VsZWN0JykgOiBkYXRlUmFuZ2VTZWxlY3RlZERhdGVzKCkuc3RhcnREYXRlICsgJyAtICcgKyBkYXRlUmFuZ2VTZWxlY3RlZERhdGVzKCkuZW5kRGF0ZVwiIFtwb3NpdGlvblhdPVwiJ3N0YXJ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bvc2l0aW9uWV09XCIndG9wJ1wiIFtzZWxlY3RlZERhdGVzXT1cImRhdGVSYW5nZVNlbGVjdGVkRGF0ZXMoKVwiIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQsIGZpbHRlci5rZXksIGZpbHRlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkcENvbmZpZ109XCJmaWx0ZXIuZGF0ZVJhbmdlUGlja2VyQ29uZmlnXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9taXMtaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1pcy1pbnB1dCB0eXBlPVwicm91bmRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1pc0lucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1R5cGUgaGVyZSdcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9taXMtaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50eXBlID09PSAnbnVtYmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWlzLWlucHV0IHR5cGU9XCJyb3VuZGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWlzSW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyLnBsYWNlaG9sZGVyIHx8ICdUeXBlIGhlcmUnXCIgW2Zvcm1Db250cm9sTmFtZV09XCJmaWx0ZXIua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWlzLWlucHV0PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHlwZSA9PT0gJ3JhbmdlJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFuZ2UtY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtLmdldChmaWx0ZXIua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhbmdlLWlubmVyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZpbHRlcj8ub3B0aW9ucz8uWzBdPy5sYWJlbCB8fCAnTWluJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyLnBsYWNlaG9sZGVyIHx8ICdUeXBlIGhlcmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFuZ2UtaW5uZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZmlsdGVyPy5vcHRpb25zPy5bMV0/LmxhYmVsIHx8ICdNYXgnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXIucGxhY2Vob2xkZXIgfHwgJ1R5cGUgaGVyZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImZpbHRlckZvcm0uZ2V0KGZpbHRlci5rZXkpPy5nZXQoJ21pbicpPy52YWx1ZSB8fCAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3Jpem9udGFsLWRpdmlkZXJcIiAqbmdJZj1cIiFsYXN0XCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgIDxtaXMtYnV0dG9uIFtuYW1lXT1cIidDbGVhciBBbGwnXCIgW3NpemVdPVwiJ1NtYWxsJ1wiIFt0eXBlXT1cIidUZXh0J1wiIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiPjwvbWlzLWJ1dHRvbj5cbiAgICAgICAgPG1pcy1idXR0b24gW25hbWVdPVwiJ0FwcGx5J1wiIFtzaXplXT1cIidTbWFsbCdcIiBbdHlwZV09XCInU29saWQnXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCIgW2Rpc2FibGVkXT1cImZpbHRlckZvcm0uaW52YWxpZFwiPjwvbWlzLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+Il19