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,32 +1,25 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component,
|
|
2
|
+
import { Component, NgModule, Optional, Inject, ViewChild, Input } from '@angular/core';
|
|
3
3
|
import { IgxComboItemDirective, IgxComboEmptyDirective, IgxComboHeaderItemDirective, IgxComboHeaderDirective, IgxComboFooterDirective, IgxComboAddItemDirective, IgxComboToggleIconDirective, IgxComboClearIconDirective } from './combo.directives';
|
|
4
|
-
import { FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR
|
|
4
|
+
import { FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
5
|
import { IgxCheckboxModule } from '../checkbox/checkbox.component';
|
|
6
|
-
import { cloneArray } from '../core/utils';
|
|
7
6
|
import { IgxStringFilteringOperand, IgxBooleanFilteringOperand } from '../data-operations/filtering-condition';
|
|
8
7
|
import { FilteringLogic } from '../data-operations/filtering-expression.interface';
|
|
9
|
-
import { IgxForOfModule
|
|
8
|
+
import { IgxForOfModule } from '../directives/for-of/for_of.directive';
|
|
10
9
|
import { IgxIconModule } from '../icon/public_api';
|
|
11
10
|
import { IgxRippleModule } from '../directives/ripple/ripple.directive';
|
|
12
11
|
import { IgxToggleModule } from '../directives/toggle/toggle.directive';
|
|
13
12
|
import { IgxButtonModule } from '../directives/button/button.directive';
|
|
14
13
|
import { IgxDropDownModule } from '../drop-down/public_api';
|
|
15
|
-
import { IgxInputGroupModule
|
|
14
|
+
import { IgxInputGroupModule } from '../input-group/input-group.component';
|
|
16
15
|
import { IgxComboItemComponent } from './combo-item.component';
|
|
17
16
|
import { IgxComboDropDownComponent } from './combo-dropdown.component';
|
|
18
17
|
import { IgxComboFilteringPipe, IgxComboGroupingPipe } from './combo.pipes';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { takeUntil } from 'rxjs/operators';
|
|
22
|
-
import { DisplayDensityBase, DisplayDensityToken } from '../core/density';
|
|
23
|
-
import { IGX_COMBO_COMPONENT } from './combo.common';
|
|
18
|
+
import { DisplayDensityToken } from '../core/density';
|
|
19
|
+
import { IGX_COMBO_COMPONENT, IgxComboBaseDirective } from './combo.common';
|
|
24
20
|
import { IgxComboAddItemComponent } from './combo-add-item.component';
|
|
25
21
|
import { IgxComboAPIService } from './combo.api';
|
|
26
|
-
import { IgxInputState, IgxInputDirective } from '../directives/input/input.directive';
|
|
27
22
|
import { IGX_INPUT_GROUP_TYPE } from '../input-group/public_api';
|
|
28
|
-
import { caseSensitive } from '@igniteui/material-icons-extended';
|
|
29
|
-
import { SortingDirection } from '../data-operations/sorting-strategy';
|
|
30
23
|
import * as i0 from "@angular/core";
|
|
31
24
|
import * as i1 from "../core/selection";
|
|
32
25
|
import * as i2 from "./combo.api";
|
|
@@ -41,45 +34,6 @@ import * as i10 from "../drop-down/drop-down-navigation.directive";
|
|
|
41
34
|
import * as i11 from "../directives/for-of/for_of.directive";
|
|
42
35
|
import * as i12 from "../directives/button/button.directive";
|
|
43
36
|
import * as i13 from "../directives/ripple/ripple.directive";
|
|
44
|
-
/**
|
|
45
|
-
* @hidden
|
|
46
|
-
*/
|
|
47
|
-
var DataTypes;
|
|
48
|
-
(function (DataTypes) {
|
|
49
|
-
DataTypes["EMPTY"] = "empty";
|
|
50
|
-
DataTypes["PRIMITIVE"] = "primitive";
|
|
51
|
-
DataTypes["COMPLEX"] = "complex";
|
|
52
|
-
DataTypes["PRIMARYKEY"] = "valueKey";
|
|
53
|
-
})(DataTypes || (DataTypes = {}));
|
|
54
|
-
/**
|
|
55
|
-
* @hidden
|
|
56
|
-
*/
|
|
57
|
-
const ItemHeights = {
|
|
58
|
-
comfortable: 40,
|
|
59
|
-
cosy: 32,
|
|
60
|
-
compact: 28,
|
|
61
|
-
};
|
|
62
|
-
/**
|
|
63
|
-
* @hidden
|
|
64
|
-
* The default number of items that should be in the combo's
|
|
65
|
-
* drop-down list if no `[itemsMaxHeight]` is specified
|
|
66
|
-
*/
|
|
67
|
-
const itemsInContainer = 10;
|
|
68
|
-
export var IgxComboState;
|
|
69
|
-
(function (IgxComboState) {
|
|
70
|
-
/**
|
|
71
|
-
* Combo with initial state.
|
|
72
|
-
*/
|
|
73
|
-
IgxComboState[IgxComboState["INITIAL"] = 0] = "INITIAL";
|
|
74
|
-
/**
|
|
75
|
-
* Combo with valid state.
|
|
76
|
-
*/
|
|
77
|
-
IgxComboState[IgxComboState["VALID"] = 1] = "VALID";
|
|
78
|
-
/**
|
|
79
|
-
* Combo with invalid state.
|
|
80
|
-
*/
|
|
81
|
-
IgxComboState[IgxComboState["INVALID"] = 2] = "INVALID";
|
|
82
|
-
})(IgxComboState || (IgxComboState = {}));
|
|
83
37
|
/**
|
|
84
38
|
* When called with sets A & B, returns A - B (as array);
|
|
85
39
|
*
|
|
@@ -94,7 +48,6 @@ const diffInSets = (set1, set2) => {
|
|
|
94
48
|
});
|
|
95
49
|
return results;
|
|
96
50
|
};
|
|
97
|
-
let NEXT_ID = 0;
|
|
98
51
|
/**
|
|
99
52
|
* Represents a drop-down list that provides editable functionalities, allowing users to choose an option from a predefined list.
|
|
100
53
|
*
|
|
@@ -104,7 +57,7 @@ let NEXT_ID = 0;
|
|
|
104
57
|
* @igxGroup Grids & Lists
|
|
105
58
|
*
|
|
106
59
|
* @remarks
|
|
107
|
-
* It provides the ability to filter items as well as perform
|
|
60
|
+
* It provides the ability to filter items as well as perform selection with the provided data.
|
|
108
61
|
* Additionally, it exposes keyboard navigation and custom styling capabilities.
|
|
109
62
|
* @example
|
|
110
63
|
* ```html
|
|
@@ -114,315 +67,17 @@ let NEXT_ID = 0;
|
|
|
114
67
|
* </igx-combo>
|
|
115
68
|
* ```
|
|
116
69
|
*/
|
|
117
|
-
export class IgxComboComponent extends
|
|
118
|
-
constructor(elementRef, cdr,
|
|
119
|
-
super(_displayDensityOptions);
|
|
70
|
+
export class IgxComboComponent extends IgxComboBaseDirective {
|
|
71
|
+
constructor(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector) {
|
|
72
|
+
super(elementRef, cdr, selectionService, comboAPI, _iconService, _displayDensityOptions, _inputGroupType, _injector);
|
|
120
73
|
this.elementRef = elementRef;
|
|
121
74
|
this.cdr = cdr;
|
|
122
|
-
this.
|
|
75
|
+
this.selectionService = selectionService;
|
|
123
76
|
this.comboAPI = comboAPI;
|
|
124
77
|
this._iconService = _iconService;
|
|
125
78
|
this._displayDensityOptions = _displayDensityOptions;
|
|
126
79
|
this._inputGroupType = _inputGroupType;
|
|
127
80
|
this._injector = _injector;
|
|
128
|
-
/**
|
|
129
|
-
* Set custom overlay settings that control how the combo's list of items is displayed.
|
|
130
|
-
* Set:
|
|
131
|
-
* ```html
|
|
132
|
-
* <igx-combo [overlaySettings] = "customOverlaySettings"></igx-combo>
|
|
133
|
-
* ```
|
|
134
|
-
*
|
|
135
|
-
* ```typescript
|
|
136
|
-
* const customSettings = { positionStrategy: { settings: { target: myTarget } } };
|
|
137
|
-
* combo.overlaySettings = customSettings;
|
|
138
|
-
* ```
|
|
139
|
-
* Get any custom overlay settings used by the combo:
|
|
140
|
-
* ```typescript
|
|
141
|
-
* const comboOverlaySettings: OverlaySettings = myCombo.overlaySettings;
|
|
142
|
-
* ```
|
|
143
|
-
*/
|
|
144
|
-
this.overlaySettings = null;
|
|
145
|
-
/**
|
|
146
|
-
* @hidden @internal
|
|
147
|
-
*/
|
|
148
|
-
this.searchInput = null;
|
|
149
|
-
/**
|
|
150
|
-
* The custom template, if any, that should be used when rendering ITEMS in the combo list
|
|
151
|
-
*
|
|
152
|
-
* ```typescript
|
|
153
|
-
* // Set in typescript
|
|
154
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
155
|
-
* myComponent.combo.itemTemplate = myCustomTemplate;
|
|
156
|
-
* ```
|
|
157
|
-
* ```html
|
|
158
|
-
* <!-- Set in markup -->
|
|
159
|
-
* <igx-combo #combo>
|
|
160
|
-
* ...
|
|
161
|
-
* <ng-template igxComboItem>
|
|
162
|
-
* <div class="custom-item" let-item let-key="valueKey">
|
|
163
|
-
* <div class="custom-item__name">{{ item[key] }}</div>
|
|
164
|
-
* <div class="custom-item__cost">{{ item.cost }}</div>
|
|
165
|
-
* </div>
|
|
166
|
-
* </ng-template>
|
|
167
|
-
* </igx-combo>
|
|
168
|
-
* ```
|
|
169
|
-
*/
|
|
170
|
-
this.itemTemplate = null;
|
|
171
|
-
/**
|
|
172
|
-
* The custom template, if any, that should be used when rendering the HEADER for the combo items list
|
|
173
|
-
*
|
|
174
|
-
* ```typescript
|
|
175
|
-
* // Set in typescript
|
|
176
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
177
|
-
* myComponent.combo.headerTemplate = myCustomTemplate;
|
|
178
|
-
* ```
|
|
179
|
-
* ```html
|
|
180
|
-
* <!-- Set in markup -->
|
|
181
|
-
* <igx-combo #combo>
|
|
182
|
-
* ...
|
|
183
|
-
* <ng-template igxComboHeader>
|
|
184
|
-
* <div class="combo__header">
|
|
185
|
-
* This is a custom header
|
|
186
|
-
* </div>
|
|
187
|
-
* </ng-template>
|
|
188
|
-
* </igx-combo>
|
|
189
|
-
* ```
|
|
190
|
-
*/
|
|
191
|
-
this.headerTemplate = null;
|
|
192
|
-
/**
|
|
193
|
-
* The custom template, if any, that should be used when rendering the FOOTER for the combo items list
|
|
194
|
-
*
|
|
195
|
-
* ```typescript
|
|
196
|
-
* // Set in typescript
|
|
197
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
198
|
-
* myComponent.combo.footerTemplate = myCustomTemplate;
|
|
199
|
-
* ```
|
|
200
|
-
* ```html
|
|
201
|
-
* <!-- Set in markup -->
|
|
202
|
-
* <igx-combo #combo>
|
|
203
|
-
* ...
|
|
204
|
-
* <ng-template igxComboFooter>
|
|
205
|
-
* <div class="combo__footer">
|
|
206
|
-
* This is a custom footer
|
|
207
|
-
* </div>
|
|
208
|
-
* </ng-template>
|
|
209
|
-
* </igx-combo>
|
|
210
|
-
* ```
|
|
211
|
-
*/
|
|
212
|
-
this.footerTemplate = null;
|
|
213
|
-
/**
|
|
214
|
-
* The custom template, if any, that should be used when rendering HEADER ITEMS for groups in the combo list
|
|
215
|
-
*
|
|
216
|
-
* ```typescript
|
|
217
|
-
* // Set in typescript
|
|
218
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
219
|
-
* myComponent.combo.headerItemTemplate = myCustomTemplate;
|
|
220
|
-
* ```
|
|
221
|
-
* ```html
|
|
222
|
-
* <!-- Set in markup -->
|
|
223
|
-
* <igx-combo #combo>
|
|
224
|
-
* ...
|
|
225
|
-
* <ng-template igxComboHeaderItem let-item let-key="groupKey">
|
|
226
|
-
* <div class="custom-item--group">Group header for {{ item[key] }}</div>
|
|
227
|
-
* </ng-template>
|
|
228
|
-
* </igx-combo>
|
|
229
|
-
* ```
|
|
230
|
-
*/
|
|
231
|
-
this.headerItemTemplate = null;
|
|
232
|
-
/**
|
|
233
|
-
* The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
|
|
234
|
-
*
|
|
235
|
-
* ```typescript
|
|
236
|
-
* // Set in typescript
|
|
237
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
238
|
-
* myComponent.combo.addItemTemplate = myCustomTemplate;
|
|
239
|
-
* ```
|
|
240
|
-
* ```html
|
|
241
|
-
* <!-- Set in markup -->
|
|
242
|
-
* <igx-combo #combo>
|
|
243
|
-
* ...
|
|
244
|
-
* <ng-template igxComboAddItem>
|
|
245
|
-
* <button class="combo__add-button">
|
|
246
|
-
* Click to add item
|
|
247
|
-
* </button>
|
|
248
|
-
* </ng-template>
|
|
249
|
-
* </igx-combo>
|
|
250
|
-
* ```
|
|
251
|
-
*/
|
|
252
|
-
this.addItemTemplate = null;
|
|
253
|
-
/**
|
|
254
|
-
* The custom template, if any, that should be used when rendering the ADD BUTTON in the combo drop down
|
|
255
|
-
*
|
|
256
|
-
* ```typescript
|
|
257
|
-
* // Set in typescript
|
|
258
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
259
|
-
* myComponent.combo.emptyTemplate = myCustomTemplate;
|
|
260
|
-
* ```
|
|
261
|
-
* ```html
|
|
262
|
-
* <!-- Set in markup -->
|
|
263
|
-
* <igx-combo #combo>
|
|
264
|
-
* ...
|
|
265
|
-
* <ng-template igxComboEmpty>
|
|
266
|
-
* <div class="combo--empty">
|
|
267
|
-
* There are no items to display
|
|
268
|
-
* </div>
|
|
269
|
-
* </ng-template>
|
|
270
|
-
* </igx-combo>
|
|
271
|
-
* ```
|
|
272
|
-
*/
|
|
273
|
-
this.emptyTemplate = null;
|
|
274
|
-
/**
|
|
275
|
-
* The custom template, if any, that should be used when rendering the combo TOGGLE(open/close) button
|
|
276
|
-
*
|
|
277
|
-
* ```typescript
|
|
278
|
-
* // Set in typescript
|
|
279
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
280
|
-
* myComponent.combo.toggleIconTemplate = myCustomTemplate;
|
|
281
|
-
* ```
|
|
282
|
-
* ```html
|
|
283
|
-
* <!-- Set in markup -->
|
|
284
|
-
* <igx-combo #combo>
|
|
285
|
-
* ...
|
|
286
|
-
* <ng-template igxComboToggleIcon let-collapsed>
|
|
287
|
-
* <igx-icon>{{ collapsed ? 'remove_circle' : 'remove_circle_outline'}}</igx-icon>
|
|
288
|
-
* </ng-template>
|
|
289
|
-
* </igx-combo>
|
|
290
|
-
* ```
|
|
291
|
-
*/
|
|
292
|
-
this.toggleIconTemplate = null;
|
|
293
|
-
/**
|
|
294
|
-
* The custom template, if any, that should be used when rendering the combo CLEAR button
|
|
295
|
-
*
|
|
296
|
-
* ```typescript
|
|
297
|
-
* // Set in typescript
|
|
298
|
-
* const myCustomTemplate: TemplateRef<any> = myComponent.customTemplate;
|
|
299
|
-
* myComponent.combo.clearIconTemplate = myCustomTemplate;
|
|
300
|
-
* ```
|
|
301
|
-
* ```html
|
|
302
|
-
* <!-- Set in markup -->
|
|
303
|
-
* <igx-combo #combo>
|
|
304
|
-
* ...
|
|
305
|
-
* <ng-template igxComboClearIcon>
|
|
306
|
-
* <igx-icon>clear</igx-icon>
|
|
307
|
-
* </ng-template>
|
|
308
|
-
* </igx-combo>
|
|
309
|
-
* ```
|
|
310
|
-
*/
|
|
311
|
-
this.clearIconTemplate = null;
|
|
312
|
-
/**
|
|
313
|
-
* Emitted when item selection is changing, before the selection completes
|
|
314
|
-
*
|
|
315
|
-
* ```html
|
|
316
|
-
* <igx-combo (selectionChanging)='handleSelection()'></igx-combo>
|
|
317
|
-
* ```
|
|
318
|
-
*/
|
|
319
|
-
this.selectionChanging = new EventEmitter();
|
|
320
|
-
/**
|
|
321
|
-
* Emitted before the dropdown is opened
|
|
322
|
-
*
|
|
323
|
-
* ```html
|
|
324
|
-
* <igx-combo opening='handleOpening($event)'></igx-combo>
|
|
325
|
-
* ```
|
|
326
|
-
*/
|
|
327
|
-
this.opening = new EventEmitter();
|
|
328
|
-
/**
|
|
329
|
-
* Emitted after the dropdown is opened
|
|
330
|
-
*
|
|
331
|
-
* ```html
|
|
332
|
-
* <igx-combo (opened)='handleOpened($event)'></igx-combo>
|
|
333
|
-
* ```
|
|
334
|
-
*/
|
|
335
|
-
this.opened = new EventEmitter();
|
|
336
|
-
/**
|
|
337
|
-
* Emitted before the dropdown is closed
|
|
338
|
-
*
|
|
339
|
-
* ```html
|
|
340
|
-
* <igx-combo (closing)='handleClosing($event)'></igx-combo>
|
|
341
|
-
* ```
|
|
342
|
-
*/
|
|
343
|
-
this.closing = new EventEmitter();
|
|
344
|
-
/**
|
|
345
|
-
* Emitted after the dropdown is closed
|
|
346
|
-
*
|
|
347
|
-
* ```html
|
|
348
|
-
* <igx-combo (closed)='handleClosed($event)'></igx-combo>
|
|
349
|
-
* ```
|
|
350
|
-
*/
|
|
351
|
-
this.closed = new EventEmitter();
|
|
352
|
-
/**
|
|
353
|
-
* Emitted when an item is being added to the data collection
|
|
354
|
-
*
|
|
355
|
-
* ```html
|
|
356
|
-
* <igx-combo (addition)='handleAdditionEvent($event)'></igx-combo>
|
|
357
|
-
* ```
|
|
358
|
-
*/
|
|
359
|
-
this.addition = new EventEmitter();
|
|
360
|
-
/**
|
|
361
|
-
* Emitted when the value of the search input changes (e.g. typing, pasting, clear, etc.)
|
|
362
|
-
*
|
|
363
|
-
* ```html
|
|
364
|
-
* <igx-combo (searchInputUpdate)='handleSearchInputEvent($event)'></igx-combo>
|
|
365
|
-
* ```
|
|
366
|
-
*/
|
|
367
|
-
this.searchInputUpdate = new EventEmitter();
|
|
368
|
-
/**
|
|
369
|
-
* Emitted when new chunk of data is loaded from the virtualization
|
|
370
|
-
*
|
|
371
|
-
* ```html
|
|
372
|
-
* <igx-combo (dataPreLoad)='handleDataPreloadEvent($event)'></igx-combo>
|
|
373
|
-
* ```
|
|
374
|
-
*/
|
|
375
|
-
this.dataPreLoad = new EventEmitter();
|
|
376
|
-
/**
|
|
377
|
-
* Gets/gets combo id.
|
|
378
|
-
*
|
|
379
|
-
* ```typescript
|
|
380
|
-
* // get
|
|
381
|
-
* let id = this.combo.id;
|
|
382
|
-
* ```
|
|
383
|
-
*
|
|
384
|
-
* ```html
|
|
385
|
-
* <!--set-->
|
|
386
|
-
* <igx-combo [id]='combo1'></igx-combo>
|
|
387
|
-
* ```
|
|
388
|
-
*/
|
|
389
|
-
this.id = `igx-combo-${NEXT_ID++}`;
|
|
390
|
-
/**
|
|
391
|
-
* @hidden @internal
|
|
392
|
-
*/
|
|
393
|
-
this.cssClass = 'igx-combo'; // Independent of display density, at the time being
|
|
394
|
-
/**
|
|
395
|
-
* @hidden @internal
|
|
396
|
-
*/
|
|
397
|
-
this.role = 'combobox';
|
|
398
|
-
/**
|
|
399
|
-
* Controls whether custom values can be added to the collection
|
|
400
|
-
*
|
|
401
|
-
* ```typescript
|
|
402
|
-
* // get
|
|
403
|
-
* let comboAllowsCustomValues = this.combo.allowCustomValues;
|
|
404
|
-
* ```
|
|
405
|
-
*
|
|
406
|
-
* ```html
|
|
407
|
-
* <!--set-->
|
|
408
|
-
* <igx-combo [allowCustomValues]='true'></igx-combo>
|
|
409
|
-
* ```
|
|
410
|
-
*/
|
|
411
|
-
this.allowCustomValues = false;
|
|
412
|
-
/**
|
|
413
|
-
* Defines the placeholder value for the combo dropdown search field
|
|
414
|
-
*
|
|
415
|
-
* ```typescript
|
|
416
|
-
* // get
|
|
417
|
-
* let myComboSearchPlaceholder = this.combo.searchPlaceholder;
|
|
418
|
-
* ```
|
|
419
|
-
*
|
|
420
|
-
* ```html
|
|
421
|
-
* <!--set-->
|
|
422
|
-
* <igx-combo [searchPlaceholder]='newPlaceHolder'></igx-combo>
|
|
423
|
-
* ```
|
|
424
|
-
*/
|
|
425
|
-
this.searchPlaceholder = 'Enter a Search Term';
|
|
426
81
|
/**
|
|
427
82
|
* Defines whether the caseSensitive icon should be shown in the search input
|
|
428
83
|
*
|
|
@@ -438,19 +93,11 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
438
93
|
*/
|
|
439
94
|
this.showSearchCaseIcon = false;
|
|
440
95
|
/**
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
444
|
-
* // get
|
|
445
|
-
* let myComboValueKey = this.combo.valueKey;
|
|
446
|
-
* ```
|
|
447
|
-
*
|
|
448
|
-
* ```html
|
|
449
|
-
* <!--set-->
|
|
450
|
-
* <igx-combo [valueKey]='myKey'></igx-combo>
|
|
451
|
-
* ```
|
|
96
|
+
* An @Input property that controls whether the combo's search box
|
|
97
|
+
* should be focused after the `opened` event is called
|
|
98
|
+
* When `false`, the combo's list item container will be focused instead
|
|
452
99
|
*/
|
|
453
|
-
this.
|
|
100
|
+
this.autoFocusSearch = true;
|
|
454
101
|
/**
|
|
455
102
|
* An @Input property that enabled/disables filtering in the list. The default is `true`.
|
|
456
103
|
* ```html
|
|
@@ -459,362 +106,52 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
459
106
|
*/
|
|
460
107
|
this.filterable = true;
|
|
461
108
|
/**
|
|
462
|
-
*
|
|
463
|
-
*
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
*
|
|
470
|
-
*
|
|
471
|
-
*
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
this.
|
|
475
|
-
/**
|
|
476
|
-
* @hidden @internal
|
|
477
|
-
*/
|
|
478
|
-
this.
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
this.
|
|
483
|
-
/**
|
|
484
|
-
* @hidden @internal
|
|
485
|
-
*/
|
|
486
|
-
this.filteringOptions = {
|
|
487
|
-
caseSensitive: false
|
|
488
|
-
};
|
|
489
|
-
/**
|
|
490
|
-
* @hidden @internal
|
|
491
|
-
*/
|
|
492
|
-
this.filteringLogic = FilteringLogic.Or;
|
|
493
|
-
/** @hidden @internal */
|
|
494
|
-
this.filterValue = '';
|
|
495
|
-
this.stringFilters = IgxStringFilteringOperand;
|
|
496
|
-
this.booleanFilters = IgxBooleanFilteringOperand;
|
|
497
|
-
this._groupKey = '';
|
|
498
|
-
this._prevInputValue = '';
|
|
499
|
-
this._dataType = '';
|
|
500
|
-
this._searchValue = '';
|
|
501
|
-
this._type = null;
|
|
502
|
-
this.ngControl = null;
|
|
503
|
-
this.destroy$ = new Subject();
|
|
504
|
-
this._data = [];
|
|
505
|
-
this._filteredData = [];
|
|
506
|
-
this._itemHeight = null;
|
|
507
|
-
this._itemsMaxHeight = null;
|
|
508
|
-
this._remoteSelection = {};
|
|
509
|
-
this._onChangeCallback = noop;
|
|
510
|
-
this._onTouchedCallback = noop;
|
|
511
|
-
this._value = '';
|
|
512
|
-
this._valid = IgxComboState.INITIAL;
|
|
513
|
-
this._groupSortingDirection = SortingDirection.Asc;
|
|
514
|
-
this.onStatusChanged = () => {
|
|
515
|
-
if ((this.ngControl.control.touched || this.ngControl.control.dirty) &&
|
|
516
|
-
(this.ngControl.control.validator || this.ngControl.control.asyncValidator)) {
|
|
517
|
-
if (!this.collapsed || this.inputGroup.isFocused) {
|
|
518
|
-
this.valid = this.ngControl.invalid ? IgxComboState.INVALID : IgxComboState.VALID;
|
|
519
|
-
}
|
|
520
|
-
else {
|
|
521
|
-
this.valid = this.ngControl.invalid ? IgxComboState.INVALID : IgxComboState.INITIAL;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
else {
|
|
525
|
-
// B.P. 18 May 2021: IgxDatePicker does not reset its state upon resetForm #9526
|
|
526
|
-
this.valid = IgxComboState.INITIAL;
|
|
527
|
-
}
|
|
528
|
-
this.manageRequiredAsterisk();
|
|
529
|
-
};
|
|
530
|
-
this.comboAPI.register(this);
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* @hidden @internal
|
|
534
|
-
*/
|
|
535
|
-
get displaySearchInput() {
|
|
536
|
-
return this.filterable || this.allowCustomValues;
|
|
537
|
-
}
|
|
538
|
-
/**
|
|
539
|
-
* @hidden @internal
|
|
540
|
-
*/
|
|
541
|
-
get ariaExpanded() {
|
|
542
|
-
return !this.dropdown.collapsed;
|
|
543
|
-
}
|
|
544
|
-
/**
|
|
545
|
-
* @hidden @internal
|
|
546
|
-
*/
|
|
547
|
-
get hasPopUp() {
|
|
548
|
-
return 'listbox';
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* @hidden @internal
|
|
552
|
-
*/
|
|
553
|
-
get ariaOwns() {
|
|
554
|
-
return this.dropdown.id;
|
|
555
|
-
}
|
|
556
|
-
/**
|
|
557
|
-
* Configures the drop down list height
|
|
558
|
-
*
|
|
559
|
-
* ```typescript
|
|
560
|
-
* // get
|
|
561
|
-
* let myComboItemsMaxHeight = this.combo.itemsMaxHeight;
|
|
562
|
-
* ```
|
|
563
|
-
*
|
|
564
|
-
* ```html
|
|
565
|
-
* <!--set-->
|
|
566
|
-
* <igx-combo [itemsMaxHeight]='320'></igx-combo>
|
|
567
|
-
* ```
|
|
568
|
-
*/
|
|
569
|
-
get itemsMaxHeight() {
|
|
570
|
-
if (this._itemsMaxHeight === null || this._itemsMaxHeight === undefined) {
|
|
571
|
-
return this.itemHeight * itemsInContainer;
|
|
572
|
-
}
|
|
573
|
-
return this._itemsMaxHeight;
|
|
574
|
-
}
|
|
575
|
-
set itemsMaxHeight(val) {
|
|
576
|
-
this._itemsMaxHeight = val;
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* Configures the drop down list item height
|
|
580
|
-
*
|
|
581
|
-
* ```typescript
|
|
582
|
-
* // get
|
|
583
|
-
* let myComboItemHeight = this.combo.itemHeight;
|
|
584
|
-
* ```
|
|
585
|
-
*
|
|
586
|
-
* ```html
|
|
587
|
-
* <!--set-->
|
|
588
|
-
* <igx-combo [itemHeight]='32'></igx-combo>
|
|
589
|
-
* ```
|
|
590
|
-
*/
|
|
591
|
-
get itemHeight() {
|
|
592
|
-
if (this._itemHeight === null || this._itemHeight === undefined) {
|
|
593
|
-
return ItemHeights[this.displayDensity];
|
|
594
|
-
}
|
|
595
|
-
return this._itemHeight;
|
|
596
|
-
}
|
|
597
|
-
set itemHeight(val) {
|
|
598
|
-
this._itemHeight = val;
|
|
599
|
-
}
|
|
600
|
-
/**
|
|
601
|
-
* @hidden @internal
|
|
602
|
-
*/
|
|
603
|
-
get inputEmpty() {
|
|
604
|
-
return !this.value && !this.placeholder;
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Combo data source.
|
|
608
|
-
*
|
|
609
|
-
* ```html
|
|
610
|
-
* <!--set-->
|
|
611
|
-
* <igx-combo [data]='items'></igx-combo>
|
|
612
|
-
* ```
|
|
613
|
-
*/
|
|
614
|
-
get data() {
|
|
615
|
-
return this._data;
|
|
616
|
-
}
|
|
617
|
-
set data(val) {
|
|
618
|
-
this._data = (val) ? val : [];
|
|
619
|
-
}
|
|
620
|
-
set displayKey(val) {
|
|
621
|
-
this._displayKey = val;
|
|
622
|
-
}
|
|
623
|
-
/**
|
|
624
|
-
* Combo text data source property.
|
|
625
|
-
*
|
|
626
|
-
* ```typescript
|
|
627
|
-
* // get
|
|
628
|
-
* let myComboDisplayKey = this.combo.displayKey;
|
|
629
|
-
*
|
|
630
|
-
* // set
|
|
631
|
-
* this.combo.displayKey = 'val';
|
|
632
|
-
*
|
|
633
|
-
* ```
|
|
634
|
-
*
|
|
635
|
-
* ```html
|
|
636
|
-
* <!--set-->
|
|
637
|
-
* <igx-combo [displayKey]='myDisplayKey'></igx-combo>
|
|
638
|
-
* ```
|
|
639
|
-
*/
|
|
640
|
-
get displayKey() {
|
|
641
|
-
return this._displayKey ? this._displayKey : this.valueKey;
|
|
642
|
-
}
|
|
643
|
-
/**
|
|
644
|
-
* The item property by which items should be grouped inside the items list. Not usable if data is not of type Object[].
|
|
645
|
-
*
|
|
646
|
-
* ```html
|
|
647
|
-
* <!--set-->
|
|
648
|
-
* <igx-combo [groupKey]='newGroupKey'></igx-combo>
|
|
649
|
-
* ```
|
|
650
|
-
*/
|
|
651
|
-
set groupKey(val) {
|
|
652
|
-
this._groupKey = val;
|
|
653
|
-
}
|
|
654
|
-
/**
|
|
655
|
-
* The item property by which items should be grouped inside the items list. Not usable if data is not of type Object[].
|
|
656
|
-
*
|
|
657
|
-
* ```typescript
|
|
658
|
-
* // get
|
|
659
|
-
* let currentGroupKey = this.combo.groupKey;
|
|
660
|
-
* ```
|
|
661
|
-
*/
|
|
662
|
-
get groupKey() {
|
|
663
|
-
return this._groupKey;
|
|
664
|
-
}
|
|
665
|
-
/**
|
|
666
|
-
* An @Input property that sets groups sorting order.
|
|
667
|
-
*
|
|
668
|
-
* @example
|
|
669
|
-
* ```html
|
|
670
|
-
* <igx-combo [groupSortingDirection]="groupSortingDirection"></igx-combo>
|
|
671
|
-
* ```
|
|
672
|
-
* ```typescript
|
|
673
|
-
* public groupSortingDirection = SortingDirection.Asc;
|
|
674
|
-
* ```
|
|
675
|
-
*/
|
|
676
|
-
get groupSortingDirection() {
|
|
677
|
-
return this._groupSortingDirection;
|
|
678
|
-
}
|
|
679
|
-
set groupSortingDirection(val) {
|
|
680
|
-
this._groupSortingDirection = val;
|
|
681
|
-
}
|
|
682
|
-
/**
|
|
683
|
-
* An @Input property that sets how the combo will be styled.
|
|
684
|
-
* The allowed values are `line`, `box`, `border` and `search`. The default is `box`.
|
|
685
|
-
* ```html
|
|
686
|
-
* <igx-combo [type]="'line'">
|
|
687
|
-
* ```
|
|
688
|
-
*/
|
|
689
|
-
get type() {
|
|
690
|
-
return this._type || this._inputGroupType || 'box';
|
|
691
|
-
}
|
|
692
|
-
set type(val) {
|
|
693
|
-
this._type = val;
|
|
694
|
-
}
|
|
695
|
-
/**
|
|
696
|
-
* Gets if control is valid, when used in a form
|
|
697
|
-
*
|
|
698
|
-
* ```typescript
|
|
699
|
-
* // get
|
|
700
|
-
* let valid = this.combo.valid;
|
|
701
|
-
* ```
|
|
702
|
-
*/
|
|
703
|
-
get valid() {
|
|
704
|
-
return this._valid;
|
|
705
|
-
}
|
|
706
|
-
/**
|
|
707
|
-
* Sets if control is valid, when used in a form
|
|
708
|
-
*
|
|
709
|
-
* ```typescript
|
|
710
|
-
* // set
|
|
711
|
-
* this.combo.valid = IgxComboState.INVALID;
|
|
712
|
-
* ```
|
|
713
|
-
*/
|
|
714
|
-
set valid(valid) {
|
|
715
|
-
this._valid = valid;
|
|
716
|
-
this.comboInput.valid = IgxInputState[IgxComboState[valid]];
|
|
717
|
-
}
|
|
718
|
-
/**
|
|
719
|
-
* @hidden @internal
|
|
720
|
-
*/
|
|
721
|
-
get searchValue() {
|
|
722
|
-
return this._searchValue;
|
|
723
|
-
}
|
|
724
|
-
set searchValue(val) {
|
|
725
|
-
this.filterValue = val;
|
|
726
|
-
this._searchValue = val;
|
|
727
|
-
}
|
|
728
|
-
/**
|
|
729
|
-
* @hidden @internal
|
|
730
|
-
*/
|
|
731
|
-
onArrowDown(event) {
|
|
732
|
-
event.preventDefault();
|
|
733
|
-
event.stopPropagation();
|
|
734
|
-
this.open();
|
|
735
|
-
}
|
|
736
|
-
/**
|
|
737
|
-
* @hidden @internal
|
|
738
|
-
*/
|
|
739
|
-
onInputClick(event) {
|
|
740
|
-
event.stopPropagation();
|
|
741
|
-
event.preventDefault();
|
|
742
|
-
if (!this.disabled) {
|
|
743
|
-
this.toggle();
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
/**
|
|
747
|
-
* Defines the current state of the virtualized data. It contains `startIndex` and `chunkSize`
|
|
748
|
-
*
|
|
749
|
-
* ```typescript
|
|
750
|
-
* // get
|
|
751
|
-
* let state = this.combo.virtualizationState;
|
|
752
|
-
* ```
|
|
753
|
-
*/
|
|
754
|
-
get virtualizationState() {
|
|
755
|
-
return this.virtDir.state;
|
|
756
|
-
}
|
|
757
|
-
/**
|
|
758
|
-
* Sets the current state of the virtualized data.
|
|
759
|
-
*
|
|
760
|
-
* ```typescript
|
|
761
|
-
* // set
|
|
762
|
-
* this.combo.virtualizationState(state);
|
|
763
|
-
* ```
|
|
764
|
-
*/
|
|
765
|
-
set virtualizationState(state) {
|
|
766
|
-
this.virtDir.state = state;
|
|
767
|
-
}
|
|
768
|
-
/**
|
|
769
|
-
* Gets total count of the virtual data items, when using remote service.
|
|
770
|
-
*
|
|
771
|
-
* ```typescript
|
|
772
|
-
* // get
|
|
773
|
-
* let count = this.combo.totalItemCount;
|
|
774
|
-
* ```
|
|
775
|
-
*/
|
|
776
|
-
get totalItemCount() {
|
|
777
|
-
return this.virtDir.totalItemCount;
|
|
778
|
-
}
|
|
779
|
-
/**
|
|
780
|
-
* Sets total count of the virtual data items, when using remote service.
|
|
781
|
-
*
|
|
782
|
-
* ```typescript
|
|
783
|
-
* // set
|
|
784
|
-
* this.combo.totalItemCount(remoteService.count);
|
|
785
|
-
* ```
|
|
786
|
-
*/
|
|
787
|
-
set totalItemCount(count) {
|
|
788
|
-
this.virtDir.totalItemCount = count;
|
|
789
|
-
}
|
|
790
|
-
/**
|
|
791
|
-
* The text displayed in the combo input
|
|
792
|
-
*
|
|
793
|
-
* ```typescript
|
|
794
|
-
* // get
|
|
795
|
-
* let comboValue = this.combo.value;
|
|
796
|
-
* ```
|
|
797
|
-
*/
|
|
798
|
-
get value() {
|
|
799
|
-
return this._value;
|
|
109
|
+
* Defines the placeholder value for the combo dropdown search field
|
|
110
|
+
*
|
|
111
|
+
* ```typescript
|
|
112
|
+
* // get
|
|
113
|
+
* let myComboSearchPlaceholder = this.combo.searchPlaceholder;
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* ```html
|
|
117
|
+
* <!--set-->
|
|
118
|
+
* <igx-combo [searchPlaceholder]='newPlaceHolder'></igx-combo>
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
this.searchPlaceholder = 'Enter a Search Term';
|
|
122
|
+
/**
|
|
123
|
+
* @hidden @internal
|
|
124
|
+
*/
|
|
125
|
+
this.filteringLogic = FilteringLogic.Or;
|
|
126
|
+
this.stringFilters = IgxStringFilteringOperand;
|
|
127
|
+
this.booleanFilters = IgxBooleanFilteringOperand;
|
|
128
|
+
this._prevInputValue = '';
|
|
129
|
+
this.comboAPI.register(this);
|
|
800
130
|
}
|
|
801
131
|
/**
|
|
802
132
|
* @hidden @internal
|
|
803
133
|
*/
|
|
134
|
+
get inputEmpty() {
|
|
135
|
+
return !this.value && !this.placeholder;
|
|
136
|
+
}
|
|
137
|
+
/** @hidden @internal */
|
|
804
138
|
get filteredData() {
|
|
805
139
|
return this.filterable ? this._filteredData : this.data;
|
|
806
140
|
}
|
|
807
|
-
/**
|
|
808
|
-
* @hidden @internal
|
|
809
|
-
*/
|
|
141
|
+
/** @hidden @internal */
|
|
810
142
|
set filteredData(val) {
|
|
811
143
|
this._filteredData = this.groupKey ? (val || []).filter((e) => e.isHeader !== true) : val;
|
|
812
144
|
this.checkMatch();
|
|
813
145
|
}
|
|
146
|
+
/** @hidden @internal */
|
|
147
|
+
get displaySearchInput() {
|
|
148
|
+
return this.filterable || this.allowCustomValues;
|
|
149
|
+
}
|
|
814
150
|
/**
|
|
815
151
|
* @hidden @internal
|
|
816
152
|
*/
|
|
817
153
|
handleKeyUp(event) {
|
|
154
|
+
// TODO: use PlatformUtil for keyboard navigation
|
|
818
155
|
if (event.key === 'ArrowDown' || event.key === 'Down') {
|
|
819
156
|
this.dropdown.focusedItem = this.dropdown.items[0];
|
|
820
157
|
this.dropdownContainer.nativeElement.focus();
|
|
@@ -823,72 +160,6 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
823
160
|
this.toggle();
|
|
824
161
|
}
|
|
825
162
|
}
|
|
826
|
-
/**
|
|
827
|
-
* @hidden @internal
|
|
828
|
-
*/
|
|
829
|
-
handleKeyDown(event) {
|
|
830
|
-
if (event.key === 'ArrowUp' || event.key === 'Up') {
|
|
831
|
-
event.preventDefault();
|
|
832
|
-
event.stopPropagation();
|
|
833
|
-
this.close();
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
/**
|
|
837
|
-
* @hidden @internal
|
|
838
|
-
*/
|
|
839
|
-
handleInputChange(event) {
|
|
840
|
-
if (event !== undefined) {
|
|
841
|
-
const args = {
|
|
842
|
-
searchText: event,
|
|
843
|
-
owner: this,
|
|
844
|
-
cancel: false
|
|
845
|
-
};
|
|
846
|
-
this.searchInputUpdate.emit(args);
|
|
847
|
-
if (args.cancel) {
|
|
848
|
-
this.filterValue = null;
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
this.checkMatch();
|
|
852
|
-
}
|
|
853
|
-
/**
|
|
854
|
-
* @hidden @internal
|
|
855
|
-
*/
|
|
856
|
-
get dataType() {
|
|
857
|
-
if (this.displayKey) {
|
|
858
|
-
return DataTypes.COMPLEX;
|
|
859
|
-
}
|
|
860
|
-
return DataTypes.PRIMITIVE;
|
|
861
|
-
}
|
|
862
|
-
/**
|
|
863
|
-
* @hidden @internal
|
|
864
|
-
*/
|
|
865
|
-
get isRemote() {
|
|
866
|
-
return this.totalItemCount > 0 &&
|
|
867
|
-
this.valueKey &&
|
|
868
|
-
this.dataType === DataTypes.COMPLEX;
|
|
869
|
-
}
|
|
870
|
-
/**
|
|
871
|
-
* Returns if the specified itemID is selected
|
|
872
|
-
*
|
|
873
|
-
* @hidden
|
|
874
|
-
* @internal
|
|
875
|
-
*/
|
|
876
|
-
isItemSelected(item) {
|
|
877
|
-
return this.selection.is_item_selected(this.id, item);
|
|
878
|
-
}
|
|
879
|
-
/**
|
|
880
|
-
* Triggers change detection on the combo view
|
|
881
|
-
*/
|
|
882
|
-
triggerCheck() {
|
|
883
|
-
this.cdr.detectChanges();
|
|
884
|
-
}
|
|
885
|
-
/**
|
|
886
|
-
* @hidden @internal
|
|
887
|
-
*/
|
|
888
|
-
isAddButtonVisible() {
|
|
889
|
-
// This should always return a boolean value. If this.searchValue was '', it returns '' instead of false;
|
|
890
|
-
return this.searchValue !== '' && this.customValueFlag;
|
|
891
|
-
}
|
|
892
163
|
/**
|
|
893
164
|
* @hidden @internal
|
|
894
165
|
*/
|
|
@@ -900,140 +171,15 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
900
171
|
this.deselectAllItems();
|
|
901
172
|
}
|
|
902
173
|
}
|
|
903
|
-
/**
|
|
904
|
-
* @hidden @internal
|
|
905
|
-
*/
|
|
906
|
-
addItemToCollection() {
|
|
907
|
-
if (!this.searchValue) {
|
|
908
|
-
return;
|
|
909
|
-
}
|
|
910
|
-
const newValue = this.searchValue.trim();
|
|
911
|
-
const addedItem = this.displayKey ? {
|
|
912
|
-
[this.valueKey]: newValue,
|
|
913
|
-
[this.displayKey]: newValue
|
|
914
|
-
} : newValue;
|
|
915
|
-
if (this.groupKey) {
|
|
916
|
-
Object.assign(addedItem, { [this.groupKey]: this.defaultFallbackGroup });
|
|
917
|
-
}
|
|
918
|
-
// expose shallow copy instead of this.data in event args so this.data can't be mutated
|
|
919
|
-
const oldCollection = [...this.data];
|
|
920
|
-
const newCollection = [...this.data, addedItem];
|
|
921
|
-
const args = {
|
|
922
|
-
oldCollection, addedItem, newCollection, owner: this, cancel: false
|
|
923
|
-
};
|
|
924
|
-
this.addition.emit(args);
|
|
925
|
-
if (args.cancel) {
|
|
926
|
-
return;
|
|
927
|
-
}
|
|
928
|
-
this.data.push(args.addedItem);
|
|
929
|
-
// trigger re-render
|
|
930
|
-
this.data = cloneArray(this.data);
|
|
931
|
-
this.selectItems(this.valueKey !== null && this.valueKey !== undefined ?
|
|
932
|
-
[args.addedItem[this.valueKey]] : [args.addedItem], false);
|
|
933
|
-
this.customValueFlag = false;
|
|
934
|
-
this.searchInput.nativeElement.focus();
|
|
935
|
-
this.dropdown.focusedItem = null;
|
|
936
|
-
this.virtDir.scrollTo(0);
|
|
937
|
-
}
|
|
938
|
-
/**
|
|
939
|
-
* @hidden @internal
|
|
940
|
-
*/
|
|
941
|
-
focusSearchInput(opening) {
|
|
942
|
-
if (this.displaySearchInput && this.searchInput) {
|
|
943
|
-
this.searchInput.nativeElement.focus();
|
|
944
|
-
}
|
|
945
|
-
else {
|
|
946
|
-
if (opening) {
|
|
947
|
-
this.dropdownContainer.nativeElement.focus();
|
|
948
|
-
}
|
|
949
|
-
else {
|
|
950
|
-
this.comboInput.nativeElement.focus();
|
|
951
|
-
this.toggle();
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
/**
|
|
956
|
-
* @hidden @internal
|
|
957
|
-
*/
|
|
958
|
-
onBlur() {
|
|
959
|
-
if (this.collapsed) {
|
|
960
|
-
this._onTouchedCallback();
|
|
961
|
-
if (this.ngControl && this.ngControl.invalid) {
|
|
962
|
-
this.valid = IgxComboState.INVALID;
|
|
963
|
-
}
|
|
964
|
-
else {
|
|
965
|
-
this.valid = IgxComboState.INITIAL;
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
}
|
|
969
|
-
/**
|
|
970
|
-
* @hidden @internal
|
|
971
|
-
*/
|
|
972
|
-
ngOnInit() {
|
|
973
|
-
this.ngControl = this._injector.get(NgControl, null);
|
|
974
|
-
const targetElement = this.elementRef.nativeElement;
|
|
975
|
-
this._overlaySettings = {
|
|
976
|
-
target: targetElement,
|
|
977
|
-
scrollStrategy: new AbsoluteScrollStrategy(),
|
|
978
|
-
positionStrategy: new AutoPositionStrategy(),
|
|
979
|
-
modal: false,
|
|
980
|
-
closeOnOutsideClick: true,
|
|
981
|
-
excludeFromOutsideClick: [targetElement]
|
|
982
|
-
};
|
|
983
|
-
this.selection.set(this.id, new Set());
|
|
984
|
-
this._iconService.addSvgIconFromText(caseSensitive.name, caseSensitive.value, 'imx-icons');
|
|
985
|
-
}
|
|
986
|
-
/**
|
|
987
|
-
* @hidden @internal
|
|
988
|
-
*/
|
|
989
|
-
ngAfterViewInit() {
|
|
990
|
-
this.filteredData = [...this.data];
|
|
991
|
-
if (this.ngControl) {
|
|
992
|
-
this.ngControl.statusChanges.pipe(takeUntil(this.destroy$)).subscribe(this.onStatusChanged);
|
|
993
|
-
this.manageRequiredAsterisk();
|
|
994
|
-
this.cdr.detectChanges();
|
|
995
|
-
}
|
|
996
|
-
this.virtDir.chunkPreload.pipe(takeUntil(this.destroy$)).subscribe((e) => {
|
|
997
|
-
const eventArgs = Object.assign({}, e, { owner: this });
|
|
998
|
-
this.dataPreLoad.emit(eventArgs);
|
|
999
|
-
});
|
|
1000
|
-
}
|
|
1001
|
-
/**
|
|
1002
|
-
* @hidden @internal
|
|
1003
|
-
*/
|
|
1004
|
-
ngOnDestroy() {
|
|
1005
|
-
this.destroy$.next();
|
|
1006
|
-
this.destroy$.complete();
|
|
1007
|
-
this.comboAPI.clear();
|
|
1008
|
-
this.selection.clear(this.id);
|
|
1009
|
-
}
|
|
1010
174
|
/**
|
|
1011
175
|
* @hidden @internal
|
|
1012
176
|
*/
|
|
1013
177
|
writeValue(value) {
|
|
1014
178
|
const selection = Array.isArray(value) ? value : [];
|
|
1015
|
-
const oldSelection = this.
|
|
1016
|
-
this.
|
|
179
|
+
const oldSelection = this.selection;
|
|
180
|
+
this.selectionService.select_items(this.id, selection, true);
|
|
1017
181
|
this.cdr.markForCheck();
|
|
1018
|
-
this._value = this.createDisplayText(this.
|
|
1019
|
-
}
|
|
1020
|
-
/**
|
|
1021
|
-
* @hidden @internal
|
|
1022
|
-
*/
|
|
1023
|
-
registerOnChange(fn) {
|
|
1024
|
-
this._onChangeCallback = fn;
|
|
1025
|
-
}
|
|
1026
|
-
/**
|
|
1027
|
-
* @hidden @internal
|
|
1028
|
-
*/
|
|
1029
|
-
registerOnTouched(fn) {
|
|
1030
|
-
this._onTouchedCallback = fn;
|
|
1031
|
-
}
|
|
1032
|
-
/**
|
|
1033
|
-
* @hidden @internal
|
|
1034
|
-
*/
|
|
1035
|
-
setDisabledState(isDisabled) {
|
|
1036
|
-
this.disabled = isDisabled;
|
|
182
|
+
this._value = this.createDisplayText(this.selection, oldSelection);
|
|
1037
183
|
}
|
|
1038
184
|
/**
|
|
1039
185
|
* @hidden
|
|
@@ -1041,19 +187,6 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1041
187
|
getEditElement() {
|
|
1042
188
|
return this.comboInput.nativeElement;
|
|
1043
189
|
}
|
|
1044
|
-
/**
|
|
1045
|
-
* @hidden @internal
|
|
1046
|
-
*/
|
|
1047
|
-
get template() {
|
|
1048
|
-
this._dataType = this.dataType;
|
|
1049
|
-
if (this.itemTemplate) {
|
|
1050
|
-
return this.itemTemplate;
|
|
1051
|
-
}
|
|
1052
|
-
if (this._dataType === DataTypes.COMPLEX) {
|
|
1053
|
-
return this.complexTemplate;
|
|
1054
|
-
}
|
|
1055
|
-
return this.primitiveTemplate;
|
|
1056
|
-
}
|
|
1057
190
|
/**
|
|
1058
191
|
* @hidden @internal
|
|
1059
192
|
*/
|
|
@@ -1078,75 +211,18 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1078
211
|
}
|
|
1079
212
|
event.stopPropagation();
|
|
1080
213
|
}
|
|
1081
|
-
/**
|
|
1082
|
-
* A method that opens/closes the combo.
|
|
1083
|
-
*
|
|
1084
|
-
* ```html
|
|
1085
|
-
* <button (click)="combo.toggle()">Toggle Combo</button>
|
|
1086
|
-
* <igx-combo #combo></igx-combo>
|
|
1087
|
-
* ```
|
|
1088
|
-
*/
|
|
1089
|
-
toggle() {
|
|
1090
|
-
const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
|
|
1091
|
-
this.dropdown.toggle(overlaySettings);
|
|
1092
|
-
}
|
|
1093
|
-
/**
|
|
1094
|
-
* A method that opens the combo.
|
|
1095
|
-
*
|
|
1096
|
-
* ```html
|
|
1097
|
-
* <button (click)="combo.open()">Open Combo</button>
|
|
1098
|
-
* <igx-combo #combo></igx-combo>
|
|
1099
|
-
* ```
|
|
1100
|
-
*/
|
|
1101
|
-
open() {
|
|
1102
|
-
const overlaySettings = Object.assign({}, this._overlaySettings, this.overlaySettings);
|
|
1103
|
-
this.dropdown.open(overlaySettings);
|
|
1104
|
-
}
|
|
1105
|
-
/**
|
|
1106
|
-
* A method that closes the combo.
|
|
1107
|
-
*
|
|
1108
|
-
* ```html
|
|
1109
|
-
* <button (click)="combo.close()">Close Combo</button>
|
|
1110
|
-
* <igx-combo #combo></igx-combo>
|
|
1111
|
-
* ```
|
|
1112
|
-
*/
|
|
1113
|
-
close() {
|
|
1114
|
-
this.dropdown.close();
|
|
1115
|
-
}
|
|
1116
|
-
/**
|
|
1117
|
-
* Gets drop down state.
|
|
1118
|
-
*
|
|
1119
|
-
* ```typescript
|
|
1120
|
-
* let state = this.combo.collapsed;
|
|
1121
|
-
* ```
|
|
1122
|
-
*/
|
|
1123
|
-
get collapsed() {
|
|
1124
|
-
return this.dropdown.collapsed;
|
|
1125
|
-
}
|
|
1126
|
-
/**
|
|
1127
|
-
* Get current selection state
|
|
1128
|
-
*
|
|
1129
|
-
* @returns Array of selected items
|
|
1130
|
-
* ```typescript
|
|
1131
|
-
* let selectedItems = this.combo.selectedItems();
|
|
1132
|
-
* ```
|
|
1133
|
-
*/
|
|
1134
|
-
selectedItems() {
|
|
1135
|
-
const items = Array.from(this.selection.get(this.id));
|
|
1136
|
-
return items;
|
|
1137
|
-
}
|
|
1138
214
|
/**
|
|
1139
215
|
* Select defined items
|
|
1140
216
|
*
|
|
1141
217
|
* @param newItems new items to be selected
|
|
1142
218
|
* @param clearCurrentSelection if true clear previous selected items
|
|
1143
219
|
* ```typescript
|
|
1144
|
-
* this.combo.
|
|
220
|
+
* this.combo.select(["New York", "New Jersey"]);
|
|
1145
221
|
* ```
|
|
1146
222
|
*/
|
|
1147
|
-
|
|
223
|
+
select(newItems, clearCurrentSelection, event) {
|
|
1148
224
|
if (newItems) {
|
|
1149
|
-
const newSelection = this.
|
|
225
|
+
const newSelection = this.selectionService.add_items(this.id, newItems, clearCurrentSelection);
|
|
1150
226
|
this.setSelection(newSelection, event);
|
|
1151
227
|
}
|
|
1152
228
|
}
|
|
@@ -1155,12 +231,12 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1155
231
|
*
|
|
1156
232
|
* @param items items to deselected
|
|
1157
233
|
* ```typescript
|
|
1158
|
-
* this.combo.
|
|
234
|
+
* this.combo.deselect(["New York", "New Jersey"]);
|
|
1159
235
|
* ```
|
|
1160
236
|
*/
|
|
1161
|
-
|
|
237
|
+
deselect(items, event) {
|
|
1162
238
|
if (items) {
|
|
1163
|
-
const newSelection = this.
|
|
239
|
+
const newSelection = this.selectionService.delete_items(this.id, items);
|
|
1164
240
|
this.setSelection(newSelection, event);
|
|
1165
241
|
}
|
|
1166
242
|
}
|
|
@@ -1173,8 +249,8 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1173
249
|
* ```
|
|
1174
250
|
*/
|
|
1175
251
|
selectAllItems(ignoreFilter, event) {
|
|
1176
|
-
const allVisible = this.
|
|
1177
|
-
const newSelection = this.
|
|
252
|
+
const allVisible = this.selectionService.get_all_ids(ignoreFilter ? this.data : this.filteredData, this.valueKey);
|
|
253
|
+
const newSelection = this.selectionService.add_items(this.id, allVisible);
|
|
1178
254
|
this.setSelection(newSelection, event);
|
|
1179
255
|
}
|
|
1180
256
|
/**
|
|
@@ -1186,9 +262,9 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1186
262
|
* ```
|
|
1187
263
|
*/
|
|
1188
264
|
deselectAllItems(ignoreFilter, event) {
|
|
1189
|
-
let newSelection = this.
|
|
265
|
+
let newSelection = this.selectionService.get_empty();
|
|
1190
266
|
if (this.filteredData.length !== this.data.length && !ignoreFilter) {
|
|
1191
|
-
newSelection = this.
|
|
267
|
+
newSelection = this.selectionService.delete_items(this.id, this.selectionService.get_all_ids(this.filteredData, this.valueKey));
|
|
1192
268
|
}
|
|
1193
269
|
this.setSelection(newSelection, event);
|
|
1194
270
|
}
|
|
@@ -1216,26 +292,19 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1216
292
|
return;
|
|
1217
293
|
}
|
|
1218
294
|
if (select) {
|
|
1219
|
-
this.
|
|
295
|
+
this.select([itemID], false, event);
|
|
1220
296
|
}
|
|
1221
297
|
else {
|
|
1222
|
-
this.
|
|
298
|
+
this.deselect([itemID], event);
|
|
1223
299
|
}
|
|
1224
300
|
}
|
|
1225
|
-
/**
|
|
1226
|
-
* Event handlers
|
|
1227
|
-
*
|
|
1228
|
-
* @hidden
|
|
1229
|
-
* @internal
|
|
1230
|
-
*/
|
|
1231
|
-
handleOpening(e) {
|
|
1232
|
-
const args = { owner: this, event: e.event, cancel: e.cancel };
|
|
1233
|
-
this.opening.emit(args);
|
|
1234
|
-
e.cancel = args.cancel;
|
|
1235
|
-
}
|
|
1236
301
|
/**
|
|
1237
302
|
* @hidden @internal
|
|
1238
303
|
*/
|
|
304
|
+
toggleCaseSensitive() {
|
|
305
|
+
this.filteringOptions = { caseSensitive: !this.filteringOptions.caseSensitive };
|
|
306
|
+
}
|
|
307
|
+
/** @hidden @internal */
|
|
1239
308
|
handleOpened() {
|
|
1240
309
|
this.triggerCheck();
|
|
1241
310
|
// Disabling focus of the search input should happen only when drop down opens.
|
|
@@ -1249,36 +318,26 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1249
318
|
}
|
|
1250
319
|
this.opened.emit({ owner: this });
|
|
1251
320
|
}
|
|
1252
|
-
/**
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
321
|
+
/** @hidden @internal */
|
|
322
|
+
focusSearchInput(opening) {
|
|
323
|
+
if (this.displaySearchInput && this.searchInput) {
|
|
324
|
+
this.searchInput.nativeElement.focus();
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
if (opening) {
|
|
328
|
+
this.dropdownContainer.nativeElement.focus();
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
this.comboInput.nativeElement.focus();
|
|
332
|
+
this.toggle();
|
|
333
|
+
}
|
|
1261
334
|
}
|
|
1262
|
-
this.searchValue = '';
|
|
1263
|
-
this.comboInput.nativeElement.focus();
|
|
1264
|
-
}
|
|
1265
|
-
/**
|
|
1266
|
-
* @hidden @internal
|
|
1267
|
-
*/
|
|
1268
|
-
handleClosed() {
|
|
1269
|
-
this.closed.emit({ owner: this });
|
|
1270
|
-
}
|
|
1271
|
-
/**
|
|
1272
|
-
* @hidden @internal
|
|
1273
|
-
*/
|
|
1274
|
-
toggleCaseSensitive() {
|
|
1275
|
-
this.filteringOptions = { caseSensitive: !this.filteringOptions.caseSensitive };
|
|
1276
335
|
}
|
|
1277
336
|
setSelection(newSelection, event) {
|
|
1278
|
-
const removed = diffInSets(this.
|
|
1279
|
-
const added = diffInSets(newSelection, this.
|
|
337
|
+
const removed = diffInSets(this.selectionService.get(this.id), newSelection);
|
|
338
|
+
const added = diffInSets(newSelection, this.selectionService.get(this.id));
|
|
1280
339
|
const newSelectionAsArray = Array.from(newSelection);
|
|
1281
|
-
const oldSelectionAsArray = Array.from(this.
|
|
340
|
+
const oldSelectionAsArray = Array.from(this.selectionService.get(this.id) || []);
|
|
1282
341
|
const displayText = this.createDisplayText(newSelectionAsArray, oldSelectionAsArray);
|
|
1283
342
|
const args = {
|
|
1284
343
|
newSelection: newSelectionAsArray,
|
|
@@ -1292,7 +351,7 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1292
351
|
};
|
|
1293
352
|
this.selectionChanging.emit(args);
|
|
1294
353
|
if (!args.cancel) {
|
|
1295
|
-
this.
|
|
354
|
+
this.selectionService.select_items(this.id, args.newSelection, true);
|
|
1296
355
|
if (displayText !== args.displayText) {
|
|
1297
356
|
this._value = args.displayText;
|
|
1298
357
|
}
|
|
@@ -1302,44 +361,10 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1302
361
|
this._onChangeCallback(args.newSelection);
|
|
1303
362
|
}
|
|
1304
363
|
}
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
this.inputGroup.isRequired = error && error.required;
|
|
1310
|
-
}
|
|
1311
|
-
}
|
|
1312
|
-
/** Contains key-value pairs of the selected valueKeys and their resp. displayKeys */
|
|
1313
|
-
registerRemoteEntries(ids, add = true) {
|
|
1314
|
-
if (add) {
|
|
1315
|
-
const selection = this.getValueDisplayPairs(ids);
|
|
1316
|
-
for (const entry of selection) {
|
|
1317
|
-
this._remoteSelection[entry[this.valueKey]] = entry[this.displayKey];
|
|
1318
|
-
}
|
|
1319
|
-
}
|
|
1320
|
-
else {
|
|
1321
|
-
for (const entry of ids) {
|
|
1322
|
-
delete this._remoteSelection[entry];
|
|
1323
|
-
}
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
/**
|
|
1327
|
-
* For `id: any[]` returns a mapped `{ [combo.valueKey]: any, [combo.displayKey]: any }[]`
|
|
1328
|
-
*/
|
|
1329
|
-
getValueDisplayPairs(ids) {
|
|
1330
|
-
return this.data.filter(entry => ids.indexOf(entry[this.valueKey]) > -1).map(e => ({
|
|
1331
|
-
[this.valueKey]: e[this.valueKey],
|
|
1332
|
-
[this.displayKey]: e[this.displayKey]
|
|
1333
|
-
}));
|
|
1334
|
-
}
|
|
1335
|
-
checkMatch() {
|
|
1336
|
-
const displayKey = this.displayKey;
|
|
1337
|
-
const matchFn = (e) => {
|
|
1338
|
-
const value = displayKey ? e[displayKey] : e;
|
|
1339
|
-
return value.toString().toLowerCase() === this.searchValue.trim().toLowerCase();
|
|
1340
|
-
};
|
|
1341
|
-
const itemMatch = this.filteredData.some(matchFn);
|
|
1342
|
-
this.customValueFlag = this.allowCustomValues && !itemMatch;
|
|
364
|
+
createDisplayText(newSelection, oldSelection) {
|
|
365
|
+
return this.isRemote
|
|
366
|
+
? this.getRemoteSelection(newSelection, oldSelection)
|
|
367
|
+
: this.concatDisplayText(newSelection);
|
|
1343
368
|
}
|
|
1344
369
|
/** Returns a string that should be populated in the combo's text box */
|
|
1345
370
|
concatDisplayText(selection) {
|
|
@@ -1348,53 +373,20 @@ export class IgxComboComponent extends DisplayDensityBase {
|
|
|
1348
373
|
selection.join(', ');
|
|
1349
374
|
return value;
|
|
1350
375
|
}
|
|
1351
|
-
/**
|
|
1352
|
-
* Constructs the combo display value
|
|
1353
|
-
* If remote, caches the key displayText
|
|
1354
|
-
* If not, just combine the object.displayKeys
|
|
1355
|
-
*/
|
|
1356
|
-
createDisplayText(newSelection, oldSelection) {
|
|
1357
|
-
let value = '';
|
|
1358
|
-
if (this.isRemote) {
|
|
1359
|
-
if (newSelection.length) {
|
|
1360
|
-
const removedItems = oldSelection.filter(e => newSelection.indexOf(e) < 0);
|
|
1361
|
-
const addedItems = newSelection.filter(e => oldSelection.indexOf(e) < 0);
|
|
1362
|
-
this.registerRemoteEntries(addedItems);
|
|
1363
|
-
this.registerRemoteEntries(removedItems, false);
|
|
1364
|
-
value = Object.keys(this._remoteSelection).map(e => this._remoteSelection[e]).join(', ');
|
|
1365
|
-
}
|
|
1366
|
-
else {
|
|
1367
|
-
// If new selection is empty, clear all items
|
|
1368
|
-
this.registerRemoteEntries(oldSelection, false);
|
|
1369
|
-
}
|
|
1370
|
-
}
|
|
1371
|
-
else {
|
|
1372
|
-
value = this.concatDisplayText(newSelection);
|
|
1373
|
-
}
|
|
1374
|
-
return value;
|
|
1375
|
-
}
|
|
1376
|
-
/** if there is a valueKey - map the keys to data items, else - just return the keys */
|
|
1377
|
-
convertKeysToItems(keys) {
|
|
1378
|
-
if (this.comboAPI.valueKey === null) {
|
|
1379
|
-
return keys;
|
|
1380
|
-
}
|
|
1381
|
-
// map keys vs. filter data to retain the order of the selected items
|
|
1382
|
-
return keys.map(key => this.data.find(entry => entry[this.valueKey] === key)).filter(e => e !== undefined);
|
|
1383
|
-
}
|
|
1384
376
|
}
|
|
1385
377
|
IgxComboComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IgxComboComponent, 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.Component });
|
|
1386
|
-
IgxComboComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: IgxComboComponent, selector: "igx-combo", inputs: {
|
|
378
|
+
IgxComboComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: IgxComboComponent, selector: "igx-combo", inputs: { showSearchCaseIcon: "showSearchCaseIcon", autoFocusSearch: "autoFocusSearch", filterable: "filterable", searchPlaceholder: "searchPlaceholder" }, providers: [
|
|
1387
379
|
IgxComboAPIService,
|
|
1388
380
|
{ provide: IGX_COMBO_COMPONENT, useExisting: IgxComboComponent },
|
|
1389
381
|
{ provide: NG_VALUE_ACCESSOR, useExisting: IgxComboComponent, multi: true }
|
|
1390
|
-
], 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: "dropdown", first: true, predicate: IgxComboDropDownComponent, descendants: true, read: IgxComboDropDownComponent, static: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "virtualScrollContainer", first: true, predicate: IgxForOfDirective, descendants: true, 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 }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true, read: IgxForOfDirective, static: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [type]=\"type\" (click)=\"onInputClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"value\" readonly [attr.placeholder]=\"placeholder\"\n [disabled]=\"disabled\" (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"value.length\" aria-label=\"Clear Selection\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\">\n clear\n </igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\">\n {{ dropdown.collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}\n </igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\" [displayDensity]=\"displayDensity\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <igx-input-group *ngIf=\"displaySearchInput\" [displayDensity]=\"displayDensity\" theme=\"material\" class=\"igx-combo__search\">\n <input class=\"igx-combo-input\" igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"searchPlaceholder\"\n aria-autocomplete=\"both\" [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\" />\n <igx-suffix *ngIf=\"showSearchCaseIcon\">\n <igx-icon family=\"imx-icons\" name=\"case-sensitive\" [active]=\"filteringOptions.caseSensitive\"\n (click)=\"toggleCaseSensitive()\">\n </igx-icon>\n </igx-suffix>\n </igx-input-group>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.px]=\"itemsMaxHeight\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" role=\"listbox\" [attr.id]=\"dropdown.id\">\n <igx-combo-item role=\"option\" [itemHeight]='itemHeight' *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filterable:filteringOptions\n | comboGrouping:groupKey:valueKey:groupSortingDirection;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item.isHeader\" [index]=\"rowIndex\">\n <ng-container *ngIf=\"item.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!item.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n aria-label=\"Add Item\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>The list is empty</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button igxButton=\"flat\" igxRipple>Add item</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n", components: [{ type: i0.forwardRef(function () { return i4.IgxInputGroupComponent; }), selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { type: i0.forwardRef(function () { return i5.IgxIconComponent; }), selector: "igx-icon", inputs: ["family", "active", "name"] }, { type: i0.forwardRef(function () { return IgxComboDropDownComponent; }), selector: "igx-combo-drop-down" }, { type: i0.forwardRef(function () { return IgxComboItemComponent; }), selector: "igx-combo-item", inputs: ["itemHeight"] }, { type: i0.forwardRef(function () { return IgxComboAddItemComponent; }), selector: "igx-combo-add-item" }], directives: [{ type: i0.forwardRef(function () { return i6.IgxInputDirective; }), selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { type: i0.forwardRef(function () { return i7.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i0.forwardRef(function () { return i8.IgxSuffixDirective; }), selector: "igx-suffix,[igxSuffix]" }, { type: i0.forwardRef(function () { return i7.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i0.forwardRef(function () { return i9.DefaultValueAccessor; }), selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i0.forwardRef(function () { return i9.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { type: i0.forwardRef(function () { return i9.NgModel; }), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i0.forwardRef(function () { return i10.IgxDropDownItemNavigationDirective; }), selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { type: i0.forwardRef(function () { return i11.IgxForOfDirective; }), selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { type: i0.forwardRef(function () { return i12.IgxButtonDirective; }), selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { type: i0.forwardRef(function () { return i13.IgxRippleDirective; }), selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }], pipes: { "comboGrouping": i0.forwardRef(function () { return IgxComboGroupingPipe; }), "comboFiltering": i0.forwardRef(function () { return IgxComboFilteringPipe; }) } });
|
|
382
|
+
], viewQueries: [{ propertyName: "dropdown", first: true, predicate: IgxComboDropDownComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [type]=\"type\" (click)=\"onClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"value\" readonly [attr.placeholder]=\"placeholder\"\n [disabled]=\"disabled\" (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"value.length\" aria-label=\"Clear Selection\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\">\n clear\n </igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\">\n {{ dropdown.collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}\n </igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\" [displayDensity]=\"displayDensity\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <igx-input-group *ngIf=\"displaySearchInput\" [displayDensity]=\"displayDensity\" theme=\"material\" class=\"igx-combo__search\">\n <input class=\"igx-combo-input\" igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"searchPlaceholder\"\n aria-autocomplete=\"both\" [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\" />\n <igx-suffix *ngIf=\"showSearchCaseIcon\">\n <igx-icon family=\"imx-icons\" name=\"case-sensitive\" [active]=\"filteringOptions.caseSensitive\"\n (click)=\"toggleCaseSensitive()\">\n </igx-icon>\n </igx-suffix>\n </igx-input-group>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.px]=\"itemsMaxHeight\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" role=\"listbox\" [attr.id]=\"dropdown.id\">\n <igx-combo-item role=\"option\" [itemHeight]='itemHeight' *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterable\n | comboGrouping:groupKey:valueKey:groupSortingDirection;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item.isHeader\" [index]=\"rowIndex\">\n <ng-container *ngIf=\"item.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!item.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n aria-label=\"Add Item\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>The list is empty</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button igxButton=\"flat\" igxRipple>Add item</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n", components: [{ type: i0.forwardRef(function () { return i4.IgxInputGroupComponent; }), selector: "igx-input-group", inputs: ["resourceStrings", "suppressInputAutofocus", "type", "theme"] }, { type: i0.forwardRef(function () { return i5.IgxIconComponent; }), selector: "igx-icon", inputs: ["family", "active", "name"] }, { type: i0.forwardRef(function () { return IgxComboDropDownComponent; }), selector: "igx-combo-drop-down", inputs: ["singleMode"] }, { type: i0.forwardRef(function () { return IgxComboItemComponent; }), selector: "igx-combo-item", inputs: ["itemHeight", "singleMode"] }, { type: i0.forwardRef(function () { return IgxComboAddItemComponent; }), selector: "igx-combo-add-item" }], directives: [{ type: i0.forwardRef(function () { return i6.IgxInputDirective; }), selector: "[igxInput]", inputs: ["value", "disabled", "required"], exportAs: ["igxInput"] }, { type: i0.forwardRef(function () { return i7.NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i0.forwardRef(function () { return i8.IgxSuffixDirective; }), selector: "igx-suffix,[igxSuffix]" }, { type: i0.forwardRef(function () { return i7.NgTemplateOutlet; }), selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i0.forwardRef(function () { return i9.DefaultValueAccessor; }), selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i0.forwardRef(function () { return i9.NgControlStatus; }), selector: "[formControlName],[ngModel],[formControl]" }, { type: i0.forwardRef(function () { return i9.NgModel; }), selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i0.forwardRef(function () { return i10.IgxDropDownItemNavigationDirective; }), selector: "[igxDropDownItemNavigation]", inputs: ["igxDropDownItemNavigation"] }, { type: i0.forwardRef(function () { return i11.IgxForOfDirective; }), selector: "[igxFor][igxForOf]", inputs: ["igxForOf", "igxForSizePropName", "igxForScrollOrientation", "igxForScrollContainer", "igxForContainerSize", "igxForItemSize", "igxForTotalItemCount", "igxForTrackBy"], outputs: ["chunkLoad", "scrollbarVisibilityChanged", "contentSizeChange", "dataChanged", "beforeViewDestroyed", "chunkPreload"] }, { type: i0.forwardRef(function () { return i12.IgxButtonDirective; }), selector: "[igxButton]", inputs: ["selected", "igxButton", "igxButtonColor", "igxButtonBackground", "igxLabel", "disabled"], outputs: ["buttonClick", "buttonSelected"] }, { type: i0.forwardRef(function () { return i13.IgxRippleDirective; }), selector: "[igxRipple]", inputs: ["igxRippleTarget", "igxRipple", "igxRippleDuration", "igxRippleCentered", "igxRippleDisabled"] }], pipes: { "comboGrouping": i0.forwardRef(function () { return IgxComboGroupingPipe; }), "comboFiltering": i0.forwardRef(function () { return IgxComboFilteringPipe; }) } });
|
|
1391
383
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IgxComboComponent, decorators: [{
|
|
1392
384
|
type: Component,
|
|
1393
385
|
args: [{ selector: 'igx-combo', providers: [
|
|
1394
386
|
IgxComboAPIService,
|
|
1395
387
|
{ provide: IGX_COMBO_COMPONENT, useExisting: IgxComboComponent },
|
|
1396
388
|
{ provide: NG_VALUE_ACCESSOR, useExisting: IgxComboComponent, multi: true }
|
|
1397
|
-
], template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [type]=\"type\" (click)=\"
|
|
389
|
+
], template: "<igx-input-group #inputGroup [displayDensity]=\"displayDensity\" [type]=\"type\" (click)=\"onClick($event)\">\n <ng-container ngProjectAs=\"[igxLabel]\">\n <ng-content select=\"[igxLabel]\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-prefix\">\n <ng-content select=\"igx-prefix\"></ng-content>\n </ng-container>\n <ng-container ngProjectAs=\"igx-hint, [igxHint]\">\n <ng-content select=\"igx-hint, [igxHint]\"></ng-content>\n </ng-container>\n <input igxInput #comboInput name=\"comboInput\" type=\"text\" [value]=\"value\" readonly [attr.placeholder]=\"placeholder\"\n [disabled]=\"disabled\" (blur)=\"onBlur()\" />\n <ng-container ngProjectAs=\"igx-suffix\">\n <ng-content select=\"igx-suffix\"></ng-content>\n </ng-container>\n <igx-suffix *ngIf=\"value.length\" aria-label=\"Clear Selection\" class=\"igx-combo__clear-button\"\n (click)=\"handleClearItems($event)\">\n <ng-container *ngIf=\"clearIconTemplate\">\n <ng-container *ngTemplateOutlet=\"clearIconTemplate\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!clearIconTemplate\">\n clear\n </igx-icon>\n </igx-suffix>\n <igx-suffix class=\"igx-combo__toggle-button\">\n <ng-container *ngIf=\"toggleIconTemplate\">\n <ng-container *ngTemplateOutlet=\"toggleIconTemplate; context: {$implicit: this.collapsed}\"></ng-container>\n </ng-container>\n <igx-icon *ngIf=\"!toggleIconTemplate\">\n {{ dropdown.collapsed ? 'arrow_drop_down' : 'arrow_drop_up'}}\n </igx-icon>\n </igx-suffix>\n</igx-input-group>\n<igx-combo-drop-down #igxComboDropDown class=\"igx-combo__drop-down\" [displayDensity]=\"displayDensity\"\n [width]=\"itemsWidth || '100%'\" (opening)=\"handleOpening($event)\" (closing)=\"handleClosing($event)\"\n (opened)=\"handleOpened()\" (closed)=\"handleClosed()\">\n <igx-input-group *ngIf=\"displaySearchInput\" [displayDensity]=\"displayDensity\" theme=\"material\" class=\"igx-combo__search\">\n <input class=\"igx-combo-input\" igxInput #searchInput name=\"searchInput\" autocomplete=\"off\" type=\"text\"\n [(ngModel)]=\"searchValue\" (ngModelChange)=\"handleInputChange($event)\" (keyup)=\"handleKeyUp($event)\"\n (keydown)=\"handleKeyDown($event)\" (focus)=\"dropdown.onBlur($event)\" [attr.placeholder]=\"searchPlaceholder\"\n aria-autocomplete=\"both\" [attr.aria-owns]=\"dropdown.id\" [attr.aria-labelledby]=\"ariaLabelledBy\" />\n <igx-suffix *ngIf=\"showSearchCaseIcon\">\n <igx-icon family=\"imx-icons\" name=\"case-sensitive\" [active]=\"filteringOptions.caseSensitive\"\n (click)=\"toggleCaseSensitive()\">\n </igx-icon>\n </igx-suffix>\n </igx-input-group>\n <ng-container *ngTemplateOutlet=\"headerTemplate\">\n </ng-container>\n <div #dropdownItemContainer class=\"igx-combo__content\" [style.overflow]=\"'hidden'\"\n [style.maxHeight.px]=\"itemsMaxHeight\" [igxDropDownItemNavigation]=\"dropdown\" (focus)=\"dropdown.onFocus()\"\n [tabindex]=\"dropdown.collapsed ? -1 : 0\" role=\"listbox\" [attr.id]=\"dropdown.id\">\n <igx-combo-item role=\"option\" [itemHeight]='itemHeight' *igxFor=\"let item of data\n | comboFiltering:filterValue:displayKey:filteringOptions:filterable\n | comboGrouping:groupKey:valueKey:groupSortingDirection;\n index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight\"\n [value]=\"item\" [isHeader]=\"item.isHeader\" [index]=\"rowIndex\">\n <ng-container *ngIf=\"item.isHeader\">\n <ng-container\n *ngTemplateOutlet=\"headerItemTemplate ? headerItemTemplate : headerItemBase;\n context: {$implicit: item, data: data, valueKey: valueKey, groupKey: groupKey, displayKey: displayKey}\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!item.isHeader\">\n <ng-container #listItem\n *ngTemplateOutlet=\"template; context: {$implicit: item, data: data, valueKey: valueKey, displayKey: displayKey};\">\n </ng-container>\n </ng-container>\n </igx-combo-item>\n </div>\n <div class=\"igx-combo__add\" *ngIf=\"filteredData.length === 0 || isAddButtonVisible()\">\n <div class=\"igx-combo__empty\" *ngIf=\"filteredData.length === 0\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate ? emptyTemplate : empty\">\n </ng-container>\n </div>\n <igx-combo-add-item [itemHeight]=\"itemHeight\" *ngIf=\"isAddButtonVisible()\"\n [tabindex]=\"dropdown.collapsed ? -1 : customValueFlag ? 1 : -1\" class=\"igx-combo__add-item\" role=\"button\"\n aria-label=\"Add Item\" [index]=\"virtualScrollContainer.igxForOf.length\">\n <ng-container *ngTemplateOutlet=\"addItemTemplate ? addItemTemplate : addItemDefault\">\n </ng-container>\n </igx-combo-add-item>\n </div>\n <ng-container *ngTemplateOutlet=\"footerTemplate\">\n </ng-container>\n</igx-combo-drop-down>\n<ng-template #complex let-display let-data=\"data\" let-key=\"displayKey\">\n {{display[key]}}\n</ng-template>\n<ng-template #primitive let-display>\n {{display}}\n</ng-template>\n<ng-template #empty>\n <span>The list is empty</span>\n</ng-template>\n<ng-template #addItemDefault let-control>\n <button igxButton=\"flat\" igxRipple>Add item</button>\n</ng-template>\n<ng-template #headerItemBase let-item let-key=\"valueKey\" let-groupKey=\"groupKey\">\n {{ item[key] }}\n</ng-template>\n" }]
|
|
1398
390
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.IgxSelectionAPIService }, { type: i2.IgxComboAPIService }, { type: i3.IgxIconService }, { type: undefined, decorators: [{
|
|
1399
391
|
type: Optional
|
|
1400
392
|
}, {
|
|
@@ -1407,143 +399,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImpor
|
|
|
1407
399
|
args: [IGX_INPUT_GROUP_TYPE]
|
|
1408
400
|
}] }, { type: i0.Injector, decorators: [{
|
|
1409
401
|
type: Optional
|
|
1410
|
-
}] }]; }, propDecorators: {
|
|
1411
|
-
type: Input
|
|
1412
|
-
}], inputGroup: [{
|
|
1413
|
-
type: ViewChild,
|
|
1414
|
-
args: ['inputGroup', { read: IgxInputGroupComponent, static: true }]
|
|
1415
|
-
}], comboInput: [{
|
|
1416
|
-
type: ViewChild,
|
|
1417
|
-
args: ['comboInput', { read: IgxInputDirective, static: true }]
|
|
1418
|
-
}], dropdown: [{
|
|
1419
|
-
type: ViewChild,
|
|
1420
|
-
args: [IgxComboDropDownComponent, { read: IgxComboDropDownComponent, static: true }]
|
|
1421
|
-
}], searchInput: [{
|
|
1422
|
-
type: ViewChild,
|
|
1423
|
-
args: ['searchInput']
|
|
1424
|
-
}], itemTemplate: [{
|
|
1425
|
-
type: ContentChild,
|
|
1426
|
-
args: [IgxComboItemDirective, { read: TemplateRef }]
|
|
1427
|
-
}], headerTemplate: [{
|
|
1428
|
-
type: ContentChild,
|
|
1429
|
-
args: [IgxComboHeaderDirective, { read: TemplateRef }]
|
|
1430
|
-
}], footerTemplate: [{
|
|
1431
|
-
type: ContentChild,
|
|
1432
|
-
args: [IgxComboFooterDirective, { read: TemplateRef }]
|
|
1433
|
-
}], headerItemTemplate: [{
|
|
1434
|
-
type: ContentChild,
|
|
1435
|
-
args: [IgxComboHeaderItemDirective, { read: TemplateRef }]
|
|
1436
|
-
}], addItemTemplate: [{
|
|
1437
|
-
type: ContentChild,
|
|
1438
|
-
args: [IgxComboAddItemDirective, { read: TemplateRef }]
|
|
1439
|
-
}], emptyTemplate: [{
|
|
1440
|
-
type: ContentChild,
|
|
1441
|
-
args: [IgxComboEmptyDirective, { read: TemplateRef }]
|
|
1442
|
-
}], toggleIconTemplate: [{
|
|
1443
|
-
type: ContentChild,
|
|
1444
|
-
args: [IgxComboToggleIconDirective, { read: TemplateRef }]
|
|
1445
|
-
}], clearIconTemplate: [{
|
|
1446
|
-
type: ContentChild,
|
|
1447
|
-
args: [IgxComboClearIconDirective, { read: TemplateRef }]
|
|
1448
|
-
}], virtualScrollContainer: [{
|
|
1449
|
-
type: ViewChild,
|
|
1450
|
-
args: [IgxForOfDirective, { static: true }]
|
|
1451
|
-
}], selectionChanging: [{
|
|
1452
|
-
type: Output
|
|
1453
|
-
}], opening: [{
|
|
1454
|
-
type: Output
|
|
1455
|
-
}], opened: [{
|
|
1456
|
-
type: Output
|
|
1457
|
-
}], closing: [{
|
|
1458
|
-
type: Output
|
|
1459
|
-
}], closed: [{
|
|
1460
|
-
type: Output
|
|
1461
|
-
}], addition: [{
|
|
1462
|
-
type: Output
|
|
1463
|
-
}], searchInputUpdate: [{
|
|
1464
|
-
type: Output
|
|
1465
|
-
}], dataPreLoad: [{
|
|
1466
|
-
type: Output
|
|
1467
|
-
}], id: [{
|
|
1468
|
-
type: HostBinding,
|
|
1469
|
-
args: ['attr.id']
|
|
1470
|
-
}, {
|
|
1471
|
-
type: Input
|
|
1472
|
-
}], width: [{
|
|
1473
|
-
type: HostBinding,
|
|
1474
|
-
args: ['style.width']
|
|
1475
|
-
}, {
|
|
1476
|
-
type: Input
|
|
1477
|
-
}], cssClass: [{
|
|
1478
|
-
type: HostBinding,
|
|
1479
|
-
args: ['class.igx-combo']
|
|
1480
|
-
}], role: [{
|
|
1481
|
-
type: HostBinding,
|
|
1482
|
-
args: [`attr.role`]
|
|
1483
|
-
}], ariaExpanded: [{
|
|
1484
|
-
type: HostBinding,
|
|
1485
|
-
args: ['attr.aria-expanded']
|
|
1486
|
-
}], hasPopUp: [{
|
|
1487
|
-
type: HostBinding,
|
|
1488
|
-
args: ['attr.aria-haspopup']
|
|
1489
|
-
}], ariaOwns: [{
|
|
1490
|
-
type: HostBinding,
|
|
1491
|
-
args: ['attr.aria-owns']
|
|
1492
|
-
}], allowCustomValues: [{
|
|
402
|
+
}] }]; }, propDecorators: { showSearchCaseIcon: [{
|
|
1493
403
|
type: Input
|
|
1494
|
-
}],
|
|
1495
|
-
type: Input
|
|
1496
|
-
}], itemsWidth: [{
|
|
1497
|
-
type: Input
|
|
1498
|
-
}], itemHeight: [{
|
|
1499
|
-
type: Input
|
|
1500
|
-
}], placeholder: [{
|
|
1501
|
-
type: Input
|
|
1502
|
-
}], searchPlaceholder: [{
|
|
1503
|
-
type: Input
|
|
1504
|
-
}], showSearchCaseIcon: [{
|
|
1505
|
-
type: Input
|
|
1506
|
-
}], data: [{
|
|
1507
|
-
type: Input
|
|
1508
|
-
}], valueKey: [{
|
|
1509
|
-
type: Input
|
|
1510
|
-
}], displayKey: [{
|
|
1511
|
-
type: Input
|
|
1512
|
-
}], groupKey: [{
|
|
404
|
+
}], autoFocusSearch: [{
|
|
1513
405
|
type: Input
|
|
1514
406
|
}], filterable: [{
|
|
1515
407
|
type: Input
|
|
1516
|
-
}],
|
|
1517
|
-
type: Input
|
|
1518
|
-
}], ariaLabelledBy: [{
|
|
1519
|
-
type: Input
|
|
1520
|
-
}, {
|
|
1521
|
-
type: HostBinding,
|
|
1522
|
-
args: ['attr.aria-labelledby']
|
|
1523
|
-
}], disabled: [{
|
|
1524
|
-
type: Input
|
|
1525
|
-
}], type: [{
|
|
1526
|
-
type: Input
|
|
1527
|
-
}], autoFocusSearch: [{
|
|
408
|
+
}], searchPlaceholder: [{
|
|
1528
409
|
type: Input
|
|
1529
|
-
}],
|
|
1530
|
-
type: ViewChild,
|
|
1531
|
-
args: ['dropdownItemContainer', { static: true }]
|
|
1532
|
-
}], primitiveTemplate: [{
|
|
1533
|
-
type: ViewChild,
|
|
1534
|
-
args: ['primitive', { read: TemplateRef, static: true }]
|
|
1535
|
-
}], complexTemplate: [{
|
|
1536
|
-
type: ViewChild,
|
|
1537
|
-
args: ['complex', { read: TemplateRef, static: true }]
|
|
1538
|
-
}], virtDir: [{
|
|
410
|
+
}], dropdown: [{
|
|
1539
411
|
type: ViewChild,
|
|
1540
|
-
args: [
|
|
1541
|
-
}], onArrowDown: [{
|
|
1542
|
-
type: HostListener,
|
|
1543
|
-
args: ['keydown.ArrowDown', ['$event']]
|
|
1544
|
-
}, {
|
|
1545
|
-
type: HostListener,
|
|
1546
|
-
args: ['keydown.Alt.ArrowDown', ['$event']]
|
|
412
|
+
args: [IgxComboDropDownComponent, { static: true }]
|
|
1547
413
|
}] } });
|
|
1548
414
|
/**
|
|
1549
415
|
* @hidden
|
|
@@ -1572,11 +438,16 @@ IgxComboModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version:
|
|
|
1572
438
|
IgxInputGroupModule,
|
|
1573
439
|
IgxRippleModule,
|
|
1574
440
|
IgxToggleModule,
|
|
1575
|
-
ReactiveFormsModule], exports: [
|
|
1576
|
-
|
|
441
|
+
ReactiveFormsModule], exports: [IgxComboAddItemComponent,
|
|
442
|
+
IgxComboAddItemDirective,
|
|
443
|
+
IgxComboClearIconDirective, IgxComboComponent, IgxComboDropDownComponent,
|
|
444
|
+
IgxComboEmptyDirective,
|
|
445
|
+
IgxComboFilteringPipe,
|
|
1577
446
|
IgxComboFooterDirective,
|
|
447
|
+
IgxComboGroupingPipe,
|
|
1578
448
|
IgxComboHeaderDirective,
|
|
1579
449
|
IgxComboHeaderItemDirective,
|
|
450
|
+
IgxComboItemComponent,
|
|
1580
451
|
IgxComboItemDirective,
|
|
1581
452
|
IgxComboToggleIconDirective,
|
|
1582
453
|
IgxInputGroupModule] });
|
|
@@ -1613,13 +484,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImpor
|
|
|
1613
484
|
IgxComboToggleIconDirective
|
|
1614
485
|
],
|
|
1615
486
|
exports: [
|
|
487
|
+
IgxComboAddItemComponent,
|
|
1616
488
|
IgxComboAddItemDirective,
|
|
1617
489
|
IgxComboClearIconDirective,
|
|
1618
490
|
IgxComboComponent,
|
|
491
|
+
IgxComboDropDownComponent,
|
|
1619
492
|
IgxComboEmptyDirective,
|
|
493
|
+
IgxComboFilteringPipe,
|
|
1620
494
|
IgxComboFooterDirective,
|
|
495
|
+
IgxComboGroupingPipe,
|
|
1621
496
|
IgxComboHeaderDirective,
|
|
1622
497
|
IgxComboHeaderItemDirective,
|
|
498
|
+
IgxComboItemComponent,
|
|
1623
499
|
IgxComboItemDirective,
|
|
1624
500
|
IgxComboToggleIconDirective,
|
|
1625
501
|
IgxInputGroupModule
|
|
@@ -1639,4 +515,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImpor
|
|
|
1639
515
|
]
|
|
1640
516
|
}]
|
|
1641
517
|
}] });
|
|
1642
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2NvbWJvL2NvbWJvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9jb21iby9jb21iby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUMrQixTQUFTLEVBQUUsWUFBWSxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUM5RyxLQUFLLEVBQUUsUUFBUSxFQUFxQixNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUN2RixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLHVCQUF1QixFQUN2Qix3QkFBd0IsRUFDeEIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUM3QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQXdCLGlCQUFpQixFQUFFLFNBQVMsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsVUFBVSxFQUFrRyxNQUFNLGVBQWUsQ0FBQztBQUMzSSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFD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LEVBQUU7d0JBQ1Ysd0JBQXdCO3dCQUN4Qix3QkFBd0I7d0JBQ3hCLDBCQUEwQjt3QkFDMUIsaUJBQWlCO3dCQUNqQix5QkFBeUI7d0JBQ3pCLHNCQUFzQjt3QkFDdEIscUJBQXFCO3dCQUNyQix1QkFBdUI7d0JBQ3ZCLG9CQUFvQjt3QkFDcEIsdUJBQXVCO3dCQUN2QiwyQkFBMkI7d0JBQzNCLHFCQUFxQjt3QkFDckIscUJBQXFCO3dCQUNyQiwyQkFBMkI7cUJBQzlCO29CQUNELE9BQU8sRUFBRTt3QkFDTCx3QkFBd0I7d0JBQ3hCLDBCQUEwQjt3QkFDMUIsaUJBQWlCO3dCQUNqQixzQkFBc0I7d0JBQ3RCLHVCQUF1Qjt3QkFDdkIsdUJBQXVCO3dCQUN2QiwyQkFBMkI7d0JBQzNCLHFCQUFxQjt3QkFDckIsMkJBQTJCO3dCQUMzQixtQkFBbUI7cUJBQ3RCO29CQUNELE9BQU8sRUFBRTt3QkFDTCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGlCQUFpQjt3QkFDakIsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLG1CQUFtQjtxQkFDdEI7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCwgTmdNb2R1bGUsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIE9wdGlvbmFsLCBJbmplY3QsIEluamVjdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJZ3hDb21ib0l0ZW1EaXJlY3RpdmUsXG4gICAgSWd4Q29tYm9FbXB0eURpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0hlYWRlckl0ZW1EaXJlY3RpdmUsXG4gICAgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsXG4gICAgSWd4Q29tYm9Gb290ZXJEaXJlY3RpdmUsXG4gICAgSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLFxuICAgIElneENvbWJvVG9nZ2xlSWNvbkRpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0NsZWFySWNvbkRpcmVjdGl2ZVxufSBmcm9tICcuL2NvbWJvLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdDb250cm9sLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJZ3hDaGVja2JveE1vZHVsZSB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hTZWxlY3Rpb25BUElTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgY2xvbmVBcnJheSwgSUJhc2VFdmVudEFyZ3MsIElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIElCYXNlQ2FuY2VsYWJsZUV2ZW50QXJncywgQ2FuY2VsYWJsZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCwgSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWNvbmRpdGlvbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdMb2dpYyB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4Rm9yT2ZNb2R1bGUsIElGb3JPZlN0YXRlLCBJZ3hGb3JPZkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZm9yLW9mL2Zvcl9vZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4SWNvbk1vZHVsZSwgSWd4SWNvblNlcnZpY2UgfSBmcm9tICcuLi9pY29uL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4UmlwcGxlTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9yaXBwbGUvcmlwcGxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUb2dnbGVNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEJ1dHRvbk1vZHVsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4RHJvcERvd25Nb2R1bGUgfSBmcm9tICcuLi9kcm9wLWRvd24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwTW9kdWxlLCBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvaW5wdXQtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbWJvSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tYm8taXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29tYm9Ecm9wRG93bkNvbXBvbmVudCB9IGZyb20gJy4vY29tYm8tZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbWJvRmlsdGVyaW5nUGlwZSwgSWd4Q29tYm9Hcm91cGluZ1BpcGUgfSBmcm9tICcuL2NvbWJvLnBpcGVzJztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncywgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9wdWJsaWNfYXBpJztcbmltcG9ydCB7IG5vb3AsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5QmFzZSwgRGlzcGxheURlbnNpdHlUb2tlbiwgSURpc3BsYXlEZW5zaXR5T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBJR1hfQ09NQk9fQ09NUE9ORU5ULCBJZ3hDb21ib0Jhc2UgfSBmcm9tICcuL2NvbWJvLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hDb21ib0FkZEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbWJvLWFkZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb21ib0FQSVNlcnZpY2UgfSBmcm9tICcuL2NvbWJvLmFwaSc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5pbXBvcnQgeyBJZ3hJbnB1dFN0YXRlLCBJZ3hJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvaW5wdXQvaW5wdXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneElucHV0R3JvdXBUeXBlLCBJR1hfSU5QVVRfR1JPVVBfVFlQRSB9IGZyb20gJy4uL2lucHV0LWdyb3VwL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgY2FzZVNlbnNpdGl2ZSB9IGZyb20gJ0BpZ25pdGV1aS9tYXRlcmlhbC1pY29ucy1leHRlbmRlZCc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZW51bSBEYXRhVHlwZXMge1xuICAgIEVNUFRZID0gJ2VtcHR5JyxcbiAgICBQUklNSVRJVkUgPSAncHJpbWl0aXZlJyxcbiAgICBDT01QTEVYID0gJ2NvbXBsZXgnLFxuICAgIFBSSU1BUllLRVkgPSAndmFsdWVLZXknXG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5jb25zdCBJdGVtSGVpZ2h0cyA9IHtcbiAgICBjb21mb3J0YWJsZTogNDAsXG4gICAgY29zeTogMzIsXG4gICAgY29tcGFjdDogMjgsXG59O1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqIFRoZSBkZWZhdWx0IG51bWJlciBvZiBpdGVtcyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgY29tYm8nc1xuICogZHJvcC1kb3duIGxpc3QgaWYgbm8gYFtpdGVtc01heEhlaWdodF1gIGlzIHNwZWNpZmllZFxuICovXG5jb25zdCBpdGVtc0luQ29udGFpbmVyID0gMTA7XG5cbmV4cG9ydCBlbnVtIElneENvbWJvU3RhdGUge1xuICAgIC8qKlxuICAgICAqIENvbWJvIHdpdGggaW5pdGlhbCBzdGF0ZS5cbiAgICAgKi9cbiAgICBJTklUSUFMID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMLFxuICAgIC8qKlxuICAgICAqIENvbWJvIHdpdGggdmFsaWQgc3RhdGUuXG4gICAgICovXG4gICAgVkFMSUQgPSBJZ3hJbnB1dFN0YXRlLlZBTElELFxuICAgIC8qKlxuICAgICAqIENvbWJvIHdpdGggaW52YWxpZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBJTlZBTElEID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEXG59XG5cbi8qKiBUaGUgZmlsdGVyaW5nIGNyaXRlcmlhIHRvIGJlIGFwcGxpZWQgb24gZGF0YSBzZWFyY2ggKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbWJvRmlsdGVyaW5nT3B0aW9ucyB7XG4gICAgLyoqIERlZmluZXMgZmlsdGVyaW5nIGNhc2Utc2Vuc2l0aXZpdHkgKi9cbiAgICBjYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xufVxuXG4vKiogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGlneC1jb21ibydzIHNlbGVjdGlvbiBpcyBjaGFuZ2luZyAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tYm9TZWxlY3Rpb25DaGFuZ2luZ0V2ZW50QXJncyBleHRlbmRzIElCYXNlQ2FuY2VsYWJsZUV2ZW50QXJncyB7XG4gICAgLyoqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQgKi9cbiAgICBvbGRTZWxlY3Rpb246IGFueVtdO1xuICAgIC8qKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgZXZlbnQgKi9cbiAgICBuZXdTZWxlY3Rpb246IGFueVtdO1xuICAgIC8qKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24gKGlmIGFueSkgKi9cbiAgICBhZGRlZDogYW55W107XG4gICAgLyoqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24gKGlmIGFueSkgKi9cbiAgICByZW1vdmVkOiBhbnlbXTtcbiAgICAvKiogVGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gdGV4dCBib3ggKi9cbiAgICBkaXNwbGF5VGV4dDogc3RyaW5nO1xuICAgIC8qKiBUaGUgdXNlciBpbnRlcmFjdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGUgc2VsZWN0aW9uIGNoYW5nZSAqL1xuICAgIGV2ZW50PzogRXZlbnQ7XG59XG5cbi8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGlneC1jb21ibydzIHNlYXJjaCBpbnB1dCBjaGFuZ2VzICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21ib1NlYXJjaElucHV0RXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDYW5jZWxhYmxlRXZlbnRBcmdzIHtcbiAgICAvKiogVGhlIHRleHQgdGhhdCBoYXMgYmVlbiB0eXBlZCBpbnRvIHRoZSBzZWFyY2ggaW5wdXQgKi9cbiAgICBzZWFyY2hUZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbWJvSXRlbUFkZGl0aW9uRXZlbnQgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncywgQ2FuY2VsYWJsZUV2ZW50QXJncyB7XG4gICAgb2xkQ29sbGVjdGlvbjogYW55W107XG4gICAgYWRkZWRJdGVtOiBhbnk7XG4gICAgbmV3Q29sbGVjdGlvbjogYW55W107XG59XG5cbi8qKlxuICogV2hlbiBjYWxsZWQgd2l0aCBzZXRzIEEgJiBCLCByZXR1cm5zIEEgLSBCIChhcyBhcnJheSk7XG4gKlxuICogQGhpZGRlblxuICovXG5jb25zdCBkaWZmSW5TZXRzID0gKHNldDE6IFNldDxhbnk+LCBzZXQyOiBTZXQ8YW55Pik6IGFueVtdID0+IHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgc2V0MS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgaWYgKCFzZXQyLmhhcyhlbnRyeSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbn07XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiAgUmVwcmVzZW50cyBhIGRyb3AtZG93biBsaXN0IHRoYXQgcHJvdmlkZXMgZWRpdGFibGUgZnVuY3Rpb25hbGl0aWVzLCBhbGxvd2luZyB1c2VycyB0byBjaG9vc2UgYW4gb3B0aW9uIGZyb20gYSBwcmVkZWZpbmVkIGxpc3QuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hDb21ib01vZHVsZVxuICogQGlneFRoZW1lIGlneC1jb21iby10aGVtZVxuICogQGlneEtleXdvcmRzIGNvbWJvYm94LCBjb21ibyBzZWxlY3Rpb25cbiAqIEBpZ3hHcm91cCBHcmlkcyAmIExpc3RzXG4gKlxuICogQHJlbWFya3NcbiAqIEl0IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGZpbHRlciBpdGVtcyBhcyB3ZWxsIGFzIHBlcmZvcm0gc2luZ2xlIG9yIG11bHRpcGxlIHNlbGVjaXRvbiB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICogQWRkaXRpb25hbGx5LCBpdCBleHBvc2VzIGtleWJvYXJkIG5hdmlnYXRpb24gYW5kIGN1c3RvbSBzdHlsaW5nIGNhcGFiaWxpdGllcy5cbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LWNvbWJvIFtpdGVtc01heEhlaWdodF09XCIyNTBcIiBbZGF0YV09XCJsb2NhdGlvbkRhdGFcIlxuICogIFtkaXNwbGF5S2V5XT1cIidmaWVsZCdcIiBbdmFsdWVLZXldPVwiJ2ZpZWxkJ1wiXG4gKiAgcGxhY2Vob2xkZXI9XCJMb2NhdGlvbihzKVwiIHNlYXJjaFBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCI+XG4gKiA8L2lneC1jb21ibz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1jb21ibycsXG4gICAgdGVtcGxhdGVVcmw6ICdjb21iby5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIElneENvbWJvQVBJU2VydmljZSxcbiAgICAgICAgeyBwcm92aWRlOiBJR1hfQ09NQk9fQ09NUE9ORU5ULCB1c2VFeGlzdGluZzogSWd4Q29tYm9Db21wb25lbnQgfSxcbiAgICAgICAgeyBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IElneENvbWJvQ29tcG9uZW50LCBtdWx0aTogdHJ1ZSB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hDb21ib0NvbXBvbmVudCBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSBpbXBsZW1lbnRzIElneENvbWJvQmFzZSwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3ksIEVkaXRvclByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBTZXQgY3VzdG9tIG92ZXJsYXkgc2V0dGluZ3MgdGhhdCBjb250cm9sIGhvdyB0aGUgY29tYm8ncyBsaXN0IG9mIGl0ZW1zIGlzIGRpc3BsYXllZC5cbiAgICAgKiBTZXQ6XG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gW292ZXJsYXlTZXR0aW5nc10gPSBcImN1c3RvbU92ZXJsYXlTZXR0aW5nc1wiPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBjdXN0b21TZXR0aW5ncyA9IHsgcG9zaXRpb25TdHJhdGVneTogeyBzZXR0aW5nczogeyB0YXJnZXQ6IG15VGFyZ2V0IH0gfSB9O1xuICAgICAqICBjb21iby5vdmVybGF5U2V0dGluZ3MgPSBjdXN0b21TZXR0aW5ncztcbiAgICAgKiBgYGBcbiAgICAgKiBHZXQgYW55IGN1c3RvbSBvdmVybGF5IHNldHRpbmdzIHVzZWQgYnkgdGhlIGNvbWJvOlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgY29uc3QgY29tYm9PdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IG15Q29tYm8ub3ZlcmxheVNldHRpbmdzO1xuICAgICAqIGBgYFxuICAgICAqL1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXRHcm91cCcsIHsgcmVhZDogSWd4SW5wdXRHcm91cENvbXBvbmVudCwgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnY29tYm9JbnB1dCcsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgY29tYm9JbnB1dDogSWd4SW5wdXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Q29tYm9Ecm9wRG93bkNvbXBvbmVudCwgeyByZWFkOiBJZ3hDb21ib0Ryb3BEb3duQ29tcG9uZW50LCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJvcGRvd246IElneENvbWJvRHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JylcbiAgICBwdWJsaWMgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3BsYXlTZWFyY2hJbnB1dCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyYWJsZSB8fCB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBJVEVNUyBpbiB0aGUgY29tYm8gbGlzdFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLml0ZW1UZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jb21ibyAjY29tYm8+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0l0ZW0+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1pdGVtXCIgbGV0LWl0ZW0gbGV0LWtleT1cInZhbHVlS2V5XCI+XG4gICAgICogICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taXRlbV9fbmFtZVwiPnt7IGl0ZW1ba2V5XSB9fTwvZGl2PlxuICAgICAqICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW1fX2Nvc3RcIj57eyBpdGVtLmNvc3QgfX08L2Rpdj5cbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9JdGVtRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIEhFQURFUiBmb3IgdGhlIGNvbWJvIGl0ZW1zIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5oZWFkZXJUZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jb21ibyAjY29tYm8+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0hlYWRlcj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9fX2hlYWRlclwiPlxuICAgICAqICAgICAgICAgICAgICBUaGlzIGlzIGEgY3VzdG9tIGhlYWRlclxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBoZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIEZPT1RFUiBmb3IgdGhlIGNvbWJvIGl0ZW1zIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5mb290ZXJUZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jb21ibyAjY29tYm8+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0Zvb3Rlcj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm9fX2Zvb3RlclwiPlxuICAgICAqICAgICAgICAgICAgICBUaGlzIGlzIGEgY3VzdG9tIGZvb3RlclxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib0Zvb3RlckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBmb290ZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgSEVBREVSIElURU1TIGZvciBncm91cHMgaW4gdGhlIGNvbWJvIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5oZWFkZXJJdGVtVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9IZWFkZXJJdGVtIGxldC1pdGVtIGxldC1rZXk9XCJncm91cEtleVwiPlxuICAgICAqICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taXRlbS0tZ3JvdXBcIj5Hcm91cCBoZWFkZXIgZm9yIHt7IGl0ZW1ba2V5XSB9fTwvZGl2PlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib0hlYWRlckl0ZW1EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVySXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgQUREIEJVVFRPTiBpbiB0aGUgY29tYm8gZHJvcCBkb3duXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uYWRkSXRlbVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvQWRkSXRlbT5cbiAgICAgKiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29tYm9fX2FkZC1idXR0b25cIj5cbiAgICAgKiAgICAgICAgICAgICAgQ2xpY2sgdG8gYWRkIGl0ZW1cbiAgICAgKiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGFkZEl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIEFERCBCVVRUT04gaW4gdGhlIGNvbWJvIGRyb3AgZG93blxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmVtcHR5VGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9FbXB0eT5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tYm8tLWVtcHR5XCI+XG4gICAgICogICAgICAgICAgICAgIFRoZXJlIGFyZSBubyBpdGVtcyB0byBkaXNwbGF5XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvRW1wdHlEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZW1wdHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIGNvbWJvIFRPR0dMRShvcGVuL2Nsb3NlKSBidXR0b25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby50b2dnbGVJY29uVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9Ub2dnbGVJY29uIGxldC1jb2xsYXBzZWQ+XG4gICAgICogICAgICAgICAgPGlneC1pY29uPnt7IGNvbGxhcHNlZCA/ICdyZW1vdmVfY2lyY2xlJyA6ICdyZW1vdmVfY2lyY2xlX291dGxpbmUnfX08L2lneC1pY29uPlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib1RvZ2dsZUljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdG9nZ2xlSWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgY29tYm8gQ0xFQVIgYnV0dG9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uY2xlYXJJY29uVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9DbGVhckljb24+XG4gICAgICogICAgICAgICAgPGlneC1pY29uPmNsZWFyPC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9DbGVhckljb25EaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgY2xlYXJJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneEZvck9mRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsQ29udGFpbmVyOiBJZ3hGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGl0ZW0gc2VsZWN0aW9uIGlzIGNoYW5naW5nLCBiZWZvcmUgdGhlIHNlbGVjdGlvbiBjb21wbGV0ZXNcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChzZWxlY3Rpb25DaGFuZ2luZyk9J2hhbmRsZVNlbGVjdGlvbigpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb21ib1NlbGVjdGlvbkNoYW5naW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gb3BlbmluZz0naGFuZGxlT3BlbmluZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKG9wZW5lZCk9J2hhbmRsZU9wZW5lZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBkcm9wZG93biBpcyBjbG9zZWRcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChjbG9zaW5nKT0naGFuZGxlQ2xvc2luZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKGNsb3NlZCk9J2hhbmRsZUNsb3NlZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBpdGVtIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChhZGRpdGlvbik9J2hhbmRsZUFkZGl0aW9uRXZlbnQoJGV2ZW50KSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkZGl0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29tYm9JdGVtQWRkaXRpb25FdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBpbnB1dCBjaGFuZ2VzIChlLmcuIHR5cGluZywgcGFzdGluZywgY2xlYXIsIGV0Yy4pXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoc2VhcmNoSW5wdXRVcGRhdGUpPSdoYW5kbGVTZWFyY2hJbnB1dEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hJbnB1dFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbmV3IGNodW5rIG9mIGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIHZpcnR1YWxpemF0aW9uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoZGF0YVByZUxvYWQpPSdoYW5kbGVEYXRhUHJlbG9hZEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhUHJlTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUZvck9mU3RhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL2dldHMgY29tYm8gaWQuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGlkID0gdGhpcy5jb21iby5pZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbaWRdPSdjb21ibzEnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWNvbWJvLSR7TkVYVF9JRCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdHlsZSB3aWR0aCBvZiB0aGUgZWxlbWVudFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvV2lkdGggPSB0aGlzLmNvbWJvLndpZHRoO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFt3aWR0aF09JzI1MHB4Jz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1jb21ibycpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1jb21ibyc7IC8vIEluZGVwZW5kZW50IG9mIGRpc3BsYXkgZGVuc2l0eSwgYXQgdGhlIHRpbWUgYmVpbmdcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLnJvbGVgKVxuICAgIHB1YmxpYyByb2xlID0gJ2NvbWJvYm94JztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICAgIHB1YmxpYyBnZXQgYXJpYUV4cGFuZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZHJvcGRvd24uY29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaGFzcG9wdXAnKVxuICAgIHB1YmxpYyBnZXQgaGFzUG9wVXAoKSB7XG4gICAgICAgIHJldHVybiAnbGlzdGJveCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFPd25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIGN1c3RvbSB2YWx1ZXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvbWJvQWxsb3dzQ3VzdG9tVmFsdWVzID0gdGhpcy5jb21iby5hbGxvd0N1c3RvbVZhbHVlcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbYWxsb3dDdXN0b21WYWx1ZXNdPSd0cnVlJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhbGxvd0N1c3RvbVZhbHVlcyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3QgaGVpZ2h0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15Q29tYm9JdGVtc01heEhlaWdodCA9IHRoaXMuY29tYm8uaXRlbXNNYXhIZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1zTWF4SGVpZ2h0XT0nMzIwJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaXRlbXNNYXhIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zTWF4SGVpZ2h0ID09PSBudWxsIHx8IHRoaXMuX2l0ZW1zTWF4SGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1IZWlnaHQgKiBpdGVtc0luQ29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc01heEhlaWdodDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGl0ZW1zTWF4SGVpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zTWF4SGVpZ2h0ID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIGRyb3AgZG93biBsaXN0IHdpZHRoXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15Q29tYm9JdGVtc1dpZHRoID0gdGhpcy5jb21iby5pdGVtc1dpZHRoO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtpdGVtc1dpZHRoXSA9ICdcIjE4MHB4XCInPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGl0ZW1zV2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIGRyb3AgZG93biBsaXN0IGl0ZW0gaGVpZ2h0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15Q29tYm9JdGVtSGVpZ2h0ID0gdGhpcy5jb21iby5pdGVtSGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtpdGVtSGVpZ2h0XT0nMzInPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpdGVtSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVtSGVpZ2h0ID09PSBudWxsIHx8IHRoaXMuX2l0ZW1IZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEl0ZW1IZWlnaHRzW3RoaXMuZGlzcGxheURlbnNpdHldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtSGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaXRlbUhlaWdodCh2YWw6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9pdGVtSGVpZ2h0ID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGZvciB0aGUgY29tYm8gdmFsdWUgZmllbGRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1BsYWNlaG9sZGVyID0gdGhpcy5jb21iby5wbGFjZWhvbGRlcjtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbcGxhY2Vob2xkZXJdPSduZXdQbGFjZUhvbGRlcic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnZhbHVlICYmICF0aGlzLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGZvciB0aGUgY29tYm8gZHJvcGRvd24gc2VhcmNoIGZpZWxkXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15Q29tYm9TZWFyY2hQbGFjZWhvbGRlciA9IHRoaXMuY29tYm8uc2VhcmNoUGxhY2Vob2xkZXI7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW3NlYXJjaFBsYWNlaG9sZGVyXT0nbmV3UGxhY2VIb2xkZXInPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaFBsYWNlaG9sZGVyID0gJ0VudGVyIGEgU2VhcmNoIFRlcm0nO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBjYXNlU2Vuc2l0aXZlIGljb24gc2hvdWxkIGJlIHNob3duIGluIHRoZSBzZWFyY2ggaW5wdXRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1Nob3dTZWFyY2hDYXNlSWNvbiA9IHRoaXMuY29tYm8uc2hvd1NlYXJjaENhc2VJY29uO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtzaG93U2VhcmNoQ2FzZUljb25dPSd0cnVlJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dTZWFyY2hDYXNlSWNvbiA9IGZhbHNlO1xuXG5cbiAgICAvKipcbiAgICAgKiBDb21ibyBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbZGF0YV09J2l0ZW1zJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgcHVibGljIHNldCBkYXRhKHZhbDogYW55W10gfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSAodmFsKSA/IHZhbCA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbWJvIHZhbHVlIGRhdGEgc291cmNlIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvVmFsdWVLZXkgPSB0aGlzLmNvbWJvLnZhbHVlS2V5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFt2YWx1ZUtleV09J215S2V5Jz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUtleTogc3RyaW5nID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkaXNwbGF5S2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlLZXkgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tYm8gdGV4dCBkYXRhIHNvdXJjZSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0Rpc3BsYXlLZXkgPSB0aGlzLmNvbWJvLmRpc3BsYXlLZXk7XG4gICAgICpcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLmRpc3BsYXlLZXkgPSAndmFsJztcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtkaXNwbGF5S2V5XT0nbXlEaXNwbGF5S2V5Jz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3BsYXlLZXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwbGF5S2V5ID8gdGhpcy5fZGlzcGxheUtleSA6IHRoaXMudmFsdWVLZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGl0ZW0gcHJvcGVydHkgYnkgd2hpY2ggaXRlbXMgc2hvdWxkIGJlIGdyb3VwZWQgaW5zaWRlIHRoZSBpdGVtcyBsaXN0LiBOb3QgdXNhYmxlIGlmIGRhdGEgaXMgbm90IG9mIHR5cGUgT2JqZWN0W10uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2dyb3VwS2V5XT0nbmV3R3JvdXBLZXknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBncm91cEtleSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9ncm91cEtleSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBwcm9wZXJ0eSBieSB3aGljaCBpdGVtcyBzaG91bGQgYmUgZ3JvdXBlZCBpbnNpZGUgdGhlIGl0ZW1zIGxpc3QuIE5vdCB1c2FibGUgaWYgZGF0YSBpcyBub3Qgb2YgdHlwZSBPYmplY3RbXS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgY3VycmVudEdyb3VwS2V5ID0gdGhpcy5jb21iby5ncm91cEtleTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdyb3VwS2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cEtleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBlbmFibGVkL2Rpc2FibGVzIGZpbHRlcmluZyBpbiB0aGUgbGlzdC4gVGhlIGRlZmF1bHQgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtmaWx0ZXJhYmxlXT1cImZhbHNlXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZmlsdGVyYWJsZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGdyb3VwcyBzb3J0aW5nIG9yZGVyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbZ3JvdXBTb3J0aW5nRGlyZWN0aW9uXT1cImdyb3VwU29ydGluZ0RpcmVjdGlvblwiPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBwdWJsaWMgZ3JvdXBTb3J0aW5nRGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Bc2M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGdyb3VwU29ydGluZ0RpcmVjdGlvbigpOiBTb3J0aW5nRGlyZWN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwU29ydGluZ0RpcmVjdGlvbjtcbiAgICB9XG4gICAgcHVibGljIHNldCBncm91cFNvcnRpbmdEaXJlY3Rpb24odmFsOiBTb3J0aW5nRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2dyb3VwU29ydGluZ0RpcmVjdGlvbiA9IHZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXQgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFthcmlhTGFiZWxsZWRCeV09XCInbGFiZWwxJ1wiPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWxsZWRieScpXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBlbmFibGVkL2Rpc2FibGVzIGNvbWJvLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtkaXNhYmxlZF09XCIndHJ1ZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBob3cgdGhlIGNvbWJvIHdpbGwgYmUgc3R5bGVkLlxuICAgICAqIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgYGxpbmVgLCBgYm94YCwgYGJvcmRlcmAgYW5kIGBzZWFyY2hgLiBUaGUgZGVmYXVsdCBpcyBgYm94YC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbdHlwZV09XCInbGluZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBJZ3hJbnB1dEdyb3VwVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlIHx8IHRoaXMuX2lucHV0R3JvdXBUeXBlIHx8ICdib3gnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdHlwZSh2YWw6IElneElucHV0R3JvdXBUeXBlKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIGNvbWJvJ3Mgc2VhcmNoIGJveFxuICAgICAqIHNob3VsZCBiZSBmb2N1c2VkIGFmdGVyIHRoZSBgb3BlbmVkYCBldmVudCBpcyBjYWxsZWRcbiAgICAgKiBXaGVuIGBmYWxzZWAsIHRoZSBjb21ibydzIGxpc3QgaXRlbSBjb250YWluZXIgd2lsbCBiZSBmb2N1c2VkIGluc3RlYWRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvRm9jdXNTZWFyY2ggPSB0cnVlO1xuXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25JdGVtQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZHJvcGRvd25Db250YWluZXI6IEVsZW1lbnRSZWYgPSBudWxsO1xuXG4gICAgQFZpZXdDaGlsZCgncHJpbWl0aXZlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIHByaW1pdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29tcGxleCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjb21wbGV4VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKElneEZvck9mRGlyZWN0aXZlLCB7IHJlYWQ6IElneEZvck9mRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgdmlydERpcjogSWd4Rm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCB2YWxpZCA9IHRoaXMuY29tYm8udmFsaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBJZ3hDb21ib1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8udmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOVkFMSUQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWxpZCh2YWxpZDogSWd4Q29tYm9TdGF0ZSkge1xuICAgICAgICB0aGlzLl92YWxpZCA9IHZhbGlkO1xuICAgICAgICB0aGlzLmNvbWJvSW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlW0lneENvbWJvU3RhdGVbdmFsaWRdXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VhcmNoVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VhcmNoVmFsdWUodmFsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbDtcbiAgICAgICAgdGhpcy5fc2VhcmNoVmFsdWUgPSB2YWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGN1c3RvbVZhbHVlRmxhZyA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVmYXVsdEZhbGxiYWNrR3JvdXAgPSAnT3RoZXInO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcmluZ09wdGlvbnM6IElDb21ib0ZpbHRlcmluZ09wdGlvbnMgPSB7XG4gICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlXG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdMb2dpYyA9IEZpbHRlcmluZ0xvZ2ljLk9yO1xuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmaWx0ZXJWYWx1ZSA9ICcnO1xuXG4gICAgcHJvdGVjdGVkIHN0cmluZ0ZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kO1xuICAgIHByb3RlY3RlZCBib29sZWFuRmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kO1xuICAgIHByb3RlY3RlZCBfZ3JvdXBLZXkgPSAnJztcbiAgICBwcm90ZWN0ZWQgX2Rpc3BsYXlLZXk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX3ByZXZJbnB1dFZhbHVlID0gJyc7XG5cbiAgICBwcml2YXRlIF9kYXRhVHlwZSA9ICcnO1xuICAgIHByaXZhdGUgX3NlYXJjaFZhbHVlID0gJyc7XG4gICAgcHJpdmF0ZSBfdHlwZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBuZ0NvbnRyb2w6IE5nQ29udHJvbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIF9kYXRhID0gW107XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhID0gW107XG4gICAgcHJpdmF0ZSBfaXRlbUhlaWdodCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfaXRlbXNNYXhIZWlnaHQgPSBudWxsO1xuICAgIHByaXZhdGUgX3JlbW90ZVNlbGVjdGlvbiA9IHt9O1xuICAgIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcml2YXRlIF9vdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncztcbiAgICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuICAgIHByaXZhdGUgX3ZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgIHByaXZhdGUgX2dyb3VwU29ydGluZ0RpcmVjdGlvbjogU29ydGluZ0RpcmVjdGlvbiA9IFNvcnRpbmdEaXJlY3Rpb24uQXNjO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHNlbGVjdGlvbjogSWd4U2VsZWN0aW9uQVBJU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGNvbWJvQVBJOiBJZ3hDb21ib0FQSVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2ljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfSU5QVVRfR1JPVVBfVFlQRSkgcHJpdmF0ZSBfaW5wdXRHcm91cFR5cGU6IElneElucHV0R3JvdXBUeXBlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY29tYm9BUEkucmVnaXN0ZXIodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLkFycm93RG93bicsIFsnJGV2ZW50J10pXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5BbHQuQXJyb3dEb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25BcnJvd0Rvd24oZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbklucHV0Q2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2aXJ0dWFsaXplZCBkYXRhLiBJdCBjb250YWlucyBgc3RhcnRJbmRleGAgYW5kIGBjaHVua1NpemVgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IHN0YXRlID0gdGhpcy5jb21iby52aXJ0dWFsaXphdGlvblN0YXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlydHVhbGl6YXRpb25TdGF0ZSgpOiBJRm9yT2ZTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpcnREaXIuc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpcnR1YWxpemVkIGRhdGEuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gc2V0XG4gICAgICogdGhpcy5jb21iby52aXJ0dWFsaXphdGlvblN0YXRlKHN0YXRlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGU6IElGb3JPZlN0YXRlKSB7XG4gICAgICAgIHRoaXMudmlydERpci5zdGF0ZSA9IHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdG90YWwgY291bnQgb2YgdGhlIHZpcnR1YWwgZGF0YSBpdGVtcywgd2hlbiB1c2luZyByZW1vdGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgY291bnQgPSB0aGlzLmNvbWJvLnRvdGFsSXRlbUNvdW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxJdGVtQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlydERpci50b3RhbEl0ZW1Db3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0b3RhbCBjb3VudCBvZiB0aGUgdmlydHVhbCBkYXRhIGl0ZW1zLCB3aGVuIHVzaW5nIHJlbW90ZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8udG90YWxJdGVtQ291bnQocmVtb3RlU2VydmljZS5jb3VudCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCB0b3RhbEl0ZW1Db3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudmlydERpci50b3RhbEl0ZW1Db3VudCA9IGNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgY29tYm8gaW5wdXRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgY29tYm9WYWx1ZSA9IHRoaXMuY29tYm8udmFsdWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmVkRGF0YSgpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlID8gdGhpcy5fZmlsdGVyZWREYXRhIDogdGhpcy5kYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJlZERhdGEodmFsOiBhbnlbXSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gdGhpcy5ncm91cEtleSA/ICh2YWwgfHwgW10pLmZpbHRlcigoZSkgPT4gZS5pc0hlYWRlciAhPT0gdHJ1ZSkgOiB2YWw7XG4gICAgICAgIHRoaXMuY2hlY2tNYXRjaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGV2ZW50LmtleSA9PT0gJ0Rvd24nKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmZvY3VzZWRJdGVtID0gdGhpcy5kcm9wZG93bi5pdGVtc1swXTtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db250YWluZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgfHwgZXZlbnQua2V5ID09PSAnRXNjJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2ZW50LmtleSA9PT0gJ1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlSW5wdXRDaGFuZ2UoZXZlbnQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3M6IElDb21ib1NlYXJjaElucHV0RXZlbnRBcmdzID0ge1xuICAgICAgICAgICAgICAgIHNlYXJjaFRleHQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0VXBkYXRlLmVtaXQoYXJncyk7XG4gICAgICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrTWF0Y2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlcy5DT01QTEVYO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEYXRhVHlwZXMuUFJJTUlUSVZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1JlbW90ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxJdGVtQ291bnQgPiAwICYmXG4gICAgICAgICAgICB0aGlzLnZhbHVlS2V5ICYmXG4gICAgICAgICAgICB0aGlzLmRhdGFUeXBlID09PSBEYXRhVHlwZXMuQ09NUExFWDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBzcGVjaWZpZWQgaXRlbUlEIGlzIHNlbGVjdGVkXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaXNfaXRlbV9zZWxlY3RlZCh0aGlzLmlkLCBpdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBjb21ibyB2aWV3XG4gICAgICovXG4gICAgcHVibGljIHRyaWdnZXJDaGVjaygpIHtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzQWRkQnV0dG9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiBhIGJvb2xlYW4gdmFsdWUuIElmIHRoaXMuc2VhcmNoVmFsdWUgd2FzICcnLCBpdCByZXR1cm5zICcnIGluc3RlYWQgb2YgZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFZhbHVlICE9PSAnJyAmJiB0aGlzLmN1c3RvbVZhbHVlRmxhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVTZWxlY3RBbGwoZXZ0KSB7XG4gICAgICAgIGlmIChldnQuY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxJdGVtcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRJdGVtVG9Db2xsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuc2VhcmNoVmFsdWUudHJpbSgpO1xuICAgICAgICBjb25zdCBhZGRlZEl0ZW0gPSB0aGlzLmRpc3BsYXlLZXkgPyB7XG4gICAgICAgICAgICBbdGhpcy52YWx1ZUtleV06IG5ld1ZhbHVlLFxuICAgICAgICAgICAgW3RoaXMuZGlzcGxheUtleV06IG5ld1ZhbHVlXG4gICAgICAgIH0gOiBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBLZXkpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWRkZWRJdGVtLCB7IFt0aGlzLmdyb3VwS2V5XTogdGhpcy5kZWZhdWx0RmFsbGJhY2tHcm91cCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHBvc2Ugc2hhbGxvdyBjb3B5IGluc3RlYWQgb2YgdGhpcy5kYXRhIGluIGV2ZW50IGFyZ3Mgc28gdGhpcy5kYXRhIGNhbid0IGJlIG11dGF0ZWRcbiAgICAgICAgY29uc3Qgb2xkQ29sbGVjdGlvbiA9IFsuLi50aGlzLmRhdGFdO1xuICAgICAgICBjb25zdCBuZXdDb2xsZWN0aW9uID0gWy4uLnRoaXMuZGF0YSwgYWRkZWRJdGVtXTtcbiAgICAgICAgY29uc3QgYXJnczogSUNvbWJvSXRlbUFkZGl0aW9uRXZlbnQgPSB7XG4gICAgICAgICAgICBvbGRDb2xsZWN0aW9uLCBhZGRlZEl0ZW0sIG5ld0NvbGxlY3Rpb24sIG93bmVyOiB0aGlzLCBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkaXRpb24uZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhLnB1c2goYXJncy5hZGRlZEl0ZW0pO1xuICAgICAgICAvLyB0cmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICB0aGlzLmRhdGEgPSBjbG9uZUFycmF5KHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbXModGhpcy52YWx1ZUtleSAhPT0gbnVsbCAmJiB0aGlzLnZhbHVlS2V5ICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgW2FyZ3MuYWRkZWRJdGVtW3RoaXMudmFsdWVLZXldXSA6IFthcmdzLmFkZGVkSXRlbV0sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdXN0b21WYWx1ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuZHJvcGRvd24uZm9jdXNlZEl0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLnZpcnREaXIuc2Nyb2xsVG8oMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNTZWFyY2hJbnB1dChvcGVuaW5nPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5U2VhcmNoSW5wdXQgJiYgdGhpcy5zZWFyY2hJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob3BlbmluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25Db250YWluZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJvSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCAmJiB0aGlzLm5nQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IElneENvbWJvU3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IElneENvbWJvU3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuX2luamVjdG9yLmdldDxOZ0NvbnRyb2w+KE5nQ29udHJvbCwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRFbGVtZW50LFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlRnJvbU91dHNpZGVDbGljazogW3RhcmdldEVsZW1lbnQgYXMgSFRNTEVsZW1lbnRdXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldCh0aGlzLmlkLCBuZXcgU2V0KCkpO1xuICAgICAgICB0aGlzLl9pY29uU2VydmljZS5hZGRTdmdJY29uRnJvbVRleHQoY2FzZVNlbnNpdGl2ZS5uYW1lLCBjYXNlU2Vuc2l0aXZlLnZhbHVlLCAnaW14LWljb25zJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlydERpci5jaHVua1ByZWxvYWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZTogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZvck9mU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBlLCB7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJlTG9hZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmNvbWJvQVBJLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKHRoaXMuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICAgICAgY29uc3Qgb2xkU2VsZWN0aW9uID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdF9pdGVtcyh0aGlzLmlkLCBzZWxlY3Rpb24sIHRydWUpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmNyZWF0ZURpc3BsYXlUZXh0KHRoaXMuc2VsZWN0ZWRJdGVtcygpLCBvbGRTZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldEVkaXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tYm9JbnB1dC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgdGhpcy5fZGF0YVR5cGUgPSB0aGlzLmRhdGFUeXBlO1xuICAgICAgICBpZiAodGhpcy5pdGVtVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1UZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGF0YVR5cGUgPT09IERhdGFUeXBlcy5DT01QTEVYKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV4VGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZUNsZWFySXRlbXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXNlbGVjdEFsbEl0ZW1zKHRydWUsIGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdldEVkaXRFbGVtZW50KCkuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTZWFyY2hJbnB1dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZCB0aGF0IG9wZW5zL2Nsb3NlcyB0aGUgY29tYm8uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiAoY2xpY2spPVwiY29tYm8udG9nZ2xlKClcIj5Ub2dnbGUgQ29tYm88L2J1dHRvbj5cbiAgICAgKiA8aWd4LWNvbWJvICNjb21ibz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9vdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi50b2dnbGUob3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZCB0aGF0IG9wZW5zIHRoZSBjb21iby5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8YnV0dG9uIChjbGljayk9XCJjb21iby5vcGVuKClcIj5PcGVuIENvbWJvPC9idXR0b24+XG4gICAgICogPGlneC1jb21ibyAjY29tYm8+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX292ZXJsYXlTZXR0aW5ncywgdGhpcy5vdmVybGF5U2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmRyb3Bkb3duLm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIG1ldGhvZCB0aGF0IGNsb3NlcyB0aGUgY29tYm8uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiAoY2xpY2spPVwiY29tYm8uY2xvc2UoKVwiPkNsb3NlIENvbWJvPC9idXR0b24+XG4gICAgICogPGlneC1jb21ibyAjY29tYm8+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBkcm9wIGRvd24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN0YXRlID0gdGhpcy5jb21iby5jb2xsYXBzZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBzZWxlY3Rpb24gc3RhdGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIHNlbGVjdGVkIGl0ZW1zXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzZWxlY3RlZEl0ZW1zID0gdGhpcy5jb21iby5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkSXRlbXMoKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvbi5nZXQodGhpcy5pZCkpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IGRlZmluZWQgaXRlbXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdJdGVtcyBuZXcgaXRlbXMgdG8gYmUgc2VsZWN0ZWRcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXIgcHJldmlvdXMgc2VsZWN0ZWQgaXRlbXNcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb21iby5zZWxlY3RJdGVtcyhbXCJOZXcgWW9ya1wiLCBcIk5ldyBKZXJzZXlcIl0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtcyhuZXdJdGVtczogQXJyYXk8YW55PiwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBpZiAobmV3SXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmFkZF9pdGVtcyh0aGlzLmlkLCBuZXdJdGVtcywgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKG5ld1NlbGVjdGlvbiwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3QgZGVmaW5lZCBpdGVtc1xuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIGl0ZW1zIHRvIGRlc2VsZWN0ZWRcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb21iby5kZXNlbGVjdEl0ZW1zKFtcIk5ldyBZb3JrXCIsIFwiTmV3IEplcnNleVwiXSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0SXRlbXMoaXRlbXM6IEFycmF5PGFueT4sIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgaWYgKGl0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5kZWxldGVfaXRlbXModGhpcy5pZCwgaXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgYWxsIChmaWx0ZXJlZCkgaXRlbXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXIgaWYgc2V0IHRvIHRydWUsIHNlbGVjdHMgYWxsIGl0ZW1zLCBvdGhlcndpc2Ugc2VsZWN0cyBvbmx5IHRoZSBmaWx0ZXJlZCBvbmVzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbWJvLnNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbEl0ZW1zKGlnbm9yZUZpbHRlcj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgYWxsVmlzaWJsZSA9IHRoaXMuc2VsZWN0aW9uLmdldF9hbGxfaWRzKGlnbm9yZUZpbHRlciA/IHRoaXMuZGF0YSA6IHRoaXMuZmlsdGVyZWREYXRhLCB0aGlzLnZhbHVlS2V5KTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uYWRkX2l0ZW1zKHRoaXMuaWQsIGFsbFZpc2libGUpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBhbGwgKGZpbHRlcmVkKSBpdGVtc1xuICAgICAqXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlciBpZiBzZXQgdG8gdHJ1ZSwgZGVzZWxlY3RzIGFsbCBpdGVtcywgb3RoZXJ3aXNlIGRlc2VsZWN0cyBvbmx5IHRoZSBmaWx0ZXJlZCBvbmVzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbWJvLmRlc2VsZWN0QWxsSXRlbXMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGxJdGVtcyhpZ25vcmVGaWx0ZXI/OiBib29sZWFuLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGxldCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5nZXRfZW1wdHkoKTtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCAhPT0gdGhpcy5kYXRhLmxlbmd0aCAmJiAhaWdub3JlRmlsdGVyKSB7XG4gICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbi5kZWxldGVfaXRlbXModGhpcy5pZCwgdGhpcy5zZWxlY3Rpb24uZ2V0X2FsbF9pZHModGhpcy5maWx0ZXJlZERhdGEsIHRoaXMudmFsdWVLZXkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIGV2ZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzL0Rlc2VsZWN0cyBhIHNpbmdsZSBpdGVtXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbUlEIHRoZSBpdGVtSUQgb2YgdGhlIHNwZWNpZmljIGl0ZW1cbiAgICAgKiBAcGFyYW0gc2VsZWN0IElmIHRoZSBpdGVtIHNob3VsZCBiZSBzZWxlY3RlZCAodHJ1ZSkgb3IgZGVzZWxlY3RlZCAoZmFsc2UpXG4gICAgICpcbiAgICAgKiBXaXRob3V0IHNwZWNpZmllZCB2YWx1ZUtleTtcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb21iby52YWx1ZUtleSA9IG51bGw7XG4gICAgICogY29uc3QgaXRlbXM6IHsgZmllbGQ6IHN0cmluZywgcmVnaW9uOiBzdHJpbmd9W10gPSBkYXRhO1xuICAgICAqIHRoaXMuY29tYm8uc2V0U2VsZWN0ZWRJdGVtKGl0ZW1zWzBdLCB0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBXaXRoIHNwZWNpZmllZCB2YWx1ZUtleTtcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb21iby52YWx1ZUtleSA9ICdmaWVsZCc7XG4gICAgICogY29uc3QgaXRlbXM6IHsgZmllbGQ6IHN0cmluZywgcmVnaW9uOiBzdHJpbmd9W10gPSBkYXRhO1xuICAgICAqIHRoaXMuY29tYm8uc2V0U2VsZWN0ZWRJdGVtKCdDb25uZWN0aWN1dCcsIHRydWUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTZWxlY3RlZEl0ZW0oaXRlbUlEOiBhbnksIHNlbGVjdCA9IHRydWUsIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGl0ZW1JRCA9PT0gbnVsbCB8fCBpdGVtSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2l0ZW1JRF0sIGZhbHNlLCBldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0SXRlbXMoW2l0ZW1JRF0sIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyc1xuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVPcGVuaW5nKGU6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJnczogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIGV2ZW50OiBlLmV2ZW50LCBjYW5jZWw6IGUuY2FuY2VsIH07XG4gICAgICAgIHRoaXMub3BlbmluZy5lbWl0KGFyZ3MpO1xuICAgICAgICBlLmNhbmNlbCA9IGFyZ3MuY2FuY2VsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZU9wZW5lZCgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ2hlY2soKTtcblxuICAgICAgICAvLyBEaXNhYmxpbmcgZm9jdXMgb2YgdGhlIHNlYXJjaCBpbnB1dCBzaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBkcm9wIGRvd24gb3BlbnMuXG4gICAgICAgIC8vIER1cmluZyBrZXlib2FyZCBuYXZpZ2F0aW9uIGlucHV0IHNob3VsZCByZWNlaXZlIGZvY3VzLCBldmVuIHRoZSBhdXRvRm9jdXNTZWFyY2ggaXMgZGlzYWJsZWQuXG4gICAgICAgIC8vIFRoYXQgaXMgd2h5IGluIHN1Y2ggY2FzZXMgZm9jdXNpbmcgb2YgdGhlIGRyb3Bkb3duQ29udGFpbmVyIGhhcHBlbnMgb3V0c2lkZSBmb2N1c1NlYXJjaElucHV0IG1ldGhvZC5cbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoSW5wdXQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlQ2xvc2luZyhlOiBJQmFzZUNhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzKSB7XG4gICAgICAgIGNvbnN0IGFyZ3M6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MgPSB7IG93bmVyOiB0aGlzLCBldmVudDogZS5ldmVudCwgY2FuY2VsOiBlLmNhbmNlbCB9O1xuICAgICAgICB0aGlzLmNsb3NpbmcuZW1pdChhcmdzKTtcbiAgICAgICAgZS5jYW5jZWwgPSBhcmdzLmNhbmNlbDtcbiAgICAgICAgaWYgKGUuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLmNvbWJvSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZUNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCh7IG93bmVyOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNhc2VTZW5zaXRpdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nT3B0aW9ucyA9IHsgY2FzZVNlbnNpdGl2ZTogIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy5jYXNlU2Vuc2l0aXZlIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb246IFNldDxhbnk+LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmSW5TZXRzKHRoaXMuc2VsZWN0aW9uLmdldCh0aGlzLmlkKSwgbmV3U2VsZWN0aW9uKTtcbiAgICAgICAgY29uc3QgYWRkZWQgPSBkaWZmSW5TZXRzKG5ld1NlbGVjdGlvbiwgdGhpcy5zZWxlY3Rpb24uZ2V0KHRoaXMuaWQpKTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uQXNBcnJheSA9IEFycmF5LmZyb20obmV3U2VsZWN0aW9uKTtcbiAgICAgICAgY29uc3Qgb2xkU2VsZWN0aW9uQXNBcnJheSA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb24uZ2V0KHRoaXMuaWQpIHx8IFtdKTtcbiAgICAgICAgY29uc3QgZGlzcGxheVRleHQgPSB0aGlzLmNyZWF0ZURpc3BsYXlUZXh0KG5ld1NlbGVjdGlvbkFzQXJyYXksIG9sZFNlbGVjdGlvbkFzQXJyYXkpO1xuICAgICAgICBjb25zdCBhcmdzOiBJQ29tYm9TZWxlY3Rpb25DaGFuZ2luZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbjogbmV3U2VsZWN0aW9uQXNBcnJheSxcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogb2xkU2VsZWN0aW9uQXNBcnJheSxcbiAgICAgICAgICAgIGFkZGVkLFxuICAgICAgICAgICAgcmVtb3ZlZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBkaXNwbGF5VGV4dCxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RfaXRlbXModGhpcy5pZCwgYXJncy5uZXdTZWxlY3Rpb24sIHRydWUpO1xuICAgICAgICAgICAgaWYgKGRpc3BsYXlUZXh0ICE9PSBhcmdzLmRpc3BsYXlUZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBhcmdzLmRpc3BsYXlUZXh0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuY3JlYXRlRGlzcGxheVRleHQoYXJncy5uZXdTZWxlY3Rpb24sIGFyZ3Mub2xkU2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soYXJncy5uZXdTZWxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLm5nQ29udHJvbC5jb250cm9sLnRvdWNoZWQgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSkgJiZcbiAgICAgICAgICAgICh0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmFzeW5jVmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCB8fCB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMubmdDb250cm9sLmludmFsaWQgPyBJZ3hDb21ib1N0YXRlLklOVkFMSUQgOiBJZ3hDb21ib1N0YXRlLlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCA/IElneENvbWJvU3RhdGUuSU5WQUxJRCA6IElneENvbWJvU3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEIuUC4gMTggTWF5IDIwMjE6IElneERhdGVQaWNrZXIgZG9lcyBub3QgcmVzZXQgaXRzIHN0YXRlIHVwb24gcmVzZXRGb3JtICM5NTI2XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgbWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAvLyBSdW4gdGhlIHZhbGlkYXRpb24gd2l0aCBlbXB0eSBvYmplY3QgdG8gY2hlY2sgaWYgcmVxdWlyZWQgaXMgZW5hYmxlZC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3Ioe30gYXMgQWJzdHJhY3RDb250cm9sKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQ29udGFpbnMga2V5LXZhbHVlIHBhaXJzIG9mIHRoZSBzZWxlY3RlZCB2YWx1ZUtleXMgYW5kIHRoZWlyIHJlc3AuIGRpc3BsYXlLZXlzICovXG4gICAgcHJpdmF0ZSByZWdpc3RlclJlbW90ZUVudHJpZXMoaWRzOiBhbnlbXSwgYWRkID0gdHJ1ZSkge1xuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFZhbHVlRGlzcGxheVBhaXJzKGlkcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW90ZVNlbGVjdGlvbltlbnRyeVt0aGlzLnZhbHVlS2V5XV0gPSBlbnRyeVt0aGlzLmRpc3BsYXlLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VudHJ5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBgaWQ6IGFueVtdYCByZXR1cm5zIGEgbWFwcGVkIGB7IFtjb21iby52YWx1ZUtleV06IGFueSwgW2NvbWJvLmRpc3BsYXlLZXldOiBhbnkgfVtdYFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0VmFsdWVEaXNwbGF5UGFpcnMoaWRzOiBhbnlbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmZpbHRlcihlbnRyeSA9PiBpZHMuaW5kZXhPZihlbnRyeVt0aGlzLnZhbHVlS2V5XSkgPiAtMSkubWFwKGUgPT4gKHtcbiAgICAgICAgICAgIFt0aGlzLnZhbHVlS2V5XTogZVt0aGlzLnZhbHVlS2V5XSxcbiAgICAgICAgICAgIFt0aGlzLmRpc3BsYXlLZXldOiBlW3RoaXMuZGlzcGxheUtleV1cbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tNYXRjaCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlzcGxheUtleSA9IHRoaXMuZGlzcGxheUtleTtcbiAgICAgICAgY29uc3QgbWF0Y2hGbiA9IChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRpc3BsYXlLZXkgPyBlW2Rpc3BsYXlLZXldIDogZTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VhcmNoVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGl0ZW1NYXRjaCA9IHRoaXMuZmlsdGVyZWREYXRhLnNvbWUobWF0Y2hGbik7XG4gICAgICAgIHRoaXMuY3VzdG9tVmFsdWVGbGFnID0gdGhpcy5hbGxvd0N1c3RvbVZhbHVlcyAmJiAhaXRlbU1hdGNoO1xuICAgIH1cblxuICAgIC8qKiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHBvcHVsYXRlZCBpbiB0aGUgY29tYm8ncyB0ZXh0IGJveCAqL1xuICAgIHByaXZhdGUgY29uY2F0RGlzcGxheVRleHQoc2VsZWN0aW9uOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kaXNwbGF5S2V5ICE9PSBudWxsICYmIHRoaXMuZGlzcGxheUtleSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuY29udmVydEtleXNUb0l0ZW1zKHNlbGVjdGlvbikubWFwKGVudHJ5ID0+IGVudHJ5W3RoaXMuZGlzcGxheUtleV0pLmpvaW4oJywgJykgOlxuICAgICAgICAgICAgc2VsZWN0aW9uLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIHRoZSBjb21ibyBkaXNwbGF5IHZhbHVlXG4gICAgICogSWYgcmVtb3RlLCBjYWNoZXMgdGhlIGtleSBkaXNwbGF5VGV4dFxuICAgICAqIElmIG5vdCwganVzdCBjb21iaW5lIHRoZSBvYmplY3QuZGlzcGxheUtleXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURpc3BsYXlUZXh0KG5ld1NlbGVjdGlvbjogYW55W10sIG9sZFNlbGVjdGlvbjogYW55W10pIHtcbiAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgIGlmICh0aGlzLmlzUmVtb3RlKSB7XG4gICAgICAgICAgICBpZiAobmV3U2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IG9sZFNlbGVjdGlvbi5maWx0ZXIoZSA9PiBuZXdTZWxlY3Rpb24uaW5kZXhPZihlKSA8IDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBuZXdTZWxlY3Rpb24uZmlsdGVyKGUgPT4gb2xkU2VsZWN0aW9uLmluZGV4T2YoZSkgPCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyUmVtb3RlRW50cmllcyhhZGRlZEl0ZW1zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyUmVtb3RlRW50cmllcyhyZW1vdmVkSXRlbXMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IE9iamVjdC5rZXlzKHRoaXMuX3JlbW90ZVNlbGVjdGlvbikubWFwKGUgPT4gdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VdKS5qb2luKCcsICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZXcgc2VsZWN0aW9uIGlzIGVtcHR5LCBjbGVhciBhbGwgaXRlbXNcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyUmVtb3RlRW50cmllcyhvbGRTZWxlY3Rpb24sIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb25jYXREaXNwbGF5VGV4dChuZXdTZWxlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogaWYgdGhlcmUgaXMgYSB2YWx1ZUtleSAtIG1hcCB0aGUga2V5cyB0byBkYXRhIGl0ZW1zLCBlbHNlIC0ganVzdCByZXR1cm4gdGhlIGtleXMgKi9cbiAgICBwcml2YXRlIGNvbnZlcnRLZXlzVG9JdGVtcyhrZXlzOiBhbnlbXSkge1xuICAgICAgICBpZiAodGhpcy5jb21ib0FQSS52YWx1ZUtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFwIGtleXMgdnMuIGZpbHRlciBkYXRhIHRvIHJldGFpbiB0aGUgb3JkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4gdGhpcy5kYXRhLmZpbmQoZW50cnkgPT4gZW50cnlbdGhpcy52YWx1ZUtleV0gPT09IGtleSkpLmZpbHRlcihlID0+IGUgIT09IHVuZGVmaW5lZCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgSWd4Q29tYm9BZGRJdGVtQ29tcG9uZW50LFxuICAgICAgICBJZ3hDb21ib0FkZEl0ZW1EaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvQ2xlYXJJY29uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0NvbXBvbmVudCxcbiAgICAgICAgSWd4Q29tYm9Ecm9wRG93bkNvbXBvbmVudCxcbiAgICAgICAgSWd4Q29tYm9FbXB0eURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9GaWx0ZXJpbmdQaXBlLFxuICAgICAgICBJZ3hDb21ib0Zvb3RlckRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Hcm91cGluZ1BpcGUsXG4gICAgICAgIElneENvbWJvSGVhZGVyRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0hlYWRlckl0ZW1EaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvSXRlbUNvbXBvbmVudCxcbiAgICAgICAgSWd4Q29tYm9JdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib1RvZ2dsZUljb25EaXJlY3RpdmVcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0NsZWFySWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvRW1wdHlEaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvRm9vdGVyRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0l0ZW1EaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvVG9nZ2xlSWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4SW5wdXRHcm91cE1vZHVsZVxuICAgIF0sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBJZ3hCdXR0b25Nb2R1bGUsXG4gICAgICAgIElneENoZWNrYm94TW9kdWxlLFxuICAgICAgICBJZ3hEcm9wRG93bk1vZHVsZSxcbiAgICAgICAgSWd4Rm9yT2ZNb2R1bGUsXG4gICAgICAgIElneEljb25Nb2R1bGUsXG4gICAgICAgIElneElucHV0R3JvdXBNb2R1bGUsXG4gICAgICAgIElneFJpcHBsZU1vZHVsZSxcbiAgICAgICAgSWd4VG9nZ2xlTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hDb21ib01vZHVsZSB7IH1cbiIsIjxpZ3gtaW5wdXQtZ3JvdXAgI2lucHV0R3JvdXAgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgW3R5cGVdPVwidHlwZVwiIChjbGljayk9XCJvbklucHV0Q2xpY2soJGV2ZW50KVwiPlxuICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJbaWd4TGFiZWxdXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1wcmVmaXhcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXByZWZpeFwiPjwvbmctY29udGVudD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiaWd4LWhpbnQsIFtpZ3hIaW50XVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtaGludCwgW2lneEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxpbnB1dCBpZ3hJbnB1dCAjY29tYm9JbnB1dCBuYW1lPVwiY29tYm9JbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInZhbHVlXCIgcmVhZG9ubHkgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoYmx1cik9XCJvbkJsdXIoKVwiIC8+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1zdWZmaXhcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXN1ZmZpeFwiPjwvbmctY29udGVudD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlLmxlbmd0aFwiIGFyaWEtbGFiZWw9XCJDbGVhciBTZWxlY3Rpb25cIiBjbGFzcz1cImlneC1jb21ib19fY2xlYXItYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsZWFySXRlbXMoJGV2ZW50KVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2xlYXJJY29uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbGVhckljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiIWNsZWFySWNvblRlbXBsYXRlXCI+XG4gICAgICAgICAgICBjbGVhclxuICAgICAgICA8L2lneC1pY29uPlxuICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8aWd4LXN1ZmZpeCBjbGFzcz1cImlneC1jb21ib19fdG9nZ2xlLWJ1dHRvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG9nZ2xlSWNvblRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9nZ2xlSWNvblRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiB0aGlzLmNvbGxhcHNlZH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxpZ3gtaWNvbiAqbmdJZj1cIiF0b2dnbGVJY29uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIHt7IGRyb3Bkb3duLmNvbGxhcHNlZCA/ICdhcnJvd19kcm9wX2Rvd24nIDogJ2Fycm93X2Ryb3BfdXAnfX1cbiAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICA8L2lneC1zdWZmaXg+XG48L2lneC1pbnB1dC1ncm91cD5cbjxpZ3gtY29tYm8tZHJvcC1kb3duICNpZ3hDb21ib0Ryb3BEb3duIGNsYXNzPVwiaWd4LWNvbWJvX19kcm9wLWRvd25cIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgIFt3aWR0aF09XCJpdGVtc1dpZHRoIHx8ICcxMDAlJ1wiIChvcGVuaW5nKT1cImhhbmRsZU9wZW5pbmcoJGV2ZW50KVwiIChjbG9zaW5nKT1cImhhbmRsZUNsb3NpbmcoJGV2ZW50KVwiXG4gICAgKG9wZW5lZCk9XCJoYW5kbGVPcGVuZWQoKVwiIChjbG9zZWQpPVwiaGFuZGxlQ2xvc2VkKClcIj5cbiAgICA8aWd4LWlucHV0LWdyb3VwICpuZ0lmPVwiZGlzcGxheVNlYXJjaElucHV0XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgdGhlbWU9XCJtYXRlcmlhbFwiIGNsYXNzPVwiaWd4LWNvbWJvX19zZWFyY2hcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiaWd4LWNvbWJvLWlucHV0XCIgaWd4SW5wdXQgI3NlYXJjaElucHV0IG5hbWU9XCJzZWFyY2hJbnB1dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCIgKGtleXVwKT1cImhhbmRsZUtleVVwKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCIgKGZvY3VzKT1cImRyb3Bkb3duLm9uQmx1cigkZXZlbnQpXCIgW2F0dHIucGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJib3RoXCIgW2F0dHIuYXJpYS1vd25zXT1cImRyb3Bkb3duLmlkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCIgLz5cbiAgICAgICAgPGlneC1zdWZmaXggKm5nSWY9XCJzaG93U2VhcmNoQ2FzZUljb25cIj5cbiAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJpbXgtaWNvbnNcIiBuYW1lPVwiY2FzZS1zZW5zaXRpdmVcIiBbYWN0aXZlXT1cImZpbHRlcmluZ09wdGlvbnMuY2FzZVNlbnNpdGl2ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhc2VTZW5zaXRpdmUoKVwiPlxuICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtc3VmZml4PlxuICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgI2Ryb3Bkb3duSXRlbUNvbnRhaW5lciBjbGFzcz1cImlneC1jb21ib19fY29udGVudFwiIFtzdHlsZS5vdmVyZmxvd109XCInaGlkZGVuJ1wiXG4gICAgICAgIFtzdHlsZS5tYXhIZWlnaHQucHhdPVwiaXRlbXNNYXhIZWlnaHRcIiBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJkcm9wZG93blwiIChmb2N1cyk9XCJkcm9wZG93bi5vbkZvY3VzKClcIlxuICAgICAgICBbdGFiaW5kZXhdPVwiZHJvcGRvd24uY29sbGFwc2VkID8gLTEgOiAwXCIgcm9sZT1cImxpc3Rib3hcIiBbYXR0ci5pZF09XCJkcm9wZG93bi5pZFwiPlxuICAgICAgICA8aWd4LWNvbWJvLWl0ZW0gcm9sZT1cIm9wdGlvblwiIFtpdGVtSGVpZ2h0XT0naXRlbUhlaWdodCcgKmlneEZvcj1cImxldCBpdGVtIG9mIGRhdGFcbiAgICAgICAgICAgIHwgY29tYm9GaWx0ZXJpbmc6ZmlsdGVyVmFsdWU6ZGlzcGxheUtleTpmaWx0ZXJhYmxlOmZpbHRlcmluZ09wdGlvbnNcbiAgICAgICAgICAgIHwgY29tYm9Hcm91cGluZzpncm91cEtleTp2YWx1ZUtleTpncm91cFNvcnRpbmdEaXJlY3Rpb247XG4gICAgICAgICAgICBpbmRleCBhcyByb3dJbmRleDsgY29udGFpbmVyU2l6ZTogaXRlbXNNYXhIZWlnaHQ7IHNjcm9sbE9yaWVudGF0aW9uOiAndmVydGljYWwnOyBpdGVtU2l6ZTogaXRlbUhlaWdodFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiIFtpc0hlYWRlcl09XCJpdGVtLmlzSGVhZGVyXCIgW2luZGV4XT1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pc0hlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJJdGVtVGVtcGxhdGUgPyBoZWFkZXJJdGVtVGVtcGxhdGUgOiBoZWFkZXJJdGVtQmFzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbSwgZGF0YTogZGF0YSwgdmFsdWVLZXk6IHZhbHVlS2V5LCBncm91cEtleTogZ3JvdXBLZXksIGRpc3BsYXlLZXk6IGRpc3BsYXlLZXl9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pc0hlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgI2xpc3RJdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW0sIGRhdGE6IGRhdGEsIHZhbHVlS2V5OiB2YWx1ZUtleSwgZGlzcGxheUtleTogZGlzcGxheUtleX07XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9pZ3gtY29tYm8taXRlbT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWNvbWJvX19hZGRcIiAqbmdJZj1cImZpbHRlcmVkRGF0YS5sZW5ndGggPT09IDAgfHwgaXNBZGRCdXR0b25WaXNpYmxlKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1jb21ib19fZW1wdHlcIiAqbmdJZj1cImZpbHRlcmVkRGF0YS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVRlbXBsYXRlID8gZW1wdHlUZW1wbGF0ZSA6IGVtcHR5XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpZ3gtY29tYm8tYWRkLWl0ZW0gW2l0ZW1IZWlnaHRdPVwiaXRlbUhlaWdodFwiICpuZ0lmPVwiaXNBZGRCdXR0b25WaXNpYmxlKClcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImRyb3Bkb3duLmNvbGxhcHNlZCA/IC0xIDogY3VzdG9tVmFsdWVGbGFnID8gMSA6IC0xXCIgY2xhc3M9XCJpZ3gtY29tYm9fX2FkZC1pdGVtXCIgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWRkIEl0ZW1cIiBbaW5kZXhdPVwidmlydHVhbFNjcm9sbENvbnRhaW5lci5pZ3hGb3JPZi5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJdGVtVGVtcGxhdGUgPyBhZGRJdGVtVGVtcGxhdGUgOiBhZGRJdGVtRGVmYXVsdFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaWd4LWNvbWJvLWFkZC1pdGVtPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb290ZXJUZW1wbGF0ZVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9pZ3gtY29tYm8tZHJvcC1kb3duPlxuPG5nLXRlbXBsYXRlICNjb21wbGV4IGxldC1kaXNwbGF5IGxldC1kYXRhPVwiZGF0YVwiIGxldC1rZXk9XCJkaXNwbGF5S2V5XCI+XG4gICAge3tkaXNwbGF5W2tleV19fVxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjcHJpbWl0aXZlIGxldC1kaXNwbGF5PlxuICAgIHt7ZGlzcGxheX19XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICA8c3Bhbj5UaGUgbGlzdCBpcyBlbXB0eTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2FkZEl0ZW1EZWZhdWx0IGxldC1jb250cm9sPlxuICAgIDxidXR0b24gaWd4QnV0dG9uPVwiZmxhdFwiIGlneFJpcHBsZT5BZGQgaXRlbTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVySXRlbUJhc2UgbGV0LWl0ZW0gbGV0LWtleT1cInZhbHVlS2V5XCIgbGV0LWdyb3VwS2V5PVwiZ3JvdXBLZXlcIj5cbiAgICB7eyBpdGVtW2tleV0gfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
518
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2NvbWJvL2NvbWJvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9jb21iby9jb21iby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUMrQixTQUFTLEVBQWMsUUFBUSxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFZLFNBQVMsRUFBRSxLQUFLLEVBQ3JJLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUduRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQWtCLE1BQU0sb0JBQW9CLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMs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QixlQUFlO1lBQ2YsZUFBZTtZQUNmLG1CQUFtQjtTQUN0QixFQWRHLG1CQUFtQjsyRkFnQmQsY0FBYztrQkFoRDFCLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFO3dCQUNWLHdCQUF3Qjt3QkFDeEIsd0JBQXdCO3dCQUN4QiwwQkFBMEI7d0JBQzFCLGlCQUFpQjt3QkFDakIseUJBQXlCO3dCQUN6QixzQkFBc0I7d0JBQ3RCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3dCQUN2QixvQkFBb0I7d0JBQ3BCLHVCQUF1Qjt3QkFDdkIsMkJBQTJCO3dCQUMzQixxQkFBcUI7d0JBQ3JCLHFCQUFxQjt3QkFDckIsMkJBQTJCO3FCQUM5QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ0wsd0JBQXdCO3dCQUN4Qix3QkFBd0I7d0JBQ3hCLDBCQUEwQjt3QkFDMUIsaUJBQWlCO3dCQUNqQix5QkFBeUI7d0JBQ3pCLHNCQUFzQjt3QkFDdEIscUJBQXFCO3dCQUNyQix1QkFBdUI7d0JBQ3ZCLG9CQUFvQjt3QkFDcEIsdUJBQXVCO3dCQUN2QiwyQkFBMkI7d0JBQzNCLHFCQUFxQjt3QkFDckIscUJBQXFCO3dCQUNyQiwyQkFBMkI7d0JBQzNCLG1CQUFtQjtxQkFDdEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNMLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsbUJBQW1CO3FCQUN0QjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE5nTW9kdWxlLCBPbkluaXQsIE9uRGVzdHJveSwgT3B0aW9uYWwsIEluamVjdCwgSW5qZWN0b3IsIFZpZXdDaGlsZCwgSW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIElneENvbWJvSXRlbURpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0VtcHR5RGlyZWN0aXZlLFxuICAgIElneENvbWJvSGVhZGVySXRlbURpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0Zvb3RlckRpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0FkZEl0ZW1EaXJlY3RpdmUsXG4gICAgSWd4Q29tYm9Ub2dnbGVJY29uRGlyZWN0aXZlLFxuICAgIElneENvbWJvQ2xlYXJJY29uRGlyZWN0aXZlXG59IGZyb20gJy4vY29tYm8uZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4Q2hlY2tib3hNb2R1bGUgfSBmcm9tICcuLi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4U2VsZWN0aW9uQVBJU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VsZWN0aW9uJztcbmltcG9ydCB7IElCYXNlRXZlbnRBcmdzLCBJQmFzZUNhbmNlbGFibGVFdmVudEFyZ3MsIENhbmNlbGFibGVFdmVudEFyZ3MgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQsIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgRmlsdGVyaW5nTG9naWMgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEZvck9mTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uTW9kdWxlLCBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uL2ljb24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hSaXBwbGVNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneFRvZ2dsZU1vZHVsZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdG9nZ2xlL3RvZ2dsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4QnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hEcm9wRG93bk1vZHVsZSB9IGZyb20gJy4uL2Ryb3AtZG93bi9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneElucHV0R3JvdXBNb2R1bGUgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29tYm9JdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21iby1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb21ib0Ryb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnLi9jb21iby1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29tYm9GaWx0ZXJpbmdQaXBlLCBJZ3hDb21ib0dyb3VwaW5nUGlwZSB9IGZyb20gJy4vY29tYm8ucGlwZXMnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHlUb2tlbiwgSURpc3BsYXlEZW5zaXR5T3B0aW9ucyB9IGZyb20gJy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBJR1hfQ09NQk9fQ09NUE9ORU5ULCBJZ3hDb21ib0Jhc2VEaXJlY3RpdmUgfSBmcm9tICcuL2NvbWJvLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hDb21ib0FkZEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbWJvLWFkZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb21ib0FQSVNlcnZpY2UgfSBmcm9tICcuL2NvbWJvLmFwaSc7XG5pbXBvcnQgeyBFZGl0b3JQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvZWRpdC1wcm92aWRlcic7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwVHlwZSwgSUdYX0lOUFVUX0dST1VQX1RZUEUgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9wdWJsaWNfYXBpJztcblxuLyoqIFRoZSBmaWx0ZXJpbmcgY3JpdGVyaWEgdG8gYmUgYXBwbGllZCBvbiBkYXRhIHNlYXJjaCAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29tYm9GaWx0ZXJpbmdPcHRpb25zIHtcbiAgICAvKiogRGVmaW5lcyBmaWx0ZXJpbmcgY2FzZS1zZW5zaXRpdml0eSAqL1xuICAgIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW47XG59XG5cbi8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gaWd4LWNvbWJvJ3Mgc2VsZWN0aW9uIGlzIGNoYW5naW5nICovXG5leHBvcnQgaW50ZXJmYWNlIElDb21ib1NlbGVjdGlvbkNoYW5naW5nRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VDYW5jZWxhYmxlRXZlbnRBcmdzIHtcbiAgICAvKiogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIHRoYXQgYXJlIGN1cnJlbnRseSBzZWxlY3RlZCAqL1xuICAgIG9sZFNlbGVjdGlvbjogYW55W107XG4gICAgLyoqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBldmVudCAqL1xuICAgIG5ld1NlbGVjdGlvbjogYW55W107XG4gICAgLyoqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiAoaWYgYW55KSAqL1xuICAgIGFkZGVkOiBhbnlbXTtcbiAgICAvKiogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiAoaWYgYW55KSAqL1xuICAgIHJlbW92ZWQ6IGFueVtdO1xuICAgIC8qKiBUaGUgdGV4dCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBjb21ibyB0ZXh0IGJveCAqL1xuICAgIGRpc3BsYXlUZXh0OiBzdHJpbmc7XG4gICAgLyoqIFRoZSB1c2VyIGludGVyYWN0aW9uIHRoYXQgdHJpZ2dlcmVkIHRoZSBzZWxlY3Rpb24gY2hhbmdlICovXG4gICAgZXZlbnQ/OiBFdmVudDtcbn1cblxuLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgaWd4LWNvbWJvJ3Mgc2VhcmNoIGlucHV0IGNoYW5nZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUNhbmNlbGFibGVFdmVudEFyZ3Mge1xuICAgIC8qKiBUaGUgdGV4dCB0aGF0IGhhcyBiZWVuIHR5cGVkIGludG8gdGhlIHNlYXJjaCBpbnB1dCAqL1xuICAgIHNlYXJjaFRleHQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tYm9JdGVtQWRkaXRpb25FdmVudCBleHRlbmRzIElCYXNlRXZlbnRBcmdzLCBDYW5jZWxhYmxlRXZlbnRBcmdzIHtcbiAgICBvbGRDb2xsZWN0aW9uOiBhbnlbXTtcbiAgICBhZGRlZEl0ZW06IGFueTtcbiAgICBuZXdDb2xsZWN0aW9uOiBhbnlbXTtcbn1cblxuLyoqXG4gKiBXaGVuIGNhbGxlZCB3aXRoIHNldHMgQSAmIEIsIHJldHVybnMgQSAtIEIgKGFzIGFycmF5KTtcbiAqXG4gKiBAaGlkZGVuXG4gKi9cbmNvbnN0IGRpZmZJblNldHMgPSAoc2V0MTogU2V0PGFueT4sIHNldDI6IFNldDxhbnk+KTogYW55W10gPT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICBzZXQxLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICBpZiAoIXNldDIuaGFzKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiAgUmVwcmVzZW50cyBhIGRyb3AtZG93biBsaXN0IHRoYXQgcHJvdmlkZXMgZWRpdGFibGUgZnVuY3Rpb25hbGl0aWVzLCBhbGxvd2luZyB1c2VycyB0byBjaG9vc2UgYW4gb3B0aW9uIGZyb20gYSBwcmVkZWZpbmVkIGxpc3QuXG4gKlxuICogQGlneE1vZHVsZSBJZ3hDb21ib01vZHVsZVxuICogQGlneFRoZW1lIGlneC1jb21iby10aGVtZVxuICogQGlneEtleXdvcmRzIGNvbWJvYm94LCBjb21ibyBzZWxlY3Rpb25cbiAqIEBpZ3hHcm91cCBHcmlkcyAmIExpc3RzXG4gKlxuICogQHJlbWFya3NcbiAqIEl0IHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGZpbHRlciBpdGVtcyBhcyB3ZWxsIGFzIHBlcmZvcm0gc2VsZWN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKiBBZGRpdGlvbmFsbHksIGl0IGV4cG9zZXMga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgY3VzdG9tIHN0eWxpbmcgY2FwYWJpbGl0aWVzLlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtY29tYm8gW2l0ZW1zTWF4SGVpZ2h0XT1cIjI1MFwiIFtkYXRhXT1cImxvY2F0aW9uRGF0YVwiXG4gKiAgW2Rpc3BsYXlLZXldPVwiJ2ZpZWxkJ1wiIFt2YWx1ZUtleV09XCInZmllbGQnXCJcbiAqICBwbGFjZWhvbGRlcj1cIkxvY2F0aW9uKHMpXCIgc2VhcmNoUGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIj5cbiAqIDwvaWd4LWNvbWJvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnaWd4LWNvbWJvJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2NvbWJvLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgSWd4Q29tYm9BUElTZXJ2aWNlLFxuICAgICAgICB7IHByb3ZpZGU6IElHWF9DT01CT19DT01QT05FTlQsIHVzZUV4aXN0aW5nOiBJZ3hDb21ib0NvbXBvbmVudCB9LFxuICAgICAgICB7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4Q29tYm9Db21wb25lbnQsIG11bHRpOiB0cnVlIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneENvbWJvQ29tcG9uZW50IGV4dGVuZHMgSWd4Q29tYm9CYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3ksIEVkaXRvclByb3ZpZGVyIHtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGNhc2VTZW5zaXRpdmUgaWNvbiBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHNlYXJjaCBpbnB1dFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvU2hvd1NlYXJjaENhc2VJY29uID0gdGhpcy5jb21iby5zaG93U2VhcmNoQ2FzZUljb247XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW3Nob3dTZWFyY2hDYXNlSWNvbl09J3RydWUnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dTZWFyY2hDYXNlSWNvbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgY29udHJvbHMgd2hldGhlciB0aGUgY29tYm8ncyBzZWFyY2ggYm94XG4gICAgICogc2hvdWxkIGJlIGZvY3VzZWQgYWZ0ZXIgdGhlIGBvcGVuZWRgIGV2ZW50IGlzIGNhbGxlZFxuICAgICAqIFdoZW4gYGZhbHNlYCwgdGhlIGNvbWJvJ3MgbGlzdCBpdGVtIGNvbnRhaW5lciB3aWxsIGJlIGZvY3VzZWQgaW5zdGVhZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9Gb2N1c1NlYXJjaCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBlbmFibGVkL2Rpc2FibGVzIGZpbHRlcmluZyBpbiB0aGUgbGlzdC4gVGhlIGRlZmF1bHQgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtmaWx0ZXJhYmxlXT1cImZhbHNlXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZmlsdGVyYWJsZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgdGhlIGNvbWJvIGRyb3Bkb3duIHNlYXJjaCBmaWVsZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvU2VhcmNoUGxhY2Vob2xkZXIgPSB0aGlzLmNvbWJvLnNlYXJjaFBsYWNlaG9sZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtzZWFyY2hQbGFjZWhvbGRlcl09J25ld1BsYWNlSG9sZGVyJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hQbGFjZWhvbGRlciA9ICdFbnRlciBhIFNlYXJjaCBUZXJtJztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Q29tYm9Ecm9wRG93bkNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJvcGRvd246IElneENvbWJvRHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5wdXRFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnZhbHVlICYmICF0aGlzLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWREYXRhKCk6IGFueVtdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmFibGUgPyB0aGlzLl9maWx0ZXJlZERhdGEgOiB0aGlzLmRhdGE7XG4gICAgfVxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBzZXQgZmlsdGVyZWREYXRhKHZhbDogYW55W10gfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IHRoaXMuZ3JvdXBLZXkgPyAodmFsIHx8IFtdKS5maWx0ZXIoKGUpID0+IGUuaXNIZWFkZXIgIT09IHRydWUpIDogdmFsO1xuICAgICAgICB0aGlzLmNoZWNrTWF0Y2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdMb2dpYyA9IEZpbHRlcmluZ0xvZ2ljLk9yO1xuXG4gICAgcHJvdGVjdGVkIHN0cmluZ0ZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kO1xuICAgIHByb3RlY3RlZCBib29sZWFuRmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kO1xuICAgIHByb3RlY3RlZCBfcHJldklucHV0VmFsdWUgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBzZWxlY3Rpb25TZXJ2aWNlOiBJZ3hTZWxlY3Rpb25BUElTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29tYm9BUEk6IElneENvbWJvQVBJU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIF9pY29uU2VydmljZTogSWd4SWNvblNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnMsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSUdYX0lOUFVUX0dST1VQX1RZUEUpIHByb3RlY3RlZCBfaW5wdXRHcm91cFR5cGU6IElneElucHV0R3JvdXBUeXBlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgX2luamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBjZHIsIHNlbGVjdGlvblNlcnZpY2UsIGNvbWJvQVBJLCBfaWNvblNlcnZpY2UsIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMsIF9pbnB1dEdyb3VwVHlwZSwgX2luamVjdG9yKTtcbiAgICAgICAgdGhpcy5jb21ib0FQSS5yZWdpc3Rlcih0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc3BsYXlTZWFyY2hJbnB1dCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyYWJsZSB8fCB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIFRPRE86IHVzZSBQbGF0Zm9ybVV0aWwgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHwgZXZlbnQua2V5ID09PSAnRG93bicpIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uZm9jdXNlZEl0ZW0gPSB0aGlzLmRyb3Bkb3duLml0ZW1zWzBdO1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bkNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyB8fCBldmVudC5rZXkgPT09ICdFc2MnKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFuZGxlU2VsZWN0QWxsKGV2dCkge1xuICAgICAgICBpZiAoZXZ0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsSXRlbXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RBbGxJdGVtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55W10pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgICAgICBjb25zdCBvbGRTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdF9pdGVtcyh0aGlzLmlkLCBzZWxlY3Rpb24sIHRydWUpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmNyZWF0ZURpc3BsYXlUZXh0KHRoaXMuc2VsZWN0aW9uLCBvbGRTZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RWRpdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21ib0lucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhbmRsZUNsZWFySXRlbXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXNlbGVjdEFsbEl0ZW1zKHRydWUsIGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdldEVkaXRFbGVtZW50KCkuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNTZWFyY2hJbnB1dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QgZGVmaW5lZCBpdGVtc1xuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0l0ZW1zIG5ldyBpdGVtcyB0byBiZSBzZWxlY3RlZFxuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhciBwcmV2aW91cyBzZWxlY3RlZCBpdGVtc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbWJvLnNlbGVjdChbXCJOZXcgWW9ya1wiLCBcIk5ldyBKZXJzZXlcIl0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3QobmV3SXRlbXM6IEFycmF5PGFueT4sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgaWYgKG5ld0l0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWRkX2l0ZW1zKHRoaXMuaWQsIG5ld0l0ZW1zLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBkZWZpbmVkIGl0ZW1zXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgaXRlbXMgdG8gZGVzZWxlY3RlZFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbWJvLmRlc2VsZWN0KFtcIk5ldyBZb3JrXCIsIFwiTmV3IEplcnNleVwiXSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0KGl0ZW1zOiBBcnJheTxhbnk+LCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGlmIChpdGVtcykge1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlbGV0ZV9pdGVtcyh0aGlzLmlkLCBpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhbGwgKGZpbHRlcmVkKSBpdGVtc1xuICAgICAqXG4gICAgICogQHBhcmFtIGlnbm9yZUZpbHRlciBpZiBzZXQgdG8gdHJ1ZSwgc2VsZWN0cyBhbGwgaXRlbXMsIG90aGVyd2lzZSBzZWxlY3RzIG9ubHkgdGhlIGZpbHRlcmVkIG9uZXMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29tYm8uc2VsZWN0QWxsSXRlbXMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsSXRlbXMoaWdub3JlRmlsdGVyPzogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCkge1xuICAgICAgICBjb25zdCBhbGxWaXNpYmxlID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldF9hbGxfaWRzKGlnbm9yZUZpbHRlciA/IHRoaXMuZGF0YSA6IHRoaXMuZmlsdGVyZWREYXRhLCB0aGlzLnZhbHVlS2V5KTtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFkZF9pdGVtcyh0aGlzLmlkLCBhbGxWaXNpYmxlKTtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3QgYWxsIChmaWx0ZXJlZCkgaXRlbXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXIgaWYgc2V0IHRvIHRydWUsIGRlc2VsZWN0cyBhbGwgaXRlbXMsIG90aGVyd2lzZSBkZXNlbGVjdHMgb25seSB0aGUgZmlsdGVyZWQgb25lcy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb21iby5kZXNlbGVjdEFsbEl0ZW1zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0QWxsSXRlbXMoaWdub3JlRmlsdGVyPzogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBsZXQgbmV3U2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldF9lbXB0eSgpO1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoICE9PSB0aGlzLmRhdGEubGVuZ3RoICYmICFpZ25vcmVGaWx0ZXIpIHtcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZWxldGVfaXRlbXModGhpcy5pZCwgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldF9hbGxfaWRzKHRoaXMuZmlsdGVyZWREYXRhLCB0aGlzLnZhbHVlS2V5KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cy9EZXNlbGVjdHMgYSBzaW5nbGUgaXRlbVxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1JRCB0aGUgaXRlbUlEIG9mIHRoZSBzcGVjaWZpYyBpdGVtXG4gICAgICogQHBhcmFtIHNlbGVjdCBJZiB0aGUgaXRlbSBzaG91bGQgYmUgc2VsZWN0ZWQgKHRydWUpIG9yIGRlc2VsZWN0ZWQgKGZhbHNlKVxuICAgICAqXG4gICAgICogV2l0aG91dCBzcGVjaWZpZWQgdmFsdWVLZXk7XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29tYm8udmFsdWVLZXkgPSBudWxsO1xuICAgICAqIGNvbnN0IGl0ZW1zOiB7IGZpZWxkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nfVtdID0gZGF0YTtcbiAgICAgKiB0aGlzLmNvbWJvLnNldFNlbGVjdGVkSXRlbShpdGVtc1swXSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogV2l0aCBzcGVjaWZpZWQgdmFsdWVLZXk7XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29tYm8udmFsdWVLZXkgPSAnZmllbGQnO1xuICAgICAqIGNvbnN0IGl0ZW1zOiB7IGZpZWxkOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nfVtdID0gZGF0YTtcbiAgICAgKiB0aGlzLmNvbWJvLnNldFNlbGVjdGVkSXRlbSgnQ29ubmVjdGljdXQnLCB0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZWN0ZWRJdGVtKGl0ZW1JRDogYW55LCBzZWxlY3QgPSB0cnVlLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChpdGVtSUQgPT09IG51bGwgfHwgaXRlbUlEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdChbaXRlbUlEXSwgZmFsc2UsIGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3QoW2l0ZW1JRF0sIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNhc2VTZW5zaXRpdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nT3B0aW9ucyA9IHsgY2FzZVNlbnNpdGl2ZTogIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy5jYXNlU2Vuc2l0aXZlIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhhbmRsZU9wZW5lZCgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ2hlY2soKTtcblxuICAgICAgICAvLyBEaXNhYmxpbmcgZm9jdXMgb2YgdGhlIHNlYXJjaCBpbnB1dCBzaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBkcm9wIGRvd24gb3BlbnMuXG4gICAgICAgIC8vIER1cmluZyBrZXlib2FyZCBuYXZpZ2F0aW9uIGlucHV0IHNob3VsZCByZWNlaXZlIGZvY3VzLCBldmVuIHRoZSBhdXRvRm9jdXNTZWFyY2ggaXMgZGlzYWJsZWQuXG4gICAgICAgIC8vIFRoYXQgaXMgd2h5IGluIHN1Y2ggY2FzZXMgZm9jdXNpbmcgb2YgdGhlIGRyb3Bkb3duQ29udGFpbmVyIGhhcHBlbnMgb3V0c2lkZSBmb2N1c1NlYXJjaElucHV0IG1ldGhvZC5cbiAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzU2VhcmNoSW5wdXQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGZvY3VzU2VhcmNoSW5wdXQob3BlbmluZz86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVNlYXJjaElucHV0ICYmIHRoaXMuc2VhcmNoSW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9wZW5pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21ib0lucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb246IFNldDxhbnk+LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkaWZmSW5TZXRzKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXQodGhpcy5pZCksIG5ld1NlbGVjdGlvbik7XG4gICAgICAgIGNvbnN0IGFkZGVkID0gZGlmZkluU2V0cyhuZXdTZWxlY3Rpb24sIHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXQodGhpcy5pZCkpO1xuICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb25Bc0FycmF5ID0gQXJyYXkuZnJvbShuZXdTZWxlY3Rpb24pO1xuICAgICAgICBjb25zdCBvbGRTZWxlY3Rpb25Bc0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0KHRoaXMuaWQpIHx8IFtdKTtcbiAgICAgICAgY29uc3QgZGlzcGxheVRleHQgPSB0aGlzLmNyZWF0ZURpc3BsYXlUZXh0KG5ld1NlbGVjdGlvbkFzQXJyYXksIG9sZFNlbGVjdGlvbkFzQXJyYXkpO1xuICAgICAgICBjb25zdCBhcmdzOiBJQ29tYm9TZWxlY3Rpb25DaGFuZ2luZ0V2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIG5ld1NlbGVjdGlvbjogbmV3U2VsZWN0aW9uQXNBcnJheSxcbiAgICAgICAgICAgIG9sZFNlbGVjdGlvbjogb2xkU2VsZWN0aW9uQXNBcnJheSxcbiAgICAgICAgICAgIGFkZGVkLFxuICAgICAgICAgICAgcmVtb3ZlZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBkaXNwbGF5VGV4dCxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBpZiAoIWFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0X2l0ZW1zKHRoaXMuaWQsIGFyZ3MubmV3U2VsZWN0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChkaXNwbGF5VGV4dCAhPT0gYXJncy5kaXNwbGF5VGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gYXJncy5kaXNwbGF5VGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmNyZWF0ZURpc3BsYXlUZXh0KGFyZ3MubmV3U2VsZWN0aW9uLCBhcmdzLm9sZFNlbGVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGFyZ3MubmV3U2VsZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVEaXNwbGF5VGV4dChuZXdTZWxlY3Rpb246IGFueVtdLCBvbGRTZWxlY3Rpb246IGFueVtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUmVtb3RlXG4gICAgICAgICAgICA/IHRoaXMuZ2V0UmVtb3RlU2VsZWN0aW9uKG5ld1NlbGVjdGlvbiwgb2xkU2VsZWN0aW9uKVxuICAgICAgICAgICAgOiB0aGlzLmNvbmNhdERpc3BsYXlUZXh0KG5ld1NlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgcG9wdWxhdGVkIGluIHRoZSBjb21ibydzIHRleHQgYm94ICovXG4gICAgcHJpdmF0ZSBjb25jYXREaXNwbGF5VGV4dChzZWxlY3Rpb246IGFueVtdKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRpc3BsYXlLZXkgIT09IG51bGwgJiYgdGhpcy5kaXNwbGF5S2V5ICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgdGhpcy5jb252ZXJ0S2V5c1RvSXRlbXMoc2VsZWN0aW9uKS5tYXAoZW50cnkgPT4gZW50cnlbdGhpcy5kaXNwbGF5S2V5XSkuam9pbignLCAnKSA6XG4gICAgICAgICAgICBzZWxlY3Rpb24uam9pbignLCAnKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICAgIElneENvbWJvQWRkSXRlbUNvbXBvbmVudCxcbiAgICAgICAgSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0NsZWFySWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvRHJvcERvd25Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvRW1wdHlEaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvRmlsdGVyaW5nUGlwZSxcbiAgICAgICAgSWd4Q29tYm9Gb290ZXJEaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvR3JvdXBpbmdQaXBlLFxuICAgICAgICBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0l0ZW1Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvSXRlbURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Ub2dnbGVJY29uRGlyZWN0aXZlXG4gICAgXSxcbiAgICBleHBvcnRzOiBbXG4gICAgICAgIElneENvbWJvQWRkSXRlbUNvbXBvbmVudCxcbiAgICAgICAgSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0NsZWFySWNvbkRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvRHJvcERvd25Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvRW1wdHlEaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvRmlsdGVyaW5nUGlwZSxcbiAgICAgICAgSWd4Q29tYm9Gb290ZXJEaXJlY3RpdmUsXG4gICAgICAgIElneENvbWJvR3JvdXBpbmdQaXBlLFxuICAgICAgICBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLFxuICAgICAgICBJZ3hDb21ib0l0ZW1Db21wb25lbnQsXG4gICAgICAgIElneENvbWJvSXRlbURpcmVjdGl2ZSxcbiAgICAgICAgSWd4Q29tYm9Ub2dnbGVJY29uRGlyZWN0aXZlLFxuICAgICAgICBJZ3hJbnB1dEdyb3VwTW9kdWxlXG4gICAgXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIElneEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgSWd4Q2hlY2tib3hNb2R1bGUsXG4gICAgICAgIElneERyb3BEb3duTW9kdWxlLFxuICAgICAgICBJZ3hGb3JPZk1vZHVsZSxcbiAgICAgICAgSWd4SWNvbk1vZHVsZSxcbiAgICAgICAgSWd4SW5wdXRHcm91cE1vZHVsZSxcbiAgICAgICAgSWd4UmlwcGxlTW9kdWxlLFxuICAgICAgICBJZ3hUb2dnbGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIElneENvbWJvTW9kdWxlIHsgfVxuIiwiPGlneC1pbnB1dC1ncm91cCAjaW5wdXRHcm91cCBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIiBbdHlwZV09XCJ0eXBlXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxuICAgIDxuZy1jb250YWluZXIgbmdQcm9qZWN0QXM9XCJbaWd4TGFiZWxdXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMYWJlbF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1wcmVmaXhcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXByZWZpeFwiPjwvbmctY29udGVudD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIG5nUHJvamVjdEFzPVwiaWd4LWhpbnQsIFtpZ3hIaW50XVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpZ3gtaGludCwgW2lneEhpbnRdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxpbnB1dCBpZ3hJbnB1dCAjY29tYm9JbnB1dCBuYW1lPVwiY29tYm9JbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInZhbHVlXCIgcmVhZG9ubHkgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoYmx1cik9XCJvbkJsdXIoKVwiIC8+XG4gICAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cImlneC1zdWZmaXhcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiaWd4LXN1ZmZpeFwiPjwvbmctY29udGVudD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8aWd4LXN1ZmZpeCAqbmdJZj1cInZhbHVlLmxlbmd0aFwiIGFyaWEtbGFiZWw9XCJDbGVhciBTZWxlY3Rpb25cIiBjbGFzcz1cImlneC1jb21ib19fY2xlYXItYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUNsZWFySXRlbXMoJGV2ZW50KVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2xlYXJJY29uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbGVhckljb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGlneC1pY29uICpuZ0lmPVwiIWNsZWFySWNvblRlbXBsYXRlXCI+XG4gICAgICAgICAgICBjbGVhclxuICAgICAgICA8L2lneC1pY29uPlxuICAgIDwvaWd4LXN1ZmZpeD5cbiAgICA8aWd4LXN1ZmZpeCBjbGFzcz1cImlneC1jb21ib19fdG9nZ2xlLWJ1dHRvblwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG9nZ2xlSWNvblRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9nZ2xlSWNvblRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiB0aGlzLmNvbGxhcHNlZH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxpZ3gtaWNvbiAqbmdJZj1cIiF0b2dnbGVJY29uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIHt7IGRyb3Bkb3duLmNvbGxhcHNlZCA/ICdhcnJvd19kcm9wX2Rvd24nIDogJ2Fycm93X2Ryb3BfdXAnfX1cbiAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICA8L2lneC1zdWZmaXg+XG48L2lneC1pbnB1dC1ncm91cD5cbjxpZ3gtY29tYm8tZHJvcC1kb3duICNpZ3hDb21ib0Ryb3BEb3duIGNsYXNzPVwiaWd4LWNvbWJvX19kcm9wLWRvd25cIiBbZGlzcGxheURlbnNpdHldPVwiZGlzcGxheURlbnNpdHlcIlxuICAgIFt3aWR0aF09XCJpdGVtc1dpZHRoIHx8ICcxMDAlJ1wiIChvcGVuaW5nKT1cImhhbmRsZU9wZW5pbmcoJGV2ZW50KVwiIChjbG9zaW5nKT1cImhhbmRsZUNsb3NpbmcoJGV2ZW50KVwiXG4gICAgKG9wZW5lZCk9XCJoYW5kbGVPcGVuZWQoKVwiIChjbG9zZWQpPVwiaGFuZGxlQ2xvc2VkKClcIj5cbiAgICA8aWd4LWlucHV0LWdyb3VwICpuZ0lmPVwiZGlzcGxheVNlYXJjaElucHV0XCIgW2Rpc3BsYXlEZW5zaXR5XT1cImRpc3BsYXlEZW5zaXR5XCIgdGhlbWU9XCJtYXRlcmlhbFwiIGNsYXNzPVwiaWd4LWNvbWJvX19zZWFyY2hcIj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiaWd4LWNvbWJvLWlucHV0XCIgaWd4SW5wdXQgI3NlYXJjaElucHV0IG5hbWU9XCJzZWFyY2hJbnB1dFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIiAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCIgKGtleXVwKT1cImhhbmRsZUtleVVwKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCIgKGZvY3VzKT1cImRyb3Bkb3duLm9uQmx1cigkZXZlbnQpXCIgW2F0dHIucGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJib3RoXCIgW2F0dHIuYXJpYS1vd25zXT1cImRyb3Bkb3duLmlkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCIgLz5cbiAgICAgICAgPGlneC1zdWZmaXggKm5nSWY9XCJzaG93U2VhcmNoQ2FzZUljb25cIj5cbiAgICAgICAgICAgIDxpZ3gtaWNvbiBmYW1pbHk9XCJpbXgtaWNvbnNcIiBuYW1lPVwiY2FzZS1zZW5zaXRpdmVcIiBbYWN0aXZlXT1cImZpbHRlcmluZ09wdGlvbnMuY2FzZVNlbnNpdGl2ZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhc2VTZW5zaXRpdmUoKVwiPlxuICAgICAgICAgICAgPC9pZ3gtaWNvbj5cbiAgICAgICAgPC9pZ3gtc3VmZml4PlxuICAgIDwvaWd4LWlucHV0LWdyb3VwPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgI2Ryb3Bkb3duSXRlbUNvbnRhaW5lciBjbGFzcz1cImlneC1jb21ib19fY29udGVudFwiIFtzdHlsZS5vdmVyZmxvd109XCInaGlkZGVuJ1wiXG4gICAgICAgIFtzdHlsZS5tYXhIZWlnaHQucHhdPVwiaXRlbXNNYXhIZWlnaHRcIiBbaWd4RHJvcERvd25JdGVtTmF2aWdhdGlvbl09XCJkcm9wZG93blwiIChmb2N1cyk9XCJkcm9wZG93bi5vbkZvY3VzKClcIlxuICAgICAgICBbdGFiaW5kZXhdPVwiZHJvcGRvd24uY29sbGFwc2VkID8gLTEgOiAwXCIgcm9sZT1cImxpc3Rib3hcIiBbYXR0ci5pZF09XCJkcm9wZG93bi5pZFwiPlxuICAgICAgICA8aWd4LWNvbWJvLWl0ZW0gcm9sZT1cIm9wdGlvblwiIFtpdGVtSGVpZ2h0XT0naXRlbUhlaWdodCcgKmlneEZvcj1cImxldCBpdGVtIG9mIGRhdGFcbiAgICAgICAgICAgIHwgY29tYm9GaWx0ZXJpbmc6ZmlsdGVyVmFsdWU6ZGlzcGxheUtleTpmaWx0ZXJpbmdPcHRpb25zOmZpbHRlcmFibGVcbiAgICAgICAgICAgIHwgY29tYm9Hcm91cGluZzpncm91cEtleTp2YWx1ZUtleTpncm91cFNvcnRpbmdEaXJlY3Rpb247XG4gICAgICAgICAgICBpbmRleCBhcyByb3dJbmRleDsgY29udGFpbmVyU2l6ZTogaXRlbXNNYXhIZWlnaHQ7IHNjcm9sbE9yaWVudGF0aW9uOiAndmVydGljYWwnOyBpdGVtU2l6ZTogaXRlbUhlaWdodFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiIFtpc0hlYWRlcl09XCJpdGVtLmlzSGVhZGVyXCIgW2luZGV4XT1cInJvd0luZGV4XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pc0hlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJJdGVtVGVtcGxhdGUgPyBoZWFkZXJJdGVtVGVtcGxhdGUgOiBoZWFkZXJJdGVtQmFzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbSwgZGF0YTogZGF0YSwgdmFsdWVLZXk6IHZhbHVlS2V5LCBncm91cEtleTogZ3JvdXBLZXksIGRpc3BsYXlLZXk6IGRpc3BsYXlLZXl9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXRlbS5pc0hlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgI2xpc3RJdGVtXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW0sIGRhdGE6IGRhdGEsIHZhbHVlS2V5OiB2YWx1ZUtleSwgZGlzcGxheUtleTogZGlzcGxheUtleX07XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9pZ3gtY29tYm8taXRlbT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWNvbWJvX19hZGRcIiAqbmdJZj1cImZpbHRlcmVkRGF0YS5sZW5ndGggPT09IDAgfHwgaXNBZGRCdXR0b25WaXNpYmxlKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlneC1jb21ib19fZW1wdHlcIiAqbmdJZj1cImZpbHRlcmVkRGF0YS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVRlbXBsYXRlID8gZW1wdHlUZW1wbGF0ZSA6IGVtcHR5XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpZ3gtY29tYm8tYWRkLWl0ZW0gW2l0ZW1IZWlnaHRdPVwiaXRlbUhlaWdodFwiICpuZ0lmPVwiaXNBZGRCdXR0b25WaXNpYmxlKClcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cImRyb3Bkb3duLmNvbGxhcHNlZCA/IC0xIDogY3VzdG9tVmFsdWVGbGFnID8gMSA6IC0xXCIgY2xhc3M9XCJpZ3gtY29tYm9fX2FkZC1pdGVtXCIgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWRkIEl0ZW1cIiBbaW5kZXhdPVwidmlydHVhbFNjcm9sbENvbnRhaW5lci5pZ3hGb3JPZi5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRJdGVtVGVtcGxhdGUgPyBhZGRJdGVtVGVtcGxhdGUgOiBhZGRJdGVtRGVmYXVsdFwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvaWd4LWNvbWJvLWFkZC1pdGVtPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb290ZXJUZW1wbGF0ZVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9pZ3gtY29tYm8tZHJvcC1kb3duPlxuPG5nLXRlbXBsYXRlICNjb21wbGV4IGxldC1kaXNwbGF5IGxldC1kYXRhPVwiZGF0YVwiIGxldC1rZXk9XCJkaXNwbGF5S2V5XCI+XG4gICAge3tkaXNwbGF5W2tleV19fVxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjcHJpbWl0aXZlIGxldC1kaXNwbGF5PlxuICAgIHt7ZGlzcGxheX19XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICA8c3Bhbj5UaGUgbGlzdCBpcyBlbXB0eTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2FkZEl0ZW1EZWZhdWx0IGxldC1jb250cm9sPlxuICAgIDxidXR0b24gaWd4QnV0dG9uPVwiZmxhdFwiIGlneFJpcHBsZT5BZGQgaXRlbTwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVySXRlbUJhc2UgbGV0LWl0ZW0gbGV0LWtleT1cInZhbHVlS2V5XCIgbGV0LWdyb3VwS2V5PVwiZ3JvdXBLZXlcIj5cbiAgICB7eyBpdGVtW2tleV0gfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|