@firestitch/filter 18.1.0 → 18.2.1

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 (72) hide show
  1. package/app/components/filter/filter.component.d.ts +9 -13
  2. package/app/components/filter-chip/filter-chip.component.d.ts +7 -7
  3. package/app/components/filter-drawer/filter-drawer.component.d.ts +7 -7
  4. package/app/components/filter-drawer-actions/filter-drawer-actions.component.d.ts +2 -2
  5. package/app/components/saved-filter/index.d.ts +0 -1
  6. package/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.d.ts +6 -5
  7. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.d.ts +1 -0
  8. package/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.d.ts +13 -0
  9. package/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.d.ts +6 -2
  10. package/app/fs-filter.module.d.ts +7 -8
  11. package/app/helpers/build-query-params.d.ts +2 -2
  12. package/app/helpers/create-filter-item.d.ts +1 -1
  13. package/app/interfaces/external-params.interface.d.ts +1 -1
  14. package/app/interfaces/saved-filters.interface.d.ts +2 -2
  15. package/app/models/items/autocomplete-chips-item.d.ts +1 -1
  16. package/app/models/items/base-item.d.ts +1 -1
  17. package/app/models/items/chips-item.d.ts +1 -1
  18. package/app/models/items/date/base-date-item.d.ts +1 -1
  19. package/app/models/items/date-range/base-date-range-item.d.ts +1 -1
  20. package/app/models/items/select/multiple-select-item.d.ts +3 -3
  21. package/app/models/items/select/simple-select-item.d.ts +2 -2
  22. package/app/models/items/week-item.d.ts +1 -1
  23. package/app/services/index.d.ts +5 -5
  24. package/app/services/{items-store.service.d.ts → item-store.service.d.ts} +9 -9
  25. package/app/services/{external-params-controller.service.d.ts → param-controller.service.d.ts} +9 -10
  26. package/app/services/{query-persistance-controller.service.d.ts → persistance-controller.service.d.ts} +3 -3
  27. package/app/services/query-param-controller.service.d.ts +21 -0
  28. package/app/services/{saved-filters-controller.service.d.ts → saved-filter-controller.service.d.ts} +6 -10
  29. package/esm2022/app/components/filter/filter.component.mjs +68 -77
  30. package/esm2022/app/components/filter-chip/filter-chip.component.mjs +22 -16
  31. package/esm2022/app/components/filter-chips/filter-chips.component.mjs +3 -3
  32. package/esm2022/app/components/filter-drawer/filter-drawer.component.mjs +18 -18
  33. package/esm2022/app/components/filter-drawer-actions/filter-drawer-actions.component.mjs +1 -1
  34. package/esm2022/app/components/filters-item/autocompletechips/autocompletechips.component.mjs +5 -5
  35. package/esm2022/app/components/saved-filter/index.mjs +1 -2
  36. package/esm2022/app/components/saved-filter/saved-filter-autocomplete-chips/saved-filter-autocomplete-chips.component.mjs +17 -16
  37. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/index.mjs +2 -0
  38. package/esm2022/app/components/saved-filter/saved-filter-manage/components/saved-filter-chips/saved-filter-chips.component.mjs +28 -0
  39. package/esm2022/app/components/saved-filter/saved-filter-manage/saved-filter-manage.component.mjs +24 -17
  40. package/esm2022/app/fs-filter.module.mjs +1 -5
  41. package/esm2022/app/helpers/build-query-params.mjs +1 -1
  42. package/esm2022/app/interfaces/external-params.interface.mjs +1 -1
  43. package/esm2022/app/interfaces/saved-filters.interface.mjs +1 -1
  44. package/esm2022/app/models/items/autocomplete-chips-item.mjs +4 -4
  45. package/esm2022/app/models/items/base-item.mjs +4 -4
  46. package/esm2022/app/models/items/chips-item.mjs +5 -5
  47. package/esm2022/app/models/items/date/base-date-item.mjs +9 -9
  48. package/esm2022/app/models/items/date-range/base-date-range-item.mjs +12 -12
  49. package/esm2022/app/models/items/select/multiple-select-item.mjs +17 -17
  50. package/esm2022/app/models/items/select/simple-select-item.mjs +10 -10
  51. package/esm2022/app/models/items/week-item.mjs +11 -9
  52. package/esm2022/app/services/index.mjs +6 -6
  53. package/esm2022/app/services/item-store.service.mjs +356 -0
  54. package/esm2022/app/services/param-controller.service.mjs +149 -0
  55. package/esm2022/app/services/persistance-controller.service.mjs +65 -0
  56. package/esm2022/app/services/query-param-controller.service.mjs +65 -0
  57. package/esm2022/app/services/saved-filter-controller.service.mjs +169 -0
  58. package/esm2022/public_api.mjs +2 -3
  59. package/fesm2022/firestitch-filter.mjs +1714 -1787
  60. package/fesm2022/firestitch-filter.mjs.map +1 -1
  61. package/package.json +1 -1
  62. package/public_api.d.ts +1 -2
  63. package/app/components/saved-filter/saved-filter-edit/index.d.ts +0 -1
  64. package/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.d.ts +0 -18
  65. package/app/services/query-params-controller.service.d.ts +0 -21
  66. package/esm2022/app/components/saved-filter/saved-filter-edit/index.mjs +0 -2
  67. package/esm2022/app/components/saved-filter/saved-filter-edit/saved-filter-edit.component.mjs +0 -72
  68. package/esm2022/app/services/external-params-controller.service.mjs +0 -154
  69. package/esm2022/app/services/items-store.service.mjs +0 -356
  70. package/esm2022/app/services/query-params-controller.service.mjs +0 -65
  71. package/esm2022/app/services/query-persistance-controller.service.mjs +0 -65
  72. package/esm2022/app/services/saved-filters-controller.service.mjs +0 -210
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firestitch/filter",
3
- "version": "18.1.0",
3
+ "version": "18.2.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/Firestitch/ngx-filter"
package/public_api.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- export { ExternalParamsController } from './app/services/external-params-controller.service';
2
- export { SavedFiltersController } from './app/services/saved-filters-controller.service';
1
+ export { SavedFilterController } from './app/services/saved-filter-controller.service';
3
2
  export { FsFilterModule } from './app/fs-filter.module';
