@marcura/marcura-combobox 6.1.0 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2020/lib/combobox.injectables.mjs +5 -5
- package/esm2020/lib/combobox.module.mjs +103 -103
- package/esm2020/lib/components/abstract-combobox/abstract-combobox.component.mjs +240 -240
- package/esm2020/lib/components/abstract-dropdown/abstract-dropdown.component.mjs +230 -230
- package/esm2020/lib/components/combobox/combobox.component.mjs +365 -361
- package/esm2020/lib/components/combobox-popup-footer/combobox-popup-footer.component.mjs +38 -38
- package/esm2020/lib/components/dropdown/dropdown.component.mjs +234 -234
- package/esm2020/lib/components/multiselect/multiselect.component.mjs +247 -247
- package/esm2020/lib/directives/combobox-item-template.directive.mjs +13 -13
- package/esm2020/lib/directives/dropdown-item-template.directive.mjs +13 -13
- package/esm2020/lib/directives/dropdown-value-template.directive.mjs +13 -13
- package/esm2020/lib/directives/multiselect-item-template.directive.mjs +13 -13
- package/esm2020/lib/directives/multiselect-tag-template.directive.mjs +13 -13
- package/esm2020/lib/directives/multiselect-tag-wrapper.directive.mjs +60 -60
- package/esm2020/lib/model/combobox-changed.event.mjs +4 -4
- package/esm2020/lib/model/combobox-item.type.mjs +12 -12
- package/esm2020/lib/model/combobox-kendo-component.interface.mjs +2 -2
- package/esm2020/lib/model/combobox-localization.interface.mjs +2 -2
- package/esm2020/lib/model/combobox-search-fn.type.mjs +1 -1
- package/esm2020/lib/model/combobox-search-settings-operator.enum.mjs +6 -6
- package/esm2020/lib/model/combobox-search-settings.interface.mjs +2 -2
- package/esm2020/lib/model/dropdown-changed.event.mjs +4 -4
- package/esm2020/lib/model/dropdown-kendo-component.interface.mjs +2 -2
- package/esm2020/lib/model/dropdown-localization.interface.mjs +2 -2
- package/esm2020/lib/model/dropdown-localizer.interface.mjs +2 -2
- package/esm2020/lib/model/multiselect-changed.event.mjs +4 -4
- package/esm2020/lib/model/multiselect-localization.interface.mjs +2 -2
- package/esm2020/marcura-marcura-combobox.mjs +4 -4
- package/esm2020/public-api.mjs +25 -25
- package/fesm2015/marcura-marcura-combobox.mjs +1482 -1478
- package/fesm2015/marcura-marcura-combobox.mjs.map +1 -1
- package/fesm2020/marcura-marcura-combobox.mjs +1477 -1473
- package/fesm2020/marcura-marcura-combobox.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/combobox.injectables.d.ts +8 -8
- package/lib/combobox.module.d.ts +25 -25
- package/lib/components/abstract-combobox/abstract-combobox.component.d.ts +59 -59
- package/lib/components/abstract-dropdown/abstract-dropdown.component.d.ts +76 -76
- package/lib/components/combobox/combobox.component.d.ts +65 -64
- package/lib/components/combobox-popup-footer/combobox-popup-footer.component.d.ts +13 -13
- package/lib/components/dropdown/dropdown.component.d.ts +45 -45
- package/lib/components/multiselect/multiselect.component.d.ts +51 -51
- package/lib/directives/combobox-item-template.directive.d.ts +5 -5
- package/lib/directives/dropdown-item-template.directive.d.ts +5 -5
- package/lib/directives/dropdown-value-template.directive.d.ts +5 -5
- package/lib/directives/multiselect-item-template.directive.d.ts +5 -5
- package/lib/directives/multiselect-tag-template.directive.d.ts +5 -5
- package/lib/directives/multiselect-tag-wrapper.directive.d.ts +21 -21
- package/lib/model/combobox-changed.event.d.ts +3 -3
- package/lib/model/combobox-item.type.d.ts +4 -4
- package/lib/model/combobox-kendo-component.interface.d.ts +7 -7
- package/lib/model/combobox-localization.interface.d.ts +5 -5
- package/lib/model/combobox-search-fn.type.d.ts +3 -3
- package/lib/model/combobox-search-settings-operator.enum.d.ts +4 -4
- package/lib/model/combobox-search-settings.interface.d.ts +5 -5
- package/lib/model/dropdown-changed.event.d.ts +3 -3
- package/lib/model/dropdown-kendo-component.interface.d.ts +6 -6
- package/lib/model/dropdown-localization.interface.d.ts +3 -3
- package/lib/model/dropdown-localizer.interface.d.ts +5 -5
- package/lib/model/multiselect-changed.event.d.ts +3 -3
- package/lib/model/multiselect-localization.interface.d.ts +5 -5
- package/package.json +1 -1
- package/public-api.d.ts +24 -24
|
@@ -1,247 +1,247 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, forwardRef, HostBinding, Inject, Input, Optional, Renderer2, TemplateRef, ViewChild, } from '@angular/core';
|
|
2
|
-
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { ABSTRACT_CONTROL_COMPONENT, OPENABLE_CONTROL_COMPONENT, STATEABLE_CONTROL_COMPONENT, TYPEABLE_CONTROL_COMPONENT, } from '@marcura/marcura-common';
|
|
4
|
-
import { MultiSelectComponent } from '@progress/kendo-angular-dropdowns';
|
|
5
|
-
import { filter } from 'rxjs/operators';
|
|
6
|
-
import { MULTISELECT_LOCALIZER } from '../../combobox.injectables';
|
|
7
|
-
import { MultiselectItemTemplateDirective } from '../../directives/multiselect-item-template.directive';
|
|
8
|
-
import { MultiselectTagTemplateDirective } from '../../directives/multiselect-tag-template.directive';
|
|
9
|
-
import { MultiselectChangedEvent } from '../../model/multiselect-changed.event';
|
|
10
|
-
import { AbstractComboboxComponent } from '../abstract-combobox/abstract-combobox.component';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@angular/common";
|
|
13
|
-
import * as i2 from "@angular/forms";
|
|
14
|
-
import * as i3 from "@progress/kendo-angular-dropdowns";
|
|
15
|
-
import * as i4 from "@marcura/marcura-tag";
|
|
16
|
-
import * as i5 from "../combobox-popup-footer/combobox-popup-footer.component";
|
|
17
|
-
import * as i6 from "../../directives/multiselect-tag-wrapper.directive";
|
|
18
|
-
export class MultiselectComponent extends AbstractComboboxComponent {
|
|
19
|
-
get hasValue() {
|
|
20
|
-
return this.valueFormControl.value && this.valueFormControl.value.length > 0;
|
|
21
|
-
}
|
|
22
|
-
get hasIsFocusedCssClass() {
|
|
23
|
-
return this.isFocused;
|
|
24
|
-
}
|
|
25
|
-
get hasIsHoveredCssClass() {
|
|
26
|
-
return this._isHovered.value;
|
|
27
|
-
}
|
|
28
|
-
get hasIsDisabledCssClass() {
|
|
29
|
-
return this.isDisabled;
|
|
30
|
-
}
|
|
31
|
-
get isSuccessType() {
|
|
32
|
-
return this._isSuccessType;
|
|
33
|
-
}
|
|
34
|
-
get isErrorType() {
|
|
35
|
-
return this._isErrorType;
|
|
36
|
-
}
|
|
37
|
-
get isWarningType() {
|
|
38
|
-
return this._isWarningType;
|
|
39
|
-
}
|
|
40
|
-
get isHighlightedState() {
|
|
41
|
-
return this._isHighlightedState;
|
|
42
|
-
}
|
|
43
|
-
get hasIsLoadingCssClass() {
|
|
44
|
-
return this.isLoading || this._isSearching.value;
|
|
45
|
-
}
|
|
46
|
-
get hasHasResetCssClass() {
|
|
47
|
-
return this.hasReset;
|
|
48
|
-
}
|
|
49
|
-
get hasIsOutlineCssClass() {
|
|
50
|
-
return this.isOutline;
|
|
51
|
-
}
|
|
52
|
-
get loadingText() {
|
|
53
|
-
return this._loadingText || this._localization.loadingText;
|
|
54
|
-
}
|
|
55
|
-
set loadingText(loadingText) {
|
|
56
|
-
this._loadingText = loadingText;
|
|
57
|
-
}
|
|
58
|
-
get noItemsText() {
|
|
59
|
-
return this._noItemsText || this._localization.noItemsText;
|
|
60
|
-
}
|
|
61
|
-
set noItemsText(noItemsText) {
|
|
62
|
-
this._noItemsText = noItemsText;
|
|
63
|
-
}
|
|
64
|
-
get minSearchText() {
|
|
65
|
-
return this._minSearchText || this._localization.minSearchText;
|
|
66
|
-
}
|
|
67
|
-
set minSearchText(minSearchText) {
|
|
68
|
-
this._minSearchText = minSearchText;
|
|
69
|
-
}
|
|
70
|
-
get popupSettings() {
|
|
71
|
-
return {
|
|
72
|
-
animate: true,
|
|
73
|
-
popupClass: `sg-multiselect-popup${this.isGroupable ? ' sg-multiselect-popup--is-groupable' : ''} ${this.popupClass || ''}`,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
constructor(changeDetectorRef, renderer, _localizer) {
|
|
77
|
-
super(changeDetectorRef, renderer);
|
|
78
|
-
this._localizer = _localizer;
|
|
79
|
-
this.valueFormControl = new FormControl();
|
|
80
|
-
this._loadingText = null;
|
|
81
|
-
this._noItemsText = null;
|
|
82
|
-
this._minSearchText = null;
|
|
83
|
-
this._localization = {
|
|
84
|
-
loadingText: 'Loading...',
|
|
85
|
-
noItemsText: 'No items found.',
|
|
86
|
-
minSearchText: 'Enter {minSearchCharacters} or more characters.',
|
|
87
|
-
};
|
|
88
|
-
this.defaultValue = [];
|
|
89
|
-
this.itemTemplate = null;
|
|
90
|
-
this.tagTemplate = null;
|
|
91
|
-
this.hasCssClass = true;
|
|
92
|
-
this.isReadOnlyTag = null;
|
|
93
|
-
this.isActivatedTag = () => false;
|
|
94
|
-
this.tagColor = () => null;
|
|
95
|
-
this._localize();
|
|
96
|
-
}
|
|
97
|
-
ngOnInit() {
|
|
98
|
-
this._setComponent(this.component);
|
|
99
|
-
this.init();
|
|
100
|
-
// Opened.
|
|
101
|
-
this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen)), () => {
|
|
102
|
-
this._hasSearched.next(false);
|
|
103
|
-
if (!this.areItemsCached && this._loadedItems.value.length === 0) {
|
|
104
|
-
this.loadItems(this._searchText.value);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen)), () => this.opened.emit());
|
|
108
|
-
}
|
|
109
|
-
_emitChanged(value) {
|
|
110
|
-
this.changed.emit(new MultiselectChangedEvent(value));
|
|
111
|
-
}
|
|
112
|
-
hasValueChanged(value) {
|
|
113
|
-
const isOldValueEmpty = this.value === null || this.value === undefined || this.value.length === 0;
|
|
114
|
-
const isNewValueEmpty = value === null || value === undefined || value.length === 0;
|
|
115
|
-
if (isOldValueEmpty && isNewValueEmpty) {
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
|
-
if (isOldValueEmpty || isNewValueEmpty) {
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
return (this.value.length !== value.length || this.value.some((item, index) => !this.isItemEqual(item, value[index])));
|
|
122
|
-
}
|
|
123
|
-
_localize() {
|
|
124
|
-
if (!this._localizer) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
this._localization = this._localizer.localization;
|
|
128
|
-
this._observer.listen(this._localizer.localizationChanged, (localization) => {
|
|
129
|
-
this._localization = localization;
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
MultiselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MultiselectComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: MULTISELECT_LOCALIZER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
134
|
-
MultiselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MultiselectComponent, selector: "sg-multiselect", inputs: { formControl: "formControl", loadingText: "loadingText", noItemsText: "noItemsText", minSearchText: "minSearchText", isReadOnlyTag: "isReadOnlyTag", isActivatedTag: "isActivatedTag", tagColor: "tagColor" }, host: { properties: { "class.sg-multiselect": "this.hasCssClass", "class.sg-multiselect--has-value": "this.hasValue", "class.sg-multiselect--is-focused": "this.hasIsFocusedCssClass", "class.sg-multiselect--is-hovered": "this.hasIsHoveredCssClass", "class.sg-multiselect--is-disabled": "this.hasIsDisabledCssClass", "class.sg-multiselect--type-success": "this.isSuccessType", "class.sg-multiselect--type-error": "this.isErrorType", "class.sg-multiselect--type-warning": "this.isWarningType", "class.sg-multiselect--state-highlighted": "this.isHighlightedState", "class.sg-multiselect--is-loading": "this.hasIsLoadingCssClass", "class.sg-multiselect--has-reset": "this.hasHasResetCssClass", "class.sg-multiselect--is-outline": "this.hasIsOutlineCssClass" } }, providers: [
|
|
135
|
-
{
|
|
136
|
-
provide: NG_VALUE_ACCESSOR,
|
|
137
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
138
|
-
multi: true,
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
provide: ABSTRACT_CONTROL_COMPONENT,
|
|
142
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
provide: OPENABLE_CONTROL_COMPONENT,
|
|
146
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
provide: STATEABLE_CONTROL_COMPONENT,
|
|
150
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
provide: TYPEABLE_CONTROL_COMPONENT,
|
|
154
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
155
|
-
},
|
|
156
|
-
], queries: [{ propertyName: "itemTemplate", first: true, predicate: MultiselectItemTemplateDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "tagTemplate", first: true, predicate: MultiselectTagTemplateDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<kendo-multiselect\
|
|
157
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MultiselectComponent, decorators: [{
|
|
158
|
-
type: Component,
|
|
159
|
-
args: [{ selector: 'sg-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
160
|
-
{
|
|
161
|
-
provide: NG_VALUE_ACCESSOR,
|
|
162
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
163
|
-
multi: true,
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
provide: ABSTRACT_CONTROL_COMPONENT,
|
|
167
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
provide: OPENABLE_CONTROL_COMPONENT,
|
|
171
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
provide: STATEABLE_CONTROL_COMPONENT,
|
|
175
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
provide: TYPEABLE_CONTROL_COMPONENT,
|
|
179
|
-
useExisting: forwardRef(() => MultiselectComponent),
|
|
180
|
-
},
|
|
181
|
-
], template: "<kendo-multiselect\
|
|
182
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
|
|
183
|
-
type: Optional
|
|
184
|
-
}, {
|
|
185
|
-
type: Inject,
|
|
186
|
-
args: [MULTISELECT_LOCALIZER]
|
|
187
|
-
}] }]; }, propDecorators: { formControl: [{
|
|
188
|
-
type: Input
|
|
189
|
-
}], component: [{
|
|
190
|
-
type: ViewChild,
|
|
191
|
-
args: ['component', { static: true }]
|
|
192
|
-
}], itemTemplate: [{
|
|
193
|
-
type: ContentChild,
|
|
194
|
-
args: [MultiselectItemTemplateDirective, { read: TemplateRef, static: true }]
|
|
195
|
-
}], tagTemplate: [{
|
|
196
|
-
type: ContentChild,
|
|
197
|
-
args: [MultiselectTagTemplateDirective, { read: TemplateRef, static: true }]
|
|
198
|
-
}], hasCssClass: [{
|
|
199
|
-
type: HostBinding,
|
|
200
|
-
args: ['class.sg-multiselect']
|
|
201
|
-
}], hasValue: [{
|
|
202
|
-
type: HostBinding,
|
|
203
|
-
args: ['class.sg-multiselect--has-value']
|
|
204
|
-
}], hasIsFocusedCssClass: [{
|
|
205
|
-
type: HostBinding,
|
|
206
|
-
args: ['class.sg-multiselect--is-focused']
|
|
207
|
-
}], hasIsHoveredCssClass: [{
|
|
208
|
-
type: HostBinding,
|
|
209
|
-
args: ['class.sg-multiselect--is-hovered']
|
|
210
|
-
}], hasIsDisabledCssClass: [{
|
|
211
|
-
type: HostBinding,
|
|
212
|
-
args: ['class.sg-multiselect--is-disabled']
|
|
213
|
-
}], isSuccessType: [{
|
|
214
|
-
type: HostBinding,
|
|
215
|
-
args: ['class.sg-multiselect--type-success']
|
|
216
|
-
}], isErrorType: [{
|
|
217
|
-
type: HostBinding,
|
|
218
|
-
args: ['class.sg-multiselect--type-error']
|
|
219
|
-
}], isWarningType: [{
|
|
220
|
-
type: HostBinding,
|
|
221
|
-
args: ['class.sg-multiselect--type-warning']
|
|
222
|
-
}], isHighlightedState: [{
|
|
223
|
-
type: HostBinding,
|
|
224
|
-
args: ['class.sg-multiselect--state-highlighted']
|
|
225
|
-
}], hasIsLoadingCssClass: [{
|
|
226
|
-
type: HostBinding,
|
|
227
|
-
args: ['class.sg-multiselect--is-loading']
|
|
228
|
-
}], hasHasResetCssClass: [{
|
|
229
|
-
type: HostBinding,
|
|
230
|
-
args: ['class.sg-multiselect--has-reset']
|
|
231
|
-
}], hasIsOutlineCssClass: [{
|
|
232
|
-
type: HostBinding,
|
|
233
|
-
args: ['class.sg-multiselect--is-outline']
|
|
234
|
-
}], loadingText: [{
|
|
235
|
-
type: Input
|
|
236
|
-
}], noItemsText: [{
|
|
237
|
-
type: Input
|
|
238
|
-
}], minSearchText: [{
|
|
239
|
-
type: Input
|
|
240
|
-
}], isReadOnlyTag: [{
|
|
241
|
-
type: Input
|
|
242
|
-
}], isActivatedTag: [{
|
|
243
|
-
type: Input
|
|
244
|
-
}], tagColor: [{
|
|
245
|
-
type: Input
|
|
246
|
-
}] } });
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL211bHRpc2VsZWN0L211bHRpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tdWx0aXNlbGVjdC9tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQiwwQkFBMEIsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUMsb0JBQW9CLEVBQWdCLE1BQU0sbUNBQW1DLENBQUM7QUFDdEYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQ3RHLE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBRXBHLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRTlFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7OztBQThCM0YsTUFBTSxPQUFPLG9CQUE0QixTQUFRLHlCQUEyRTtJ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QixXQUFXO3VCQUFDLGlDQUFpQztnQkFLbkMsb0JBQW9CO3NCQUQ5QixXQUFXO3VCQUFDLGtDQUFrQztnQkFLcEMsV0FBVztzQkFEckIsS0FBSztnQkFRSyxXQUFXO3NCQURyQixLQUFLO2dCQVFLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBUUMsYUFBYTtzQkFEbkIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLFFBQVE7c0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFCU1RSQUNUX0NPTlRST0xfQ09NUE9ORU5ULFxuICBPUEVOQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgU1RBVEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICBUWVBFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS1jb21tb24nO1xuaW1wb3J0IHtUYWdDb2xvcn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS10YWcnO1xuaW1wb3J0IHtNdWx0aVNlbGVjdENvbXBvbmVudCwgUG9wdXBTZXR0aW5nc30gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01VTFRJU0VMRUNUX0xPQ0FMSVpFUn0gZnJvbSAnLi4vLi4vY29tYm9ib3guaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHtNdWx0aXNlbGVjdEl0ZW1UZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9tdWx0aXNlbGVjdC1pdGVtLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge011bHRpc2VsZWN0VGFnVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbXVsdGlzZWxlY3QtdGFnLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0lEcm9wZG93bkxvY2FsaXplcn0gZnJvbSAnLi4vLi4vbW9kZWwvZHJvcGRvd24tbG9jYWxpemVyLmludGVyZmFjZSc7XG5pbXBvcnQge011bHRpc2VsZWN0Q2hhbmdlZEV2ZW50fSBmcm9tICcuLi8uLi9tb2RlbC9tdWx0aXNlbGVjdC1jaGFuZ2VkLmV2ZW50JztcbmltcG9ydCB7SU11bHRpc2VsZWN0TG9jYWxpemF0aW9ufSBmcm9tICcuLi8uLi9tb2RlbC9tdWx0aXNlbGVjdC1sb2NhbGl6YXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7QWJzdHJhY3RDb21ib2JveENvbXBvbmVudH0gZnJvbSAnLi4vYWJzdHJhY3QtY29tYm9ib3gvYWJzdHJhY3QtY29tYm9ib3guY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ctbXVsdGlzZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJ211bHRpc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBQlNUUkFDVF9DT05UUk9MX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpc2VsZWN0Q29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE9QRU5BQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogU1RBVEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogVFlQRUFCTEVfQ09OVFJPTF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aXNlbGVjdENvbXBvbmVudCksXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlzZWxlY3RDb21wb25lbnQ8VEl0ZW0+IGV4dGVuZHMgQWJzdHJhY3RDb21ib2JveENvbXBvbmVudDxUSXRlbSwgVEl0ZW1bXSwgTXVsdGlzZWxlY3RDaGFuZ2VkRXZlbnQ8VEl0ZW1bXT4+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZvcm1Db250cm9sITogRm9ybUNvbnRyb2w8VEl0ZW1bXT47XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSB2YWx1ZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDxUSXRlbVtdPiA9IG5ldyBGb3JtQ29udHJvbCgpO1xuXG4gIHByaXZhdGUgX2xvYWRpbmdUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbm9JdGVtc1RleHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9taW5TZWFyY2hUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uOiBJTXVsdGlzZWxlY3RMb2NhbGl6YXRpb24gPSB7XG4gICAgbG9hZGluZ1RleHQ6ICdMb2FkaW5nLi4uJyxcbiAgICBub0l0ZW1zVGV4dDogJ05vIGl0ZW1zIGZvdW5kLicsXG4gICAgbWluU2VhcmNoVGV4dDogJ0VudGVyIHttaW5TZWFyY2hDaGFyYWN0ZXJzfSBvciBtb3JlIGNoYXJhY3RlcnMuJyxcbiAgfTtcbiAgcHVibGljIG92ZXJyaWRlIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVEl0ZW1bXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHtzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgY29tcG9uZW50ITogTXVsdGlTZWxlY3RDb21wb25lbnQ7XG4gIEBDb250ZW50Q2hpbGQoTXVsdGlzZWxlY3RJdGVtVGVtcGxhdGVEaXJlY3RpdmUsIHtyZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlfSlcbiAgcHVibGljIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xuICBAQ29udGVudENoaWxkKE11bHRpc2VsZWN0VGFnVGVtcGxhdGVEaXJlY3RpdmUsIHtyZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlfSlcbiAgcHVibGljIHRhZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QnKVxuICBwdWJsaWMgcmVhZG9ubHkgaGFzQ3NzQ2xhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLW11bHRpc2VsZWN0LS1oYXMtdmFsdWUnKVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGhhc1ZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlRm9ybUNvbnRyb2wudmFsdWUgJiYgdGhpcy52YWx1ZUZvcm1Db250cm9sLnZhbHVlLmxlbmd0aCA+IDA7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0taXMtZm9jdXNlZCcpXG4gIHB1YmxpYyBnZXQgaGFzSXNGb2N1c2VkQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNGb2N1c2VkO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLWlzLWhvdmVyZWQnKVxuICBwdWJsaWMgZ2V0IGhhc0lzSG92ZXJlZENzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0hvdmVyZWQudmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0taXMtZGlzYWJsZWQnKVxuICBwdWJsaWMgZ2V0IGhhc0lzRGlzYWJsZWRDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLXR5cGUtc3VjY2VzcycpXG4gIHB1YmxpYyBnZXQgaXNTdWNjZXNzVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdWNjZXNzVHlwZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLW11bHRpc2VsZWN0LS10eXBlLWVycm9yJylcbiAgcHVibGljIGdldCBpc0Vycm9yVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFcnJvclR5cGU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0tdHlwZS13YXJuaW5nJylcbiAgcHVibGljIGdldCBpc1dhcm5pbmdUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1dhcm5pbmdUeXBlO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLXN0YXRlLWhpZ2hsaWdodGVkJylcbiAgcHVibGljIGdldCBpc0hpZ2hsaWdodGVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSGlnaGxpZ2h0ZWRTdGF0ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLW11bHRpc2VsZWN0LS1pcy1sb2FkaW5nJylcbiAgcHVibGljIGdldCBoYXNJc0xvYWRpbmdDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5faXNTZWFyY2hpbmcudmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0taGFzLXJlc2V0JylcbiAgcHVibGljIGdldCBoYXNIYXNSZXNldENzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Jlc2V0O1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLWlzLW91dGxpbmUnKVxuICBwdWJsaWMgZ2V0IGhhc0lzT3V0bGluZUNzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT3V0bGluZTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGxvYWRpbmdUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdUZXh0IHx8IHRoaXMuX2xvY2FsaXphdGlvbi5sb2FkaW5nVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IGxvYWRpbmdUZXh0KGxvYWRpbmdUZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2FkaW5nVGV4dCA9IGxvYWRpbmdUZXh0O1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbm9JdGVtc1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbm9JdGVtc1RleHQgfHwgdGhpcy5fbG9jYWxpemF0aW9uLm5vSXRlbXNUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgbm9JdGVtc1RleHQobm9JdGVtc1RleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX25vSXRlbXNUZXh0ID0gbm9JdGVtc1RleHQ7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBtaW5TZWFyY2hUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21pblNlYXJjaFRleHQgfHwgdGhpcy5fbG9jYWxpemF0aW9uLm1pblNlYXJjaFRleHQ7XG4gIH1cbiAgcHVibGljIHNldCBtaW5TZWFyY2hUZXh0KG1pblNlYXJjaFRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX21pblNlYXJjaFRleHQgPSBtaW5TZWFyY2hUZXh0O1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpc1JlYWRPbmx5VGFnOiAoKGl0ZW06IFRJdGVtKSA9PiBib29sZWFuKSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNBY3RpdmF0ZWRUYWc6IChpdGVtOiBUSXRlbSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGFnQ29sb3I6IChpdGVtOiBUSXRlbSkgPT4gVGFnQ29sb3IgfCBudWxsID0gKCkgPT4gbnVsbDtcbiAgcHVibGljIGdldCBwb3B1cFNldHRpbmdzKCk6IFBvcHVwU2V0dGluZ3Mge1xuICAgIHJldHVybiB7XG4gICAgICBhbmltYXRlOiB0cnVlLFxuICAgICAgcG9wdXBDbGFzczogYHNnLW11bHRpc2VsZWN0LXBvcHVwJHt0aGlzLmlzR3JvdXBhYmxlID8gJyBzZy1tdWx0aXNlbGVjdC1wb3B1cC0taXMtZ3JvdXBhYmxlJyA6ICcnfSAke1xuICAgICAgICB0aGlzLnBvcHVwQ2xhc3MgfHwgJydcbiAgICAgIH1gLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1VTFRJU0VMRUNUX0xPQ0FMSVpFUilcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2NhbGl6ZXI6IElEcm9wZG93bkxvY2FsaXplcjxJTXVsdGlzZWxlY3RMb2NhbGl6YXRpb24+XG4gICkge1xuICAgIHN1cGVyKGNoYW5nZURldGVjdG9yUmVmLCByZW5kZXJlcik7XG4gICAgdGhpcy5fbG9jYWxpemUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgLy8gT3BlbmVkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9pc09wZW4ucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5pc09wZW4pKSwgKCkgPT4ge1xuICAgICAgdGhpcy5faGFzU2VhcmNoZWQubmV4dChmYWxzZSk7XG5cbiAgICAgIGlmICghdGhpcy5hcmVJdGVtc0NhY2hlZCAmJiB0aGlzLl9sb2FkZWRJdGVtcy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2FkSXRlbXModGhpcy5fc2VhcmNoVGV4dC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIubGlzdGVuKHRoaXMuX2lzT3Blbi5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmlzT3BlbikpLCAoKSA9PiB0aGlzLm9wZW5lZC5lbWl0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9lbWl0Q2hhbmdlZCh2YWx1ZTogVEl0ZW1bXSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlZC5lbWl0KG5ldyBNdWx0aXNlbGVjdENoYW5nZWRFdmVudCh2YWx1ZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhhc1ZhbHVlQ2hhbmdlZCh2YWx1ZTogVEl0ZW1bXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzT2xkVmFsdWVFbXB0eTogYm9vbGVhbiA9IHRoaXMudmFsdWUgPT09IG51bGwgfHwgdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmFsdWUubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IGlzTmV3VmFsdWVFbXB0eTogYm9vbGVhbiA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwO1xuXG4gICAgaWYgKGlzT2xkVmFsdWVFbXB0eSAmJiBpc05ld1ZhbHVlRW1wdHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNPbGRWYWx1ZUVtcHR5IHx8IGlzTmV3VmFsdWVFbXB0eSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudmFsdWUubGVuZ3RoICE9PSB2YWx1ZS5sZW5ndGggfHwgdGhpcy52YWx1ZS5zb21lKChpdGVtLCBpbmRleCkgPT4gIXRoaXMuaXNJdGVtRXF1YWwoaXRlbSwgdmFsdWVbaW5kZXhdKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9jYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9sb2NhbGl6ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSB0aGlzLl9sb2NhbGl6ZXIubG9jYWxpemF0aW9uO1xuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9sb2NhbGl6ZXIubG9jYWxpemF0aW9uQ2hhbmdlZCwgKGxvY2FsaXphdGlvbikgPT4ge1xuICAgICAgdGhpcy5fbG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgIH0pO1xuICB9XG59XG4iLCI8a2VuZG8tbXVsdGlzZWxlY3RcclxuICAjY29tcG9uZW50XHJcbiAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICBbZm9ybUNvbnRyb2xdPVwidmFsdWVGb3JtQ29udHJvbFwiXHJcbiAgW2RhdGFdPVwiY29tYmluZWRJdGVtcyB8IGFzeW5jXCJcclxuICBbZmlsdGVyYWJsZV09XCJpc1NlYXJjaGFibGVcIlxyXG4gIFt2YWx1ZUZpZWxkXT1cInZhbHVlS2V5XCJcclxuICBbdGV4dEZpZWxkXT1cInRleHRLZXlcIlxyXG4gIFtsb2FkaW5nXT1cImlzTG9hZGluZ1NwaW5uZXJWaXNpYmxlIHwgYXN5bmNcIlxyXG4gIFtjbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgW3BvcHVwU2V0dGluZ3NdPVwicG9wdXBTZXR0aW5nc1wiXHJcbiAgW2xpc3RIZWlnaHRdPVwibGlzdEhlaWdodFwiXHJcbiAgW3ZhbHVlUHJpbWl0aXZlXT1cImlzUHJpbWl0aXZlVmFsdWVcIlxyXG4gIChmaWx0ZXJDaGFuZ2UpPVwib25TZWFyY2hlZCgkZXZlbnQpXCJcclxuICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2VkKCRldmVudClcIlxyXG4gIChvcGVuKT1cIm9uT3BlbmVkKClcIlxyXG4gIChjbG9zZSk9XCJvbkNsb3NlZCgpXCJcclxuICAoZm9jdXMpPVwib25Gb2N1c2VkKClcIlxyXG4gIChibHVyKT1cIm9uQmx1cnJlZCgpXCJcclxuPlxyXG4gIDxuZy10ZW1wbGF0ZSBrZW5kb0Ryb3BEb3duTGlzdEZvb3RlclRlbXBsYXRlPlxyXG4gICAgPHNnLWNvbWJvYm94LXBvcHVwLWZvb3RlclxyXG4gICAgICBbaXNMb2FkaW5nVGV4dFZpc2libGVdPVwiaXNMb2FkaW5nVGV4dFZpc2libGUgfCBhc3luY1wiXHJcbiAgICAgIFtpc05vSXRlbXNUZXh0VmlzaWJsZV09XCJpc05vSXRlbXNUZXh0VmlzaWJsZSB8IGFzeW5jXCJcclxuICAgICAgW2lzTWluU2VhcmNoVGV4dFZpc2libGVdPVwiaXNNaW5TZWFyY2hUZXh0VmlzaWJsZSB8IGFzeW5jXCJcclxuICAgICAgW2xvYWRpbmdUZXh0XT1cImxvYWRpbmdUZXh0XCJcclxuICAgICAgW25vSXRlbXNUZXh0XT1cIm5vSXRlbXNUZXh0XCJcclxuICAgICAgW21pblNlYXJjaFRleHRdPVwibWluU2VhcmNoVGV4dFwiXHJcbiAgICAgIFttaW5TZWFyY2hDaGFyYWN0ZXJzXT1cIm1pblNlYXJjaENoYXJhY3RlcnNcIlxyXG4gICAgPlxyXG4gICAgPC9zZy1jb21ib2JveC1wb3B1cC1mb290ZXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8bmctdGVtcGxhdGUga2VuZG9Ecm9wRG93bkxpc3ROb0RhdGFUZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIml0ZW1UZW1wbGF0ZVwiIGtlbmRvTXVsdGlTZWxlY3RJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxyXG4gICAgPHNwYW4gW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOiBkYXRhSXRlbX1cIj48L3NwYW4+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdFRhZ1RlbXBsYXRlIGxldC1kYXRhSXRlbT5cclxuICAgIDxzcGFuXHJcbiAgICAgICN0YWdXcmFwcGVyPVwibXVsdGlzZWxlY3RUYWdXcmFwcGVyXCJcclxuICAgICAgc2dNdWx0aXNlbGVjdFRhZ1dyYXBwZXJcclxuICAgICAgW2lzUmVhZE9ubHldPVwiaXNSZWFkT25seVRhZyAmJiBpc1JlYWRPbmx5VGFnKGRhdGFJdGVtKVwiXHJcbiAgICA+XHJcbiAgICAgIDxzZy10YWdcclxuICAgICAgICBbaWNvbl09XCJ0YWdXcmFwcGVyLmlzUmVhZE9ubHkgPyAnJyA6ICdmYXIgZmEtdGltZXMnXCJcclxuICAgICAgICBbY29sb3JdPVwidGFnQ29sb3IoZGF0YUl0ZW0pXCJcclxuICAgICAgICBbaXNBY3RpdmF0ZWRdPVwiaXNBY3RpdmF0ZWRUYWcoZGF0YUl0ZW0pXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWdUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRhZ1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOiBkYXRhSXRlbX1cIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhZ1RlbXBsYXRlXCI+e3sgZGF0YUl0ZW1bdGV4dEZpZWxkXSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3NnLXRhZz5cclxuICAgIDwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2tlbmRvLW11bHRpc2VsZWN0PlxyXG48ZGl2IGNsYXNzPVwic2ctbXVsdGlzZWxlY3RfX3Jlc2V0XCIgKm5nSWY9XCIhaXNEaXNhYmxlZFwiIChjbGljayk9XCJvblJlc2V0Q2xpY2tlZCgpXCI+XHJcbiAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXNcIj48L2k+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwic2ctbXVsdGlzZWxlY3RfX3N0YXRlLWxpbmVcIj48L2Rpdj5cclxuIl19
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, forwardRef, HostBinding, Inject, Input, Optional, Renderer2, TemplateRef, ViewChild, } from '@angular/core';
|
|
2
|
+
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { ABSTRACT_CONTROL_COMPONENT, OPENABLE_CONTROL_COMPONENT, STATEABLE_CONTROL_COMPONENT, TYPEABLE_CONTROL_COMPONENT, } from '@marcura/marcura-common';
|
|
4
|
+
import { MultiSelectComponent } from '@progress/kendo-angular-dropdowns';
|
|
5
|
+
import { filter } from 'rxjs/operators';
|
|
6
|
+
import { MULTISELECT_LOCALIZER } from '../../combobox.injectables';
|
|
7
|
+
import { MultiselectItemTemplateDirective } from '../../directives/multiselect-item-template.directive';
|
|
8
|
+
import { MultiselectTagTemplateDirective } from '../../directives/multiselect-tag-template.directive';
|
|
9
|
+
import { MultiselectChangedEvent } from '../../model/multiselect-changed.event';
|
|
10
|
+
import { AbstractComboboxComponent } from '../abstract-combobox/abstract-combobox.component';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/common";
|
|
13
|
+
import * as i2 from "@angular/forms";
|
|
14
|
+
import * as i3 from "@progress/kendo-angular-dropdowns";
|
|
15
|
+
import * as i4 from "@marcura/marcura-tag";
|
|
16
|
+
import * as i5 from "../combobox-popup-footer/combobox-popup-footer.component";
|
|
17
|
+
import * as i6 from "../../directives/multiselect-tag-wrapper.directive";
|
|
18
|
+
export class MultiselectComponent extends AbstractComboboxComponent {
|
|
19
|
+
get hasValue() {
|
|
20
|
+
return this.valueFormControl.value && this.valueFormControl.value.length > 0;
|
|
21
|
+
}
|
|
22
|
+
get hasIsFocusedCssClass() {
|
|
23
|
+
return this.isFocused;
|
|
24
|
+
}
|
|
25
|
+
get hasIsHoveredCssClass() {
|
|
26
|
+
return this._isHovered.value;
|
|
27
|
+
}
|
|
28
|
+
get hasIsDisabledCssClass() {
|
|
29
|
+
return this.isDisabled;
|
|
30
|
+
}
|
|
31
|
+
get isSuccessType() {
|
|
32
|
+
return this._isSuccessType;
|
|
33
|
+
}
|
|
34
|
+
get isErrorType() {
|
|
35
|
+
return this._isErrorType;
|
|
36
|
+
}
|
|
37
|
+
get isWarningType() {
|
|
38
|
+
return this._isWarningType;
|
|
39
|
+
}
|
|
40
|
+
get isHighlightedState() {
|
|
41
|
+
return this._isHighlightedState;
|
|
42
|
+
}
|
|
43
|
+
get hasIsLoadingCssClass() {
|
|
44
|
+
return this.isLoading || this._isSearching.value;
|
|
45
|
+
}
|
|
46
|
+
get hasHasResetCssClass() {
|
|
47
|
+
return this.hasReset;
|
|
48
|
+
}
|
|
49
|
+
get hasIsOutlineCssClass() {
|
|
50
|
+
return this.isOutline;
|
|
51
|
+
}
|
|
52
|
+
get loadingText() {
|
|
53
|
+
return this._loadingText || this._localization.loadingText;
|
|
54
|
+
}
|
|
55
|
+
set loadingText(loadingText) {
|
|
56
|
+
this._loadingText = loadingText;
|
|
57
|
+
}
|
|
58
|
+
get noItemsText() {
|
|
59
|
+
return this._noItemsText || this._localization.noItemsText;
|
|
60
|
+
}
|
|
61
|
+
set noItemsText(noItemsText) {
|
|
62
|
+
this._noItemsText = noItemsText;
|
|
63
|
+
}
|
|
64
|
+
get minSearchText() {
|
|
65
|
+
return this._minSearchText || this._localization.minSearchText;
|
|
66
|
+
}
|
|
67
|
+
set minSearchText(minSearchText) {
|
|
68
|
+
this._minSearchText = minSearchText;
|
|
69
|
+
}
|
|
70
|
+
get popupSettings() {
|
|
71
|
+
return {
|
|
72
|
+
animate: true,
|
|
73
|
+
popupClass: `sg-multiselect-popup${this.isGroupable ? ' sg-multiselect-popup--is-groupable' : ''} ${this.popupClass || ''}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
constructor(changeDetectorRef, renderer, _localizer) {
|
|
77
|
+
super(changeDetectorRef, renderer);
|
|
78
|
+
this._localizer = _localizer;
|
|
79
|
+
this.valueFormControl = new FormControl();
|
|
80
|
+
this._loadingText = null;
|
|
81
|
+
this._noItemsText = null;
|
|
82
|
+
this._minSearchText = null;
|
|
83
|
+
this._localization = {
|
|
84
|
+
loadingText: 'Loading...',
|
|
85
|
+
noItemsText: 'No items found.',
|
|
86
|
+
minSearchText: 'Enter {minSearchCharacters} or more characters.',
|
|
87
|
+
};
|
|
88
|
+
this.defaultValue = [];
|
|
89
|
+
this.itemTemplate = null;
|
|
90
|
+
this.tagTemplate = null;
|
|
91
|
+
this.hasCssClass = true;
|
|
92
|
+
this.isReadOnlyTag = null;
|
|
93
|
+
this.isActivatedTag = () => false;
|
|
94
|
+
this.tagColor = () => null;
|
|
95
|
+
this._localize();
|
|
96
|
+
}
|
|
97
|
+
ngOnInit() {
|
|
98
|
+
this._setComponent(this.component);
|
|
99
|
+
this.init();
|
|
100
|
+
// Opened.
|
|
101
|
+
this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen)), () => {
|
|
102
|
+
this._hasSearched.next(false);
|
|
103
|
+
if (!this.areItemsCached && this._loadedItems.value.length === 0) {
|
|
104
|
+
this.loadItems(this._searchText.value);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
this._observer.listen(this._isOpen.pipe(filter((event) => event.isOpen)), () => this.opened.emit());
|
|
108
|
+
}
|
|
109
|
+
_emitChanged(value) {
|
|
110
|
+
this.changed.emit(new MultiselectChangedEvent(value));
|
|
111
|
+
}
|
|
112
|
+
hasValueChanged(value) {
|
|
113
|
+
const isOldValueEmpty = this.value === null || this.value === undefined || this.value.length === 0;
|
|
114
|
+
const isNewValueEmpty = value === null || value === undefined || value.length === 0;
|
|
115
|
+
if (isOldValueEmpty && isNewValueEmpty) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (isOldValueEmpty || isNewValueEmpty) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return (this.value.length !== value.length || this.value.some((item, index) => !this.isItemEqual(item, value[index])));
|
|
122
|
+
}
|
|
123
|
+
_localize() {
|
|
124
|
+
if (!this._localizer) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
this._localization = this._localizer.localization;
|
|
128
|
+
this._observer.listen(this._localizer.localizationChanged, (localization) => {
|
|
129
|
+
this._localization = localization;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
MultiselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MultiselectComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: MULTISELECT_LOCALIZER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
134
|
+
MultiselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: MultiselectComponent, selector: "sg-multiselect", inputs: { formControl: "formControl", loadingText: "loadingText", noItemsText: "noItemsText", minSearchText: "minSearchText", isReadOnlyTag: "isReadOnlyTag", isActivatedTag: "isActivatedTag", tagColor: "tagColor" }, host: { properties: { "class.sg-multiselect": "this.hasCssClass", "class.sg-multiselect--has-value": "this.hasValue", "class.sg-multiselect--is-focused": "this.hasIsFocusedCssClass", "class.sg-multiselect--is-hovered": "this.hasIsHoveredCssClass", "class.sg-multiselect--is-disabled": "this.hasIsDisabledCssClass", "class.sg-multiselect--type-success": "this.isSuccessType", "class.sg-multiselect--type-error": "this.isErrorType", "class.sg-multiselect--type-warning": "this.isWarningType", "class.sg-multiselect--state-highlighted": "this.isHighlightedState", "class.sg-multiselect--is-loading": "this.hasIsLoadingCssClass", "class.sg-multiselect--has-reset": "this.hasHasResetCssClass", "class.sg-multiselect--is-outline": "this.hasIsOutlineCssClass" } }, providers: [
|
|
135
|
+
{
|
|
136
|
+
provide: NG_VALUE_ACCESSOR,
|
|
137
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
138
|
+
multi: true,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
provide: ABSTRACT_CONTROL_COMPONENT,
|
|
142
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
provide: OPENABLE_CONTROL_COMPONENT,
|
|
146
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
provide: STATEABLE_CONTROL_COMPONENT,
|
|
150
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
provide: TYPEABLE_CONTROL_COMPONENT,
|
|
154
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
155
|
+
},
|
|
156
|
+
], queries: [{ propertyName: "itemTemplate", first: true, predicate: MultiselectItemTemplateDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "tagTemplate", first: true, predicate: MultiselectTagTemplateDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<kendo-multiselect\n #component\n [placeholder]=\"placeholder\"\n [formControl]=\"valueFormControl\"\n [data]=\"combinedItems | async\"\n [filterable]=\"isSearchable\"\n [valueField]=\"valueKey\"\n [textField]=\"textKey\"\n [loading]=\"isLoadingSpinnerVisible | async\"\n [clearButton]=\"false\"\n [popupSettings]=\"popupSettings\"\n [listHeight]=\"listHeight\"\n [valuePrimitive]=\"isPrimitiveValue\"\n (filterChange)=\"onSearched($event)\"\n (valueChange)=\"onChanged($event)\"\n (open)=\"onOpened()\"\n (close)=\"onClosed()\"\n (focus)=\"onFocused()\"\n (blur)=\"onBlurred()\"\n>\n <ng-template kendoDropDownListFooterTemplate>\n <sg-combobox-popup-footer\n [isLoadingTextVisible]=\"isLoadingTextVisible | async\"\n [isNoItemsTextVisible]=\"isNoItemsTextVisible | async\"\n [isMinSearchTextVisible]=\"isMinSearchTextVisible | async\"\n [loadingText]=\"loadingText\"\n [noItemsText]=\"noItemsText\"\n [minSearchText]=\"minSearchText\"\n [minSearchCharacters]=\"minSearchCharacters\"\n >\n </sg-combobox-popup-footer>\n </ng-template>\n <ng-template kendoDropDownListNoDataTemplate></ng-template>\n <ng-template *ngIf=\"itemTemplate\" kendoMultiSelectItemTemplate let-dataItem>\n <span [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\"></span>\n </ng-template>\n <ng-template kendoMultiSelectTagTemplate let-dataItem>\n <span\n #tagWrapper=\"multiselectTagWrapper\"\n sgMultiselectTagWrapper\n [isReadOnly]=\"isReadOnlyTag && isReadOnlyTag(dataItem)\"\n >\n <sg-tag\n [icon]=\"tagWrapper.isReadOnly ? '' : 'far fa-times'\"\n [color]=\"tagColor(dataItem)\"\n [isActivated]=\"isActivatedTag(dataItem)\"\n >\n <ng-container *ngIf=\"tagTemplate\" [ngTemplateOutlet]=\"tagTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\">\n </ng-container>\n <ng-container *ngIf=\"!tagTemplate\">{{ dataItem[textField] }}</ng-container>\n </sg-tag>\n </span>\n </ng-template>\n</kendo-multiselect>\n<div class=\"sg-multiselect__reset\" *ngIf=\"!isDisabled\" (click)=\"onResetClicked()\">\n <i class=\"far fa-times\"></i>\n</div>\n<div class=\"sg-multiselect__state-line\"></div>\n", dependencies: [{ 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FooterTemplateDirective, selector: "[kendoDropDownListFooterTemplate],[kendoComboBoxFooterTemplate],[kendoDropDownTreeFooterTemplate],[kendoMultiColumnComboBoxFooterTemplate],[kendoAutoCompleteFooterTemplate],[kendoMultiSelectFooterTemplate],[kendoMultiSelectTreeFooterTemplate]" }, { kind: "directive", type: i3.ItemTemplateDirective, selector: "[kendoDropDownListItemTemplate],[kendoComboBoxItemTemplate],[kendoAutoCompleteItemTemplate],[kendoMultiSelectItemTemplate]" }, { kind: "directive", type: i3.NoDataTemplateDirective, selector: "[kendoDropDownListNoDataTemplate],[kendoDropDownTreeNoDataTemplate],[kendoComboBoxNoDataTemplate],[kendoMultiColumnComboBoxNoDataTemplate],[kendoAutoCompleteNoDataTemplate],[kendoMultiSelectNoDataTemplate],[kendoMultiSelectTreeNoDataTemplate]" }, { kind: "directive", type: i3.TagTemplateDirective, selector: "[kendoMultiSelectTagTemplate],[kendoMultiSelectTreeTagTemplate]" }, { kind: "component", type: i3.MultiSelectComponent, selector: "kendo-multiselect", inputs: ["focusableId", "autoClose", "tabindex", "disabled", "readonly", "filterable", "listHeight", "clearButton", "tagMapper", "allowCustom", "valueNormalizer", "data", "value", "tabIndex", "placeholder", "itemDisabled", "checkboxes", "virtual", "popupSettings", "valuePrimitive", "loading", "valueField", "textField"], outputs: ["filterChange", "valueChange", "open", "opened", "close", "closed", "focus", "blur", "removeTag"], exportAs: ["kendoMultiSelect"] }, { kind: "component", type: i4.TagComponent, selector: "sg-tag", inputs: ["isBorderless", "color", "icon", "isActivated", "isDisabled", "isLoading", "isFocusable", "isHoverable", "isReadOnly"], outputs: ["clicked", "focused", "blurred", "iconClicked", "spinnerClicked"] }, { kind: "component", type: i5.ComboboxPopupFooterComponent, selector: "sg-combobox-popup-footer", inputs: ["isLoadingTextVisible", "isNoItemsTextVisible", "isMinSearchTextVisible", "loadingText", "noItemsText", "minSearchText", "minSearchCharacters"] }, { kind: "directive", type: i6.MultiselectTagWrapperDirective, selector: "[sgMultiselectTagWrapper]", inputs: ["isReadOnly"], exportAs: ["multiselectTagWrapper"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: MultiselectComponent, decorators: [{
|
|
158
|
+
type: Component,
|
|
159
|
+
args: [{ selector: 'sg-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
160
|
+
{
|
|
161
|
+
provide: NG_VALUE_ACCESSOR,
|
|
162
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
163
|
+
multi: true,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
provide: ABSTRACT_CONTROL_COMPONENT,
|
|
167
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
provide: OPENABLE_CONTROL_COMPONENT,
|
|
171
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
provide: STATEABLE_CONTROL_COMPONENT,
|
|
175
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
provide: TYPEABLE_CONTROL_COMPONENT,
|
|
179
|
+
useExisting: forwardRef(() => MultiselectComponent),
|
|
180
|
+
},
|
|
181
|
+
], template: "<kendo-multiselect\n #component\n [placeholder]=\"placeholder\"\n [formControl]=\"valueFormControl\"\n [data]=\"combinedItems | async\"\n [filterable]=\"isSearchable\"\n [valueField]=\"valueKey\"\n [textField]=\"textKey\"\n [loading]=\"isLoadingSpinnerVisible | async\"\n [clearButton]=\"false\"\n [popupSettings]=\"popupSettings\"\n [listHeight]=\"listHeight\"\n [valuePrimitive]=\"isPrimitiveValue\"\n (filterChange)=\"onSearched($event)\"\n (valueChange)=\"onChanged($event)\"\n (open)=\"onOpened()\"\n (close)=\"onClosed()\"\n (focus)=\"onFocused()\"\n (blur)=\"onBlurred()\"\n>\n <ng-template kendoDropDownListFooterTemplate>\n <sg-combobox-popup-footer\n [isLoadingTextVisible]=\"isLoadingTextVisible | async\"\n [isNoItemsTextVisible]=\"isNoItemsTextVisible | async\"\n [isMinSearchTextVisible]=\"isMinSearchTextVisible | async\"\n [loadingText]=\"loadingText\"\n [noItemsText]=\"noItemsText\"\n [minSearchText]=\"minSearchText\"\n [minSearchCharacters]=\"minSearchCharacters\"\n >\n </sg-combobox-popup-footer>\n </ng-template>\n <ng-template kendoDropDownListNoDataTemplate></ng-template>\n <ng-template *ngIf=\"itemTemplate\" kendoMultiSelectItemTemplate let-dataItem>\n <span [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\"></span>\n </ng-template>\n <ng-template kendoMultiSelectTagTemplate let-dataItem>\n <span\n #tagWrapper=\"multiselectTagWrapper\"\n sgMultiselectTagWrapper\n [isReadOnly]=\"isReadOnlyTag && isReadOnlyTag(dataItem)\"\n >\n <sg-tag\n [icon]=\"tagWrapper.isReadOnly ? '' : 'far fa-times'\"\n [color]=\"tagColor(dataItem)\"\n [isActivated]=\"isActivatedTag(dataItem)\"\n >\n <ng-container *ngIf=\"tagTemplate\" [ngTemplateOutlet]=\"tagTemplate\" [ngTemplateOutletContext]=\"{item: dataItem}\">\n </ng-container>\n <ng-container *ngIf=\"!tagTemplate\">{{ dataItem[textField] }}</ng-container>\n </sg-tag>\n </span>\n </ng-template>\n</kendo-multiselect>\n<div class=\"sg-multiselect__reset\" *ngIf=\"!isDisabled\" (click)=\"onResetClicked()\">\n <i class=\"far fa-times\"></i>\n</div>\n<div class=\"sg-multiselect__state-line\"></div>\n" }]
|
|
182
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
|
|
183
|
+
type: Optional
|
|
184
|
+
}, {
|
|
185
|
+
type: Inject,
|
|
186
|
+
args: [MULTISELECT_LOCALIZER]
|
|
187
|
+
}] }]; }, propDecorators: { formControl: [{
|
|
188
|
+
type: Input
|
|
189
|
+
}], component: [{
|
|
190
|
+
type: ViewChild,
|
|
191
|
+
args: ['component', { static: true }]
|
|
192
|
+
}], itemTemplate: [{
|
|
193
|
+
type: ContentChild,
|
|
194
|
+
args: [MultiselectItemTemplateDirective, { read: TemplateRef, static: true }]
|
|
195
|
+
}], tagTemplate: [{
|
|
196
|
+
type: ContentChild,
|
|
197
|
+
args: [MultiselectTagTemplateDirective, { read: TemplateRef, static: true }]
|
|
198
|
+
}], hasCssClass: [{
|
|
199
|
+
type: HostBinding,
|
|
200
|
+
args: ['class.sg-multiselect']
|
|
201
|
+
}], hasValue: [{
|
|
202
|
+
type: HostBinding,
|
|
203
|
+
args: ['class.sg-multiselect--has-value']
|
|
204
|
+
}], hasIsFocusedCssClass: [{
|
|
205
|
+
type: HostBinding,
|
|
206
|
+
args: ['class.sg-multiselect--is-focused']
|
|
207
|
+
}], hasIsHoveredCssClass: [{
|
|
208
|
+
type: HostBinding,
|
|
209
|
+
args: ['class.sg-multiselect--is-hovered']
|
|
210
|
+
}], hasIsDisabledCssClass: [{
|
|
211
|
+
type: HostBinding,
|
|
212
|
+
args: ['class.sg-multiselect--is-disabled']
|
|
213
|
+
}], isSuccessType: [{
|
|
214
|
+
type: HostBinding,
|
|
215
|
+
args: ['class.sg-multiselect--type-success']
|
|
216
|
+
}], isErrorType: [{
|
|
217
|
+
type: HostBinding,
|
|
218
|
+
args: ['class.sg-multiselect--type-error']
|
|
219
|
+
}], isWarningType: [{
|
|
220
|
+
type: HostBinding,
|
|
221
|
+
args: ['class.sg-multiselect--type-warning']
|
|
222
|
+
}], isHighlightedState: [{
|
|
223
|
+
type: HostBinding,
|
|
224
|
+
args: ['class.sg-multiselect--state-highlighted']
|
|
225
|
+
}], hasIsLoadingCssClass: [{
|
|
226
|
+
type: HostBinding,
|
|
227
|
+
args: ['class.sg-multiselect--is-loading']
|
|
228
|
+
}], hasHasResetCssClass: [{
|
|
229
|
+
type: HostBinding,
|
|
230
|
+
args: ['class.sg-multiselect--has-reset']
|
|
231
|
+
}], hasIsOutlineCssClass: [{
|
|
232
|
+
type: HostBinding,
|
|
233
|
+
args: ['class.sg-multiselect--is-outline']
|
|
234
|
+
}], loadingText: [{
|
|
235
|
+
type: Input
|
|
236
|
+
}], noItemsText: [{
|
|
237
|
+
type: Input
|
|
238
|
+
}], minSearchText: [{
|
|
239
|
+
type: Input
|
|
240
|
+
}], isReadOnlyTag: [{
|
|
241
|
+
type: Input
|
|
242
|
+
}], isActivatedTag: [{
|
|
243
|
+
type: Input
|
|
244
|
+
}], tagColor: [{
|
|
245
|
+
type: Input
|
|
246
|
+
}] } });
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL211bHRpc2VsZWN0L211bHRpc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tdWx0aXNlbGVjdC9tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQiwwQkFBMEIsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUMsb0JBQW9CLEVBQWdCLE1BQU0sbUNBQW1DLENBQUM7QUFDdEYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLHNEQUFzRCxDQUFDO0FBQ3RHLE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBRXBHLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRTlFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDOzs7Ozs7OztBQThCM0YsTUFBTSxPQUFPLG9CQUE0QixTQUFRLHlCQUEyRTtJ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QixXQUFXO3VCQUFDLGlDQUFpQztnQkFLbkMsb0JBQW9CO3NCQUQ5QixXQUFXO3VCQUFDLGtDQUFrQztnQkFLcEMsV0FBVztzQkFEckIsS0FBSztnQkFRSyxXQUFXO3NCQURyQixLQUFLO2dCQVFLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBUUMsYUFBYTtzQkFEbkIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLFFBQVE7c0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFCU1RSQUNUX0NPTlRST0xfQ09NUE9ORU5ULFxuICBPUEVOQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbiAgU1RBVEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICBUWVBFQUJMRV9DT05UUk9MX0NPTVBPTkVOVCxcbn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS1jb21tb24nO1xuaW1wb3J0IHtUYWdDb2xvcn0gZnJvbSAnQG1hcmN1cmEvbWFyY3VyYS10YWcnO1xuaW1wb3J0IHtNdWx0aVNlbGVjdENvbXBvbmVudCwgUG9wdXBTZXR0aW5nc30gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZHJvcGRvd25zJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01VTFRJU0VMRUNUX0xPQ0FMSVpFUn0gZnJvbSAnLi4vLi4vY29tYm9ib3guaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHtNdWx0aXNlbGVjdEl0ZW1UZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9tdWx0aXNlbGVjdC1pdGVtLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge011bHRpc2VsZWN0VGFnVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbXVsdGlzZWxlY3QtdGFnLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0lEcm9wZG93bkxvY2FsaXplcn0gZnJvbSAnLi4vLi4vbW9kZWwvZHJvcGRvd24tbG9jYWxpemVyLmludGVyZmFjZSc7XG5pbXBvcnQge011bHRpc2VsZWN0Q2hhbmdlZEV2ZW50fSBmcm9tICcuLi8uLi9tb2RlbC9tdWx0aXNlbGVjdC1jaGFuZ2VkLmV2ZW50JztcbmltcG9ydCB7SU11bHRpc2VsZWN0TG9jYWxpemF0aW9ufSBmcm9tICcuLi8uLi9tb2RlbC9tdWx0aXNlbGVjdC1sb2NhbGl6YXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7QWJzdHJhY3RDb21ib2JveENvbXBvbmVudH0gZnJvbSAnLi4vYWJzdHJhY3QtY29tYm9ib3gvYWJzdHJhY3QtY29tYm9ib3guY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ctbXVsdGlzZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJ211bHRpc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBQlNUUkFDVF9DT05UUk9MX0NPTVBPTkVOVCxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpc2VsZWN0Q29tcG9uZW50KSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE9QRU5BQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogU1RBVEVBQkxFX0NPTlRST0xfQ09NUE9ORU5ULFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RDb21wb25lbnQpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogVFlQRUFCTEVfQ09OVFJPTF9DT01QT05FTlQsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aXNlbGVjdENvbXBvbmVudCksXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlzZWxlY3RDb21wb25lbnQ8VEl0ZW0+IGV4dGVuZHMgQWJzdHJhY3RDb21ib2JveENvbXBvbmVudDxUSXRlbSwgVEl0ZW1bXSwgTXVsdGlzZWxlY3RDaGFuZ2VkRXZlbnQ8VEl0ZW1bXT4+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZvcm1Db250cm9sITogRm9ybUNvbnRyb2w8VEl0ZW1bXT47XG4gIHB1YmxpYyBvdmVycmlkZSByZWFkb25seSB2YWx1ZUZvcm1Db250cm9sOiBGb3JtQ29udHJvbDxUSXRlbVtdPiA9IG5ldyBGb3JtQ29udHJvbCgpO1xuXG4gIHByaXZhdGUgX2xvYWRpbmdUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbm9JdGVtc1RleHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9taW5TZWFyY2hUZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbG9jYWxpemF0aW9uOiBJTXVsdGlzZWxlY3RMb2NhbGl6YXRpb24gPSB7XG4gICAgbG9hZGluZ1RleHQ6ICdMb2FkaW5nLi4uJyxcbiAgICBub0l0ZW1zVGV4dDogJ05vIGl0ZW1zIGZvdW5kLicsXG4gICAgbWluU2VhcmNoVGV4dDogJ0VudGVyIHttaW5TZWFyY2hDaGFyYWN0ZXJzfSBvciBtb3JlIGNoYXJhY3RlcnMuJyxcbiAgfTtcbiAgcHVibGljIG92ZXJyaWRlIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVEl0ZW1bXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbXBvbmVudCcsIHtzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgY29tcG9uZW50ITogTXVsdGlTZWxlY3RDb21wb25lbnQ7XG4gIEBDb250ZW50Q2hpbGQoTXVsdGlzZWxlY3RJdGVtVGVtcGxhdGVEaXJlY3RpdmUsIHtyZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlfSlcbiAgcHVibGljIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xuICBAQ29udGVudENoaWxkKE11bHRpc2VsZWN0VGFnVGVtcGxhdGVEaXJlY3RpdmUsIHtyZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlfSlcbiAgcHVibGljIHRhZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QnKVxuICBwdWJsaWMgcmVhZG9ubHkgaGFzQ3NzQ2xhc3M6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLW11bHRpc2VsZWN0LS1oYXMtdmFsdWUnKVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGhhc1ZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlRm9ybUNvbnRyb2wudmFsdWUgJiYgdGhpcy52YWx1ZUZvcm1Db250cm9sLnZhbHVlLmxlbmd0aCA+IDA7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0taXMtZm9jdXNlZCcpXG4gIHB1YmxpYyBnZXQgaGFzSXNGb2N1c2VkQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNGb2N1c2VkO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLWlzLWhvdmVyZWQnKVxuICBwdWJsaWMgZ2V0IGhhc0lzSG92ZXJlZENzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0hvdmVyZWQudmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0taXMtZGlzYWJsZWQnKVxuICBwdWJsaWMgZ2V0IGhhc0lzRGlzYWJsZWRDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rpc2FibGVkO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLXR5cGUtc3VjY2VzcycpXG4gIHB1YmxpYyBnZXQgaXNTdWNjZXNzVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNTdWNjZXNzVHlwZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLW11bHRpc2VsZWN0LS10eXBlLWVycm9yJylcbiAgcHVibGljIGdldCBpc0Vycm9yVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFcnJvclR5cGU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0tdHlwZS13YXJuaW5nJylcbiAgcHVibGljIGdldCBpc1dhcm5pbmdUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1dhcm5pbmdUeXBlO1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLXN0YXRlLWhpZ2hsaWdodGVkJylcbiAgcHVibGljIGdldCBpc0hpZ2hsaWdodGVkU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSGlnaGxpZ2h0ZWRTdGF0ZTtcbiAgfVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNnLW11bHRpc2VsZWN0LS1pcy1sb2FkaW5nJylcbiAgcHVibGljIGdldCBoYXNJc0xvYWRpbmdDc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmcgfHwgdGhpcy5faXNTZWFyY2hpbmcudmFsdWU7XG4gIH1cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZy1tdWx0aXNlbGVjdC0taGFzLXJlc2V0JylcbiAgcHVibGljIGdldCBoYXNIYXNSZXNldENzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Jlc2V0O1xuICB9XG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2ctbXVsdGlzZWxlY3QtLWlzLW91dGxpbmUnKVxuICBwdWJsaWMgZ2V0IGhhc0lzT3V0bGluZUNzc0NsYXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT3V0bGluZTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGxvYWRpbmdUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdUZXh0IHx8IHRoaXMuX2xvY2FsaXphdGlvbi5sb2FkaW5nVGV4dDtcbiAgfVxuICBwdWJsaWMgc2V0IGxvYWRpbmdUZXh0KGxvYWRpbmdUZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb2FkaW5nVGV4dCA9IGxvYWRpbmdUZXh0O1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgbm9JdGVtc1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbm9JdGVtc1RleHQgfHwgdGhpcy5fbG9jYWxpemF0aW9uLm5vSXRlbXNUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgbm9JdGVtc1RleHQobm9JdGVtc1RleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX25vSXRlbXNUZXh0ID0gbm9JdGVtc1RleHQ7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBtaW5TZWFyY2hUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21pblNlYXJjaFRleHQgfHwgdGhpcy5fbG9jYWxpemF0aW9uLm1pblNlYXJjaFRleHQ7XG4gIH1cbiAgcHVibGljIHNldCBtaW5TZWFyY2hUZXh0KG1pblNlYXJjaFRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX21pblNlYXJjaFRleHQgPSBtaW5TZWFyY2hUZXh0O1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpc1JlYWRPbmx5VGFnOiAoKGl0ZW06IFRJdGVtKSA9PiBib29sZWFuKSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKVxuICBwdWJsaWMgaXNBY3RpdmF0ZWRUYWc6IChpdGVtOiBUSXRlbSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGFnQ29sb3I6IChpdGVtOiBUSXRlbSkgPT4gVGFnQ29sb3IgfCBudWxsID0gKCkgPT4gbnVsbDtcbiAgcHVibGljIGdldCBwb3B1cFNldHRpbmdzKCk6IFBvcHVwU2V0dGluZ3Mge1xuICAgIHJldHVybiB7XG4gICAgICBhbmltYXRlOiB0cnVlLFxuICAgICAgcG9wdXBDbGFzczogYHNnLW11bHRpc2VsZWN0LXBvcHVwJHt0aGlzLmlzR3JvdXBhYmxlID8gJyBzZy1tdWx0aXNlbGVjdC1wb3B1cC0taXMtZ3JvdXBhYmxlJyA6ICcnfSAke1xuICAgICAgICB0aGlzLnBvcHVwQ2xhc3MgfHwgJydcbiAgICAgIH1gLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1VTFRJU0VMRUNUX0xPQ0FMSVpFUilcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9sb2NhbGl6ZXI6IElEcm9wZG93bkxvY2FsaXplcjxJTXVsdGlzZWxlY3RMb2NhbGl6YXRpb24+XG4gICkge1xuICAgIHN1cGVyKGNoYW5nZURldGVjdG9yUmVmLCByZW5kZXJlcik7XG4gICAgdGhpcy5fbG9jYWxpemUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgLy8gT3BlbmVkLlxuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9pc09wZW4ucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5pc09wZW4pKSwgKCkgPT4ge1xuICAgICAgdGhpcy5faGFzU2VhcmNoZWQubmV4dChmYWxzZSk7XG5cbiAgICAgIGlmICghdGhpcy5hcmVJdGVtc0NhY2hlZCAmJiB0aGlzLl9sb2FkZWRJdGVtcy52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2FkSXRlbXModGhpcy5fc2VhcmNoVGV4dC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIubGlzdGVuKHRoaXMuX2lzT3Blbi5waXBlKGZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmlzT3BlbikpLCAoKSA9PiB0aGlzLm9wZW5lZC5lbWl0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9lbWl0Q2hhbmdlZCh2YWx1ZTogVEl0ZW1bXSk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlZC5lbWl0KG5ldyBNdWx0aXNlbGVjdENoYW5nZWRFdmVudCh2YWx1ZSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGhhc1ZhbHVlQ2hhbmdlZCh2YWx1ZTogVEl0ZW1bXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzT2xkVmFsdWVFbXB0eTogYm9vbGVhbiA9IHRoaXMudmFsdWUgPT09IG51bGwgfHwgdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmFsdWUubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IGlzTmV3VmFsdWVFbXB0eTogYm9vbGVhbiA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUubGVuZ3RoID09PSAwO1xuXG4gICAgaWYgKGlzT2xkVmFsdWVFbXB0eSAmJiBpc05ld1ZhbHVlRW1wdHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNPbGRWYWx1ZUVtcHR5IHx8IGlzTmV3VmFsdWVFbXB0eSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudmFsdWUubGVuZ3RoICE9PSB2YWx1ZS5sZW5ndGggfHwgdGhpcy52YWx1ZS5zb21lKChpdGVtLCBpbmRleCkgPT4gIXRoaXMuaXNJdGVtRXF1YWwoaXRlbSwgdmFsdWVbaW5kZXhdKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9jYWxpemUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9sb2NhbGl6ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSB0aGlzLl9sb2NhbGl6ZXIubG9jYWxpemF0aW9uO1xuICAgIHRoaXMuX29ic2VydmVyLmxpc3Rlbih0aGlzLl9sb2NhbGl6ZXIubG9jYWxpemF0aW9uQ2hhbmdlZCwgKGxvY2FsaXphdGlvbikgPT4ge1xuICAgICAgdGhpcy5fbG9jYWxpemF0aW9uID0gbG9jYWxpemF0aW9uO1xuICAgIH0pO1xuICB9XG59XG4iLCI8a2VuZG8tbXVsdGlzZWxlY3RcbiAgI2NvbXBvbmVudFxuICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICBbZm9ybUNvbnRyb2xdPVwidmFsdWVGb3JtQ29udHJvbFwiXG4gIFtkYXRhXT1cImNvbWJpbmVkSXRlbXMgfCBhc3luY1wiXG4gIFtmaWx0ZXJhYmxlXT1cImlzU2VhcmNoYWJsZVwiXG4gIFt2YWx1ZUZpZWxkXT1cInZhbHVlS2V5XCJcbiAgW3RleHRGaWVsZF09XCJ0ZXh0S2V5XCJcbiAgW2xvYWRpbmddPVwiaXNMb2FkaW5nU3Bpbm5lclZpc2libGUgfCBhc3luY1wiXG4gIFtjbGVhckJ1dHRvbl09XCJmYWxzZVwiXG4gIFtwb3B1cFNldHRpbmdzXT1cInBvcHVwU2V0dGluZ3NcIlxuICBbbGlzdEhlaWdodF09XCJsaXN0SGVpZ2h0XCJcbiAgW3ZhbHVlUHJpbWl0aXZlXT1cImlzUHJpbWl0aXZlVmFsdWVcIlxuICAoZmlsdGVyQ2hhbmdlKT1cIm9uU2VhcmNoZWQoJGV2ZW50KVwiXG4gICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZWQoJGV2ZW50KVwiXG4gIChvcGVuKT1cIm9uT3BlbmVkKClcIlxuICAoY2xvc2UpPVwib25DbG9zZWQoKVwiXG4gIChmb2N1cyk9XCJvbkZvY3VzZWQoKVwiXG4gIChibHVyKT1cIm9uQmx1cnJlZCgpXCJcbj5cbiAgPG5nLXRlbXBsYXRlIGtlbmRvRHJvcERvd25MaXN0Rm9vdGVyVGVtcGxhdGU+XG4gICAgPHNnLWNvbWJvYm94LXBvcHVwLWZvb3RlclxuICAgICAgW2lzTG9hZGluZ1RleHRWaXNpYmxlXT1cImlzTG9hZGluZ1RleHRWaXNpYmxlIHwgYXN5bmNcIlxuICAgICAgW2lzTm9JdGVtc1RleHRWaXNpYmxlXT1cImlzTm9JdGVtc1RleHRWaXNpYmxlIHwgYXN5bmNcIlxuICAgICAgW2lzTWluU2VhcmNoVGV4dFZpc2libGVdPVwiaXNNaW5TZWFyY2hUZXh0VmlzaWJsZSB8IGFzeW5jXCJcbiAgICAgIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiXG4gICAgICBbbm9JdGVtc1RleHRdPVwibm9JdGVtc1RleHRcIlxuICAgICAgW21pblNlYXJjaFRleHRdPVwibWluU2VhcmNoVGV4dFwiXG4gICAgICBbbWluU2VhcmNoQ2hhcmFjdGVyc109XCJtaW5TZWFyY2hDaGFyYWN0ZXJzXCJcbiAgICA+XG4gICAgPC9zZy1jb21ib2JveC1wb3B1cC1mb290ZXI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBrZW5kb0Ryb3BEb3duTGlzdE5vRGF0YVRlbXBsYXRlPjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIml0ZW1UZW1wbGF0ZVwiIGtlbmRvTXVsdGlTZWxlY3RJdGVtVGVtcGxhdGUgbGV0LWRhdGFJdGVtPlxuICAgIDxzcGFuIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogZGF0YUl0ZW19XCI+PC9zcGFuPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUga2VuZG9NdWx0aVNlbGVjdFRhZ1RlbXBsYXRlIGxldC1kYXRhSXRlbT5cbiAgICA8c3BhblxuICAgICAgI3RhZ1dyYXBwZXI9XCJtdWx0aXNlbGVjdFRhZ1dyYXBwZXJcIlxuICAgICAgc2dNdWx0aXNlbGVjdFRhZ1dyYXBwZXJcbiAgICAgIFtpc1JlYWRPbmx5XT1cImlzUmVhZE9ubHlUYWcgJiYgaXNSZWFkT25seVRhZyhkYXRhSXRlbSlcIlxuICAgID5cbiAgICAgIDxzZy10YWdcbiAgICAgICAgW2ljb25dPVwidGFnV3JhcHBlci5pc1JlYWRPbmx5ID8gJycgOiAnZmFyIGZhLXRpbWVzJ1wiXG4gICAgICAgIFtjb2xvcl09XCJ0YWdDb2xvcihkYXRhSXRlbSlcIlxuICAgICAgICBbaXNBY3RpdmF0ZWRdPVwiaXNBY3RpdmF0ZWRUYWcoZGF0YUl0ZW0pXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhZ1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFnVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2l0ZW06IGRhdGFJdGVtfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWdUZW1wbGF0ZVwiPnt7IGRhdGFJdGVtW3RleHRGaWVsZF0gfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc2ctdGFnPlxuICAgIDwvc3Bhbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwva2VuZG8tbXVsdGlzZWxlY3Q+XG48ZGl2IGNsYXNzPVwic2ctbXVsdGlzZWxlY3RfX3Jlc2V0XCIgKm5nSWY9XCIhaXNEaXNhYmxlZFwiIChjbGljayk9XCJvblJlc2V0Q2xpY2tlZCgpXCI+XG4gIDxpIGNsYXNzPVwiZmFyIGZhLXRpbWVzXCI+PC9pPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwic2ctbXVsdGlzZWxlY3RfX3N0YXRlLWxpbmVcIj48L2Rpdj5cbiJdfQ==
|