igniteui-angular 13.0.0-alpha.6 → 13.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +31 -30
  2. package/esm2020/lib/action-strip/grid-actions/grid-editing-actions.component.mjs +2 -2
  3. package/esm2020/lib/banner/banner.component.mjs +1 -1
  4. package/esm2020/lib/combo/combo-dropdown.component.mjs +12 -6
  5. package/esm2020/lib/combo/combo-item.component.mjs +5 -3
  6. package/esm2020/lib/combo/combo.api.mjs +3 -3
  7. package/esm2020/lib/combo/combo.common.mjs +1100 -2
  8. package/esm2020/lib/combo/combo.component.mjs +107 -1231
  9. package/esm2020/lib/combo/combo.directives.mjs +9 -25
  10. package/esm2020/lib/combo/combo.pipes.mjs +4 -6
  11. package/esm2020/lib/combo/public_api.mjs +5 -1
  12. package/esm2020/lib/core/utils.mjs +11 -1
  13. package/esm2020/lib/dialog/dialog.component.mjs +22 -10
  14. package/esm2020/lib/directives/focus-trap/focus-trap.directive.mjs +112 -0
  15. package/esm2020/lib/directives/for-of/for_of.directive.mjs +2 -2
  16. package/esm2020/lib/directives/radio/radio-group.directive.mjs +5 -13
  17. package/esm2020/lib/drop-down/drop-down-item.base.mjs +1 -5
  18. package/esm2020/lib/grids/column-actions/column-actions.component.mjs +4 -4
  19. package/esm2020/lib/grids/columns/column-layout.component.mjs +3 -3
  20. package/esm2020/lib/grids/columns/column.component.mjs +5 -5
  21. package/esm2020/lib/grids/common/crud.service.mjs +2 -2
  22. package/esm2020/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.mjs +2 -2
  23. package/esm2020/lib/grids/filtering/grid-filtering.service.mjs +9 -9
  24. package/esm2020/lib/grids/grid/grid.component.mjs +4 -8
  25. package/esm2020/lib/grids/grid-base.directive.mjs +82 -69
  26. package/esm2020/lib/grids/grid-public-row.mjs +3 -12
  27. package/esm2020/lib/grids/grouping/group-by-area.directive.mjs +2 -2
  28. package/esm2020/lib/grids/headers/grid-header-row.component.mjs +3 -3
  29. package/esm2020/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +4 -8
  30. package/esm2020/lib/grids/state.directive.mjs +2 -2
  31. package/esm2020/lib/grids/tree-grid/tree-grid.component.mjs +4 -8
  32. package/esm2020/lib/services/overlay/utilities.mjs +1 -1
  33. package/esm2020/lib/simple-combo/public_api.mjs +2 -0
  34. package/esm2020/lib/simple-combo/simple-combo.component.mjs +375 -0
  35. package/esm2020/lib/toast/toast.component.mjs +3 -6
  36. package/esm2020/public_api.mjs +3 -1
  37. package/fesm2015/igniteui-angular.mjs +1723 -1405
  38. package/fesm2015/igniteui-angular.mjs.map +1 -1
  39. package/fesm2020/igniteui-angular.mjs +1714 -1402
  40. package/fesm2020/igniteui-angular.mjs.map +1 -1
  41. package/lib/banner/banner.component.d.ts +1 -2
  42. package/lib/combo/combo-dropdown.component.d.ts +3 -1
  43. package/lib/combo/combo-item.component.d.ts +3 -1
  44. package/lib/combo/combo.common.d.ts +733 -4
  45. package/lib/combo/combo.component.d.ts +41 -799
  46. package/lib/combo/combo.pipes.d.ts +1 -1
  47. package/lib/combo/public_api.d.ts +4 -0
  48. package/lib/core/utils.d.ts +4 -0
  49. package/lib/dialog/dialog.component.d.ts +11 -2
  50. package/lib/directives/focus-trap/focus-trap.directive.d.ts +41 -0
  51. package/lib/directives/radio/radio-group.directive.d.ts +4 -4
  52. package/lib/grids/columns/column.component.d.ts +1 -1
  53. package/lib/grids/grid/grid.component.d.ts +2 -1
  54. package/lib/grids/grid-base.directive.d.ts +64 -8
  55. package/lib/grids/grid-public-row.d.ts +2 -3
  56. package/lib/grids/hierarchical-grid/hierarchical-grid.component.d.ts +2 -1
  57. package/lib/grids/tree-grid/tree-grid.component.d.ts +2 -1
  58. package/lib/services/overlay/utilities.d.ts +2 -1
  59. package/lib/simple-combo/public_api.d.ts +1 -0
  60. package/lib/simple-combo/simple-combo.component.d.ts +134 -0
  61. package/lib/toast/toast.component.d.ts +2 -0
  62. package/migrations/common/filterSourceDirs.d.ts +2 -2
  63. package/migrations/common/filterSourceDirs.js +2 -2
  64. package/migrations/update-13_0_0/changes/members.json +26 -0
  65. package/migrations/update-13_0_0/index.js +0 -31
  66. package/package.json +51 -43
  67. package/public_api.d.ts +2 -0
  68. package/src/lib/combo/README.md +14 -14
  69. package/src/lib/directives/focus-trap/README.md +17 -0
  70. package/src/lib/simple-combo/README.md +317 -0
  71. package/esm2020/lib/core/deprecateDecorators.mjs +0 -99
  72. package/lib/core/deprecateDecorators.d.ts +0 -20
@@ -1,3 +1,1101 @@
1
- import { InjectionToken } from '@angular/core';
1
+ import { ContentChild, Directive, EventEmitter, HostBinding, HostListener, Inject, InjectionToken, Input, Optional, Output, TemplateRef, ViewChild } from '@angular/core';
2
+ import { NgControl } from '@angular/forms';
3
+ import { caseSensitive } from '@igniteui/material-icons-extended';
4
+ import { noop, Subject } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import { DisplayDensityBase, DisplayDensityToken } from '../core/displayDensity';
7
+ import { cloneArray } from '../core/utils';
8
+ import { SortingDirection } from '../data-operations/sorting-strategy';
9
+ import { IgxForOfDirective } from '../directives/for-of/for_of.directive';
10
+ import { IGX_INPUT_GROUP_TYPE } from '../input-group/inputGroupType';
11
+ import { IgxInputDirective, IgxInputGroupComponent, IgxInputState } from '../input-group/public_api';
12
+ import { AbsoluteScrollStrategy, AutoPositionStrategy } from '../services/public_api';
13
+ import { IgxComboAddItemDirective, IgxComboClearIconDirective, IgxComboEmptyDirective, IgxComboFooterDirective, IgxComboHeaderDirective, IgxComboHeaderItemDirective, IgxComboItemDirective, IgxComboToggleIconDirective } from './combo.directives';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../core/selection";
16
+ import * as i2 from "./combo.api";
17
+ import * as i3 from "../icon/public_api";
2
18
  export const IGX_COMBO_COMPONENT = new InjectionToken('IgxComboComponentToken');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8uY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2NvbWJvL2NvbWJvLmNvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd6RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGNBQWMsQ0FBZSx3QkFBd0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBJR1hfQ09NQk9fQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuPElneENvbWJvQmFzZT4oJ0lneENvbWJvQ29tcG9uZW50VG9rZW4nKTtcblxuLyoqIEBoaWRkZW4gQGludGVybmFsIFRPRE86IEV2YWx1YXRlICovXG5leHBvcnQgaW50ZXJmYWNlIElneENvbWJvQmFzZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkYXRhOiBhbnlbXSB8IG51bGw7XG4gICAgdmFsdWVLZXk6IHN0cmluZztcbiAgICBncm91cEtleTogc3RyaW5nO1xuICAgIGlzUmVtb3RlOiBib29sZWFuO1xuICAgIGZpbHRlcmVkRGF0YTogYW55W10gfCBudWxsO1xuICAgIHRvdGFsSXRlbUNvdW50OiBudW1iZXI7XG4gICAgaXRlbXNNYXhIZWlnaHQ6IG51bWJlcjtcbiAgICBpdGVtSGVpZ2h0OiBudW1iZXI7XG4gICAgc2VhcmNoVmFsdWU6IHN0cmluZztcbiAgICBzZWFyY2hJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICBjb21ib0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIG9wZW5lZDogRXZlbnRFbWl0dGVyPElCYXNlRXZlbnRBcmdzPjtcbiAgICBvcGVuaW5nOiBFdmVudEVtaXR0ZXI8Q2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3M+O1xuICAgIGNsb3Npbmc6IEV2ZW50RW1pdHRlcjxDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz47XG4gICAgY2xvc2VkOiBFdmVudEVtaXR0ZXI8SUJhc2VFdmVudEFyZ3M+O1xuICAgIGZvY3VzU2VhcmNoSW5wdXQob3BlbmluZz86IGJvb2xlYW4pOiB2b2lkO1xuICAgIHRyaWdnZXJDaGVjaygpOiB2b2lkO1xuICAgIGFkZEl0ZW1Ub0NvbGxlY3Rpb24oKTogdm9pZDtcbiAgICBpc0FkZEJ1dHRvblZpc2libGUoKTogYm9vbGVhbjtcbiAgICBoYW5kbGVJbnB1dENoYW5nZShldmVudD86IHN0cmluZyk6IHZvaWQ7XG4gICAgaXNJdGVtU2VsZWN0ZWQoaXRlbUlEOiBhbnkpOiBib29sZWFuO1xuICAgIHNlbGVjdEl0ZW1zKGl0ZW1JRHM6IGFueVtdLCBjbGVhclNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkO1xuICAgIGRlc2VsZWN0SXRlbXMoaXRlbUlEczogYW55W10sIGV2ZW50PzogRXZlbnQpOiB2b2lkO1xufVxuIl19