4
3
  export { FilterComponent } from './app/components/filter/filter.component';
5
4
  export { FilterItemComponent } from './app/components/filters-item/filter-item.component';
@@ -1 +0,0 @@
1
- export * from './saved-filter-edit.component';
@@ -1,18 +0,0 @@
1
- import { MatDialogRef } from '@angular/material/dialog';
2
- import { IFilterExternalParams } from '../../../interfaces/external-params.interface';
3
- import { IFilterSavedFilter } from '../../../interfaces/saved-filters.interface';
4
- import * as i0 from "@angular/core";
5
- export declare class FsFilterSavedFilterEditComponent {
6
- data: any;
7
- private _dialogRef;
8
- filterParams: IFilterExternalParams;
9
- saveAsFilter: IFilterSavedFilter | 'new';
10
- savedFilters: IFilterSavedFilter[];
11
- savedFilterName: string;
12
- private _saveCallback;
13
- private _destroy$;
14
- constructor(data: any, _dialogRef: MatDialogRef<FsFilterSavedFilterEditComponent>);
15
- save: () => import("rxjs").Observable<IFilterSavedFilter>;
16
- static ɵfac: i0.ɵɵFactoryDeclaration<FsFilterSavedFilterEditComponent, never>;
17
- static ɵcmp: i0.ɵɵComponentDeclaration<FsFilterSavedFilterEditComponent, "ng-component", never, {}, {}, never, never, true, never>;
18
- }
@@ -1,21 +0,0 @@
1
- import { ActivatedRoute } from '@angular/router';
2
- import { FsFilterItemsStore } from './items-store.service';
3
- import * as i0 from "@angular/core";
4
- export declare class QueryParamsController {
5
- private _route;
6
- private _itemsStore;
7
- private _enabled;
8
- private _fetchedParams;
9
- constructor(_route: ActivatedRoute, _itemsStore: FsFilterItemsStore);
10
- get enabled(): boolean;
11
- get fetchedParams(): Record<string, any>;
12
- init(enabled: boolean): void;
13
- writeStateToQueryParams(params: any): void;
14
- /**
15
- * Parse query and update filter values
16
- */
17
- fetchFromQueryParams(): void;
18
- private _replaceState;
19
- static ɵfac: i0.ɵɵFactoryDeclaration<QueryParamsController, never>;
20
- static ɵprov: i0.ɵɵInjectableDeclaration<QueryParamsController>;
21
- }
@@ -1,2 +0,0 @@
1
- export * from './saved-filter-edit.component';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvc2F2ZWQtZmlsdGVyL3NhdmVkLWZpbHRlci1lZGl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NhdmVkLWZpbHRlci1lZGl0LmNvbXBvbmVudCc7XG4iXX0=
@@ -1,72 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core';
2
- import { MAT_DIALOG_DATA, MatDialogRef, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';
3
- import { Subject } from 'rxjs';
4
- import { takeUntil, tap } from 'rxjs/operators';
5
- import { FormsModule } from '@angular/forms';
6
- import { FsFormModule } from '@firestitch/form';
7
- import { CdkScrollable } from '@angular/cdk/scrolling';
8
- import { MatFormField, MatLabel } from '@angular/material/form-field';
9
- import { MatSelect } from '@angular/material/select';
10
- import { MatOption, MatOptgroup } from '@angular/material/core';
11
- import { MatInput } from '@angular/material/input';
12
- import { MatButton } from '@angular/material/button';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/material/dialog";
15
- import * as i2 from "@angular/forms";
16
- import * as i3 from "@firestitch/form";
17
- export class FsFilterSavedFilterEditComponent {
18
- data;
19
- _dialogRef;
20
- filterParams;
21
- saveAsFilter = 'new';
22
- savedFilters;
23
- savedFilterName = '';
24
- _saveCallback;
25
- _destroy$ = new Subject();
26
- constructor(data, _dialogRef) {
27
- this.data = data;
28
- this._dialogRef = _dialogRef;
29
- this.savedFilters = this.data.savedFilters;
30
- this._saveCallback = this.data.saveCallback;
31
- }
32
- save = () => {
33
- const savedFilter = this.saveAsFilter === 'new' ?
34
- {
35
- name: this.savedFilterName,
36
- active: true,
37
- filters: this.data.params,
38
- } : {
39
- ...this.saveAsFilter,
40
- filters: this.data.params,
41
- };
42
- return this._saveCallback(savedFilter)
43
- .pipe(tap((filter) => {
44
- this._dialogRef.close(filter);
45
- }), takeUntil(this._destroy$));
46
- };
47
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterSavedFilterEditComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }], target: i0.ɵɵFactoryTarget.Component });
48
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FsFilterSavedFilterEditComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <h1 mat-dialog-title>\n Save filter\n </h1>\n <div mat-dialog-content>\n <mat-form-field>\n <mat-label>\n Save as\n </mat-label>\n <mat-select\n [(ngModel)]=\"saveAsFilter\"\n name=\"saveAs\">\n <mat-option value=\"new\">\n New filter\n </mat-option>\n @if (savedFilters.length) {\n <mat-optgroup label=\"Saved filters\">\n @for (filter of savedFilters; track filter) {\n <mat-option [value]=\"filter\">\n {{ filter.name }}\n </mat-option>\n }\n </mat-optgroup>\n }\n </mat-select>\n </mat-form-field>\n <br>\n @if (saveAsFilter === 'new') {\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n name=\"filter-name\"\n [(ngModel)]=\"savedFilterName\"\n required>\n </mat-form-field>\n }\n </div>\n <div mat-dialog-actions>\n <button\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ saveAsFilter === 'new' ? 'Create' : 'Save' }}\n </button>\n <button\n mat-button\n type=\"button\"\n [mat-dialog-close]=\"null\">\n Cancel\n </button>\n </div>\n</form>", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i3.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i3.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i3.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
49
- }
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterSavedFilterEditComponent, decorators: [{
51
- type: Component,
52
- args: [{ changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
53
- FormsModule,
54
- FsFormModule,
55
- MatDialogTitle,
56
- CdkScrollable,
57
- MatDialogContent,
58
- MatFormField,
59
- MatLabel,
60
- MatSelect,
61
- MatOption,
62
- MatOptgroup,
63
- MatInput,
64
- MatDialogActions,
65
- MatButton,
66
- MatDialogClose,
67
- ], template: "<form\n fsForm\n [submit]=\"save\">\n <h1 mat-dialog-title>\n Save filter\n </h1>\n <div mat-dialog-content>\n <mat-form-field>\n <mat-label>\n Save as\n </mat-label>\n <mat-select\n [(ngModel)]=\"saveAsFilter\"\n name=\"saveAs\">\n <mat-option value=\"new\">\n New filter\n </mat-option>\n @if (savedFilters.length) {\n <mat-optgroup label=\"Saved filters\">\n @for (filter of savedFilters; track filter) {\n <mat-option [value]=\"filter\">\n {{ filter.name }}\n </mat-option>\n }\n </mat-optgroup>\n }\n </mat-select>\n </mat-form-field>\n <br>\n @if (saveAsFilter === 'new') {\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n name=\"filter-name\"\n [(ngModel)]=\"savedFilterName\"\n required>\n </mat-form-field>\n }\n </div>\n <div mat-dialog-actions>\n <button\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ saveAsFilter === 'new' ? 'Create' : 'Save' }}\n </button>\n <button\n mat-button\n type=\"button\"\n [mat-dialog-close]=\"null\">\n Cancel\n </button>\n </div>\n</form>" }]
68
- }], ctorParameters: () => [{ type: undefined, decorators: [{
69
- type: Inject,
70
- args: [MAT_DIALOG_DATA]
71
- }] }, { type: i1.MatDialogRef }] });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtZmlsdGVyLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL3NhdmVkLWZpbHRlci9zYXZlZC1maWx0ZXItZWRpdC9zYXZlZC1maWx0ZXItZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvc2F2ZWQtZmlsdGVyL3NhdmVkLWZpbHRlci1lZGl0L3NhdmVkLWZpbHRlci1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0ksT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBT2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUF3QnJELE1BQU0sT0FBTyxnQ0FBZ0M7SUFXVDtJQUN4QjtJQVZILFlBQVksQ0FBd0I7SUFDcEMsWUFBWSxHQUErQixLQUFLLENBQUM7SUFDakQsWUFBWSxDQUF1QjtJQUNuQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBRXBCLGFBQWEsQ0FBbUI7SUFDaEMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFeEMsWUFDa0MsSUFBSSxFQUM1QixVQUEwRDtRQURsQyxTQUFJLEdBQUosSUFBSSxDQUFBO1FBQzVCLGVBQVUsR0FBVixVQUFVLENBQWdEO1FBRWxFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM5QyxDQUFDO0lBRU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtRQUNqQixNQUFNLFdBQVcsR0FBdUIsSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNuRTtnQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQzFCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07YUFDMUIsQ0FBQyxDQUFDLENBQUM7WUFDRixHQUFHLElBQUksQ0FBQyxZQUFZO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07U0FDMUIsQ0FBQztRQUVKLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7YUFDbkMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUIsQ0FBQztJQUNOLENBQUMsQ0FBQzt3R0FwQ1MsZ0NBQWdDLGtCQVdqQyxlQUFlOzRGQVhkLGdDQUFnQyx3RUMvQzdDLDAwQ0F3RE8sMkNEekJDLFdBQVcsb3dDQUNYLFlBQVksdXdDQUNaLGNBQWMsK0hBRWQsZ0JBQWdCLHlHQUNoQixZQUFZLDRMQUNaLFFBQVEsc0RBQ1IsU0FBUyx3ZUFDVCxTQUFTLHFKQUNULFdBQVcsbUhBQ1gsUUFBUSxpVUFDUixnQkFBZ0IsNEhBQ2hCLFNBQVMsaUxBQ1QsY0FBYzs7NEZBR1QsZ0NBQWdDO2tCQXJCNUMsU0FBUztzQ0FFVyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxXQUFXO3dCQUNYLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsWUFBWTt3QkFDWixRQUFRO3dCQUNSLFNBQVM7d0JBQ1QsU0FBUzt3QkFDVCxXQUFXO3dCQUNYLFFBQVE7d0JBQ1IsZ0JBQWdCO3dCQUNoQixTQUFTO3dCQUNULGNBQWM7cUJBQ2pCOzswQkFhQSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiwgTWF0RGlhbG9nVGl0bGUsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZXh0ZXJuYWwtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBGaWx0ZXJSZW1vdGVTYXZlLFxuICBJRmlsdGVyU2F2ZWRGaWx0ZXIsXG59IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvc2F2ZWQtZmlsdGVycy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGc0Zvcm1Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9mb3JtJztcbmltcG9ydCB7IENka1Njcm9sbGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFNlbGVjdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRPcHRpb24sIE1hdE9wdGdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5cblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGVVcmw6ICcuL3NhdmVkLWZpbHRlci1lZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIEZzRm9ybU1vZHVsZSxcbiAgICAgICAgTWF0RGlhbG9nVGl0bGUsXG4gICAgICAgIENka1Njcm9sbGFibGUsXG4gICAgICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgICAgIE1hdEZvcm1GaWVsZCxcbiAgICAgICAgTWF0TGFiZWwsXG4gICAgICAgIE1hdFNlbGVjdCxcbiAgICAgICAgTWF0T3B0aW9uLFxuICAgICAgICBNYXRPcHRncm91cCxcbiAgICAgICAgTWF0SW5wdXQsXG4gICAgICAgIE1hdERpYWxvZ0FjdGlvbnMsXG4gICAgICAgIE1hdEJ1dHRvbixcbiAgICAgICAgTWF0RGlhbG9nQ2xvc2UsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNGaWx0ZXJTYXZlZEZpbHRlckVkaXRDb21wb25lbnQge1xuXG4gIHB1YmxpYyBmaWx0ZXJQYXJhbXM6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcztcbiAgcHVibGljIHNhdmVBc0ZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyIHwgJ25ldycgPSAnbmV3JztcbiAgcHVibGljIHNhdmVkRmlsdGVyczogSUZpbHRlclNhdmVkRmlsdGVyW107XG4gIHB1YmxpYyBzYXZlZEZpbHRlck5hbWUgPSAnJztcblxuICBwcml2YXRlIF9zYXZlQ2FsbGJhY2s6IEZpbHRlclJlbW90ZVNhdmU7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGEsXG4gICAgcHJpdmF0ZSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RnNGaWx0ZXJTYXZlZEZpbHRlckVkaXRDb21wb25lbnQ+LFxuICApIHtcbiAgICB0aGlzLnNhdmVkRmlsdGVycyA9IHRoaXMuZGF0YS5zYXZlZEZpbHRlcnM7XG4gICAgdGhpcy5fc2F2ZUNhbGxiYWNrID0gdGhpcy5kYXRhLnNhdmVDYWxsYmFjaztcbiAgfVxuXG4gIHB1YmxpYyBzYXZlID0gKCkgPT4ge1xuICAgIGNvbnN0IHNhdmVkRmlsdGVyOiBJRmlsdGVyU2F2ZWRGaWx0ZXIgPSB0aGlzLnNhdmVBc0ZpbHRlciA9PT0gJ25ldycgPyBcbiAgICAgIHtcbiAgICAgICAgbmFtZTogdGhpcy5zYXZlZEZpbHRlck5hbWUsXG4gICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgZmlsdGVyczogdGhpcy5kYXRhLnBhcmFtcyxcbiAgICAgIH0gOiB7XG4gICAgICAgIC4uLnRoaXMuc2F2ZUFzRmlsdGVyLFxuICAgICAgICBmaWx0ZXJzOiB0aGlzLmRhdGEucGFyYW1zLFxuICAgICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9zYXZlQ2FsbGJhY2soc2F2ZWRGaWx0ZXIpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChmaWx0ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoZmlsdGVyKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApO1xuICB9O1xuXG59XG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8aDEgbWF0LWRpYWxvZy10aXRsZT5cbiAgICBTYXZlIGZpbHRlclxuICA8L2gxPlxuICA8ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPlxuICAgICAgICBTYXZlIGFzXG4gICAgICA8L21hdC1sYWJlbD5cbiAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzYXZlQXNGaWx0ZXJcIlxuICAgICAgICAgIG5hbWU9XCJzYXZlQXNcIj5cbiAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJuZXdcIj5cbiAgICAgICAgICBOZXcgZmlsdGVyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgQGlmIChzYXZlZEZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgPG1hdC1vcHRncm91cCBsYWJlbD1cIlNhdmVkIGZpbHRlcnNcIj5cbiAgICAgICAgICAgIEBmb3IgKGZpbHRlciBvZiBzYXZlZEZpbHRlcnM7IHRyYWNrIGZpbHRlcikge1xuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZmlsdGVyXCI+XG4gICAgICAgICAgICAgICAge3sgZmlsdGVyLm5hbWUgfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPlxuICAgICAgICB9XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8YnI+XG4gICAgQGlmIChzYXZlQXNGaWx0ZXIgPT09ICduZXcnKSB7XG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgTmFtZVxuICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBuYW1lPVwiZmlsdGVyLW5hbWVcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwic2F2ZWRGaWx0ZXJOYW1lXCJcbiAgICAgICAgICByZXF1aXJlZD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgfVxuICA8L2Rpdj5cbiAgPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgIHt7IHNhdmVBc0ZpbHRlciA9PT0gJ25ldycgPyAnQ3JlYXRlJyA6ICdTYXZlJyB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwibnVsbFwiPlxuICAgICAgQ2FuY2VsXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPiJdfQ==
@@ -1,154 +0,0 @@
1
- import { inject, Injectable } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
3
- import { filter, take, takeUntil } from 'rxjs/operators';
4
- import { buildQueryParams } from '../helpers/build-query-params';
5
- import { QueryParamsController, QueryPersistanceController, SavedFiltersController, } from '.';
6
- import { FsFilterItemsStore } from './items-store.service';
7
- import * as i0 from "@angular/core";
8
- export class ExternalParamsController {
9
- _init;
10
- _pending$ = new BehaviorSubject(false);
11
- _config;
12
- _destroy$ = new Subject();
13
- _itemsStore = inject(FsFilterItemsStore);
14
- _persistanceStore = inject(QueryPersistanceController);
15
- _queryParams = inject(QueryParamsController);
16
- _savedFiltersController = inject(SavedFiltersController);
17
- get params() {
18
- let result = {};
19
- if (this._persistanceStore.queryEnabled) {
20
- result = {
21
- ...result,
22
- ...this._persistanceStore.getQuery(),
23
- };
24
- }
25
- if (this._savedFiltersController.enabled && this._savedFiltersController.activeFilter) {
26
- const query = Object.keys(result)
27
- .filter((key) => !this._itemsStore.itemNames.includes(key))
28
- .reduce((acc, key) => {
29
- return {
30
- ...acc,
31
- [key]: result[key],
32
- };
33
- }, {});
34
- result = {
35
- ...query,
36
- ...this._savedFiltersController.activeFilterData,
37
- };
38
- }
39
- else if (this._queryParams.enabled) {
40
- result = {
41
- ...result,
42
- ...this._queryParams.fetchedParams,
43
- };
44
- }
45
- return result;
46
- }
47
- get pending() {
48
- return this._pending$.getValue();
49
- }
50
- get pending$() {
51
- return this._pending$.asObservable();
52
- }
53
- ngOnDestroy() {
54
- this._destroy$.next(null);
55
- this._destroy$.complete();
56
- }
57
- setConfig(config) {
58
- this._config = config;
59
- this._initQueryParams();
60
- this._initSavedFilters();
61
- this.initItems();
62
- }
63
- setActiveSavedFilter(savedFilter) {
64
- this._savedFiltersController.setActiveFilter(savedFilter);
65
- if (savedFilter) {
66
- this.reloadFiltersWithValues(savedFilter.filters);
67
- }
68
- }
69
- reloadFiltersWithValues(params) {
70
- this._itemsStore.updateItemsWithValues(params);
71
- this._saveQueryParams();
72
- this._savePersistedParams();
73
- }
74
- initItems() {
75
- this._pending$.next(true);
76
- if (this._savedFiltersController.enabled) {
77
- this._savedFiltersController
78
- .load()
79
- .pipe(takeUntil(this._destroy$))
80
- .subscribe(() => {
81
- this._savedFiltersController.updateActiveFilter();
82
- this._initItemsValues();
83
- this._pending$.next(false);
84
- });
85
- }
86
- else {
87
- this._initItemsValues();
88
- this._pending$.next(false);
89
- }
90
- this._listenItemsChange();
91
- }
92
- _initItemsValues() {
93
- this._itemsStore.init(this.params);
94
- this._saveQueryParams();
95
- this._savePersistedParams();
96
- }
97
- fetchQueryParams() {
98
- this._initQueryParams();
99
- this._itemsStore.updateItemsWithValues(this.params);
100
- }
101
- _initQueryParams() {
102
- this._queryParams.init(this._config.queryParam);
103
- }
104
- _initSavedFilters() {
105
- this._savedFiltersController.init(this._config.savedFilters);
106
- }
107
- _listenItemsChange() {
108
- this._itemsStore.ready$
109
- .pipe(filter((v) => v), take(1), takeUntil(this._destroy$))
110
- .subscribe(() => {
111
- this._saveQueryParams();
112
- this._savePersistedParams();
113
- });
114
- this._itemsStore
115
- .itemsChange$
116
- .pipe(takeUntil(this._destroy$))
117
- .subscribe(() => {
118
- this._saveQueryParams();
119
- this._savePersistedParams();
120
- });
121
- }
122
- _saveQueryParams() {
123
- const params = buildQueryParams(this._itemsStore
124
- .valuesAsQuery({
125
- onlyPresented: false,
126
- items: this._itemsStore.items,
127
- persisted: true,
128
- }), this._itemsStore.items);
129
- this._itemsStore.items
130
- .filter((item) => item.queryParamsDisabled || !item.isQueryParamVisible)
131
- .forEach((item) => {
132
- params[item.name] = undefined;
133
- });
134
- this._queryParams.writeStateToQueryParams(params);
135
- }
136
- _savePersistedParams() {
137
- if (this._persistanceStore.queryEnabled) {
138
- const targetItems = this._itemsStore.items
139
- .filter((item) => !item.persistanceDisabled)
140
- .filter((item) => item.value !== undefined)
141
- .reduce((acc, item) => {
142
- acc[item.name] = item.model;
143
- return acc;
144
- }, {});
145
- this._persistanceStore.setQuery(targetItems);
146
- }
147
- }
148
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalParamsController, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
149
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalParamsController });
150
- }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalParamsController, decorators: [{
152
- type: Injectable
153
- }] });
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvc2VydmljZXMvZXh0ZXJuYWwtcGFyYW1zLWNvbnRyb2xsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlqRSxPQUFPLEVBQ0wscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEdBQzFFLE1BQU0sR0FBRyxDQUFDO0FBQ1gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBSTNELE1BQU0sT0FBTyx3QkFBd0I7SUFFekIsS0FBSyxDQUFDO0lBRVIsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sQ0FBaUI7SUFDeEIsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDaEMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3pDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3ZELFlBQVksR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM3Qyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUVqRSxJQUFXLE1BQU07UUFDZixJQUFJLE1BQU0sR0FBMEIsRUFBRSxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hDLE1BQU0sR0FBRztnQkFDUCxHQUFHLE1BQU07Z0JBQ1QsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO2FBQ3JDLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0RixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDOUIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDMUQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNuQixPQUFPO29CQUNMLEdBQUcsR0FBRztvQkFDTixDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7aUJBQ25CLENBQUM7WUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFVCxNQUFNLEdBQUc7Z0JBQ1AsR0FBRyxLQUFLO2dCQUNSLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQjthQUNqRCxDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEdBQUc7Z0JBQ1AsR0FBRyxNQUFNO2dCQUNULEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhO2FBQ25DLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQU07UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFdEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxXQUErQjtRQUN6RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLHVCQUF1QixDQUFDLE1BQTZCO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLFNBQVM7UUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsdUJBQXVCO2lCQUN6QixJQUFJLEVBQUU7aUJBQ04sSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2lCQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO2FBQ3BCLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsV0FBVzthQUNiLFlBQVk7YUFDWixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBRXRCLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUM3QixJQUFJLENBQUMsV0FBVzthQUNiLGFBQWEsQ0FBQztZQUNiLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDN0IsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxFQUNKLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUN2QixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO2FBQ25CLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2FBQ3ZFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSztpQkFDdkMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztpQkFDM0MsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQztpQkFDMUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBRTVCLE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQzt3R0FuTFUsd0JBQXdCOzRHQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBidWlsZFF1ZXJ5UGFyYW1zIH0gZnJvbSAnLi4vaGVscGVycy9idWlsZC1xdWVyeS1wYXJhbXMnO1xuaW1wb3J0IHsgSUZpbHRlckV4dGVybmFsUGFyYW1zLCBJRmlsdGVyU2F2ZWRGaWx0ZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEZzRmlsdGVyQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2ZpbHRlci1jb25maWcnO1xuXG5pbXBvcnQge1xuICBRdWVyeVBhcmFtc0NvbnRyb2xsZXIsIFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyLCBTYXZlZEZpbHRlcnNDb250cm9sbGVyLFxufSBmcm9tICcuJztcbmltcG9ydCB7IEZzRmlsdGVySXRlbXNTdG9yZSB9IGZyb20gJy4vaXRlbXMtc3RvcmUuc2VydmljZSc7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEV4dGVybmFsUGFyYW1zQ29udHJvbGxlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHJvdGVjdGVkIF9pbml0O1xuXG4gIHByaXZhdGUgX3BlbmRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHByaXZhdGUgX2NvbmZpZzogRnNGaWx0ZXJDb25maWc7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfaXRlbXNTdG9yZSA9IGluamVjdChGc0ZpbHRlckl0ZW1zU3RvcmUpO1xuICBwcml2YXRlIF9wZXJzaXN0YW5jZVN0b3JlID0gaW5qZWN0KFF1ZXJ5UGVyc2lzdGFuY2VDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfcXVlcnlQYXJhbXMgPSBpbmplY3QoUXVlcnlQYXJhbXNDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfc2F2ZWRGaWx0ZXJzQ29udHJvbGxlciA9IGluamVjdChTYXZlZEZpbHRlcnNDb250cm9sbGVyKTtcblxuICBwdWJsaWMgZ2V0IHBhcmFtcygpOiBJRmlsdGVyRXh0ZXJuYWxQYXJhbXMge1xuICAgIGxldCByZXN1bHQ6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcyA9IHt9O1xuXG4gICAgaWYgKHRoaXMuX3BlcnNpc3RhbmNlU3RvcmUucXVlcnlFbmFibGVkKSB7XG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIC4uLnJlc3VsdCwgXG4gICAgICAgIC4uLnRoaXMuX3BlcnNpc3RhbmNlU3RvcmUuZ2V0UXVlcnkoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NhdmVkRmlsdGVyc0NvbnRyb2xsZXIuZW5hYmxlZCAmJiB0aGlzLl9zYXZlZEZpbHRlcnNDb250cm9sbGVyLmFjdGl2ZUZpbHRlcikge1xuICAgICAgY29uc3QgcXVlcnkgPSBPYmplY3Qua2V5cyhyZXN1bHQpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4gIXRoaXMuX2l0ZW1zU3RvcmUuaXRlbU5hbWVzLmluY2x1ZGVzKGtleSkpXG4gICAgICAgIC5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgIFtrZXldOiByZXN1bHRba2V5XSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgLi4ucXVlcnksIFxuICAgICAgICAuLi50aGlzLl9zYXZlZEZpbHRlcnNDb250cm9sbGVyLmFjdGl2ZUZpbHRlckRhdGEsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcXVlcnlQYXJhbXMuZW5hYmxlZCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAuLi5yZXN1bHQsIFxuICAgICAgICAuLi50aGlzLl9xdWVyeVBhcmFtcy5mZXRjaGVkUGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldCBwZW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBwZW5kaW5nJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIHNldENvbmZpZyhjb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG5cbiAgICB0aGlzLl9pbml0UXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLl9pbml0U2F2ZWRGaWx0ZXJzKCk7XG4gICAgdGhpcy5pbml0SXRlbXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVTYXZlZEZpbHRlcihzYXZlZEZpbHRlcjogSUZpbHRlclNhdmVkRmlsdGVyKSB7XG4gICAgdGhpcy5fc2F2ZWRGaWx0ZXJzQ29udHJvbGxlci5zZXRBY3RpdmVGaWx0ZXIoc2F2ZWRGaWx0ZXIpO1xuXG4gICAgaWYgKHNhdmVkRmlsdGVyKSB7XG4gICAgICB0aGlzLnJlbG9hZEZpbHRlcnNXaXRoVmFsdWVzKHNhdmVkRmlsdGVyLmZpbHRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWxvYWRGaWx0ZXJzV2l0aFZhbHVlcyhwYXJhbXM6IElGaWx0ZXJFeHRlcm5hbFBhcmFtcykge1xuICAgIHRoaXMuX2l0ZW1zU3RvcmUudXBkYXRlSXRlbXNXaXRoVmFsdWVzKHBhcmFtcyk7XG5cbiAgICB0aGlzLl9zYXZlUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLl9zYXZlUGVyc2lzdGVkUGFyYW1zKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX3BlbmRpbmckLm5leHQodHJ1ZSk7XG4gICAgaWYgKHRoaXMuX3NhdmVkRmlsdGVyc0NvbnRyb2xsZXIuZW5hYmxlZCkge1xuICAgICAgdGhpcy5fc2F2ZWRGaWx0ZXJzQ29udHJvbGxlclxuICAgICAgICAubG9hZCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc2F2ZWRGaWx0ZXJzQ29udHJvbGxlci51cGRhdGVBY3RpdmVGaWx0ZXIoKTtcbiAgICAgICAgICB0aGlzLl9pbml0SXRlbXNWYWx1ZXMoKTtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2luaXRJdGVtc1ZhbHVlcygpO1xuICAgICAgdGhpcy5fcGVuZGluZyQubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuSXRlbXNDaGFuZ2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBfaW5pdEl0ZW1zVmFsdWVzKCkge1xuICAgIHRoaXMuX2l0ZW1zU3RvcmUuaW5pdCh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5fc2F2ZVF1ZXJ5UGFyYW1zKCk7XG4gICAgdGhpcy5fc2F2ZVBlcnNpc3RlZFBhcmFtcygpO1xuICB9XG5cbiAgcHVibGljIGZldGNoUXVlcnlQYXJhbXMoKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdFF1ZXJ5UGFyYW1zKCk7XG4gICAgdGhpcy5faXRlbXNTdG9yZS51cGRhdGVJdGVtc1dpdGhWYWx1ZXModGhpcy5wYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFF1ZXJ5UGFyYW1zKCkge1xuICAgIHRoaXMuX3F1ZXJ5UGFyYW1zLmluaXQodGhpcy5fY29uZmlnLnF1ZXJ5UGFyYW0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFNhdmVkRmlsdGVycygpIHtcbiAgICB0aGlzLl9zYXZlZEZpbHRlcnNDb250cm9sbGVyLmluaXQodGhpcy5fY29uZmlnLnNhdmVkRmlsdGVycyk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5JdGVtc0NoYW5nZSgpIHtcbiAgICB0aGlzLl9pdGVtc1N0b3JlLnJlYWR5JFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigodikgPT4gdiksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZVF1ZXJ5UGFyYW1zKCk7XG4gICAgICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5faXRlbXNTdG9yZVxuICAgICAgLml0ZW1zQ2hhbmdlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZVF1ZXJ5UGFyYW1zKCk7XG4gICAgICAgIHRoaXMuX3NhdmVQZXJzaXN0ZWRQYXJhbXMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2F2ZVF1ZXJ5UGFyYW1zKCkge1xuXG4gICAgY29uc3QgcGFyYW1zID0gYnVpbGRRdWVyeVBhcmFtcyhcbiAgICAgIHRoaXMuX2l0ZW1zU3RvcmVcbiAgICAgICAgLnZhbHVlc0FzUXVlcnkoe1xuICAgICAgICAgIG9ubHlQcmVzZW50ZWQ6IGZhbHNlLFxuICAgICAgICAgIGl0ZW1zOiB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zLFxuICAgICAgICAgIHBlcnNpc3RlZDogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zLFxuICAgICk7XG4gICBcbiAgICB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnF1ZXJ5UGFyYW1zRGlzYWJsZWQgfHwgIWl0ZW0uaXNRdWVyeVBhcmFtVmlzaWJsZSlcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIHBhcmFtc1tpdGVtLm5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9xdWVyeVBhcmFtcy53cml0ZVN0YXRlVG9RdWVyeVBhcmFtcyhwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2F2ZVBlcnNpc3RlZFBhcmFtcygpIHtcbiAgICBpZih0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLnF1ZXJ5RW5hYmxlZCkge1xuICAgICAgY29uc3QgdGFyZ2V0SXRlbXMgPSB0aGlzLl9pdGVtc1N0b3JlLml0ZW1zXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLnBlcnNpc3RhbmNlRGlzYWJsZWQpXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgICAgYWNjW2l0ZW0ubmFtZV0gPSBpdGVtLm1vZGVsO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuXG4gICAgICB0aGlzLl9wZXJzaXN0YW5jZVN0b3JlLnNldFF1ZXJ5KHRhcmdldEl0ZW1zKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==