@skyux/lookup 8.6.0 → 9.0.0-alpha.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/documentation.json +636 -636
- package/esm2022/lib/modules/autocomplete/autocomplete-adapter.service.mjs +61 -0
- package/esm2022/lib/modules/autocomplete/autocomplete-input.directive.mjs +237 -0
- package/{esm2020 → esm2022}/lib/modules/autocomplete/autocomplete-search-async-disabled.pipe.mjs +4 -4
- package/esm2022/lib/modules/autocomplete/autocomplete.component.mjs +817 -0
- package/{esm2020 → esm2022}/lib/modules/autocomplete/autocomplete.module.mjs +27 -27
- package/esm2022/lib/modules/country-field/country-field.component.mjs +444 -0
- package/{esm2020 → esm2022}/lib/modules/country-field/country-field.module.mjs +19 -19
- package/{esm2020 → esm2022}/lib/modules/lookup/lookup-adapter.service.mjs +4 -4
- package/esm2022/lib/modules/lookup/lookup-autocomplete-adapter.mjs +114 -0
- package/esm2022/lib/modules/lookup/lookup-show-more-modal.component.mjs +270 -0
- package/esm2022/lib/modules/lookup/lookup.component.mjs +710 -0
- package/{esm2020 → esm2022}/lib/modules/lookup/lookup.module.mjs +37 -37
- package/esm2022/lib/modules/search/search-adapter.service.mjs +46 -0
- package/esm2022/lib/modules/search/search.component.mjs +285 -0
- package/{esm2020 → esm2022}/lib/modules/search/search.module.mjs +17 -17
- package/{esm2020 → esm2022}/lib/modules/selection-modal/selection-modal-item-selected.pipe.mjs +4 -4
- package/esm2022/lib/modules/selection-modal/selection-modal.component.mjs +201 -0
- package/{esm2020 → esm2022}/lib/modules/selection-modal/selection-modal.module.mjs +27 -27
- package/esm2022/lib/modules/selection-modal/selection-modal.service.mjs +89 -0
- package/esm2022/lib/modules/selection-modal/types/selection-modal-instance.mjs +45 -0
- package/esm2022/lib/modules/shared/sky-lookup-resources.module.mjs +71 -0
- package/esm2022/testing/autocomplete/autocomplete-harness.mjs +155 -0
- package/esm2022/testing/autocomplete/autocomplete-input-harness.mjs +63 -0
- package/esm2022/testing/autocomplete/autocomplete-search-result-harness.mjs +44 -0
- package/esm2022/testing/country-field/country-field-fixture.mjs +118 -0
- package/{esm2020 → esm2022}/testing/country-field/country-field-testing.module.mjs +5 -5
- package/esm2022/testing/lookup/lookup-harness.mjs +76 -0
- package/{esm2020 → esm2022}/testing/search/search-fixture.mjs +18 -19
- package/esm2022/testing/search/search-harness.mjs +80 -0
- package/{esm2020 → esm2022}/testing/search/search-testing.module.mjs +5 -5
- package/esm2022/testing/selection-modal/selection-modal-harness.mjs +122 -0
- package/{fesm2020 → fesm2022}/skyux-lookup-testing.mjs +171 -187
- package/{fesm2020 → fesm2022}/skyux-lookup-testing.mjs.map +1 -1
- package/fesm2022/skyux-lookup.mjs +3707 -0
- package/fesm2022/skyux-lookup.mjs.map +1 -0
- package/lib/modules/autocomplete/autocomplete-input.directive.d.ts +1 -1
- package/lib/modules/autocomplete/autocomplete.component.d.ts +1 -1
- package/lib/modules/country-field/country-field.component.d.ts +1 -1
- package/lib/modules/lookup/lookup-autocomplete-adapter.d.ts +1 -1
- package/lib/modules/lookup/lookup.component.d.ts +2 -1
- package/lib/modules/search/search.component.d.ts +1 -1
- package/package.json +23 -31
- package/esm2020/lib/modules/autocomplete/autocomplete-adapter.service.mjs +0 -64
- package/esm2020/lib/modules/autocomplete/autocomplete-input.directive.mjs +0 -235
- package/esm2020/lib/modules/autocomplete/autocomplete.component.mjs +0 -775
- package/esm2020/lib/modules/country-field/country-field.component.mjs +0 -432
- package/esm2020/lib/modules/lookup/lookup-autocomplete-adapter.mjs +0 -115
- package/esm2020/lib/modules/lookup/lookup-show-more-modal.component.mjs +0 -271
- package/esm2020/lib/modules/lookup/lookup.component.mjs +0 -690
- package/esm2020/lib/modules/search/search-adapter.service.mjs +0 -46
- package/esm2020/lib/modules/search/search.component.mjs +0 -279
- package/esm2020/lib/modules/selection-modal/selection-modal.component.mjs +0 -199
- package/esm2020/lib/modules/selection-modal/selection-modal.service.mjs +0 -92
- package/esm2020/lib/modules/selection-modal/types/selection-modal-instance.mjs +0 -48
- package/esm2020/lib/modules/shared/sky-lookup-resources.module.mjs +0 -71
- package/esm2020/testing/autocomplete/autocomplete-harness.mjs +0 -161
- package/esm2020/testing/autocomplete/autocomplete-input-harness.mjs +0 -63
- package/esm2020/testing/autocomplete/autocomplete-search-result-harness.mjs +0 -44
- package/esm2020/testing/country-field/country-field-fixture.mjs +0 -114
- package/esm2020/testing/lookup/lookup-harness.mjs +0 -82
- package/esm2020/testing/search/search-harness.mjs +0 -86
- package/esm2020/testing/selection-modal/selection-modal-harness.mjs +0 -128
- package/fesm2015/skyux-lookup-testing.mjs +0 -980
- package/fesm2015/skyux-lookup-testing.mjs.map +0 -1
- package/fesm2015/skyux-lookup.mjs +0 -3640
- package/fesm2015/skyux-lookup.mjs.map +0 -1
- package/fesm2020/skyux-lookup.mjs +0 -3623
- package/fesm2020/skyux-lookup.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/autocomplete-default-search-function.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-default-search-function-options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-input-text-change.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-message-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-message.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-async-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-async-function.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-async-result-display-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-async-result.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-function-filter.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-function-response.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-search-function.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-selection-change.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/autocomplete/types/autocomplete-show-more-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/country-field/types/country-field-context-token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/country-field/types/country-field-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/country-field/types/country.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-add-click-callback-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-add-click-event-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-select-mode-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-select-mode.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-show-more-config.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-show-more-custom-picker-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-show-more-custom-picker.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-show-more-native-picker-config.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/lookup/types/lookup-show-more-native-picker-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-add-click-callback-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-add-click-event-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-close-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-open-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-result.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-search-args.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/selection-modal/types/selection-modal-search-result.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/shared/sky-lookup-string-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-lookup.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/autocomplete/autocomplete-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/autocomplete/autocomplete-search-result-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-selection-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-selection-harness.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-selections-list-harness.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-show-more-picker-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-show-more-picker-harness.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-show-more-picker-search-result-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/lookup/lookup-show-more-picker-search-result-harness.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/search/search-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selection-modal/selection-modal-search-result-harness-filters.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selection-modal/selection-modal-search-result-harness.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/skyux-lookup-testing.mjs +0 -0
|
@@ -0,0 +1,710 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { SkyTokensMessageType, } from '@skyux/indicators';
|
|
3
|
+
import { Subject, fromEvent as observableFromEvent } from 'rxjs';
|
|
4
|
+
import { take, takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { SkyAutocompleteInputDirective } from '../autocomplete/autocomplete-input.directive';
|
|
6
|
+
import { SkyAutocompleteMessageType } from '../autocomplete/types/autocomplete-message-type';
|
|
7
|
+
import { SkyLookupAdapterService } from './lookup-adapter.service';
|
|
8
|
+
import { SkyLookupAutocompleteAdapter } from './lookup-autocomplete-adapter';
|
|
9
|
+
import { SkyLookupShowMoreModalComponent } from './lookup-show-more-modal.component';
|
|
10
|
+
import { SkyLookupShowMoreNativePickerContext } from './types/lookup-show-more-native-picker-context';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@skyux/core";
|
|
13
|
+
import * as i2 from "./lookup-adapter.service";
|
|
14
|
+
import * as i3 from "@skyux/modals";
|
|
15
|
+
import * as i4 from "@skyux/i18n";
|
|
16
|
+
import * as i5 from "../selection-modal/selection-modal.service";
|
|
17
|
+
import * as i6 from "@angular/forms";
|
|
18
|
+
import * as i7 from "@skyux/forms";
|
|
19
|
+
import * as i8 from "@skyux/theme";
|
|
20
|
+
import * as i9 from "@angular/common";
|
|
21
|
+
import * as i10 from "../autocomplete/autocomplete.component";
|
|
22
|
+
import * as i11 from "../autocomplete/autocomplete-input.directive";
|
|
23
|
+
import * as i12 from "@skyux/indicators";
|
|
24
|
+
export class SkyLookupComponent extends SkyLookupAutocompleteAdapter {
|
|
25
|
+
/**
|
|
26
|
+
* The data source for the lookup component to search when users
|
|
27
|
+
* enter text. You can specify static data such as an array of objects, or
|
|
28
|
+
* you can pull data from a database.
|
|
29
|
+
* @default []
|
|
30
|
+
*/
|
|
31
|
+
set data(value) {
|
|
32
|
+
this.#_data = value;
|
|
33
|
+
if (this.#openNativePicker && !this.#hasSearchAsync()) {
|
|
34
|
+
this.#openNativePicker.componentInstance.updateItemData(value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
get data() {
|
|
38
|
+
return this.#_data || [];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Whether to disable the lookup field on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
|
|
42
|
+
* To set the disabled state on reactive forms, use the `FormControl` instead.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
set disabled(value) {
|
|
46
|
+
this.#_disabled = value ?? false;
|
|
47
|
+
}
|
|
48
|
+
get disabled() {
|
|
49
|
+
return this.#_disabled;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether to enable users to open a picker where they can view all options.
|
|
53
|
+
* @default false
|
|
54
|
+
*/
|
|
55
|
+
set enableShowMore(value) {
|
|
56
|
+
this.#_enableShowMore = value ?? false;
|
|
57
|
+
}
|
|
58
|
+
get enableShowMore() {
|
|
59
|
+
return this.#_enableShowMore;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether to display a button that lets users add options to the list.
|
|
63
|
+
* @default false
|
|
64
|
+
*/
|
|
65
|
+
set showAddButton(value) {
|
|
66
|
+
this.#_showAddButton = value ?? false;
|
|
67
|
+
}
|
|
68
|
+
get showAddButton() {
|
|
69
|
+
return this.#_showAddButton;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The ability for users to select one option or multiple options.
|
|
73
|
+
* @default "multiple"
|
|
74
|
+
*/
|
|
75
|
+
set selectMode(value) {
|
|
76
|
+
const multipleToSingle = value === 'single' && this.selectMode === 'multiple';
|
|
77
|
+
this.#_selectMode = value;
|
|
78
|
+
this.#updateForSelectMode();
|
|
79
|
+
if (multipleToSingle) {
|
|
80
|
+
if (this.value && this.value.length > 1) {
|
|
81
|
+
// The `setTimeout` is needed to avoid a `ExpressionChangedAfterItHasBeenCheckedError` error in template forms.
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
this.writeValue([this.value[0]]);
|
|
84
|
+
this.#changeDetector.detectChanges();
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
get selectMode() {
|
|
90
|
+
return this.#_selectMode || 'multiple';
|
|
91
|
+
}
|
|
92
|
+
get tokens() {
|
|
93
|
+
return this.#_tokens;
|
|
94
|
+
}
|
|
95
|
+
set tokens(value) {
|
|
96
|
+
// Collapse the tokens into a single token if the user has selected many options.
|
|
97
|
+
if (this.enableShowMore && this.value.length > 5) {
|
|
98
|
+
this.#resourcesService
|
|
99
|
+
.getString('skyux_lookup_tokens_summary', this.value.length.toString())
|
|
100
|
+
.pipe(take(1))
|
|
101
|
+
.subscribe((label) => {
|
|
102
|
+
this.#_tokens = [
|
|
103
|
+
{
|
|
104
|
+
value: { [this.descriptorProperty]: label },
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
this.#changeDetector.markForCheck();
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.#_tokens = value;
|
|
112
|
+
this.#changeDetector.markForCheck();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
get value() {
|
|
116
|
+
return this.#_value ? this.#_value : [];
|
|
117
|
+
}
|
|
118
|
+
set value(newValue) {
|
|
119
|
+
this.#_value = newValue;
|
|
120
|
+
if (!this.#pickerModalOpen()) {
|
|
121
|
+
this.tokens = this.#parseTokens(newValue);
|
|
122
|
+
}
|
|
123
|
+
this.onChange(this.#_value);
|
|
124
|
+
this.onTouched();
|
|
125
|
+
}
|
|
126
|
+
set autocompleteInputDirective(value) {
|
|
127
|
+
this.#_autocompleteInputDirective = value;
|
|
128
|
+
this.#updateForSelectMode();
|
|
129
|
+
}
|
|
130
|
+
get autocompleteInputDirective() {
|
|
131
|
+
return this.#_autocompleteInputDirective;
|
|
132
|
+
}
|
|
133
|
+
#adapter;
|
|
134
|
+
#elementRef;
|
|
135
|
+
#changeDetector;
|
|
136
|
+
#idle;
|
|
137
|
+
#markForTokenFocusOnKeyUp;
|
|
138
|
+
#modalService;
|
|
139
|
+
#ngUnsubscribe;
|
|
140
|
+
#openNativePicker;
|
|
141
|
+
#openSelectionModal;
|
|
142
|
+
#resourcesService;
|
|
143
|
+
#selectionModalSvc;
|
|
144
|
+
#windowRef;
|
|
145
|
+
#logSvc;
|
|
146
|
+
#_autocompleteInputDirective;
|
|
147
|
+
#_data;
|
|
148
|
+
#_disabled;
|
|
149
|
+
#_enableShowMore;
|
|
150
|
+
#_selectMode;
|
|
151
|
+
#_showAddButton;
|
|
152
|
+
#_tokens;
|
|
153
|
+
#_value;
|
|
154
|
+
constructor(changeDetector, elementRef, windowRef, adapter, modalService, resourcesService, selectionModalSvc, logSvc, ngControl, inputBoxHostSvc, themeSvc) {
|
|
155
|
+
super();
|
|
156
|
+
this.inputBoxHostSvc = inputBoxHostSvc;
|
|
157
|
+
this.themeSvc = themeSvc;
|
|
158
|
+
/**
|
|
159
|
+
* Fires when users select the button to add options to the list.
|
|
160
|
+
*/
|
|
161
|
+
this.addClick = new EventEmitter();
|
|
162
|
+
this.autocompleteController = new Subject();
|
|
163
|
+
this.isInputFocused = false;
|
|
164
|
+
this.tokensController = new Subject();
|
|
165
|
+
this.#idle = new Subject();
|
|
166
|
+
this.#markForTokenFocusOnKeyUp = false;
|
|
167
|
+
this.#ngUnsubscribe = new Subject();
|
|
168
|
+
this.#_disabled = false;
|
|
169
|
+
this.#_enableShowMore = false;
|
|
170
|
+
this.#_showAddButton = false;
|
|
171
|
+
// Angular automatically constructs these methods.
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
173
|
+
this.onChange = (value) => { };
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
175
|
+
this.onTouched = () => { };
|
|
176
|
+
this.#changeDetector = changeDetector;
|
|
177
|
+
this.#elementRef = elementRef;
|
|
178
|
+
this.#windowRef = windowRef;
|
|
179
|
+
this.#adapter = adapter;
|
|
180
|
+
this.#modalService = modalService;
|
|
181
|
+
this.#resourcesService = resourcesService;
|
|
182
|
+
this.#selectionModalSvc = selectionModalSvc;
|
|
183
|
+
this.#logSvc = logSvc;
|
|
184
|
+
if (ngControl) {
|
|
185
|
+
ngControl.valueAccessor = this;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
ngOnInit() {
|
|
189
|
+
if (this.inputBoxHostSvc && this.inputTemplateRef) {
|
|
190
|
+
this.controlId = this.inputBoxHostSvc.controlId;
|
|
191
|
+
this.inputBoxHostSvc.populate({
|
|
192
|
+
inputTemplate: this.inputTemplateRef,
|
|
193
|
+
buttonsTemplate: this.enableShowMore
|
|
194
|
+
? this.showMoreButtonTemplateRef
|
|
195
|
+
: undefined,
|
|
196
|
+
iconsInsetTemplate: this.enableShowMore
|
|
197
|
+
? undefined
|
|
198
|
+
: this.searchIconTemplateRef,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/* istanbul ignore else */
|
|
202
|
+
if (this.themeSvc) {
|
|
203
|
+
// This is required for the autocomplete directive to be set after elements
|
|
204
|
+
// are rearranged when switching themes.
|
|
205
|
+
this.themeSvc.settingsChange
|
|
206
|
+
.pipe(takeUntil(this.#ngUnsubscribe))
|
|
207
|
+
.subscribe(() => {
|
|
208
|
+
this.#changeDetector.markForCheck();
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
ngAfterViewInit() {
|
|
213
|
+
if (!this.disabled) {
|
|
214
|
+
this.#addEventListeners();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
ngOnDestroy() {
|
|
218
|
+
this.#removeEventListeners();
|
|
219
|
+
this.#ngUnsubscribe.next();
|
|
220
|
+
this.#ngUnsubscribe.complete();
|
|
221
|
+
this.tokensController.complete();
|
|
222
|
+
}
|
|
223
|
+
addButtonClicked() {
|
|
224
|
+
this.addClick.emit({
|
|
225
|
+
itemAdded: (args) => this.#onAddButtonComplete(args),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
onAutocompleteSelectionChange(change) {
|
|
229
|
+
/* istanbul ignore else */
|
|
230
|
+
if (change.selectedItem) {
|
|
231
|
+
this.#addToSelected(change.selectedItem);
|
|
232
|
+
}
|
|
233
|
+
else if (this.selectMode === 'single') {
|
|
234
|
+
this.writeValue([]);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
onAutocompleteBlur() {
|
|
238
|
+
this.onTouched();
|
|
239
|
+
}
|
|
240
|
+
onTokensChange(change) {
|
|
241
|
+
if (!change) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (this.tokens !== change) {
|
|
245
|
+
if (change.length === 0) {
|
|
246
|
+
this.#focusInput();
|
|
247
|
+
}
|
|
248
|
+
// NOTE: We do this here instead of just using the `value` setter because we need to use the
|
|
249
|
+
// set of tokens returned here for the purposes of setting focus (see `onTokensKeyUp`).
|
|
250
|
+
this.#_value = change.map((token) => {
|
|
251
|
+
return token.value;
|
|
252
|
+
});
|
|
253
|
+
this.tokens = change;
|
|
254
|
+
this.onChange(this.#_value);
|
|
255
|
+
this.onTouched();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
onTokensFocusIndexOverRange() {
|
|
259
|
+
this.#windowRef.nativeWindow.setTimeout(() => {
|
|
260
|
+
this.#focusInput();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
onTokensKeyUp(event) {
|
|
264
|
+
/* istanbul ignore else */
|
|
265
|
+
if (this.selectMode !== 'single') {
|
|
266
|
+
switch (event.key) {
|
|
267
|
+
case 'Backspace':
|
|
268
|
+
this.#sendTokensMessage(SkyTokensMessageType.RemoveActiveToken);
|
|
269
|
+
this.#sendTokensMessage(SkyTokensMessageType.FocusPreviousToken);
|
|
270
|
+
event.preventDefault();
|
|
271
|
+
break;
|
|
272
|
+
case 'Del':
|
|
273
|
+
case 'Delete':
|
|
274
|
+
this.#sendTokensMessage(SkyTokensMessageType.RemoveActiveToken);
|
|
275
|
+
this.#windowRef.nativeWindow.setTimeout(() => {
|
|
276
|
+
this.#sendTokensMessage(SkyTokensMessageType.FocusActiveToken);
|
|
277
|
+
});
|
|
278
|
+
event.preventDefault();
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
onTokensRendered() {
|
|
284
|
+
this.#sendAutocompleteMessage(SkyAutocompleteMessageType.RepositionDropdown);
|
|
285
|
+
}
|
|
286
|
+
writeValue(value) {
|
|
287
|
+
// Since we are dealing with arrays - clone the array being sent in to ensure we aren't modifying a consumers outer array
|
|
288
|
+
this.value = value ? value.slice() : [];
|
|
289
|
+
this.#updateForSelectMode();
|
|
290
|
+
}
|
|
291
|
+
registerOnChange(fn) {
|
|
292
|
+
this.onChange = fn;
|
|
293
|
+
}
|
|
294
|
+
registerOnTouched(fn) {
|
|
295
|
+
this.onTouched = fn;
|
|
296
|
+
}
|
|
297
|
+
// Allows Angular to disable the input.
|
|
298
|
+
setDisabledState(disabled) {
|
|
299
|
+
this.#removeEventListeners();
|
|
300
|
+
if (!disabled) {
|
|
301
|
+
this.#addEventListeners();
|
|
302
|
+
}
|
|
303
|
+
this.disabled = disabled;
|
|
304
|
+
this.#changeDetector.markForCheck();
|
|
305
|
+
}
|
|
306
|
+
clearSearchText() {
|
|
307
|
+
if (this.autocompleteInputDirective) {
|
|
308
|
+
this.autocompleteInputDirective.value = undefined;
|
|
309
|
+
this.autocompleteInputDirective.inputTextValue = '';
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Handles when to focus on the tokens.
|
|
313
|
+
// Check for empty search text on keydown, before the escape key is fully pressed.
|
|
314
|
+
// (Otherwise, a single character being escaped would register as empty on keyup.)
|
|
315
|
+
// If empty on keydown, set a flag so that the appropriate action can be taken on keyup.
|
|
316
|
+
inputKeydown(event) {
|
|
317
|
+
const value = event.target.value;
|
|
318
|
+
/* Sanity check as this should only be called when in multiple select mode */
|
|
319
|
+
/* istanbul ignore else */
|
|
320
|
+
if (this.selectMode !== 'single') {
|
|
321
|
+
switch (event.key) {
|
|
322
|
+
case 'Enter':
|
|
323
|
+
event.preventDefault();
|
|
324
|
+
break;
|
|
325
|
+
case 'ArrowLeft':
|
|
326
|
+
case 'Backspace':
|
|
327
|
+
case 'Left':
|
|
328
|
+
if (value) {
|
|
329
|
+
this.#markForTokenFocusOnKeyUp = false;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
this.#markForTokenFocusOnKeyUp = true;
|
|
333
|
+
}
|
|
334
|
+
break;
|
|
335
|
+
default:
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
inputKeyup(event) {
|
|
340
|
+
/* Sanity check as this should only be called when in multiple select mode */
|
|
341
|
+
/* istanbul ignore else */
|
|
342
|
+
if (this.selectMode !== 'single') {
|
|
343
|
+
switch (event.key) {
|
|
344
|
+
case 'Esc':
|
|
345
|
+
case 'Escape':
|
|
346
|
+
this.clearSearchText();
|
|
347
|
+
event.preventDefault();
|
|
348
|
+
break;
|
|
349
|
+
case 'ArrowLeft':
|
|
350
|
+
case 'Backspace':
|
|
351
|
+
case 'Left':
|
|
352
|
+
/* istanbul ignore else */
|
|
353
|
+
if (this.#markForTokenFocusOnKeyUp) {
|
|
354
|
+
this.#sendTokensMessage(SkyTokensMessageType.FocusLastToken);
|
|
355
|
+
event.preventDefault();
|
|
356
|
+
}
|
|
357
|
+
break;
|
|
358
|
+
default:
|
|
359
|
+
}
|
|
360
|
+
event.stopPropagation();
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
onSearchButtonClick() {
|
|
364
|
+
/*istanbul ignore next*/
|
|
365
|
+
if (this.disabled) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
this.#sendAutocompleteMessage(SkyAutocompleteMessageType.CloseDropdown);
|
|
369
|
+
let isValueInTextBox = false;
|
|
370
|
+
if (this.selectMode === 'single') {
|
|
371
|
+
isValueInTextBox =
|
|
372
|
+
this.autocompleteInputDirective?.value &&
|
|
373
|
+
this.autocompleteInputDirective.inputTextValue ===
|
|
374
|
+
this.autocompleteInputDirective.value[this.descriptorProperty];
|
|
375
|
+
}
|
|
376
|
+
let searchValue = '';
|
|
377
|
+
if (!isValueInTextBox && this.autocompleteInputDirective) {
|
|
378
|
+
searchValue = this.autocompleteInputDirective.inputTextValue;
|
|
379
|
+
}
|
|
380
|
+
this.openPicker(searchValue);
|
|
381
|
+
this.autocompleteInputDirective?.restoreInputTextValueToPreviousState();
|
|
382
|
+
}
|
|
383
|
+
onShowMoreClick(event) {
|
|
384
|
+
/* Sanity check */
|
|
385
|
+
/* istanbul ignore else*/
|
|
386
|
+
if (event) {
|
|
387
|
+
this.openPicker(event.inputValue);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
openPicker(initialSearch) {
|
|
391
|
+
if (this.showMoreConfig?.customPicker) {
|
|
392
|
+
this.showMorePickerId = undefined;
|
|
393
|
+
this.showMoreConfig.customPicker.open({
|
|
394
|
+
items: this.data,
|
|
395
|
+
initialSearch,
|
|
396
|
+
initialValue: this.value,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
const initialValue = this.value;
|
|
401
|
+
if (this.#hasSearchAsync()) {
|
|
402
|
+
this.#openSelectionModal =
|
|
403
|
+
this.#createSelectionModalInstance(initialSearch);
|
|
404
|
+
this.showMorePickerId = this.#openSelectionModal.id;
|
|
405
|
+
this.#openSelectionModal.closed.subscribe((closeArgs) => {
|
|
406
|
+
this.#processPickerResult(closeArgs.reason === 'save' ? closeArgs.selectedItems : initialValue);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
this.#openNativePicker =
|
|
411
|
+
this.#createNativePickerInstance(initialSearch);
|
|
412
|
+
this.showMorePickerId = this.#openNativePicker.componentInstance.id;
|
|
413
|
+
this.#openNativePicker.componentInstance.addClick.subscribe(() => {
|
|
414
|
+
this.addButtonClicked();
|
|
415
|
+
});
|
|
416
|
+
this.#openNativePicker.closed.subscribe((closeArgs) => {
|
|
417
|
+
let selectedItems;
|
|
418
|
+
if (closeArgs.reason === 'save') {
|
|
419
|
+
selectedItems = [];
|
|
420
|
+
this.data.forEach((item, dataIndex) => {
|
|
421
|
+
if (closeArgs.data.some((savedItem) => {
|
|
422
|
+
return savedItem.index === dataIndex;
|
|
423
|
+
})) {
|
|
424
|
+
selectedItems.push(item);
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
selectedItems = initialValue;
|
|
430
|
+
}
|
|
431
|
+
this.#processPickerResult(selectedItems);
|
|
432
|
+
});
|
|
433
|
+
this.#changeDetector.markForCheck();
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
#createSelectionModalInstance(initialSearch) {
|
|
438
|
+
const initialValue = this.value;
|
|
439
|
+
const modalConfig = this.showMoreConfig?.nativePickerConfig || {};
|
|
440
|
+
if (!modalConfig.itemTemplate) {
|
|
441
|
+
modalConfig.itemTemplate = this.searchResultTemplate;
|
|
442
|
+
}
|
|
443
|
+
if (this.idProperty === undefined) {
|
|
444
|
+
this.#logSvc.error("The lookup component's 'idProperty' input is required when `enableShowMore` and 'searchAsync' are used together.");
|
|
445
|
+
}
|
|
446
|
+
return this.#selectionModalSvc.open({
|
|
447
|
+
descriptorProperty: this.descriptorProperty,
|
|
448
|
+
idProperty: this.idProperty,
|
|
449
|
+
searchAsync: (args) => {
|
|
450
|
+
const searchAsyncArgs = {
|
|
451
|
+
displayType: 'modal',
|
|
452
|
+
offset: args.offset,
|
|
453
|
+
searchText: args.searchText,
|
|
454
|
+
continuationData: args.continuationData,
|
|
455
|
+
};
|
|
456
|
+
this.searchAsync.emit(searchAsyncArgs);
|
|
457
|
+
return searchAsyncArgs.result;
|
|
458
|
+
},
|
|
459
|
+
selectMode: this.selectMode,
|
|
460
|
+
addClick: () => {
|
|
461
|
+
this.addButtonClicked();
|
|
462
|
+
},
|
|
463
|
+
initialSearch,
|
|
464
|
+
itemTemplate: modalConfig.itemTemplate,
|
|
465
|
+
showAddButton: this.showAddButton,
|
|
466
|
+
title: modalConfig.title,
|
|
467
|
+
value: initialValue,
|
|
468
|
+
wrapperClass: this.wrapperClass,
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
#createNativePickerInstance(initialSearch) {
|
|
472
|
+
const initialValue = this.value;
|
|
473
|
+
const modalConfig = this.showMoreConfig?.nativePickerConfig || {};
|
|
474
|
+
if (!modalConfig.itemTemplate) {
|
|
475
|
+
modalConfig.itemTemplate = this.searchResultTemplate;
|
|
476
|
+
}
|
|
477
|
+
const contextProviderValue = new SkyLookupShowMoreNativePickerContext(this.descriptorProperty, initialSearch, initialValue, this.data, this.searchOrDefault, this.selectMode, this.showAddButton, modalConfig);
|
|
478
|
+
return this.#modalService.open(SkyLookupShowMoreModalComponent, {
|
|
479
|
+
providers: [
|
|
480
|
+
{
|
|
481
|
+
provide: SkyLookupShowMoreNativePickerContext,
|
|
482
|
+
useValue: contextProviderValue,
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
provide: SkyLookupAdapterService,
|
|
486
|
+
useValue: this.#adapter,
|
|
487
|
+
},
|
|
488
|
+
],
|
|
489
|
+
size: 'large',
|
|
490
|
+
wrapperClass: this.wrapperClass,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
#processPickerResult(selectedItems) {
|
|
494
|
+
this.#openSelectionModal = undefined;
|
|
495
|
+
this.#openNativePicker = undefined;
|
|
496
|
+
this.showMorePickerId = undefined;
|
|
497
|
+
/* istanbul ignore next */
|
|
498
|
+
selectedItems = selectedItems || [];
|
|
499
|
+
this.writeValue(selectedItems);
|
|
500
|
+
this.#focusInput();
|
|
501
|
+
this.#changeDetector.markForCheck();
|
|
502
|
+
}
|
|
503
|
+
onSearchAsync(args) {
|
|
504
|
+
this.searchAsync.emit(args);
|
|
505
|
+
}
|
|
506
|
+
#addToSelected(item) {
|
|
507
|
+
let selectedItems;
|
|
508
|
+
if (this.selectMode === 'single') {
|
|
509
|
+
selectedItems = [item];
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
selectedItems = this.value;
|
|
513
|
+
const idProperty = this.idProperty || '';
|
|
514
|
+
// If items have a unique identifier, don't allow the same item to be added twice.
|
|
515
|
+
if (!this.idProperty ||
|
|
516
|
+
!this.value.some((existingItem) => existingItem[idProperty] === item[idProperty])) {
|
|
517
|
+
selectedItems.push(item);
|
|
518
|
+
}
|
|
519
|
+
this.clearSearchText();
|
|
520
|
+
}
|
|
521
|
+
this.writeValue(selectedItems);
|
|
522
|
+
}
|
|
523
|
+
#addEventListeners() {
|
|
524
|
+
this.#idle = new Subject();
|
|
525
|
+
this.#focusInputOnHostClick();
|
|
526
|
+
}
|
|
527
|
+
#removeEventListeners() {
|
|
528
|
+
this.#idle.next();
|
|
529
|
+
this.#idle.complete();
|
|
530
|
+
}
|
|
531
|
+
#focusInputOnHostClick() {
|
|
532
|
+
let hostElement = !this.inputBoxHostSvc
|
|
533
|
+
? this.#elementRef.nativeElement
|
|
534
|
+
: this.lookupWrapperRef?.nativeElement;
|
|
535
|
+
const documentObj = this.#windowRef.nativeWindow.document;
|
|
536
|
+
// Handles focusing the input when the host is clicked.
|
|
537
|
+
// The input should NOT be focused if other elements (tokens, etc.)
|
|
538
|
+
// are currently focused or being tabbed through.
|
|
539
|
+
observableFromEvent(documentObj, 'mousedown')
|
|
540
|
+
.pipe(takeUntil(this.#idle))
|
|
541
|
+
.subscribe((event) => {
|
|
542
|
+
hostElement = !this.inputBoxHostSvc
|
|
543
|
+
? this.#elementRef.nativeElement
|
|
544
|
+
: this.lookupWrapperRef?.nativeElement;
|
|
545
|
+
this.isInputFocused = hostElement.contains(event.target);
|
|
546
|
+
this.#changeDetector.markForCheck();
|
|
547
|
+
});
|
|
548
|
+
observableFromEvent(documentObj, 'focusin')
|
|
549
|
+
.pipe(takeUntil(this.#idle))
|
|
550
|
+
.subscribe((event) => {
|
|
551
|
+
hostElement = !this.inputBoxHostSvc
|
|
552
|
+
? this.#elementRef.nativeElement
|
|
553
|
+
: this.lookupWrapperRef?.nativeElement;
|
|
554
|
+
this.isInputFocused = hostElement.contains(event.target);
|
|
555
|
+
this.#changeDetector.markForCheck();
|
|
556
|
+
});
|
|
557
|
+
if (hostElement) {
|
|
558
|
+
observableFromEvent(hostElement, 'mouseup')
|
|
559
|
+
.pipe(takeUntil(this.#idle))
|
|
560
|
+
.subscribe(() => {
|
|
561
|
+
const classList = documentObj.activeElement.classList;
|
|
562
|
+
if (!classList || !classList.contains('sky-token')) {
|
|
563
|
+
this.#focusInput();
|
|
564
|
+
}
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
#focusInput() {
|
|
569
|
+
if (this.lookupWrapperRef) {
|
|
570
|
+
this.#adapter.focusInput(this.lookupWrapperRef);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
#onAddButtonComplete(args) {
|
|
574
|
+
if (this.#openSelectionModal) {
|
|
575
|
+
// Notify the selection modal of the new item. The selection
|
|
576
|
+
// modal will decide whether the new item should be added
|
|
577
|
+
// to the value when the user confirms or cancels the
|
|
578
|
+
// selection modal.
|
|
579
|
+
this.#openSelectionModal.addItem(args.item);
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
let addItemToValue;
|
|
583
|
+
if (this.#hasSearchAsync()) {
|
|
584
|
+
addItemToValue = true;
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
if (args.data) {
|
|
588
|
+
this.data = args.data;
|
|
589
|
+
}
|
|
590
|
+
if (this.data.indexOf(args.item) >= 0) {
|
|
591
|
+
if (this.#openNativePicker) {
|
|
592
|
+
// Notify the picker of the new item. The picker will
|
|
593
|
+
// decide whether the new item should be added to the
|
|
594
|
+
// value when the user confirms or cancels the picker.
|
|
595
|
+
this.#openNativePicker
|
|
596
|
+
.componentInstance.onItemSelect(true, { value: args.item, selected: false });
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
addItemToValue = true;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
if (addItemToValue) {
|
|
604
|
+
const newValue = this.selectMode === 'multiple'
|
|
605
|
+
? this.value.concat(args.item)
|
|
606
|
+
: [args.item];
|
|
607
|
+
this.writeValue(newValue);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
#parseTokens(data) {
|
|
612
|
+
return data.map((item) => {
|
|
613
|
+
return {
|
|
614
|
+
value: item,
|
|
615
|
+
};
|
|
616
|
+
});
|
|
617
|
+
}
|
|
618
|
+
#sendAutocompleteMessage(type) {
|
|
619
|
+
this.autocompleteController.next({ type });
|
|
620
|
+
}
|
|
621
|
+
#sendTokensMessage(type) {
|
|
622
|
+
this.tokensController.next({ type });
|
|
623
|
+
}
|
|
624
|
+
#updateForSelectMode() {
|
|
625
|
+
if (this.autocompleteInputDirective) {
|
|
626
|
+
if (this.selectMode === 'single') {
|
|
627
|
+
this.autocompleteInputDirective.value = this.value && this.value[0];
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
this.clearSearchText();
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
#hasSearchAsync() {
|
|
635
|
+
return this.searchAsync.observers.length > 0;
|
|
636
|
+
}
|
|
637
|
+
#pickerModalOpen() {
|
|
638
|
+
return !!(this.#openNativePicker || this.#openSelectionModal);
|
|
639
|
+
}
|
|
640
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyLookupComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAppWindowRef }, { token: i2.SkyLookupAdapterService }, { token: i3.SkyModalService }, { token: i4.SkyLibResourcesService }, { token: i5.SkySelectionModalService }, { token: i1.SkyLogService }, { token: i6.NgControl, optional: true, self: true }, { token: i7.SkyInputBoxHostService, optional: true }, { token: i8.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
641
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyLookupComponent, selector: "sky-lookup", inputs: { ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", autocompleteAttribute: "autocompleteAttribute", data: "data", disabled: "disabled", enableShowMore: "enableShowMore", placeholderText: "placeholderText", idProperty: "idProperty", showAddButton: "showAddButton", showMoreConfig: "showMoreConfig", selectMode: "selectMode", wrapperClass: "wrapperClass" }, outputs: { addClick: "addClick" }, providers: [SkyLookupAdapterService], viewQueries: [{ propertyName: "autocompleteInputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true, read: SkyAutocompleteInputDirective }, { propertyName: "showMoreButtonTemplateRef", first: true, predicate: ["showMoreButtonTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "inputTemplateRef", first: true, predicate: ["inputTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "lookupWrapperRef", first: true, predicate: ["lookupWrapper"], descendants: true, read: ElementRef }, { propertyName: "searchIconTemplateRef", first: true, predicate: ["searchIconTemplateRef"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"!inputBoxHostSvc\">\n <ng-container *ngTemplateOutlet=\"inputTemplateRef\"></ng-container>\n</ng-container>\n\n<ng-template #inputTemplateRef>\n <div\n class=\"sky-lookup\"\n [ngClass]=\"{\n 'sky-lookup-focused': isInputFocused,\n 'sky-lookup-disabled': disabled,\n 'sky-lookup-single': selectMode === 'single'\n }\"\n #lookupWrapper\n >\n <sky-autocomplete\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [attr.data-sky-lookup-show-more-picker-id]=\"showMorePickerId\"\n [data]=\"data\"\n [debounceTime]=\"debounceTime\"\n [descriptorProperty]=\"descriptorProperty\"\n [enableShowMore]=\"enableShowMore\"\n [messageStream]=\"autocompleteController\"\n [propertiesToSearch]=\"propertiesToSearch\"\n [search]=\"searchOrDefault\"\n [searchAsyncDisabled]=\"searchAsync.observers.length === 0\"\n [searchFilters]=\"searchFilters\"\n [searchResultsLimit]=\"searchResultsLimit\"\n [searchResultTemplate]=\"searchResultTemplate\"\n [searchTextMinimumCharacters]=\"searchTextMinimumCharacters\"\n [showAddButton]=\"showAddButton\"\n [wrapperClass]=\"wrapperClass\"\n (addClick)=\"addButtonClicked()\"\n (searchAsync)=\"onSearchAsync($event)\"\n (selectionChange)=\"onAutocompleteSelectionChange($event)\"\n (showMoreClick)=\"onShowMoreClick($event)\"\n >\n <div class=\"sky-lookup-search-flex-wrapper\">\n <div\n class=\"sky-lookup-search\"\n [ngClass]=\"{\n 'sky-field-status-active': isInputFocused && !disabled\n }\"\n >\n <sky-tokens\n *ngIf=\"selectMode === 'multiple'\"\n class=\"sky-lookup-tokens\"\n [disabled]=\"disabled\"\n [displayWith]=\"descriptorProperty\"\n [focusable]=\"false\"\n [messageStream]=\"tokensController\"\n [trackWith]=\"idProperty\"\n [tokens]=\"tokens\"\n (keyup)=\"onTokensKeyUp($event)\"\n (tokensChange)=\"onTokensChange($event)\"\n (tokensRendered)=\"onTokensRendered()\"\n (tokenSelected)=\"enableShowMore ? openPicker('') : undefined\"\n (focusIndexOverRange)=\"onTokensFocusIndexOverRange()\"\n >\n <textarea\n class=\"sky-form-control sky-lookup-input\"\n rows=\"1\"\n skyAutocomplete\n wrap=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"controlId\"\n [attr.placeholder]=\"placeholderText\"\n [autocompleteAttribute]=\"autocompleteAttribute\"\n [disabled]=\"disabled\"\n (blur)=\"onAutocompleteBlur()\"\n (keydown)=\"inputKeydown($event)\"\n (keyup)=\"inputKeyup($event)\"\n ></textarea>\n <ng-container *ngIf=\"!inputBoxHostSvc && !enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"searchIconTemplateRef\"\n ></ng-container>\n </ng-container>\n </sky-tokens>\n <div\n *ngIf=\"selectMode === 'single'\"\n class=\"sky-lookup-single-control\"\n >\n <textarea\n class=\"sky-form-control sky-lookup-input\"\n rows=\"1\"\n skyAutocomplete\n wrap=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"controlId\"\n [attr.placeholder]=\"placeholderText\"\n [autocompleteAttribute]=\"autocompleteAttribute\"\n [disabled]=\"disabled\"\n (blur)=\"onAutocompleteBlur()\"\n ></textarea>\n <ng-container *ngIf=\"!inputBoxHostSvc && !enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"searchIconTemplateRef\"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!inputBoxHostSvc && enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"showMoreButtonTemplateRef\"\n ></ng-container>\n </ng-container>\n </div>\n </sky-autocomplete>\n </div>\n</ng-template>\n\n<ng-template #showMoreButtonTemplateRef>\n <div class=\"sky-input-group-btn\">\n <button\n class=\"sky-btn sky-btn-default\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'sky-btn-disabled': disabled }\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_lookup_search_button_show_more' | skyLibResources\n \"\n (click)=\"onSearchButtonClick()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"search\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n iconType=\"skyux\"\n icon=\"search\"\n ></sky-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #searchIconTemplateRef>\n <div\n class=\"sky-input-group-icon sky-input-box-icon-inset\"\n [ngClass]=\"{ 'sky-lookup-disabled': disabled }\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"search\"></sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" iconType=\"skyux\" icon=\"search\"></sky-icon>\n </div>\n</ng-template>\n", styles: [".sky-lookup .sky-lookup-input.sky-form-control{resize:none;border:0;box-sizing:content-box;height:1.428571429em;overflow:hidden;padding:0;background-color:transparent}.sky-lookup .sky-lookup-input.sky-form-control:focus{outline:none;box-shadow:none}.sky-lookup .sky-lookup-search-flex-wrapper{display:flex}.sky-lookup.sky-lookup-disabled .sky-lookup-search{background-color:#cdcfd2}.sky-lookup sky-tokens.sky-lookup-tokens:focus{outline:none}.sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-5px;margin-bottom:-5px}.sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-top:5px;padding-bottom:5px;padding-left:10px;flex-basis:100px}.sky-lookup .sky-lookup-single-control{display:inline-flex;padding-left:7px;width:100%}.sky-lookup-search{cursor:text;background-color:#fff;line-height:1.428571429em;padding:6px 12px 6px 3px;flex-grow:1}.sky-lookup-search:not(.sky-field-status-active){border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2}.sky-lookup-disabled .sky-lookup-search{cursor:default}.sky-lookup-focused .sky-tokens-content{flex-basis:100px}.sky-lookup-single sky-tokens.sky-lookup-tokens sky-token{display:none}sky-lookup.ng-invalid.ng-touched .sky-lookup-search{box-shadow:0 0 8px #ef404499;border:1px solid var(--sky-highlight-color-danger);outline:none}sky-input-box .sky-lookup{width:100%}sky-input-box .sky-lookup .sky-lookup-search{border:none;padding-bottom:5px;width:100%}:host-context(.sky-theme-modern) sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-6px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup{margin-top:-23px;padding-top:26px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens sky-token{z-index:1}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:0;margin-bottom:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens sky-token{padding-bottom:0;padding-top:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-bottom:0;padding-top:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content:first-child{padding-left:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup.sky-lookup-single sky-tokens.sky-lookup-tokens .sky-tokens-content{padding-left:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-search{background-color:transparent;padding:0 0 0 15px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-search.sky-field-status-active{box-shadow:none}:host-context(.sky-theme-modern) sky-input-box .sky-lookup textarea.sky-lookup-input.sky-form-control{padding-left:0;resize:none}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-single-control{padding-left:0}.sky-theme-modern sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-6px}.sky-theme-modern sky-input-box .sky-lookup{margin-top:-23px;padding-top:26px}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens sky-token{z-index:1}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:0;margin-bottom:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens sky-token{padding-bottom:0;padding-top:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-bottom:0;padding-top:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content:first-child{padding-left:0}.sky-theme-modern sky-input-box .sky-lookup.sky-lookup-single sky-tokens.sky-lookup-tokens .sky-tokens-content{padding-left:0}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-search{background-color:transparent;padding:0 0 0 15px}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-search.sky-field-status-active{box-shadow:none}.sky-theme-modern sky-input-box .sky-lookup textarea.sky-lookup-input.sky-form-control{padding-left:0;resize:none}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-single-control{padding-left:0}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i10.SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: ["ariaLabelledBy", "data", "debounceTime", "descriptorProperty", "enableShowMore", "messageStream", "wrapperClass", "propertiesToSearch", "search", "searchResultTemplate", "searchTextMinimumCharacters", "searchFilters", "searchResultsLimit", "showAddButton", "noResultsFoundText", "searchAsyncDisabled"], outputs: ["addClick", "showMoreClick", "selectionChange", "searchAsync"] }, { kind: "directive", type: i11.SkyAutocompleteInputDirective, selector: "input[skyAutocomplete], textarea[skyAutocomplete]", inputs: ["autocompleteAttribute", "disabled"] }, { kind: "component", type: i12.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i8.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "component", type: i12.λ13, selector: "sky-tokens", inputs: ["disabled", "dismissible", "displayWith", "trackWith", "focusable", "tokens", "messageStream"], outputs: ["focusIndexOverRange", "focusIndexUnderRange", "tokenSelected", "tokensChange", "tokensRendered"] }, { kind: "pipe", type: i4.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
642
|
+
}
|
|
643
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyLookupComponent, decorators: [{
|
|
644
|
+
type: Component,
|
|
645
|
+
args: [{ selector: 'sky-lookup', providers: [SkyLookupAdapterService], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!inputBoxHostSvc\">\n <ng-container *ngTemplateOutlet=\"inputTemplateRef\"></ng-container>\n</ng-container>\n\n<ng-template #inputTemplateRef>\n <div\n class=\"sky-lookup\"\n [ngClass]=\"{\n 'sky-lookup-focused': isInputFocused,\n 'sky-lookup-disabled': disabled,\n 'sky-lookup-single': selectMode === 'single'\n }\"\n #lookupWrapper\n >\n <sky-autocomplete\n [ariaLabelledBy]=\"ariaLabelledBy\"\n [attr.data-sky-lookup-show-more-picker-id]=\"showMorePickerId\"\n [data]=\"data\"\n [debounceTime]=\"debounceTime\"\n [descriptorProperty]=\"descriptorProperty\"\n [enableShowMore]=\"enableShowMore\"\n [messageStream]=\"autocompleteController\"\n [propertiesToSearch]=\"propertiesToSearch\"\n [search]=\"searchOrDefault\"\n [searchAsyncDisabled]=\"searchAsync.observers.length === 0\"\n [searchFilters]=\"searchFilters\"\n [searchResultsLimit]=\"searchResultsLimit\"\n [searchResultTemplate]=\"searchResultTemplate\"\n [searchTextMinimumCharacters]=\"searchTextMinimumCharacters\"\n [showAddButton]=\"showAddButton\"\n [wrapperClass]=\"wrapperClass\"\n (addClick)=\"addButtonClicked()\"\n (searchAsync)=\"onSearchAsync($event)\"\n (selectionChange)=\"onAutocompleteSelectionChange($event)\"\n (showMoreClick)=\"onShowMoreClick($event)\"\n >\n <div class=\"sky-lookup-search-flex-wrapper\">\n <div\n class=\"sky-lookup-search\"\n [ngClass]=\"{\n 'sky-field-status-active': isInputFocused && !disabled\n }\"\n >\n <sky-tokens\n *ngIf=\"selectMode === 'multiple'\"\n class=\"sky-lookup-tokens\"\n [disabled]=\"disabled\"\n [displayWith]=\"descriptorProperty\"\n [focusable]=\"false\"\n [messageStream]=\"tokensController\"\n [trackWith]=\"idProperty\"\n [tokens]=\"tokens\"\n (keyup)=\"onTokensKeyUp($event)\"\n (tokensChange)=\"onTokensChange($event)\"\n (tokensRendered)=\"onTokensRendered()\"\n (tokenSelected)=\"enableShowMore ? openPicker('') : undefined\"\n (focusIndexOverRange)=\"onTokensFocusIndexOverRange()\"\n >\n <textarea\n class=\"sky-form-control sky-lookup-input\"\n rows=\"1\"\n skyAutocomplete\n wrap=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"controlId\"\n [attr.placeholder]=\"placeholderText\"\n [autocompleteAttribute]=\"autocompleteAttribute\"\n [disabled]=\"disabled\"\n (blur)=\"onAutocompleteBlur()\"\n (keydown)=\"inputKeydown($event)\"\n (keyup)=\"inputKeyup($event)\"\n ></textarea>\n <ng-container *ngIf=\"!inputBoxHostSvc && !enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"searchIconTemplateRef\"\n ></ng-container>\n </ng-container>\n </sky-tokens>\n <div\n *ngIf=\"selectMode === 'single'\"\n class=\"sky-lookup-single-control\"\n >\n <textarea\n class=\"sky-form-control sky-lookup-input\"\n rows=\"1\"\n skyAutocomplete\n wrap=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"controlId\"\n [attr.placeholder]=\"placeholderText\"\n [autocompleteAttribute]=\"autocompleteAttribute\"\n [disabled]=\"disabled\"\n (blur)=\"onAutocompleteBlur()\"\n ></textarea>\n <ng-container *ngIf=\"!inputBoxHostSvc && !enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"searchIconTemplateRef\"\n ></ng-container>\n </ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!inputBoxHostSvc && enableShowMore\">\n <ng-container\n *ngTemplateOutlet=\"showMoreButtonTemplateRef\"\n ></ng-container>\n </ng-container>\n </div>\n </sky-autocomplete>\n </div>\n</ng-template>\n\n<ng-template #showMoreButtonTemplateRef>\n <div class=\"sky-input-group-btn\">\n <button\n class=\"sky-btn sky-btn-default\"\n [disabled]=\"disabled\"\n [ngClass]=\"{ 'sky-btn-disabled': disabled }\"\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_lookup_search_button_show_more' | skyLibResources\n \"\n (click)=\"onSearchButtonClick()\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"search\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n iconType=\"skyux\"\n icon=\"search\"\n ></sky-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #searchIconTemplateRef>\n <div\n class=\"sky-input-group-icon sky-input-box-icon-inset\"\n [ngClass]=\"{ 'sky-lookup-disabled': disabled }\"\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"search\"></sky-icon>\n <sky-icon *skyThemeIf=\"'modern'\" iconType=\"skyux\" icon=\"search\"></sky-icon>\n </div>\n</ng-template>\n", styles: [".sky-lookup .sky-lookup-input.sky-form-control{resize:none;border:0;box-sizing:content-box;height:1.428571429em;overflow:hidden;padding:0;background-color:transparent}.sky-lookup .sky-lookup-input.sky-form-control:focus{outline:none;box-shadow:none}.sky-lookup .sky-lookup-search-flex-wrapper{display:flex}.sky-lookup.sky-lookup-disabled .sky-lookup-search{background-color:#cdcfd2}.sky-lookup sky-tokens.sky-lookup-tokens:focus{outline:none}.sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-5px;margin-bottom:-5px}.sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-top:5px;padding-bottom:5px;padding-left:10px;flex-basis:100px}.sky-lookup .sky-lookup-single-control{display:inline-flex;padding-left:7px;width:100%}.sky-lookup-search{cursor:text;background-color:#fff;line-height:1.428571429em;padding:6px 12px 6px 3px;flex-grow:1}.sky-lookup-search:not(.sky-field-status-active){border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2}.sky-lookup-disabled .sky-lookup-search{cursor:default}.sky-lookup-focused .sky-tokens-content{flex-basis:100px}.sky-lookup-single sky-tokens.sky-lookup-tokens sky-token{display:none}sky-lookup.ng-invalid.ng-touched .sky-lookup-search{box-shadow:0 0 8px #ef404499;border:1px solid var(--sky-highlight-color-danger);outline:none}sky-input-box .sky-lookup{width:100%}sky-input-box .sky-lookup .sky-lookup-search{border:none;padding-bottom:5px;width:100%}:host-context(.sky-theme-modern) sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-6px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup{margin-top:-23px;padding-top:26px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens sky-token{z-index:1}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:0;margin-bottom:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens sky-token{padding-bottom:0;padding-top:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-bottom:0;padding-top:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content:first-child{padding-left:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup.sky-lookup-single sky-tokens.sky-lookup-tokens .sky-tokens-content{padding-left:0}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-search{background-color:transparent;padding:0 0 0 15px}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-search.sky-field-status-active{box-shadow:none}:host-context(.sky-theme-modern) sky-input-box .sky-lookup textarea.sky-lookup-input.sky-form-control{padding-left:0;resize:none}:host-context(.sky-theme-modern) sky-input-box .sky-lookup .sky-lookup-single-control{padding-left:0}.sky-theme-modern sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:-6px}.sky-theme-modern sky-input-box .sky-lookup{margin-top:-23px;padding-top:26px}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens sky-token{z-index:1}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens{margin-top:0;margin-bottom:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens sky-token{padding-bottom:0;padding-top:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content{padding-bottom:0;padding-top:0}.sky-theme-modern sky-input-box .sky-lookup sky-tokens.sky-lookup-tokens .sky-tokens .sky-tokens-content:first-child{padding-left:0}.sky-theme-modern sky-input-box .sky-lookup.sky-lookup-single sky-tokens.sky-lookup-tokens .sky-tokens-content{padding-left:0}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-search{background-color:transparent;padding:0 0 0 15px}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-search.sky-field-status-active{box-shadow:none}.sky-theme-modern sky-input-box .sky-lookup textarea.sky-lookup-input.sky-form-control{padding-left:0;resize:none}.sky-theme-modern sky-input-box .sky-lookup .sky-lookup-single-control{padding-left:0}\n"] }]
|
|
646
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyAppWindowRef }, { type: i2.SkyLookupAdapterService }, { type: i3.SkyModalService }, { type: i4.SkyLibResourcesService }, { type: i5.SkySelectionModalService }, { type: i1.SkyLogService }, { type: i6.NgControl, decorators: [{
|
|
647
|
+
type: Self
|
|
648
|
+
}, {
|
|
649
|
+
type: Optional
|
|
650
|
+
}] }, { type: i7.SkyInputBoxHostService, decorators: [{
|
|
651
|
+
type: Optional
|
|
652
|
+
}] }, { type: i8.SkyThemeService, decorators: [{
|
|
653
|
+
type: Optional
|
|
654
|
+
}] }]; }, propDecorators: { ariaLabel: [{
|
|
655
|
+
type: Input
|
|
656
|
+
}], ariaLabelledBy: [{
|
|
657
|
+
type: Input
|
|
658
|
+
}], autocompleteAttribute: [{
|
|
659
|
+
type: Input
|
|
660
|
+
}], data: [{
|
|
661
|
+
type: Input
|
|
662
|
+
}], disabled: [{
|
|
663
|
+
type: Input
|
|
664
|
+
}], enableShowMore: [{
|
|
665
|
+
type: Input
|
|
666
|
+
}], placeholderText: [{
|
|
667
|
+
type: Input
|
|
668
|
+
}], idProperty: [{
|
|
669
|
+
type: Input
|
|
670
|
+
}], showAddButton: [{
|
|
671
|
+
type: Input
|
|
672
|
+
}], showMoreConfig: [{
|
|
673
|
+
type: Input
|
|
674
|
+
}], selectMode: [{
|
|
675
|
+
type: Input
|
|
676
|
+
}], wrapperClass: [{
|
|
677
|
+
type: Input
|
|
678
|
+
}], addClick: [{
|
|
679
|
+
type: Output
|
|
680
|
+
}], autocompleteInputDirective: [{
|
|
681
|
+
type: ViewChild,
|
|
682
|
+
args: [SkyAutocompleteInputDirective, {
|
|
683
|
+
read: SkyAutocompleteInputDirective,
|
|
684
|
+
static: false,
|
|
685
|
+
}]
|
|
686
|
+
}], showMoreButtonTemplateRef: [{
|
|
687
|
+
type: ViewChild,
|
|
688
|
+
args: ['showMoreButtonTemplateRef', {
|
|
689
|
+
read: TemplateRef,
|
|
690
|
+
static: true,
|
|
691
|
+
}]
|
|
692
|
+
}], inputTemplateRef: [{
|
|
693
|
+
type: ViewChild,
|
|
694
|
+
args: ['inputTemplateRef', {
|
|
695
|
+
read: TemplateRef,
|
|
696
|
+
static: true,
|
|
697
|
+
}]
|
|
698
|
+
}], lookupWrapperRef: [{
|
|
699
|
+
type: ViewChild,
|
|
700
|
+
args: ['lookupWrapper', {
|
|
701
|
+
read: ElementRef,
|
|
702
|
+
}]
|
|
703
|
+
}], searchIconTemplateRef: [{
|
|
704
|
+
type: ViewChild,
|
|
705
|
+
args: ['searchIconTemplateRef', {
|
|
706
|
+
read: TemplateRef,
|
|
707
|
+
static: true,
|
|
708
|
+
}]
|
|
709
|
+
}] } });
|
|
710
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sb29rdXAvc3JjL2xpYi9tb2R1bGVzL2xvb2t1cC9sb29rdXAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xvb2t1cC9zcmMvbGliL21vZHVsZXMvbG9va3VwL2xvb2t1cC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUt2QixPQUFPLEVBR0wsb0JBQW9CLEdBQ3JCLE1BQU0sbUJBQW1CLENBQUM7QUFJM0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksbUJBQW1CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUU3RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQU83RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUtyRixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFVdEcsTUFBTSxPQUFPLGtCQUNYLFNBQVEsNEJB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QUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7Z0JBT00sZ0JBQWdCO3NCQUp0QixTQUFTO3VCQUFDLGtCQUFrQixFQUFFO3dCQUM3QixJQUFJLEVBQUUsV0FBVzt3QkFDakIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7Z0JBTU0sZ0JBQWdCO3NCQUh0QixTQUFTO3VCQUFDLGVBQWUsRUFBRTt3QkFDMUIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO2dCQU9NLHFCQUFxQjtzQkFKM0IsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRTt3QkFDbEMsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLE1BQU0sRUFBRSxJQUFJO3FCQUNiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2t5QXBwV2luZG93UmVmLCBTa3lMb2dTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuaW1wb3J0IHsgU2t5SW5wdXRCb3hIb3N0U2VydmljZSB9IGZyb20gJ0Bza3l1eC9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2kxOG4nO1xuaW1wb3J0IHtcbiAgU2t5VG9rZW4sXG4gIFNreVRva2Vuc01lc3NhZ2UsXG4gIFNreVRva2Vuc01lc3NhZ2VUeXBlLFxufSBmcm9tICdAc2t5dXgvaW5kaWNhdG9ycyc7XG5pbXBvcnQgeyBTa3lNb2RhbEluc3RhbmNlLCBTa3lNb2RhbFNlcnZpY2UgfSBmcm9tICdAc2t5dXgvbW9kYWxzJztcbmltcG9ydCB7IFNreVRoZW1lU2VydmljZSB9IGZyb20gJ0Bza3l1eC90aGVtZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi4vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZSB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZSB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZS10eXBlJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jQXJncyB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS90eXBlcy9hdXRvY29tcGxldGUtc2VhcmNoLWFzeW5jLWFyZ3MnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlIH0gZnJvbSAnLi4vYXV0b2NvbXBsZXRlL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWxlY3Rpb24tY2hhbmdlJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNob3dNb3JlQXJncyB9IGZyb20gJy4uL2F1dG9jb21wbGV0ZS90eXBlcy9hdXRvY29tcGxldGUtc2hvdy1tb3JlLWFyZ3MnO1xuaW1wb3J0IHsgU2t5U2VsZWN0aW9uTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vc2VsZWN0aW9uLW1vZGFsL3NlbGVjdGlvbi1tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNreVNlbGVjdGlvbk1vZGFsSW5zdGFuY2UgfSBmcm9tICcuLi9zZWxlY3Rpb24tbW9kYWwvdHlwZXMvc2VsZWN0aW9uLW1vZGFsLWluc3RhbmNlJztcblxuaW1wb3J0IHsgU2t5TG9va3VwQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2xvb2t1cC1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5TG9va3VwQXV0b2NvbXBsZXRlQWRhcHRlciB9IGZyb20gJy4vbG9va3VwLWF1dG9jb21wbGV0ZS1hZGFwdGVyJztcbmltcG9ydCB7IFNreUxvb2t1cFNob3dNb3JlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2xvb2t1cC1zaG93LW1vcmUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUxvb2t1cEFkZENhbGxiYWNrQXJncyB9IGZyb20gJy4vdHlwZXMvbG9va3VwLWFkZC1jbGljay1jYWxsYmFjay1hcmdzJztcbmltcG9ydCB7IFNreUxvb2t1cEFkZENsaWNrRXZlbnRBcmdzIH0gZnJvbSAnLi90eXBlcy9sb29rdXAtYWRkLWNsaWNrLWV2ZW50LWFyZ3MnO1xuaW1wb3J0IHsgU2t5TG9va3VwU2VsZWN0TW9kZVR5cGUgfSBmcm9tICcuL3R5cGVzL2xvb2t1cC1zZWxlY3QtbW9kZS10eXBlJztcbmltcG9ydCB7IFNreUxvb2t1cFNob3dNb3JlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9sb29rdXAtc2hvdy1tb3JlLWNvbmZpZyc7XG5pbXBvcnQgeyBTa3lMb29rdXBTaG93TW9yZU5hdGl2ZVBpY2tlckNvbnRleHQgfSBmcm9tICcuL3R5cGVzL2xvb2t1cC1zaG93LW1vcmUtbmF0aXZlLXBpY2tlci1jb250ZXh0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWxvb2t1cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sb29rdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbU2t5TG9va3VwQWRhcHRlclNlcnZpY2VdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5TG9va3VwQ29tcG9uZW50XG4gIGV4dGVuZHMgU2t5TG9va3VwQXV0b2NvbXBsZXRlQWRhcHRlclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3Nvclxue1xuICAvKipcbiAgICogVGhlIEFSSUEgbGFiZWwgZm9yIHRoZSB0eXBlYWhlYWQgc2VhcmNoIGlucHV0LiBUaGlzIHNldHMgdGhlIGlucHV0J3MgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSB0byBwcm92aWRlIGEgdGV4dCBlcXVpdmFsZW50IGZvclxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgaW5wdXQgaW5jbHVkZXMgYSB2aXNpYmxlIGxhYmVsLCB1c2UgYGFyaWFMYWJlbGxlZEJ5YCBpbnN0ZWFkLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSwgc2VlIHRoZSBbV0FJLUFSSUEgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWxhYmVsKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIEhUTUwgZWxlbWVudCBJRCBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgdHlwZWFoZWFkIHNlYXJjaCBpbnB1dC4gVGhpcyBzZXRzIHRoZSBpbnB1dCdzIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZSB0byBwcm92aWRlIGEgdGV4dCBlcXVpdmFsZW50IGZvclxuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBJZiB0aGUgaW5wdXQgZG9lcyBub3QgaW5jbHVkZSBhIHZpc2libGUgbGFiZWwsIHVzZSBgYXJpYUxhYmVsYCBpbnN0ZWFkLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlLCBzZWUgdGhlIFtXQUktQVJJQSBkZWZpbml0aW9uXShodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEvI2FyaWEtbGFiZWxsZWRieSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGZvciB0aGUgYGF1dG9jb21wbGV0ZWAgYXR0cmlidXRlIG9uIHRoZSBmb3JtIGlucHV0LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGF1dG9jb21wbGV0ZUF0dHJpYnV0ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsb29rdXAgY29tcG9uZW50IHRvIHNlYXJjaCB3aGVuIHVzZXJzXG4gICAqIGVudGVyIHRleHQuIFlvdSBjYW4gc3BlY2lmeSBzdGF0aWMgZGF0YSBzdWNoIGFzIGFuIGFycmF5IG9mIG9iamVjdHMsIG9yXG4gICAqIHlvdSBjYW4gcHVsbCBkYXRhIGZyb20gYSBkYXRhYmFzZS5cbiAgICogQGRlZmF1bHQgW11cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGF0YSA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuI29wZW5OYXRpdmVQaWNrZXIgJiYgIXRoaXMuI2hhc1NlYXJjaEFzeW5jKCkpIHtcbiAgICAgIHRoaXMuI29wZW5OYXRpdmVQaWNrZXIuY29tcG9uZW50SW5zdGFuY2UudXBkYXRlSXRlbURhdGEodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19kYXRhIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgbG9va3VwIGZpZWxkIG9uIHRlbXBsYXRlLWRyaXZlbiBmb3Jtcy4gRG9uJ3QgdXNlIHRoaXMgaW5wdXQgb24gcmVhY3RpdmUgZm9ybXMgYmVjYXVzZSB0aGV5IG1heSBvdmVyd3JpdGUgdGhlIGlucHV0IG9yIGxlYXZlIHRoZSBjb250cm9sIG91dCBvZiBzeW5jLlxuICAgKiBUbyBzZXQgdGhlIGRpc2FibGVkIHN0YXRlIG9uIHJlYWN0aXZlIGZvcm1zLCB1c2UgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGVhZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGlzYWJsZWQgPSB2YWx1ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB1c2VycyB0byBvcGVuIGEgcGlja2VyIHdoZXJlIHRoZXkgY2FuIHZpZXcgYWxsIG9wdGlvbnMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGVuYWJsZVNob3dNb3JlKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2VuYWJsZVNob3dNb3JlID0gdmFsdWUgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVuYWJsZVNob3dNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNfZW5hYmxlU2hvd01vcmU7XG4gIH1cblxuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBsb29rdXAgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgcHJvcGVydHkgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QncyB1bmlxdWUgaWRlbnRpZmllci5cbiAgICogU3BlY2lmeWluZyB0aGlzIHByb3BlcnR5IGVuYWJsZXMgdG9rZW4gYW5pbWF0aW9ucyBhbmQgbW9yZSBlZmZpY2llbnQgcmVuZGVyaW5nLlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgYGVuYWJsZVNob3dNb3JlYCBhbmQgYHNlYXJjaEFzeW5jYCB0b2dldGhlci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBpZFByb3BlcnR5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSBhIGJ1dHRvbiB0aGF0IGxldHMgdXNlcnMgYWRkIG9wdGlvbnMgdG8gdGhlIGxpc3QuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNob3dBZGRCdXR0b24odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2hvd0FkZEJ1dHRvbiA9IHZhbHVlID8/IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaG93QWRkQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNfc2hvd0FkZEJ1dHRvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBwaWNrZXIgdGhhdCBkaXNwbGF5cyBhbGwgb3B0aW9ucy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93TW9yZUNvbmZpZzogU2t5TG9va3VwU2hvd01vcmVDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhYmlsaXR5IGZvciB1c2VycyB0byBzZWxlY3Qgb25lIG9wdGlvbiBvciBtdWx0aXBsZSBvcHRpb25zLlxuICAgKiBAZGVmYXVsdCBcIm11bHRpcGxlXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0TW9kZSh2YWx1ZTogU2t5TG9va3VwU2VsZWN0TW9kZVR5cGUgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtdWx0aXBsZVRvU2luZ2xlOiBib29sZWFuID1cbiAgICAgIHZhbHVlID09PSAnc2luZ2xlJyAmJiB0aGlzLnNlbGVjdE1vZGUgPT09ICdtdWx0aXBsZSc7XG5cbiAgICB0aGlzLiNfc2VsZWN0TW9kZSA9IHZhbHVlO1xuICAgIHRoaXMuI3VwZGF0ZUZvclNlbGVjdE1vZGUoKTtcblxuICAgIGlmIChtdWx0aXBsZVRvU2luZ2xlKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gVGhlIGBzZXRUaW1lb3V0YCBpcyBuZWVkZWQgdG8gYXZvaWQgYSBgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcmAgZXJyb3IgaW4gdGVtcGxhdGUgZm9ybXMuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShbdGhpcy52YWx1ZVswXV0pO1xuICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RNb2RlKCk6IFNreUxvb2t1cFNlbGVjdE1vZGVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlbGVjdE1vZGUgfHwgJ211bHRpcGxlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3cmFwcGVyQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB1c2VycyBzZWxlY3QgdGhlIGJ1dHRvbiB0byBhZGQgb3B0aW9ucyB0byB0aGUgbGlzdC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgYWRkQ2xpY2s6IEV2ZW50RW1pdHRlcjxTa3lMb29rdXBBZGRDbGlja0V2ZW50QXJncz4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgZ2V0IHRva2VucygpOiBTa3lUb2tlbltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3Rva2VucztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdG9rZW5zKHZhbHVlOiBTa3lUb2tlbltdIHwgdW5kZWZpbmVkKSB7XG4gICAgLy8gQ29sbGFwc2UgdGhlIHRva2VucyBpbnRvIGEgc2luZ2xlIHRva2VuIGlmIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBtYW55IG9wdGlvbnMuXG4gICAgaWYgKHRoaXMuZW5hYmxlU2hvd01vcmUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiA1KSB7XG4gICAgICB0aGlzLiNyZXNvdXJjZXNTZXJ2aWNlXG4gICAgICAgIC5nZXRTdHJpbmcoJ3NreXV4X2xvb2t1cF90b2tlbnNfc3VtbWFyeScsIHRoaXMudmFsdWUubGVuZ3RoLnRvU3RyaW5nKCkpXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgdGhpcy4jX3Rva2VucyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFsdWU6IHsgW3RoaXMuZGVzY3JpcHRvclByb3BlcnR5XTogbGFiZWwgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI190b2tlbnMgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLiNfdmFsdWUgPyB0aGlzLiNfdmFsdWUgOiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueVtdKSB7XG4gICAgdGhpcy4jX3ZhbHVlID0gbmV3VmFsdWU7XG5cbiAgICBpZiAoIXRoaXMuI3BpY2tlck1vZGFsT3BlbigpKSB7XG4gICAgICB0aGlzLnRva2VucyA9IHRoaXMuI3BhcnNlVG9rZW5zKG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuI192YWx1ZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBhdXRvY29tcGxldGVDb250cm9sbGVyID0gbmV3IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4oKTtcbiAgcHVibGljIGlzSW5wdXRGb2N1c2VkID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93TW9yZVBpY2tlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyB0b2tlbnNDb250cm9sbGVyID0gbmV3IFN1YmplY3Q8U2t5VG9rZW5zTWVzc2FnZT4oKTtcbiAgcHJvdGVjdGVkIGNvbnRyb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIEBWaWV3Q2hpbGQoU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUsIHtcbiAgICByZWFkOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSxcbiAgICBzdGF0aWM6IGZhbHNlLFxuICB9KVxuICBwdWJsaWMgc2V0IGF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKFxuICAgIHZhbHVlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLiNfYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgPSB2YWx1ZTtcbiAgICB0aGlzLiN1cGRhdGVGb3JTZWxlY3RNb2RlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKCk6XG4gICAgfCBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX2F1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnc2hvd01vcmVCdXR0b25UZW1wbGF0ZVJlZicsIHtcbiAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgICBzdGF0aWM6IHRydWUsXG4gIH0pXG4gIHB1YmxpYyBzaG93TW9yZUJ1dHRvblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICBAVmlld0NoaWxkKCdpbnB1dFRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHVibGljIGlucHV0VGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gIEBWaWV3Q2hpbGQoJ2xvb2t1cFdyYXBwZXInLCB7XG4gICAgcmVhZDogRWxlbWVudFJlZixcbiAgfSlcbiAgcHVibGljIGxvb2t1cFdyYXBwZXJSZWY6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoSWNvblRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHVibGljIHNlYXJjaEljb25UZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgI2FkYXB0ZXI6IFNreUxvb2t1cEFkYXB0ZXJTZXJ2aWNlO1xuICAjZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgI2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgI2lkbGUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAjbWFya0ZvclRva2VuRm9jdXNPbktleVVwID0gZmFsc2U7XG4gICNtb2RhbFNlcnZpY2U6IFNreU1vZGFsU2VydmljZTtcbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAjb3Blbk5hdGl2ZVBpY2tlcjogU2t5TW9kYWxJbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgI29wZW5TZWxlY3Rpb25Nb2RhbDogU2t5U2VsZWN0aW9uTW9kYWxJbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgI3Jlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2U7XG4gICNzZWxlY3Rpb25Nb2RhbFN2YzogU2t5U2VsZWN0aW9uTW9kYWxTZXJ2aWNlO1xuICAjd2luZG93UmVmOiBTa3lBcHBXaW5kb3dSZWY7XG4gICNsb2dTdmM6IFNreUxvZ1NlcnZpY2U7XG5cbiAgI19hdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZTogU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgfCB1bmRlZmluZWQ7XG4gICNfZGF0YTogYW55W10gfCB1bmRlZmluZWQ7XG4gICNfZGlzYWJsZWQgPSBmYWxzZTtcbiAgI19lbmFibGVTaG93TW9yZSA9IGZhbHNlO1xuICAjX3NlbGVjdE1vZGU6IFNreUxvb2t1cFNlbGVjdE1vZGVUeXBlIHwgdW5kZWZpbmVkO1xuICAjX3Nob3dBZGRCdXR0b24gPSBmYWxzZTtcbiAgI190b2tlbnM6IFNreVRva2VuW10gfCB1bmRlZmluZWQ7XG4gICNfdmFsdWU6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHdpbmRvd1JlZjogU2t5QXBwV2luZG93UmVmLFxuICAgIGFkYXB0ZXI6IFNreUxvb2t1cEFkYXB0ZXJTZXJ2aWNlLFxuICAgIG1vZGFsU2VydmljZTogU2t5TW9kYWxTZXJ2aWNlLFxuICAgIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgc2VsZWN0aW9uTW9kYWxTdmM6IFNreVNlbGVjdGlvbk1vZGFsU2VydmljZSxcbiAgICBsb2dTdmM6IFNreUxvZ1NlcnZpY2UsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w/OiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIGlucHV0Qm94SG9zdFN2Yz86IFNreUlucHV0Qm94SG9zdFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHRoZW1lU3ZjPzogU2t5VGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3RvciA9IGNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuI2VsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMuI3dpbmRvd1JlZiA9IHdpbmRvd1JlZjtcbiAgICB0aGlzLiNhZGFwdGVyID0gYWRhcHRlcjtcbiAgICB0aGlzLiNtb2RhbFNlcnZpY2UgPSBtb2RhbFNlcnZpY2U7XG4gICAgdGhpcy4jcmVzb3VyY2VzU2VydmljZSA9IHJlc291cmNlc1NlcnZpY2U7XG4gICAgdGhpcy4jc2VsZWN0aW9uTW9kYWxTdmMgPSBzZWxlY3Rpb25Nb2RhbFN2YztcbiAgICB0aGlzLiNsb2dTdmMgPSBsb2dTdmM7XG5cbiAgICBpZiAobmdDb250cm9sKSB7XG4gICAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0Qm94SG9zdFN2YyAmJiB0aGlzLmlucHV0VGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMuY29udHJvbElkID0gdGhpcy5pbnB1dEJveEhvc3RTdmMuY29udHJvbElkO1xuXG4gICAgICB0aGlzLmlucHV0Qm94SG9zdFN2Yy5wb3B1bGF0ZSh7XG4gICAgICAgIGlucHV0VGVtcGxhdGU6IHRoaXMuaW5wdXRUZW1wbGF0ZVJlZixcbiAgICAgICAgYnV0dG9uc1RlbXBsYXRlOiB0aGlzLmVuYWJsZVNob3dNb3JlXG4gICAgICAgICAgPyB0aGlzLnNob3dNb3JlQnV0dG9uVGVtcGxhdGVSZWZcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaWNvbnNJbnNldFRlbXBsYXRlOiB0aGlzLmVuYWJsZVNob3dNb3JlXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHRoaXMuc2VhcmNoSWNvblRlbXBsYXRlUmVmLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy50aGVtZVN2Yykge1xuICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGF1dG9jb21wbGV0ZSBkaXJlY3RpdmUgdG8gYmUgc2V0IGFmdGVyIGVsZW1lbnRzXG4gICAgICAvLyBhcmUgcmVhcnJhbmdlZCB3aGVuIHN3aXRjaGluZyB0aGVtZXMuXG4gICAgICB0aGlzLnRoZW1lU3ZjLnNldHRpbmdzQ2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLiNhZGRFdmVudExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNyZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnRva2Vuc0NvbnRyb2xsZXIuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRCdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWRkQ2xpY2suZW1pdCh7XG4gICAgICBpdGVtQWRkZWQ6IChhcmdzOiBTa3lMb29rdXBBZGRDYWxsYmFja0FyZ3MpID0+XG4gICAgICAgIHRoaXMuI29uQWRkQnV0dG9uQ29tcGxldGUoYXJncyksXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25BdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2UoXG4gICAgY2hhbmdlOiBTa3lBdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2VcbiAgKTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoY2hhbmdlLnNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy4jYWRkVG9TZWxlY3RlZChjaGFuZ2Uuc2VsZWN0ZWRJdGVtKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShbXSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQXV0b2NvbXBsZXRlQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgcHVibGljIG9uVG9rZW5zQ2hhbmdlKGNoYW5nZTogU2t5VG9rZW5bXSk6IHZvaWQge1xuICAgIGlmICghY2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9rZW5zICE9PSBjaGFuZ2UpIHtcbiAgICAgIGlmIChjaGFuZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuI2ZvY3VzSW5wdXQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gTk9URTogV2UgZG8gdGhpcyBoZXJlIGluc3RlYWQgb2YganVzdCB1c2luZyB0aGUgYHZhbHVlYCBzZXR0ZXIgYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSB0aGVcbiAgICAgIC8vIHNldCBvZiB0b2tlbnMgcmV0dXJuZWQgaGVyZSBmb3IgdGhlIHB1cnBvc2VzIG9mIHNldHRpbmcgZm9jdXMgKHNlZSBgb25Ub2tlbnNLZXlVcGApLlxuICAgICAgdGhpcy4jX3ZhbHVlID0gY2hhbmdlLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgcmV0dXJuIHRva2VuLnZhbHVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnRva2VucyA9IGNoYW5nZTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy4jX3ZhbHVlKTtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uVG9rZW5zRm9jdXNJbmRleE92ZXJSYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN3aW5kb3dSZWYubmF0aXZlV2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy4jZm9jdXNJbnB1dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uVG9rZW5zS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUgIT09ICdzaW5nbGUnKSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICBjYXNlICdCYWNrc3BhY2UnOlxuICAgICAgICAgIHRoaXMuI3NlbmRUb2tlbnNNZXNzYWdlKFNreVRva2Vuc01lc3NhZ2VUeXBlLlJlbW92ZUFjdGl2ZVRva2VuKTtcbiAgICAgICAgICB0aGlzLiNzZW5kVG9rZW5zTWVzc2FnZShTa3lUb2tlbnNNZXNzYWdlVHlwZS5Gb2N1c1ByZXZpb3VzVG9rZW4pO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnRGVsJzpcbiAgICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgICB0aGlzLiNzZW5kVG9rZW5zTWVzc2FnZShTa3lUb2tlbnNNZXNzYWdlVHlwZS5SZW1vdmVBY3RpdmVUb2tlbik7XG4gICAgICAgICAgdGhpcy4jd2luZG93UmVmLm5hdGl2ZVdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3NlbmRUb2tlbnNNZXNzYWdlKFNreVRva2Vuc01lc3NhZ2VUeXBlLkZvY3VzQWN0aXZlVG9rZW4pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uVG9rZW5zUmVuZGVyZWQoKTogdm9pZCB7XG4gICAgdGhpcy4jc2VuZEF1dG9jb21wbGV0ZU1lc3NhZ2UoXG4gICAgICBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5SZXBvc2l0aW9uRHJvcGRvd25cbiAgICApO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueVtdKTogdm9pZCB7XG4gICAgLy8gU2luY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBhcnJheXMgLSBjbG9uZSB0aGUgYXJyYXkgYmVpbmcgc2VudCBpbiB0byBlbnN1cmUgd2UgYXJlbid0IG1vZGlmeWluZyBhIGNvbnN1bWVycyBvdXRlciBhcnJheVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZSA/IHZhbHVlLnNsaWNlKCkgOiBbXTtcbiAgICB0aGlzLiN1cGRhdGVGb3JTZWxlY3RNb2RlKCk7XG4gIH1cblxuICAvLyBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0cyB0aGVzZSBtZXRob2RzLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHB1YmxpYyBvbkNoYW5nZSA9ICh2YWx1ZTogYW55W10pID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgLy8gQWxsb3dzIEFuZ3VsYXIgdG8gZGlzYWJsZSB0aGUgaW5wdXQuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy4jcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuI2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2VhcmNoVGV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUuaW5wdXRUZXh0VmFsdWUgPSAnJztcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGVzIHdoZW4gdG8gZm9jdXMgb24gdGhlIHRva2Vucy5cbiAgLy8gQ2hlY2sgZm9yIGVtcHR5IHNlYXJjaCB0ZXh0IG9uIGtleWRvd24sIGJlZm9yZSB0aGUgZXNjYXBlIGtleSBpcyBmdWxseSBwcmVzc2VkLlxuICAvLyAoT3RoZXJ3aXNlLCBhIHNpbmdsZSBjaGFyYWN0ZXIgYmVpbmcgZXNjYXBlZCB3b3VsZCByZWdpc3RlciBhcyBlbXB0eSBvbiBrZXl1cC4pXG4gIC8vIElmIGVtcHR5IG9uIGtleWRvd24sIHNldCBhIGZsYWcgc28gdGhhdCB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIGNhbiBiZSB0YWtlbiBvbiBrZXl1cC5cbiAgcHVibGljIGlucHV0S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZTtcblxuICAgIC8qIFNhbml0eSBjaGVjayBhcyB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGluIG11bHRpcGxlIHNlbGVjdCBtb2RlICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlICE9PSAnc2luZ2xlJykge1xuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgIGNhc2UgJ0xlZnQnOlxuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy4jbWFya0ZvclRva2VuRm9jdXNPbktleVVwID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI21hcmtGb3JUb2tlbkZvY3VzT25LZXlVcCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbnB1dEtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrIGFzIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW4gbXVsdGlwbGUgc2VsZWN0IG1vZGUgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnNlbGVjdE1vZGUgIT09ICdzaW5nbGUnKSB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICBjYXNlICdFc2MnOlxuICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2hUZXh0KCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgICAgY2FzZSAnTGVmdCc6XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAodGhpcy4jbWFya0ZvclRva2VuRm9jdXNPbktleVVwKSB7XG4gICAgICAgICAgICB0aGlzLiNzZW5kVG9rZW5zTWVzc2FnZShTa3lUb2tlbnNNZXNzYWdlVHlwZS5Gb2N1c0xhc3RUb2tlbik7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cblxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VhcmNoQnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgbmV4dCovXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy4jc2VuZEF1dG9jb21wbGV0ZU1lc3NhZ2UoU2t5QXV0b2NvbXBsZXRlTWVzc2FnZVR5cGUuQ2xvc2VEcm9wZG93bik7XG4gICAgbGV0IGlzVmFsdWVJblRleHRCb3ggPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgaXNWYWx1ZUluVGV4dEJveCA9XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmU/LnZhbHVlICYmXG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUuaW5wdXRUZXh0VmFsdWUgPT09XG4gICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZS52YWx1ZVt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgbGV0IHNlYXJjaFZhbHVlID0gJyc7XG5cbiAgICBpZiAoIWlzVmFsdWVJblRleHRCb3ggJiYgdGhpcy5hdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSkge1xuICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLmlucHV0VGV4dFZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMub3BlblBpY2tlcihzZWFyY2hWYWx1ZSk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZT8ucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgb25TaG93TW9yZUNsaWNrKGV2ZW50OiBTa3lBdXRvY29tcGxldGVTaG93TW9yZUFyZ3MpOiB2b2lkIHtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSovXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLm9wZW5QaWNrZXIoZXZlbnQuaW5wdXRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9wZW5QaWNrZXIoaW5pdGlhbFNlYXJjaDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd01vcmVDb25maWc/LmN1c3RvbVBpY2tlcikge1xuICAgICAgdGhpcy5zaG93TW9yZVBpY2tlcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnNob3dNb3JlQ29uZmlnLmN1c3RvbVBpY2tlci5vcGVuKHtcbiAgICAgICAgaXRlbXM6IHRoaXMuZGF0YSxcbiAgICAgICAgaW5pdGlhbFNlYXJjaCxcbiAgICAgICAgaW5pdGlhbFZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAgIGlmICh0aGlzLiNoYXNTZWFyY2hBc3luYygpKSB7XG4gICAgICAgIHRoaXMuI29wZW5TZWxlY3Rpb25Nb2RhbCA9XG4gICAgICAgICAgdGhpcy4jY3JlYXRlU2VsZWN0aW9uTW9kYWxJbnN0YW5jZShpbml0aWFsU2VhcmNoKTtcblxuICAgICAgICB0aGlzLnNob3dNb3JlUGlja2VySWQgPSB0aGlzLiNvcGVuU2VsZWN0aW9uTW9kYWwuaWQ7XG5cbiAgICAgICAgdGhpcy4jb3BlblNlbGVjdGlvbk1vZGFsLmNsb3NlZC5zdWJzY3JpYmUoKGNsb3NlQXJncykgPT4ge1xuICAgICAgICAgIHRoaXMuI3Byb2Nlc3NQaWNrZXJSZXN1bHQoXG4gICAgICAgICAgICBjbG9zZUFyZ3MucmVhc29uID09PSAnc2F2ZScgPyBjbG9zZUFyZ3Muc2VsZWN0ZWRJdGVtcyA6IGluaXRpYWxWYWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy4jb3Blbk5hdGl2ZVBpY2tlciA9XG4gICAgICAgICAgdGhpcy4jY3JlYXRlTmF0aXZlUGlja2VySW5zdGFuY2UoaW5pdGlhbFNlYXJjaCk7XG5cbiAgICAgICAgdGhpcy5zaG93TW9yZVBpY2tlcklkID0gdGhpcy4jb3Blbk5hdGl2ZVBpY2tlci5jb21wb25lbnRJbnN0YW5jZS5pZDtcblxuICAgICAgICB0aGlzLiNvcGVuTmF0aXZlUGlja2VyLmNvbXBvbmVudEluc3RhbmNlLmFkZENsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRCdXR0b25DbGlja2VkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuI29wZW5OYXRpdmVQaWNrZXIuY2xvc2VkLnN1YnNjcmliZSgoY2xvc2VBcmdzKSA9PiB7XG4gICAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXM6IGFueVtdO1xuXG4gICAgICAgICAgaWYgKGNsb3NlQXJncy5yZWFzb24gPT09ICdzYXZlJykge1xuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLmRhdGEuZm9yRWFjaCgoaXRlbTogYW55LCBkYXRhSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2xvc2VBcmdzLmRhdGEuc29tZSgoc2F2ZWRJdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZEl0ZW0uaW5kZXggPT09IGRhdGFJbmRleDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI3Byb2Nlc3NQaWNrZXJSZXN1bHQoc2VsZWN0ZWRJdGVtcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICNjcmVhdGVTZWxlY3Rpb25Nb2RhbEluc3RhbmNlKFxuICAgIGluaXRpYWxTZWFyY2g6IHN0cmluZ1xuICApOiBTa3lTZWxlY3Rpb25Nb2RhbEluc3RhbmNlIHtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGNvbnN0IG1vZGFsQ29uZmlnID0gdGhpcy5zaG93TW9yZUNvbmZpZz8ubmF0aXZlUGlja2VyQ29uZmlnIHx8IHt9O1xuXG4gICAgaWYgKCFtb2RhbENvbmZpZy5pdGVtVGVtcGxhdGUpIHtcbiAgICAgIG1vZGFsQ29uZmlnLml0ZW1UZW1wbGF0ZSA9IHRoaXMuc2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaWRQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLiNsb2dTdmMuZXJyb3IoXG4gICAgICAgIFwiVGhlIGxvb2t1cCBjb21wb25lbnQncyAnaWRQcm9wZXJ0eScgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBgZW5hYmxlU2hvd01vcmVgIGFuZCAnc2VhcmNoQXN5bmMnIGFyZSB1c2VkIHRvZ2V0aGVyLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNzZWxlY3Rpb25Nb2RhbFN2Yy5vcGVuKHtcbiAgICAgIGRlc2NyaXB0b3JQcm9wZXJ0eTogdGhpcy5kZXNjcmlwdG9yUHJvcGVydHksXG4gICAgICBpZFByb3BlcnR5OiB0aGlzLmlkUHJvcGVydHkhLFxuICAgICAgc2VhcmNoQXN5bmM6IChhcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaEFzeW5jQXJnczogU2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzID0ge1xuICAgICAgICAgIGRpc3BsYXlUeXBlOiAnbW9kYWwnLFxuICAgICAgICAgIG9mZnNldDogYXJncy5vZmZzZXQsXG4gICAgICAgICAgc2VhcmNoVGV4dDogYXJncy5zZWFyY2hUZXh0LFxuICAgICAgICAgIGNvbnRpbnVhdGlvbkRhdGE6IGFyZ3MuY29udGludWF0aW9uRGF0YSxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNlYXJjaEFzeW5jLmVtaXQoc2VhcmNoQXN5bmNBcmdzKTtcblxuICAgICAgICByZXR1cm4gc2VhcmNoQXN5bmNBcmdzLnJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBzZWxlY3RNb2RlOiB0aGlzLnNlbGVjdE1vZGUsXG4gICAgICBhZGRDbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLmFkZEJ1dHRvbkNsaWNrZWQoKTtcbiAgICAgIH0sXG4gICAgICBpbml0aWFsU2VhcmNoLFxuICAgICAgaXRlbVRlbXBsYXRlOiBtb2RhbENvbmZpZy5pdGVtVGVtcGxhdGUsXG4gICAgICBzaG93QWRkQnV0dG9uOiB0aGlzLnNob3dBZGRCdXR0b24sXG4gICAgICB0aXRsZTogbW9kYWxDb25maWcudGl0bGUsXG4gICAgICB2YWx1ZTogaW5pdGlhbFZhbHVlLFxuICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICB9KTtcbiAgfVxuXG4gICNjcmVhdGVOYXRpdmVQaWNrZXJJbnN0YW5jZShpbml0aWFsU2VhcmNoOiBzdHJpbmcpOiBTa3lNb2RhbEluc3RhbmNlIHtcbiAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGNvbnN0IG1vZGFsQ29uZmlnID0gdGhpcy5zaG93TW9yZUNvbmZpZz8ubmF0aXZlUGlja2VyQ29uZmlnIHx8IHt9O1xuXG4gICAgaWYgKCFtb2RhbENvbmZpZy5pdGVtVGVtcGxhdGUpIHtcbiAgICAgIG1vZGFsQ29uZmlnLml0ZW1UZW1wbGF0ZSA9IHRoaXMuc2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dFByb3ZpZGVyVmFsdWUgPSBuZXcgU2t5TG9va3VwU2hvd01vcmVOYXRpdmVQaWNrZXJDb250ZXh0KFxuICAgICAgdGhpcy5kZXNjcmlwdG9yUHJvcGVydHksXG4gICAgICBpbml0aWFsU2VhcmNoLFxuICAgICAgaW5pdGlhbFZhbHVlLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgdGhpcy5zZWFyY2hPckRlZmF1bHQsXG4gICAgICB0aGlzLnNlbGVjdE1vZGUsXG4gICAgICB0aGlzLnNob3dBZGRCdXR0b24sXG4gICAgICBtb2RhbENvbmZpZ1xuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy4jbW9kYWxTZXJ2aWNlLm9wZW4oU2t5TG9va3VwU2hvd01vcmVNb2RhbENvbXBvbmVudCwge1xuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBTa3lMb29rdXBTaG93TW9yZU5hdGl2ZVBpY2tlckNvbnRleHQsXG4gICAgICAgICAgdXNlVmFsdWU6IGNvbnRleHRQcm92aWRlclZhbHVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU2t5TG9va3VwQWRhcHRlclNlcnZpY2UsXG4gICAgICAgICAgdXNlVmFsdWU6IHRoaXMuI2FkYXB0ZXIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgc2l6ZTogJ2xhcmdlJyxcbiAgICAgIHdyYXBwZXJDbGFzczogdGhpcy53cmFwcGVyQ2xhc3MsXG4gICAgfSk7XG4gIH1cblxuICAjcHJvY2Vzc1BpY2tlclJlc3VsdChzZWxlY3RlZEl0ZW1zOiBhbnlbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuI29wZW5TZWxlY3Rpb25Nb2RhbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLiNvcGVuTmF0aXZlUGlja2VyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2hvd01vcmVQaWNrZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgc2VsZWN0ZWRJdGVtcyA9IHNlbGVjdGVkSXRlbXMgfHwgW107XG5cbiAgICB0aGlzLndyaXRlVmFsdWUoc2VsZWN0ZWRJdGVtcyk7XG4gICAgdGhpcy4jZm9jdXNJbnB1dCgpO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uU2VhcmNoQXN5bmMoYXJnczogU2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hBc3luYy5lbWl0KGFyZ3MpO1xuICB9XG5cbiAgI2FkZFRvU2VsZWN0ZWQoaXRlbTogYW55KTogdm9pZCB7XG4gICAgbGV0IHNlbGVjdGVkSXRlbXM6IGFueVtdO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIHNlbGVjdGVkSXRlbXMgPSBbaXRlbV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGVjdGVkSXRlbXMgPSB0aGlzLnZhbHVlO1xuXG4gICAgICBjb25zdCBpZFByb3BlcnR5ID0gdGhpcy5pZFByb3BlcnR5IHx8ICcnO1xuXG4gICAgICAvLyBJZiBpdGVtcyBoYXZlIGEgdW5pcXVlIGlkZW50aWZpZXIsIGRvbid0IGFsbG93IHRoZSBzYW1lIGl0ZW0gdG8gYmUgYWRkZWQgdHdpY2UuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmlkUHJvcGVydHkgfHxcbiAgICAgICAgIXRoaXMudmFsdWUuc29tZShcbiAgICAgICAgICAoZXhpc3RpbmdJdGVtKSA9PiBleGlzdGluZ0l0ZW1baWRQcm9wZXJ0eV0gPT09IGl0ZW1baWRQcm9wZXJ0eV1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGVhclNlYXJjaFRleHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlVmFsdWUoc2VsZWN0ZWRJdGVtcyk7XG4gIH1cblxuICAjYWRkRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy4jaWRsZSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy4jZm9jdXNJbnB1dE9uSG9zdENsaWNrKCk7XG4gIH1cblxuICAjcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy4jaWRsZS5uZXh0KCk7XG4gICAgdGhpcy4jaWRsZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgI2ZvY3VzSW5wdXRPbkhvc3RDbGljaygpOiB2b2lkIHtcbiAgICBsZXQgaG9zdEVsZW1lbnQgPSAhdGhpcy5pbnB1dEJveEhvc3RTdmNcbiAgICAgID8gdGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XG4gICAgICA6IHRoaXMubG9va3VwV3JhcHBlclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBkb2N1bWVudE9iaiA9IHRoaXMuI3dpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQ7XG5cbiAgICAvLyBIYW5kbGVzIGZvY3VzaW5nIHRoZSBpbnB1dCB3aGVuIHRoZSBob3N0IGlzIGNsaWNrZWQuXG4gICAgLy8gVGhlIGlucHV0IHNob3VsZCBOT1QgYmUgZm9jdXNlZCBpZiBvdGhlciBlbGVtZW50cyAodG9rZW5zLCBldGMuKVxuICAgIC8vIGFyZSBjdXJyZW50bHkgZm9jdXNlZCBvciBiZWluZyB0YWJiZWQgdGhyb3VnaC5cblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnRPYmosICdtb3VzZWRvd24nKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI2lkbGUpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaG9zdEVsZW1lbnQgPSAhdGhpcy5pbnB1dEJveEhvc3RTdmNcbiAgICAgICAgICA/IHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgIDogdGhpcy5sb29rdXBXcmFwcGVyUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmlzSW5wdXRGb2N1c2VkID0gaG9zdEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihkb2N1bWVudE9iaiwgJ2ZvY3VzaW4nKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI2lkbGUpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaG9zdEVsZW1lbnQgPSAhdGhpcy5pbnB1dEJveEhvc3RTdmNcbiAgICAgICAgICA/IHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgIDogdGhpcy5sb29rdXBXcmFwcGVyUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLmlzSW5wdXRGb2N1c2VkID0gaG9zdEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcblxuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGhvc3RFbGVtZW50KSB7XG4gICAgICBvYnNlcnZhYmxlRnJvbUV2ZW50KGhvc3RFbGVtZW50LCAnbW91c2V1cCcpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNpZGxlKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gZG9jdW1lbnRPYmouYWN0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgICAgaWYgKCFjbGFzc0xpc3QgfHwgIWNsYXNzTGlzdC5jb250YWlucygnc2t5LXRva2VuJykpIHtcbiAgICAgICAgICAgIHRoaXMuI2ZvY3VzSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gICNmb2N1c0lucHV0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvb2t1cFdyYXBwZXJSZWYpIHtcbiAgICAgIHRoaXMuI2FkYXB0ZXIuZm9jdXNJbnB1dCh0aGlzLmxvb2t1cFdyYXBwZXJSZWYpO1xuICAgIH1cbiAgfVxuXG4gICNvbkFkZEJ1dHRvbkNvbXBsZXRlKGFyZ3M6IFNreUxvb2t1cEFkZENhbGxiYWNrQXJncyk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNvcGVuU2VsZWN0aW9uTW9kYWwpIHtcbiAgICAgIC8vIE5vdGlmeSB0aGUgc2VsZWN0aW9uIG1vZGFsIG9mIHRoZSBuZXcgaXRlbS4gVGhlIHNlbGVjdGlvblxuICAgICAgLy8gbW9kYWwgd2lsbCBkZWNpZGUgd2hldGhlciB0aGUgbmV3IGl0ZW0gc2hvdWxkIGJlIGFkZGVkXG4gICAgICAvLyB0byB0aGUgdmFsdWUgd2hlbiB0aGUgdXNlciBjb25maXJtcyBvciBjYW5jZWxzIHRoZVxuICAgICAgLy8gc2VsZWN0aW9uIG1vZGFsLlxuICAgICAgdGhpcy4jb3BlblNlbGVjdGlvbk1vZGFsLmFkZEl0ZW0oYXJncy5pdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGFkZEl0ZW1Ub1ZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy4jaGFzU2VhcmNoQXN5bmMoKSkge1xuICAgICAgICBhZGRJdGVtVG9WYWx1ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYXJncy5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5kYXRhID0gYXJncy5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5pbmRleE9mKGFyZ3MuaXRlbSkgPj0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLiNvcGVuTmF0aXZlUGlja2VyKSB7XG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhlIHBpY2tlciBvZiB0aGUgbmV3IGl0ZW0uIFRoZSBwaWNrZXIgd2lsbFxuICAgICAgICAgICAgLy8gZGVjaWRlIHdoZXRoZXIgdGhlIG5ldyBpdGVtIHNob3VsZCBiZSBhZGRlZCB0byB0aGVcbiAgICAgICAgICAgIC8vIHZhbHVlIHdoZW4gdGhlIHVzZXIgY29uZmlybXMgb3IgY2FuY2VscyB0aGUgcGlja2VyLlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICB0aGlzLiNvcGVuTmF0aXZlUGlja2VyXG4gICAgICAgICAgICAgICAgLmNvbXBvbmVudEluc3RhbmNlIGFzIFNreUxvb2t1cFNob3dNb3JlTW9kYWxDb21wb25lbnRcbiAgICAgICAgICAgICkub25JdGVtU2VsZWN0KHRydWUsIHsgdmFsdWU6IGFyZ3MuaXRlbSwgc2VsZWN0ZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRJdGVtVG9WYWx1ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRJdGVtVG9WYWx1ZSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgICAgdGhpcy5zZWxlY3RNb2RlID09PSAnbXVsdGlwbGUnXG4gICAgICAgICAgICA/IHRoaXMudmFsdWUuY29uY2F0KGFyZ3MuaXRlbSlcbiAgICAgICAgICAgIDogW2FyZ3MuaXRlbV07XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3BhcnNlVG9rZW5zKGRhdGE6IGFueVtdKTogU2t5VG9rZW5bXSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gICNzZW5kQXV0b2NvbXBsZXRlTWVzc2FnZSh0eXBlOiBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlQ29udHJvbGxlci5uZXh0KHsgdHlwZSB9KTtcbiAgfVxuXG4gICNzZW5kVG9rZW5zTWVzc2FnZSh0eXBlOiBTa3lUb2tlbnNNZXNzYWdlVHlwZSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zQ29udHJvbGxlci5uZXh0KHsgdHlwZSB9KTtcbiAgfVxuXG4gICN1cGRhdGVGb3JTZWxlY3RNb2RlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RNb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlLnZhbHVlID0gdGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGVhclNlYXJjaFRleHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjaGFzU2VhcmNoQXN5bmMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoQXN5bmMub2JzZXJ2ZXJzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAjcGlja2VyTW9kYWxPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLiNvcGVuTmF0aXZlUGlja2VyIHx8IHRoaXMuI29wZW5TZWxlY3Rpb25Nb2RhbCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5wdXRCb3hIb3N0U3ZjXCI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRlbXBsYXRlUmVmXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNpbnB1dFRlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktbG9va3VwXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2t5LWxvb2t1cC1mb2N1c2VkJzogaXNJbnB1dEZvY3VzZWQsXG4gICAgICAnc2t5LWxvb2t1cC1kaXNhYmxlZCc6IGRpc2FibGVkLFxuICAgICAgJ3NreS1sb29rdXAtc2luZ2xlJzogc2VsZWN0TW9kZSA9PT0gJ3NpbmdsZSdcbiAgICB9XCJcbiAgICAjbG9va3VwV3JhcHBlclxuICA+XG4gICAgPHNreS1hdXRvY29tcGxldGVcbiAgICAgIFthcmlhTGFiZWxsZWRCeV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICAgICBbYXR0ci5kYXRhLXNreS1sb29rdXAtc2hvdy1tb3JlLXBpY2tlci1pZF09XCJzaG93TW9yZVBpY2tlcklkXCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgW2RlYm91bmNlVGltZV09XCJkZWJvdW5jZVRpbWVcIlxuICAgICAgW2Rlc2NyaXB0b3JQcm9wZXJ0eV09XCJkZXNjcmlwdG9yUHJvcGVydHlcIlxuICAgICAgW2VuYWJsZVNob3dNb3JlXT1cImVuYWJsZVNob3dNb3JlXCJcbiAgICAgIFttZXNzYWdlU3RyZWFtXT1cImF1dG9jb21wbGV0ZUNvbnRyb2xsZXJcIlxuICAgICAgW3Byb3BlcnRpZXNUb1NlYXJjaF09XCJwcm9wZXJ0aWVzVG9TZWFyY2hcIlxuICAgICAgW3NlYXJjaF09XCJzZWFyY2hPckRlZmF1bHRcIlxuICAgICAgW3NlYXJjaEFzeW5jRGlzYWJsZWRdPVwic2VhcmNoQXN5bmMub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMFwiXG4gICAgICBbc2VhcmNoRmlsdGVyc109XCJzZWFyY2hGaWx0ZXJzXCJcbiAgICAgIFtzZWFyY2hSZXN1bHRzTGltaXRdPVwic2VhcmNoUmVzdWx0c0xpbWl0XCJcbiAgICAgIFtzZWFyY2hSZXN1bHRUZW1wbGF0ZV09XCJzZWFyY2hSZXN1bHRUZW1wbGF0ZVwiXG4gICAgICBbc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzXT1cInNlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVyc1wiXG4gICAgICBbc2hvd0FkZEJ1dHRvbl09XCJzaG93QWRkQnV0dG9uXCJcbiAgICAgIFt3cmFwcGVyQ2xhc3NdPVwid3JhcHBlckNsYXNzXCJcbiAgICAgIChhZGRDbGljayk9XCJhZGRCdXR0b25DbGlja2VkKClcIlxuICAgICAgKHNlYXJjaEFzeW5jKT1cIm9uU2VhcmNoQXN5bmMoJGV2ZW50KVwiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQXV0b2NvbXBsZXRlU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgKHNob3dNb3JlQ2xpY2spPVwib25TaG93TW9yZUNsaWNrKCRldmVudClcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJza3ktbG9va3VwLXNlYXJjaC1mbGV4LXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2t5LWxvb2t1cC1zZWFyY2hcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdza3ktZmllbGQtc3RhdHVzLWFjdGl2ZSc6IGlzSW5wdXRGb2N1c2VkICYmICFkaXNhYmxlZFxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNreS10b2tlbnNcbiAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0TW9kZSA9PT0gJ211bHRpcGxlJ1wiXG4gICAgICAgICAgICBjbGFzcz1cInNreS1sb29rdXAtdG9rZW5zXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZGVzY3JpcHRvclByb3BlcnR5XCJcbiAgICAgICAgICAgIFtmb2N1c2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW21lc3NhZ2VTdHJlYW1dPVwidG9rZW5zQ29udHJvbGxlclwiXG4gICAgICAgICAgICBbdHJhY2tXaXRoXT1cImlkUHJvcGVydHlcIlxuICAgICAgICAgICAgW3Rva2Vuc109XCJ0b2tlbnNcIlxuICAgICAgICAgICAgKGtleXVwKT1cIm9uVG9rZW5zS2V5VXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAodG9rZW5zQ2hhbmdlKT1cIm9uVG9rZW5zQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKHRva2Vuc1JlbmRlcmVkKT1cIm9uVG9rZW5zUmVuZGVyZWQoKVwiXG4gICAgICAgICAgICAodG9rZW5TZWxlY3RlZCk9XCJlbmFibGVTaG93TW9yZSA/IG9wZW5QaWNrZXIoJycpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIChmb2N1c0luZGV4T3ZlclJhbmdlKT1cIm9uVG9rZW5zRm9jdXNJbmRleE92ZXJSYW5nZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgY2xhc3M9XCJza3ktZm9ybS1jb250cm9sIHNreS1sb29rdXAtaW5wdXRcIlxuICAgICAgICAgICAgICByb3dzPVwiMVwiXG4gICAgICAgICAgICAgIHNreUF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICB3cmFwPVwib2ZmXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjb250cm9sSWRcIlxuICAgICAgICAgICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclRleHRcIlxuICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlQXR0cmlidXRlXT1cImF1dG9jb21wbGV0ZUF0dHJpYnV0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uQXV0b2NvbXBsZXRlQmx1cigpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwiaW5wdXRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXApPVwiaW5wdXRLZXl1cCgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbnB1dEJveEhvc3RTdmMgJiYgIWVuYWJsZVNob3dNb3JlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaEljb25UZW1wbGF0ZVJlZlwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvc2t5LXRva2Vucz5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cInNlbGVjdE1vZGUgPT09ICdzaW5nbGUnXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2t5LWxvb2t1cC1zaW5nbGUtY29udHJvbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgIGNsYXNzPVwic2t5LWZvcm0tY29udHJvbCBza3ktbG9va3VwLWlucHV0XCJcbiAgICAgICAgICAgICAgcm93cz1cIjFcIlxuICAgICAgICAgICAgICBza3lBdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgd3JhcD1cIm9mZlwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY29udHJvbElkXCJcbiAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJUZXh0XCJcbiAgICAgICAgICAgICAgW2F1dG9jb21wbGV0ZUF0dHJpYnV0ZV09XCJhdXRvY29tcGxldGVBdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvbkF1dG9jb21wbGV0ZUJsdXIoKVwiXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5wdXRCb3hIb3N0U3ZjICYmICFlbmFibGVTaG93TW9yZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWFyY2hJY29uVGVtcGxhdGVSZWZcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5wdXRCb3hIb3N0U3ZjICYmIGVuYWJsZVNob3dNb3JlXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TW9yZUJ1dHRvblRlbXBsYXRlUmVmXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9za3ktYXV0b2NvbXBsZXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd01vcmVCdXR0b25UZW1wbGF0ZVJlZj5cbiAgPGRpdiBjbGFzcz1cInNreS1pbnB1dC1ncm91cC1idG5cIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1kZWZhdWx0XCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdza3ktYnRuLWRpc2FibGVkJzogZGlzYWJsZWQgfVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICdza3l1eF9sb29rdXBfc2VhcmNoX2J1dHRvbl9zaG93X21vcmUnIHwgc2t5TGliUmVzb3VyY2VzXG4gICAgICBcIlxuICAgICAgKGNsaWNrKT1cIm9uU2VhcmNoQnV0dG9uQ2xpY2soKVwiXG4gICAgPlxuICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cInNlYXJjaFwiPjwvc2t5LWljb24+XG4gICAgICA8c2t5LWljb25cbiAgICAgICAgKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiXG4gICAgICAgIGljb25UeXBlPVwic2t5dXhcIlxuICAgICAgICBpY29uPVwic2VhcmNoXCJcbiAgICAgID48L3NreS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2VhcmNoSWNvblRlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktaW5wdXQtZ3JvdXAtaWNvbiBza3ktaW5wdXQtYm94LWljb24taW5zZXRcIlxuICAgIFtuZ0NsYXNzXT1cInsgJ3NreS1sb29rdXAtZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCJcbiAgPlxuICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiIGljb249XCJzZWFyY2hcIj48L3NreS1pY29uPlxuICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvblR5cGU9XCJza3l1eFwiIGljb249XCJzZWFyY2hcIj48L3NreS1pY29uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|