@byuhbll/components 4.0.0-alpha.2 → 4.0.0-alpha.21

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.
Files changed (53) hide show
  1. package/esm2022/lib/animations/animations.mjs +19 -1
  2. package/esm2022/lib/checkbox/checkbox.component.mjs +15 -0
  3. package/esm2022/lib/copy-tooltip/copy-tooltip.component.mjs +49 -0
  4. package/esm2022/lib/expand-collapse/expand-collapse.component.mjs +31 -0
  5. package/esm2022/lib/hbll-footer/hbll-footer.component.mjs +76 -0
  6. package/esm2022/lib/hbll-header/hbll-header.component.mjs +81 -31
  7. package/esm2022/lib/hbll-header/models/library-hours.mjs +2 -0
  8. package/esm2022/lib/hbll-header/nav-bar/nav-bar.component.mjs +333 -0
  9. package/esm2022/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.mjs +29 -0
  10. package/esm2022/lib/hbll-header/pipes/library-hours.pipe.mjs +31 -0
  11. package/esm2022/lib/header-with-impersonation/header-with-impersonation.component.mjs +38 -0
  12. package/esm2022/lib/impersonate-modal/impersonate-modal.component.mjs +190 -0
  13. package/esm2022/lib/impersonation-banner/impersonation-banner.component.mjs +128 -0
  14. package/esm2022/lib/impersonation-banner/models/application-access.mjs +7 -0
  15. package/esm2022/lib/impersonation-banner/models/person-summary.mjs +15 -0
  16. package/esm2022/lib/models/token-payload.mjs +2 -0
  17. package/esm2022/lib/multi-select/multi-select.component.mjs +115 -0
  18. package/esm2022/lib/ss-search-bar/advanced-search/advanced-search.component.mjs +5 -5
  19. package/esm2022/lib/ss-search-bar/ss-search-bar.component.mjs +3 -3
  20. package/esm2022/lib/utils.mjs +7 -0
  21. package/esm2022/public-api.mjs +5 -1
  22. package/fesm2022/byuhbll-components.mjs +982 -65
  23. package/fesm2022/byuhbll-components.mjs.map +1 -1
  24. package/lib/animations/animations.d.ts +1 -0
  25. package/lib/{hbll-checkbox/hbll-checkbox.component.d.ts → checkbox/checkbox.component.d.ts} +2 -2
  26. package/lib/copy-tooltip/copy-tooltip.component.d.ts +12 -0
  27. package/lib/expand-collapse/expand-collapse.component.d.ts +10 -0
  28. package/lib/hbll-footer/hbll-footer.component.d.ts +29 -0
  29. package/lib/hbll-header/hbll-header.component.d.ts +23 -28
  30. package/lib/hbll-header/models/library-hours.d.ts +10 -0
  31. package/lib/hbll-header/nav-bar/nav-bar.component.d.ts +30 -0
  32. package/lib/hbll-header/nav-bar-dropdown/nav-bar-dropdown.component.d.ts +12 -0
  33. package/lib/hbll-header/pipes/library-hours.pipe.d.ts +7 -0
  34. package/lib/header-with-impersonation/header-with-impersonation.component.d.ts +19 -0
  35. package/lib/impersonate-modal/impersonate-modal.component.d.ts +60 -0
  36. package/lib/impersonation-banner/impersonation-banner.component.d.ts +31 -0
  37. package/lib/impersonation-banner/models/application-access.d.ts +15 -0
  38. package/lib/impersonation-banner/models/person-summary.d.ts +33 -0
  39. package/lib/models/token-payload.d.ts +3 -0
  40. package/lib/{hbll-multi-select/hbll-multi-select.component.d.ts → multi-select/multi-select.component.d.ts} +1 -1
  41. package/lib/ss-search-bar/advanced-search/advanced-search.component.d.ts +4 -1
  42. package/lib/utils.d.ts +5 -0
  43. package/package.json +4 -1
  44. package/public-api.d.ts +4 -0
  45. package/styles/scss/_mixins.scss +1 -1
  46. package/styles/scss/_vars.scss +7 -0
  47. package/styles/scss/base.scss +38 -7
  48. package/styles/scss/cta-btn.scss +2 -2
  49. package/styles/scss/pill-btn.scss +2 -2
  50. package/styles/scss/shared.scss +7 -0
  51. package/styles/scss/spinner.scss +20 -0
  52. package/esm2022/lib/hbll-checkbox/hbll-checkbox.component.mjs +0 -17
  53. package/esm2022/lib/hbll-multi-select/hbll-multi-select.component.mjs +0 -115
