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.
- package/README.md +31 -30
- package/esm2020/lib/action-strip/grid-actions/grid-editing-actions.component.mjs +2 -2
- package/esm2020/lib/banner/banner.component.mjs +1 -1
- package/esm2020/lib/combo/combo-dropdown.component.mjs +12 -6
- package/esm2020/lib/combo/combo-item.component.mjs +5 -3
- package/esm2020/lib/combo/combo.api.mjs +3 -3
- package/esm2020/lib/combo/combo.common.mjs +1100 -2
- package/esm2020/lib/combo/combo.component.mjs +107 -1231
- package/esm2020/lib/combo/combo.directives.mjs +9 -25
- package/esm2020/lib/combo/combo.pipes.mjs +4 -6
- package/esm2020/lib/combo/public_api.mjs +5 -1
- package/esm2020/lib/core/utils.mjs +11 -1
- package/esm2020/lib/dialog/dialog.component.mjs +22 -10
- package/esm2020/lib/directives/focus-trap/focus-trap.directive.mjs +112 -0
- package/esm2020/lib/directives/for-of/for_of.directive.mjs +2 -2
- package/esm2020/lib/directives/radio/radio-group.directive.mjs +5 -13
- package/esm2020/lib/drop-down/drop-down-item.base.mjs +1 -5
- package/esm2020/lib/grids/column-actions/column-actions.component.mjs +4 -4
- package/esm2020/lib/grids/columns/column-layout.component.mjs +3 -3
- package/esm2020/lib/grids/columns/column.component.mjs +5 -5
- package/esm2020/lib/grids/common/crud.service.mjs +2 -2
- package/esm2020/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.mjs +2 -2
- package/esm2020/lib/grids/filtering/grid-filtering.service.mjs +9 -9
- package/esm2020/lib/grids/grid/grid.component.mjs +4 -8
- package/esm2020/lib/grids/grid-base.directive.mjs +82 -69
- package/esm2020/lib/grids/grid-public-row.mjs +3 -12
- package/esm2020/lib/grids/grouping/group-by-area.directive.mjs +2 -2
- package/esm2020/lib/grids/headers/grid-header-row.component.mjs +3 -3
- package/esm2020/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +4 -8
- package/esm2020/lib/grids/state.directive.mjs +2 -2
- package/esm2020/lib/grids/tree-grid/tree-grid.component.mjs +4 -8
- package/esm2020/lib/services/overlay/utilities.mjs +1 -1
- package/esm2020/lib/simple-combo/public_api.mjs +2 -0
- package/esm2020/lib/simple-combo/simple-combo.component.mjs +375 -0
- package/esm2020/lib/toast/toast.component.mjs +3 -6
- package/esm2020/public_api.mjs +3 -1
- package/fesm2015/igniteui-angular.mjs +1723 -1405
- package/fesm2015/igniteui-angular.mjs.map +1 -1
- package/fesm2020/igniteui-angular.mjs +1714 -1402
- package/fesm2020/igniteui-angular.mjs.map +1 -1
- package/lib/banner/banner.component.d.ts +1 -2
- package/lib/combo/combo-dropdown.component.d.ts +3 -1
- package/lib/combo/combo-item.component.d.ts +3 -1
- package/lib/combo/combo.common.d.ts +733 -4
- package/lib/combo/combo.component.d.ts +41 -799
- package/lib/combo/combo.pipes.d.ts +1 -1
- package/lib/combo/public_api.d.ts +4 -0
- package/lib/core/utils.d.ts +4 -0
- package/lib/dialog/dialog.component.d.ts +11 -2
- package/lib/directives/focus-trap/focus-trap.directive.d.ts +41 -0
- package/lib/directives/radio/radio-group.directive.d.ts +4 -4
- package/lib/grids/columns/column.component.d.ts +1 -1
- package/lib/grids/grid/grid.component.d.ts +2 -1
- package/lib/grids/grid-base.directive.d.ts +64 -8
- package/lib/grids/grid-public-row.d.ts +2 -3
- package/lib/grids/hierarchical-grid/hierarchical-grid.component.d.ts +2 -1
- package/lib/grids/tree-grid/tree-grid.component.d.ts +2 -1
- package/lib/services/overlay/utilities.d.ts +2 -1
- package/lib/simple-combo/public_api.d.ts +1 -0
- package/lib/simple-combo/simple-combo.component.d.ts +134 -0
- package/lib/toast/toast.component.d.ts +2 -0
- package/migrations/common/filterSourceDirs.d.ts +2 -2
- package/migrations/common/filterSourceDirs.js +2 -2
- package/migrations/update-13_0_0/changes/members.json +26 -0
- package/migrations/update-13_0_0/index.js +0 -31
- package/package.json +51 -43
- package/public_api.d.ts +2 -0
- package/src/lib/combo/README.md +14 -14
- package/src/lib/directives/focus-trap/README.md +17 -0
- package/src/lib/simple-combo/README.md +317 -0
- package/esm2020/lib/core/deprecateDecorators.mjs +0 -99
- 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
|
-
|
|
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=
|