@koobiq/components 18.17.0 → 18.19.0
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.
- package/actions-panel/actions-panel-config.d.ts +79 -0
- package/actions-panel/actions-panel-container.d.ts +90 -0
- package/actions-panel/actions-panel-container.scss +33 -0
- package/actions-panel/actions-panel-ref.d.ts +31 -0
- package/actions-panel/actions-panel-tokens.scss +13 -0
- package/actions-panel/actions-panel.d.ts +144 -0
- package/actions-panel/index.d.ts +5 -0
- package/actions-panel/module.d.ts +7 -0
- package/core/animation/animation.d.ts +26 -0
- package/core/form-field/form-field-ref.d.ts +4 -0
- package/core/locales/en-US.d.ts +45 -0
- package/core/locales/es-LA.d.ts +45 -0
- package/core/locales/fa-IR.d.ts +45 -0
- package/core/locales/locale-service.d.ts +315 -0
- package/core/locales/pt-BR.d.ts +45 -0
- package/core/locales/ru-RU.d.ts +45 -0
- package/core/locales/tk-TM.d.ts +45 -0
- package/core/locales/types.d.ts +6 -0
- package/core/locales/zh-CN.d.ts +45 -0
- package/core/option/option.d.ts +3 -1
- package/datepicker/calendar.component.d.ts +9 -0
- package/datepicker/datepicker-input.directive.d.ts +5 -1
- package/dl/dl.component.d.ts +3 -4
- package/dropdown/_dropdown-theme.scss +9 -10
- package/dropdown/dropdown-tokens.scss +1 -0
- package/dropdown/dropdown.component.d.ts +1 -1
- package/dropdown/dropdown.scss +5 -0
- package/dropdown/dropdown.types.d.ts +3 -1
- package/esm2022/accordion/accordion-trigger.component.mjs +1 -1
- package/esm2022/actions-panel/actions-panel-config.mjs +55 -0
- package/esm2022/actions-panel/actions-panel-container.mjs +217 -0
- package/esm2022/actions-panel/actions-panel-ref.mjs +62 -0
- package/esm2022/actions-panel/actions-panel.mjs +220 -0
- package/esm2022/actions-panel/index.mjs +6 -0
- package/esm2022/actions-panel/koobiq-components-actions-panel.mjs +5 -0
- package/esm2022/actions-panel/module.mjs +21 -0
- package/esm2022/breadcrumbs/breadcrumbs.mjs +2 -2
- package/esm2022/code-block/code-block.mjs +1 -1
- package/esm2022/core/animation/animation.mjs +29 -1
- package/esm2022/core/common-behaviors/common-module.mjs +2 -2
- package/esm2022/core/form-field/form-field-ref.mjs +1 -1
- package/esm2022/core/locales/en-US.mjs +46 -1
- package/esm2022/core/locales/es-LA.mjs +46 -1
- package/esm2022/core/locales/fa-IR.mjs +46 -1
- package/esm2022/core/locales/pt-BR.mjs +46 -1
- package/esm2022/core/locales/ru-RU.mjs +46 -1
- package/esm2022/core/locales/tk-TM.mjs +46 -1
- package/esm2022/core/locales/types.mjs +1 -1
- package/esm2022/core/locales/zh-CN.mjs +46 -1
- package/esm2022/core/option/option.mjs +10 -3
- package/esm2022/core/version.mjs +2 -2
- package/esm2022/datepicker/calendar-header.component.mjs +1 -1
- package/esm2022/datepicker/calendar.component.mjs +20 -2
- package/esm2022/datepicker/datepicker-input.directive.mjs +22 -11
- package/esm2022/datepicker/datepicker-toggle.component.mjs +1 -1
- package/esm2022/dl/dl.component.mjs +8 -7
- package/esm2022/dropdown/dropdown-item.component.mjs +1 -1
- package/esm2022/dropdown/dropdown-trigger.directive.mjs +6 -1
- package/esm2022/dropdown/dropdown.component.mjs +4 -4
- package/esm2022/dropdown/dropdown.types.mjs +1 -1
- package/esm2022/file-upload/multiple-file-upload.component.mjs +1 -1
- package/esm2022/file-upload/single-file-upload.component.mjs +1 -1
- package/esm2022/filter-bar/filter-bar-button.mjs +30 -0
- package/esm2022/filter-bar/filter-bar.mjs +168 -0
- package/esm2022/filter-bar/filter-bar.module.mjs +65 -0
- package/esm2022/filter-bar/filter-bar.types.mjs +13 -0
- package/esm2022/filter-bar/filter-refresher.mjs +34 -0
- package/esm2022/filter-bar/filter-reset.mjs +38 -0
- package/esm2022/filter-bar/filter-search.mjs +132 -0
- package/esm2022/filter-bar/filters.mjs +225 -0
- package/esm2022/filter-bar/index.mjs +2 -0
- package/esm2022/filter-bar/koobiq-components-filter-bar.mjs +5 -0
- package/esm2022/filter-bar/pipe-add.mjs +129 -0
- package/esm2022/filter-bar/pipe.directive.mjs +55 -0
- package/esm2022/filter-bar/pipes/base-pipe.mjs +106 -0
- package/esm2022/filter-bar/pipes/pipe-button.mjs +59 -0
- package/esm2022/filter-bar/pipes/pipe-date.mjs +171 -0
- package/esm2022/filter-bar/pipes/pipe-datetime.mjs +172 -0
- package/esm2022/filter-bar/pipes/pipe-multi-select.mjs +96 -0
- package/esm2022/filter-bar/pipes/pipe-select.mjs +88 -0
- package/esm2022/filter-bar/pipes/pipe-state.mjs +45 -0
- package/esm2022/filter-bar/pipes/pipe-text.mjs +89 -0
- package/esm2022/filter-bar/pipes/pipe-title.mjs +96 -0
- package/esm2022/filter-bar/public-api.mjs +20 -0
- package/esm2022/form-field/cleaner.mjs +1 -1
- package/esm2022/form-field/form-field.mjs +13 -6
- package/esm2022/form-field/password-hint.mjs +1 -1
- package/esm2022/form-field/password-toggle.mjs +1 -1
- package/esm2022/form-field/stepper.mjs +1 -1
- package/esm2022/icon/icon-button.component.mjs +9 -9
- package/esm2022/icon/icon-item.component.mjs +10 -10
- package/esm2022/icon/icon.component.mjs +9 -12
- package/esm2022/list/list-selection.component.mjs +4 -4
- package/esm2022/modal/modal.component.mjs +1 -1
- package/esm2022/modal/modal.directive.mjs +1 -1
- package/esm2022/navbar/navbar-item.component.mjs +2 -2
- package/esm2022/overflow-items/overflow-items.mjs +151 -195
- package/esm2022/popover/popover.component.mjs +30 -10
- package/esm2022/select/select.component.mjs +3 -3
- package/esm2022/sidepanel/sidepanel-directives.mjs +2 -2
- package/esm2022/tabs/tab-header.component.mjs +1 -1
- package/esm2022/tabs/tab-nav-bar.mjs +2 -2
- package/esm2022/textarea/textarea.component.mjs +9 -5
- package/esm2022/timezone/timezone-select.component.mjs +2 -2
- package/esm2022/title/title.directive.mjs +12 -5
- package/esm2022/toast/toast.component.mjs +2 -2
- package/esm2022/tree/toggle.mjs +1 -1
- package/esm2022/tree/tree-option.component.mjs +3 -2
- package/esm2022/tree/tree-selection.component.mjs +4 -2
- package/esm2022/tree-select/tree-select.component.mjs +6 -4
- package/fesm2022/koobiq-components-accordion.mjs +1 -1
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-actions-panel.mjs +567 -0
- package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -0
- package/fesm2022/koobiq-components-breadcrumbs.mjs +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-code-block.mjs +1 -1
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-core.mjs +355 -5
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +40 -12
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-dl.mjs +7 -6
- package/fesm2022/koobiq-components-dl.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +9 -4
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-file-upload.mjs +2 -2
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +1596 -0
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -0
- package/fesm2022/koobiq-components-form-field.mjs +16 -9
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +23 -26
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +3 -3
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +2 -2
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +2 -2
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-overflow-items.mjs +152 -196
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +29 -9
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +2 -2
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +2 -2
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +8 -4
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +2 -2
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-title.mjs +11 -4
- package/fesm2022/koobiq-components-title.mjs.map +1 -1
- package/fesm2022/koobiq-components-toast.mjs +1 -1
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +5 -3
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +6 -3
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/filter-bar/_filter-bar-theme.scss +61 -0
- package/filter-bar/filter-bar-button.d.ts +8 -0
- package/filter-bar/filter-bar.d.ts +55 -0
- package/filter-bar/filter-bar.module.d.ts +17 -0
- package/filter-bar/filter-bar.scss +60 -0
- package/filter-bar/filter-bar.types.d.ts +97 -0
- package/filter-bar/filter-refresher.d.ts +5 -0
- package/filter-bar/filter-refresher.scss +6 -0
- package/filter-bar/filter-reset.d.ts +11 -0
- package/filter-bar/filter-search.d.ts +25 -0
- package/filter-bar/filter-search.scss +14 -0
- package/filter-bar/filters.d.ts +72 -0
- package/filter-bar/filters.scss +92 -0
- package/filter-bar/index.d.ts +1 -0
- package/filter-bar/pipe-add.d.ts +18 -0
- package/filter-bar/pipe-add.scss +5 -0
- package/filter-bar/pipe.directive.d.ts +13 -0
- package/filter-bar/pipes/base-pipe.d.ts +40 -0
- package/filter-bar/pipes/base-pipe.scss +117 -0
- package/filter-bar/pipes/pipe-button.d.ts +13 -0
- package/filter-bar/pipes/pipe-button.scss +5 -0
- package/filter-bar/pipes/pipe-date.d.ts +41 -0
- package/filter-bar/pipes/pipe-date.scss +132 -0
- package/filter-bar/pipes/pipe-datetime.d.ts +41 -0
- package/filter-bar/pipes/pipe-multi-select.d.ts +22 -0
- package/filter-bar/pipes/pipe-multiselect.scss +15 -0
- package/filter-bar/pipes/pipe-select.d.ts +21 -0
- package/filter-bar/pipes/pipe-select.scss +3 -0
- package/filter-bar/pipes/pipe-state.d.ts +14 -0
- package/filter-bar/pipes/pipe-text.d.ts +19 -0
- package/filter-bar/pipes/pipe-title.d.ts +25 -0
- package/filter-bar/public-api.d.ts +19 -0
- package/form-field/form-field.d.ts +6 -1
- package/form-field/form-field.scss +1 -0
- package/icon/icon-button.component.d.ts +5 -3
- package/icon/icon-item.component.d.ts +5 -3
- package/icon/icon.component.d.ts +5 -4
- package/overflow-items/overflow-items.d.ts +68 -82
- package/package.json +18 -6
- package/popover/popover.component.d.ts +6 -1
- package/schematics/ng-add/index.js +5 -5
- package/select/_select-theme.scss +9 -1
- package/textarea/textarea.component.d.ts +2 -1
- package/title/title.directive.d.ts +2 -0
- package/tree-select/_tree-select-theme.scss +9 -1
- package/tree-select/tree-select.component.d.ts +1 -1
|
@@ -1,72 +1,105 @@
|
|
|
1
|
-
import { ContentObserver } from '@angular/cdk/observers';
|
|
2
1
|
import { SharedResizeObserver } from '@angular/cdk/observers/private';
|
|
3
|
-
import {
|
|
4
|
-
import { booleanAttribute,
|
|
5
|
-
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import { booleanAttribute, contentChild, contentChildren, Directive, ElementRef, inject, input, numberAttribute, output, Renderer2, signal } from '@angular/core';
|
|
4
|
+
import { outputToObservable, takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
6
5
|
import { debounceTime, merge, skip } from 'rxjs';
|
|
7
6
|
import * as i0 from "@angular/core";
|
|
8
7
|
/**
|
|
9
|
-
*
|
|
8
|
+
* Manages the visibility of the element.
|
|
10
9
|
*
|
|
11
|
-
* @
|
|
10
|
+
* @docs-private
|
|
12
11
|
*/
|
|
13
|
-
export class
|
|
12
|
+
export class ElementVisibilityManager {
|
|
14
13
|
constructor() {
|
|
14
|
+
this.renderer = inject(Renderer2);
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Reference to the element.
|
|
17
17
|
*
|
|
18
18
|
* @docs-private
|
|
19
19
|
*/
|
|
20
|
-
this.
|
|
20
|
+
this.elementRef = inject(ElementRef);
|
|
21
|
+
/**
|
|
22
|
+
* Whether the element is hidden.
|
|
23
|
+
*
|
|
24
|
+
* @docs-private
|
|
25
|
+
*/
|
|
26
|
+
this.hidden = signal(false);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Hides the element.
|
|
30
|
+
*
|
|
31
|
+
* @docs-private
|
|
32
|
+
*/
|
|
33
|
+
hide() {
|
|
34
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'visibility', 'hidden');
|
|
35
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'position', 'absolute');
|
|
36
|
+
this.hidden.set(true);
|
|
21
37
|
}
|
|
22
|
-
/**
|
|
23
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Shows the element.
|
|
40
|
+
*
|
|
41
|
+
* @docs-private
|
|
42
|
+
*/
|
|
43
|
+
show() {
|
|
44
|
+
this.renderer.removeStyle(this.elementRef.nativeElement, 'visibility');
|
|
45
|
+
this.renderer.removeStyle(this.elementRef.nativeElement, 'position');
|
|
46
|
+
this.hidden.set(false);
|
|
47
|
+
}
|
|
48
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ElementVisibilityManager, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
49
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: ElementVisibilityManager, host: { properties: { "attr.aria-hidden": "hidden()" } }, ngImport: i0 }); }
|
|
50
|
+
}
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ElementVisibilityManager, decorators: [{
|
|
52
|
+
type: Directive,
|
|
53
|
+
args: [{
|
|
54
|
+
host: {
|
|
55
|
+
'[attr.aria-hidden]': 'hidden()'
|
|
56
|
+
}
|
|
57
|
+
}]
|
|
58
|
+
}] });
|
|
59
|
+
/**
|
|
60
|
+
* Directive for displaying the result of hidden items by the `KbqOverflowItems` directive.
|
|
61
|
+
*/
|
|
62
|
+
export class KbqOverflowItemsResult extends ElementVisibilityManager {
|
|
63
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItemsResult, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
|
|
64
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: KbqOverflowItemsResult, isStandalone: true, selector: "[kbqOverflowItemsResult]", host: { classAttribute: "kbq-overflow-items-result" }, exportAs: ["kbqOverflowItemsResult"], usesInheritance: true, ngImport: i0 }); }
|
|
24
65
|
}
|
|
25
66
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItemsResult, decorators: [{
|
|
26
67
|
type: Directive,
|
|
27
68
|
args: [{
|
|
28
69
|
standalone: true,
|
|
29
|
-
selector: '
|
|
70
|
+
selector: '[kbqOverflowItemsResult]',
|
|
71
|
+
exportAs: 'kbqOverflowItemsResult',
|
|
72
|
+
host: { class: 'kbq-overflow-items-result' }
|
|
30
73
|
}]
|
|
31
74
|
}] });
|
|
32
75
|
/**
|
|
33
|
-
*
|
|
76
|
+
* Directive for the item that can be hidden by the `KbqOverflowItems` directive.
|
|
34
77
|
*/
|
|
35
|
-
export class KbqOverflowItem {
|
|
78
|
+
export class KbqOverflowItem extends ElementVisibilityManager {
|
|
36
79
|
constructor() {
|
|
80
|
+
super(...arguments);
|
|
37
81
|
/**
|
|
38
|
-
*
|
|
82
|
+
* Unique identifier for the item.
|
|
39
83
|
*/
|
|
40
84
|
this.id = input.required({ alias: 'kbqOverflowItem' });
|
|
41
|
-
/**
|
|
42
|
-
* Whether the item is hidden.
|
|
43
|
-
*
|
|
44
|
-
* @docs-private
|
|
45
|
-
*/
|
|
46
|
-
this.hidden = signal(false);
|
|
47
|
-
/**
|
|
48
|
-
* TemplateRef for the item.
|
|
49
|
-
*
|
|
50
|
-
* @docs-private
|
|
51
|
-
*/
|
|
52
|
-
this.templateRef = inject(TemplateRef);
|
|
53
85
|
}
|
|
54
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItem, deps:
|
|
55
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.6", type: KbqOverflowItem, isStandalone: true, selector: "[kbqOverflowItem]", inputs: { id: { classPropertyName: "id", publicName: "kbqOverflowItem", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 }); }
|
|
86
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItem, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
|
|
87
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.6", type: KbqOverflowItem, isStandalone: true, selector: "[kbqOverflowItem]", inputs: { id: { classPropertyName: "id", publicName: "kbqOverflowItem", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "kbq-overflow-item" }, exportAs: ["kbqOverflowItem"], usesInheritance: true, ngImport: i0 }); }
|
|
56
88
|
}
|
|
57
89
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItem, decorators: [{
|
|
58
90
|
type: Directive,
|
|
59
91
|
args: [{
|
|
60
92
|
standalone: true,
|
|
61
|
-
selector: '[kbqOverflowItem]'
|
|
93
|
+
selector: '[kbqOverflowItem]',
|
|
94
|
+
exportAs: 'kbqOverflowItem',
|
|
95
|
+
host: { class: 'kbq-overflow-item' }
|
|
62
96
|
}]
|
|
63
97
|
}] });
|
|
64
98
|
/**
|
|
65
|
-
*
|
|
99
|
+
* Directive for managing the visibility of items that overflow the container.
|
|
66
100
|
*/
|
|
67
101
|
export class KbqOverflowItems {
|
|
68
102
|
constructor() {
|
|
69
|
-
this.itemElementRefs = viewChildren('itemRef', { read: ElementRef });
|
|
70
103
|
/**
|
|
71
104
|
* `KbqOverflowItem` directive references.
|
|
72
105
|
*
|
|
@@ -79,191 +112,114 @@ export class KbqOverflowItems {
|
|
|
79
112
|
* @docs-private
|
|
80
113
|
*/
|
|
81
114
|
this.result = contentChild(KbqOverflowItemsResult);
|
|
82
|
-
this.resultElementRef = viewChild('resultRef', { read: ElementRef });
|
|
83
115
|
/**
|
|
84
|
-
*
|
|
116
|
+
* Whether the overflow order should be reversed.
|
|
85
117
|
*
|
|
86
|
-
* @
|
|
118
|
+
* @default false
|
|
87
119
|
*/
|
|
88
|
-
this.
|
|
89
|
-
const hiddenItemIDs = new Set(this.items()
|
|
90
|
-
.filter(({ hidden }) => hidden())
|
|
91
|
-
.map(({ id }) => id()));
|
|
92
|
-
return {
|
|
93
|
-
$implicit: hiddenItemIDs,
|
|
94
|
-
hiddenItemIDs: hiddenItemIDs
|
|
95
|
-
};
|
|
96
|
-
});
|
|
120
|
+
this.reverseOverflowOrder = input(false, { transform: booleanAttribute });
|
|
97
121
|
/**
|
|
98
|
-
*
|
|
122
|
+
* Debounce time for recalculating items visibility.
|
|
99
123
|
*
|
|
100
|
-
* @
|
|
124
|
+
* @default 100
|
|
101
125
|
*/
|
|
102
|
-
this.
|
|
126
|
+
this.debounceTime = input(100, { transform: numberAttribute });
|
|
103
127
|
/**
|
|
104
|
-
*
|
|
105
|
-
* Also changes the position of the `resultTemplateRef`.
|
|
106
|
-
*
|
|
107
|
-
* @default false
|
|
128
|
+
* Emits when the set of hidden items changes.
|
|
108
129
|
*/
|
|
109
|
-
this.
|
|
130
|
+
this.changes = output();
|
|
131
|
+
/**
|
|
132
|
+
* Set of hidden item IDs.
|
|
133
|
+
*/
|
|
134
|
+
this.hiddenItemIDs = toSignal(outputToObservable(this.changes), {
|
|
135
|
+
initialValue: new Set([])
|
|
136
|
+
});
|
|
110
137
|
this.elementRef = inject(ElementRef);
|
|
111
138
|
this.resizeObserver = inject(SharedResizeObserver);
|
|
112
|
-
this.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
|
|
139
|
+
this.renderer = inject(Renderer2);
|
|
140
|
+
this.document = inject(DOCUMENT);
|
|
141
|
+
/**
|
|
142
|
+
* Determines if the given item is hidden.
|
|
143
|
+
*/
|
|
144
|
+
this.isHiddenItem = ({ hidden }) => hidden();
|
|
145
|
+
this.setStyles();
|
|
146
|
+
merge(toObservable(this.items), toObservable(this.reverseOverflowOrder).pipe(skip(1)), this.resizeObserver.observe(this.elementRef.nativeElement))
|
|
147
|
+
.pipe(debounceTime(this.debounceTime()), takeUntilDestroyed())
|
|
120
148
|
.subscribe(() => {
|
|
121
|
-
this.
|
|
149
|
+
const hiddenItems = this.calculateItemsVisibility(this.items(), this.reverseOverflowOrder(), this.result(), this.elementRef.nativeElement);
|
|
150
|
+
const hiddenItemIDs = new Set(hiddenItems.map(({ id }) => id()));
|
|
151
|
+
this.changes.emit(hiddenItemIDs);
|
|
122
152
|
});
|
|
123
153
|
}
|
|
124
154
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* This method calculates whether items should be hidden or shown by comparing the scroll width of the container
|
|
128
|
-
* with its visible width. It determines which items are visible and which are hidden, and applies the hiding logic
|
|
129
|
-
* based on the `reverseOverflowOrder` flag.
|
|
130
|
-
*
|
|
131
|
-
* The function operates recursively to adjust the visibility of items until the overflow condition is resolved.
|
|
132
|
-
*
|
|
133
|
-
* - If the container is overflown, it hides the last visible item from the end (or start if `reverseOverflowOrder`)
|
|
134
|
-
* and checks if further adjustments are needed.
|
|
135
|
-
* - If the container is not overflown, it reveals the first hidden item from the start
|
|
136
|
-
* (or end if `reverseOverflowOrder`), ensuring it fits within the visible area.
|
|
155
|
+
* Calculates the visibility of items, based on the container width and `reverseOverflowOrder` property.
|
|
137
156
|
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
hidden,
|
|
143
|
-
isFirst: index === 0,
|
|
144
|
-
isLast: index === _items.length - 1,
|
|
145
|
-
elementRef: itemElementRefs[index]
|
|
146
|
-
};
|
|
157
|
+
calculateItemsVisibility(items, reverseOverflowOrder, result, { offsetWidth: totalWidth }) {
|
|
158
|
+
result?.hide();
|
|
159
|
+
items.forEach((item) => {
|
|
160
|
+
item.show();
|
|
147
161
|
});
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
const
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
this.updateItemsVisibility();
|
|
161
|
-
}
|
|
162
|
+
let itemsWidth = items.reduce((width, { elementRef }) => width + this.getElementWidthWithMargins(elementRef), 0);
|
|
163
|
+
const startIndex = reverseOverflowOrder ? 0 : items.length - 1;
|
|
164
|
+
const endIndex = reverseOverflowOrder ? items.length : -1;
|
|
165
|
+
const step = reverseOverflowOrder ? 1 : -1;
|
|
166
|
+
const resultWidth = result ? this.getElementWidthWithMargins(result.elementRef) : 0;
|
|
167
|
+
for (let index = startIndex; index !== endIndex; index += step) {
|
|
168
|
+
const current = items[index];
|
|
169
|
+
const currentWidth = this.getElementWidthWithMargins(current.elementRef);
|
|
170
|
+
const _resultWidth = items.some(this.isHiddenItem) ? resultWidth : 0;
|
|
171
|
+
if (itemsWidth + _resultWidth > totalWidth) {
|
|
172
|
+
current.hide();
|
|
173
|
+
itemsWidth -= currentWidth;
|
|
162
174
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (firstHiddenItem) {
|
|
170
|
-
const firstHiddenItemWidth = firstHiddenItem.elementRef.nativeElement.offsetWidth;
|
|
171
|
-
const visibleItemsTotalWidth = items
|
|
172
|
-
.filter(({ hidden }) => !hidden())
|
|
173
|
-
.reduce((width, { elementRef }) => width + elementRef.nativeElement.offsetWidth, 0);
|
|
174
|
-
const _isEdgeItem = isEdgeItem(firstHiddenItem);
|
|
175
|
-
const resultWidth = _isEdgeItem ? 0 : this.resultElementRef()?.nativeElement.offsetWidth || 0;
|
|
176
|
-
if (firstHiddenItemWidth + visibleItemsTotalWidth + resultWidth <= totalWidth) {
|
|
177
|
-
firstHiddenItem.hidden.set(false);
|
|
178
|
-
if (!_isEdgeItem) {
|
|
179
|
-
this.updateItemsVisibility();
|
|
180
|
-
}
|
|
175
|
+
else {
|
|
176
|
+
const isEdgeElement = reverseOverflowOrder ? index === 0 : index === items.length - 1;
|
|
177
|
+
const _resultWidth = isEdgeElement ? 0 : resultWidth;
|
|
178
|
+
if (itemsWidth + currentWidth + _resultWidth <= totalWidth) {
|
|
179
|
+
current.show();
|
|
180
|
+
itemsWidth += currentWidth;
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
for (let i = array.length - 1; i >= 0; i--) {
|
|
188
|
-
if (predicate(array[i], i, array)) {
|
|
189
|
-
return array[i];
|
|
190
|
-
}
|
|
184
|
+
const hiddenItems = items.filter(this.isHiddenItem);
|
|
185
|
+
if (hiddenItems.length > 0) {
|
|
186
|
+
result?.show();
|
|
191
187
|
}
|
|
192
|
-
return
|
|
188
|
+
return hiddenItems;
|
|
193
189
|
}
|
|
194
|
-
/**
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
[attr.aria-hidden]="resultHidden()"
|
|
220
|
-
[class.kbq-overflow-items__result_hidden]="resultHidden()"
|
|
221
|
-
>
|
|
222
|
-
<ng-container
|
|
223
|
-
[ngTemplateOutlet]="result()?.templateRef || null"
|
|
224
|
-
[ngTemplateOutletContext]="resultTemplateContext()"
|
|
225
|
-
/>
|
|
226
|
-
</div>
|
|
227
|
-
</ng-template>
|
|
228
|
-
`, isInline: true, styles: [":host{position:relative;display:flex;flex-grow:1;overflow:hidden;flex-wrap:nowrap;white-space:nowrap}.kbq-overflow-items__item,.kbq-overflow-items__result{display:flex;align-items:center}.kbq-overflow-items__item.kbq-overflow-items__item_hidden,.kbq-overflow-items__item.kbq-overflow-items__result_hidden,.kbq-overflow-items__result.kbq-overflow-items__item_hidden,.kbq-overflow-items__result.kbq-overflow-items__result_hidden{visibility:hidden;position:absolute}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
190
|
+
/**
|
|
191
|
+
* Returns the width of the element including margins.
|
|
192
|
+
*/
|
|
193
|
+
getElementWidthWithMargins({ nativeElement }) {
|
|
194
|
+
const { marginLeft, marginRight } = this.getWindow().getComputedStyle(nativeElement);
|
|
195
|
+
return Math.ceil(parseFloat(marginLeft) + nativeElement.offsetWidth + parseFloat(marginRight));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* This method sets the necessary styles for the directive.
|
|
199
|
+
*/
|
|
200
|
+
setStyles() {
|
|
201
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'position', 'relative');
|
|
202
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'display', 'flex');
|
|
203
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'flex-wrap', 'nowrap');
|
|
204
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'flex-grow', '1');
|
|
205
|
+
this.renderer.setStyle(this.elementRef.nativeElement, 'overflow', 'hidden');
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Returns the window object.
|
|
209
|
+
*/
|
|
210
|
+
getWindow() {
|
|
211
|
+
return this.document.defaultView || window;
|
|
212
|
+
}
|
|
213
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItems, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
214
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.6", type: KbqOverflowItems, isStandalone: true, selector: "[kbqOverflowItems]", inputs: { reverseOverflowOrder: { classPropertyName: "reverseOverflowOrder", publicName: "reverseOverflowOrder", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changes: "changes" }, host: { classAttribute: "kbq-overflow-items" }, queries: [{ propertyName: "items", predicate: KbqOverflowItem, isSignal: true }, { propertyName: "result", first: true, predicate: KbqOverflowItemsResult, descendants: true, isSignal: true }], exportAs: ["kbqOverflowItems"], ngImport: i0 }); }
|
|
229
215
|
}
|
|
230
216
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItems, decorators: [{
|
|
231
|
-
type:
|
|
232
|
-
args: [{
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
<div
|
|
239
|
-
class="kbq-overflow-items__item"
|
|
240
|
-
#itemRef
|
|
241
|
-
[attr.aria-hidden]="item.hidden()"
|
|
242
|
-
[class.kbq-overflow-items__item_hidden]="item.hidden()"
|
|
243
|
-
>
|
|
244
|
-
<ng-container [ngTemplateOutlet]="item.templateRef" />
|
|
245
|
-
</div>
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
@if (!reverseOverflowOrder()) {
|
|
249
|
-
<ng-container [ngTemplateOutlet]="template" />
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
<ng-template #template>
|
|
253
|
-
<div
|
|
254
|
-
class="kbq-overflow-items__result"
|
|
255
|
-
#resultRef
|
|
256
|
-
[attr.aria-hidden]="resultHidden()"
|
|
257
|
-
[class.kbq-overflow-items__result_hidden]="resultHidden()"
|
|
258
|
-
>
|
|
259
|
-
<ng-container
|
|
260
|
-
[ngTemplateOutlet]="result()?.templateRef || null"
|
|
261
|
-
[ngTemplateOutletContext]="resultTemplateContext()"
|
|
262
|
-
/>
|
|
263
|
-
</div>
|
|
264
|
-
</ng-template>
|
|
265
|
-
`, host: {
|
|
266
|
-
class: 'kbq-overflow-items'
|
|
267
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{position:relative;display:flex;flex-grow:1;overflow:hidden;flex-wrap:nowrap;white-space:nowrap}.kbq-overflow-items__item,.kbq-overflow-items__result{display:flex;align-items:center}.kbq-overflow-items__item.kbq-overflow-items__item_hidden,.kbq-overflow-items__item.kbq-overflow-items__result_hidden,.kbq-overflow-items__result.kbq-overflow-items__item_hidden,.kbq-overflow-items__result.kbq-overflow-items__result_hidden{visibility:hidden;position:absolute}\n"] }]
|
|
217
|
+
type: Directive,
|
|
218
|
+
args: [{
|
|
219
|
+
standalone: true,
|
|
220
|
+
selector: '[kbqOverflowItems]',
|
|
221
|
+
exportAs: 'kbqOverflowItems',
|
|
222
|
+
host: { class: 'kbq-overflow-items' }
|
|
223
|
+
}]
|
|
268
224
|
}], ctorParameters: () => [] });
|
|
269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctaXRlbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL292ZXJmbG93LWl0ZW1zL292ZXJmbG93LWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQWtDakQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxzQkFBc0I7SUFKbkM7UUFLSTs7OztXQUlHO1FBQ00sZ0JBQVcsR0FBRyxNQUFNLENBQTZDLFdBQVcsQ0FBQyxDQUFDO0tBQzFGO2lJQVBZLHNCQUFzQjtxSEFBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQUpsQyxTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUscUNBQXFDO2lCQUNsRDs7QUFVRDs7R0FFRztBQUtILE1BQU0sT0FBTyxlQUFlO0lBSjVCO1FBS0k7O1dBRUc7UUFDTSxPQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFM0Q7Ozs7V0FJRztRQUNNLFdBQU0sR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFekM7Ozs7V0FJRztRQUNNLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQzlDO2lJQW5CWSxlQUFlO3FIQUFmLGVBQWU7OzJGQUFmLGVBQWU7a0JBSjNCLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxtQkFBbUI7aUJBQ2hDOztBQXNCRDs7R0FFRztBQTZDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBdUR6QjtRQXREaUIsb0JBQWUsR0FBRyxZQUFZLENBQWtDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRWxIOzs7O1dBSUc7UUFDZ0IsVUFBSyxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1RDs7OztXQUlHO1FBQ2dCLFdBQU0sR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVoRCxxQkFBZ0IsR0FBRyxTQUFTLENBQWtDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBRWxIOzs7O1dBSUc7UUFDZ0IsMEJBQXFCLEdBQUcsUUFBUSxDQUFnQyxHQUFHLEVBQUU7WUFDcEYsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQ3pCLElBQUksQ0FBQyxLQUFLLEVBQUU7aUJBQ1AsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ2hDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQzdCLENBQUM7WUFDRixPQUFPO2dCQUNILFNBQVMsRUFBRSxhQUFhO2dCQUN4QixhQUFhLEVBQUUsYUFBYTthQUMvQixDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSDs7OztXQUlHO1FBQ2dCLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvRjs7Ozs7V0FLRztRQUNNLHlCQUFvQixHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRTdELGVBQVUsR0FBRyxNQUFNLENBQTBCLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELG1CQUFjLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDOUMsb0JBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFHdkQsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQzthQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUM7YUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFFUCxLQUFLLENBQ0QsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFDMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BGO2FBQ0ksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDMUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSyxxQkFBcUI7UUFDekIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN6RCxPQUFPO2dCQUNILE1BQU07Z0JBQ04sT0FBTyxFQUFFLEtBQUssS0FBSyxDQUFDO2dCQUNwQixNQUFNLEVBQUUsS0FBSyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDbkMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUM7YUFDckMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN6RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUMvRSxNQUFNLFdBQVcsR0FBRyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzdDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLGFBQWEsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hFLE1BQU0sZUFBZSxHQUFHLENBQUMsb0JBQW9CO2dCQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDO2dCQUNyQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNoQyxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDakMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQTBCLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsb0JBQW9CO2dCQUN6QyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN6QyxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztnQkFDbEYsTUFBTSxzQkFBc0IsR0FBRyxLQUFLO3FCQUMvQixNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO3FCQUNqQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxhQUFhLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztnQkFDOUYsSUFBSSxvQkFBb0IsR0FBRyxzQkFBc0IsR0FBRyxXQUFXLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQzVFLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2YsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQ2pDLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELDRFQUE0RTtJQUNwRSxRQUFRLENBQUksS0FBVSxFQUFFLFNBQTJEO1FBQ3ZGLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO2lJQTlJUSxnQkFBZ0I7cUhBQWhCLGdCQUFnQixxVUFRa0IsZUFBZSxzRUFPakIsc0JBQXNCLDBJQWRxQyxVQUFVLHdIQWdCVixVQUFVLDZDQXpEcEc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQWlDVCwyaEJBbENTLGdCQUFnQjs7MkZBeUNqQixnQkFBZ0I7a0JBNUM1QixTQUFTO2lDQUNNLElBQUksWUFDTixvQkFBb0IsV0FDckIsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaUNULFFBRUs7d0JBQ0YsS0FBSyxFQUFFLG9CQUFvQjtxQkFDOUIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZW50T2JzZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb2JzZXJ2ZXJzJztcbmltcG9ydCB7IFNoYXJlZFJlc2l6ZU9ic2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL29ic2VydmVycy9wcml2YXRlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBjb250ZW50Q2hpbGQsXG4gICAgY29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBzaWduYWwsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgdmlld0NoaWxkLFxuICAgIHZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtZXJnZSwgc2tpcCB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFRlbXBsYXRlIGNvbnRleHQgZm9yIHRoZSBgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdGAgZGlyZWN0aXZlLlxuICpcbiAqIEBzZWUgYEticU92ZXJmbG93SXRlbXNSZXN1bHRgXG4gKi9cbmV4cG9ydCB0eXBlIEticU92ZXJmbG93SXRlbXNSZXN1bHRDb250ZXh0ID0ge1xuICAgIC8qKlxuICAgICAqIFNldCBvZiBoaWRkZW4gaXRlbSBJRCdzLlxuICAgICAqXG4gICAgICogRXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUga2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdCBsZXQtaGlkZGVuSXRlbUlEcz5cbiAgICAgKiAge3sgaGlkZGVuSXRlbUlEcy5zaXplIH19XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBgXG4gICAgICovXG4gICAgJGltcGxpY2l0OiBSZWFkb25seVNldDx1bmtub3duPjtcbiAgICAvKipcbiAgICAgKiBTZXQgb2YgaGlkZGVuIGl0ZW0gSUQncy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlIGticU92ZXJmbG93SXRlbXNSZXN1bHQgbGV0LWhpZGRlbkl0ZW1JRHM9XCJoaWRkZW5JdGVtSURzXCI+XG4gICAgICogIEBpZiAoaGlkZGVuSXRlbUlEcy5oYXMoU09NRV9JRCkpIHsuLi59XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBgXG4gICAgICovXG4gICAgaGlkZGVuSXRlbUlEczogUmVhZG9ubHlTZXQ8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgcHJvdmlkaW5nIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0Q29udGV4dGAgdG8gdGhlIGBLYnFPdmVyZmxvd0l0ZW1zYCBjb21wb25lbnQuXG4gKlxuICogQHNlZSBgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdENvbnRleHRgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtrYnFPdmVyZmxvd0l0ZW1zUmVzdWx0XSdcbn0pXG5leHBvcnQgY2xhc3MgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGVtcGxhdGVSZWYgZm9yIHRoZSBvdmVyZmxvdyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgdGVtcGxhdGVSZWYgPSBpbmplY3Q8VGVtcGxhdGVSZWY8S2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdENvbnRleHQ+PihUZW1wbGF0ZVJlZik7XG59XG5cbi8qKlxuICogU3RydWN0dXJlIGRpcmVjdGl2ZSBmb3IgcHJvdmlkaW5nIGl0ZW1zIHRvIHRoZSBgS2JxT3ZlcmZsb3dJdGVtc2AuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdba2JxT3ZlcmZsb3dJdGVtXSdcbn0pXG5leHBvcnQgY2xhc3MgS2JxT3ZlcmZsb3dJdGVtIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIGZvciB0aGUgaXRlbS5cbiAgICAgKi9cbiAgICByZWFkb25seSBpZCA9IGlucHV0LnJlcXVpcmVkKHsgYWxpYXM6ICdrYnFPdmVyZmxvd0l0ZW0nIH0pO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgaXRlbSBpcyBoaWRkZW4uXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGlkZGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIFRlbXBsYXRlUmVmIGZvciB0aGUgaXRlbS5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSB0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZik7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBhdXRvbWF0aWNhbGx5IGhpZGluZyBlbGVtZW50cyB3aXRoIGR5bmFtaWMgYWRhcHRhdGlvbiB0byB0aGUgY29udGFpbmVyIHdpZHRoLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAna2JxLW92ZXJmbG93LWl0ZW1zJyxcbiAgICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldF0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgQGlmIChyZXZlcnNlT3ZlcmZsb3dPcmRlcigpKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbS5pZCgpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrYnEtb3ZlcmZsb3ctaXRlbXNfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICNpdGVtUmVmXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXRlbS5oaWRkZW4oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmticS1vdmVyZmxvdy1pdGVtc19faXRlbV9oaWRkZW5dPVwiaXRlbS5oaWRkZW4oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtLnRlbXBsYXRlUmVmXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmICghcmV2ZXJzZU92ZXJmbG93T3JkZXIoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwia2JxLW92ZXJmbG93LWl0ZW1zX19yZXN1bHRcIlxuICAgICAgICAgICAgICAgICNyZXN1bHRSZWZcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCJyZXN1bHRIaWRkZW4oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmticS1vdmVyZmxvdy1pdGVtc19fcmVzdWx0X2hpZGRlbl09XCJyZXN1bHRIaWRkZW4oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXN1bHQoKT8udGVtcGxhdGVSZWYgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJyZXN1bHRUZW1wbGF0ZUNvbnRleHQoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG4gICAgc3R5bGVVcmw6ICcuL292ZXJmbG93LWl0ZW1zLnNjc3MnLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdrYnEtb3ZlcmZsb3ctaXRlbXMnXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBLYnFPdmVyZmxvd0l0ZW1zIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1FbGVtZW50UmVmcyA9IHZpZXdDaGlsZHJlbjxzdHJpbmcsIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PignaXRlbVJlZicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAgIC8qKlxuICAgICAqIGBLYnFPdmVyZmxvd0l0ZW1gIGRpcmVjdGl2ZSByZWZlcmVuY2VzLlxuICAgICAqXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpdGVtcyA9IGNvbnRlbnRDaGlsZHJlbihLYnFPdmVyZmxvd0l0ZW0pO1xuXG4gICAgLyoqXG4gICAgICogYEticU92ZXJmbG93SXRlbXNSZXN1bHRgIGRpcmVjdGl2ZSByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdCA9IGNvbnRlbnRDaGlsZChLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdWx0RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxzdHJpbmcsIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PigncmVzdWx0UmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0YCBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdFRlbXBsYXRlQ29udGV4dCA9IGNvbXB1dGVkPEticU92ZXJmbG93SXRlbXNSZXN1bHRDb250ZXh0PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpZGRlbkl0ZW1JRHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeyBoaWRkZW4gfSkgPT4gaGlkZGVuKCkpXG4gICAgICAgICAgICAgICAgLm1hcCgoeyBpZCB9KSA9PiBpZCgpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiBoaWRkZW5JdGVtSURzLFxuICAgICAgICAgICAgaGlkZGVuSXRlbUlEczogaGlkZGVuSXRlbUlEc1xuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgb3ZlcmZsb3cgcmVzdWx0IGlzIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzdWx0SGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuaXRlbXMoKS5zb21lKCh7IGhpZGRlbiB9KSA9PiBoaWRkZW4oKSkpO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgb3ZlcmZsb3cgb3JkZXIgc2hvdWxkIGJlIHJldmVyc2VkLlxuICAgICAqIEFsc28gY2hhbmdlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGByZXN1bHRUZW1wbGF0ZVJlZmAuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJldmVyc2VPdmVyZmxvd09yZGVyID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2l6ZU9ic2VydmVyID0gaW5qZWN0KFNoYXJlZFJlc2l6ZU9ic2VydmVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnRPYnNlcnZlciA9IGluamVjdChDb250ZW50T2JzZXJ2ZXIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnJldmVyc2VPdmVyZmxvd09yZGVyKVxuICAgICAgICAgICAgLnBpcGUoc2tpcCgxKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zKCkuZm9yRWFjaCgoeyBoaWRkZW4gfSkgPT4gaGlkZGVuLnNldChmYWxzZSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5pdGVtcyksXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLFxuICAgICAgICAgICAgdGhpcy5jb250ZW50T2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkucGlwZShkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtc1Zpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgaXRlbXMgYmFzZWQgb24gdGhlIGNvbnRhaW5lciB3aWR0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgd2hldGhlciBpdGVtcyBzaG91bGQgYmUgaGlkZGVuIG9yIHNob3duIGJ5IGNvbXBhcmluZyB0aGUgc2Nyb2xsIHdpZHRoIG9mIHRoZSBjb250YWluZXJcbiAgICAgKiB3aXRoIGl0cyB2aXNpYmxlIHdpZHRoLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGl0ZW1zIGFyZSB2aXNpYmxlIGFuZCB3aGljaCBhcmUgaGlkZGVuLCBhbmQgYXBwbGllcyB0aGUgaGlkaW5nIGxvZ2ljXG4gICAgICogYmFzZWQgb24gdGhlIGByZXZlcnNlT3ZlcmZsb3dPcmRlcmAgZmxhZy5cbiAgICAgKlxuICAgICAqIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyByZWN1cnNpdmVseSB0byBhZGp1c3QgdGhlIHZpc2liaWxpdHkgb2YgaXRlbXMgdW50aWwgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiBpcyByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIC0gSWYgdGhlIGNvbnRhaW5lciBpcyBvdmVyZmxvd24sIGl0IGhpZGVzIHRoZSBsYXN0IHZpc2libGUgaXRlbSBmcm9tIHRoZSBlbmQgKG9yIHN0YXJ0IGlmIGByZXZlcnNlT3ZlcmZsb3dPcmRlcmApXG4gICAgICogYW5kIGNoZWNrcyBpZiBmdXJ0aGVyIGFkanVzdG1lbnRzIGFyZSBuZWVkZWQuXG4gICAgICogLSBJZiB0aGUgY29udGFpbmVyIGlzIG5vdCBvdmVyZmxvd24sIGl0IHJldmVhbHMgdGhlIGZpcnN0IGhpZGRlbiBpdGVtIGZyb20gdGhlIHN0YXJ0XG4gICAgICogKG9yIGVuZCBpZiBgcmV2ZXJzZU92ZXJmbG93T3JkZXJgKSwgZW5zdXJpbmcgaXQgZml0cyB3aXRoaW4gdGhlIHZpc2libGUgYXJlYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZUl0ZW1zVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnRSZWZzID0gdGhpcy5pdGVtRWxlbWVudFJlZnMoKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCkubWFwKCh7IGhpZGRlbiB9LCBpbmRleCwgX2l0ZW1zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhpZGRlbixcbiAgICAgICAgICAgICAgICBpc0ZpcnN0OiBpbmRleCA9PT0gMCxcbiAgICAgICAgICAgICAgICBpc0xhc3Q6IGluZGV4ID09PSBfaXRlbXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmOiBpdGVtRWxlbWVudFJlZnNbaW5kZXhdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZU92ZXJmbG93T3JkZXIgPSB0aGlzLnJldmVyc2VPdmVyZmxvd09yZGVyKCk7XG4gICAgICAgIGNvbnN0IGlzRWRnZUl0ZW0gPSAoeyBpc0ZpcnN0LCBpc0xhc3QgfTogKHR5cGVvZiBpdGVtcylbbnVtYmVyXSkgPT4gKHJldmVyc2VPdmVyZmxvd09yZGVyID8gaXNGaXJzdCA6IGlzTGFzdCk7XG4gICAgICAgIGNvbnN0IHsgb2Zmc2V0V2lkdGg6IHRvdGFsV2lkdGgsIHNjcm9sbFdpZHRoIH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNPdmVyZmxvd24gPSBzY3JvbGxXaWR0aCA+IHRvdGFsV2lkdGg7XG4gICAgICAgIGlmIChpc092ZXJmbG93bikge1xuICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlSXRlbSA9ICh7IGhpZGRlbiB9OiAodHlwZW9mIGl0ZW1zKVtudW1iZXJdKSA9PiAhaGlkZGVuKCk7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmlzaWJsZUl0ZW0gPSAhcmV2ZXJzZU92ZXJmbG93T3JkZXJcbiAgICAgICAgICAgICAgICA/IHRoaXMuZmluZExhc3QoaXRlbXMsIGlzVmlzaWJsZUl0ZW0pXG4gICAgICAgICAgICAgICAgOiBpdGVtcy5maW5kKGlzVmlzaWJsZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKGxhc3RWaXNpYmxlSXRlbSkge1xuICAgICAgICAgICAgICAgIGxhc3RWaXNpYmxlSXRlbS5oaWRkZW4uc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghaXNFZGdlSXRlbShsYXN0VmlzaWJsZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbXNWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNIaWRkZW5JdGVtID0gKHsgaGlkZGVuIH06ICh0eXBlb2YgaXRlbXMpW251bWJlcl0pID0+IGhpZGRlbigpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RIaWRkZW5JdGVtID0gIXJldmVyc2VPdmVyZmxvd09yZGVyXG4gICAgICAgICAgICAgICAgPyBpdGVtcy5maW5kKGlzSGlkZGVuSXRlbSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuZmluZExhc3QoaXRlbXMsIGlzSGlkZGVuSXRlbSk7XG4gICAgICAgICAgICBpZiAoZmlyc3RIaWRkZW5JdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RIaWRkZW5JdGVtV2lkdGggPSBmaXJzdEhpZGRlbkl0ZW0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2libGVJdGVtc1RvdGFsV2lkdGggPSBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IGhpZGRlbiB9KSA9PiAhaGlkZGVuKCkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHdpZHRoLCB7IGVsZW1lbnRSZWYgfSkgPT4gd2lkdGggKyBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pc0VkZ2VJdGVtID0gaXNFZGdlSXRlbShmaXJzdEhpZGRlbkl0ZW0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFdpZHRoID0gX2lzRWRnZUl0ZW0gPyAwIDogdGhpcy5yZXN1bHRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RIaWRkZW5JdGVtV2lkdGggKyB2aXNpYmxlSXRlbXNUb3RhbFdpZHRoICsgcmVzdWx0V2lkdGggPD0gdG90YWxXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEhpZGRlbkl0ZW0uaGlkZGVuLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2lzRWRnZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbXNWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQFRPRE8gU2hvdWxkIHVzZSBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0YCBhZnRlciBtaWdyYXRpbmcgdG8gRVMyMDIzICovXG4gICAgcHJpdmF0ZSBmaW5kTGFzdDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0sIGksIGFycmF5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbiJdfQ==
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctaXRlbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL292ZXJmbG93LWl0ZW1zL292ZXJmbG93LWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFDZixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVHLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFFakQ7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyx3QkFBd0I7SUFMckM7UUFNcUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5Qzs7OztXQUlHO1FBQ00sZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV6Qzs7OztXQUlHO1FBQ00sV0FBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztLQXVCbkM7SUFyQkc7Ozs7T0FJRztJQUNILElBQUk7UUFDQSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFh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QUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBT0Q7O09BRUc7SUFDSyxTQUFTO1FBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7SUFDL0MsQ0FBQztpSUE1SVEsZ0JBQWdCO3FIQUFoQixnQkFBZ0IsbWZBTWdCLGVBQWUsc0VBT2pCLHNCQUFzQjs7MkZBYnBELGdCQUFnQjtrQkFONUIsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFO2lCQUN4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNoYXJlZFJlc2l6ZU9ic2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL29ic2VydmVycy9wcml2YXRlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBjb250ZW50Q2hpbGQsXG4gICAgY29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBudW1iZXJBdHRyaWJ1dGUsXG4gICAgb3V0cHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBvdXRwdXRUb09ic2VydmFibGUsIHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWVyZ2UsIHNraXAgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBlbGVtZW50LlxuICpcbiAqIEBkb2NzLXByaXZhdGVcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuYXJpYS1oaWRkZW5dJzogJ2hpZGRlbigpJ1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgRWxlbWVudFZpc2liaWxpdHlNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaGlkZGVuLlxuICAgICAqXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhpZGRlbiA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBIaWRlcyB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBoaWRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgICAgIHRoaXMuaGlkZGVuLnNldCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBzaG93KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmlzaWJpbGl0eScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nKTtcbiAgICAgICAgdGhpcy5oaWRkZW4uc2V0KGZhbHNlKTtcbiAgICB9XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBkaXNwbGF5aW5nIHRoZSByZXN1bHQgb2YgaGlkZGVuIGl0ZW1zIGJ5IHRoZSBgS2JxT3ZlcmZsb3dJdGVtc2AgZGlyZWN0aXZlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnW2ticU92ZXJmbG93SXRlbXNSZXN1bHRdJyxcbiAgICBleHBvcnRBczogJ2ticU92ZXJmbG93SXRlbXNSZXN1bHQnLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdrYnEtb3ZlcmZsb3ctaXRlbXMtcmVzdWx0JyB9XG59KVxuZXhwb3J0IGNsYXNzIEticU92ZXJmbG93SXRlbXNSZXN1bHQgZXh0ZW5kcyBFbGVtZW50VmlzaWJpbGl0eU1hbmFnZXIge31cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIHRoZSBpdGVtIHRoYXQgY2FuIGJlIGhpZGRlbiBieSB0aGUgYEticU92ZXJmbG93SXRlbXNgIGRpcmVjdGl2ZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1trYnFPdmVyZmxvd0l0ZW1dJyxcbiAgICBleHBvcnRBczogJ2ticU92ZXJmbG93SXRlbScsXG4gICAgaG9zdDogeyBjbGFzczogJ2ticS1vdmVyZmxvdy1pdGVtJyB9XG59KVxuZXhwb3J0IGNsYXNzIEticU92ZXJmbG93SXRlbSBleHRlbmRzIEVsZW1lbnRWaXNpYmlsaXR5TWFuYWdlciB7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpdGVtLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkID0gaW5wdXQucmVxdWlyZWQoeyBhbGlhczogJ2ticU92ZXJmbG93SXRlbScgfSk7XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBtYW5hZ2luZyB0aGUgdmlzaWJpbGl0eSBvZiBpdGVtcyB0aGF0IG92ZXJmbG93IHRoZSBjb250YWluZXIuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdba2JxT3ZlcmZsb3dJdGVtc10nLFxuICAgIGV4cG9ydEFzOiAna2JxT3ZlcmZsb3dJdGVtcycsXG4gICAgaG9zdDogeyBjbGFzczogJ2ticS1vdmVyZmxvdy1pdGVtcycgfVxufSlcbmV4cG9ydCBjbGFzcyBLYnFPdmVyZmxvd0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBgS2JxT3ZlcmZsb3dJdGVtYCBkaXJlY3RpdmUgcmVmZXJlbmNlcy5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1zID0gY29udGVudENoaWxkcmVuKEticU92ZXJmbG93SXRlbSk7XG5cbiAgICAvKipcbiAgICAgKiBgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdGAgZGlyZWN0aXZlIHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3VsdCA9IGNvbnRlbnRDaGlsZChLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0KTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIG92ZXJmbG93IG9yZGVyIHNob3VsZCBiZSByZXZlcnNlZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmV2ZXJzZU92ZXJmbG93T3JkZXIgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgICAvKipcbiAgICAgKiBEZWJvdW5jZSB0aW1lIGZvciByZWNhbGN1bGF0aW5nIGl0ZW1zIHZpc2liaWxpdHkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAxMDBcbiAgICAgKi9cbiAgICByZWFkb25seSBkZWJvdW5jZVRpbWUgPSBpbnB1dCgxMDAsIHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIHRoZSBzZXQgb2YgaGlkZGVuIGl0ZW1zIGNoYW5nZXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY2hhbmdlcyA9IG91dHB1dDxSZWFkb25seVNldDx1bmtub3duPj4oKTtcblxuICAgIC8qKlxuICAgICAqIFNldCBvZiBoaWRkZW4gaXRlbSBJRHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGlkZGVuSXRlbUlEcyA9IHRvU2lnbmFsKG91dHB1dFRvT2JzZXJ2YWJsZSh0aGlzLmNoYW5nZXMpLCB7XG4gICAgICAgIGluaXRpYWxWYWx1ZTogbmV3IFNldDx1bmtub3duPihbXSkgYXMgUmVhZG9ubHlTZXQ8dW5rbm93bj5cbiAgICB9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNpemVPYnNlcnZlciA9IGluamVjdChTaGFyZWRSZXNpemVPYnNlcnZlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKCk7XG5cbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5pdGVtcyksXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5yZXZlcnNlT3ZlcmZsb3dPcmRlcikucGlwZShza2lwKDEpKSxcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKCkpLCB0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpZGRlbkl0ZW1zID0gdGhpcy5jYWxjdWxhdGVJdGVtc1Zpc2liaWxpdHkoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlT3ZlcmZsb3dPcmRlcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgaGlkZGVuSXRlbUlEcyA9IG5ldyBTZXQoaGlkZGVuSXRlbXMubWFwKCh7IGlkIH0pID0+IGlkKCkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdChoaWRkZW5JdGVtSURzKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgaXRlbXMsIGJhc2VkIG9uIHRoZSBjb250YWluZXIgd2lkdGggYW5kIGByZXZlcnNlT3ZlcmZsb3dPcmRlcmAgcHJvcGVydHkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJdGVtc1Zpc2liaWxpdHkoXG4gICAgICAgIGl0ZW1zOiByZWFkb25seSBLYnFPdmVyZmxvd0l0ZW1bXSxcbiAgICAgICAgcmV2ZXJzZU92ZXJmbG93T3JkZXI6IGJvb2xlYW4sXG4gICAgICAgIHJlc3VsdDogS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdCB8IHVuZGVmaW5lZCxcbiAgICAgICAgeyBvZmZzZXRXaWR0aDogdG90YWxXaWR0aCB9OiBIVE1MRWxlbWVudFxuICAgICk6IEticU92ZXJmbG93SXRlbVtdIHtcbiAgICAgICAgcmVzdWx0Py5oaWRlKCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2hvdygpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGl0ZW1zV2lkdGggPSBpdGVtcy5yZWR1Y2UoXG4gICAgICAgICAgICAod2lkdGgsIHsgZWxlbWVudFJlZiB9KSA9PiB3aWR0aCArIHRoaXMuZ2V0RWxlbWVudFdpZHRoV2l0aE1hcmdpbnMoZWxlbWVudFJlZiksXG4gICAgICAgICAgICAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSByZXZlcnNlT3ZlcmZsb3dPcmRlciA/IDAgOiBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHJldmVyc2VPdmVyZmxvd09yZGVyID8gaXRlbXMubGVuZ3RoIDogLTE7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSByZXZlcnNlT3ZlcmZsb3dPcmRlciA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgcmVzdWx0V2lkdGggPSByZXN1bHQgPyB0aGlzLmdldEVsZW1lbnRXaWR0aFdpdGhNYXJnaW5zKHJlc3VsdC5lbGVtZW50UmVmKSA6IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggIT09IGVuZEluZGV4OyBpbmRleCArPSBzdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5nZXRFbGVtZW50V2lkdGhXaXRoTWFyZ2lucyhjdXJyZW50LmVsZW1lbnRSZWYpO1xuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdFdpZHRoID0gaXRlbXMuc29tZSh0aGlzLmlzSGlkZGVuSXRlbSkgPyByZXN1bHRXaWR0aCA6IDA7XG4gICAgICAgICAgICBpZiAoaXRlbXNXaWR0aCArIF9yZXN1bHRXaWR0aCA+IHRvdGFsV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICBpdGVtc1dpZHRoIC09IGN1cnJlbnRXaWR0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNFZGdlRWxlbWVudCA9IHJldmVyc2VPdmVyZmxvd09yZGVyID8gaW5kZXggPT09IDAgOiBpbmRleCA9PT0gaXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICBjb25zdCBfcmVzdWx0V2lkdGggPSBpc0VkZ2VFbGVtZW50ID8gMCA6IHJlc3VsdFdpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtc1dpZHRoICsgY3VycmVudFdpZHRoICsgX3Jlc3VsdFdpZHRoIDw9IHRvdGFsV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zV2lkdGggKz0gY3VycmVudFdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoaWRkZW5JdGVtcyA9IGl0ZW1zLmZpbHRlcih0aGlzLmlzSGlkZGVuSXRlbSk7XG4gICAgICAgIGlmIChoaWRkZW5JdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQ/LnNob3coKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlkZGVuSXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIGVsZW1lbnQgaW5jbHVkaW5nIG1hcmdpbnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRFbGVtZW50V2lkdGhXaXRoTWFyZ2lucyh7IG5hdGl2ZUVsZW1lbnQgfTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IG1hcmdpbkxlZnQsIG1hcmdpblJpZ2h0IH0gPSB0aGlzLmdldFdpbmRvdygpLmdldENvbXB1dGVkU3R5bGUobmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwocGFyc2VGbG9hdChtYXJnaW5MZWZ0KSArIG5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyBwYXJzZUZsb2F0KG1hcmdpblJpZ2h0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgbmVjZXNzYXJ5IHN0eWxlcyBmb3IgdGhlIGRpcmVjdGl2ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFN0eWxlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZsZXgtd3JhcCcsICdub3dyYXAnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZsZXgtZ3JvdycsICcxJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdvdmVyZmxvdycsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGhpZGRlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzSGlkZGVuSXRlbSA9ICh7IGhpZGRlbiB9OiBLYnFPdmVyZmxvd0l0ZW0pID0+IGhpZGRlbigpO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd2luZG93IG9iamVjdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFdpbmRvdygpOiBXaW5kb3cge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgfVxufVxuIl19
|