@@ -0,0 +1,115 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatAutocompleteModule, } from '@angular/material/autocomplete';
4
+ import { MatFormFieldModule } from '@angular/material/form-field';
5
+ import { MatChipsModule } from '@angular/material/chips';
6
+ import { COMMA, ENTER } from '@angular/cdk/keycodes';
7
+ import { MatIconModule } from '@angular/material/icon';
8
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
9
+ import { combineLatest } from 'rxjs';
10
+ import { map, startWith } from 'rxjs/operators';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "@angular/material/chips";
14
+ import * as i3 from "@angular/material/form-field";
15
+ import * as i4 from "@angular/material/autocomplete";
16
+ import * as i5 from "@angular/material/core";
17
+ import * as i6 from "@angular/forms";
18
+ export class HbllMultiSelectComponent {
19
+ constructor() {
20
+ this.allOptions = {};
21
+ this.label = '';
22
+ /**
23
+ * An array that indicates which keys are selected.
24
+ */
25
+ this.selectedKeys = [];
26
+ /**
27
+ * An EventEmitter that emits an array of keys indicating which options are currently selected.
28
+ */
29
+ this.selectedKeysChange = new EventEmitter();
30
+ this.inputControl = new FormControl('');
31
+ this.filteredOptions$ = combineLatest([
32
+ this.inputControl.valueChanges.pipe(startWith('')),
33
+ this.selectedKeysChange.asObservable().pipe(startWith([])),
34
+ ]).pipe(map(([key]) =>
35
+ // Display filtered options if there is a value, else display all options currently not selected.
36
+ key
37
+ ? this.filterOptions(key)
38
+ : Object.keys(this.allOptions).filter((key) => !this.selectedKeys.find((selectedOption) => key === selectedOption))));
39
+ this.separatorKeysCodes = [ENTER, COMMA];
40
+ /**
41
+ * Adds an option to the array of selected keys when a user selects from the autocomplete.
42
+ * @param {MatAutocompleteSelectedEvent} event MatAutocompleteSelectedEvent
43
+ */
44
+ this.selectOption = (event) => {
45
+ this.addOptionToSelectedOptions(event.option.value);
46
+ };
47
+ /**
48
+ * Filters the options by the supplied value as well as the currently selected values.
49
+ * @param {string} value value to filter by.
50
+ * @returns {string[]} the filtered keys
51
+ */
52
+ this.filterOptions = (value) => {
53
+ return Object.keys(this.allOptions).filter((key) => this.allOptions[key].toLowerCase().includes(value.toLowerCase()) &&
54
+ !this.selectedKeys.includes(key));
55
+ };
56
+ /**
57
+ * Adds a key to the selected keys array if the option is truthy and not already in the array.
58
+ * The input is also cleared (if available), and the new selected keys are emitted.
59
+ * @param {key} option key to add
60
+ */
61
+ this.addOptionToSelectedOptions = (key) => {
62
+ if (key && !this.selectedKeys.includes(key) && this.allOptions[key]) {
63
+ this.selectedKeys.push(key);
64
+ this.inputControl.setValue('');
65
+ this.selectedKeysChange.emit(this.selectedKeys);
66
+ if (this.inputRef)
67
+ this.inputRef.nativeElement.value = '';
68
+ }
69
+ };
70
+ }
71
+ /**
72
+ * Adds a key from the input to the array of selected key.
73
+ * The value from the input must match a key from the record of all options.
74
+ * @param {MatChipInputEvent} event MatChipInputEvent
75
+ */
76
+ addOption(event) {
77
+ this.addOptionToSelectedOptions(event.value);
78
+ }
79
+ /**
80
+ * Removes a key from the array of selected options and emits the new selected keys.
81
+ * @param {MultiSelectKeyValPair} key key to remove
82
+ */
83
+ removeOption(key) {
84
+ const index = this.selectedKeys.indexOf(key);
85
+ if (index >= 0) {
86
+ this.selectedKeys.splice(index, 1);
87
+ this.selectedKeysChange.emit(this.selectedKeys);
88
+ }
89
+ }
90
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
91
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HbllMultiSelectComponent, isStandalone: true, selector: "lib-multi-select", inputs: { allOptions: "allOptions", label: "label", selectedKeys: "selectedKeys" }, outputs: { selectedKeysChange: "selectedKeysChange" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"components-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n @if (allOptions[key]) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined components-icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n }\n </mat-chip-grid>\n <label class=\"components-hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".components-multi-select{font:inherit}.components-multi-select mat-form-field{font:inherit;background-color:#fff;width:100%}.components-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.components-multi-select mat-form-field .mat-mdc-chip-input{font:inherit;margin-left:0}.components-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.components-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.components-multi-select .components-icon{font-size:1em}.components-multi-select .mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{font:inherit}.components-multi-select .components-hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i2.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HbllMultiSelectComponent, decorators: [{
94
+ type: Component,
95
+ args: [{ selector: 'lib-multi-select', standalone: true, imports: [
96
+ CommonModule,
97
+ MatChipsModule,
98
+ MatFormFieldModule,
99
+ MatAutocompleteModule,
100
+ ReactiveFormsModule,
101
+ MatIconModule,
102
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"components-multi-select\">\n <mat-form-field appearance=\"outline\">\n <mat-chip-grid #chipGrid [attr.aria-label]=\"label + ' selection'\">\n @for (key of selectedKeys; track key) {\n @if (allOptions[key]) {\n <mat-chip-row (removed)=\"removeOption(key)\" data-testid=\"matChipRow\">\n {{ allOptions[key] }}\n <button\n matChipRemove\n [attr.aria-label]=\"'remove ' + allOptions[key]\"\n [attr.data-testid]=\"'remove' + key\"\n >\n <span class=\"material-symbols-outlined components-icon\"> cancel </span>\n </button>\n </mat-chip-row>\n }\n }\n </mat-chip-grid>\n <label class=\"components-hidden\" for=\"input\">{{ label }}</label>\n <input\n [placeholder]=\"label | titlecase\"\n #input\n id=\"input\"\n [formControl]=\"inputControl\"\n [matChipInputFor]=\"chipGrid\"\n [matAutocomplete]=\"auto\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (matChipInputTokenEnd)=\"addOption($event)\"\n data-testid=\"input\"\n />\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"selectOption($event)\"\n data-testid=\"autocomplete\"\n >\n @for (key of filteredOptions$ | async; track key) {\n <mat-option [value]=\"key\" data-testid=\"autocompleteOption\">\n {{ allOptions[key] }}\n </mat-option>\n }\n </mat-autocomplete>\n </mat-form-field>\n</div>\n", styles: [".components-multi-select{font:inherit}.components-multi-select mat-form-field{font:inherit;background-color:#fff;width:100%}.components-multi-select mat-form-field .mat-mdc-form-field-infix{padding:.35em 0;min-height:0}.components-multi-select mat-form-field .mat-mdc-chip-input{font:inherit;margin-left:0}.components-multi-select mat-form-field .mat-mdc-chip-input::placeholder{opacity:.75}.components-multi-select mat-form-field .mat-mdc-text-field-wrapper{padding:0 .5em}.components-multi-select .components-icon{font-size:1em}.components-multi-select .mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{font:inherit}.components-multi-select .components-hidden{display:none}.mat-mdc-option.mdc-list-item{background-color:#fff;font:inherit}.mat-mdc-autocomplete-panel{background-color:#fff!important}\n"] }]
103
+ }], propDecorators: { inputRef: [{
104
+ type: ViewChild,
105
+ args: ['input']
106
+ }], allOptions: [{
107
+ type: Input
108
+ }], label: [{
109
+ type: Input
110
+ }], selectedKeys: [{
111
+ type: Input
112
+ }], selectedKeysChange: [{
113
+ type: Output
114
+ }] } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9tdWx0aS1zZWxlY3QvbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxxQkFBcUIsR0FFeEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQXFCLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQWMsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBb0JoRCxNQUFNLE9BQU8sd0JBQXdCO0lBbEJyQztRQW9CYSxlQUFVLEdBQTJCLEVBQUUsQ0FBQztRQUN4QyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCOztXQUVH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SSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDOzhHQWhEUSx3QkFBd0I7a0dBQXhCLHdCQUF3QiwwVEN6Q3JDLHF6REEyQ0EsMjNCRGhCUSxZQUFZLGdKQUNaLGNBQWMsNHVCQUNkLGtCQUFrQix5T0FDbEIscUJBQXFCLHcxQkFDckIsbUJBQW1CLHlrQkFDbkIsYUFBYTs7MkZBU1Isd0JBQXdCO2tCQWxCcEMsU0FBUzsrQkFDSSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxrQkFBa0I7d0JBQ2xCLHFCQUFxQjt3QkFDckIsbUJBQW1CO3dCQUNuQixhQUFhO3FCQUNoQixpQkFHYyxpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUtuQixRQUFRO3NCQUFuQyxTQUFTO3VCQUFDLE9BQU87Z0JBQ1QsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsWUFBWTtzQkFBcEIsS0FBSztnQkFJSSxrQkFBa0I7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSxcbiAgICBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCwgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBDT01NQSwgRU5URVIgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItbXVsdGktc2VsZWN0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRDaGlwc01vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgXSxcbiAgICAvLyBOZWNlc3NhcnkgdG8gb3ZlcnJpZGUgbWF0ZXJpYWwgZGVzaWduIHN0eWxlcy5cbiAgICAvLyBJTVBPUlRBTlQ6IFRpZ2h0bHkgc2NvcGUgY2xhc3NlcyBhbmQgaWRzIHRvIHRoaXMgY29tcG9uZW50IGlmIHRoZXkgYXJlIG5lY2Vzc2FyeS5cbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL211bHRpLXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBIYmxsTXVsdGlTZWxlY3RDb21wb25lbnQge1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0JykgcHJpdmF0ZSBpbnB1dFJlZiE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gICAgQElucHV0KCkgYWxsT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgdGhhdCBpbmRpY2F0ZXMgd2hpY2gga2V5cyBhcmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8qKlxuICAgICAqIEFuIEV2ZW50RW1pdHRlciB0aGF0IGVtaXRzIGFuIGFycmF5IG9mIGtleXMgaW5kaWNhdGluZyB3aGljaCBvcHRpb25zIGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkS2V5c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgICBwcm90ZWN0ZWQgaW5wdXRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgICBwcm90ZWN0ZWQgZmlsdGVyZWRPcHRpb25zJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCcnKSksXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRLZXlzQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoc3RhcnRXaXRoKFtdKSksXG4gICAgXSkucGlwZShcbiAgICAgICAgbWFwKChba2V5XTogW3N0cmluZyB8IG51bGwsIHVua25vd25dKSA9PlxuICAgICAgICAgICAgLy8gRGlzcGxheSBmaWx0ZXJlZCBvcHRpb25zIGlmIHRoZXJlIGlzIGEgdmFsdWUsIGVsc2UgZGlzcGxheSBhbGwgb3B0aW9ucyBjdXJyZW50bHkgbm90IHNlbGVjdGVkLlxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgPyB0aGlzLmZpbHRlck9wdGlvbnMoa2V5KVxuICAgICAgICAgICAgICAgIDogT2JqZWN0LmtleXModGhpcy5hbGxPcHRpb25zKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4gIXRoaXMuc2VsZWN0ZWRLZXlzLmZpbmQoKHNlbGVjdGVkT3B0aW9uKSA9PiBrZXkgPT09IHNlbGVjdGVkT3B0aW9uKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgKTtcbiAgICBwcm90ZWN0ZWQgc2VwYXJhdG9yS2V5c0NvZGVzOiBudW1iZXJbXSA9IFtFTlRFUiwgQ09NTUFdO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGtleSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgYXJyYXkgb2Ygc2VsZWN0ZWQga2V5LlxuICAgICAqIFRoZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBtdXN0IG1hdGNoIGEga2V5IGZyb20gdGhlIHJlY29yZCBvZiBhbGwgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge01hdENoaXBJbnB1dEV2ZW50fSBldmVudCBNYXRDaGlwSW5wdXRFdmVudFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZGRPcHRpb24oZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkT3B0aW9uVG9TZWxlY3RlZE9wdGlvbnMoZXZlbnQudmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBrZXkgZnJvbSB0aGUgYXJyYXkgb2Ygc2VsZWN0ZWQgb3B0aW9ucyBhbmQgZW1pdHMgdGhlIG5ldyBzZWxlY3RlZCBrZXlzLlxuICAgICAqIEBwYXJhbSB7TXVsdGlTZWxlY3RLZXlWYWxQYWlyfSBrZXkga2V5IHRvIHJlbW92ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW1vdmVPcHRpb24oa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkS2V5cy5pbmRleE9mKGtleSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkS2V5cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEtleXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkS2V5cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIG9wdGlvbiB0byB0aGUgYXJyYXkgb2Ygc2VsZWN0ZWQga2V5cyB3aGVuIGEgdXNlciBzZWxlY3RzIGZyb20gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICAgKiBAcGFyYW0ge01hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnR9IGV2ZW50IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2VsZWN0T3B0aW9uID0gKGV2ZW50OiBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYWRkT3B0aW9uVG9TZWxlY3RlZE9wdGlvbnMoZXZlbnQub3B0aW9uLnZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyB0aGUgb3B0aW9ucyBieSB0aGUgc3VwcGxpZWQgdmFsdWUgYXMgd2VsbCBhcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgdmFsdWUgdG8gZmlsdGVyIGJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gdGhlIGZpbHRlcmVkIGtleXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlck9wdGlvbnMgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuYWxsT3B0aW9ucykuZmlsdGVyKFxuICAgICAgICAgICAgKGtleTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuYWxsT3B0aW9uc1trZXldLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5zZWxlY3RlZEtleXMuaW5jbHVkZXMoa2V5KSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGtleSB0byB0aGUgc2VsZWN0ZWQga2V5cyBhcnJheSBpZiB0aGUgb3B0aW9uIGlzIHRydXRoeSBhbmQgbm90IGFscmVhZHkgaW4gdGhlIGFycmF5LlxuICAgICAqIFRoZSBpbnB1dCBpcyBhbHNvIGNsZWFyZWQgKGlmIGF2YWlsYWJsZSksIGFuZCB0aGUgbmV3IHNlbGVjdGVkIGtleXMgYXJlIGVtaXR0ZWQuXG4gICAgICogQHBhcmFtIHtrZXl9IG9wdGlvbiBrZXkgdG8gYWRkXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGRPcHRpb25Ub1NlbGVjdGVkT3B0aW9ucyA9IChrZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoa2V5ICYmICF0aGlzLnNlbGVjdGVkS2V5cy5pbmNsdWRlcyhrZXkpICYmIHRoaXMuYWxsT3B0aW9uc1trZXldKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkS2V5c0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRLZXlzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0UmVmKSB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29tcG9uZW50cy1tdWx0aS1zZWxlY3RcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBHcmlkIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWwgKyAnIHNlbGVjdGlvbidcIj5cbiAgICAgICAgICAgIEBmb3IgKGtleSBvZiBzZWxlY3RlZEtleXM7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgIEBpZiAoYWxsT3B0aW9uc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1yb3cgKHJlbW92ZWQpPVwicmVtb3ZlT3B0aW9uKGtleSlcIiBkYXRhLXRlc3RpZD1cIm1hdENoaXBSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFsbE9wdGlvbnNba2V5XSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdENoaXBSZW1vdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGFsbE9wdGlvbnNba2V5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3JlbW92ZScgKyBrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBjb21wb25lbnRzLWljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXJvdz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29tcG9uZW50cy1oaWRkZW5cIiBmb3I9XCJpbnB1dFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibGFiZWwgfCB0aXRsZWNhc2VcIlxuICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICBpZD1cImlucHV0XCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpbnB1dENvbnRyb2xcIlxuICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwR3JpZFwiXG4gICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiXG4gICAgICAgICAgICAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJpbnB1dFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0T3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhdXRvY29tcGxldGVcIlxuICAgICAgICA+XG4gICAgICAgICAgICBAZm9yIChrZXkgb2YgZmlsdGVyZWRPcHRpb25zJCB8IGFzeW5jOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwia2V5XCIgZGF0YS10ZXN0aWQ9XCJhdXRvY29tcGxldGVPcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgYWxsT3B0aW9uc1trZXldIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuIl19
@@ -8,8 +8,8 @@ import { validateDateRangeFields } from '../utils';
8
8
  import { CommonModule } from '@angular/common';
9
9
  import { ADVANCED_SEARCH_FIELD_MAP, ADVANCED_SEARCH_OPTIONS, ADVANCED_SEARCH_QUALIFIER_MAP, ADVANCED_SEARCH_QUERIES_LIMIT, } from '../constants';
10
10
  import { MatIconModule } from '@angular/material/icon';
11
- import { HbllMultiSelectComponent } from '../../hbll-multi-select/hbll-multi-select.component';
12
- import { HbllCheckboxComponent } from '../../hbll-checkbox/hbll-checkbox.component';
11
+ import { HbllMultiSelectComponent } from '../../multi-select/multi-select.component';
12
+ import { HbllCheckboxComponent } from '../../checkbox/checkbox.component';
13
13
  import { DateRangeComponent } from '../date-range/date-range.component';
14
14
  import * as i0 from "@angular/core";
15
15
  import * as i1 from "@angular/common";
@@ -245,7 +245,7 @@ export class AdvancedSearchComponent {
245
245
  return this.advancedSearchForm.controls.expandResults.controls.applyEquivalentSubjects;
246
246
  }
247
247
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
248
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-hbll-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-hbll-checkbox", inputs: ["isChecked"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: AdvancedSearchComponent, isStandalone: true, selector: "lib-ss-advanced-search", inputs: { config: "config" }, outputs: { advancedSearch: "advancedSearch" }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "inputTooltip", first: true, predicate: MatTooltip, descendants: true }], ngImport: i0, template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-checkbox [isChecked]=\"peerReviewed.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-checkbox [isChecked]=\"applyEquivalentSubjects.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-checkbox [isChecked]=\"fullText.value\"></lib-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important;border-color:#2a6142}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: HbllMultiSelectComponent, selector: "lib-multi-select", inputs: ["allOptions", "label", "selectedKeys"], outputs: ["selectedKeysChange"] }, { kind: "component", type: HbllCheckboxComponent, selector: "lib-checkbox", inputs: ["isChecked"] }, { kind: "component", type: DateRangeComponent, selector: "lib-date-range", inputs: ["from", "to"], outputs: ["validDateChange", "fromChange", "toChange"] }] }); }
249
249
  }
250
250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
251
251
  type: Component,
@@ -257,7 +257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
257
257
  HbllMultiSelectComponent,
258
258
  HbllCheckboxComponent,
259
259
  DateRangeComponent,
260
- ], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-hbll-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-hbll-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-hbll-checkbox [isChecked]=\"peerReviewed.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-hbll-checkbox\n [isChecked]=\"applyEquivalentSubjects.value\"\n ></lib-hbll-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-hbll-checkbox [isChecked]=\"fullText.value\"></lib-hbll-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-hbll-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-hbll-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"] }]
260
+ ], template: "<form\n data-testid=\"advancedSearchForm\"\n (submit)=\"config.scope === 'local' ? doLocalAdvancedSearch() : doExternalAdvancedSearch()\"\n [formGroup]=\"advancedSearchForm\"\n class=\"ss-adv-search-wrapper\"\n>\n <h3>Advanced Search</h3>\n <!-- Queries -->\n @for (query of queries.controls; track $index; let queryIndex = $index) {\n <div class=\"ss-adv-search-row\" [formGroup]=\"query\">\n <!-- Boolean operator -->\n <!-- Add boolean for each row except for first -->\n @if (!$first) {\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'boolean' + queryIndex\"\n [formControlName]=\"'boolean'\"\n [attr.data-testid]=\"'boolean' + queryIndex\"\n >\n @for (boolean of advancedSearchOptions.boolean; track boolean) {\n <option [ngValue]=\"boolean\">\n {{ boolean }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Field -->\n <label [for]=\"'field' + queryIndex\" class=\"ss-hidden\">Field {{ queryIndex }}</label>\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'field' + queryIndex\"\n [formControlName]=\"'field'\"\n [attr.data-testid]=\"'field' + queryIndex\"\n >\n @for (field of advancedSearchOptions.fields; track field) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n <optgroup\n [label]=\"(config.scope === 'external' ? 'Online' : 'Library') + ' Specific'\"\n >\n @for (\n field of config.scope === 'external'\n ? advancedSearchOptions.externalFields\n : advancedSearchOptions.localFields;\n track field\n ) {\n <option [ngValue]=\"field\">\n {{ advancedSearchFieldMap[field] }}\n </option>\n }\n </optgroup>\n </select>\n </div>\n <!-- Qualifiers are only available for local searches -->\n @if (config.scope === 'local') {\n <label [for]=\"'qualifier' + queryIndex\" class=\"ss-hidden\"\n >Match Criteria {{ queryIndex }}</label\n >\n <div class=\"ss-select-wrapper\">\n <select\n [id]=\"'qualifier' + queryIndex\"\n [formControlName]=\"'qualifier'\"\n [attr.data-testid]=\"'qualifier' + queryIndex\"\n >\n <!-- $any because a field can technically be local or external, though this block is scoped strictly to local fields -->\n @for (\n qualifier of $any(advancedSearchOptions.qualifiers)[\n query.controls.field.value\n ];\n track qualifier;\n let optionIndex = $index\n ) {\n <option\n [ngValue]=\"qualifier\"\n [attr.data-testid]=\"\n 'qualifier' + queryIndex + '-option' + optionIndex\n \"\n >\n {{ $any(advancedSearchQualifierMap)[qualifier] }}\n </option>\n }\n </select>\n </div>\n }\n <!-- Query -->\n <label [for]=\"'query' + queryIndex\" class=\"ss-hidden\">Query {{ queryIndex }}</label>\n <div class=\"ss-query-input\">\n <input\n #searchInput\n [id]=\"'query' + queryIndex\"\n [formControlName]=\"'query'\"\n [attr.data-testid]=\"'query' + queryIndex\"\n required\n aria-required=\"true\"\n matTooltip=\"Fill out this field\"\n [matTooltipPosition]=\"'above'\"\n [matTooltipDisabled]=\"true\"\n [attr.aria-invalid]=\"isSubmitted && queries.at(0).controls.query.invalid\"\n aria-describedby=\"invalidInputDesc\"\n />\n </div>\n @if (!$first) {\n <button\n class=\"ss-row-cancel\"\n type=\"button\"\n (click)=\"removeQuery(queryIndex)\"\n [attr.data-testid]=\"'cancelRow' + queryIndex\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> cancel </span>\n </button>\n }\n </div>\n }\n <button\n type=\"button\"\n (click)=\"addQuery()\"\n id=\"addQueryBtn\"\n data-testid=\"addQuery\"\n [disabled]=\"queries.length > 11\"\n >\n <span class=\"material-symbols-outlined ss-icon\"> add </span>\n Add a row\n </button>\n <!-- OTHER OPTIONS -->\n <div class=\"ss-other-options\">\n <!-- LOCAL -->\n @if (config.scope === 'local') {\n <!-- Type -->\n <div data-testid=\"resourceType\">\n <h4>Resource Type</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Resource Type'\"\n [allOptions]=\"advancedSearchOptions.types[config.institution]\"\n [selectedKeys]=\"types.value\"\n (selectedKeysChange)=\"types.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Collection -->\n <div data-testid=\"collection\">\n <h4>Collection</h4>\n <div class=\"ss-multi-select-wrapper\">\n <lib-multi-select\n [label]=\"'Collection'\"\n [allOptions]=\"advancedSearchOptions.collections[config.institution]\"\n [selectedKeys]=\"collections.value\"\n (selectedKeysChange)=\"collections.setValue($event)\"\n ></lib-multi-select>\n </div>\n </div>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Creation Date' }\"\n ></ng-container>\n }\n <!-- EXTERNAL -->\n @if (config.scope === 'external') {\n <div formGroupName=\"limitResults\" class=\"ss-checkbox-section\">\n <h4>For Fewer Results Try</h4>\n <!-- Peer reviewed -->\n <label class=\"ss-checkbox-label\" for=\"peerReviewed\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"peerReviewed\"\n type=\"checkbox\"\n [formControlName]=\"'peerReviewed'\"\n data-testid=\"peerReviewed\"\n />\n <lib-checkbox [isChecked]=\"peerReviewed.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Peer reviewed journal articles</span>\n </label>\n </div>\n <div formGroupName=\"expandResults\" class=\"ss-checkbox-section\">\n <h4>For More Results Try</h4>\n <!-- Apply equivalent subjects -->\n <label class=\"ss-checkbox-label\" for=\"applyEquivalentSubjects\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"applyEquivalentSubjects\"\n type=\"checkbox\"\n [formControlName]=\"'applyEquivalentSubjects'\"\n data-testid=\"applyEquivalentSubjects\"\n />\n <lib-checkbox [isChecked]=\"applyEquivalentSubjects.value\"></lib-checkbox>\n <span class=\"ss-label-text\">Apply equivalent subjects</span>\n </label>\n <!-- Full text -->\n <label class=\"ss-checkbox-label\" for=\"fullText\" tabindex=\"0\">\n <input\n class=\"ss-hidden\"\n id=\"fullText\"\n type=\"checkbox\"\n [formControlName]=\"'fullText'\"\n data-testid=\"fullText\"\n />\n <lib-checkbox [isChecked]=\"fullText.value\"></lib-checkbox>\n <span class=\"ss-label-text\"\n >Include results the library doesn't have access to</span\n >\n </label>\n </div>\n <!-- Date -->\n <ng-container\n *ngTemplateOutlet=\"dateBlock; context: { header: 'Date Published' }\"\n ></ng-container>\n <!-- Language -->\n <ng-container *ngTemplateOutlet=\"languageBlock\"></ng-container>\n }\n </div>\n <div id=\"advSearchFooter\">\n <a [href]=\"'https://lib.byu.edu/browse/' + config.institution\">Alphabetic Browse</a>\n <button\n class=\"pill-btn--components\"\n [ngClass]=\"{\n ensign: config.institution === 'ensign',\n }\"\n type=\"submit\"\n data-testid=\"advSearchSubmitButton\"\n >\n Search\n </button>\n </div>\n</form>\n\n<ng-template #languageBlock>\n <div>\n <h4>Language</h4>\n <lib-multi-select\n [label]=\"'language'\"\n [allOptions]=\"advancedSearchOptions.languages\"\n [selectedKeys]=\"languages.value\"\n (selectedKeysChange)=\"languages.setValue($any($event))\"\n ></lib-multi-select>\n </div>\n</ng-template>\n<ng-template #dateBlock let-header=\"header\">\n <div id=\"dateOptions\" class=\"external\">\n <h4>{{ header }}</h4>\n <lib-date-range\n [from]=\"from.value\"\n [to]=\"to.value\"\n (fromChange)=\"from.setValue($event)\"\n (toChange)=\"to.setValue($event)\"\n ></lib-date-range>\n </div>\n</ng-template>\n", styles: ["button.ensign{background-color:#2b6042!important;border-color:#2a6142}button.ensign:hover{background-color:#357551!important}a,button{border:none;background:none;font-family:inherit;padding:0;margin:0;font-size:inherit;color:#1c7ec9;text-decoration:none;cursor:pointer}a:hover,button:hover{color:#8ab6f0}select,textarea,input{appearance:none;font-family:inherit;padding:.38em;border:solid 1px #707070;border-radius:4px;font-size:1em;background-color:#fff}select:focus,textarea:focus,input:focus{border-color:#3a6093}.ss-select-wrapper{position:relative}.ss-select-wrapper select{cursor:pointer;padding-right:2em}.ss-select-wrapper:after{font-family:Material Symbols Outlined;content:\"arrow_drop_down\";pointer-events:none;top:0;font-size:1.5em;right:.2em;height:100%;position:absolute;display:flex;align-items:center;opacity:70%}.pill-btn--components{background-color:#4070b0;font-size:1em;transition:all .15s;color:#fff;cursor:pointer;font-weight:600;text-align:center}.pill-btn--components:disabled{color:#707070;background-color:#e6e6e6;pointer-events:none}.pill-btn--components:hover{background-color:#6892ca;color:#fff}.destructive.pill-btn--components{background-color:#b04940}.destructive.pill-btn--components:hover{background-color:#c7574d}.pill-btn--components{border-radius:100em;padding:.4em 1.3em}:host{box-sizing:border-box}:host *{box-sizing:inherit}.ss-select-wrapper{margin-right:.3em}.ss-row-cancel{color:#aaa;margin-left:.4em;margin-top:.4em}.ss-row-cancel:hover{color:#666}.ss-row-cancel .ss-icon{font-size:1em}.ss-hidden{display:none}#addQueryBtn{display:flex;align-items:center}#addQueryBtn:disabled{color:#999;pointer-events:none}#addQueryBtn .icon{font-size:1em}.ss-adv-search-wrapper{width:100%}h3{font-size:1.13em;font-weight:300;margin-bottom:.7em;margin-top:0}h4{margin-bottom:.3em;font-weight:600}#dateOptions h4{margin-bottom:.8em}.ss-adv-search-row{display:flex;flex-wrap:wrap;width:100%;margin-bottom:.6em}.ss-query-input{display:inline-block;width:100%;margin-top:.4rem}.ss-query-input input{width:100%}.ss-other-options{display:grid;grid-template-columns:repeat(1,1fr);gap:.6em 1.6em;grid-auto-rows:minmax(1em,auto);margin-top:1.4em}.ss-other-options label{margin-right:1rem}.ss-checkbox-label{display:inline-flex;align-items:flex-start;cursor:pointer}.ss-checkbox-label:not(:last-of-type){margin-bottom:.75em}.ss-checkbox-label .ss-label-text{margin-top:-.1em;margin-left:.45em}.ss-checkbox-section{margin-bottom:.8em}#advSearchFooter{margin-bottom:.5em;display:flex;justify-content:space-between;align-items:center;font-size:1.2em}#advSearchFooter a{font-size:.8em}@media screen and (min-width: 615px){.ss-adv-search-row{flex-wrap:nowrap}.ss-other-options{grid-template-columns:repeat(2,1fr)}.ss-query-input{margin-top:0}#dateOptions .external{grid-column:span 2}}\n"] }]
261
261
  }], propDecorators: { config: [{
262
262
  type: Input,
263
263
  args: [{ required: true }]
@@ -270,4 +270,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
270
270
  type: ViewChild,
271
271
  args: [MatTooltip]
272
272
  }] } });
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVB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ZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBOb25OdWxsYWJsZUZvcm1CdWlsZGVyLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCwgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyLFxuICAgIEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93LFxuICAgIEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvYWR2YW5jZWQtc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlULFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGJsbC1tdWx0aS1zZWxlY3QvaGJsbC1tdWx0aS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEhibGxDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2hibGwtY2hlY2tib3gvaGJsbC1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvc2VhcmNoLWNvbmZpZy5tb2RlbCc7XG5cbnR5cGUgUXVlcnlSb3cgPSB7XG4gICAgYm9vbGVhbjogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uPjtcbiAgICBmaWVsZDogRm9ybUNvbnRyb2w8XG4gICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvblxuICAgID47XG4gICAgcXVhbGlmaWVyOiBGb3JtQ29udHJvbDxBZHZhbmNlZFNlYXJjaFF1YWxpZmllck9wdGlvbj47XG4gICAgcXVlcnk6IEZvcm1Db250cm9sPHN0cmluZz47XG59O1xuXG5jb25zdCBEQVRFX1ZBTElEQVRPUl9SRUdFWCA9ICdeWzAtOV17NH0kJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItc3MtYWR2YW5jZWQtc2VhcmNoJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBIYmxsTXVsdGlTZWxlY3RDb21wb25lbnQsXG4gICAgICAgIEhibGxDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkU2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZiID0gaW5qZWN0KE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIpO1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXQgY29uZmlnKGNvbmZpZzogU2VhcmNoQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZXR1cEZvcm0oKTtcbiAgICB9XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICB9XG4gICAgQE91dHB1dCgpIGFkdmFuY2VkU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWFyY2hDb25maWc+KCk7XG5cbiAgICAvLyBUaG91Z2ggbXVsdGlwbGUgaW5zdGFuY2VzIGV4aXN0cywgdGhpcyByZXByZXNlbnQgcXVlcnkgMS5cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIC8vIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAvLyBJdCBpcyBlbmFibGVkIGFuZCBkaXNwbGF5ZWQgaWYgYSB1c2VyIHNlYXJjaGVzIGFnYWluc3QgYW4gZW1wdHkgcXVlcnkgKHNpbXBsZSBvciBxMSkuXG4gICAgLy8gQW55IGNoYW5nZSB0byB0aGUgc2VhcmNoIGZpZWxkIGRpc2FibGVzIHRoZSB0b29sdGlwLlxuICAgIEBWaWV3Q2hpbGQoTWF0VG9vbHRpcCkgcHJpdmF0ZSBpbnB1dFRvb2x0aXAhOiBNYXRUb29sdGlwO1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBhIGBGb3JtR3JvdXBgIGFuZCBzeW5jcyB1cCB0aGUgYGZpZWxkYCBhbmQgYHF1YWxpZmllcmAgdmFsdWVzLlxuICAgICAqIEFmdGVyIHN5bmNpbmcsIHdoZW4gdGhlIGBmaWVsZGAgdmFsdWUgY2hhbmdlcywgdGhlIGBxdWFsaWZpZXJgIHZhbHVlIHdpbGwgdXBkYXRlIGFwcHJvcHJpYXRlbHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzeW5jVXBGaWVsZEFuZFF1YWxpZmllciA9IChcbiAgICAgICAgZmc6IEZvcm1Hcm91cDx7XG4gICAgICAgICAgICBib29sZWFuOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIGZpZWxkOiBGb3JtQ29udHJvbDtcbiAgICAgICAgICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWVyeTogRm9ybUNvbnRyb2w7XG4gICAgICAgIH0+LFxuICAgICAgICBzY29wZTogU2VhcmNoQ29uZmlnWydzY29wZSddLFxuICAgICkgPT4ge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICBmZy5jb250cm9scy5maWVsZC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHNjb3BlID09PSAnbG9jYWwnKSxcbiAgICAgICAgICAgICAgICAgICAgdGFwKCh2YWw6IEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZmcuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbdmFsXVswXSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKSxcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBxdWVyaWVzOiB0aGlzLmZiLmFycmF5PEZvcm1Hcm91cDxRdWVyeVJvdz4+KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoQURWQU5DRURfU0VBUkNIX1FVRVJJRVNfTElNSVQpXSxcbiAgICAgICAgKSxcbiAgICAgICAgdHlwZXM6IFtbXSBhcyBzdHJpbmdbXV0sXG4gICAgICAgIGNvbGxlY3Rpb25zOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBsYW5ndWFnZXM6IFtbXSBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW11dLFxuICAgICAgICBkYXRlOiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZyb206IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICAgICAgdG86IFsnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDQpLCBWYWxpZGF0b3JzLnBhdHRlcm4oREFURV9WQUxJREFUT1JfUkVHRVgpXV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyB2YWxpZGF0b3JzOiB2YWxpZGF0ZURhdGVSYW5nZUZpZWxkcygpIH0sXG4gICAgICAgICksXG4gICAgICAgIGxpbWl0UmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgICAgICBleHBhbmRSZXN1bHRzOiB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiBbZmFsc2VdLFxuICAgICAgICAgICAgZnVsbFRleHQ6IFtmYWxzZV0sXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIGlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoT3B0aW9ucyA9IEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwID0gQURWQU5DRURfU0VBUkNIX0ZJRUxEX01BUDtcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJNYXAgPSBBRFZBTkNFRF9TRUFSQ0hfUVVBTElGSUVSX01BUDtcblxuICAgIGdldCBxdWVyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMucXVlcmllcztcbiAgICB9XG4gICAgZ2V0IHR5cGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMudHlwZXM7XG4gICAgfVxuICAgIGdldCBjb2xsZWN0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmNvbGxlY3Rpb25zO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMubGFuZ3VhZ2VzO1xuICAgIH1cbiAgICBnZXQgZnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGUuY29udHJvbHMuZnJvbTtcbiAgICB9XG4gICAgZ2V0IHRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZS5jb250cm9scy50bztcbiAgICB9XG4gICAgZ2V0IHBlZXJSZXZpZXdlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmxpbWl0UmVzdWx0cy5jb250cm9scy5wZWVyUmV2aWV3ZWQ7XG4gICAgfVxuICAgIGdldCBmdWxsVGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmV4cGFuZFJlc3VsdHMuY29udHJvbHMuZnVsbFRleHQ7XG4gICAgfVxuICAgIGdldCBhcHBseUVxdWl2YWxlbnRTdWJqZWN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmV4cGFuZFJlc3VsdHMuY29udHJvbHMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgcXVlcnkgdG8gYHF1ZXJpZXNgIGBGb3JtQXJyYXlgLiBUaGlzIEZvcm1Hcm91cCBoYXMgYW4gYWRkaXRpb25hbCBgYm9vbGVhbmAgY29udHJvbC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkUXVlcnkgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAgICAgYm9vbGVhbjogW0FEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLmJvb2xlYW5bMF0gYXMgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uXSxcbiAgICAgICAgICAgICAgICBmaWVsZDogW1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5maWVsZHNbMF0gYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVyOiBbXG4gICAgICAgICAgICAgICAgICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLnF1YWxpZmllcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5sb2NhbEZpZWxkc1swXVxuICAgICAgICAgICAgICAgICAgICBdWzBdIGFzIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcXVlcnk6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zeW5jVXBGaWVsZEFuZFF1YWxpZmllcih0aGlzLnF1ZXJpZXMuYXQoLTEpLCB0aGlzLmNvbmZpZy5zY29wZSk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCByZW1vdmVRdWVyeSA9IChpOiBudW1iZXIpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLnJlbW92ZUF0KGkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyBhcHByb3ByaWF0ZSBxdWVyeSBwYXJhbXMgYmVmb3JlIHBlcmZvcm1pbmcgYSBsb2NhbCBhZHZhbmNlZCBzZWFyY2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRvTG9jYWxBZHZhbmNlZFNlYXJjaCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGxvY2FsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGNyZWF0aW9uRGF0ZTogdGhpcy5nYXRoZXJUb0FuZEZyb21WYWx1ZXMoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRSZXNvdXJjZVR5cGVzOiB0aGlzLnR5cGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29sbGVjdGlvbnM6IHRoaXMuY29sbGVjdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4dGVybmFsIGFkdmFuY2VkIHNlYXJjaC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRvQWR2YW5jZWRTZWFyY2goe1xuICAgICAgICAgICAgZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaDoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2gsXG4gICAgICAgICAgICAgICAgZGF0ZVB1Ymxpc2hlZDogdGhpcy5nYXRoZXJUb0FuZEZyb21WYWx1ZXMoKSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZExhbmd1YWdlczogdGhpcy5sYW5ndWFnZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgbGltaXRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHBlZXJSZXZpZXdlZDogdGhpcy5wZWVyUmV2aWV3ZWQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBleHBhbmRSZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5RXF1aXZhbGVudFN1YmplY3RzOiB0aGlzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBmdWxsVGV4dDogdGhpcy5mdWxsVGV4dC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICAgQ29tcGFyZXMgJ2Zyb20nIGFuZCAndG8nIHRvIGVuc3VyZSAndG8nIGlzID49IHRvICdmcm9tJywgZWxzZSBzd2FwcyB0aGVtLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2F0aGVyVG9BbmRGcm9tVmFsdWVzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5mcm9tLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSkgPD0gcGFyc2VJbnQodGhpcy50by52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgICAgIDogdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgdG8gPSB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMudG8udmFsdWUpID49IHBhcnNlSW50KHRoaXMuZnJvbS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIHsgZnJvbSwgdG8gfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgdGhhdCB0aGVyZSBpcyBhIHF1ZXJ5IHRvIHVzZSwgZ2F0aGVycyBhbGwgb3RoZXIgcXVlcnkgcGFyYW1ldGVycyBuZWVkZWQsIHRoZW4gcGVyZm9ybXMgYW4gYWR2YW5jZWQgc2VhcmNoIHZpYSBgcm91dGVyLm5hdmlnYXRlKClgLlxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcXVlcnlQYXJhbXMgYmFzZSBzZXQgb2YgcXVlcnkgcGFyYW1zIHRvIG5hdmlnYXRlIHdpdGhcbiAgICAgKi9cbiAgICBwcml2YXRlIGRvQWR2YW5jZWRTZWFyY2ggPSAodXBkYXRlZFByb3BzOiBQYXJ0aWFsPFNlYXJjaENvbmZpZz4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIC8vIERvbid0IHBlcmZvcm0gYSBzZWFyY2ggdW5sZXNzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBxdWVyeVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZCAmJlxuICAgICAgICAgICAgIXRoaXMucXVlcmllcy52YWx1ZS5zb21lKCh2KSA9PiAhIXYucXVlcnkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEb24ndCBwZXJmb3JtIGEgc2VhcmNoIHVubGVzcyB0aGUgZGF0ZSBmb3JtIGlzIHZhbGlkXG4gICAgICAgIGlmICh0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlLmludmFsaWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmFkdmFuY2VkU2VhcmNoLmVtaXQoe1xuICAgICAgICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICAgICAgICAuLi51cGRhdGVkUHJvcHMsXG4gICAgICAgICAgICBhZHZhbmNlZFNlYXJjaFF1ZXJ5Um93czogdGhpcy5xdWVyaWVzLnZhbHVlIGFzIEFkdmFuY2VkU2VhcmNoUXVlcnlSb3dbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzaG93U2VhcmNoVmFsaWRhdGlvblRvb2xUaXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlucHV0VG9vbHRpcC5zaG93KCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2V0dXBGb3JtID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMuY2xlYXIoKTtcbiAgICAgICAgLy8gQWx3YXlzIGtlZXAgYXQgbGVhc3QgdHdvIHF1ZXJpZXMgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcbiAgICAgICAgdGhpcy5hZGRRdWVyeSgpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2YWxpZGF0aW9uIHRvb2x0aXAgY2xvc2VzIHdoZW4gdXNlcyBlbnRlcnMgYSBxdWVyeVxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXNcbiAgICAgICAgICAgICAgICAuYXQoMClcbiAgICAgICAgICAgICAgICAuY29udHJvbHMucXVlcnkudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCcnKSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gISF0aGlzLmlucHV0VG9vbHRpcCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiAodGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSB0cnVlKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSWYgbm8gYHF7TlVNfWAgdXNlIGBxYCBmb3IgZmlyc3QgcXVlcnlcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hZHZhbmNlZFNlYXJjaFF1ZXJ5Um93cy5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzLnF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuc2V0VmFsdWUodGhpcy5jb25maWcucSk7XG5cbiAgICAgICAgdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3MuZm9yRWFjaCgocXVlcnlSb3csIGkpID0+IHtcbiAgICAgICAgICAgIC8vIEFkZCBhIHF1ZXJ5IGZvcm0gY29udHJvbCBmb3IgZXZlcnkgcXtudW19IGtleSBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgICAgICBsZXQgcXVlcnlDb250cm9sID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wgPSB0aGlzLnF1ZXJpZXMuYXQoaSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wgPSB0aGlzLnF1ZXJpZXMuYXQoLTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIHF1ZXJ5IHZhbHVlLlxuICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLnF1ZXJ5LnNldFZhbHVlKHF1ZXJ5Um93LnF1ZXJ5KTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBmaWVsZCB2YWx1ZSwgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHF1ZXJ5Um93LmZpZWxkICYmIC8vIE9ubHkgc2V0IHRoZSBmaWVsZCBpZiB0aGUgdmFsdWUgYmVsb25ncyB0byB0aGUgY3VycmVudCBzY29wZVxuICAgICAgICAgICAgICAgIChpc0FkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpc0FkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbihxdWVyeVJvdy5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaXNBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUocXVlcnlSb3cuZmllbGQpO1xuICAgICAgICAgICAgZWxzZSBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQuc2V0VmFsdWUodGhpcy5hZHZhbmNlZFNlYXJjaE9wdGlvbnMuZmllbGRzWzBdKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWFsaWZpZXIgdmFsdWUsIGlmIGF2YWlsYWJsZSBhbmQgYSBsb2NhbCBzZWFyY2guXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCcgJiYgcXVlcnlSb3cucXVhbGlmaWVyKVxuICAgICAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5xdWFsaWZpZXIuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5Um93LnF1YWxpZmllciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlZFNlYXJjaE9wdGlvbnMucXVhbGlmaWVyc1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuZmllbGQudmFsdWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYm9vbGVhbiwgaWYgYXZhaWxhYmxlIGFuZCBub3QgdGhlIGZpcnN0IHF1ZXJ5LlxuICAgICAgICAgICAgaWYgKGkgIT09IDAgJiYgcXVlcnlSb3cuYm9vbGVhbilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMuYm9vbGVhbi5zZXRWYWx1ZShxdWVyeVJvdy5ib29sZWFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgdGhpcy50eXBlcy5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkUmVzb3VyY2VUeXBlcyk7XG4gICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb25zLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guc2VsZWN0ZWRDb2xsZWN0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZyb20uc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5jcmVhdGlvbkRhdGUuZnJvbSk7XG4gICAgICAgICAgICB0aGlzLnRvLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guY3JlYXRpb25EYXRlLnRvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdGVkTGFuZ3VhZ2VzIGFzIEFkdmFuY2VkU2VhcmNoTGFuZ3VhZ2VPcHRpb25bXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZyb20uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLmZyb20pO1xuICAgICAgICAgICAgdGhpcy50by5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLmRhdGVQdWJsaXNoZWQudG8pO1xuICAgICAgICAgICAgdGhpcy5wZWVyUmV2aWV3ZWQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5saW1pdFJlc3VsdHMucGVlclJldmlld2VkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlFcXVpdmFsZW50U3ViamVjdHMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZnVsbFRleHQuc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5leHBhbmRSZXN1bHRzLmZ1bGxUZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCI8Zm9ybVxuICAgIGRhdGEtdGVzdGlkPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICAoc3VibWl0KT1cImNvbmZpZy5zY29wZSA9PT0gJ2xvY2FsJyA/IGRvTG9jYWxBZHZhbmNlZFNlYXJjaCgpIDogZG9FeHRlcm5hbEFkdmFuY2VkU2VhcmNoKClcIlxuICAgIFtmb3JtR3JvdXBdPVwiYWR2YW5jZWRTZWFyY2hGb3JtXCJcbiAgICBjbGFzcz1cInNzLWFkdi1zZWFyY2gtd3JhcHBlclwiXG4+XG4gICAgPGgzPkFkdmFuY2VkIFNlYXJjaDwvaDM+XG4gICAgPCEtLSBRdWVyaWVzIC0tPlxuICAgIEBmb3IgKHF1ZXJ5IG9mIHF1ZXJpZXMuY29udHJvbHM7IHRyYWNrICRpbmRleDsgbGV0IHF1ZXJ5SW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNzLWFkdi1zZWFyY2gtcm93XCIgW2Zvcm1Hcm91cF09XCJxdWVyeVwiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIG9wZXJhdG9yIC0tPlxuICAgICAgICAgICAgPCEtLSBBZGQgYm9vbGVhbiBmb3IgZWFjaCByb3cgZXhjZXB0IGZvciBmaXJzdCAtLT5cbiAgICAgICAgICAgIEBpZiAoISRmaXJzdCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidib29sZWFuJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInYm9vbGVhbicgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoYm9vbGVhbiBvZiBhZHZhbmNlZFNlYXJjaE9wdGlvbnMuYm9vbGVhbjsgdHJhY2sgYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiYm9vbGVhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBib29sZWFuIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBGaWVsZCAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIj5GaWVsZCB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZmllbGQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2ZpZWxkJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkczsgdHJhY2sgZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJyA/ICdPbmxpbmUnIDogJ0xpYnJhcnknKSArICcgU3BlY2lmaWMnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWR2YW5jZWRTZWFyY2hPcHRpb25zLmV4dGVybmFsRmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWR2YW5jZWRTZWFyY2hPcHRpb25zLmxvY2FsRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFkdmFuY2VkU2VhcmNoRmllbGRNYXBbZmllbGRdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gUXVhbGlmaWVycyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHNlYXJjaGVzIC0tPlxuICAgICAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIiBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgID5NYXRjaCBDcml0ZXJpYSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbFxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidxdWFsaWZpZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWFsaWZpZXInICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJGFueSBiZWNhdXNlIGEgZmllbGQgY2FuIHRlY2huaWNhbGx5IGJlIGxvY2FsIG9yIGV4dGVybmFsLCB0aG91Z2ggdGhpcyBibG9jayBpcyBzY29wZWQgc3RyaWN0bHkgdG8gbG9jYWwgZmllbGRzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIG9mICRhbnkoYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnMpW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5jb250cm9scy5maWVsZC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgcXVhbGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25JbmRleCA9ICRpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJxdWFsaWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWFsaWZpZXInICsgcXVlcnlJbmRleCArICctb3B0aW9uJyArIG9wdGlvbkluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAkYW55KGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwKVtxdWFsaWZpZXJdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPCEtLSBRdWVyeSAtLT5cbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIj5RdWVyeSB7eyBxdWVyeUluZGV4IH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1xdWVyeS1pbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVlcnknXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ3F1ZXJ5JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBhcmlhLXJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGaWxsIG91dCB0aGlzIGZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImlzU3VibWl0dGVkICYmIHF1ZXJpZXMuYXQoMCkuY29udHJvbHMucXVlcnkuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9XCJpbnZhbGlkSW5wdXREZXNjXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3Mtcm93LWNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlUXVlcnkocXVlcnlJbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCInY2FuY2VsUm93JyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gY2FuY2VsIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJhZGRRdWVyeSgpXCJcbiAgICAgICAgaWQ9XCJhZGRRdWVyeUJ0blwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYWRkUXVlcnlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwicXVlcmllcy5sZW5ndGggPiAxMVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgc3MtaWNvblwiPiBhZGQgPC9zcGFuPlxuICAgICAgICBBZGQgYSByb3dcbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIE9USEVSIE9QVElPTlMgLS0+XG4gICAgPGRpdiBjbGFzcz1cInNzLW90aGVyLW9wdGlvbnNcIj5cbiAgICAgICAgPCEtLSBMT0NBTCAtLT5cbiAgICAgICAgQGlmIChjb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIDwhLS0gVHlwZSAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXNvdXJjZVR5cGVcIj5cbiAgICAgICAgICAgICAgICA8aDQ+UmVzb3VyY2UgVHlwZTwvaDQ+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNzLW11bHRpLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCInUmVzb3VyY2UgVHlwZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbE9wdGlvbnNdPVwiYWR2YW5jZWRTZWFyY2hPcHRpb25zLnR5cGVzW2NvbmZpZy5pbnN0aXR1dGlvbl1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJ0eXBlcy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRLZXlzQ2hhbmdlKT1cInR5cGVzLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItaGJsbC1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ29sbGVjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkNvbGxlY3Rpb248L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtbXVsdGktc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ0NvbGxlY3Rpb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImFkdmFuY2VkU2VhcmNoT3B0aW9ucy5jb2xsZWN0aW9uc1tjb25maWcuaW5zdGl0dXRpb25dXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwiY29sbGVjdGlvbnMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJjb2xsZWN0aW9ucy5zZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbGliLWhibGwtbXVsdGktc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIExhbmd1YWdlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxhbmd1YWdlQmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gRGF0ZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVCbG9jazsgY29udGV4dDogeyBoZWFkZXI6ICdDcmVhdGlvbiBEYXRlJyB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEVYVEVSTkFMIC0tPlxuICAgICAgICBAaWYgKGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJykge1xuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwibGltaXRSZXN1bHRzXCIgY2xhc3M9XCJzcy1jaGVja2JveC1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkZvciBGZXdlciBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBQZWVyIHJldmlld2VkIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwicGVlclJldmlld2VkXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3BlZXJSZXZpZXdlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJwZWVyUmV2aWV3ZWRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWhibGwtY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIj5QZWVyIHJldmlld2VkIGpvdXJuYWwgYXJ0aWNsZXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZXhwYW5kUmVzdWx0c1wiIGNsYXNzPVwic3MtY2hlY2tib3gtc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxoND5Gb3IgTW9yZSBSZXN1bHRzIFRyeTwvaDQ+XG4gICAgICAgICAgICAgICAgPCEtLSBBcHBseSBlcXVpdmFsZW50IHN1YmplY3RzIC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidhcHBseUVxdWl2YWxlbnRTdWJqZWN0cydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItaGJsbC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzQ2hlY2tlZF09XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIj5BcHBseSBlcXVpdmFsZW50IHN1YmplY3RzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPCEtLSBGdWxsIHRleHQgLS0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3MtY2hlY2tib3gtbGFiZWxcIiBmb3I9XCJmdWxsVGV4dFwiIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3MtaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZnVsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2Z1bGxUZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1oYmxsLWNoZWNrYm94IFtpc0NoZWNrZWRdPVwiZnVsbFRleHQudmFsdWVcIj48L2xpYi1oYmxsLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPkluY2x1ZGUgcmVzdWx0cyB0aGUgbGlicmFyeSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlQmxvY2s7IGNvbnRleHQ6IHsgaGVhZGVyOiAnRGF0ZSBQdWJsaXNoZWQnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYW5ndWFnZUJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxhIFtocmVmXT1cIidodHRwczovL2xpYi5ieXUuZWR1L2Jyb3dzZS8nICsgY29uZmlnLmluc3RpdHV0aW9uXCI+QWxwaGFiZXRpYyBCcm93c2U8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicGlsbC1idG4tLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGVuc2lnbjogY29uZmlnLmluc3RpdHV0aW9uID09PSAnZW5zaWduJyxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNsYW5ndWFnZUJsb2NrPlxuICAgIDxkaXY+XG4gICAgICAgIDxoND5MYW5ndWFnZTwvaDQ+XG4gICAgICAgIDxsaWItaGJsbC1tdWx0aS1zZWxlY3RcbiAgICAgICAgICAgIFtsYWJlbF09XCInbGFuZ3VhZ2UnXCJcbiAgICAgICAgICAgIFthbGxPcHRpb25zXT1cImFkdmFuY2VkU2VhcmNoT3B0aW9ucy5sYW5ndWFnZXNcIlxuICAgICAgICAgICAgW3NlbGVjdGVkS2V5c109XCJsYW5ndWFnZXMudmFsdWVcIlxuICAgICAgICAgICAgKHNlbGVjdGVkS2V5c0NoYW5nZSk9XCJsYW5ndWFnZXMuc2V0VmFsdWUoJGFueSgkZXZlbnQpKVwiXG4gICAgICAgID48L2xpYi1oYmxsLW11bHRpLXNlbGVjdD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RhdGVCbG9jayBsZXQtaGVhZGVyPVwiaGVhZGVyXCI+XG4gICAgPGRpdiBpZD1cImRhdGVPcHRpb25zXCIgY2xhc3M9XCJleHRlcm5hbFwiPlxuICAgICAgICA8aDQ+e3sgaGVhZGVyIH19PC9oND5cbiAgICAgICAgPGxpYi1kYXRlLXJhbmdlXG4gICAgICAgICAgICBbZnJvbV09XCJmcm9tLnZhbHVlXCJcbiAgICAgICAgICAgIFt0b109XCJ0by52YWx1ZVwiXG4gICAgICAgICAgICAoZnJvbUNoYW5nZSk9XCJmcm9tLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgKHRvQ2hhbmdlKT1cInRvLnNldFZhbHVlKCRldmVudClcIlxuICAgICAgICA+PC9saWItZGF0ZS1yYW5nZT5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zcy1zZWFyY2gtYmFyL2FkdmFuY2VkLXNlYXJjaC9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL3NzLXNlYXJjaC1iYXIvYWR2YW5jZWQtc2VhcmNoL2FkdmFuY2VkLXNlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxHQUNiLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFTSCwyQkFBMkIsRUFDM0IsZ0NBQWdDLEVBQ2hDLG1DQUFtQyxHQUN0QyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0gseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qiw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQ2hDLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7QUFjeEUsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUM7QUFpQjFDLE1BQU0sT0FBTyx1QkFBdUI7SUFmcEM7UUFnQnFCLE9BQUUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQVMzQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBU3BELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU0xQzs7O1dBR0c7UUFDSyw0QkFBdUIsR0FBRyxDQUM5QixFQUtFLEVBQ0YsS0FBNEIsRUFDOUIsRUFBRTtZQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUNqQixFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZO2lCQUN6QixJQUFJLENBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsRUFDL0IsR0FBRyxDQUFDLENBQUMsR0FBNEIsRUFBRSxFQUFFLENBQ2pDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0UsQ0FDSjtpQkFDQSxTQUFTLEVBQUUsQ0FDbkIsQ0FBQztRQUNOLENBQUMsQ0FBQztRQUVRLHVCQUFrQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDbEIsRUFBRSxFQUNGLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQ3hEO1lBQ0QsS0FBSyxFQUFFLENBQUMsRUFBYyxDQUFDO1lBQ3ZCLFdBQVcsRUFBRSxDQUFDLEVBQWMsQ0FBQztZQUM3QixTQUFTLEVBQUUsQ0FBQyxFQUFvQyxDQUFDO1lBQ2pELElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FDZjtnQkFDSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUMvRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2FBQ2hGLEVBQ0QsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxDQUM1QztZQUNELFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDeEIsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2FBQ3hCLENBQUM7WUFDRixhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLHVCQUF1QixFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUM7YUFDcEIsQ0FBQztTQUNMLENBQUMsQ0FBQztRQUVPLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLDBCQUFxQixHQUFHLHVCQUF1QixDQUFDO1FBQ2hELDJCQUFzQixHQUFHLHlCQUF5QixDQUFDO1FBQ25ELCtCQUEwQixHQUFHLDZCQUE2QixDQUFDO1FBOEJyRTs7V0FFRztRQUNPLGFBQVEsR0FBRyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ1YsT0FBTyxFQUFFLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBZ0MsQ0FBQztnQkFDNUUsS0FBSyxFQUFFO29CQUNILHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBR087aUJBQzFDO2dCQUNELFNBQVMsRUFBRTtvQkFDUCx1QkFBdUIsQ0FBQyxVQUFVLENBQzlCLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDekMsQ0FBQyxDQUFDLENBQWtDO2lCQUN4QztnQkFDRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUNuQyxDQUFDLENBQ0wsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDO1FBRVEsZ0JBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ08sMEJBQXFCLEdBQUcsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDbEIsbUJBQW1CLEVBQUU7b0JBQ2pCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUI7b0JBQ2xDLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUU7b0JBQzFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSztvQkFDdkMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLO29CQUN2QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7aUJBQzlDO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBRUY7O1dBRUc7UUFDTyw2QkFBd0IsR0FBRyxHQUFHLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUNsQixzQkFBc0IsRUFBRTtvQkFDcEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtvQkFDckMsYUFBYSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtvQkFDM0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO29CQUN2QyxZQUFZLEVBQUU7d0JBQ1YsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztxQkFDeEM7b0JBQ0QsYUFBYSxFQUFFO3dCQUNYLHVCQUF1QixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLO3dCQUMzRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLO3FCQUNoQztpQkFDSjthQUNKLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQztRQUVGOztXQUVHO1FBQ0ssMEJBQXFCLEdBQUcsR0FBRyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDeEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztvQkFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSztnQkFDbkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSztnQkFDcEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSztvQkFDZixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFFRjs7O1dBR0c7UUFDSyxxQkFBZ0IsR0FBRyxDQUFDLFlBQW1DLEVBQVEsRUFBRTtZQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4Qiw0REFBNEQ7WUFDNUQsSUFDSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU87Z0JBQ3pDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUM1QyxDQUFDO2dCQUNDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNuQyxPQUFPO1lBQ1gsQ0FBQztZQUNELHVEQUF1RDtZQUN2RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTztZQUUxRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztnQkFDckIsR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFDZCxHQUFHLFlBQVk7Z0JBQ2YsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFpQzthQUMxRSxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDLENBQUM7UUFFTSxnQ0FBMkIsR0FBRyxHQUFHLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBRU0sY0FBUyxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JCLDZDQUE2QztZQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRWhCLDREQUE0RDtZQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDakIsSUFBSSxDQUFDLE9BQU87aUJBQ1AsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDTCxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3ZDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQzVELENBQUM7WUFFRix5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsTUFBTTtnQkFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU5RCxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsaUVBQWlFO2dCQUNqRSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEIsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBRUQsdUJBQXVCO2dCQUN2QixZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVyRCxxQ0FBcUM7Z0JBQ3JDLElBQ0ksUUFBUSxDQUFDLEtBQUssSUFBSSwrREFBK0Q7b0JBQ2pGLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzt3QkFDeEMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxPQUFPOzRCQUMxQixDQUFDLENBQUMsZ0NBQWdDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs0QkFDbEQsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUUvRCxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOztvQkFDcEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFaEYsNERBQTREO2dCQUM1RCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUztvQkFDbkQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNwQyxRQUFRLENBQUMsU0FBUzt3QkFDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUNqQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUVRLENBQ3ZDLENBQ1IsQ0FBQztnQkFFTix5REFBeUQ7Z0JBQ3pELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTztvQkFDM0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBbUQsQ0FDdEYsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtxQkFDN0IsaUJBQW1ELENBQzNELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUMvRCxDQUFDO2dCQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUMzRSxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7UUFDTCxDQUFDLENBQUM7S0FDTDtJQXpTRyxJQUErQixNQUFNLENBQUMsTUFBb0I7UUFDdEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQVlELFdBQVc7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUF3REQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUNsRCxDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQy9ELENBQUM7SUFDRCxJQUFJLEVBQUU7UUFDRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMvRSxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQzVFLENBQUM7SUFDRCxJQUFJLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztJQUMzRixDQUFDOzhHQXpHUSx1QkFBdUI7a0dBQXZCLHVCQUF1QiwwU0FpQnJCLFVBQVUsZ0RDNUZ6QiwwM1ZBNFBBLDJ5RkQxTFEsWUFBWSxtU0FDWixtQkFBbUIsNDFEQUNuQixnQkFBZ0IsNFRBQ2hCLGFBQWEsK0JBQ2Isd0JBQXdCLCtJQUN4QixxQkFBcUIsZ0ZBQ3JCLGtCQUFrQjs7MkZBR2IsdUJBQXVCO2tCQWZuQyxTQUFTOytCQUNJLHdCQUF3QixjQUN0QixJQUFJLFdBR1A7d0JBQ0wsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix3QkFBd0I7d0JBQ3hCLHFCQUFxQjt3QkFDckIsa0JBQWtCO3FCQUNyQjs4QkFLOEIsTUFBTTtzQkFBcEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBT2YsY0FBYztzQkFBdkIsTUFBTTtnQkFHMkIsV0FBVztzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUlPLFlBQVk7c0JBQTFDLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBOb25OdWxsYWJsZUZvcm1CdWlsZGVyLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCwgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgZmlsdGVyLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgQWR2YW5jZWRTZWFyY2hCb29sZWFuT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyT3B0aW9uLFxuICAgIEFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyLFxuICAgIEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93LFxuICAgIEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb24sXG4gICAgaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uLFxuICAgIGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uLFxufSBmcm9tICcuLi9tb2RlbHMvYWR2YW5jZWQtc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBRFZBTkNFRF9TRUFSQ0hfRklFTERfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9PUFRJT05TLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUFMSUZJRVJfTUFQLFxuICAgIEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlULFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGJsbENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVSYW5nZUNvbXBvbmVudCB9IGZyb20gJy4uL2RhdGUtcmFuZ2UvZGF0ZS1yYW5nZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL3NlYXJjaC1jb25maWcubW9kZWwnO1xuXG50eXBlIFF1ZXJ5Um93ID0ge1xuICAgIGJvb2xlYW46IEZvcm1Db250cm9sPEFkdmFuY2VkU2VhcmNoQm9vbGVhbk9wdGlvbj47XG4gICAgZmllbGQ6IEZvcm1Db250cm9sPFxuICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb25cbiAgICAgICAgfCBBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb25cbiAgICAgICAgfCBBZHZhbmNlZFNlYXJjaEV4dGVybmFsRmllbGRPcHRpb25cbiAgICA+O1xuICAgIHF1YWxpZmllcjogRm9ybUNvbnRyb2w8QWR2YW5jZWRTZWFyY2hRdWFsaWZpZXJPcHRpb24+O1xuICAgIHF1ZXJ5OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xufTtcblxuY29uc3QgREFURV9WQUxJREFUT1JfUkVHRVggPSAnXlswLTldezR9JCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLXNzLWFkdmFuY2VkLXNlYXJjaCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC1zZWFyY2guY29tcG9uZW50LnNjc3MnXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgSGJsbE11bHRpU2VsZWN0Q29tcG9uZW50LFxuICAgICAgICBIYmxsQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIERhdGVSYW5nZUNvbXBvbmVudCxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmYiA9IGluamVjdChOb25OdWxsYWJsZUZvcm1CdWlsZGVyKTtcbiAgICBwcml2YXRlIF9jb25maWchOiBTZWFyY2hDb25maWc7XG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IGNvbmZpZyhjb25maWc6IFNlYXJjaENvbmZpZykge1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuc2V0dXBGb3JtKCk7XG4gICAgfVxuICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gICAgfVxuICAgIEBPdXRwdXQoKSBhZHZhbmNlZFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VhcmNoQ29uZmlnPigpO1xuXG4gICAgLy8gVGhvdWdoIG11bHRpcGxlIGluc3RhbmNlcyBleGlzdHMsIHRoaXMgcmVwcmVzZW50IHF1ZXJ5IDEuXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXQnKSBwcml2YXRlIHNlYXJjaElucHV0ITogRWxlbWVudFJlZjtcbiAgICAvLyBUaGUgdG9vbHRpcCBpcyBkaXNhYmxlZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAgLy8gSXQgaXMgZW5hYmxlZCBhbmQgZGlzcGxheWVkIGlmIGEgdXNlciBzZWFyY2hlcyBhZ2FpbnN0IGFuIGVtcHR5IHF1ZXJ5IChzaW1wbGUgb3IgcTEpLlxuICAgIC8vIEFueSBjaGFuZ2UgdG8gdGhlIHNlYXJjaCBmaWVsZCBkaXNhYmxlcyB0aGUgdG9vbHRpcC5cbiAgICBAVmlld0NoaWxkKE1hdFRvb2x0aXApIHByaXZhdGUgaW5wdXRUb29sdGlwITogTWF0VG9vbHRpcDtcblxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgYSBgRm9ybUdyb3VwYCBhbmQgc3luY3MgdXAgdGhlIGBmaWVsZGAgYW5kIGBxdWFsaWZpZXJgIHZhbHVlcy5cbiAgICAgKiBBZnRlciBzeW5jaW5nLCB3aGVuIHRoZSBgZmllbGRgIHZhbHVlIGNoYW5nZXMsIHRoZSBgcXVhbGlmaWVyYCB2YWx1ZSB3aWxsIHVwZGF0ZSBhcHByb3ByaWF0ZWx5LlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY1VwRmllbGRBbmRRdWFsaWZpZXIgPSAoXG4gICAgICAgIGZnOiBGb3JtR3JvdXA8e1xuICAgICAgICAgICAgYm9vbGVhbjogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBmaWVsZDogRm9ybUNvbnRyb2w7XG4gICAgICAgICAgICBxdWFsaWZpZXI6IEZvcm1Db250cm9sO1xuICAgICAgICAgICAgcXVlcnk6IEZvcm1Db250cm9sO1xuICAgICAgICB9PixcbiAgICAgICAgc2NvcGU6IFNlYXJjaENvbmZpZ1snc2NvcGUnXSxcbiAgICApID0+IHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgZmcuY29udHJvbHMuZmllbGQudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiBzY29wZSA9PT0gJ2xvY2FsJyksXG4gICAgICAgICAgICAgICAgICAgIHRhcCgodmFsOiBBZHZhbmNlZFNlYXJjaFF1YWxpZmllcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZnLmNvbnRyb2xzLnF1YWxpZmllci5zZXRWYWx1ZShBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5xdWFsaWZpZXJzW3ZhbF1bMF0pLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCksXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgcXVlcmllczogdGhpcy5mYi5hcnJheTxGb3JtR3JvdXA8UXVlcnlSb3c+PihcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKEFEVkFOQ0VEX1NFQVJDSF9RVUVSSUVTX0xJTUlUKV0sXG4gICAgICAgICksXG4gICAgICAgIHR5cGVzOiBbW10gYXMgc3RyaW5nW11dLFxuICAgICAgICBjb2xsZWN0aW9uczogW1tdIGFzIHN0cmluZ1tdXSxcbiAgICAgICAgbGFuZ3VhZ2VzOiBbW10gYXMgQWR2YW5jZWRTZWFyY2hMYW5ndWFnZU9wdGlvbltdXSxcbiAgICAgICAgZGF0ZTogdGhpcy5mYi5ncm91cChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmcm9tOiBbJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCg0KSwgVmFsaWRhdG9ycy5wYXR0ZXJuKERBVEVfVkFMSURBVE9SX1JFR0VYKV1dLFxuICAgICAgICAgICAgICAgIHRvOiBbJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCg0KSwgVmFsaWRhdG9ycy5wYXR0ZXJuKERBVEVfVkFMSURBVE9SX1JFR0VYKV1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgdmFsaWRhdG9yczogdmFsaWRhdGVEYXRlUmFuZ2VGaWVsZHMoKSB9LFxuICAgICAgICApLFxuICAgICAgICBsaW1pdFJlc3VsdHM6IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgcGVlclJldmlld2VkOiBbZmFsc2VdLFxuICAgICAgICB9KSxcbiAgICAgICAgZXhwYW5kUmVzdWx0czogdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICBhcHBseUVxdWl2YWxlbnRTdWJqZWN0czogW2ZhbHNlXSxcbiAgICAgICAgICAgIGZ1bGxUZXh0OiBbZmFsc2VdLFxuICAgICAgICB9KSxcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCBpc1N1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIHByb3RlY3RlZCBhZHZhbmNlZFNlYXJjaE9wdGlvbnMgPSBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUztcbiAgICBwcm90ZWN0ZWQgYWR2YW5jZWRTZWFyY2hGaWVsZE1hcCA9IEFEVkFOQ0VEX1NFQVJDSF9GSUVMRF9NQVA7XG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkU2VhcmNoUXVhbGlmaWVyTWFwID0gQURWQU5DRURfU0VBUkNIX1FVQUxJRklFUl9NQVA7XG5cbiAgICBnZXQgcXVlcmllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLnF1ZXJpZXM7XG4gICAgfVxuICAgIGdldCB0eXBlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLnR5cGVzO1xuICAgIH1cbiAgICBnZXQgY29sbGVjdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5jb2xsZWN0aW9ucztcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmxhbmd1YWdlcztcbiAgICB9XG4gICAgZ2V0IGZyb20oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5kYXRlLmNvbnRyb2xzLmZyb207XG4gICAgfVxuICAgIGdldCB0bygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWR2YW5jZWRTZWFyY2hGb3JtLmNvbnRyb2xzLmRhdGUuY29udHJvbHMudG87XG4gICAgfVxuICAgIGdldCBwZWVyUmV2aWV3ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5saW1pdFJlc3VsdHMuY29udHJvbHMucGVlclJldmlld2VkO1xuICAgIH1cbiAgICBnZXQgZnVsbFRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5leHBhbmRSZXN1bHRzLmNvbnRyb2xzLmZ1bGxUZXh0O1xuICAgIH1cbiAgICBnZXQgYXBwbHlFcXVpdmFsZW50U3ViamVjdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkdmFuY2VkU2VhcmNoRm9ybS5jb250cm9scy5leHBhbmRSZXN1bHRzLmNvbnRyb2xzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHF1ZXJ5IHRvIGBxdWVyaWVzYCBgRm9ybUFycmF5YC4gVGhpcyBGb3JtR3JvdXAgaGFzIGFuIGFkZGl0aW9uYWwgYGJvb2xlYW5gIGNvbnRyb2wuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFkZFF1ZXJ5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnF1ZXJpZXMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgICAgIGJvb2xlYW46IFtBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5ib29sZWFuWzBdIGFzIEFkdmFuY2VkU2VhcmNoQm9vbGVhbk9wdGlvbl0sXG4gICAgICAgICAgICAgICAgZmllbGQ6IFtcbiAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMuZmllbGRzWzBdIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRmllbGRPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hMb2NhbEZpZWxkT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoRXh0ZXJuYWxGaWVsZE9wdGlvbixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHF1YWxpZmllcjogW1xuICAgICAgICAgICAgICAgICAgICBBRFZBTkNFRF9TRUFSQ0hfT1BUSU9OUy5xdWFsaWZpZXJzW1xuICAgICAgICAgICAgICAgICAgICAgICAgQURWQU5DRURfU0VBUkNIX09QVElPTlMubG9jYWxGaWVsZHNbMF1cbiAgICAgICAgICAgICAgICAgICAgXVswXSBhcyBBZHZhbmNlZFNlYXJjaFF1YWxpZmllck9wdGlvbixcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3luY1VwRmllbGRBbmRRdWFsaWZpZXIodGhpcy5xdWVyaWVzLmF0KC0xKSwgdGhpcy5jb25maWcuc2NvcGUpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlUXVlcnkgPSAoaTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHRoaXMucXVlcmllcy5yZW1vdmVBdChpKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYXBwcm9wcmlhdGUgcXVlcnkgcGFyYW1zIGJlZm9yZSBwZXJmb3JtaW5nIGEgbG9jYWwgYWR2YW5jZWQgc2VhcmNoLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkb0xvY2FsQWR2YW5jZWRTZWFyY2ggPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9BZHZhbmNlZFNlYXJjaCh7XG4gICAgICAgICAgICBsb2NhbEFkdmFuY2VkU2VhcmNoOiB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaCxcbiAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGU6IHRoaXMuZ2F0aGVyVG9BbmRGcm9tVmFsdWVzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUmVzb3VyY2VUeXBlczogdGhpcy50eXBlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENvbGxlY3Rpb25zOiB0aGlzLmNvbGxlY3Rpb25zLnZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFByZXBhcmVzIGFwcHJvcHJpYXRlIHF1ZXJ5IHBhcmFtcyBiZWZvcmUgcGVyZm9ybWluZyBhbiBleHRlcm5hbCBhZHZhbmNlZCBzZWFyY2guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRvRXh0ZXJuYWxBZHZhbmNlZFNlYXJjaCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FkdmFuY2VkU2VhcmNoKHtcbiAgICAgICAgICAgIGV4dGVybmFsQWR2YW5jZWRTZWFyY2g6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoLFxuICAgICAgICAgICAgICAgIGRhdGVQdWJsaXNoZWQ6IHRoaXMuZ2F0aGVyVG9BbmRGcm9tVmFsdWVzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRMYW5ndWFnZXM6IHRoaXMubGFuZ3VhZ2VzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGxpbWl0UmVzdWx0czoge1xuICAgICAgICAgICAgICAgICAgICBwZWVyUmV2aWV3ZWQ6IHRoaXMucGVlclJldmlld2VkLnZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXhwYW5kUmVzdWx0czoge1xuICAgICAgICAgICAgICAgICAgICBhcHBseUVxdWl2YWxlbnRTdWJqZWN0czogdGhpcy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbFRleHQ6IHRoaXMuZnVsbFRleHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgIENvbXBhcmVzICdmcm9tJyBhbmQgJ3RvJyB0byBlbnN1cmUgJ3RvJyBpcyA+PSB0byAnZnJvbScsIGVsc2Ugc3dhcHMgdGhlbS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdhdGhlclRvQW5kRnJvbVZhbHVlcyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHRoaXMuZnJvbS52YWx1ZVxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLmZyb20udmFsdWUpIDw9IHBhcnNlSW50KHRoaXMudG8udmFsdWUpXG4gICAgICAgICAgICAgICAgPyB0aGlzLmZyb20udmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMudG8udmFsdWVcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGNvbnN0IHRvID0gdGhpcy50by52YWx1ZVxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnRvLnZhbHVlKSA+PSBwYXJzZUludCh0aGlzLmZyb20udmFsdWUpXG4gICAgICAgICAgICAgICAgPyB0aGlzLnRvLnZhbHVlXG4gICAgICAgICAgICAgICAgOiB0aGlzLmZyb20udmFsdWVcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiB7IGZyb20sIHRvIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlcmUgaXMgYSBxdWVyeSB0byB1c2UsIGdhdGhlcnMgYWxsIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMgbmVlZGVkLCB0aGVuIHBlcmZvcm1zIGFuIGFkdmFuY2VkIHNlYXJjaCB2aWEgYHJvdXRlci5uYXZpZ2F0ZSgpYC5cbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IHF1ZXJ5UGFyYW1zIGJhc2Ugc2V0IG9mIHF1ZXJ5IHBhcmFtcyB0byBuYXZpZ2F0ZSB3aXRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBkb0FkdmFuY2VkU2VhcmNoID0gKHVwZGF0ZWRQcm9wczogUGFydGlhbDxTZWFyY2hDb25maWc+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAvLyBEb24ndCBwZXJmb3JtIGEgc2VhcmNoIHVubGVzcyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcXVlcnlcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LmludmFsaWQgJiZcbiAgICAgICAgICAgICF0aGlzLnF1ZXJpZXMudmFsdWUuc29tZSgodikgPT4gISF2LnF1ZXJ5KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBhIHNlYXJjaCB1bmxlc3MgdGhlIGRhdGUgZm9ybSBpcyB2YWxpZFxuICAgICAgICBpZiAodGhpcy5hZHZhbmNlZFNlYXJjaEZvcm0uY29udHJvbHMuZGF0ZS5pbnZhbGlkKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5hZHZhbmNlZFNlYXJjaC5lbWl0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgICAgICAgLi4udXBkYXRlZFByb3BzLFxuICAgICAgICAgICAgYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3M6IHRoaXMucXVlcmllcy52YWx1ZSBhcyBBZHZhbmNlZFNlYXJjaFF1ZXJ5Um93W10sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2hvd1NlYXJjaFZhbGlkYXRpb25Ub29sVGlwID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dFRvb2x0aXAuc2hvdygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHNldHVwRm9ybSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5xdWVyaWVzLmNsZWFyKCk7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIGF0IGxlYXN0IHR3byBxdWVyaWVzIGF2YWlsYWJsZVxuICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG4gICAgICAgIHRoaXMuYWRkUXVlcnkoKTtcblxuICAgICAgICAvLyBFbnN1cmUgdmFsaWRhdGlvbiB0b29sdGlwIGNsb3NlcyB3aGVuIHVzZXMgZW50ZXJzIGEgcXVlcnlcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzXG4gICAgICAgICAgICAgICAgLmF0KDApXG4gICAgICAgICAgICAgICAgLmNvbnRyb2xzLnF1ZXJ5LnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCgnJykpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5pbnB1dFRvb2x0aXApKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gKHRoaXMuaW5wdXRUb29sdGlwLmRpc2FibGVkID0gdHJ1ZSkpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIG5vIGBxe05VTX1gIHVzZSBgcWAgZm9yIGZpcnN0IHF1ZXJ5XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuYWR2YW5jZWRTZWFyY2hRdWVyeVJvd3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy5xdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LnNldFZhbHVlKHRoaXMuY29uZmlnLnEpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLmFkdmFuY2VkU2VhcmNoUXVlcnlSb3dzLmZvckVhY2goKHF1ZXJ5Um93LCBpKSA9PiB7XG4gICAgICAgICAgICAvLyBBZGQgYSBxdWVyeSBmb3JtIGNvbnRyb2wgZm9yIGV2ZXJ5IHF7bnVtfSBrZXkgYWZ0ZXIgdGhlIGZpcnN0LlxuICAgICAgICAgICAgbGV0IHF1ZXJ5Q29udHJvbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sID0gdGhpcy5xdWVyaWVzLmF0KGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFF1ZXJ5KCk7XG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sID0gdGhpcy5xdWVyaWVzLmF0KC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHRoZSBxdWVyeSB2YWx1ZS5cbiAgICAgICAgICAgIHF1ZXJ5Q29udHJvbC5jb250cm9scy5xdWVyeS5zZXRWYWx1ZShxdWVyeVJvdy5xdWVyeSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgZmllbGQgdmFsdWUsIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBxdWVyeVJvdy5maWVsZCAmJiAvLyBPbmx5IHNldCB0aGUgZmllbGQgaWYgdGhlIHZhbHVlIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAoaXNBZHZhbmNlZFNlYXJjaEZpZWxkT3B0aW9uKHF1ZXJ5Um93LmZpZWxkKSB8fFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaXNBZHZhbmNlZFNlYXJjaExvY2FsRmllbGRPcHRpb24ocXVlcnlSb3cuZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzQWR2YW5jZWRTZWFyY2hFeHRlcm5hbEZpZWxkT3B0aW9uKHF1ZXJ5Um93LmZpZWxkKSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnNldFZhbHVlKHF1ZXJ5Um93LmZpZWxkKTtcbiAgICAgICAgICAgIGVsc2UgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnNldFZhbHVlKHRoaXMuYWR2YW5jZWRTZWFyY2hPcHRpb25zLmZpZWxkc1swXSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcXVhbGlmaWVyIHZhbHVlLCBpZiBhdmFpbGFibGUgYW5kIGEgbG9jYWwgc2VhcmNoLlxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNjb3BlID09PSAnbG9jYWwnICYmIHF1ZXJ5Um93LnF1YWxpZmllcilcbiAgICAgICAgICAgICAgICBxdWVyeUNvbnRyb2wuY29udHJvbHMucXVhbGlmaWVyLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJvdy5xdWFsaWZpZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hPcHRpb25zLnF1YWxpZmllcnNbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLmZpZWxkLnZhbHVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWR2YW5jZWRTZWFyY2hGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkdmFuY2VkU2VhcmNoTG9jYWxGaWVsZE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGJvb2xlYW4sIGlmIGF2YWlsYWJsZSBhbmQgbm90IHRoZSBmaXJzdCBxdWVyeS5cbiAgICAgICAgICAgIGlmIChpICE9PSAwICYmIHF1ZXJ5Um93LmJvb2xlYW4pXG4gICAgICAgICAgICAgICAgcXVlcnlDb250cm9sLmNvbnRyb2xzLmJvb2xlYW4uc2V0VmFsdWUocXVlcnlSb3cuYm9vbGVhbik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5jb25maWcuc2NvcGUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZXMuc2V0VmFsdWUodGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5zZWxlY3RlZFJlc291cmNlVHlwZXMpO1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9ucy5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLnNlbGVjdGVkQ29sbGVjdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZXMuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubG9jYWxBZHZhbmNlZFNlYXJjaC5zZWxlY3RlZExhbmd1YWdlcyBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW10sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mcm9tLnNldFZhbHVlKHRoaXMuY29uZmlnLmxvY2FsQWR2YW5jZWRTZWFyY2guY3JlYXRpb25EYXRlLmZyb20pO1xuICAgICAgICAgICAgdGhpcy50by5zZXRWYWx1ZSh0aGlzLmNvbmZpZy5sb2NhbEFkdmFuY2VkU2VhcmNoLmNyZWF0aW9uRGF0ZS50byk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlcy5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5leHRlcm5hbEFkdmFuY2VkU2VhcmNoXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3RlZExhbmd1YWdlcyBhcyBBZHZhbmNlZFNlYXJjaExhbmd1YWdlT3B0aW9uW10sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5mcm9tLnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZGF0ZVB1Ymxpc2hlZC5mcm9tKTtcbiAgICAgICAgICAgIHRoaXMudG8uc2V0VmFsdWUodGhpcy5jb25maWcuZXh0ZXJuYWxBZHZhbmNlZFNlYXJjaC5kYXRlUHVibGlzaGVkLnRvKTtcbiAgICAgICAgICAgIHRoaXMucGVlclJldmlld2VkLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2gubGltaXRSZXN1bHRzLnBlZXJSZXZpZXdlZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFwcGx5RXF1aXZhbGVudFN1YmplY3RzLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZXhwYW5kUmVzdWx0cy5hcHBseUVxdWl2YWxlbnRTdWJqZWN0cyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZ1bGxUZXh0LnNldFZhbHVlKHRoaXMuY29uZmlnLmV4dGVybmFsQWR2YW5jZWRTZWFyY2guZXhwYW5kUmVzdWx0cy5mdWxsVGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiPGZvcm1cbiAgICBkYXRhLXRlc3RpZD1cImFkdmFuY2VkU2VhcmNoRm9ybVwiXG4gICAgKHN1Ym1pdCk9XCJjb25maWcuc2NvcGUgPT09ICdsb2NhbCcgPyBkb0xvY2FsQWR2YW5jZWRTZWFyY2goKSA6IGRvRXh0ZXJuYWxBZHZhbmNlZFNlYXJjaCgpXCJcbiAgICBbZm9ybUdyb3VwXT1cImFkdmFuY2VkU2VhcmNoRm9ybVwiXG4gICAgY2xhc3M9XCJzcy1hZHYtc2VhcmNoLXdyYXBwZXJcIlxuPlxuICAgIDxoMz5BZHZhbmNlZCBTZWFyY2g8L2gzPlxuICAgIDwhLS0gUXVlcmllcyAtLT5cbiAgICBAZm9yIChxdWVyeSBvZiBxdWVyaWVzLmNvbnRyb2xzOyB0cmFjayAkaW5kZXg7IGxldCBxdWVyeUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcy1hZHYtc2VhcmNoLXJvd1wiIFtmb3JtR3JvdXBdPVwicXVlcnlcIj5cbiAgICAgICAgICAgIDwhLS0gQm9vbGVhbiBvcGVyYXRvciAtLT5cbiAgICAgICAgICAgIDwhLS0gQWRkIGJvb2xlYW4gZm9yIGVhY2ggcm93IGV4Y2VwdCBmb3IgZmlyc3QgLS0+XG4gICAgICAgICAgICBAaWYgKCEkZmlyc3QpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidib29sZWFuJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYm9vbGVhbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2Jvb2xlYW4nICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGJvb2xlYW4gb2YgYWR2YW5jZWRTZWFyY2hPcHRpb25zLmJvb2xlYW47IHRyYWNrIGJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImJvb2xlYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYm9vbGVhbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gRmllbGQgLS0+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCInZmllbGQnICsgcXVlcnlJbmRleFwiIGNsYXNzPVwic3MtaGlkZGVuXCI+RmllbGQge3sgcXVlcnlJbmRleCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Mtc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCInZmllbGQnICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2ZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidmaWVsZCcgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGZpZWxkIG9mIGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5maWVsZHM7IHRyYWNrIGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWR2YW5jZWRTZWFyY2hGaWVsZE1hcFtmaWVsZF0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxvcHRncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIihjb25maWcuc2NvcGUgPT09ICdleHRlcm5hbCcgPyAnT25saW5lJyA6ICdMaWJyYXJ5JykgKyAnIFNwZWNpZmljJ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIGNvbmZpZy5zY29wZSA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5leHRlcm5hbEZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5sb2NhbEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayBmaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJmaWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhZHZhbmNlZFNlYXJjaEZpZWxkTWFwW2ZpZWxkXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFF1YWxpZmllcnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBsb2NhbCBzZWFyY2hlcyAtLT5cbiAgICAgICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ3F1YWxpZmllcicgKyBxdWVyeUluZGV4XCIgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICA+TWF0Y2ggQ3JpdGVyaWEge3sgcXVlcnlJbmRleCB9fTwvbGFiZWxcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNzLXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncXVhbGlmaWVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCIncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICRhbnkgYmVjYXVzZSBhIGZpZWxkIGNhbiB0ZWNobmljYWxseSBiZSBsb2NhbCBvciBleHRlcm5hbCwgdGhvdWdoIHRoaXMgYmxvY2sgaXMgc2NvcGVkIHN0cmljdGx5IHRvIGxvY2FsIGZpZWxkcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllciBvZiAkYW55KGFkdmFuY2VkU2VhcmNoT3B0aW9ucy5xdWFsaWZpZXJzKVtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkuY29udHJvbHMuZmllbGQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrIHF1YWxpZmllcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uSW5kZXggPSAkaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwicXVhbGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVhbGlmaWVyJyArIHF1ZXJ5SW5kZXggKyAnLW9wdGlvbicgKyBvcHRpb25JbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJGFueShhZHZhbmNlZFNlYXJjaFF1YWxpZmllck1hcClbcXVhbGlmaWVyXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwhLS0gUXVlcnkgLS0+XG4gICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncXVlcnknICsgcXVlcnlJbmRleFwiIGNsYXNzPVwic3MtaGlkZGVuXCI+UXVlcnkge3sgcXVlcnlJbmRleCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3MtcXVlcnktaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaElucHV0XG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCIncXVlcnknICsgcXVlcnlJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ3F1ZXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIidxdWVyeScgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1yZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRmlsbCBvdXQgdGhpcyBmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2Fib3ZlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJpc1N1Ym1pdHRlZCAmJiBxdWVyaWVzLmF0KDApLmNvbnRyb2xzLnF1ZXJ5LmludmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiaW52YWxpZElucHV0RGVzY1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmICghJGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLXJvdy1jYW5jZWxcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVF1ZXJ5KHF1ZXJ5SW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwiJ2NhbmNlbFJvdycgKyBxdWVyeUluZGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBzcy1pY29uXCI+IGNhbmNlbCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiYWRkUXVlcnkoKVwiXG4gICAgICAgIGlkPVwiYWRkUXVlcnlCdG5cIlxuICAgICAgICBkYXRhLXRlc3RpZD1cImFkZFF1ZXJ5XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInF1ZXJpZXMubGVuZ3RoID4gMTFcIlxuICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHNzLWljb25cIj4gYWRkIDwvc3Bhbj5cbiAgICAgICAgQWRkIGEgcm93XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBPVEhFUiBPUFRJT05TIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzcy1vdGhlci1vcHRpb25zXCI+XG4gICAgICAgIDwhLS0gTE9DQUwgLS0+XG4gICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICA8IS0tIFR5cGUgLS0+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVzb3VyY2VUeXBlXCI+XG4gICAgICAgICAgICAgICAgPGg0PlJlc291cmNlIFR5cGU8L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLW11bHRpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidSZXNvdXJjZSBUeXBlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsT3B0aW9uc109XCJhZHZhbmNlZFNlYXJjaE9wdGlvbnMudHlwZXNbY29uZmlnLmluc3RpdHV0aW9uXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cInR5cGVzLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwidHlwZXMuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gQ29sbGVjdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJjb2xsZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGg0PkNvbGxlY3Rpb248L2g0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcy1tdWx0aS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGliLW11bHRpLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidDb2xsZWN0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsT3B0aW9uc109XCJhZHZhbmNlZFNlYXJjaE9wdGlvbnMuY29sbGVjdGlvbnNbY29uZmlnLmluc3RpdHV0aW9uXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRLZXlzXT1cImNvbGxlY3Rpb25zLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwiY29sbGVjdGlvbnMuc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2xpYi1tdWx0aS1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gTGFuZ3VhZ2UgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGFuZ3VhZ2VCbG9ja1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGF0ZUJsb2NrOyBjb250ZXh0OiB7IGhlYWRlcjogJ0NyZWF0aW9uIERhdGUnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0gRVhURVJOQUwgLS0+XG4gICAgICAgIEBpZiAoY29uZmlnLnNjb3BlID09PSAnZXh0ZXJuYWwnKSB7XG4gICAgICAgICAgICA8ZGl2IGZvcm1Hcm91cE5hbWU9XCJsaW1pdFJlc3VsdHNcIiBjbGFzcz1cInNzLWNoZWNrYm94LXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Rm9yIEZld2VyIFJlc3VsdHMgVHJ5PC9oND5cbiAgICAgICAgICAgICAgICA8IS0tIFBlZXIgcmV2aWV3ZWQgLS0+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3MtY2hlY2tib3gtbGFiZWxcIiBmb3I9XCJwZWVyUmV2aWV3ZWRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlZXJSZXZpZXdlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCIncGVlclJldmlld2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cInBlZXJSZXZpZXdlZFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJwZWVyUmV2aWV3ZWQudmFsdWVcIj48L2xpYi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcy1sYWJlbC10ZXh0XCI+UGVlciByZXZpZXdlZCBqb3VybmFsIGFydGljbGVzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cImV4cGFuZFJlc3VsdHNcIiBjbGFzcz1cInNzLWNoZWNrYm94LXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8aDQ+Rm9yIE1vcmUgUmVzdWx0cyBUcnk8L2g0PlxuICAgICAgICAgICAgICAgIDwhLS0gQXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0cyAtLT5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzcy1jaGVja2JveC1sYWJlbFwiIGZvcj1cImFwcGx5RXF1aXZhbGVudFN1YmplY3RzXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcy1oaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBseUVxdWl2YWxlbnRTdWJqZWN0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInYXBwbHlFcXVpdmFsZW50U3ViamVjdHMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHNcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWNoZWNrYm94IFtpc0NoZWNrZWRdPVwiYXBwbHlFcXVpdmFsZW50U3ViamVjdHMudmFsdWVcIj48L2xpYi1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcy1sYWJlbC10ZXh0XCI+QXBwbHkgZXF1aXZhbGVudCBzdWJqZWN0czwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwhLS0gRnVsbCB0ZXh0IC0tPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNzLWNoZWNrYm94LWxhYmVsXCIgZm9yPVwiZnVsbFRleHRcIiB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNzLWhpZGRlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImZ1bGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIidmdWxsVGV4dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmdWxsVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItY2hlY2tib3ggW2lzQ2hlY2tlZF09XCJmdWxsVGV4dC52YWx1ZVwiPjwvbGliLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNzLWxhYmVsLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPkluY2x1ZGUgcmVzdWx0cyB0aGUgbGlicmFyeSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIERhdGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlQmxvY2s7IGNvbnRleHQ6IHsgaGVhZGVyOiAnRGF0ZSBQdWJsaXNoZWQnIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSBMYW5ndWFnZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYW5ndWFnZUJsb2NrXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwiYWR2U2VhcmNoRm9vdGVyXCI+XG4gICAgICAgIDxhIFtocmVmXT1cIidodHRwczovL2xpYi5ieXUuZWR1L2Jyb3dzZS8nICsgY29uZmlnLmluc3RpdHV0aW9uXCI+QWxwaGFiZXRpYyBCcm93c2U8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicGlsbC1idG4tLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgIGVuc2lnbjogY29uZmlnLmluc3RpdHV0aW9uID09PSAnZW5zaWduJyxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFkdlNlYXJjaFN1Ym1pdEJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZm9ybT5cblxuPG5nLXRlbXBsYXRlICNsYW5ndWFnZUJsb2NrPlxuICAgIDxkaXY+XG4gICAgICAgIDxoND5MYW5ndWFnZTwvaDQ+XG4gICAgICAgIDxsaWItbXVsdGktc2VsZWN0XG4gICAgICAgICAgICBbbGFiZWxdPVwiJ2xhbmd1YWdlJ1wiXG4gICAgICAgICAgICBbYWxsT3B0aW9uc109XCJhZHZhbmNlZFNlYXJjaE9wdGlvbnMubGFuZ3VhZ2VzXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZEtleXNdPVwibGFuZ3VhZ2VzLnZhbHVlXCJcbiAgICAgICAgICAgIChzZWxlY3RlZEtleXNDaGFuZ2UpPVwibGFuZ3VhZ2VzLnNldFZhbHVlKCRhbnkoJGV2ZW50KSlcIlxuICAgICAgICA+PC9saWItbXVsdGktc2VsZWN0PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGF0ZUJsb2NrIGxldC1oZWFkZXI9XCJoZWFkZXJcIj5cbiAgICA8ZGl2IGlkPVwiZGF0ZU9wdGlvbnNcIiBjbGFzcz1cImV4dGVybmFsXCI+XG4gICAgICAgIDxoND57eyBoZWFkZXIgfX08L2g0PlxuICAgICAgICA8bGliLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgIFtmcm9tXT1cImZyb20udmFsdWVcIlxuICAgICAgICAgICAgW3RvXT1cInRvLnZhbHVlXCJcbiAgICAgICAgICAgIChmcm9tQ2hhbmdlKT1cImZyb20uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAodG9DaGFuZ2UpPVwidG8uc2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgID48L2xpYi1kYXRlLXJhbmdlPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==