@indice/ng-components 0.2.161 → 0.2.162

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 (39) hide show
  1. package/_styles.css +630 -3
  2. package/esm2020/lib/controls/advanced-search/advanced-search.component.mjs +112 -0
  3. package/esm2020/lib/controls/advanced-search/models.mjs +90 -0
  4. package/esm2020/lib/controls/combobox/combobox.component.mjs +4 -3
  5. package/esm2020/lib/controls/list-view/list-view.component.mjs +18 -4
  6. package/esm2020/lib/controls/nav-links-list/nav-links-list.component.mjs +7 -3
  7. package/esm2020/lib/controls/notifications-indicator/notifications-indicator.component.mjs +17 -13
  8. package/esm2020/lib/controls/stepper/lib-step.component.mjs +3 -3
  9. package/esm2020/lib/controls/stepper/lib-stepper.component.mjs +34 -11
  10. package/esm2020/lib/controls/tabs/lib-tab-group.component.mjs +3 -2
  11. package/esm2020/lib/controls/user-profile-menu/user-profile-menu.component.mjs +3 -3
  12. package/esm2020/lib/helpers/base-list.component.mjs +47 -3
  13. package/esm2020/lib/layouts/shell/shell-header/shell-header.component.mjs +6 -7
  14. package/esm2020/lib/layouts/shell/shell-layout/shell-layout.component.mjs +7 -9
  15. package/esm2020/lib/layouts/shell/shell-sidebar/shell-sidebar.component.mjs +7 -7
  16. package/esm2020/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.mjs +45 -0
  17. package/esm2020/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.mjs +25 -0
  18. package/esm2020/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.mjs +21 -0
  19. package/esm2020/lib/ng-components.module.mjs +22 -6
  20. package/esm2020/lib/pages/auth/auth-callback/auth-callback.component.mjs +1 -2
  21. package/esm2020/public-api.mjs +3 -1
  22. package/fesm2015/indice-ng-components.mjs +744 -379
  23. package/fesm2015/indice-ng-components.mjs.map +1 -1
  24. package/fesm2020/indice-ng-components.mjs +735 -378
  25. package/fesm2020/indice-ng-components.mjs.map +1 -1
  26. package/lib/controls/advanced-search/advanced-search.component.d.ts +26 -0
  27. package/lib/controls/advanced-search/models.d.ts +83 -0
  28. package/lib/controls/list-view/list-view.component.d.ts +6 -1
  29. package/lib/controls/nav-links-list/nav-links-list.component.d.ts +5 -2
  30. package/lib/controls/notifications-indicator/notifications-indicator.component.d.ts +3 -3
  31. package/lib/controls/stepper/lib-stepper.component.d.ts +15 -4
  32. package/lib/helpers/base-list.component.d.ts +11 -0
  33. package/lib/layouts/shell/shell-header/shell-header.component.d.ts +2 -3
  34. package/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.d.ts +14 -0
  35. package/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.d.ts +12 -0
  36. package/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.d.ts +10 -0
  37. package/lib/ng-components.module.d.ts +9 -4
  38. package/package.json +2 -2
  39. package/public-api.d.ts +2 -0