19
+ let NEXT_ID = 0;
20
+ /**
21
+ * @hidden
22
+ * The default number of items that should be in the combo's
23
+ * drop-down list if no `[itemsMaxHeight]` is specified
24
+ */
25
+ const itemsInContainer = 10; // TODO: make private readonly
26
+ /** @hidden @internal */
27
+ const ItemHeights = {
28
+ comfortable: 40,
29
+ cosy: 32,
30
+ compact: 28,
31
+ };
32
+ /** @hidden @internal */
33
+ export var DataTypes;
34
+ (function (DataTypes) {
35
+ DataTypes["EMPTY"] = "empty";
36
+ DataTypes["PRIMITIVE"] = "primitive";
37
+ DataTypes["COMPLEX"] = "complex";
38
+ DataTypes["PRIMARYKEY"] = "valueKey";
39
+ })(DataTypes || (DataTypes = {}));
40
+ export var IgxComboState;
41
+ (function (IgxComboState) {
42
+ /**
43
+ * Combo with initial state.
44
+ */
45
+ IgxComboState[IgxComboState["INITIAL"] = 0] = "INITIAL";
46
+ /**
47
+ * Combo with valid state.
48
+ */
49
+ IgxComboState[IgxComboState["VALID"] = 1] = "VALID";
50
+ /**
51
+ * Combo with invalid state.
52
+ */
53
+ IgxComboState[IgxComboState["INVALID"] = 2] = "INVALID";
54
+ })(IgxComboState || (IgxComboState = {}));
55
+ export class IgxComboBaseDirective extends DisplayDensityBase {
56
+ constructor(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
57
+ super(_displayDensityOptions);
58
+ this.elementRef = elementRef;
59
+ this.cdr = cdr;
60
+ this.selectionService = selectionService;
61
+ this.comboAPI = comboAPI;
62
+ this._iconService = _iconService;
63
+ this._displayDensityOptions = _displayDensityOptions;
64
+ this._inputGroupType = _inputGroupType;
65
+ this._injector = _injector;
66
+ /**
67
+ * Set custom overlay settings that control how the combo's list of items is displayed.
68
+ * Set:
69
+ * ```html
70
+ * <igx-combo [overlaySettings] = "customOverlaySettings"></igx-combo>
71
+ * ```
72
+ *
73
+ * ```typescript
74
+ * const customSettings = { positionStrategy: { settings: { target: myTarget } } };
75
+ * combo.overlaySettings = customSettings;
76
+ * ```
77
+ * Get any custom overlay settings used by the combo:
78
+ * ```typescript
79
+ * const comboOverlaySettings: OverlaySettings = myCombo.overlaySettings;
80
+ * ```
81
+ */
82
+ this.overlaySettings = null;
83
+ /**
84
+ * Gets/gets combo id.
85
+ *
86
+ * ```typescript
87
+ * // get
88
+ * let id = this.combo.id;
89
+ * ```
90
+ *
91
+ * ```html
92
+ * <!--set-->
93
+ * <igx-combo [id]='combo1'></igx-combo>
94
+ * ```
95
+ */
96
+ this.id = `igx-combo-${NEXT_ID++}`;
97
+ /**
98
+ * Controls whether custom values can be added to the collection
99
+ *
100
+ * ```typescript
101
+ * // get
102
+ * let comboAllowsCustomValues = this.combo.allowCustomValues;
103
+ * ```
104
+ *
105
+ * ```html
106
+ * <!--set-->
107
+ * <igx-combo [allowCustomValues]='true'></igx-combo>
108
+ * ```
109
+ */
110
+ this.allowCustomValues = false;
111
+ /**
112
+ * Determines which column in the data source is used to determine the value.
113
+ *
114
+ * ```typescript
115
+ * // get
116
+ * let myComboValueKey = this.combo.valueKey;
117
+ * ```
118
+ *
119
+ * ```html
120
+ * <!--set-->
121
+ * <igx-combo [valueKey]='myKey'></igx-combo>
122
+ * ```
123
+ */
124
+ this.valueKey = null;
125
+ /** @hidden @internal */
126
+ this.cssClass = 'igx-combo'; // Independent of display density for the time being
127
+ /** @hidden @internal */
128
+ this.role = 'combobox';
129
+ /**
130
+ * An @Input property that enabled/disables combo. The default is `false`.
131
+ * ```html
132
+ * <igx-combo [disabled]="'true'">
133
+ * ```
134
+ */
135
+ this.disabled = false;
136
+ /**
137
+ * Emitted when item selection is changing, before the selection completes
138
+ *
139
+ * ```html
140
+ * <igx-combo (selectionChanging)='handleSelection()'></igx-combo>
141
+ * ```
142
+ */
143
+ // TODO: any for old/new selection?
144
+ this.selectionChanging = new EventEmitter();
145
+ /**
146
+ * Emitted before the dropdown is opened
147
+ *
148
+ * ```html
149
+ * <igx-combo opening='handleOpening($event)'></igx-combo>
150
+ * ```
151
+ */
152
+ this.opening = new EventEmitter();
153
+ /**
154
+ * Emitted after the dropdown is opened
155
+ *
156
+ * ```html
157
+ * <igx-combo (opened)='handleOpened($event)'></igx-combo>
158
+ * ```
159
+ */
160
+ this.opened = new EventEmitter();
161
+ /**
162
+ * Emitted before the dropdown is closed
163
+ *
164
+ * ```html
165
+ * <igx-combo (closing)='handleClosing($event)'></igx-combo>
166
+ * ```
167
+ */
168
+ this.closing = new EventEmitter();
169
+ /**
170
+ * Emitted after the dropdown is closed
171
+ *
172
+ * ```html
173
+ * <igx-combo (closed)='handleClosed($event)'></igx-combo>
174
+ * ```
175
+ */
176
+ this.closed = new EventEmitter();
177
+ /**
178
+ * Emitted when an item is being added to the data collection
179
+ *
180
+ * ```html
181
+ * <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
182
+ * ```
183
+ */
184
+ this.addition = new EventEmitter();
185
+ /**
186
+ * Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
187
+ *
188
+ * ```html
189
+ * <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
190
+ * ```
191
+ */
192
+ this.searchInputUpdate = new EventEmitter();
193
+ /**
194
+ * Emitted when new chunk of data is loaded from the virtualization
195
+ *
196
+ * ```html
197
+ * <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
198
+ * ```
199
+ */
200
+ this.dataPreLoad = new EventEmitter();
201
+ /**
202
+ * The custom template, if any, that should be used when rendering ITEMS in the combo list
203
+ *
204
+ * ```typescript
205
+ * // Set in typescript
206
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
207
+ * myComponent.combo.itemTemplate = myCustomTemplate;
208
+ * ```
209
+ * ```html
210
+ * <!-- Set in markup -->
211
+ * <igx-combo #combo>
212
+ * ...
213
+ * <ng-template igxComboItem>
214
+ * <div class="custom-item" let-item let-key="valueKey">
215
+ * <div class="custom-item__name">{{ item[key] }}</div>
216
+ * <div class="custom-item__cost">{{ item.cost }}</div>
217
+ * </div>
218
+ * </ng-template>
219
+ * </igx-combo>
220
+ * ```
221
+ */
222
+ this.itemTemplate = null;
223
+ /**
224
+ * The custom template, if any, that should be used when rendering the HEADER for the combo items list
225
+ *
226
+ * ```typescript
227
+ * // Set in typescript
228
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
229
+ * myComponent.combo.headerTemplate = myCustomTemplate;
230
+ * ```
231
+ * ```html
232
+ * <!-- Set in markup -->
233
+ * <igx-combo #combo>
234
+ * ...
235
+ * <ng-template igxComboHeader>
236
+ * <div class="combo__header">
237
+ * This is a custom header
238
+ * </div>
239
+ * </ng-template>
240
+ * </igx-combo>
241
+ * ```
242
+ */
243
+ this.headerTemplate = null;
244
+ /**
245
+ * The custom template, if any, that should be used when rendering the FOOTER for the combo items list
246
+ *
247
+ * ```typescript
248
+ * // Set in typescript
249
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
250
+ * myComponent.combo.footerTemplate = myCustomTemplate;
251
+ * ```
252
+ * ```html
253
+ * <!-- Set in markup -->
254
+ * <igx-combo #combo>
255
+ * ...
256
+ * <ng-template igxComboFooter>
257
+ * <div class="combo__footer">
258
+ * This is a custom footer
259
+ * </div>
260
+ * </ng-template>
261
+ * </igx-combo>
262
+ * ```
263
+ */
264
+ this.footerTemplate = null;
265
+ /**
266
+ * The custom template, if any, that should be used when rendering HEADER ITEMS for groups in the combo list
267
+ *
268
+ * ```typescript
269
+ * // Set in typescript
270
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
271
+ * myComponent.combo.headerItemTemplate = myCustomTemplate;
272
+ * ```
273
+ * ```html
274
+ * <!-- Set in markup -->
275
+ * <igx-combo #combo>
276
+ * ...
277
+ * <ng-template igxComboHeaderItem let-item let-key="groupKey">
278
+ * <div class="custom-item--group">Group header for {{ item[key] }}</div>
279
+ * </ng-template>
280
+ * </igx-combo>
281
+ * ```
282
+ */
283
+ this.headerItemTemplate = null;
284
+ /**
285
+ * The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
286
+ *
287
+ * ```typescript
288
+ * // Set in typescript
289
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
290
+ * myComponent.combo.addItemTemplate = myCustomTemplate;
291
+ * ```
292
+ * ```html
293
+ * <!-- Set in markup -->
294
+ * <igx-combo #combo>
295
+ * ...
296
+ * <ng-template igxComboAddItem>
297
+ * <button class="combo__add-button">
298
+ * Click to add item
299
+ * </button>
300
+ * </ng-template>
301
+ * </igx-combo>
302
+ * ```
303
+ */
304
+ this.addItemTemplate = null;
305
+ /**
306
+ * The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
307
+ *
308
+ * ```typescript
309
+ * // Set in typescript
310
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
311
+ * myComponent.combo.emptyTemplate = myCustomTemplate;
312
+ * ```
313
+ * ```html
314
+ * <!-- Set in markup -->
315
+ * <igx-combo #combo>
316
+ * ...
317
+ * <ng-template igxComboEmpty>
318
+ * <div class="combo--empty">
319
+ * There are no items to display
320
+ * </div>
321
+ * </ng-template>
322
+ * </igx-combo>
323
+ * ```
324
+ */
325
+ this.emptyTemplate = null;
326
+ /**
327
+ * The custom template, if any, that should be used when rendering the combo TOGGLE(open/close) button
328
+ *
329
+ * ```typescript
330
+ * // Set in typescript
331
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
332
+ * myComponent.combo.toggleIconTemplate = myCustomTemplate;
333
+ * ```
334
+ * ```html
335
+ * <!-- Set in markup -->
336
+ * <igx-combo #combo>
337
+ * ...
338
+ * <ng-template igxComboToggleIcon let-collapsed>
339
+ * <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
340
+ * </ng-template>
341
+ * </igx-combo>
342
+ * ```
343
+ */
344
+ this.toggleIconTemplate = null;
345
+ /**
346
+ * The custom template, if any, that should be used when rendering the combo CLEAR button
347
+ *
348
+ * ```typescript
349
+ * // Set in typescript
350
+ * const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
351
+ * myComponent.combo.clearIconTemplate = myCustomTemplate;
352
+ * ```
353
+ * ```html
354
+ * <!-- Set in markup -->
355
+ * <igx-combo #combo>
356
+ * ...
357
+ * <ng-template igxComboClearIcon>
358
+ * <igx-icon>clear</igx-icon>
359
+ * </ng-template>
360
+ * </igx-combo>
361
+ * ```
362
+ */
363
+ this.clearIconTemplate = null;
364
+ /** @hidden @internal */
365
+ this.searchInput = null;
366
+ this.dropdownContainer = null;
367
+ /** @hidden @internal */
368
+ this.customValueFlag = true;
369
+ /** @hidden @internal */
370
+ this.filterValue = '';
371
+ /** @hidden @internal */
372
+ this.defaultFallbackGroup = 'Other';
373
+ /** @hidden @internal */
374
+ this.filteringOptions = {
375
+ caseSensitive: false
376
+ };
377
+ this._data = [];
378
+ this._value = '';
379
+ this._groupKey = '';
380
+ this._filteredData = [];
381
+ this._remoteSelection = {};
382
+ this._valid = IgxComboState.INITIAL;
383
+ this.ngControl = null;
384
+ this.destroy$ = new Subject();
385
+ this._onTouchedCallback = noop;
386
+ this._onChangeCallback = noop;
387
+ this._type = null;
388
+ this._dataType = '';
389
+ this._searchValue = '';
390
+ this._itemHeight = null;
391
+ this._itemsMaxHeight = null;
392
+ this._groupSortingDirection = SortingDirection.Asc;
393
+ this.onStatusChanged = () => {
394
+ if ((this.ngControl.control.touched || this.ngControl.control.dirty) &&
395
+ (this.ngControl.control.validator || this.ngControl.control.asyncValidator)) {
396
+ if (!this.collapsed || this.inputGroup.isFocused) {
397
+ this.valid = this.ngControl.invalid ? IgxComboState.INVALID : IgxComboState.VALID;
398
+ }
399
+ else {
400
+ this.valid = this.ngControl.invalid ? IgxComboState.INVALID : IgxComboState.INITIAL;
401
+ }
402
+ }
403
+ else {
404
+ // B.P. 18 May 2021: IgxDatePicker does not reset its state upon resetForm #9526
405
+ this.valid = IgxComboState.INITIAL;
406
+ }
407
+ this.manageRequiredAsterisk();
408
+ };
409
+ this.findMatch = (element) => {
410
+ const value = this.displayKey ? element[this.displayKey] : element;
411
+ return value.toString().toLowerCase() === this.searchValue.trim().toLowerCase();
412
+ };
413
+ }
414
+ /**
415
+ * Configures the drop down list height
416
+ *
417
+ * ```typescript
418
+ * // get
419
+ * let myComboItemsMaxHeight = this.combo.itemsMaxHeight;
420
+ * ```
421
+ *
422
+ * ```html
423
+ * <!--set-->
424
+ * <igx-combo [itemsMaxHeight]='320'></igx-combo>
425
+ * ```
426
+ */
427
+ get itemsMaxHeight() {
428
+ if (this._itemsMaxHeight === null || this._itemsMaxHeight === undefined) {
429
+ return this.itemHeight * itemsInContainer;
430
+ }
431
+ return this._itemsMaxHeight;
432
+ }
433
+ set itemsMaxHeight(val) {
434
+ this._itemsMaxHeight = val;
435
+ }
436
+ /**
437
+ * Configures the drop down list item height
438
+ *
439
+ * ```typescript
440
+ * // get
441
+ * let myComboItemHeight = this.combo.itemHeight;
442
+ * ```
443
+ *
444
+ * ```html
445
+ * <!--set-->
446
+ * <igx-combo [itemHeight]='32'></igx-combo>
447
+ * ```
448
+ */
449
+ get itemHeight() {
450
+ if (this._itemHeight === null || this._itemHeight === undefined) {
451
+ return ItemHeights[this.displayDensity];
452
+ }
453
+ return this._itemHeight;
454
+ }
455
+ set itemHeight(val) {
456
+ this._itemHeight = val;
457
+ }
458
+ /**
459
+ * Combo data source.
460
+ *
461
+ * ```html
462
+ * <!--set-->
463
+ * <igx-combo [data]='items'></igx-combo>
464
+ * ```
465
+ */
466
+ get data() {
467
+ return this._data;
468
+ }
469
+ set data(val) {
470
+ this._data = (val) ? val : [];
471
+ }
472
+ set displayKey(val) {
473
+ this._displayKey = val;
474
+ }
475
+ /**
476
+ * Determines which column in the data source is used to determine the display value.
477
+ *
478
+ * ```typescript
479
+ * // get
480
+ * let myComboDisplayKey = this.combo.displayKey;
481
+ *
482
+ * // set
483
+ * this.combo.displayKey = 'val';
484
+ *
485
+ * ```
486
+ *
487
+ * ```html
488
+ * <!--set-->
489
+ * <igx-combo [displayKey]='myDisplayKey'></igx-combo>
490
+ * ```
491
+ */
492
+ get displayKey() {
493
+ return this._displayKey ? this._displayKey : this.valueKey;
494
+ }
495
+ /**
496
+ * The item property by which items should be grouped inside the items list. Not usable if data is not of type Object[].
497
+ *
498
+ * ```html
499
+ * <!--set-->
500
+ * <igx-combo [groupKey]='newGroupKey'></igx-combo>
501
+ * ```
502
+ */
503
+ set groupKey(val) {
504
+ this._groupKey = val;
505
+ }
506
+ /**
507
+ * The item property by which items should be grouped inside the items list. Not usable if data is not of type Object[].
508
+ *
509
+ * ```typescript
510
+ * // get
511
+ * let currentGroupKey = this.combo.groupKey;
512
+ * ```
513
+ */
514
+ get groupKey() {
515
+ return this._groupKey;
516
+ }
517
+ /**
518
+ * An @Input property that sets groups sorting order.
519
+ *
520
+ * @example
521
+ * ```html
522
+ * <igx-combo [groupSortingDirection]="groupSortingDirection"></igx-combo>
523
+ * ```
524
+ * ```typescript
525
+ * public groupSortingDirection = SortingDirection.Asc;
526
+ * ```
527
+ */
528
+ get groupSortingDirection() {
529
+ return this._groupSortingDirection;
530
+ }
531
+ set groupSortingDirection(val) {
532
+ this._groupSortingDirection = val;
533
+ }
534
+ /** @hidden @internal */
535
+ get ariaExpanded() {
536
+ return !this.dropdown.collapsed;
537
+ }
538
+ /** @hidden @internal */
539
+ get hasPopUp() {
540
+ return 'listbox';
541
+ }
542
+ /** @hidden @internal */
543
+ get ariaOwns() {
544
+ return this.dropdown.id;
545
+ }
546
+ /**
547
+ * An @Input property that sets how the combo will be styled.
548
+ * The allowed values are `line`, `box`, `border` and `search`. The default is `box`.
549
+ * ```html
550
+ * <igx-combo [type]="'line'">
551
+ * ```
552
+ */
553
+ get type() {
554
+ return this._type || this._inputGroupType || 'box';
555
+ }
556
+ set type(val) {
557
+ this._type = val;
558
+ }
559
+ /** @hidden @internal */
560
+ get searchValue() {
561
+ return this._searchValue;
562
+ }
563
+ set searchValue(val) {
564
+ this.filterValue = val;
565
+ this._searchValue = val;
566
+ }
567
+ /** @hidden @internal */
568
+ get isRemote() {
569
+ return this.totalItemCount > 0 &&
570
+ this.valueKey &&
571
+ this.dataType === DataTypes.COMPLEX;
572
+ }
573
+ /** @hidden @internal */
574
+ get dataType() {
575
+ if (this.displayKey) {
576
+ return DataTypes.COMPLEX;
577
+ }
578
+ return DataTypes.PRIMITIVE;
579
+ }
580
+ /**
581
+ * Gets if control is valid, when used in a form
582
+ *
583
+ * ```typescript
584
+ * // get
585
+ * let valid = this.combo.valid;
586
+ * ```
587
+ */
588
+ get valid() {
589
+ return this._valid;
590
+ }
591
+ /**
592
+ * Sets if control is valid, when used in a form
593
+ *
594
+ * ```typescript
595
+ * // set
596
+ * this.combo.valid = IgxComboState.INVALID;
597
+ * ```
598
+ */
599
+ set valid(valid) {
600
+ this._valid = valid;
601
+ this.comboInput.valid = IgxInputState[IgxComboState[valid]];
602
+ }
603
+ /**
604
+ * The text displayed in the combo input
605
+ *
606
+ * ```typescript
607
+ * // get
608
+ * let comboValue = this.combo.value;
609
+ * ```
610
+ */
611
+ get value() {
612
+ return this._value;
613
+ }
614
+ /**
615
+ * Defines the current state of the virtualized data. It contains `startIndex` and `chunkSize`
616
+ *
617
+ * ```typescript
618
+ * // get
619
+ * let state = this.combo.virtualizationState;
620
+ * ```
621
+ */
622
+ get virtualizationState() {
623
+ return this.virtDir.state;
624
+ }
625
+ /**
626
+ * Sets the current state of the virtualized data.
627
+ *
628
+ * ```typescript
629
+ * // set
630
+ * this.combo.virtualizationState(state);
631
+ * ```
632
+ */
633
+ set virtualizationState(state) {
634
+ this.virtDir.state = state;
635
+ }
636
+ /**
637
+ * Gets drop down state.
638
+ *
639
+ * ```typescript
640
+ * let state = this.combo.collapsed;
641
+ * ```
642
+ */
643
+ get collapsed() {
644
+ return this.dropdown.collapsed;
645
+ }
646
+ /**
647
+ * Gets total count of the virtual data items, when using remote service.
648
+ *
649
+ * ```typescript
650
+ * // get
651
+ * let count = this.combo.totalItemCount;
652
+ * ```
653
+ */
654
+ get totalItemCount() {
655
+ return this.virtDir.totalItemCount;
656
+ }
657
+ /**
658
+ * Sets total count of the virtual data items, when using remote service.
659
+ *
660
+ * ```typescript
661
+ * // set
662
+ * this.combo.totalItemCount(remoteService.count);
663
+ * ```
664
+ */
665
+ set totalItemCount(count) {
666
+ this.virtDir.totalItemCount = count;
667
+ }
668
+ /** @hidden @internal */
669
+ get template() {
670
+ this._dataType = this.dataType;
671
+ if (this.itemTemplate) {
672
+ return this.itemTemplate;
673
+ }
674
+ if (this._dataType === DataTypes.COMPLEX) {
675
+ return this.complexTemplate;
676
+ }
677
+ return this.primitiveTemplate;
678
+ }
679
+ /** @hidden @internal */
680
+ onArrowDown(event) {
681
+ event.preventDefault();
682
+ event.stopPropagation();
683
+ this.open();
684
+ }
685
+ /** @hidden @internal */
686
+ ngOnInit() {
687
+ this.ngControl = this._injector.get(NgControl, null);
688
+ const targetElement = this.elementRef.nativeElement;
689
+ this._overlaySettings = {
690
+ target: targetElement,
691
+ scrollStrategy: new AbsoluteScrollStrategy(),
692
+ positionStrategy: new AutoPositionStrategy(),
693
+ modal: false,
694
+ closeOnOutsideClick: true,
695
+ excludeFromOutsideClick: [targetElement]
696
+ };
697
+ this.selectionService.set(this.id, new Set());
698
+ this._iconService.addSvgIconFromText(caseSensitive.name, caseSensitive.value, 'imx-icons');
699
+ }
700
+ /** @hidden @internal */
701
+ ngAfterViewInit() {
702
+ this.filteredData = [...this.data];
703
+ if (this.ngControl) {
704
+ this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(this.onStatusChanged);
705
+ this.manageRequiredAsterisk();
706
+ this.cdr.detectChanges();
707
+ }
708
+ this.virtDir.chunkPreload.pipe(takeUntil(this.destroy$)).subscribe((e) => {
709
+ const eventArgs = Object.assign({}, e, { owner: this });
710
+ this.dataPreLoad.emit(eventArgs);
711
+ });
712
+ }
713
+ /** @hidden @internal */
714
+ ngOnDestroy() {
715
+ this.destroy$.next();
716
+ this.destroy$.complete();
717
+ this.comboAPI.clear();
718
+ this.selectionService.clear(this.id);
719
+ }
720
+ /**
721
+ * A method that opens/closes the combo.
722
+ *
723
+ * ```html
724
+ * <button (click)="combo.toggle()">Toggle Combo</button>
725
+ * <igx-combo #combo></igx-combo>
726
+ * ```
727
+ */
728
+ toggle() {
729
+ const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
730
+ this.dropdown.toggle(overlaySettings);
731
+ }
732
+ /**
733
+ * A method that opens the combo.
734
+ *
735
+ * ```html
736
+ * <button (click)="combo.open()">Open Combo</button>
737
+ * <igx-combo #combo></igx-combo>
738
+ * ```
739
+ */
740
+ open() {
741
+ const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
742
+ this.dropdown.open(overlaySettings);
743
+ }
744
+ /**
745
+ * A method that closes the combo.
746
+ *
747
+ * ```html
748
+ * <button (click)="combo.close()">Close Combo</button>
749
+ * <igx-combo #combo></igx-combo>
750
+ * ```
751
+ */
752
+ close() {
753
+ this.dropdown.close();
754
+ }
755
+ /**
756
+ * Triggers change detection on the combo view
757
+ */
758
+ triggerCheck() {
759
+ this.cdr.detectChanges();
760
+ }
761
+ /**
762
+ * Get current selection state
763
+ *
764
+ * @returns Array of selected items
765
+ * ```typescript
766
+ * let selectedItems = this.combo.selectedItems();
767
+ * ```
768
+ */
769
+ get selection() {
770
+ const items = Array.from(this.selectionService.get(this.id));
771
+ return items;
772
+ }
773
+ /**
774
+ * Returns if the specified itemID is selected
775
+ *
776
+ * @hidden
777
+ * @internal
778
+ */
779
+ isItemSelected(item) {
780
+ return this.selectionService.is_item_selected(this.id, item);
781
+ }
782
+ /** @hidden @internal */
783
+ addItemToCollection() {
784
+ if (!this.searchValue) {
785
+ return;
786
+ }
787
+ const newValue = this.searchValue.trim();
788
+ const addedItem = this.displayKey ? {
789
+ [this.valueKey]: newValue,
790
+ [this.displayKey]: newValue
791
+ } : newValue;
792
+ if (this.groupKey) {
793
+ Object.assign(addedItem, { [this.groupKey]: this.defaultFallbackGroup });
794
+ }
795
+ // expose shallow copy instead of this.data in event args so this.data can't be mutated
796
+ const oldCollection = [...this.data];
797
+ const newCollection = [...this.data, addedItem];
798
+ const args = {
799
+ oldCollection, addedItem, newCollection, owner: this, cancel: false
800
+ };
801
+ this.addition.emit(args);
802
+ if (args.cancel) {
803
+ return;
804
+ }
805
+ this.data.push(args.addedItem);
806
+ // trigger re-render
807
+ this.data = cloneArray(this.data);
808
+ this.select(this.valueKey !== null && this.valueKey !== undefined ?
809
+ [args.addedItem[this.valueKey]] : [args.addedItem], false);
810
+ this.customValueFlag = false;
811
+ this.searchInput?.nativeElement.focus();
812
+ this.dropdown.focusedItem = null;
813
+ this.virtDir.scrollTo(0);
814
+ }
815
+ /** @hidden @internal */
816
+ isAddButtonVisible() {
817
+ // This should always return a boolean value. If this.searchValue was '', it returns '' instead of false;
818
+ return this.searchValue !== '' && this.customValueFlag;
819
+ }
820
+ /** @hidden @internal */
821
+ handleInputChange(event) {
822
+ if (event !== undefined) {
823
+ const args = {
824
+ searchText: typeof event === 'string' ? event : event.target.value,
825
+ owner: this,
826
+ cancel: false
827
+ };
828
+ this.searchInputUpdate.emit(args);
829
+ if (args.cancel) {
830
+ this.filterValue = null;
831
+ }
832
+ }
833
+ this.checkMatch();
834
+ }
835
+ /**
836
+ * Event handlers
837
+ *
838
+ * @hidden
839
+ * @internal
840
+ */
841
+ handleOpening(e) {
842
+ const args = { owner: this, event: e.event, cancel: e.cancel };
843
+ this.opening.emit(args);
844
+ e.cancel = args.cancel;
845
+ }
846
+ /** @hidden @internal */
847
+ handleClosing(e) {
848
+ const args = { owner: this, event: e.event, cancel: e.cancel };
849
+ this.closing.emit(args);
850
+ e.cancel = args.cancel;
851
+ if (e.cancel) {
852
+ return;
853
+ }
854
+ this.searchValue = '';
855
+ if (!e.event) {
856
+ this.comboInput?.nativeElement.focus();
857
+ }
858
+ }
859
+ /** @hidden @internal */
860
+ handleClosed() {
861
+ this.closed.emit({ owner: this });
862
+ }
863
+ /** @hidden @internal */
864
+ handleKeyDown(event) {
865
+ if (event.key === 'ArrowUp' || event.key === 'Up') {
866
+ event.preventDefault();
867
+ event.stopPropagation();
868
+ this.close();
869
+ }
870
+ }
871
+ /** @hidden @internal */
872
+ registerOnChange(fn) {
873
+ this._onChangeCallback = fn;
874
+ }
875
+ /** @hidden @internal */
876
+ registerOnTouched(fn) {
877
+ this._onTouchedCallback = fn;
878
+ }
879
+ /** @hidden @internal */
880
+ setDisabledState(isDisabled) {
881
+ this.disabled = isDisabled;
882
+ }
883
+ /** @hidden @internal */
884
+ onClick(event) {
885
+ event.stopPropagation();
886
+ event.preventDefault();
887
+ if (!this.disabled) {
888
+ this.toggle();
889
+ }
890
+ }
891
+ /** @hidden @internal */
892
+ onBlur() {
893
+ if (this.collapsed) {
894
+ this._onTouchedCallback();
895
+ if (this.ngControl && this.ngControl.invalid) {
896
+ this.valid = IgxComboState.INVALID;
897
+ }
898
+ else {
899
+ this.valid = IgxComboState.INITIAL;
900
+ }
901
+ }
902
+ }
903
+ /** if there is a valueKey - map the keys to data items, else - just return the keys */
904
+ convertKeysToItems(keys) {
905
+ if (this.comboAPI.valueKey === null) {
906
+ return keys;
907
+ }
908
+ // map keys vs. filter data to retain the order of the selected items
909
+ return keys.map(key => this.data.find(entry => entry[this.valueKey] === key)).filter(e => e !== undefined);
910
+ }
911
+ checkMatch() {
912
+ const itemMatch = this.filteredData.some(this.findMatch);
913
+ this.customValueFlag = this.allowCustomValues && !itemMatch;
914
+ }
915
+ manageRequiredAsterisk() {
916
+ if (this.ngControl && this.ngControl.control.validator) {
917
+ // Run the validation with empty object to check if required is enabled.
918
+ const error = this.ngControl.control.validator({});
919
+ this.inputGroup.isRequired = error && error.required;
920
+ }
921
+ }
922
+ /** Contains key-value pairs of the selected valueKeys and their resp. displayKeys */
923
+ registerRemoteEntries(ids, add = true) {
924
+ if (add) {
925
+ const selection = this.getValueDisplayPairs(ids);
926
+ for (const entry of selection) {
927
+ this._remoteSelection[entry[this.valueKey]] = entry[this.displayKey];
928
+ }
929
+ }
930
+ else {
931
+ for (const entry of ids) {
932
+ delete this._remoteSelection[entry];
933
+ }
934
+ }
935
+ }
936
+ /**
937
+ * For `id: any[]` returns a mapped `{ [combo.valueKey]: any, [combo.displayKey]: any }[]`
938
+ */
939
+ getValueDisplayPairs(ids) {
940
+ return this.data.filter(entry => ids.indexOf(entry[this.valueKey]) > -1).map(e => ({
941
+ [this.valueKey]: e[this.valueKey],
942
+ [this.displayKey]: e[this.displayKey]
943
+ }));
944
+ }
945
+ getRemoteSelection(newSelection, oldSelection) {
946
+ if (!newSelection.length) {
947
+ // If new selection is empty, clear all items
948
+ this.registerRemoteEntries(oldSelection, false);
949
+ return '';
950
+ }
951
+ const removedItems = oldSelection.filter(e => newSelection.indexOf(e) < 0);
952
+ const addedItems = newSelection.filter(e => oldSelection.indexOf(e) < 0);
953
+ this.registerRemoteEntries(addedItems);
954
+ this.registerRemoteEntries(removedItems, false);
955
+ return Object.keys(this._remoteSelection).map(e => this._remoteSelection[e]).join(', ');
956
+ }
957
+ }
958
+ IgxComboBaseDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IgxComboBaseDirective, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.IgxSelectionAPIService }, { token: i2.IgxComboAPIService }, { token: i3.IgxIconService }, { token: DisplayDensityToken, optional: true }, { token: IGX_INPUT_GROUP_TYPE, optional: true }, { token: i0.Injector, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
959
+ IgxComboBaseDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.0", type: IgxComboBaseDirective, inputs: { overlaySettings: "overlaySettings", id: "id", width: "width", allowCustomValues: "allowCustomValues", itemsMaxHeight: "itemsMaxHeight", itemHeight: "itemHeight", itemsWidth: "itemsWidth", placeholder: "placeholder", data: "data", valueKey: "valueKey", displayKey: "displayKey", groupKey: "groupKey", groupSortingDirection: "groupSortingDirection", ariaLabelledBy: "ariaLabelledBy", disabled: "disabled", type: "type" }, outputs: { selectionChanging: "selectionChanging", opening: "opening", opened: "opened", closing: "closing", closed: "closed", addition: "addition", searchInputUpdate: "searchInputUpdate", dataPreLoad: "dataPreLoad" }, host: { listeners: { "keydown.ArrowDown": "onArrowDown($event)", "keydown.Alt.ArrowDown": "onArrowDown($event)" }, properties: { "attr.id": "this.id", "style.width": "this.width", "attr.aria-labelledby": "this.ariaLabelledBy", "class.igx-combo": "this.cssClass", "attr.role": "this.role", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-haspopup": "this.hasPopUp", "attr.aria-owns": "this.ariaOwns" } }, queries: [{ propertyName: "itemTemplate", first: true, predicate: IgxComboItemDirective, descendants: true, read: TemplateRef }, { propertyName: "headerTemplate", first: true, predicate: IgxComboHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: IgxComboFooterDirective, descendants: true, read: TemplateRef }, { propertyName: "headerItemTemplate", first: true, predicate: IgxComboHeaderItemDirective, descendants: true, read: TemplateRef }, { propertyName: "addItemTemplate", first: true, predicate: IgxComboAddItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: IgxComboEmptyDirective, descendants: true, read: TemplateRef }, { propertyName: "toggleIconTemplate", first: true, predicate: IgxComboToggleIconDirective, descendants: true, read: TemplateRef }, { propertyName: "clearIconTemplate", first: true, predicate: IgxComboClearIconDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: IgxInputGroupComponent, static: true }, { propertyName: "comboInput", first: true, predicate: ["comboInput"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "virtualScrollContainer", first: true, predicate: IgxForOfDirective, descendants: true, static: true }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true, read: IgxForOfDirective, static: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownItemContainer"], descendants: true, static: true }, { propertyName: "primitiveTemplate", first: true, predicate: ["primitive"], descendants: true, read: TemplateRef, static: true }, { propertyName: "complexTemplate", first: true, predicate: ["complex"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0 });
960
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IgxComboBaseDirective, decorators: [{
961
+ type: Directive
962
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.IgxSelectionAPIService }, { type: i2.IgxComboAPIService }, { type: i3.IgxIconService }, { type: undefined, decorators: [{
963
+ type: Optional
964
+ }, {
965
+ type: Inject,
966
+ args: [DisplayDensityToken]
967
+ }] }, { type: undefined, decorators: [{
968
+ type: Optional
969
+ }, {
970
+ type: Inject,
971
+ args: [IGX_INPUT_GROUP_TYPE]
972
+ }] }, { type: i0.Injector, decorators: [{
973
+ type: Optional
974
+ }] }]; }, propDecorators: { overlaySettings: [{
975
+ type: Input
976
+ }], id: [{
977
+ type: HostBinding,
978
+ args: ['attr.id']
979
+ }, {
980
+ type: Input
981
+ }], width: [{
982
+ type: HostBinding,
983
+ args: ['style.width']
984
+ }, {
985
+ type: Input
986
+ }], allowCustomValues: [{
987
+ type: Input
988
+ }], itemsMaxHeight: [{
989
+ type: Input
990
+ }], itemHeight: [{
991
+ type: Input
992
+ }], itemsWidth: [{
993
+ type: Input
994
+ }], placeholder: [{
995
+ type: Input
996
+ }], data: [{
997
+ type: Input
998
+ }], valueKey: [{
999
+ type: Input
1000
+ }], displayKey: [{
1001
+ type: Input
1002
+ }], groupKey: [{
1003
+ type: Input
1004
+ }], groupSortingDirection: [{
1005
+ type: Input
1006
+ }], ariaLabelledBy: [{
1007
+ type: Input
1008
+ }, {
1009
+ type: HostBinding,
1010
+ args: ['attr.aria-labelledby']
1011
+ }], cssClass: [{
1012
+ type: HostBinding,
1013
+ args: ['class.igx-combo']
1014
+ }], role: [{
1015
+ type: HostBinding,
1016
+ args: [`attr.role`]
1017
+ }], ariaExpanded: [{
1018
+ type: HostBinding,
1019
+ args: ['attr.aria-expanded']
1020
+ }], hasPopUp: [{
1021
+ type: HostBinding,
1022
+ args: ['attr.aria-haspopup']
1023
+ }], ariaOwns: [{
1024
+ type: HostBinding,
1025
+ args: ['attr.aria-owns']
1026
+ }], disabled: [{
1027
+ type: Input
1028
+ }], type: [{
1029
+ type: Input
1030
+ }], selectionChanging: [{
1031
+ type: Output
1032
+ }], opening: [{
1033
+ type: Output
1034
+ }], opened: [{
1035
+ type: Output
1036
+ }], closing: [{
1037
+ type: Output
1038
+ }], closed: [{
1039
+ type: Output
1040
+ }], addition: [{
1041
+ type: Output
1042
+ }], searchInputUpdate: [{
1043
+ type: Output
1044
+ }], dataPreLoad: [{
1045
+ type: Output
1046
+ }], itemTemplate: [{
1047
+ type: ContentChild,
1048
+ args: [IgxComboItemDirective, { read: TemplateRef }]
1049
+ }], headerTemplate: [{
1050
+ type: ContentChild,
1051
+ args: [IgxComboHeaderDirective, { read: TemplateRef }]
1052
+ }], footerTemplate: [{
1053
+ type: ContentChild,
1054
+ args: [IgxComboFooterDirective, { read: TemplateRef }]
1055
+ }], headerItemTemplate: [{
1056
+ type: ContentChild,
1057
+ args: [IgxComboHeaderItemDirective, { read: TemplateRef }]
1058
+ }], addItemTemplate: [{
1059
+ type: ContentChild,
1060
+ args: [IgxComboAddItemDirective, { read: TemplateRef }]
1061
+ }], emptyTemplate: [{
1062
+ type: ContentChild,
1063
+ args: [IgxComboEmptyDirective, { read: TemplateRef }]
1064
+ }], toggleIconTemplate: [{
1065
+ type: ContentChild,
1066
+ args: [IgxComboToggleIconDirective, { read: TemplateRef }]
1067
+ }], clearIconTemplate: [{
1068
+ type: ContentChild,
1069
+ args: [IgxComboClearIconDirective, { read: TemplateRef }]
1070
+ }], inputGroup: [{
1071
+ type: ViewChild,
1072
+ args: ['inputGroup', { read: IgxInputGroupComponent, static: true }]
1073
+ }], comboInput: [{
1074
+ type: ViewChild,
1075
+ args: ['comboInput', { read: IgxInputDirective, static: true }]
1076
+ }], searchInput: [{
1077
+ type: ViewChild,
1078
+ args: ['searchInput']
1079
+ }], virtualScrollContainer: [{
1080
+ type: ViewChild,
1081
+ args: [IgxForOfDirective, { static: true }]
1082
+ }], virtDir: [{
1083
+ type: ViewChild,
1084
+ args: [IgxForOfDirective, { read: IgxForOfDirective, static: true }]
1085
+ }], dropdownContainer: [{
1086
+ type: ViewChild,
1087
+ args: ['dropdownItemContainer', { static: true }]
1088
+ }], primitiveTemplate: [{
1089
+ type: ViewChild,
1090
+ args: ['primitive', { read: TemplateRef, static: true }]
1091
+ }], complexTemplate: [{
1092
+ type: ViewChild,
1093
+ args: ['complex', { read: TemplateRef, static: true }]
1094
+ }], onArrowDown: [{
1095
+ type: HostListener,
1096
+ args: ['keydown.ArrowDown', ['$event']]
1097
+ }, {
1098
+ type: HostListener,
1099
+ args: ['keydown.Alt.ArrowDown', ['$event']]
1100
+ }] } });
1101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8uY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2NvbWJvL2NvbWJvLmNvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsWUFBWSxFQUNaLFNBQVMsRUFHVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUVkLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF5QyxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBMEIsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RyxPQUFPLEVBQThCLFVBQVUsRUFBbUQsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFHdkYsT0FBTyxFQUFxQixvQkFBb0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFHdkcsT0FBTyxFQUNILHdCQUF3QixFQUFFLDBCQUEwQixFQUFFLHNCQUFz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RUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLM0QsV0FBVztzQkFEakIsU0FBUzt1QkFBQyxhQUFhO2dCQUtqQixzQkFBc0I7c0JBRDVCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUlwQyxPQUFPO3NCQURoQixTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTdELGlCQUFpQjtzQkFEMUIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTFDLGlCQUFpQjtzQkFEMUIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWpELGVBQWU7c0JBRHhCLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQXFMbEQsV0FBVztzQkFGakIsWUFBWTt1QkFBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQzVDLFlBQVk7dUJBQUMsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIERpcmVjdGl2ZSxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5qZWN0aW9uVG9rZW4sXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY2FzZVNlbnNpdGl2ZSB9IGZyb20gJ0BpZ25pdGV1aS9tYXRlcmlhbC1pY29ucy1leHRlbmRlZCc7XG5pbXBvcnQgeyBub29wLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneFNlbGVjdGlvbkFQSVNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncywgY2xvbmVBcnJheSwgSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncywgSUJhc2VFdmVudEFyZ3MgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJRm9yT2ZTdGF0ZSwgSWd4Rm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IElTZWxlY3Rpb25FdmVudEFyZ3MgfSBmcm9tICcuLi9kcm9wLWRvd24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uL2ljb24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwVHlwZSwgSUdYX0lOUFVUX0dST1VQX1RZUEUgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dEdyb3VwVHlwZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SW5wdXRTdGF0ZSB9IGZyb20gJy4uL2lucHV0LWdyb3VwL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4Q29tYm9Ecm9wRG93bkNvbXBvbmVudCB9IGZyb20gJy4vY29tYm8tZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbWJvQVBJU2VydmljZSB9IGZyb20gJy4vY29tYm8uYXBpJztcbmltcG9ydCB7XG4gICAgSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLCBJZ3hDb21ib0NsZWFySWNvbkRpcmVjdGl2ZSwgSWd4Q29tYm9FbXB0eURpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0Zvb3RlckRpcmVjdGl2ZSwgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsIElneENvbWJvSGVhZGVySXRlbURpcmVjdGl2ZSwgSWd4Q29tYm9JdGVtRGlyZWN0aXZlLCBJZ3hDb21ib1RvZ2dsZUljb25EaXJlY3RpdmVcbn0gZnJvbSAnLi9jb21iby5kaXJlY3RpdmVzJztcbmltcG9ydCB7XG4gICAgSUNvbWJvRmlsdGVyaW5nT3B0aW9ucywgSUNvbWJvSXRlbUFkZGl0aW9uRXZlbnQsIElDb21ib1NlYXJjaElucHV0RXZlbnRBcmdzLFxuICAgIElDb21ib1NlbGVjdGlvbkNoYW5naW5nRXZlbnRBcmdzXG59IGZyb20gJy4vcHVibGljX2FwaSc7XG5cbmV4cG9ydCBjb25zdCBJR1hfQ09NQk9fQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuPElneENvbWJvQmFzZT4oJ0lneENvbWJvQ29tcG9uZW50VG9rZW4nKTtcblxuLyoqIEBoaWRkZW4gQGludGVybmFsIFRPRE86IEV2YWx1YXRlICovXG5leHBvcnQgaW50ZXJmYWNlIElneENvbWJvQmFzZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkYXRhOiBhbnlbXSB8IG51bGw7XG4gICAgdmFsdWVLZXk6IHN0cmluZztcbiAgICBncm91cEtleTogc3RyaW5nO1xuICAgIGlzUmVtb3RlOiBib29sZWFuO1xuICAgIGZpbHRlcmVkRGF0YTogYW55W10gfCBudWxsO1xuICAgIHRvdGFsSXRlbUNvdW50OiBudW1iZXI7XG4gICAgaXRlbXNNYXhIZWlnaHQ6IG51bWJlcjtcbiAgICBpdGVtSGVpZ2h0OiBudW1iZXI7XG4gICAgc2VhcmNoVmFsdWU6IHN0cmluZztcbiAgICBzZWFyY2hJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICBjb21ib0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIG9wZW5lZDogRXZlbnRFbWl0dGVyPElCYXNlRXZlbnRBcmdzPjtcbiAgICBvcGVuaW5nOiBFdmVudEVtaXR0ZXI8Q2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3M+O1xuICAgIGNsb3Npbmc6IEV2ZW50RW1pdHRlcjxDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz47XG4gICAgY2xvc2VkOiBFdmVudEVtaXR0ZXI8SUJhc2VFdmVudEFyZ3M+O1xuICAgIGZvY3VzU2VhcmNoSW5wdXQob3BlbmluZz86IGJvb2xlYW4pOiB2b2lkO1xuICAgIHRyaWdnZXJDaGVjaygpOiB2b2lkO1xuICAgIGFkZEl0ZW1Ub0NvbGxlY3Rpb24oKTogdm9pZDtcbiAgICBpc0FkZEJ1dHRvblZpc2libGUoKTogYm9vbGVhbjtcbiAgICBoYW5kbGVJbnB1dENoYW5nZShldmVudD86IHN0cmluZyk6IHZvaWQ7XG4gICAgaXNJdGVtU2VsZWN0ZWQoaXRlbUlEOiBhbnkpOiBib29sZWFuO1xuICAgIHNlbGVjdChpdGVtOiBhbnkpOiB2b2lkO1xuICAgIHNlbGVjdChpdGVtSURzOiBhbnlbXSwgY2xlYXJTZWxlY3Rpb24/OiBib29sZWFuLCBldmVudD86IEV2ZW50KTogdm9pZDtcbiAgICBkZXNlbGVjdCguLi5hcmdzOiBbXSB8IFtpdGVtSURzOiBhbnlbXSwgZXZlbnQ/OiBFdmVudF0pOiB2b2lkO1xufVxuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbi8qKlxuICogQGhpZGRlblxuICogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBjb21ibydzXG4gKiBkcm9wLWRvd24gbGlzdCBpZiBubyBgW2l0ZW1zTWF4SGVpZ2h0XWAgaXMgc3BlY2lmaWVkXG4gKi9cbmNvbnN0IGl0ZW1zSW5Db250YWluZXIgPSAxMDsgLy8gVE9ETzogbWFrZSBwcml2YXRlIHJlYWRvbmx5XG5cbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuY29uc3QgSXRlbUhlaWdodHMgPSB7XG4gICAgY29tZm9ydGFibGU6IDQwLFxuICAgIGNvc3k6IDMyLFxuICAgIGNvbXBhY3Q6IDI4LFxufTtcblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5leHBvcnQgZW51bSBEYXRhVHlwZXMge1xuICAgIEVNUFRZID0gJ2VtcHR5JyxcbiAgICBQUklNSVRJVkUgPSAncHJpbWl0aXZlJyxcbiAgICBDT01QTEVYID0gJ2NvbXBsZXgnLFxuICAgIFBSSU1BUllLRVkgPSAndmFsdWVLZXknXG59XG5cbmV4cG9ydCBlbnVtIElneENvbWJvU3RhdGUge1xuICAgIC8qKlxuICAgICAqIENvbWJvIHdpdGggaW5pdGlhbCBzdGF0ZS5cbiAgICAgKi9cbiAgICBJTklUSUFMID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMLFxuICAgIC8qKlxuICAgICAqIENvbWJvIHdpdGggdmFsaWQgc3RhdGUuXG4gICAgICovXG4gICAgVkFMSUQgPSBJZ3hJbnB1dFN0YXRlLlZBTElELFxuICAgIC8qKlxuICAgICAqIENvbWJvIHdpdGggaW52YWxpZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBJTlZBTElEID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEXG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElneENvbWJvQmFzZURpcmVjdGl2ZSBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSBpbXBsZW1lbnRzIElneENvbWJvQmFzZSwgT25Jbml0LCBEb0NoZWNrLFxuICAgIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIC8qKlxuICAgICAqIFNldCBjdXN0b20gb3ZlcmxheSBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgaG93IHRoZSBjb21ibydzIGxpc3Qgb2YgaXRlbXMgaXMgZGlzcGxheWVkLlxuICAgICAqIFNldDpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbb3ZlcmxheVNldHRpbmdzXSA9IFwiY3VzdG9tT3ZlcmxheVNldHRpbmdzXCI+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IGN1c3RvbVNldHRpbmdzID0geyBwb3NpdGlvblN0cmF0ZWd5OiB7IHNldHRpbmdzOiB7IHRhcmdldDogbXlUYXJnZXQgfSB9IH07XG4gICAgICogIGNvbWJvLm92ZXJsYXlTZXR0aW5ncyA9IGN1c3RvbVNldHRpbmdzO1xuICAgICAqIGBgYFxuICAgICAqIEdldCBhbnkgY3VzdG9tIG92ZXJsYXkgc2V0dGluZ3MgdXNlZCBieSB0aGUgY29tYm86XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBjb21ib092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0gbXlDb21iby5vdmVybGF5U2V0dGluZ3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9nZXRzIGNvbWJvIGlkLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBpZCA9IHRoaXMuY29tYm8uaWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2lkXT0nY29tYm8xJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1jb21iby0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3R5bGUgd2lkdGggb2YgdGhlIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1dpZHRoID0gdGhpcy5jb21iby53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbd2lkdGhdPScyNTBweCc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY3VzdG9tIHZhbHVlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgY29tYm9BbGxvd3NDdXN0b21WYWx1ZXMgPSB0aGlzLmNvbWJvLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFthbGxvd0N1c3RvbVZhbHVlc109J3RydWUnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93Q3VzdG9tVmFsdWVzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBkcm9wIGRvd24gbGlzdCBoZWlnaHRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1zTWF4SGVpZ2h0ID0gdGhpcy5jb21iby5pdGVtc01heEhlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbaXRlbXNNYXhIZWlnaHRdPSczMjAnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpdGVtc01heEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5faXRlbXNNYXhIZWlnaHQgPT09IG51bGwgfHwgdGhpcy5faXRlbXNNYXhIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUhlaWdodCAqIGl0ZW1zSW5Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTWF4SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaXRlbXNNYXhIZWlnaHQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5faXRlbXNNYXhIZWlnaHQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3QgaXRlbSBoZWlnaHRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1IZWlnaHQgPSB0aGlzLmNvbWJvLml0ZW1IZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1IZWlnaHRdPSczMic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1IZWlnaHQgPT09IG51bGwgfHwgdGhpcy5faXRlbUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gSXRlbUhlaWdodHNbdGhpcy5kaXNwbGF5RGVuc2l0eV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1IZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBpdGVtSGVpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3Qgd2lkdGhcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1zV2lkdGggPSB0aGlzLmNvbWJvLml0ZW1zV2lkdGg7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1zV2lkdGhdID0gJ1wiMTgwcHhcIic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXNXaWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIHRoZSBjb21ibyB2YWx1ZSBmaWVsZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvUGxhY2Vob2xkZXIgPSB0aGlzLmNvbWJvLnBsYWNlaG9sZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtwbGFjZWhvbGRlcl09J25ld1BsYWNlSG9sZGVyJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tYm8gZGF0YSBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2RhdGFdPSdpdGVtcyc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWw6IGFueVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gKHZhbCkgPyB2YWwgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoaWNoIGNvbHVtbiBpbiB0aGUgZGF0YSBzb3VyY2UgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvVmFsdWVLZXkgPSB0aGlzLmNvbWJvLnZhbHVlS2V5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFt2YWx1ZUtleV09J215S2V5Jz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUtleTogc3RyaW5nID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkaXNwbGF5S2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlLZXkgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGljaCBjb2x1bW4gaW4gdGhlIGRhdGEgc291cmNlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXNwbGF5IHZhbHVlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvRGlzcGxheUtleSA9IHRoaXMuY29tYm8uZGlzcGxheUtleTtcbiAgICAgKlxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8uZGlzcGxheUtleSA9ICd2YWwnO1xuICAgICAqXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2Rpc3BsYXlLZXldPSdteURpc3BsYXlLZXknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzcGxheUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlLZXkgPyB0aGlzLl9kaXNwbGF5S2V5IDogdGhpcy52YWx1ZUtleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBwcm9wZXJ0eSBieSB3aGljaCBpdGVtcyBzaG91bGQgYmUgZ3JvdXBlZCBpbnNpZGUgdGhlIGl0ZW1zIGxpc3QuIE5vdCB1c2FibGUgaWYgZGF0YSBpcyBub3Qgb2YgdHlwZSBPYmplY3RbXS5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbZ3JvdXBLZXldPSduZXdHcm91cEtleSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGdyb3VwS2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2dyb3VwS2V5ID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpdGVtIHByb3BlcnR5IGJ5IHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBncm91cGVkIGluc2lkZSB0aGUgaXRlbXMgbGlzdC4gTm90IHVzYWJsZSBpZiBkYXRhIGlzIG5vdCBvZiB0eXBlIE9iamVjdFtdLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBjdXJyZW50R3JvdXBLZXkgPSB0aGlzLmNvbWJvLmdyb3VwS2V5O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3JvdXBLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwS2V5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgZ3JvdXBzIHNvcnRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtncm91cFNvcnRpbmdEaXJlY3Rpb25dPVwiZ3JvdXBTb3J0aW5nRGlyZWN0aW9uXCI+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBncm91cFNvcnRpbmdEaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLkFzYztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0aW5nRGlyZWN0aW9uKCk6IFNvcnRpbmdEaXJlY3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBTb3J0aW5nRGlyZWN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGdyb3VwU29ydGluZ0RpcmVjdGlvbih2YWw6IFNvcnRpbmdEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBTb3J0aW5nRGlyZWN0aW9uID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldCBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gW2FyaWFMYWJlbGxlZEJ5XT1cIidsYWJlbDEnXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JylcbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNvbWJvJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNvbWJvJzsgLy8gSW5kZXBlbmRlbnQgb2YgZGlzcGxheSBkZW5zaXR5IGZvciB0aGUgdGltZSBiZWluZ1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLnJvbGVgKVxuICAgIHB1YmxpYyByb2xlID0gJ2NvbWJvYm94JztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpXG4gICAgcHVibGljIGdldCBoYXNQb3BVcCgpIHtcbiAgICAgICAgcmV0dXJuICdsaXN0Ym94JztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFPd25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBlbmFibGVkL2Rpc2FibGVzIGNvbWJvLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtkaXNhYmxlZF09XCIndHJ1ZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBob3cgdGhlIGNvbWJvIHdpbGwgYmUgc3R5bGVkLlxuICAgICAqIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgYGxpbmVgLCBgYm94YCwgYGJvcmRlcmAgYW5kIGBzZWFyY2hgLiBUaGUgZGVmYXVsdCBpcyBgYm94YC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbdHlwZV09XCInbGluZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBJZ3hJbnB1dEdyb3VwVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlIHx8IHRoaXMuX2lucHV0R3JvdXBUeXBlIHx8ICdib3gnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdHlwZSh2YWw6IElneElucHV0R3JvdXBUeXBlKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGl0ZW0gc2VsZWN0aW9uIGlzIGNoYW5naW5nLCBiZWZvcmUgdGhlIHNlbGVjdGlvbiBjb21wbGV0ZXNcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChzZWxlY3Rpb25DaGFuZ2luZyk9J2hhbmRsZVNlbGVjdGlvbigpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBhbnkgZm9yIG9sZC9uZXcgc2VsZWN0aW9uP1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWxlY3Rpb25DaGFuZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbWJvU2VsZWN0aW9uQ2hhbmdpbmdFdmVudEFyZ3MgfCBJU2VsZWN0aW9uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gb3BlbmluZz0naGFuZGxlT3BlbmluZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKG9wZW5lZCk9J2hhbmRsZU9wZW5lZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBkcm9wZG93biBpcyBjbG9zZWRcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChjbG9zaW5nKT0naGFuZGxlQ2xvc2luZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKGNsb3NlZCk9J2hhbmRsZUNsb3NlZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBpdGVtIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChhZGRpdGlvbik9J2hhbmRsZUFkZGl0aW9uRXZlbnQoJGV2ZW50KSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkZGl0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29tYm9JdGVtQWRkaXRpb25FdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBpbnB1dCBjaGFuZ2VzIChlLmcuIHR5cGluZywgcGFzdGluZywgY2xlYXIsIGV0Yy4pXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoc2VhcmNoSW5wdXRVcGRhdGUpPSdoYW5kbGVTZWFyY2hJbnB1dEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hJbnB1dFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbmV3IGNodW5rIG9mIGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIHZpcnR1YWxpemF0aW9uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoZGF0YVByZUxvYWQpPSdoYW5kbGVEYXRhUHJlbG9hZEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhUHJlTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUZvck9mU3RhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgSVRFTVMgaW4gdGhlIGNvbWJvIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5pdGVtVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9JdGVtPlxuICAgICAqICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taXRlbVwiIGxldC1pdGVtIGxldC1rZXk9XCJ2YWx1ZUtleVwiPlxuICAgICAqICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW1fX25hbWVcIj57eyBpdGVtW2tleV0gfX08L2Rpdj5cbiAgICAgKiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1pdGVtX19jb3N0XCI+e3sgaXRlbS5jb3N0IH19PC9kaXY+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvSXRlbURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBIRUFERVIgZm9yIHRoZSBjb21ibyBpdGVtcyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uaGVhZGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9IZWFkZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvX19oZWFkZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBoZWFkZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBGT09URVIgZm9yIHRoZSBjb21ibyBpdGVtcyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uZm9vdGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9Gb290ZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvX19mb290ZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBmb290ZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9Gb290ZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIEhFQURFUiBJVEVNUyBmb3IgZ3JvdXBzIGluIHRoZSBjb21ibyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uaGVhZGVySXRlbVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvSGVhZGVySXRlbSBsZXQtaXRlbSBsZXQta2V5PVwiZ3JvdXBLZXlcIj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW0tLWdyb3VwXCI+R3JvdXAgaGVhZGVyIGZvciB7eyBpdGVtW2tleV0gfX08L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIEFERCBCVVRUT04gaW4gdGhlIGNvbWJvIGRyb3AgZG93blxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmFkZEl0ZW1UZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jb21ibyAjY29tYm8+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0FkZEl0ZW0+XG4gICAgICogICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbWJvX19hZGQtYnV0dG9uXCI+XG4gICAgICogICAgICAgICAgICAgIENsaWNrIHRvIGFkZCBpdGVtXG4gICAgICogICAgICAgICAgPC9idXR0b24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvQWRkSXRlbURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBhZGRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBBREQgQlVUVE9OIGluIHRoZSBjb21ibyBkcm9wIGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5lbXB0eVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvRW1wdHk+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvLS1lbXB0eVwiPlxuICAgICAqICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gaXRlbXMgdG8gZGlzcGxheVxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib0VtcHR5RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGVtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBjb21ibyBUT0dHTEUob3Blbi9jbG9zZSkgYnV0dG9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8udG9nZ2xlSWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvVG9nZ2xlSWNvbiBsZXQtY29sbGFwc2VkPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj57eyBjb2xsYXBzZWQgPyAncmVtb3ZlX2NpcmNsZScgOiAncmVtb3ZlX2NpcmNsZV9vdXRsaW5lJ319PC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9Ub2dnbGVJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHRvZ2dsZUljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIGNvbWJvIENMRUFSIGJ1dHRvblxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmNsZWFySWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvQ2xlYXJJY29uPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj5jbGVhcjwvaWd4LWljb24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvQ2xlYXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGNsZWFySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXAnLCB7IHJlYWQ6IElneElucHV0R3JvdXBDb21wb25lbnQsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnY29tYm9JbnB1dCcsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjb21ib0lucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JylcbiAgICBwdWJsaWMgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hGb3JPZkRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbENvbnRhaW5lcjogSWd4Rm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoSWd4Rm9yT2ZEaXJlY3RpdmUsIHsgcmVhZDogSWd4Rm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCB2aXJ0RGlyOiBJZ3hGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25JdGVtQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZHJvcGRvd25Db250YWluZXI6IEVsZW1lbnRSZWYgPSBudWxsO1xuXG4gICAgQFZpZXdDaGlsZCgncHJpbWl0aXZlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIHByaW1pdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29tcGxleCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjb21wbGV4VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBzZWFyY2hWYWx1ZSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsO1xuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUmVtb3RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1Db3VudCA+IDAgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWVLZXkgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlcy5DT01QTEVYO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlcy5DT01QTEVYO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEYXRhVHlwZXMuUFJJTUlUSVZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCB2YWxpZCA9IHRoaXMuY29tYm8udmFsaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBJZ3hDb21ib1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8udmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOVkFMSUQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWxpZCh2YWxpZDogSWd4Q29tYm9TdGF0ZSkge1xuICAgICAgICB0aGlzLl92YWxpZCA9IHZhbGlkO1xuICAgICAgICB0aGlzLmNvbWJvSW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlW0lneENvbWJvU3RhdGVbdmFsaWRdXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvIGlucHV0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvbWJvVmFsdWUgPSB0aGlzLmNvbWJvLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpcnR1YWxpemVkIGRhdGEuIEl0IGNvbnRhaW5zIGBzdGFydEluZGV4YCBhbmQgYGNodW5rU2l6ZWBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgc3RhdGUgPSB0aGlzLmNvbWJvLnZpcnR1YWxpemF0aW9uU3RhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXJ0dWFsaXphdGlvblN0YXRlKCk6IElGb3JPZlN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlydERpci5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmlydHVhbGl6ZWQgZGF0YS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLnZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmlydHVhbGl6YXRpb25TdGF0ZShzdGF0ZTogSUZvck9mU3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0RGlyLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBkcm9wIGRvd24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN0YXRlID0gdGhpcy5jb21iby5jb2xsYXBzZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRvdGFsIGNvdW50IG9mIHRoZSB2aXJ0dWFsIGRhdGEgaXRlbXMsIHdoZW4gdXNpbmcgcmVtb3RlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvdW50ID0gdGhpcy5jb21iby50b3RhbEl0ZW1Db3VudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpcnREaXIudG90YWxJdGVtQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdG90YWwgY291bnQgb2YgdGhlIHZpcnR1YWwgZGF0YSBpdGVtcywgd2hlbiB1c2luZyByZW1vdGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLnRvdGFsSXRlbUNvdW50KHJlbW90ZVNlcnZpY2UuY291bnQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdG90YWxJdGVtQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnZpcnREaXIudG90YWxJdGVtQ291bnQgPSBjb3VudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7XG4gICAgICAgIGlmICh0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gRGF0YVR5cGVzLkNPTVBMRVgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXhUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgY3VzdG9tVmFsdWVGbGFnID0gdHJ1ZTtcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSAnJztcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZGVmYXVsdEZhbGxiYWNrR3JvdXAgPSAnT3RoZXInO1xuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdPcHRpb25zOiBJQ29tYm9GaWx0ZXJpbmdPcHRpb25zID0ge1xuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RhdGEgPSBbXTtcbiAgICBwcm90ZWN0ZWQgX3ZhbHVlID0gJyc7XG4gICAgcHJvdGVjdGVkIF9ncm91cEtleSA9ICcnO1xuICAgIHByb3RlY3RlZCBfZmlsdGVyZWREYXRhID0gW107XG4gICAgcHJvdGVjdGVkIF9kaXNwbGF5S2V5OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9yZW1vdGVTZWxlY3Rpb24gPSB7fTtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHByb3RlY3RlZCBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIHByb3RlY3RlZCBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG5cbiAgICBwcml2YXRlIF90eXBlID0gbnVsbDtcbiAgICBwcml2YXRlIF9kYXRhVHlwZSA9ICcnO1xuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlID0gJyc7XG4gICAgcHJpdmF0ZSBfaXRlbUhlaWdodCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaXRlbXNNYXhIZWlnaHQgPSBudWxsO1xuICAgIHByaXZhdGUgX292ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzO1xuICAgIHByaXZhdGUgX2dyb3VwU29ydGluZ0RpcmVjdGlvbjogU29ydGluZ0RpcmVjdGlvbiA9IFNvcnRpbmdEaXJlY3Rpb24uQXNjO1xuXG4gICAgcHVibGljIGFic3RyYWN0IGRyb3Bkb3duOiBJZ3hDb21ib0Ryb3BEb3duQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHNlbGVjdGlvblNlcnZpY2U6IElneFNlbGVjdGlvbkFQSVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBjb21ib0FQSTogSWd4Q29tYm9BUElTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2ljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfSU5QVVRfR1JPVVBfVFlQRSkgcHJvdGVjdGVkIF9pbnB1dEdyb3VwVHlwZTogSWd4SW5wdXRHcm91cFR5cGUsXG4gICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dEb3duJywgWyckZXZlbnQnXSlcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLkFsdC5BcnJvd0Rvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkFycm93RG93bihldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLl9pbmplY3Rvci5nZXQ8TmdDb250cm9sPihOZ0NvbnRyb2wsIG51bGwpO1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0RWxlbWVudCxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KCksXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICAgICAgZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2s6IFt0YXJnZXRFbGVtZW50IGFzIEhUTUxFbGVtZW50XVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2V0KHRoaXMuaWQsIG5ldyBTZXQoKSk7XG4gICAgICAgIHRoaXMuX2ljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChjYXNlU2Vuc2l0aXZlLm5hbWUsIGNhc2VTZW5zaXRpdmUudmFsdWUsICdpbXgtaWNvbnMnKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlydERpci5jaHVua1ByZWxvYWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZTogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZvck9mU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBlLCB7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJlTG9hZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5jb21ib0FQSS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBvcGVucy9jbG9zZXMgdGhlIGNvbWJvLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gKGNsaWNrKT1cImNvbWJvLnRvZ2dsZSgpXCI+VG9nZ2xlIENvbWJvPC9idXR0b24+XG4gICAgICogPGlneC1jb21ibyAjY29tYm8+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fb3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBvcGVucyB0aGUgY29tYm8uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiAoY2xpY2spPVwiY29tYm8ub3BlbigpXCI+T3BlbiBDb21ibzwvYnV0dG9uPlxuICAgICAqIDxpZ3gtY29tYm8gI2NvbWJvPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9vdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBjbG9zZXMgdGhlIGNvbWJvLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gKGNsaWNrKT1cImNvbWJvLmNsb3NlKClcIj5DbG9zZSBDb21ibzwvYnV0dG9uPlxuICAgICAqIDxpZ3gtY29tYm8gI2NvbWJvPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbWJvIHZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlckNoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBzZWxlY3RlZCBpdGVtc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuY29tYm8uc2VsZWN0ZWRJdGVtcygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldCh0aGlzLmlkKSk7XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBzcGVjaWZpZWQgaXRlbUlEIGlzIHNlbGVjdGVkXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmlzX2l0ZW1fc2VsZWN0ZWQodGhpcy5pZCwgaXRlbSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zZWFyY2hWYWx1ZS50cmltKCk7XG4gICAgICAgIGNvbnN0IGFkZGVkSXRlbSA9IHRoaXMuZGlzcGxheUtleSA/IHtcbiAgICAgICAgICAgIFt0aGlzLnZhbHVlS2V5XTogbmV3VmFsdWUsXG4gICAgICAgICAgICBbdGhpcy5kaXNwbGF5S2V5XTogbmV3VmFsdWVcbiAgICAgICAgfSA6IG5ld1ZhbHVlO1xuICAgICAgICBpZiAodGhpcy5ncm91cEtleSkge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihhZGRlZEl0ZW0sIHsgW3RoaXMuZ3JvdXBLZXldOiB0aGlzLmRlZmF1bHRGYWxsYmFja0dyb3VwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4cG9zZSBzaGFsbG93IGNvcHkgaW5zdGVhZCBvZiB0aGlzLmRhdGEgaW4gZXZlbnQgYXJncyBzbyB0aGlzLmRhdGEgY2FuJ3QgYmUgbXV0YXRlZFxuICAgICAgICBjb25zdCBvbGRDb2xsZWN0aW9uID0gWy4uLnRoaXMuZGF0YV07XG4gICAgICAgIGNvbnN0IG5ld0NvbGxlY3Rpb24gPSBbLi4udGhpcy5kYXRhLCBhZGRlZEl0ZW1dO1xuICAgICAgICBjb25zdCBhcmdzOiBJQ29tYm9JdGVtQWRkaXRpb25FdmVudCA9IHtcbiAgICAgICAgICAgIG9sZENvbGxlY3Rpb24sIGFkZGVkSXRlbSwgbmV3Q29sbGVjdGlvbiwgb3duZXI6IHRoaXMsIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRpdGlvbi5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEucHVzaChhcmdzLmFkZGVkSXRlbSk7XG4gICAgICAgIC8vIHRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHRoaXMuZGF0YSA9IGNsb25lQXJyYXkodGhpcy5kYXRhKTtcbiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy52YWx1ZUtleSAhPT0gbnVsbCAmJiB0aGlzLnZhbHVlS2V5ICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgW2FyZ3MuYWRkZWRJdGVtW3RoaXMudmFsdWVLZXldXSA6IFthcmdzLmFkZGVkSXRlbV0sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdXN0b21WYWx1ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB0aGlzLmRyb3Bkb3duLmZvY3VzZWRJdGVtID0gbnVsbDtcbiAgICAgICAgdGhpcy52aXJ0RGlyLnNjcm9sbFRvKDApO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBpc0FkZEJ1dHRvblZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSBib29sZWFuIHZhbHVlLiBJZiB0aGlzLnNlYXJjaFZhbHVlIHdhcyAnJywgaXQgcmV0dXJucyAnJyBpbnN0ZWFkIG9mIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hWYWx1ZSAhPT0gJycgJiYgdGhpcy5jdXN0b21WYWx1ZUZsYWc7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhhbmRsZUlucHV0Q2hhbmdlKGV2ZW50PzogYW55KSB7XG4gICAgICAgIGlmIChldmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzOiBJQ29tYm9TZWFyY2hJbnB1dEV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hUZXh0OiB0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnID8gZXZlbnQgOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICAgICAgY2FuY2VsOiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRVcGRhdGUuZW1pdChhcmdzKTtcbiAgICAgICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tNYXRjaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGhhbmRsZXJzXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZU9wZW5pbmcoZTogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBhcmdzOiBJQmFzZUNhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgZXZlbnQ6IGUuZXZlbnQsIGNhbmNlbDogZS5jYW5jZWwgfTtcbiAgICAgICAgdGhpcy5vcGVuaW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGUuY2FuY2VsID0gYXJncy5jYW5jZWw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhhbmRsZUNsb3NpbmcoZTogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBhcmdzOiBJQmFzZUNhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgZXZlbnQ6IGUuZXZlbnQsIGNhbmNlbDogZS5jYW5jZWwgfTtcbiAgICAgICAgdGhpcy5jbG9zaW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGUuY2FuY2VsID0gYXJncy5jYW5jZWw7XG4gICAgICAgIGlmIChlLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgICAgICAgaWYgKCFlLmV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbWJvSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBoYW5kbGVDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoeyBvd25lcjogdGhpcyB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcgfHwgZXZlbnQua2V5ID09PSAnVXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgb25CbHVyKCkge1xuICAgICAgICBpZiAodGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wgJiYgdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOSVRJQUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25TdGF0dXNDaGFuZ2VkID0gKCkgPT4ge1xuICAgICAgICBpZiAoKHRoaXMubmdDb250cm9sLmNvbnRyb2wudG91Y2hlZCB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmRpcnR5KSAmJlxuICAgICAgICAgICAgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2VkIHx8IHRoaXMuaW5wdXRHcm91cC5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCA/IElneENvbWJvU3RhdGUuSU5WQUxJRCA6IElneENvbWJvU3RhdGUuVkFMSUQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLm5nQ29udHJvbC5pbnZhbGlkID8gSWd4Q29tYm9TdGF0ZS5JTlZBTElEIDogSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQi5QLiAxOCBNYXkgMjAyMTogSWd4RGF0ZVBpY2tlciBkb2VzIG5vdCByZXNldCBpdHMgc3RhdGUgdXBvbiByZXNldEZvcm0gIzk1MjZcbiAgICAgICAgICAgIHRoaXMudmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOSVRJQUw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYW5hZ2VSZXF1aXJlZEFzdGVyaXNrKCk7XG4gICAgfTtcblxuICAgIC8qKiBpZiB0aGVyZSBpcyBhIHZhbHVlS2V5IC0gbWFwIHRoZSBrZXlzIHRvIGRhdGEgaXRlbXMsIGVsc2UgLSBqdXN0IHJldHVybiB0aGUga2V5cyAqL1xuICAgIHByb3RlY3RlZCBjb252ZXJ0S2V5c1RvSXRlbXMoa2V5czogYW55W10pIHtcbiAgICAgICAgaWYgKHRoaXMuY29tYm9BUEkudmFsdWVLZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1hcCBrZXlzIHZzLiBmaWx0ZXIgZGF0YSB0byByZXRhaW4gdGhlIG9yZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHRoaXMuZGF0YS5maW5kKGVudHJ5ID0+IGVudHJ5W3RoaXMudmFsdWVLZXldID09PSBrZXkpKS5maWx0ZXIoZSA9PiBlICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01hdGNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtTWF0Y2ggPSB0aGlzLmZpbHRlcmVkRGF0YS5zb21lKHRoaXMuZmluZE1hdGNoKTtcbiAgICAgICAgdGhpcy5jdXN0b21WYWx1ZUZsYWcgPSB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzICYmICFpdGVtTWF0Y2g7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbmRNYXRjaCA9IChlbGVtZW50OiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRpc3BsYXlLZXkgPyBlbGVtZW50W3RoaXMuZGlzcGxheUtleV0gOiBlbGVtZW50O1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgbWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAvLyBSdW4gdGhlIHZhbGlkYXRpb24gd2l0aCBlbXB0eSBvYmplY3QgdG8gY2hlY2sgaWYgcmVxdWlyZWQgaXMgZW5hYmxlZC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3Ioe30gYXMgQWJzdHJhY3RDb250cm9sKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29udGFpbnMga2V5LXZhbHVlIHBhaXJzIG9mIHRoZSBzZWxlY3RlZCB2YWx1ZUtleXMgYW5kIHRoZWlyIHJlc3AuIGRpc3BsYXlLZXlzICovXG4gICAgcHJvdGVjdGVkIHJlZ2lzdGVyUmVtb3RlRW50cmllcyhpZHM6IGFueVtdLCBhZGQgPSB0cnVlKSB7XG4gICAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0VmFsdWVEaXNwbGF5UGFpcnMoaWRzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VudHJ5W3RoaXMudmFsdWVLZXldXSA9IGVudHJ5W3RoaXMuZGlzcGxheUtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGlkcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZW1vdGVTZWxlY3Rpb25bZW50cnldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGBpZDogYW55W11gIHJldHVybnMgYSBtYXBwZWQgYHsgW2NvbWJvLnZhbHVlS2V5XTogYW55LCBbY29tYm8uZGlzcGxheUtleV06IGFueSB9W11gXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFZhbHVlRGlzcGxheVBhaXJzKGlkczogYW55W10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5maWx0ZXIoZW50cnkgPT4gaWRzLmluZGV4T2YoZW50cnlbdGhpcy52YWx1ZUtleV0pID4gLTEpLm1hcChlID0+ICh7XG4gICAgICAgICAgICBbdGhpcy52YWx1ZUtleV06IGVbdGhpcy52YWx1ZUtleV0sXG4gICAgICAgICAgICBbdGhpcy5kaXNwbGF5S2V5XTogZVt0aGlzLmRpc3BsYXlLZXldXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UmVtb3RlU2VsZWN0aW9uKG5ld1NlbGVjdGlvbjogYW55W10sIG9sZFNlbGVjdGlvbjogYW55W10pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIW5ld1NlbGVjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIElmIG5ldyBzZWxlY3Rpb24gaXMgZW1wdHksIGNsZWFyIGFsbCBpdGVtc1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlclJlbW90ZUVudHJpZXMob2xkU2VsZWN0aW9uLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW1zID0gb2xkU2VsZWN0aW9uLmZpbHRlcihlID0+IG5ld1NlbGVjdGlvbi5pbmRleE9mKGUpIDwgMCk7XG4gICAgICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBuZXdTZWxlY3Rpb24uZmlsdGVyKGUgPT4gb2xkU2VsZWN0aW9uLmluZGV4T2YoZSkgPCAwKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclJlbW90ZUVudHJpZXMoYWRkZWRJdGVtcyk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJSZW1vdGVFbnRyaWVzKHJlbW92ZWRJdGVtcywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcmVtb3RlU2VsZWN0aW9uKS5tYXAoZSA9PiB0aGlzLl9yZW1vdGVTZWxlY3Rpb25bZV0pLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBmaWx0ZXJlZERhdGEoKTogYW55W10gfCBudWxsO1xuICAgIHB1YmxpYyBhYnN0cmFjdCBzZXQgZmlsdGVyZWREYXRhKHZhbDogYW55W10gfCBudWxsKTtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBoYW5kbGVPcGVuZWQoKTtcbiAgICBwdWJsaWMgYWJzdHJhY3QgZm9jdXNTZWFyY2hJbnB1dChvcGVuaW5nPzogYm9vbGVhbik7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2VsZWN0KG5ld0l0ZW06IGFueSk6IHZvaWQ7XG4gICAgcHVibGljIGFic3RyYWN0IHNlbGVjdChuZXdJdGVtczogQXJyYXk8YW55PiB8IGFueSwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQ7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGVzZWxlY3QoLi4uYXJnczogW10gfCBbaXRlbXM6IEFycmF5PGFueT4sIGV2ZW50PzogRXZlbnRdKTogdm9pZDtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkO1xuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb246IFNldDxhbnk+LCBldmVudD86IEV2ZW50KTogdm9pZDtcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRGlzcGxheVRleHQobmV3U2VsZWN0aW9uOiBhbnlbXSwgb2xkU2VsZWN0aW9uOiBhbnlbXSk7XG59XG4iXX0=