@@ -0,0 +1,112 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { FilterClause, QueryParameters, Operators } from './models';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "../drop-down-menu/drop-down-menu.component";
7
+ import * as i4 from "../date-picker/date-picker.component";
8
+ export class AdvancedSearchComponent {
9
+ constructor() {
10
+ this.advancedSearchChanged = new EventEmitter();
11
+ this.searchOptions = [];
12
+ this.filters = [];
13
+ this.menuOptions = [];
14
+ this.menuOptionsDictionary = {};
15
+ }
16
+ ngOnInit() {
17
+ this.searchOptions.forEach((searchOption) => {
18
+ this.menuOptions.push({
19
+ text: searchOption.name,
20
+ value: searchOption.field,
21
+ data: searchOption.dataType,
22
+ description: searchOption.placeholder,
23
+ icon: undefined
24
+ });
25
+ if (searchOption.dataType === 'array') {
26
+ let menuOpts = [];
27
+ searchOption.options?.forEach((selectInputOption) => {
28
+ menuOpts.push({
29
+ text: selectInputOption.label,
30
+ value: selectInputOption.value,
31
+ data: undefined,
32
+ description: selectInputOption.description,
33
+ icon: undefined
34
+ });
35
+ });
36
+ this.menuOptionsDictionary[searchOption.field] = menuOpts;
37
+ }
38
+ });
39
+ }
40
+ selectedFieldChanged(field) {
41
+ this.selectedField = this.searchOptions.find((searchOption) => searchOption.field === field);
42
+ this.fieldValue = undefined;
43
+ }
44
+ selectedFieldValueChanged(fieldValue) {
45
+ this.fieldValue = fieldValue;
46
+ }
47
+ search() {
48
+ if (!this.selectedField || !this.selectedField.dataType) {
49
+ return;
50
+ }
51
+ // the filter is of type 'daterange'
52
+ if (this.selectedField.dataType === 'daterange') {
53
+ if (!this.selectedField.multiTerm) {
54
+ this.filters = this.filters.filter((f) => {
55
+ return f.member !== QueryParameters.FILTER_FROM && f.member !== QueryParameters.FILTER_TO;
56
+ });
57
+ }
58
+ if (this.fieldValueDateFrom) {
59
+ const filterClauseFrom = new FilterClause(QueryParameters.FILTER_FROM, this.fieldValueDateFrom, Operators.GREATER_THAN_EQUAL.value, 'datetime', this.searchOptions);
60
+ this.filters.push(filterClauseFrom);
61
+ }
62
+ if (this.fieldValueDateTo) {
63
+ const filterClauseTo = new FilterClause(QueryParameters.FILTER_TO, this.fieldValueDateTo, Operators.LESS_THAN_EQUAL.value, 'datetime', this.searchOptions);
64
+ this.filters.push(filterClauseTo);
65
+ }
66
+ }
67
+ // the filter isn't of type 'daterange' (everything else)
68
+ else {
69
+ if (this.fieldValue === undefined) { // handle empty field value
70
+ return;
71
+ }
72
+ // create the filterClause
73
+ const filterClause = new FilterClause(this.selectedField.field, this.fieldValue, Operators.EQUALS.value, this.selectedField.dataType, this.searchOptions); // operator is always 'equals'...
74
+ if (!this.selectedField.multiTerm) { // multiTerm means that we can have multiple filter values of the SAME filter clause (eg "filter case types that are Phone OR Address")
75
+ this.filters = this.filters.filter((f) => {
76
+ return f.member !== this.selectedField.field;
77
+ });
78
+ }
79
+ this.filters.push(filterClause);
80
+ this.fieldValue = undefined;
81
+ }
82
+ this.advancedSearchChanged.emit(this.filters);
83
+ }
84
+ removeFilter(index) {
85
+ if (this.filters && this.filters.length >= index) {
86
+ this.filters.splice(index, 1);
87
+ this.advancedSearchChanged.emit(this.filters);
88
+ }
89
+ }
90
+ clear() {
91
+ this.fieldValueDateFrom = undefined;
92
+ this.fieldValueDateTo = undefined;
93
+ this.selectedField = undefined;
94
+ this.fieldValue = undefined;
95
+ this.filters = [];
96
+ this.advancedSearchChanged.emit(this.filters);
97
+ }
98
+ }
99
+ AdvancedSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
100
+ AdvancedSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: AdvancedSearchComponent, selector: "lib-advanced-search", inputs: { searchOptions: ["search-options", "searchOptions"], filters: "filters" }, outputs: { advancedSearchChanged: "advancedSearchChanged" }, ngImport: i0, template: "<div class=\"advanced-search-container\">\n <div class=\"advanced-search-filter\">\n <!--SEARCH FIELDS-->\n <div class=\"advanced-search-filter-field-container\">\n <label class=\"advanced-search-filter-field-label\"\n for=\"selectedField\">\n \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC:\n </label>\n <lib-drop-down-menu [options]=\"menuOptions\"\n (selectedChanged)=\"selectedFieldChanged($event)\"></lib-drop-down-menu>\n </div>\n <!--SEARCH FIELDS INPUT-->\n <div *ngIf=\"selectedField\"\n class=\"advanced-search-filter-value-container\">\n <div *ngIf=\"selectedField.dataType === 'array'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <lib-drop-down-menu [options]=\"menuOptionsDictionary[selectedField.field]\"\n [selected]=\"fieldValue\"\n (selectedChanged)=\"selectedFieldValueChanged($event)\"></lib-drop-down-menu>\n </div>\n <div *ngIf=\"selectedField.dataType === 'string'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <input (keyup.enter)=\"search()\"\n [(ngModel)]=\"fieldValue\"\n name=\"fieldValue\"\n type=\"text\"\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\"\n maxlength=\"300\"\n class=\"advanced-search-filter-value-input\">\n </div>\n <ng-container *ngIf=\"selectedField.dataType === 'daterange'\">\n <div>\n <span class=\"advanced-search-filter-value-input-daterange-from\">\n \u0391\u03C0\u03CC:\n </span>\n <lib-date-picker [maxDate]=\"fieldValueDateTo\"\n [(ngModel)]=\"fieldValueDateFrom\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n <div *ngIf=\"selectedField.dataType === 'daterange'\">\n <span class=\"advanced-search-filter-value-input-daterange-to\">\n \u0388\u03C9\u03C2:\n </span>\n <lib-date-picker [minDate]=\"fieldValueDateFrom\"\n [(ngModel)]=\"fieldValueDateTo\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"selectedField\">\n <!--DO SEARCH-->\n <button type=\"button\"\n [ngClass]=\"{'opacity-50 cursor-not-allowed': fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined}\"\n [disabled]=\"fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined\"\n (click)=\"search()\">\n <i [class]=\"'ms-Icon ms-Icon--Search'\"></i>\n </button>\n <!--CLEAR-->\n <button type=\"button\"\n (click)=\"clear()\">\n <i [class]=\"'ms-Icon ms-Icon--Cancel'\"></i>\n </button>\n </ng-container>\n </div>\n <!--FILTER CHIPS-->\n <!-- This example requires Tailwind CSS v2.0+ -->\n <ng-container *ngFor=\"let filter of filters; let i = index\">\n <span *ngIf=\"filter && filter.member\"\n class=\"advanced-search-chips\">\n {{ filter.uiName }} {{ filter.uiOperator }} '{{ filter.uiValue }}'\n <button (click)=\"removeFilter(i)\"\n type=\"button\"\n class=\"advanced-search-chips-remove-filter\">\n <span class=\"sr-only\">Remove large option</span>\n <svg class=\"h-2 w-2\"\n stroke=\"currentColor\"\n fill=\"none\"\n viewBox=\"0 0 8 8\">\n <path stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n d=\"M1 1l6 6m0-6L1 7\" />\n </svg>\n </button>\n </span>\n </ng-container>\n</div>", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.DropDownMenuComponent, selector: "lib-drop-down-menu", inputs: ["options", "selected", "multiple", "placeholder"], outputs: ["selectedChange", "selectedChanged"] }, { kind: "component", type: i4.DatepickerComponent, selector: "lib-date-picker", inputs: ["readonly", "disabled", "inline", "display-format", "placeholder", "value", "minDate", "maxDate"], outputs: ["valueChange"] }] });
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
102
+ type: Component,
103
+ args: [{ selector: 'lib-advanced-search', template: "<div class=\"advanced-search-container\">\n <div class=\"advanced-search-filter\">\n <!--SEARCH FIELDS-->\n <div class=\"advanced-search-filter-field-container\">\n <label class=\"advanced-search-filter-field-label\"\n for=\"selectedField\">\n \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC:\n </label>\n <lib-drop-down-menu [options]=\"menuOptions\"\n (selectedChanged)=\"selectedFieldChanged($event)\"></lib-drop-down-menu>\n </div>\n <!--SEARCH FIELDS INPUT-->\n <div *ngIf=\"selectedField\"\n class=\"advanced-search-filter-value-container\">\n <div *ngIf=\"selectedField.dataType === 'array'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <lib-drop-down-menu [options]=\"menuOptionsDictionary[selectedField.field]\"\n [selected]=\"fieldValue\"\n (selectedChanged)=\"selectedFieldValueChanged($event)\"></lib-drop-down-menu>\n </div>\n <div *ngIf=\"selectedField.dataType === 'string'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <input (keyup.enter)=\"search()\"\n [(ngModel)]=\"fieldValue\"\n name=\"fieldValue\"\n type=\"text\"\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\"\n maxlength=\"300\"\n class=\"advanced-search-filter-value-input\">\n </div>\n <ng-container *ngIf=\"selectedField.dataType === 'daterange'\">\n <div>\n <span class=\"advanced-search-filter-value-input-daterange-from\">\n \u0391\u03C0\u03CC:\n </span>\n <lib-date-picker [maxDate]=\"fieldValueDateTo\"\n [(ngModel)]=\"fieldValueDateFrom\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n <div *ngIf=\"selectedField.dataType === 'daterange'\">\n <span class=\"advanced-search-filter-value-input-daterange-to\">\n \u0388\u03C9\u03C2:\n </span>\n <lib-date-picker [minDate]=\"fieldValueDateFrom\"\n [(ngModel)]=\"fieldValueDateTo\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"selectedField\">\n <!--DO SEARCH-->\n <button type=\"button\"\n [ngClass]=\"{'opacity-50 cursor-not-allowed': fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined}\"\n [disabled]=\"fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined\"\n (click)=\"search()\">\n <i [class]=\"'ms-Icon ms-Icon--Search'\"></i>\n </button>\n <!--CLEAR-->\n <button type=\"button\"\n (click)=\"clear()\">\n <i [class]=\"'ms-Icon ms-Icon--Cancel'\"></i>\n </button>\n </ng-container>\n </div>\n <!--FILTER CHIPS-->\n <!-- This example requires Tailwind CSS v2.0+ -->\n <ng-container *ngFor=\"let filter of filters; let i = index\">\n <span *ngIf=\"filter && filter.member\"\n class=\"advanced-search-chips\">\n {{ filter.uiName }} {{ filter.uiOperator }} '{{ filter.uiValue }}'\n <button (click)=\"removeFilter(i)\"\n type=\"button\"\n class=\"advanced-search-chips-remove-filter\">\n <span class=\"sr-only\">Remove large option</span>\n <svg class=\"h-2 w-2\"\n stroke=\"currentColor\"\n fill=\"none\"\n viewBox=\"0 0 8 8\">\n <path stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n d=\"M1 1l6 6m0-6L1 7\" />\n </svg>\n </button>\n </span>\n </ng-container>\n</div>" }]
104
+ }], ctorParameters: function () { return []; }, propDecorators: { advancedSearchChanged: [{
105
+ type: Output
106
+ }], searchOptions: [{
107
+ type: Input,
108
+ args: ['search-options']
109
+ }], filters: [{
110
+ type: Input
111
+ }] } });
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hZHZhbmNlZC1zZWFyY2gvYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hZHZhbmNlZC1zZWFyY2gvYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFnQixZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBTWxGLE1BQU0sT0FBTyx1QkFBdUI7SUFXbEM7UUFWVSwwQkFBcUIsR0FBaUMsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDMUUsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25ELFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUsvQiwwQkFBcUIsR0FBb0MsRUFBRSxDQUFDO0lBRW5ELENBQUM7SUFFVixRQUFRO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDcEIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7Z0JBQ3pCLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUTtnQkFDM0IsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxJQUFJLEVBQUUsU0FBUzthQUNoQixD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QUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7b0hBdEdVLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLDRNQ1JwQyxxakpBMkZNOzJGRG5GTyx1QkFBdUI7a0JBSm5DLFNBQVM7K0JBQ0UscUJBQXFCOzBFQUlyQixxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ2tCLGFBQWE7c0JBQXJDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lbnVPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBTZWFyY2hPcHRpb24sIEZpbHRlckNsYXVzZSwgUXVlcnlQYXJhbWV0ZXJzLCBPcGVyYXRvcnMgfSBmcm9tICcuL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1hZHZhbmNlZC1zZWFyY2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBhZHZhbmNlZFNlYXJjaENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxGaWx0ZXJDbGF1c2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckNsYXVzZVtdPigpO1xuICBASW5wdXQoJ3NlYXJjaC1vcHRpb25zJykgc2VhcmNoT3B0aW9uczogU2VhcmNoT3B0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgZmlsdGVyczogRmlsdGVyQ2xhdXNlW10gPSBbXTtcbiAgcHVibGljIG1lbnVPcHRpb25zOiBNZW51T3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkRmllbGQ/OiBTZWFyY2hPcHRpb247XG4gIHB1YmxpYyBmaWVsZFZhbHVlPzogc3RyaW5nO1xuICBwdWJsaWMgZmllbGRWYWx1ZURhdGVGcm9tOiBhbnk7XG4gIHB1YmxpYyBmaWVsZFZhbHVlRGF0ZVRvOiBhbnk7XG4gIHB1YmxpYyBtZW51T3B0aW9uc0RpY3Rpb25hcnk6IHsgW2tleTogc3RyaW5nXTogTWVudU9wdGlvbltdIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaE9wdGlvbnMuZm9yRWFjaCgoc2VhcmNoT3B0aW9uKSA9PiB7XG4gICAgICB0aGlzLm1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICB0ZXh0OiBzZWFyY2hPcHRpb24ubmFtZSxcbiAgICAgICAgdmFsdWU6IHNlYXJjaE9wdGlvbi5maWVsZCxcbiAgICAgICAgZGF0YTogc2VhcmNoT3B0aW9uLmRhdGFUeXBlLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2VhcmNoT3B0aW9uLnBsYWNlaG9sZGVyLFxuICAgICAgICBpY29uOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKHNlYXJjaE9wdGlvbi5kYXRhVHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBsZXQgbWVudU9wdHM6IE1lbnVPcHRpb25bXSA9IFtdO1xuICAgICAgICBzZWFyY2hPcHRpb24ub3B0aW9ucz8uZm9yRWFjaCgoc2VsZWN0SW5wdXRPcHRpb24pID0+IHtcbiAgICAgICAgICBtZW51T3B0cy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IHNlbGVjdElucHV0T3B0aW9uLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdElucHV0T3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNlbGVjdElucHV0T3B0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgaWNvbjogdW5kZWZpbmVkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMubWVudU9wdGlvbnNEaWN0aW9uYXJ5W3NlYXJjaE9wdGlvbi5maWVsZF0gPSBtZW51T3B0cztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZEZpZWxkQ2hhbmdlZChmaWVsZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpZWxkID0gdGhpcy5zZWFyY2hPcHRpb25zLmZpbmQoKHNlYXJjaE9wdGlvbikgPT4gc2VhcmNoT3B0aW9uLmZpZWxkID09PSBmaWVsZCk7XG4gICAgdGhpcy5maWVsZFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGVkRmllbGRWYWx1ZUNoYW5nZWQoZmllbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWVsZFZhbHVlID0gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2goKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRmllbGQgfHwgIXRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB0aGUgZmlsdGVyIGlzIG9mIHR5cGUgJ2RhdGVyYW5nZSdcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZXJhbmdlJykge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmllbGQubXVsdGlUZXJtKSB7XG4gICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZmlsdGVycy5maWx0ZXIoKGYpID0+IHtcbiAgICAgICAgICByZXR1cm4gZi5tZW1iZXIgIT09IFF1ZXJ5UGFyYW1ldGVycy5GSUxURVJfRlJPTSAmJiBmLm1lbWJlciAhPT0gUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9UTztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWVsZFZhbHVlRGF0ZUZyb20pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2xhdXNlRnJvbSA9IG5ldyBGaWx0ZXJDbGF1c2UoUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9GUk9NLCB0aGlzLmZpZWxkVmFsdWVEYXRlRnJvbSwgT3BlcmF0b3JzLkdSRUFURVJfVEhBTl9FUVVBTC52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3AsICdkYXRldGltZScsIHRoaXMuc2VhcmNoT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5wdXNoKGZpbHRlckNsYXVzZUZyb20pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5maWVsZFZhbHVlRGF0ZVRvKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlckNsYXVzZVRvID0gbmV3IEZpbHRlckNsYXVzZShRdWVyeVBhcmFtZXRlcnMuRklMVEVSX1RPLCB0aGlzLmZpZWxkVmFsdWVEYXRlVG8sIE9wZXJhdG9ycy5MRVNTX1RIQU5fRVFVQUwudmFsdWUgYXMgRmlsdGVyQ2xhdXNlLk9wLCAnZGF0ZXRpbWUnLCB0aGlzLnNlYXJjaE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChmaWx0ZXJDbGF1c2VUbyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBmaWx0ZXIgaXNuJ3Qgb2YgdHlwZSAnZGF0ZXJhbmdlJyAoZXZlcnl0aGluZyBlbHNlKVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7IC8vIGhhbmRsZSBlbXB0eSBmaWVsZCB2YWx1ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgdGhlIGZpbHRlckNsYXVzZVxuICAgICAgY29uc3QgZmlsdGVyQ2xhdXNlID0gbmV3IEZpbHRlckNsYXVzZSh0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQsIHRoaXMuZmllbGRWYWx1ZSwgT3BlcmF0b3JzLkVRVUFMUy52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3AsIHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSwgdGhpcy5zZWFyY2hPcHRpb25zKTsgLy8gb3BlcmF0b3IgaXMgYWx3YXlzICdlcXVhbHMnLi4uXG5cbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkLm11bHRpVGVybSkgeyAvLyBtdWx0aVRlcm0gbWVhbnMgdGhhdCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBmaWx0ZXIgdmFsdWVzIG9mIHRoZSBTQU1FIGZpbHRlciBjbGF1c2UgKGVnIFwiZmlsdGVyIGNhc2UgdHlwZXMgdGhhdCBhcmUgUGhvbmUgT1IgQWRkcmVzc1wiKVxuICAgICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmZpbHRlcnMuZmlsdGVyKChmKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGYubWVtYmVyICE9PSB0aGlzLnNlbGVjdGVkRmllbGQhLmZpZWxkO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWx0ZXJzLnB1c2goZmlsdGVyQ2xhdXNlKTtcbiAgICAgIHRoaXMuZmllbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5hZHZhbmNlZFNlYXJjaENoYW5nZWQuZW1pdCh0aGlzLmZpbHRlcnMpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbHRlcihpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMubGVuZ3RoID49IGluZGV4KSB7XG4gICAgICB0aGlzLmZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hDaGFuZ2VkLmVtaXQodGhpcy5maWx0ZXJzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5maWVsZFZhbHVlRGF0ZUZyb20gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5maWVsZFZhbHVlRGF0ZVRvID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZpZWxkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNlYXJjaENoYW5nZWQuZW1pdCh0aGlzLmZpbHRlcnMpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXJcIj5cbiAgICAgICAgPCEtLVNFQVJDSCBGSUVMRFMtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXItZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLWZpZWxkLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICBmb3I9XCJzZWxlY3RlZEZpZWxkXCI+XG4gICAgICAgICAgICAgICAgzpHOvc6xzrbOrs+EzrfPg863IM6xzr3OrDpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGliLWRyb3AtZG93bi1tZW51IFtvcHRpb25zXT1cIm1lbnVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJzZWxlY3RlZEZpZWxkQ2hhbmdlZCgkZXZlbnQpXCI+PC9saWItZHJvcC1kb3duLW1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tU0VBUkNIIEZJRUxEUyBJTlBVVC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICAgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLXZhbHVlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdhcnJheSdcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLXZhbHVlLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiZmllbGRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsaWItZHJvcC1kb3duLW1lbnUgW29wdGlvbnNdPVwibWVudU9wdGlvbnNEaWN0aW9uYXJ5W3NlbGVjdGVkRmllbGQuZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJmaWVsZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwic2VsZWN0ZWRGaWVsZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCI+PC9saWItZHJvcC1kb3duLW1lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnc3RyaW5nJ1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXItdmFsdWUtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJmaWVsZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmllbGRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmaWVsZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIs6Rzr3Osc62zq7PhM63z4POt1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGVyYW5nZSdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXItdmFsdWUtaW5wdXQtZGF0ZXJhbmdlLWZyb21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIM6Rz4DPjDpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWRhdGUtcGlja2VyIFttYXhEYXRlXT1cImZpZWxkVmFsdWVEYXRlVG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmllbGRWYWx1ZURhdGVGcm9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJzAxLzAxLzIwMjInXCI+PC9saWItZGF0ZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlcmFuZ2UnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dC1kYXRlcmFuZ2UtdG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIM6Iz4nPgjpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWRhdGUtcGlja2VyIFttaW5EYXRlXT1cImZpZWxkVmFsdWVEYXRlRnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWVsZFZhbHVlRGF0ZVRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJzAxLzAxLzIwMjInXCI+PC9saWItZGF0ZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZpZWxkXCI+XG4gICAgICAgICAgICA8IS0tRE8gU0VBUkNILS0+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J29wYWNpdHktNTAgY3Vyc29yLW5vdC1hbGxvd2VkJzogZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlRnJvbSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlVG8gPT09IHVuZGVmaW5lZH1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlRnJvbSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlVG8gPT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCInbXMtSWNvbiBtcy1JY29uLS1TZWFyY2gnXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8IS0tQ0xFQVItLT5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpXCI+XG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidtcy1JY29uIG1zLUljb24tLUNhbmNlbCdcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPCEtLUZJTFRFUiBDSElQUy0tPlxuICAgIDwhLS0gVGhpcyBleGFtcGxlIHJlcXVpcmVzIFRhaWx3aW5kIENTUyB2Mi4wKyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlciAmJiBmaWx0ZXIubWVtYmVyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtY2hpcHNcIj5cbiAgICAgICAgICAgIHt7IGZpbHRlci51aU5hbWUgfX0ge3sgZmlsdGVyLnVpT3BlcmF0b3IgfX0gJ3t7IGZpbHRlci51aVZhbHVlIH19J1xuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWNoaXBzLXJlbW92ZS1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5SZW1vdmUgbGFyZ2Ugb3B0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTIgdy0yXCJcbiAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDggOFwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xIDFsNiA2bTAtNkwxIDdcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
@@ -0,0 +1,90 @@
1
+ import { formatDate } from "@angular/common";
2
+ export var Operators;
3
+ (function (Operators) {
4
+ Operators.EQUALS = { label: '=', value: 'eq', description: 'Ίσο με' };
5
+ Operators.NOT_EQUALS = { label: '≠', value: 'neq', description: 'Διάφορο του' };
6
+ Operators.GREATER_THAN = { label: '>', value: 'gt', description: 'Μεγαλύτερο από' };
7
+ Operators.LESS_THAN = { label: '<', value: 'lt', description: 'Μικρότερο από' };
8
+ Operators.GREATER_THAN_EQUAL = { label: '≥', value: 'gte', description: 'Μεγαλύτερο ή ίσο με' };
9
+ Operators.LESS_THAN_EQUAL = { label: '≤', value: 'lte', description: 'Μικρότερο ή ίσο με' };
10
+ Operators.CONTAINS = { label: '∋', value: 'contains', description: 'Περιέχει' };
11
+ Operators.IN = { label: '1..n', value: 'in', description: 'Μέσα σε' };
12
+ })(Operators || (Operators = {}));
13
+ export var QueryParameters;
14
+ (function (QueryParameters) {
15
+ QueryParameters["VIEW"] = "view";
16
+ QueryParameters["PAGE_SIZE"] = "pagesize";
17
+ QueryParameters["PAGE"] = "page";
18
+ QueryParameters["SEARCH"] = "search";
19
+ QueryParameters["SORT_FIELD"] = "sort";
20
+ QueryParameters["SORT_DIRECTION"] = "dir";
21
+ QueryParameters["FILTER"] = "filter";
22
+ QueryParameters["FILTER_FROM"] = "from";
23
+ QueryParameters["FILTER_TO"] = "to";
24
+ })(QueryParameters || (QueryParameters = {}));
25
+ export class FilterClause {
26
+ constructor(member, value, operator, dataType, searchOptions) {
27
+ this.member = member;
28
+ this.value = value;
29
+ this.operator = operator || Operators.EQUALS.value;
30
+ this.dataType = dataType === undefined ? 'string' : dataType;
31
+ // uiName
32
+ if (this.dataType === 'datetime') { // special treatment for dates
33
+ this.uiName = this.member === QueryParameters.FILTER_FROM ? 'Από' : 'Έως';
34
+ }
35
+ else {
36
+ this.uiName = this.member;
37
+ let fo = {};
38
+ if (searchOptions && searchOptions.length > 0) {
39
+ fo = searchOptions.find((f) => {
40
+ return f.field === this.member;
41
+ });
42
+ }
43
+ if (fo) {
44
+ this.uiName = fo.name;
45
+ }
46
+ }
47
+ // uiOperator
48
+ this.uiOperator = this.dataType === 'datetime' ? '' : Operators.EQUALS.label; // that's fine (for now)...
49
+ // uiValue
50
+ this.uiValue = this.value;
51
+ if ((this.dataType === 'datetime')) {
52
+ this.uiValue = formatDate(new Date(this.value), 'dd/MM/yyyy', 'en-US');
53
+ }
54
+ let fo;
55
+ if (searchOptions && searchOptions.length > 0) {
56
+ fo = searchOptions.find((f) => {
57
+ return f.field === this.member;
58
+ });
59
+ }
60
+ if (fo && fo.options) { // special treatment for arrays, if there is an options property then it is an array
61
+ this.dataType = 'array';
62
+ this.uiValue = fo.options.find((option) => {
63
+ return option.value === this.value;
64
+ })?.label;
65
+ }
66
+ }
67
+ static parse(text) {
68
+ const pattern = /^\s*([A-Za-z_][A-Za-z0-9_\.]+)::(eq|neq|gt|lt|gte|lte|contains|in)::(\((string|integer|number|boolean|datetime)\))?(.+)\s*$/gi;
69
+ if (text != null) {
70
+ const matches = pattern.exec(text);
71
+ if (matches != null) {
72
+ const path = matches[1];
73
+ const op = matches[2];
74
+ const dt = matches[4];
75
+ const v = matches[5];
76
+ return new FilterClause(path, v, op, dt);
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ toString() {
82
+ if (this.dataType !== 'string' && this.dataType !== 'array') {
83
+ return `${this.member}::${this.operator}::(${this.dataType})${this.value}`;
84
+ }
85
+ else {
86
+ return `${this.member}::${this.operator}::${this.value}`;
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2FkdmFuY2VkLXNlYXJjaC9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sS0FBVyxTQUFTLENBU3pCO0FBVEQsV0FBaUIsU0FBUztJQUNYLGdCQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzVELG9CQUFVLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3RFLHNCQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDMUUsbUJBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDdEUsNEJBQWtCLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDdEYseUJBQWUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRixrQkFBUSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUN0RSxZQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUs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S0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIE9wZXJhdG9ycyB7XG4gIGV4cG9ydCBjb25zdCBFUVVBTFMgPSB7IGxhYmVsOiAnPScsIHZhbHVlOiAnZXEnLCBkZXNjcmlwdGlvbjogJ86Kz4POvyDOvM61JyB9O1xuICBleHBvcnQgY29uc3QgTk9UX0VRVUFMUyA9IHsgbGFiZWw6ICfiiaAnLCB2YWx1ZTogJ25lcScsIGRlc2NyaXB0aW9uOiAnzpTOuc6sz4bOv8+Bzr8gz4TOv8+FJyB9O1xuICBleHBvcnQgY29uc3QgR1JFQVRFUl9USEFOID0geyBsYWJlbDogJz4nLCB2YWx1ZTogJ2d0JywgZGVzY3JpcHRpb246ICfOnM61zrPOsc67z43PhM61z4HOvyDOsc+Az4wnIH07XG4gIGV4cG9ydCBjb25zdCBMRVNTX1RIQU4gPSB7IGxhYmVsOiAnPCcsIHZhbHVlOiAnbHQnLCBkZXNjcmlwdGlvbjogJ86czrnOus+Bz4zPhM61z4HOvyDOsc+Az4wnIH07XG4gIGV4cG9ydCBjb25zdCBHUkVBVEVSX1RIQU5fRVFVQUwgPSB7IGxhYmVsOiAn4omlJywgdmFsdWU6ICdndGUnLCBkZXNjcmlwdGlvbjogJ86czrXOs86xzrvPjc+EzrXPgc6/IM6uIM6vz4POvyDOvM61JyB9O1xuICBleHBvcnQgY29uc3QgTEVTU19USEFOX0VRVUFMID0geyBsYWJlbDogJ+KJpCcsIHZhbHVlOiAnbHRlJywgZGVzY3JpcHRpb246ICfOnM65zrrPgc+Mz4TOtc+Bzr8gzq4gzq/Pg86/IM68zrUnIH07XG4gIGV4cG9ydCBjb25zdCBDT05UQUlOUyA9IHsgbGFiZWw6ICfiiIsnLCB2YWx1ZTogJ2NvbnRhaW5zJywgZGVzY3JpcHRpb246ICfOoM61z4HOuc6tz4fOtc65JyB9O1xuICBleHBvcnQgY29uc3QgSU4gPSB7IGxhYmVsOiAnMS4ubicsIHZhbHVlOiAnaW4nLCBkZXNjcmlwdGlvbjogJ86czq3Pg86xIM+DzrUnIH07XG59XG5cbmV4cG9ydCBlbnVtIFF1ZXJ5UGFyYW1ldGVycyB7XG4gIFZJRVcgPSAndmlldycsXG4gIFBBR0VfU0laRSA9ICdwYWdlc2l6ZScsXG4gIFBBR0UgPSAncGFnZScsXG4gIFNFQVJDSCA9ICdzZWFyY2gnLFxuICBTT1JUX0ZJRUxEID0gJ3NvcnQnLFxuICBTT1JUX0RJUkVDVElPTiA9ICdkaXInLFxuICBGSUxURVIgPSAnZmlsdGVyJyxcbiAgRklMVEVSX0ZST00gPSAnZnJvbScsXG4gIEZJTFRFUl9UTyA9ICd0bydcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIGRhdGFUeXBlOiBGaWx0ZXJDbGF1c2UuRHQ7XG4gIGFycmF5PzogYm9vbGVhbjtcbiAgbXVsdGlUZXJtPzogYm9vbGVhbjtcbiAgb3B0aW9ucz86IFNlbGVjdElucHV0T3B0aW9uW107XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdElucHV0T3B0aW9uIHtcbiAgdmFsdWU6IGFueTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsdGVyQ2xhdXNlIHtcbiAgZXhwb3J0IHR5cGUgT3AgPSAnZXEnIHwgJ25lcScgfCAnZ3QnIHwgJ2x0JyB8ICdndGUnIHwgJ2x0ZScgfCAnY29udGFpbnMnIHwgJ2luJztcbiAgZXhwb3J0IHR5cGUgRHQgPSAnc3RyaW5nJyB8ICdpbnRlZ2VyJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ2RhdGV0aW1lJyB8ICdhcnJheScgfCAnZGF0ZXJhbmdlJyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIEZpbHRlckNsYXVzZSB7XG4gIC8vIE1lbWJlciBwYXRoIHRvIGNvbXBhcmVcbiAgcHVibGljIG1lbWJlcjogc3RyaW5nO1xuICAvLyBWYWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgcHVibGljIHZhbHVlOiBhbnk7XG4gIC8vIFRoZSBvcGVyYXRvciB0byBhcHBseSBiZXR3ZWVuIHRoZSBJbmRpY2UuVHlwZXMuRmlsdGVyQ2xhdXNlLk1lbWJlciBhbmQgSW5kaWNlLlR5cGVzLkZpbHRlckNsYXVzZS5WYWx1ZVxuICBwdWJsaWMgb3BlcmF0b3I6IEZpbHRlckNsYXVzZS5PcDtcbiAgLy8gVGhlIEluZGljZS5UeXBlcy5Kc29uRGF0YVR5cGUgb2YgdGhlIGRhdGEgSW5kaWNlLlR5cGVzLkZpbHRlckNsYXVzZS5NZW1iZXJcbiAgcHVibGljIGRhdGFUeXBlOiBGaWx0ZXJDbGF1c2UuRHQ7XG5cbiAgcHVibGljIHVpTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdWlPcGVyYXRvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdWlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZW1iZXI6IHN0cmluZywgdmFsdWU6IGFueSwgb3BlcmF0b3I/OiBGaWx0ZXJDbGF1c2UuT3AsIGRhdGFUeXBlPzogRmlsdGVyQ2xhdXNlLkR0LCBzZWFyY2hPcHRpb25zPzogU2VhcmNoT3B0aW9uW10pIHsgLy8geWVhcCwgd2UgZG8gbmVlZCBzZWFyY2hPcHRpb25zIGZvciB0aGUgdWkgdmlldyBtb2RlbFxuICAgIHRoaXMubWVtYmVyID0gbWVtYmVyO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3IgfHwgT3BlcmF0b3JzLkVRVUFMUy52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3A7XG4gICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlID09PSB1bmRlZmluZWQgPyAnc3RyaW5nJyA6IGRhdGFUeXBlO1xuICAgIC8vIHVpTmFtZVxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7IC8vIHNwZWNpYWwgdHJlYXRtZW50IGZvciBkYXRlc1xuICAgICAgdGhpcy51aU5hbWUgPSB0aGlzLm1lbWJlciA9PT0gUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9GUk9NID8gJ86Rz4DPjCcgOiAnzojPic+CJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51aU5hbWUgPSB0aGlzLm1lbWJlcjtcbiAgICAgIGxldCBmbyA9IDxhbnk+e307XG4gICAgICBpZiAoc2VhcmNoT3B0aW9ucyAmJiBzZWFyY2hPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm8gPSBzZWFyY2hPcHRpb25zLmZpbmQoKGYpID0+IHtcbiAgICAgICAgICByZXR1cm4gZi5maWVsZCA9PT0gdGhpcy5tZW1iZXI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm8pIHtcbiAgICAgICAgdGhpcy51aU5hbWUgPSBmby5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1aU9wZXJhdG9yXG4gICAgdGhpcy51aU9wZXJhdG9yID0gdGhpcy5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyA/ICcnIDogT3BlcmF0b3JzLkVRVUFMUy5sYWJlbDsgLy8gdGhhdCdzIGZpbmUgKGZvciBub3cpLi4uXG4gICAgLy8gdWlWYWx1ZVxuICAgIHRoaXMudWlWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCh0aGlzLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSkge1xuICAgICAgdGhpcy51aVZhbHVlID0gZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnZhbHVlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKTtcbiAgICB9XG4gICAgbGV0IGZvOiBTZWFyY2hPcHRpb24gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlYXJjaE9wdGlvbnMgJiYgc2VhcmNoT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmbyA9IHNlYXJjaE9wdGlvbnMuZmluZCgoZikgPT4ge1xuICAgICAgICByZXR1cm4gZi5maWVsZCA9PT0gdGhpcy5tZW1iZXI7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZvICYmIGZvLm9wdGlvbnMpIHsgLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGFycmF5cywgaWYgdGhlcmUgaXMgYW4gb3B0aW9ucyBwcm9wZXJ0eSB0aGVuIGl0IGlzIGFuIGFycmF5XG4gICAgICB0aGlzLmRhdGFUeXBlID0gJ2FycmF5JztcbiAgICAgIHRoaXMudWlWYWx1ZSA9IGZvIS5vcHRpb25zIS5maW5kKChvcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgIH0pPy5sYWJlbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHBhcnNlKHRleHQ6IHN0cmluZyk6IEZpbHRlckNsYXVzZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IC9eXFxzKihbQS1aYS16X11bQS1aYS16MC05X1xcLl0rKTo6KGVxfG5lcXxndHxsdHxndGV8bHRlfGNvbnRhaW5zfGluKTo6KFxcKChzdHJpbmd8aW50ZWdlcnxudW1iZXJ8Ym9vbGVhbnxkYXRldGltZSlcXCkpPyguKylcXHMqJC9naTtcbiAgICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gcGF0dGVybi5leGVjKHRleHQpO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXRoID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgY29uc3Qgb3AgPSA8RmlsdGVyQ2xhdXNlLk9wPm1hdGNoZXNbMl07XG4gICAgICAgIGNvbnN0IGR0ID0gPEZpbHRlckNsYXVzZS5EdD5tYXRjaGVzWzRdO1xuICAgICAgICBjb25zdCB2ID0gbWF0Y2hlc1s1XTtcblxuICAgICAgICByZXR1cm4gbmV3IEZpbHRlckNsYXVzZShwYXRoLCB2LCBvcCwgZHQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgIT09ICdzdHJpbmcnICYmIHRoaXMuZGF0YVR5cGUgIT09ICdhcnJheScpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm1lbWJlcn06OiR7dGhpcy5vcGVyYXRvcn06Oigke3RoaXMuZGF0YVR5cGV9KSR7dGhpcy52YWx1ZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5tZW1iZXJ9Ojoke3RoaXMub3BlcmF0b3J9Ojoke3RoaXMudmFsdWV9YDtcbiAgICB9XG4gIH1cblxufVxuIl19
@@ -3,7 +3,8 @@ import { Subject } from 'rxjs';
3
3
  import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/common";
6
- import * as i2 from "../../directives/click-outside.directive";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "../../directives/click-outside.directive";
7
8
  export class ComboboxComponent {
8
9
  constructor() {
9
10
  this._debouncer = new Subject();
@@ -69,7 +70,7 @@ export class ComboboxComponent {
69
70
  }
70
71
  }
71
72
  ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: ComboboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
- ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: ComboboxComponent, selector: "lib-combobox", inputs: { id: "id", items: "items", itemTemplate: "itemTemplate", selectedItemsFilter: "selectedItemsFilter", selectedItemTemplate: "selectedItemTemplate", busy: "busy", debounceMs: "debounceMs" }, outputs: { onSearch: "onSearch", onItemSelected: "onItemSelected" }, ngImport: i0, template: "<div class=\"relative mt-1\">\n <form autocomplete=\"off\" [id]=\"id + '-form'\">\n <input [id]=\"id + '-input'\" type=\"text\" (click)=\"onInputClick()\" (clickOutside)=\"onInputClickOutside()\" (keyup)=\"onInputKeyUp($event)\"\n class=\"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-12 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\" role=\"combobox\" aria-controls=\"options\"\n aria-expanded=\"false\" autocomplete=\"off\" list=\"autocomplete\">\n </form>\n <div class=\"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\">\n <svg *ngIf=\"!busy\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-6 w-6 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <svg *ngIf=\"busy\" class=\"animate-spin h-6 w-6 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n <ul [id]=\"id + '-options'\" *ngIf=\"showOptions\" class=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\" role=\"listbox\">\n <li *ngFor=\"let item of items; let i = index;\" [id]=\"'option-'+ i\" (click)=\"onListItemSelected(item)\" role=\"option\" tabindex=\"-1\">\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n </ul>\n</div>\n<ul *ngIf=\"selectedItems.length > 0\" role=\"list\" class=\"grid grid-cols-1\">\n <li *ngFor=\"let item of selectedItems; let i = index;\" class=\"mt-3\">\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n</ul>\n<ng-template #defaultItemTemplate let-item>\n <span class=\"hover:bg-gray-100 relative cursor-pointer select-none py-2 pl-3 pr-3 block truncate\">{{ item }}</span>\n</ng-template>\n<ng-template #defaultSelectedItemTemplate let-item>\n <div class=\"grid grid-cols-1\">\n <div class=\"relative rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm flex items-center space-x-3 hover:border-gray-400\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"focus:outline-none\">\n <span class=\"absolute\" aria-hidden=\"true\"></span>\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\n </div>\n </div>\n <div class=\"ml-4 flex-shrink-0 flex\">\n <button type=\"button\" (click)=\"removeSelectedItem(item)\" class=\"cursor-pointer bg-white rounded-md inline-flex text-gray-400 hover:text-gray-500\">\n <span class=\"sr-only\">Close</span>\n <svg class=\"h-5 w-5\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</ng-template>", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }] });
73
+ ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: ComboboxComponent, selector: "lib-combobox", inputs: { id: "id", items: "items", itemTemplate: "itemTemplate", selectedItemsFilter: "selectedItemsFilter", selectedItemTemplate: "selectedItemTemplate", busy: "busy", debounceMs: "debounceMs" }, outputs: { onSearch: "onSearch", onItemSelected: "onItemSelected" }, ngImport: i0, template: "<div class=\"relative mt-1\">\n <form autocomplete=\"off\" [id]=\"id + '-form'\">\n <input [id]=\"id + '-input'\" type=\"text\" (click)=\"onInputClick()\" (clickOutside)=\"onInputClickOutside()\" (keyup)=\"onInputKeyUp($event)\"\n class=\"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-12 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\" role=\"combobox\" aria-controls=\"options\"\n aria-expanded=\"false\" autocomplete=\"off\" list=\"autocomplete\">\n </form>\n <div class=\"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\">\n <svg *ngIf=\"!busy\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-6 w-6 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <svg *ngIf=\"busy\" class=\"animate-spin h-6 w-6 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n <ul [id]=\"id + '-options'\" *ngIf=\"showOptions\" class=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\" role=\"listbox\">\n <li *ngFor=\"let item of items; let i = index;\" [id]=\"'option-'+ i\" (click)=\"onListItemSelected(item)\" role=\"option\" tabindex=\"-1\">\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n </ul>\n</div>\n<ul *ngIf=\"selectedItems.length > 0\" role=\"list\" class=\"grid grid-cols-1\">\n <li *ngFor=\"let item of selectedItems; let i = index;\" class=\"mt-3\">\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n</ul>\n<ng-template #defaultItemTemplate let-item>\n <span class=\"hover:bg-gray-100 relative cursor-pointer select-none py-2 pl-3 pr-3 block truncate\">{{ item }}</span>\n</ng-template>\n<ng-template #defaultSelectedItemTemplate let-item>\n <div class=\"grid grid-cols-1\">\n <div class=\"relative rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm flex items-center space-x-3 hover:border-gray-400\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"focus:outline-none\">\n <span class=\"absolute\" aria-hidden=\"true\"></span>\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\n </div>\n </div>\n <div class=\"ml-4 flex-shrink-0 flex\">\n <button type=\"button\" (click)=\"removeSelectedItem(item)\" class=\"cursor-pointer bg-white rounded-md inline-flex text-gray-400 hover:text-gray-500\">\n <span class=\"sr-only\">Close</span>\n <svg class=\"h-5 w-5\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</ng-template>", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }] });
73
74
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: ComboboxComponent, decorators: [{
74
75
  type: Component,
75
76
  args: [{ selector: 'lib-combobox', template: "<div class=\"relative mt-1\">\n <form autocomplete=\"off\" [id]=\"id + '-form'\">\n <input [id]=\"id + '-input'\" type=\"text\" (click)=\"onInputClick()\" (clickOutside)=\"onInputClickOutside()\" (keyup)=\"onInputKeyUp($event)\"\n class=\"w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-12 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm\" role=\"combobox\" aria-controls=\"options\"\n aria-expanded=\"false\" autocomplete=\"off\" list=\"autocomplete\">\n </form>\n <div class=\"absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-none\">\n <svg *ngIf=\"!busy\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-6 w-6 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <svg *ngIf=\"busy\" class=\"animate-spin h-6 w-6 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n <ul [id]=\"id + '-options'\" *ngIf=\"showOptions\" class=\"absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm\" role=\"listbox\">\n <li *ngFor=\"let item of items; let i = index;\" [id]=\"'option-'+ i\" (click)=\"onListItemSelected(item)\" role=\"option\" tabindex=\"-1\">\n <ng-container [ngTemplateOutlet]=\"itemTemplate || defaultItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n </ul>\n</div>\n<ul *ngIf=\"selectedItems.length > 0\" role=\"list\" class=\"grid grid-cols-1\">\n <li *ngFor=\"let item of selectedItems; let i = index;\" class=\"mt-3\">\n <ng-container [ngTemplateOutlet]=\"selectedItemTemplate || defaultSelectedItemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: item }\"></ng-container>\n </li>\n</ul>\n<ng-template #defaultItemTemplate let-item>\n <span class=\"hover:bg-gray-100 relative cursor-pointer select-none py-2 pl-3 pr-3 block truncate\">{{ item }}</span>\n</ng-template>\n<ng-template #defaultSelectedItemTemplate let-item>\n <div class=\"grid grid-cols-1\">\n <div class=\"relative rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm flex items-center space-x-3 hover:border-gray-400\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"focus:outline-none\">\n <span class=\"absolute\" aria-hidden=\"true\"></span>\n <p class=\"text-sm font-medium text-gray-900\">{{ item }}</p>\n </div>\n </div>\n <div class=\"ml-4 flex-shrink-0 flex\">\n <button type=\"button\" (click)=\"removeSelectedItem(item)\" class=\"cursor-pointer bg-white rounded-md inline-flex text-gray-400 hover:text-gray-500\">\n <span class=\"sr-only\">Close</span>\n <svg class=\"h-5 w-5\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</ng-template>" }]
@@ -93,4 +94,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImpor
93
94
  }], onItemSelected: [{
94
95
  type: Output
95
96
  }] } });
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRTVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBT3BFLE1BQU0sT0FBTyxpQkFBaUI7SUFTMUI7UUFSUSxlQUFVLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDcEQsV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUVuQix3QkFBbUIsR0FBRyxDQUFDLElBQVMsRUFBRSxFQUFFO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQzdELE9BQU8sWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksU0FBUyxDQUFDO1FBQzdELENBQUMsQ0FBQztRQUljLE9BQUUsR0FBVyxVQUFVLENBQUM7UUFrQnhCLGlCQUFZLEdBQW9DLElBQUksQ0FBQztRQUNyRCx3QkFBbUIsR0FBa0MsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2hFLHlCQUFvQixHQUFvQyxJQUFJLENBQUM7UUFDN0QsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUN0Qixl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eyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWNvbWJvYm94JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tYm9ib3guY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIF9kZWJvdW5jZXI6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIF9pdGVtczogYW55W10gPSBbXTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRJdGVtc0ZpbHRlciA9IChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbmQoeCA9PiB4ID09IGl0ZW0pO1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtID09IG51bGwgfHwgc2VsZWN0ZWRJdGVtID09IHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIEBJbnB1dCgpIHB1YmxpYyBpZDogc3RyaW5nID0gJ2NvbWJvYm94JztcblxuICAgIEBJbnB1dCgnaXRlbXMnKSBwdWJsaWMgc2V0IGl0ZW1zKGl0ZW1zOiBhbnlbXSkge1xuICAgICAgICBpZiAoIXRoaXMuaXRlbVRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zLmZpbHRlcih0aGlzLl9kZWZhdWx0SXRlbXNGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faXRlbXMgPSBpdGVtcy5maWx0ZXIodGhpcy5zZWxlY3RlZEl0ZW1zRmlsdGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogYW55W10ge1xuICAgICAgICBpZiAoIXRoaXMuaXRlbVRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMuZmlsdGVyKHRoaXMuX2RlZmF1bHRJdGVtc0ZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMuZmlsdGVyKHRoaXMuc2VsZWN0ZWRJdGVtc0ZpbHRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4gfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWRJdGVtc0ZpbHRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbiB8IG51bGwgPSAoKSA9PiB0cnVlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZEl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgcHVibGljIGJ1c3k6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGVib3VuY2VNczogbnVtYmVyID0gMTAwMDtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uU2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgdW5kZWZpbmVkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uSXRlbVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwdWJsaWMgc2hvd09wdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbWl0U2VhcmNoRXZlbnQoKTtcbiAgICAgICAgdGhpcy5fZGVib3VuY2VyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZU1zKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB0aGlzLmVtaXRTZWFyY2hFdmVudCh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Q2xpY2tPdXRzaWRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5wdXRLZXlVcChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlci5uZXh0KGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkxpc3RJdGVtU2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25JdGVtU2VsZWN0ZWQuZW1pdChpdGVtKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVNlbGVjdGVkSXRlbShpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0U2VhcmNoRXZlbnQoc2VhcmNoVGVybTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25TZWFyY2guZW1pdChzZWFyY2hUZXJtKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicmVsYXRpdmUgbXQtMVwiPlxuICAgIDxmb3JtIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtpZF09XCJpZCArICctZm9ybSdcIj5cbiAgICAgICAgPGlucHV0IFtpZF09XCJpZCArICctaW5wdXQnXCIgdHlwZT1cInRleHRcIiAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIiAoY2xpY2tPdXRzaWRlKT1cIm9uSW5wdXRDbGlja091dHNpZGUoKVwiIChrZXl1cCk9XCJvbklucHV0S2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cInctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS0zMDAgYmctd2hpdGUgcHktMiBwbC0zIHByLTEyIHNoYWRvdy1zbSBmb2N1czpib3JkZXItaW5kaWdvLTUwMCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctaW5kaWdvLTUwMCBzbTp0ZXh0LXNtXCIgcm9sZT1cImNvbWJvYm94XCIgYXJpYS1jb250cm9scz1cIm9wdGlvbnNcIlxuICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgbGlzdD1cImF1dG9jb21wbGV0ZVwiPlxuICAgIDwvZm9ybT5cbiAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1yLW1kIHB4LTIgZm9jdXM6b3V0bGluZS1ub25lXCI+XG4gICAgICAgIDxzdmcgKm5nSWY9XCIhYnVzeVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBjbGFzcz1cImgtNiB3LTYgdGV4dC1ncmF5LTQwMFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cbiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNMjEgMjFsLTYtNm0yLTVhNyA3IDAgMTEtMTQgMCA3IDcgMCAwMTE0IDB6XCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzdmcgKm5nSWY9XCJidXN5XCIgY2xhc3M9XCJhbmltYXRlLXNwaW4gaC02IHctNiB0ZXh0LWdyYXktNDAwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxuICAgICAgICAgICAgPGNpcmNsZSBjbGFzcz1cIm9wYWNpdHktMjVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cbiAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwib3BhY2l0eS03NVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQgMTJhOCA4IDAgMDE4LThWMEM1LjM3MyAwIDAgNS4zNzMgMCAxMmg0em0yIDUuMjkxQTcuOTYyIDcuOTYyIDAgMDE0IDEySDBjMCAzLjA0MiAxLjEzNSA1LjgyNCAzIDcuOTM4bDMtMi42NDd6XCI+PC9wYXRoPlxuICAgICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8dWwgW2lkXT1cImlkICsgJy1vcHRpb25zJ1wiICpuZ0lmPVwic2hvd09wdGlvbnNcIiBjbGFzcz1cImFic29sdXRlIHotMTAgbXQtMSBtYXgtaC02MCB3LWZ1bGwgb3ZlcmZsb3ctYXV0byByb3VuZGVkLW1kIGJnLXdoaXRlIHB5LTEgdGV4dC1iYXNlIHNoYWRvdy1sZyByaW5nLTEgcmluZy1ibGFjayByaW5nLW9wYWNpdHktNSBmb2N1czpvdXRsaW5lLW5vbmUgc206dGV4dC1zbVwiIHJvbGU9XCJsaXN0Ym94XCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtczsgbGV0IGkgPSBpbmRleDtcIiBbaWRdPVwiJ29wdGlvbi0nKyBpXCIgKGNsaWNrKT1cIm9uTGlzdEl0ZW1TZWxlY3RlZChpdGVtKVwiIHJvbGU9XCJvcHRpb25cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZSB8fCBkZWZhdWx0SXRlbVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG48dWwgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDBcIiByb2xlPVwibGlzdFwiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtMVwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwibXQtM1wiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdGVkSXRlbVRlbXBsYXRlIHx8IGRlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9saT5cbjwvdWw+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtVGVtcGxhdGUgbGV0LWl0ZW0+XG4gICAgPHNwYW4gY2xhc3M9XCJob3ZlcjpiZy1ncmF5LTEwMCByZWxhdGl2ZSBjdXJzb3ItcG9pbnRlciBzZWxlY3Qtbm9uZSBweS0yIHBsLTMgcHItMyBibG9jayB0cnVuY2F0ZVwiPnt7IGl0ZW0gfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGUgbGV0LWl0ZW0+XG4gICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBiZy13aGl0ZSBweC02IHB5LTUgc2hhZG93LXNtIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMyBob3Zlcjpib3JkZXItZ3JheS00MDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb2N1czpvdXRsaW5lLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhYnNvbHV0ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj57eyBpdGVtIH19PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtNCBmbGV4LXNocmluay0wIGZsZXhcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRJdGVtKGl0ZW0pXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBiZy13aGl0ZSByb3VuZGVkLW1kIGlubGluZS1mbGV4IHRleHQtZ3JheS00MDAgaG92ZXI6dGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImgtNSB3LTVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNC4yOTMgNC4yOTNhMSAxIDAgMDExLjQxNCAwTDEwIDguNTg2bDQuMjkzLTQuMjkzYTEgMSAwIDExMS40MTQgMS40MTRMMTEuNDE0IDEwbDQuMjkzIDQuMjkzYTEgMSAwIDAxLTEuNDE0IDEuNDE0TDEwIDExLjQxNGwtNC4yOTMgNC4yOTNhMSAxIDAgMDEtMS40MTQtMS40MTRMOC41ODYgMTAgNC4yOTMgNS43MDdhMSAxIDAgMDEwLTEuNDE0elwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRTVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQU9wRSxNQUFNLE9BQU8saUJBQWlCO0lBUzFCO1FBUlEsZUFBVSxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BELFdBQU0sR0FBVSxFQUFFLENBQUM7UUFFbkIsd0JBQW1CLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUM3RCxPQUFPLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLFNBQVMsQ0FBQztRQUM3RCxDQUFDLENBQUM7UUFJYyxPQUFFLEdBQVcsVUFBVSxDQUFDO1FBa0J4QixpQkFBWSxHQUFvQyxJQUFJLENBQUM7UUFDckQsd0JBQW1CLEdBQWtDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNoRSx5QkFBb0IsR0FBb0MsSUFBSSxDQUFDO1FBQzdELFNBQUksR0FBWSxLQUFLLENBQUM7UUFDdEIs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IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1jb21ib2JveCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbWJvYm94LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSBfZGVib3VuY2VyOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdID0gW107XG5cbiAgICBwcml2YXRlIF9kZWZhdWx0SXRlbXNGaWx0ZXIgPSAoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5maW5kKHggPT4geCA9PSBpdGVtKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PSBudWxsIHx8IHNlbGVjdGVkSXRlbSA9PSB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaWQ6IHN0cmluZyA9ICdjb21ib2JveCc7XG5cbiAgICBASW5wdXQoJ2l0ZW1zJykgcHVibGljIHNldCBpdGVtcyhpdGVtczogYW55W10pIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faXRlbXMgPSBpdGVtcy5maWx0ZXIodGhpcy5fZGVmYXVsdEl0ZW1zRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2l0ZW1zID0gaXRlbXMuZmlsdGVyKHRoaXMuc2VsZWN0ZWRJdGVtc0ZpbHRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IGFueVtdIHtcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbHRlcih0aGlzLl9kZWZhdWx0SXRlbXNGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmZpbHRlcih0aGlzLnNlbGVjdGVkSXRlbXNGaWx0ZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkSXRlbXNGaWx0ZXI6IChpdGVtOiBhbnkpID0+IGJvb2xlYW4gfCBudWxsID0gKCkgPT4gdHJ1ZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50PiB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBidXN5OiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGRlYm91bmNlTXM6IG51bWJlciA9IDEwMDA7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvblNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZyB8IHVuZGVmaW5lZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkl0ZW1TZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHVibGljIHNob3dPcHRpb25zOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW1pdFNlYXJjaEV2ZW50KCk7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VNcyksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4gdGhpcy5lbWl0U2VhcmNoRXZlbnQodmFsdWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25JbnB1dENsaWNrT3V0c2lkZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0S2V5VXAoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZWJvdW5jZXIubmV4dChldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25MaXN0SXRlbVNlbGVjdGVkKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uSXRlbVNlbGVjdGVkLmVtaXQoaXRlbSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW1pdFNlYXJjaEV2ZW50KHNlYXJjaFRlcm06IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uU2VhcmNoLmVtaXQoc2VhcmNoVGVybSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJlbGF0aXZlIG10LTFcIj5cbiAgICA8Zm9ybSBhdXRvY29tcGxldGU9XCJvZmZcIiBbaWRdPVwiaWQgKyAnLWZvcm0nXCI+XG4gICAgICAgIDxpbnB1dCBbaWRdPVwiaWQgKyAnLWlucHV0J1wiIHR5cGU9XCJ0ZXh0XCIgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCIgKGNsaWNrT3V0c2lkZSk9XCJvbklucHV0Q2xpY2tPdXRzaWRlKClcIiAoa2V5dXApPVwib25JbnB1dEtleVVwKCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWdyYXktMzAwIGJnLXdoaXRlIHB5LTIgcGwtMyBwci0xMiBzaGFkb3ctc20gZm9jdXM6Ym9yZGVyLWluZGlnby01MDAgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWluZGlnby01MDAgc206dGV4dC1zbVwiIHJvbGU9XCJjb21ib2JveFwiIGFyaWEtY29udHJvbHM9XCJvcHRpb25zXCJcbiAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGxpc3Q9XCJhdXRvY29tcGxldGVcIj5cbiAgICA8L2Zvcm0+XG4gICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGluc2V0LXktMCByaWdodC0wIGZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtci1tZCBweC0yIGZvY3VzOm91dGxpbmUtbm9uZVwiPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiIWJ1c3lcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJoLTYgdy02IHRleHQtZ3JheS00MDBcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+XG4gICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBkPVwiTTIxIDIxbC02LTZtMi01YTcgNyAwIDExLTE0IDAgNyA3IDAgMDExNCAwelwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3ZnICpuZ0lmPVwiYnVzeVwiIGNsYXNzPVwiYW5pbWF0ZS1zcGluIGgtNiB3LTYgdGV4dC1ncmF5LTQwMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJvcGFjaXR5LTI1XCIgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICA8cGF0aCBjbGFzcz1cIm9wYWNpdHktNzVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00IDEyYTggOCAwIDAxOC04VjBDNS4zNzMgMCAwIDUuMzczIDAgMTJoNHptMiA1LjI5MUE3Ljk2MiA3Ljk2MiAwIDAxNCAxMkgwYzAgMy4wNDIgMS4xMzUgNS44MjQgMyA3LjkzOGwzLTIuNjQ3elwiPjwvcGF0aD5cbiAgICAgICAgPC9zdmc+XG4gICAgPC9kaXY+XG4gICAgPHVsIFtpZF09XCJpZCArICctb3B0aW9ucydcIiAqbmdJZj1cInNob3dPcHRpb25zXCIgY2xhc3M9XCJhYnNvbHV0ZSB6LTEwIG10LTEgbWF4LWgtNjAgdy1mdWxsIG92ZXJmbG93LWF1dG8gcm91bmRlZC1tZCBiZy13aGl0ZSBweS0xIHRleHQtYmFzZSBzaGFkb3ctbGcgcmluZy0xIHJpbmctYmxhY2sgcmluZy1vcGFjaXR5LTUgZm9jdXM6b3V0bGluZS1ub25lIHNtOnRleHQtc21cIiByb2xlPVwibGlzdGJveFwiPlxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBpID0gaW5kZXg7XCIgW2lkXT1cIidvcHRpb24tJysgaVwiIChjbGljayk9XCJvbkxpc3RJdGVtU2VsZWN0ZWQoaXRlbSlcIiByb2xlPVwib3B0aW9uXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGUgfHwgZGVmYXVsdEl0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbGk+XG4gICAgPC91bD5cbjwvZGl2PlxuPHVsICpuZ0lmPVwic2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwXCIgcm9sZT1cImxpc3RcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTFcIj5cbiAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtczsgbGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cIm10LTNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3RlZEl0ZW1UZW1wbGF0ZSB8fCBkZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbGk+XG48L3VsPlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0SXRlbVRlbXBsYXRlIGxldC1pdGVtPlxuICAgIDxzcGFuIGNsYXNzPVwiaG92ZXI6YmctZ3JheS0xMDAgcmVsYXRpdmUgY3Vyc29yLXBvaW50ZXIgc2VsZWN0LW5vbmUgcHktMiBwbC0zIHByLTMgYmxvY2sgdHJ1bmNhdGVcIj57eyBpdGVtIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlIGxldC1pdGVtPlxuICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZ3JheS0zMDAgYmctd2hpdGUgcHgtNiBweS01IHNoYWRvdy1zbSBmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTMgaG92ZXI6Ym9yZGVyLWdyYXktNDAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9jdXM6b3V0bGluZS1ub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWJzb2x1dGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+e3sgaXRlbSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTQgZmxleC1zaHJpbmstMCBmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtKVwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgYmctd2hpdGUgcm91bmRlZC1tZCBpbmxpbmUtZmxleCB0ZXh0LWdyYXktNDAwIGhvdmVyOnRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTUgdy01XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQuMjkzIDQuMjkzYTEgMSAwIDAxMS40MTQgMEwxMCA4LjU4Nmw0LjI5My00LjI5M2ExIDEgMCAxMTEuNDE0IDEuNDE0TDExLjQxNCAxMGw0LjI5MyA0LjI5M2ExIDEgMCAwMS0xLjQxNCAxLjQxNEwxMCAxMS40MTRsLTQuMjkzIDQuMjkzYTEgMSAwIDAxLTEuNDE0LTEuNDE0TDguNTg2IDEwIDQuMjkzIDUuNzA3YTEgMSAwIDAxMC0xLjQxNHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19