@libs-ui/components-dropdown 0.1.1-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,447 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { AsyncPipe } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked } from '@angular/core';
4
+ import { LibsUiComponentsAvatarComponent } from '@libs-ui/components-avatar';
5
+ import { LibsUiComponentsLabelComponent } from '@libs-ui/components-label';
6
+ import { getFieldKeyByType, LibsUiComponentsListComponent } from '@libs-ui/components-list';
7
+ import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
8
+ import { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';
9
+ import { LibsUiHttpRequestService } from '@libs-ui/services-http-request';
10
+ import { CHARACTER_DATA_EMPTY, cloneDeep, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_VALID, get, isEqual, isNil, set } from '@libs-ui/utils';
11
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
12
+ import { LibsUiComponentsDropdownTabsComponent } from './tabs/tabs.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@ngx-translate/core";
15
+ export class LibsUiComponentsDropdownComponent {
16
+ // #region PROPERTY
17
+ error = signal(undefined);
18
+ showList = signal(false);
19
+ itemsSelected = signal(undefined);
20
+ loadingDetail = signal(false);
21
+ loadingList = signal(false);
22
+ items = signal([]);
23
+ popoverItemSelected = signal(undefined);
24
+ labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));
25
+ autoSelectedFirstItemCallOutsideBefore = signal(false);
26
+ keysSelected = signal([]);
27
+ popoverFunctionControl = signal(undefined);
28
+ fieldKey = signal('id');
29
+ listFunctionControl = signal(undefined);
30
+ // #region INPUT
31
+ useXssFilter = input(false);
32
+ popoverElementRefCustom = input();
33
+ classInclude = input();
34
+ ignoreStopPropagationEvent = input(false);
35
+ flagMouse = model({ isMouseEnter: false, isMouseEnterContent: false });
36
+ flagMouseContent = model();
37
+ popoverCustomConfig = input();
38
+ isNgContent = input();
39
+ zIndex = input();
40
+ convertItemSelected = input(this.defaultConvertItemSelected.bind(this));
41
+ getPopoverItemSelected = input();
42
+ httpRequestDetailItemById = input();
43
+ lengthKeys = model(0);
44
+ textDisplayWhenNoSelect = input('i18n_select_information');
45
+ textDisplayWhenMultiSelect = input('i18n_selecting_options');
46
+ classIncludeTextDisplayWhenNoSelect = input('libs-ui-font-h5r');
47
+ fieldLabel = input('labelDisplay', { transform: (value) => value || 'labelDisplay' });
48
+ fieldGetLabel = input();
49
+ labelPopoverConfig = input();
50
+ labelPopoverFullWidth = input(true);
51
+ hasContentUnitRight = input();
52
+ listSearchNoDataTemplateRef = input();
53
+ fieldGetImage = input();
54
+ imageSize = input(16);
55
+ typeShape = input('circle');
56
+ fieldGetIcon = input();
57
+ fieldGetTextAvatar = input('username');
58
+ fieldGetColorAvatar = input();
59
+ classAvatarInclude = input('mr-[8px]', { transform: (value) => value || 'mr-[8px]' });
60
+ getLastTextAfterSpace = input();
61
+ linkImageError = input();
62
+ showError = input(true);
63
+ showBorderError = model();
64
+ disable = input();
65
+ readonly = input();
66
+ labelConfig = input();
67
+ disableLabel = input();
68
+ listSearchConfig = input({ noBorder: true }, { transform: (value) => value || { noBorder: true } });
69
+ isSearchOnline = input(false);
70
+ listHiddenInputSearch = input();
71
+ listSearchPadding = input();
72
+ listKeySearch = input();
73
+ listDividerClassInclude = input();
74
+ listConfig = input();
75
+ listButtonsOther = input();
76
+ listHasButtonUnSelectOption = input();
77
+ listClickExactly = input();
78
+ listBackgroundCustom = input();
79
+ listMaxItemShow = input(5);
80
+ listKeySelected = model();
81
+ listMultiKeySelected = model();
82
+ listKeysDisable = input(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
83
+ listKeysHidden = input(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll
84
+ validRequired = input();
85
+ validMaxItemSelected = input();
86
+ changeValidUndefinedResetError = input();
87
+ allowSelectItemMultiple = input();
88
+ focusInputSearch = input(true);
89
+ onlyEmitDataWhenReset = input(); // true khi muốn emit sự kiện thay đổi key
90
+ resetKeyWhenSelectAllKey = input();
91
+ listConfigHasDivider = input(true);
92
+ classIncludeIcon = input('ml-[8px]', { transform: (value) => value || 'ml-[8px]' });
93
+ classIncludeContent = input();
94
+ listIgnoreClassDisableDefaultWhenUseKeysDisableItem = input(); // bỏ chế độ disable item trên html list view để disable từng phần trong rows
95
+ tabKeyActive = model();
96
+ tabsConfig = input();
97
+ ignoreBorderBottom = input();
98
+ // #region OUTPUT
99
+ outSelectKey = output(); // sử dụng cho type chọn 1.
100
+ outSelectMultiKey = output(); // sử dụng cho type cho phép chọn nhiều.
101
+ outFunctionsControl = output();
102
+ outValidEvent = output();
103
+ outChangStageFlagMouse = output();
104
+ outDataChange = output();
105
+ outClickButtonOther = output();
106
+ outShowList = output();
107
+ outChangeTabKeyActive = output();
108
+ /* INJECT*/
109
+ translate = inject(TranslateService);
110
+ httpRequestService = inject(LibsUiHttpRequestService);
111
+ constructor() {
112
+ effect(() => {
113
+ const listConfig = this.listConfig();
114
+ if (listConfig) {
115
+ untracked(() => this.fieldKey.set(getFieldKeyByType(listConfig, 'id')));
116
+ }
117
+ });
118
+ effect(() => {
119
+ if (!isNil(this.listKeySelected()) && this.listKeySelected() !== '' && !this.itemsSelected()) {
120
+ untracked(() => {
121
+ this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });
122
+ });
123
+ }
124
+ });
125
+ effect(() => {
126
+ if (this.changeValidUndefinedResetError() && this.validRequired()) {
127
+ untracked(() => this.resetError());
128
+ }
129
+ });
130
+ effect(() => {
131
+ if (this.listMultiKeySelected()) {
132
+ untracked(() => {
133
+ const previousValue = this.keysSelected() || [];
134
+ const currentValue = this.listMultiKeySelected() || [];
135
+ if (isEqual(cloneDeep(previousValue), cloneDeep(currentValue))) {
136
+ return;
137
+ }
138
+ this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });
139
+ });
140
+ }
141
+ });
142
+ }
143
+ async ngOnInit() {
144
+ const listConfig = this.listConfig();
145
+ if (this.listKeySelected() || this.listMultiKeySelected()) {
146
+ this.lengthKeys.set(this.listKeySelected() ? 1 : this.listMultiKeySelected()?.length || 0);
147
+ }
148
+ if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.()?.autoSelectAllItem || listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {
149
+ try {
150
+ this.loadingDetail.set(true);
151
+ const httpRequestData = listConfig.httpRequestData();
152
+ const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestData;
153
+ this.httpRequestService.updateArguments(argumentsValue, { ...this.httpRequestService.fakeResponsePagingApi(), dropdownTabKeyActive: this.tabKeyActive }, {}, '', true, false, guideAutoUpdateArgumentsValue);
154
+ const result = await this.httpRequestService.callApi(httpRequestData);
155
+ this.loadingDetail.set(false);
156
+ if (result?.data) {
157
+ this.items.set(result.data);
158
+ this.emitAutoSelectKey(result.data, listConfig.type);
159
+ this.autoSelectedFirstItemCallOutsideBefore.set(true);
160
+ }
161
+ }
162
+ catch (error) {
163
+ console.log(error);
164
+ this.items.set([]);
165
+ this.loadingDetail.set(false);
166
+ }
167
+ this.outDataChange.emit(this.items());
168
+ }
169
+ this.outFunctionsControl.emit(this.FunctionsControl);
170
+ this.checkValid(true);
171
+ }
172
+ /* FUNCTIONS */
173
+ get FunctionsControl() {
174
+ return {
175
+ reset: this.reset.bind(this),
176
+ checkIsValid: this.valid.bind(this),
177
+ resetError: this.resetError.bind(this),
178
+ setError: this.setError.bind(this),
179
+ removeList: async () => this.popoverFunctionControl()?.removePopoverOverlay(),
180
+ getDisable: async () => this.disable() ?? false,
181
+ updateLabelItemSelected: async (label) => this.itemsSelected.update((value) => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),
182
+ refreshList: async () => this.listFunctionControl()?.refresh(),
183
+ setItemSelectedByKey: this.setItemSelectedByKey.bind(this),
184
+ };
185
+ }
186
+ defaultConvertItemSelected(item) {
187
+ if (!item) {
188
+ return;
189
+ }
190
+ const fieldGetLabel = this.fieldGetLabel();
191
+ const value = fieldGetLabel ? get(item, fieldGetLabel) : undefined;
192
+ set(item, this.fieldLabel(), value ?? get(item, 'label') ?? get(item, 'name') ?? ' ');
193
+ }
194
+ getLabelItemSelected() {
195
+ let label = ' ';
196
+ if (!this.lengthKeys()) {
197
+ label = this.textDisplayWhenNoSelect();
198
+ }
199
+ if (this.lengthKeys() > 1) {
200
+ label = this.textDisplayWhenMultiSelect();
201
+ }
202
+ if (this.lengthKeys() === 1) {
203
+ label = get(this.itemsSelected(), this.fieldLabel()) || this.textDisplayWhenNoSelect();
204
+ }
205
+ return label;
206
+ }
207
+ emitAutoSelectKey(items, type) {
208
+ const listConfig = this.listConfig();
209
+ if (!items || !items.length || !listConfig || (!listConfig.autoSelectFirstItem && !listConfig.configTemplateCheckbox?.()?.autoSelectAllItem && !listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect)) {
210
+ return;
211
+ }
212
+ const flatItemsSupportAutoSelect = listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect;
213
+ if (type === 'group' && flatItemsSupportAutoSelect) {
214
+ items = flatItemsSupportAutoSelect(items);
215
+ }
216
+ if (listConfig.autoSelectFirstItem) {
217
+ const item = items[0];
218
+ const key = get(item, this.fieldKey());
219
+ if (type === 'radio' || type === 'text') {
220
+ this.handlerSelectedKey({ key, item, isClickManual: false });
221
+ this.listKeySelected.set(key);
222
+ return;
223
+ }
224
+ this.handlerSelectMultiKey({ keys: [key], mapKeys: [{ key, item, isClickManual: false }], isClickManual: false });
225
+ this.listMultiKeySelected.set([key]);
226
+ return;
227
+ }
228
+ if (type !== 'checkbox' && type !== 'group') {
229
+ return;
230
+ }
231
+ const keys = [];
232
+ const mapKeys = [];
233
+ items.forEach((item) => {
234
+ const key = get(item, this.fieldKey());
235
+ if (isNil(key)) {
236
+ return;
237
+ }
238
+ keys.push(key);
239
+ mapKeys.push({ key, item, isClickManual: false });
240
+ });
241
+ this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });
242
+ this.listMultiKeySelected.set(keys);
243
+ }
244
+ handlerEvent(type) {
245
+ if (type === 'click') {
246
+ return;
247
+ }
248
+ if (type === 'remove') {
249
+ this.showList.set(false);
250
+ this.outShowList.emit(this.showList());
251
+ return;
252
+ }
253
+ this.showList.set(true);
254
+ this.outShowList.emit(this.showList());
255
+ }
256
+ handlerDataChange(items) {
257
+ this.items.set(items);
258
+ this.popoverFunctionControl()?.updatePopoverOverlayPosition();
259
+ this.outDataChange.emit(this.items());
260
+ }
261
+ handlerChangeFlagMouse(event) {
262
+ this.flagMouseContent.set(event);
263
+ this.mergeFlagMouse();
264
+ }
265
+ handlerClickButtonOther(button) {
266
+ this.outClickButtonOther.emit(button);
267
+ this.popoverFunctionControl()?.removePopoverOverlay();
268
+ }
269
+ handlerPopoverControlEvent(event) {
270
+ this.popoverFunctionControl.set(event);
271
+ }
272
+ async handlerSelectedKey(event) {
273
+ const key = event?.key;
274
+ const item = event?.item;
275
+ const isClickManual = event?.isClickManual;
276
+ this.lengthKeys.set(!(isNil(key) || (typeof key === 'string' && key === '')) ? 1 : 0);
277
+ this.listKeySelected.set(key);
278
+ if (!this.allowSelectItemMultiple() && this.itemsSelected() && get(this.itemsSelected(), this.fieldKey()) === key) {
279
+ return;
280
+ }
281
+ if (isClickManual) {
282
+ if (!(isNil(key) || (typeof key === 'string' && key === '')) && (item || this.itemsSelected())) {
283
+ this.popoverFunctionControl()?.removePopoverOverlay();
284
+ }
285
+ }
286
+ this.checkValid();
287
+ if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {
288
+ let itemSelected = await this.setItemSelectedByKey(key);
289
+ if (!itemSelected) {
290
+ itemSelected = {
291
+ [this.fieldKey()]: key,
292
+ [this.fieldLabel()]: CHARACTER_DATA_EMPTY,
293
+ };
294
+ this.itemsSelected.set(itemSelected);
295
+ }
296
+ if (event) {
297
+ event.item = itemSelected;
298
+ }
299
+ this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
300
+ return;
301
+ }
302
+ this.itemsSelected.set(cloneDeep(item));
303
+ this.buildDisplay();
304
+ this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
305
+ }
306
+ async handlerSelectMultiKey(event, isClickManual = false) {
307
+ if (this.listConfig()?.configTemplateGroup?.()?.singleSelectItem && event?.mapKeys?.length) {
308
+ const itemClickManual = event.mapKeys.find((mapKey) => mapKey.item && mapKey.item.isCheckManual);
309
+ if (itemClickManual) {
310
+ setTimeout(() => (itemClickManual.item.isCheckManual = false));
311
+ event.keys = [itemClickManual.key];
312
+ event.mapKeys = [itemClickManual];
313
+ this.popoverFunctionControl()?.removePopoverOverlay();
314
+ }
315
+ }
316
+ this.keysSelected.set([...(event?.keys || [])]);
317
+ this.listMultiKeySelected.set([...(event?.keys || [])]);
318
+ this.lengthKeys.set(event?.keys?.length || 0);
319
+ this.checkValid();
320
+ if (this.lengthKeys() > 1) {
321
+ this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
322
+ return;
323
+ }
324
+ const key = event?.keys[0];
325
+ let item = event?.mapKeys?.find((item) => item.key === key)?.item;
326
+ if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {
327
+ item = await this.setItemSelectedByKey(key);
328
+ this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });
329
+ return;
330
+ }
331
+ this.itemsSelected.set(cloneDeep(item));
332
+ this.buildDisplay();
333
+ this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
334
+ }
335
+ async setItemSelectedByKey(key) {
336
+ const httpRequestDetailItemById = this.httpRequestDetailItemById();
337
+ if (!httpRequestDetailItemById || this.loadingDetail()) {
338
+ return;
339
+ }
340
+ try {
341
+ this.loadingDetail.set(true);
342
+ const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;
343
+ this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);
344
+ const result = await this.httpRequestService.callApi(httpRequestDetailItemById);
345
+ const item = cloneDeep(result?.data?.[0] || result?.data);
346
+ this.itemsSelected.set(item);
347
+ this.buildDisplay();
348
+ this.loadingDetail.set(false);
349
+ return item;
350
+ }
351
+ catch (error) {
352
+ console.log(error);
353
+ this.loadingDetail.set(false);
354
+ return;
355
+ }
356
+ }
357
+ handlerChangeTab() {
358
+ this.outChangeTabKeyActive.emit(this.tabKeyActive());
359
+ }
360
+ handlerLoadingList(event) {
361
+ this.loadingList.set(event);
362
+ }
363
+ async setError(error) {
364
+ this.error.set({ message: error });
365
+ this.showBorderError.set(true);
366
+ }
367
+ async valid() {
368
+ if (this.error()?.message) {
369
+ return false;
370
+ }
371
+ return this.checkValid();
372
+ }
373
+ checkValid(validateDefault) {
374
+ this.error.set(undefined);
375
+ const valid = { required: true, limitMaxItemSelect: true };
376
+ const validMaxItemSelected = this.validMaxItemSelected();
377
+ if (this.validRequired() && !this.lengthKeys()) {
378
+ valid.required = false;
379
+ }
380
+ if (validMaxItemSelected && this.lengthKeys() > validMaxItemSelected.value) {
381
+ valid.limitMaxItemSelect = false;
382
+ }
383
+ if (!validateDefault && valid.required === false) {
384
+ const validRequired = this.validRequired();
385
+ this.error.set({ ...(validRequired || {}), message: validRequired?.message || ERROR_MESSAGE_EMPTY_VALID });
386
+ }
387
+ if (!validateDefault && !this.error() && valid.limitMaxItemSelect === false) {
388
+ const validMaxItemSelected = this.validMaxItemSelected();
389
+ this.error.set({ ...(validMaxItemSelected || {}), message: validMaxItemSelected?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: { value: validMaxItemSelected?.value } });
390
+ }
391
+ this.outValidEvent.emit(valid.required && valid.limitMaxItemSelect);
392
+ return valid.required && valid.limitMaxItemSelect;
393
+ }
394
+ async resetError() {
395
+ this.error.set(undefined);
396
+ this.showBorderError.set(false);
397
+ }
398
+ handlerListFunctionsControl(event) {
399
+ this.listFunctionControl.set(event);
400
+ }
401
+ handlerChangStageFlagMouse(flag) {
402
+ this.flagMouse.set(flag);
403
+ this.mergeFlagMouse();
404
+ }
405
+ async reset() {
406
+ this.itemsSelected.set(undefined);
407
+ this.lengthKeys.set(0);
408
+ this.listFunctionControl()?.resetKeySelected();
409
+ if (!this.showList() && this.onlyEmitDataWhenReset()) {
410
+ this.outSelectKey.emit(undefined);
411
+ this.outSelectMultiKey.emit(undefined);
412
+ }
413
+ this.listKeySelected.set(undefined);
414
+ this.listMultiKeySelected.set(undefined);
415
+ this.keysSelected.set([]);
416
+ this.error.set(undefined);
417
+ }
418
+ async buildDisplay() {
419
+ if (this.itemsSelected()) {
420
+ this.convertItemSelected()(this.itemsSelected(), this.translate);
421
+ const getPopoverItemSelected = this.getPopoverItemSelected();
422
+ if (getPopoverItemSelected) {
423
+ this.popoverItemSelected.set(await getPopoverItemSelected(this.itemsSelected, this.translate));
424
+ }
425
+ }
426
+ }
427
+ mergeFlagMouse() {
428
+ const flag = { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false };
429
+ if (this.flagMouseContent()?.isMouseEnter || this.flagMouse().isMouseEnter) {
430
+ flag.isMouseEnter = true;
431
+ }
432
+ if (this.flagMouseContent()?.isMouseEnterContent || this.flagMouse().isMouseEnterContent) {
433
+ flag.isMouseEnterContent = true;
434
+ }
435
+ if (this.flagMouseContent()?.isContainerHasScroll || this.flagMouse().isContainerHasScroll) {
436
+ flag.isContainerHasScroll = true;
437
+ }
438
+ this.outChangStageFlagMouse.emit(flag);
439
+ }
440
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
441
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsDropdownComponent, isStandalone: true, selector: "libs_ui-components-dropdown", inputs: { useXssFilter: { classPropertyName: "useXssFilter", publicName: "useXssFilter", isSignal: true, isRequired: false, transformFunction: null }, popoverElementRefCustom: { classPropertyName: "popoverElementRefCustom", publicName: "popoverElementRefCustom", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, ignoreStopPropagationEvent: { classPropertyName: "ignoreStopPropagationEvent", publicName: "ignoreStopPropagationEvent", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, flagMouseContent: { classPropertyName: "flagMouseContent", publicName: "flagMouseContent", isSignal: true, isRequired: false, transformFunction: null }, popoverCustomConfig: { classPropertyName: "popoverCustomConfig", publicName: "popoverCustomConfig", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, convertItemSelected: { classPropertyName: "convertItemSelected", publicName: "convertItemSelected", isSignal: true, isRequired: false, transformFunction: null }, getPopoverItemSelected: { classPropertyName: "getPopoverItemSelected", publicName: "getPopoverItemSelected", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDetailItemById: { classPropertyName: "httpRequestDetailItemById", publicName: "httpRequestDetailItemById", isSignal: true, isRequired: false, transformFunction: null }, lengthKeys: { classPropertyName: "lengthKeys", publicName: "lengthKeys", isSignal: true, isRequired: false, transformFunction: null }, textDisplayWhenNoSelect: { classPropertyName: "textDisplayWhenNoSelect", publicName: "textDisplayWhenNoSelect", isSignal: true, isRequired: false, transformFunction: null }, textDisplayWhenMultiSelect: { classPropertyName: "textDisplayWhenMultiSelect", publicName: "textDisplayWhenMultiSelect", isSignal: true, isRequired: false, transformFunction: null }, classIncludeTextDisplayWhenNoSelect: { classPropertyName: "classIncludeTextDisplayWhenNoSelect", publicName: "classIncludeTextDisplayWhenNoSelect", isSignal: true, isRequired: false, transformFunction: null }, fieldLabel: { classPropertyName: "fieldLabel", publicName: "fieldLabel", isSignal: true, isRequired: false, transformFunction: null }, fieldGetLabel: { classPropertyName: "fieldGetLabel", publicName: "fieldGetLabel", isSignal: true, isRequired: false, transformFunction: null }, labelPopoverConfig: { classPropertyName: "labelPopoverConfig", publicName: "labelPopoverConfig", isSignal: true, isRequired: false, transformFunction: null }, labelPopoverFullWidth: { classPropertyName: "labelPopoverFullWidth", publicName: "labelPopoverFullWidth", isSignal: true, isRequired: false, transformFunction: null }, hasContentUnitRight: { classPropertyName: "hasContentUnitRight", publicName: "hasContentUnitRight", isSignal: true, isRequired: false, transformFunction: null }, listSearchNoDataTemplateRef: { classPropertyName: "listSearchNoDataTemplateRef", publicName: "listSearchNoDataTemplateRef", isSignal: true, isRequired: false, transformFunction: null }, fieldGetImage: { classPropertyName: "fieldGetImage", publicName: "fieldGetImage", isSignal: true, isRequired: false, transformFunction: null }, imageSize: { classPropertyName: "imageSize", publicName: "imageSize", isSignal: true, isRequired: false, transformFunction: null }, typeShape: { classPropertyName: "typeShape", publicName: "typeShape", isSignal: true, isRequired: false, transformFunction: null }, fieldGetIcon: { classPropertyName: "fieldGetIcon", publicName: "fieldGetIcon", isSignal: true, isRequired: false, transformFunction: null }, fieldGetTextAvatar: { classPropertyName: "fieldGetTextAvatar", publicName: "fieldGetTextAvatar", isSignal: true, isRequired: false, transformFunction: null }, fieldGetColorAvatar: { classPropertyName: "fieldGetColorAvatar", publicName: "fieldGetColorAvatar", isSignal: true, isRequired: false, transformFunction: null }, classAvatarInclude: { classPropertyName: "classAvatarInclude", publicName: "classAvatarInclude", isSignal: true, isRequired: false, transformFunction: null }, getLastTextAfterSpace: { classPropertyName: "getLastTextAfterSpace", publicName: "getLastTextAfterSpace", isSignal: true, isRequired: false, transformFunction: null }, linkImageError: { classPropertyName: "linkImageError", publicName: "linkImageError", isSignal: true, isRequired: false, transformFunction: null }, showError: { classPropertyName: "showError", publicName: "showError", isSignal: true, isRequired: false, transformFunction: null }, showBorderError: { classPropertyName: "showBorderError", publicName: "showBorderError", isSignal: true, isRequired: false, transformFunction: null }, disable: { classPropertyName: "disable", publicName: "disable", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, disableLabel: { classPropertyName: "disableLabel", publicName: "disableLabel", isSignal: true, isRequired: false, transformFunction: null }, listSearchConfig: { classPropertyName: "listSearchConfig", publicName: "listSearchConfig", isSignal: true, isRequired: false, transformFunction: null }, isSearchOnline: { classPropertyName: "isSearchOnline", publicName: "isSearchOnline", isSignal: true, isRequired: false, transformFunction: null }, listHiddenInputSearch: { classPropertyName: "listHiddenInputSearch", publicName: "listHiddenInputSearch", isSignal: true, isRequired: false, transformFunction: null }, listSearchPadding: { classPropertyName: "listSearchPadding", publicName: "listSearchPadding", isSignal: true, isRequired: false, transformFunction: null }, listKeySearch: { classPropertyName: "listKeySearch", publicName: "listKeySearch", isSignal: true, isRequired: false, transformFunction: null }, listDividerClassInclude: { classPropertyName: "listDividerClassInclude", publicName: "listDividerClassInclude", isSignal: true, isRequired: false, transformFunction: null }, listConfig: { classPropertyName: "listConfig", publicName: "listConfig", isSignal: true, isRequired: false, transformFunction: null }, listButtonsOther: { classPropertyName: "listButtonsOther", publicName: "listButtonsOther", isSignal: true, isRequired: false, transformFunction: null }, listHasButtonUnSelectOption: { classPropertyName: "listHasButtonUnSelectOption", publicName: "listHasButtonUnSelectOption", isSignal: true, isRequired: false, transformFunction: null }, listClickExactly: { classPropertyName: "listClickExactly", publicName: "listClickExactly", isSignal: true, isRequired: false, transformFunction: null }, listBackgroundCustom: { classPropertyName: "listBackgroundCustom", publicName: "listBackgroundCustom", isSignal: true, isRequired: false, transformFunction: null }, listMaxItemShow: { classPropertyName: "listMaxItemShow", publicName: "listMaxItemShow", isSignal: true, isRequired: false, transformFunction: null }, listKeySelected: { classPropertyName: "listKeySelected", publicName: "listKeySelected", isSignal: true, isRequired: false, transformFunction: null }, listMultiKeySelected: { classPropertyName: "listMultiKeySelected", publicName: "listMultiKeySelected", isSignal: true, isRequired: false, transformFunction: null }, listKeysDisable: { classPropertyName: "listKeysDisable", publicName: "listKeysDisable", isSignal: true, isRequired: false, transformFunction: null }, listKeysHidden: { classPropertyName: "listKeysHidden", publicName: "listKeysHidden", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMaxItemSelected: { classPropertyName: "validMaxItemSelected", publicName: "validMaxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, changeValidUndefinedResetError: { classPropertyName: "changeValidUndefinedResetError", publicName: "changeValidUndefinedResetError", isSignal: true, isRequired: false, transformFunction: null }, allowSelectItemMultiple: { classPropertyName: "allowSelectItemMultiple", publicName: "allowSelectItemMultiple", isSignal: true, isRequired: false, transformFunction: null }, focusInputSearch: { classPropertyName: "focusInputSearch", publicName: "focusInputSearch", isSignal: true, isRequired: false, transformFunction: null }, onlyEmitDataWhenReset: { classPropertyName: "onlyEmitDataWhenReset", publicName: "onlyEmitDataWhenReset", isSignal: true, isRequired: false, transformFunction: null }, resetKeyWhenSelectAllKey: { classPropertyName: "resetKeyWhenSelectAllKey", publicName: "resetKeyWhenSelectAllKey", isSignal: true, isRequired: false, transformFunction: null }, listConfigHasDivider: { classPropertyName: "listConfigHasDivider", publicName: "listConfigHasDivider", isSignal: true, isRequired: false, transformFunction: null }, classIncludeIcon: { classPropertyName: "classIncludeIcon", publicName: "classIncludeIcon", isSignal: true, isRequired: false, transformFunction: null }, classIncludeContent: { classPropertyName: "classIncludeContent", publicName: "classIncludeContent", isSignal: true, isRequired: false, transformFunction: null }, listIgnoreClassDisableDefaultWhenUseKeysDisableItem: { classPropertyName: "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", publicName: "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", isSignal: true, isRequired: false, transformFunction: null }, tabKeyActive: { classPropertyName: "tabKeyActive", publicName: "tabKeyActive", isSignal: true, isRequired: false, transformFunction: null }, tabsConfig: { classPropertyName: "tabsConfig", publicName: "tabsConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderBottom: { classPropertyName: "ignoreBorderBottom", publicName: "ignoreBorderBottom", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { flagMouse: "flagMouseChange", flagMouseContent: "flagMouseContentChange", lengthKeys: "lengthKeysChange", showBorderError: "showBorderErrorChange", listKeySelected: "listKeySelectedChange", listMultiKeySelected: "listMultiKeySelectedChange", tabKeyActive: "tabKeyActiveChange", outSelectKey: "outSelectKey", outSelectMultiKey: "outSelectMultiKey", outFunctionsControl: "outFunctionsControl", outValidEvent: "outValidEvent", outChangStageFlagMouse: "outChangStageFlagMouse", outDataChange: "outDataChange", outClickButtonOther: "outClickButtonOther", outShowList: "outShowList", outChangeTabKeyActive: "outChangeTabKeyActive" }, ngImport: i0, template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as label) {\n <libs_ui-components-label\n [classInclude]=\"label.classInclude\"\n [labelLeft]=\"label.labelLeft\"\n [labelLeftClass]=\"label.labelLeftClass\"\n [required]=\"label.required\"\n [description]=\"label.description\"\n [descriptionClass]=\"label.descriptionClass\"\n [labelRight]=\"label.labelRight\"\n [labelRightClass]=\"label.labelRightClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [buttonsLeft]=\"label.buttonsLeft\"\n [buttonsRight]=\"label.buttonsRight\"\n [disableButtonsLeft]=\"label.disableButtonsLeft || disable() || loadingDetail()\"\n [disableButtonsRight]=\"label.disableButtonsRight || disable() || loadingDetail()\"\n [hasToggle]=\"label.hasToggle\"\n [toggleActive]=\"label.toggleActive\"\n [toggleDisable]=\"label.toggleDisable || disable() || loadingDetail()\"\n [popover]=\"label.popover\"\n [iconPopoverClass]=\"label.iconPopoverClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [limitLength]=\"label.limitLength\"\n [buttonsDescription]=\"label.buttonsDescription\"\n [disableButtonsDescription]=\"label.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"label.buttonsDescriptionContainerClass\"\n [count]=\"label.count\" />\n }\n <libs_ui-components-popover\n [ignoreShowPopover]=\"disable() || readonly() || loadingDetail()\"\n [class]=\"classInclude() || 'w-full'\"\n [mode]=\"'click-toggle'\"\n [flagMouse]=\"flagMouse()\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [elementRefCustom]=\"popoverElementRefCustom()\"\n [config]=\"{\n animationConfig: popoverCustomConfig()?.animationConfig || {},\n zIndex: zIndex() ?? 1000,\n widthByParent: popoverCustomConfig()?.widthByParent ?? true,\n parentBorderWidth: popoverCustomConfig()?.parentBorderWidth ?? 0,\n maxHeight: popoverCustomConfig()?.maxHeight ?? 2048,\n maxWidth: popoverCustomConfig()?.maxWidth ?? 2048,\n direction: popoverCustomConfig()?.direction ?? 'bottom',\n template: listViewEl,\n whiteTheme: true,\n timerDestroy: popoverCustomConfig()?.timerDestroy ?? 0,\n ignoreArrow: popoverCustomConfig()?.ignoreArrow ?? true,\n directionDistance: 2,\n classInclude: '!rounded-[4px] overflow-hidden ' + (popoverCustomConfig()?.classInclude ?? 'libs-ui-border-general '),\n position: popoverCustomConfig()?.position || { mode: 'start', distance: 0 },\n width: popoverCustomConfig()?.width,\n classIncludeOverlayBody: popoverCustomConfig()?.classIncludeOverlayBody,\n }\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outEvent)=\"handlerEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n @if (!isNgContent()) {\n <div\n [class]=\"'libs-ui-dropdown ' + (classIncludeContent() || '')\"\n [class.libs-ui-border-general]=\"!error() && !showBorderError() && !showList()\"\n [class.libs-ui-border-primary-focus-general]=\"!error() && !showBorderError() && showList()\"\n [class.libs-ui-border-error-general]=\"error() || showBorderError()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.cursor-pointer]=\"!(disable() || loadingDetail() || readonly())\"\n [class.libs-ui-disable]=\"disable() || loadingDetail()\"\n [class.libs-ui-disable-background]=\"disable() || loadingDetail()\"\n [class.pointer-events-none]=\"loadingDetail()\"\n [class.rounded-tr-0]=\"hasContentUnitRight()\"\n [class.rounded-br-0]=\"hasContentUnitRight()\">\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center w-full relative\">\n <div\n class=\"flex items-center w-full absolute\"\n [class.libs-ui-dropdown-placeholder]=\"!lengthKeys()\">\n @if (lengthKeys() === 1) {\n @if (itemsSelected(); as itemsSelected) {\n @if (fieldGetImage(); as fieldGetImage) {\n <libs_ui-components-avatar\n [classInclude]=\"classAvatarInclude()\"\n [typeShape]=\"typeShape()\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"itemsSelected[fieldGetImage]\"\n [linkAvatarError]=\"linkImageError()\"\n [idGenColor]=\"itemsSelected[fieldGetColorAvatar() || fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\"\n [textAvatar]=\"itemsSelected[fieldGetTextAvatar()]\" />\n }\n @if (fieldGetIcon(); as fieldGetIcon) {\n <i [class]=\"itemsSelected[fieldGetIcon] + ' mr-[8px]'\"></i>\n }\n }\n }\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"(labelPopoverFullWidth() ? 'w-100 ' : '') + classIncludeTextDisplayWhenNoSelect()\"\n [innerHTML]=\"labelItemSelectedComputed() | translate: { value: lengthKeys() } | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n [config]=\"{ maxWidth: labelPopoverConfig()?.maxWidth || 250, direction: 'top', zIndex: labelPopoverConfig()?.zIndex, timerDestroy: labelPopoverConfig()?.timerDestroy || 0 }\"\n [ignoreStopPropagationEvent]=\"true\" />\n\n @if (popoverItemSelected(); as popoverItemSelected) {\n <libs_ui-components-popover\n [type]=\"popoverItemSelected.type || 'other'\"\n [config]=\"popoverItemSelected.config || {}\">\n @if (popoverItemSelected.dataView) {\n <div [innerHtml]=\"popoverItemSelected.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline text-[16px] mx-[8px]\"></i>\n }\n </libs_ui-components-popover>\n }\n </div>\n </div>\n <i\n class=\"text-[16px] libs-ui-icon-move-right rotate-90 text-[#6a7383] {{ classIncludeIcon() }}\"\n [class.libs-ui-disable]=\"readonly() || disable()\"></i>\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n @if (showError()) {\n @if (error(); as error) {\n @let constHtmlMessage = error.message || ' ';\n <div\n class=\"mt-[8px] libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: error.interpolateParams || {}\"></div>\n }\n }\n</div>\n<ng-template #listViewEl>\n <div\n style=\"display: flex; flex-direction: column\"\n [class.h-full]=\"listMaxItemShow() === -1\">\n @if (tabsConfig(); as tabsConfig) {\n <libs_ui-components-dropdown-tabs\n [tabsConfig]=\"tabsConfig\"\n [(tabKeyActive)]=\"tabKeyActive\"\n [ignoreBorderBottom]=\"ignoreBorderBottom()\"\n [disable]=\"disable() || loadingDetail() || loadingList()\"\n (outChange)=\"handlerChangeTab()\" />\n }\n <libs_ui-components-list\n [class.h-full]=\"listMaxItemShow() === -1\"\n [searchConfig]=\"listSearchConfig()\"\n [isSearchOnline]=\"isSearchOnline()\"\n [dropdownTabKeyActive]=\"tabKeyActive()\"\n [keySearch]=\"listKeySearch()\"\n [config]=\"listConfig()\"\n [autoSelectedFirstItemCallOutsideBefore]=\"autoSelectedFirstItemCallOutsideBefore()\"\n [paddingLeftItem]=\"popoverCustomConfig()?.paddingLeftItem ?? false\"\n [disable]=\"disable() || loadingDetail()\"\n [disableLabel]=\"disableLabel()\"\n [hiddenInputSearch]=\"listHiddenInputSearch()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow()\"\n [keySelected]=\"listKeySelected()\"\n [multiKeySelected]=\"listMultiKeySelected()\"\n [clickExactly]=\"popoverCustomConfig()?.clickExactly ?? false\"\n [dividerClassInclude]=\"listSearchConfig() ? listDividerClassInclude() : 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundCustom()\"\n [keysDisableItem]=\"listKeysDisable()\"\n [keysHiddenItem]=\"listKeysHidden()\"\n [hasButtonUnSelectOption]=\"listHasButtonUnSelectOption() ?? (!popoverCustomConfig() && !labelConfig()?.required && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [focusInputSearch]=\"focusInputSearch()\"\n [zIndex]=\"zIndex()\"\n [resetKeyWhenSelectAllKeyDropdown]=\"resetKeyWhenSelectAllKey()\"\n [ignoreClassDisableDefaultWhenUseKeysDisableItem]=\"listIgnoreClassDisableDefaultWhenUseKeysDisableItem()\"\n [hasDivider]=\"listConfigHasDivider()\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event, true)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outFunctionsControl)=\"handlerListFunctionsControl($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoadingList($event)\" />\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:flex;flex-direction:column}:host .libs-ui-dropdown{position:relative;width:100%;min-height:32px;display:flex;align-items:center;background-color:#fff;padding:0 16px;border-radius:4px;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: LibsUiPipesSecurityTrustPipe, name: "LibsUiPipesSecurityTrustPipe" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsAvatarComponent, selector: "libs_ui-components-avatar", inputs: ["typeShape", "classInclude", "size", "linkAvatar", "linkAvatarError", "classImageInclude", "zIndexPreviewImage", "clickPreviewImage", "idGenColor", "getLastTextAfterSpace", "textAvatar", "textAvatarClassInclude", "containertextAvatarClassInclude"], outputs: ["outAvatarError", "outEventPreviewImage"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "component", type: LibsUiComponentsDropdownTabsComponent, selector: "libs_ui-components-dropdown-tabs", inputs: ["ignoreBorderBottom", "tabsConfig", "tabKeyActive", "disable"], outputs: ["tabKeyActiveChange", "outChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
442
+ }
443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsDropdownComponent, decorators: [{
444
+ type: Component,
445
+ args: [{ selector: 'libs_ui-components-dropdown', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiPipesSecurityTrustPipe, AsyncPipe, LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsAvatarComponent, LibsUiComponentsListComponent, LibsUiComponentsDropdownTabsComponent], template: "<div class=\"flex flex-col w-full\">\n @if (labelConfig(); as label) {\n <libs_ui-components-label\n [classInclude]=\"label.classInclude\"\n [labelLeft]=\"label.labelLeft\"\n [labelLeftClass]=\"label.labelLeftClass\"\n [required]=\"label.required\"\n [description]=\"label.description\"\n [descriptionClass]=\"label.descriptionClass\"\n [labelRight]=\"label.labelRight\"\n [labelRightClass]=\"label.labelRightClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [buttonsLeft]=\"label.buttonsLeft\"\n [buttonsRight]=\"label.buttonsRight\"\n [disableButtonsLeft]=\"label.disableButtonsLeft || disable() || loadingDetail()\"\n [disableButtonsRight]=\"label.disableButtonsRight || disable() || loadingDetail()\"\n [hasToggle]=\"label.hasToggle\"\n [toggleActive]=\"label.toggleActive\"\n [toggleDisable]=\"label.toggleDisable || disable() || loadingDetail()\"\n [popover]=\"label.popover\"\n [iconPopoverClass]=\"label.iconPopoverClass\"\n [onlyShowCount]=\"label.onlyShowCount\"\n [limitLength]=\"label.limitLength\"\n [buttonsDescription]=\"label.buttonsDescription\"\n [disableButtonsDescription]=\"label.disableButtonsDescription || disable()\"\n [buttonsDescriptionContainerClass]=\"label.buttonsDescriptionContainerClass\"\n [count]=\"label.count\" />\n }\n <libs_ui-components-popover\n [ignoreShowPopover]=\"disable() || readonly() || loadingDetail()\"\n [class]=\"classInclude() || 'w-full'\"\n [mode]=\"'click-toggle'\"\n [flagMouse]=\"flagMouse()\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [ignoreCursorPointerModeLikeClick]=\"true\"\n [ignoreStopPropagationEvent]=\"ignoreStopPropagationEvent()\"\n [elementRefCustom]=\"popoverElementRefCustom()\"\n [config]=\"{\n animationConfig: popoverCustomConfig()?.animationConfig || {},\n zIndex: zIndex() ?? 1000,\n widthByParent: popoverCustomConfig()?.widthByParent ?? true,\n parentBorderWidth: popoverCustomConfig()?.parentBorderWidth ?? 0,\n maxHeight: popoverCustomConfig()?.maxHeight ?? 2048,\n maxWidth: popoverCustomConfig()?.maxWidth ?? 2048,\n direction: popoverCustomConfig()?.direction ?? 'bottom',\n template: listViewEl,\n whiteTheme: true,\n timerDestroy: popoverCustomConfig()?.timerDestroy ?? 0,\n ignoreArrow: popoverCustomConfig()?.ignoreArrow ?? true,\n directionDistance: 2,\n classInclude: '!rounded-[4px] overflow-hidden ' + (popoverCustomConfig()?.classInclude ?? 'libs-ui-border-general '),\n position: popoverCustomConfig()?.position || { mode: 'start', distance: 0 },\n width: popoverCustomConfig()?.width,\n classIncludeOverlayBody: popoverCustomConfig()?.classIncludeOverlayBody,\n }\"\n (outFunctionsControl)=\"handlerPopoverControlEvent($event)\"\n (outEvent)=\"handlerEvent($event)\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\">\n @if (!isNgContent()) {\n <div\n [class]=\"'libs-ui-dropdown ' + (classIncludeContent() || '')\"\n [class.libs-ui-border-general]=\"!error() && !showBorderError() && !showList()\"\n [class.libs-ui-border-primary-focus-general]=\"!error() && !showBorderError() && showList()\"\n [class.libs-ui-border-error-general]=\"error() || showBorderError()\"\n [class.libs-ui-readonly]=\"readonly()\"\n [class.libs-ui-readonly-background]=\"readonly()\"\n [class.cursor-pointer]=\"!(disable() || loadingDetail() || readonly())\"\n [class.libs-ui-disable]=\"disable() || loadingDetail()\"\n [class.libs-ui-disable-background]=\"disable() || loadingDetail()\"\n [class.pointer-events-none]=\"loadingDetail()\"\n [class.rounded-tr-0]=\"hasContentUnitRight()\"\n [class.rounded-br-0]=\"hasContentUnitRight()\">\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center w-full relative\">\n <div\n class=\"flex items-center w-full absolute\"\n [class.libs-ui-dropdown-placeholder]=\"!lengthKeys()\">\n @if (lengthKeys() === 1) {\n @if (itemsSelected(); as itemsSelected) {\n @if (fieldGetImage(); as fieldGetImage) {\n <libs_ui-components-avatar\n [classInclude]=\"classAvatarInclude()\"\n [typeShape]=\"typeShape()\"\n [size]=\"imageSize()\"\n [linkAvatar]=\"itemsSelected[fieldGetImage]\"\n [linkAvatarError]=\"linkImageError()\"\n [idGenColor]=\"itemsSelected[fieldGetColorAvatar() || fieldGetTextAvatar()]\"\n [getLastTextAfterSpace]=\"getLastTextAfterSpace()\"\n [textAvatar]=\"itemsSelected[fieldGetTextAvatar()]\" />\n }\n @if (fieldGetIcon(); as fieldGetIcon) {\n <i [class]=\"itemsSelected[fieldGetIcon] + ' mr-[8px]'\"></i>\n }\n }\n }\n <libs_ui-components-popover\n [type]=\"'text'\"\n [classInclude]=\"(labelPopoverFullWidth() ? 'w-100 ' : '') + classIncludeTextDisplayWhenNoSelect()\"\n [innerHTML]=\"labelItemSelectedComputed() | translate: { value: lengthKeys() } | LibsUiPipesSecurityTrustPipe: 'html' : useXssFilter() | async\"\n [config]=\"{ maxWidth: labelPopoverConfig()?.maxWidth || 250, direction: 'top', zIndex: labelPopoverConfig()?.zIndex, timerDestroy: labelPopoverConfig()?.timerDestroy || 0 }\"\n [ignoreStopPropagationEvent]=\"true\" />\n\n @if (popoverItemSelected(); as popoverItemSelected) {\n <libs_ui-components-popover\n [type]=\"popoverItemSelected.type || 'other'\"\n [config]=\"popoverItemSelected.config || {}\">\n @if (popoverItemSelected.dataView) {\n <div [innerHtml]=\"popoverItemSelected.dataView | translate\"></div>\n } @else {\n <i class=\"libs-ui-icon-tooltip-outline text-[16px] mx-[8px]\"></i>\n }\n </libs_ui-components-popover>\n }\n </div>\n </div>\n <i\n class=\"text-[16px] libs-ui-icon-move-right rotate-90 text-[#6a7383] {{ classIncludeIcon() }}\"\n [class.libs-ui-disable]=\"readonly() || disable()\"></i>\n </div>\n </div>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n @if (showError()) {\n @if (error(); as error) {\n @let constHtmlMessage = error.message || ' ';\n <div\n class=\"mt-[8px] libs-ui-text-error libs-ui-font-h7r\"\n [innerHtml]=\"constHtmlMessage | translate: error.interpolateParams || {}\"></div>\n }\n }\n</div>\n<ng-template #listViewEl>\n <div\n style=\"display: flex; flex-direction: column\"\n [class.h-full]=\"listMaxItemShow() === -1\">\n @if (tabsConfig(); as tabsConfig) {\n <libs_ui-components-dropdown-tabs\n [tabsConfig]=\"tabsConfig\"\n [(tabKeyActive)]=\"tabKeyActive\"\n [ignoreBorderBottom]=\"ignoreBorderBottom()\"\n [disable]=\"disable() || loadingDetail() || loadingList()\"\n (outChange)=\"handlerChangeTab()\" />\n }\n <libs_ui-components-list\n [class.h-full]=\"listMaxItemShow() === -1\"\n [searchConfig]=\"listSearchConfig()\"\n [isSearchOnline]=\"isSearchOnline()\"\n [dropdownTabKeyActive]=\"tabKeyActive()\"\n [keySearch]=\"listKeySearch()\"\n [config]=\"listConfig()\"\n [autoSelectedFirstItemCallOutsideBefore]=\"autoSelectedFirstItemCallOutsideBefore()\"\n [paddingLeftItem]=\"popoverCustomConfig()?.paddingLeftItem ?? false\"\n [disable]=\"disable() || loadingDetail()\"\n [disableLabel]=\"disableLabel()\"\n [hiddenInputSearch]=\"listHiddenInputSearch()\"\n [searchPadding]=\"listSearchPadding()\"\n [maxItemShow]=\"listMaxItemShow()\"\n [keySelected]=\"listKeySelected()\"\n [multiKeySelected]=\"listMultiKeySelected()\"\n [clickExactly]=\"popoverCustomConfig()?.clickExactly ?? false\"\n [dividerClassInclude]=\"listSearchConfig() ? listDividerClassInclude() : 'hidden'\"\n [buttonsOther]=\"listButtonsOther()\"\n [backgroundListCustom]=\"listBackgroundCustom()\"\n [keysDisableItem]=\"listKeysDisable()\"\n [keysHiddenItem]=\"listKeysHidden()\"\n [hasButtonUnSelectOption]=\"listHasButtonUnSelectOption() ?? (!popoverCustomConfig() && !labelConfig()?.required && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [focusInputSearch]=\"focusInputSearch()\"\n [zIndex]=\"zIndex()\"\n [resetKeyWhenSelectAllKeyDropdown]=\"resetKeyWhenSelectAllKey()\"\n [ignoreClassDisableDefaultWhenUseKeysDisableItem]=\"listIgnoreClassDisableDefaultWhenUseKeysDisableItem()\"\n [hasDivider]=\"listConfigHasDivider()\"\n (outSelectKey)=\"handlerSelectedKey($event)\"\n (outSelectMultiKey)=\"handlerSelectMultiKey($event, true)\"\n (outChangeView)=\"handlerDataChange($event)\"\n (outClickButtonOther)=\"handlerClickButtonOther($event)\"\n (outFunctionsControl)=\"handlerListFunctionsControl($event)\"\n (outChangStageFlagMousePopover)=\"handlerChangStageFlagMouse($event)\"\n (outLoading)=\"handlerLoadingList($event)\" />\n </div>\n</ng-template>\n", styles: [":host{width:100%;display:flex;flex-direction:column}:host .libs-ui-dropdown{position:relative;width:100%;min-height:32px;display:flex;align-items:center;background-color:#fff;padding:0 16px;border-radius:4px;cursor:pointer}\n"] }]
446
+ }], ctorParameters: () => [] });
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSwrQkFBK0IsRUFBOEMsTUFBTSw0QkFBNEIsQ0FBQztBQUd6SCxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBQ2hNLE9BQU8sRUFBdUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDeEssT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxFQUFzQix3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0ksT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3hFLE9BQU8s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QTRCLGdFQUFFLFNBQVMsOENBQUUsOEJBQThCLDRxQkFBRSxnQ0FBZ0Msb2dCQUFFLCtCQUErQiw2WEFBRSw2QkFBNkIsNi9CQUFFLHFDQUFxQzs7NEZBRWhPLGlDQUFpQztrQkFUN0MsU0FBUzsrQkFFRSw2QkFBNkIsY0FHM0IsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsZUFBZSxFQUFFLDRCQUE0QixFQUFFLFNBQVMsRUFBRSw4QkFBOEIsRUFBRSxnQ0FBZ0MsRUFBRSwrQkFBK0IsRUFBRSw2QkFBNkIsRUFBRSxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0F2YXRhckNvbXBvbmVudCwgVFlQRV9TSEFQRV9BVkFUQVIsIFRZUEVfU0laRV9BVkFUQVJfQ09ORklHIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1hdmF0YXInO1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUlucHV0U2VhcmNoQ29uZmlnIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBnZXRGaWVsZEtleUJ5VHlwZSwgSUxpc3REYXRhRW1pdEtleSwgSUxpc3REYXRhRW1pdE11bHRpS2V5LCBJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJTGlzdENvbmZpZ0l0ZW0sIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50LCBUWVBFX1RFTVBMQVRFIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElGbGFnTW91c2UsIElQb3BvdmVyLCBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUG9wb3Zlck92ZXJsYXksIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBUWVBFX1BPUE9WRVJfRVZFTlQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLXNlY3VyaXR5LXRydXN0JztcbmltcG9ydCB7IElIdHRwUmVxdWVzdENvbmZpZywgTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtaHR0cC1yZXF1ZXN0JztcbmltcG9ydCB7IENIQVJBQ1RFUl9EQVRBX0VNUFRZLCBjbG9uZURlZXAsIEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX1ZBTElELCBnZXQsIGlzRXF1YWwsIGlzTmlsLCBzZXQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IElEcm9wZG93blRhYnNJdGVtLCBJRW1pdE11bHRpS2V5LCBJRW1pdFNlbGVjdEtleSwgSVBvcG92ZXJDdXN0b21Db25maWcsIElWYWxpZE1heEl0ZW1TZWxlY3RlZCB9IGZyb20gJy4vaW50ZXJmYWNlcy9kcm9wZG93bi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duVGFic0NvbXBvbmVudCB9IGZyb20gJy4vdGFicy90YWJzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWVzc2FnZVRyYW5zbGF0ZSB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSwgQXN5bmNQaXBlLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duVGFic0NvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGVycm9yID0gc2lnbmFsPElNZXNzYWdlVHJhbnNsYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgc2hvd0xpc3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgaXRlbXNTZWxlY3RlZCA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsb2FkaW5nRGV0YWlsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdMaXN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByb3RlY3RlZCBwb3BvdmVySXRlbVNlbGVjdGVkID0gc2lnbmFsPElQb3BvdmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGFiZWxJdGVtU2VsZWN0ZWRDb21wdXRlZCA9IGNvbXB1dGVkKHRoaXMuZ2V0TGFiZWxJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG4gIHByb3RlY3RlZCBhdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8dW5rbm93bj4+KFtdKTtcbiAgcHJpdmF0ZSBwb3BvdmVyRnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZmllbGRLZXkgPSBzaWduYWw8c3RyaW5nPignaWQnKTtcbiAgcHJpdmF0ZSBsaXN0RnVuY3Rpb25Db250cm9sID0gc2lnbmFsPElMaXN0RnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSB1c2VYc3NGaWx0ZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHBvcG92ZXJFbGVtZW50UmVmQ3VzdG9tID0gaW5wdXQ8SFRNTEVsZW1lbnQ+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IG1vZGVsPElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZUNvbnRlbnQgPSBtb2RlbDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBwb3BvdmVyQ3VzdG9tQ29uZmlnID0gaW5wdXQ8SVBvcG92ZXJDdXN0b21Db25maWc+KCk7XG4gIHJlYWRvbmx5IGlzTmdDb250ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBjb252ZXJ0SXRlbVNlbGVjdGVkID0gaW5wdXQ8KGl0ZW06IHVua25vd24sIHRyYW5zbGF0ZT86IFRyYW5zbGF0ZVNlcnZpY2UpID0+IHZvaWQ+KHRoaXMuZGVmYXVsdENvbnZlcnRJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG4gIHJlYWRvbmx5IGdldFBvcG92ZXJJdGVtU2VsZWN0ZWQgPSBpbnB1dDwoaXRlbTogdW5rbm93biwgdHJhbnNsYXRlPzogVHJhbnNsYXRlU2VydmljZSkgPT4gUHJvbWlzZTxJUG9wb3ZlciB8IHVuZGVmaW5lZD4+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQgPSBpbnB1dDxJSHR0cFJlcXVlc3RDb25maWc+KCk7XG4gIHJlYWRvbmx5IGxlbmd0aEtleXMgPSBtb2RlbDxudW1iZXI+KDApO1xuICByZWFkb25seSB0ZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCA9IGlucHV0PHN0cmluZz4oJ2kxOG5fc2VsZWN0X2luZm9ybWF0aW9uJyk7XG4gIHJlYWRvbmx5IHRleHREaXNwbGF5V2hlbk11bHRpU2VsZWN0ID0gaW5wdXQ8c3RyaW5nPignaTE4bl9zZWxlY3Rpbmdfb3B0aW9ucycpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVUZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNXInKTtcbiAgcmVhZG9ubHkgZmllbGRMYWJlbCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignbGFiZWxEaXNwbGF5JywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ2xhYmVsRGlzcGxheScgfSk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0TGFiZWwgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxhYmVsUG9wb3ZlckNvbmZpZyA9IGlucHV0PElQb3BvdmVyT3ZlcmxheT4oKTtcbiAgcmVhZG9ubHkgbGFiZWxQb3BvdmVyRnVsbFdpZHRoID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGhhc0NvbnRlbnRVbml0UmlnaHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0U2VhcmNoTm9EYXRhVGVtcGxhdGVSZWYgPSBpbnB1dDxUZW1wbGF0ZVJlZjx1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRJbWFnZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaW1hZ2VTaXplID0gaW5wdXQ8VFlQRV9TSVpFX0FWQVRBUl9DT05GSUc+KDE2KTtcbiAgcmVhZG9ubHkgdHlwZVNoYXBlID0gaW5wdXQ8VFlQRV9TSEFQRV9BVkFUQVI+KCdjaXJjbGUnKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRJY29uID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBmaWVsZEdldFRleHRBdmF0YXIgPSBpbnB1dDxzdHJpbmc+KCd1c2VybmFtZScpO1xuICByZWFkb25seSBmaWVsZEdldENvbG9yQXZhdGFyID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBjbGFzc0F2YXRhckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ21yLVs4cHhdJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ21yLVs4cHhdJyB9KTtcbiAgcmVhZG9ubHkgZ2V0TGFzdFRleHRBZnRlclNwYWNlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlua0ltYWdlRXJyb3IgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHNob3dFcnJvciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBzaG93Qm9yZGVyRXJyb3IgPSBtb2RlbDxib29sZWFuPigpO1xuICByZWFkb25seSBkaXNhYmxlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsYWJlbENvbmZpZyA9IGlucHV0PElMYWJlbD4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZUxhYmVsID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSBsaXN0U2VhcmNoQ29uZmlnID0gaW5wdXQ8SUlucHV0U2VhcmNoQ29uZmlnLCBJSW5wdXRTZWFyY2hDb25maWcgfCB1bmRlZmluZWQ+KHsgbm9Cb3JkZXI6IHRydWUgfSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgeyBub0JvcmRlcjogdHJ1ZSB9IH0pO1xuICByZWFkb25seSBpc1NlYXJjaE9ubGluZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbGlzdEhpZGRlbklucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaFBhZGRpbmcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0S2V5U2VhcmNoID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0RGl2aWRlckNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdENvbmZpZyA9IGlucHV0PElMaXN0Q29uZmlnSXRlbT4oKTtcbiAgcmVhZG9ubHkgbGlzdEJ1dHRvbnNPdGhlciA9IGlucHV0PEFycmF5PElCdXR0b24+PigpO1xuICByZWFkb25seSBsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb24gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0Q2xpY2tFeGFjdGx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdEJhY2tncm91bmRDdXN0b20gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RNYXhJdGVtU2hvdyA9IGlucHV0PG51bWJlcj4oNSk7XG4gIHJlYWRvbmx5IGxpc3RLZXlTZWxlY3RlZCA9IG1vZGVsPHVua25vd24+KCk7XG4gIHJlYWRvbmx5IGxpc3RNdWx0aUtleVNlbGVjdGVkID0gbW9kZWw8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGxpc3RLZXlzRGlzYWJsZSA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSBsaXN0S2V5c0hpZGRlbiA9IGlucHV0PEFycmF5PHN0cmluZz4+KCk7IC8vIGtow7RuZyBkw7luZyBnacOhIHRy4buLIG7DoHkga+G6v3QgaOG7o3AgduG7m2kgdGVtcGxhdGUgY2hlY2tib3ggY8OzIGNvbmZpZyBjaOG7qWEgY29uZmlnQ2hlY2tib3hDaGVja0FsbFxuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SU1lc3NhZ2VUcmFuc2xhdGU+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gaW5wdXQ8SVZhbGlkTWF4SXRlbVNlbGVjdGVkPigpO1xuICByZWFkb25seSBjaGFuZ2VWYWxpZFVuZGVmaW5lZFJlc2V0RXJyb3IgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhbGxvd1NlbGVjdEl0ZW1NdWx0aXBsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGZvY3VzSW5wdXRTZWFyY2ggPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgb25seUVtaXREYXRhV2hlblJlc2V0ID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gdHJ1ZSBraGkgbXXhu5FuIGVtaXQgc+G7sSBraeG7h24gdGhheSDEkeG7lWkga2V5XG4gIHJlYWRvbmx5IHJlc2V0S2V5V2hlblNlbGVjdEFsbEtleSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RDb25maWdIYXNEaXZpZGVyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUljb24gPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ21sLVs4cHhdJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJ21sLVs4cHhdJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlQ29udGVudCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdElnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTsgLy8gYuG7jyBjaOG6vyDEkeG7mSBkaXNhYmxlIGl0ZW0gdHLDqm4gaHRtbCBsaXN0IHZpZXcgxJHhu4MgZGlzYWJsZSB04burbmcgcGjhuqduIHRyb25nIHJvd3NcbiAgcmVhZG9ubHkgdGFiS2V5QWN0aXZlID0gbW9kZWw8c3RyaW5nPigpO1xuICByZWFkb25seSB0YWJzQ29uZmlnID0gaW5wdXQ8QXJyYXk8SURyb3Bkb3duVGFic0l0ZW0+PigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJCb3R0b20gPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dFNlbGVjdEtleSA9IG91dHB1dDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4oKTsgLy8gc+G7rSBk4bulbmcgY2hvIHR5cGUgY2jhu41uIDEuXG4gIHJlYWRvbmx5IG91dFNlbGVjdE11bHRpS2V5ID0gb3V0cHV0PElFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNobyBwaMOpcCBjaOG7jW4gbmhp4buBdS5cbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0VmFsaWRFdmVudCA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlID0gb3V0cHV0PElGbGFnTW91c2U+KCk7XG4gIHJlYWRvbmx5IG91dERhdGFDaGFuZ2UgPSBvdXRwdXQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IG91dENsaWNrQnV0dG9uT3RoZXIgPSBvdXRwdXQ8SUJ1dHRvbj4oKTtcbiAgcmVhZG9ubHkgb3V0U2hvd0xpc3QgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVGFiS2V5QWN0aXZlID0gb3V0cHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuICAvKiBJTkpFQ1QqL1xuICBwcml2YXRlIHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBodHRwUmVxdWVzdFNlcnZpY2UgPSBpbmplY3QoTGlic1VpSHR0cFJlcXVlc3RTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgbGlzdENvbmZpZyA9IHRoaXMubGlzdENvbmZpZygpO1xuICAgICAgaWYgKGxpc3RDb25maWcpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuZmllbGRLZXkuc2V0KGdldEZpZWxkS2V5QnlUeXBlKGxpc3RDb25maWcsICdpZCcpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghaXNOaWwodGhpcy5saXN0S2V5U2VsZWN0ZWQoKSkgJiYgdGhpcy5saXN0S2V5U2VsZWN0ZWQoKSAhPT0gJycgJiYgIXRoaXMuaXRlbXNTZWxlY3RlZCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXk6IHRoaXMubGlzdEtleVNlbGVjdGVkKCksIGl0ZW06IHVuZGVmaW5lZCwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jaGFuZ2VWYWxpZFVuZGVmaW5lZFJlc2V0RXJyb3IoKSAmJiB0aGlzLnZhbGlkUmVxdWlyZWQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5yZXNldEVycm9yKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMua2V5c1NlbGVjdGVkKCkgfHwgW107XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZCgpIHx8IFtdO1xuXG4gICAgICAgICAgaWYgKGlzRXF1YWwoY2xvbmVEZWVwKHByZXZpb3VzVmFsdWUpLCBjbG9uZURlZXAoY3VycmVudFZhbHVlKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmhhbmRsZXJTZWxlY3RNdWx0aUtleSh7IGtleXM6IGN1cnJlbnRWYWx1ZSwgbWFwS2V5czogW10sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGxpc3RDb25maWcgPSB0aGlzLmxpc3RDb25maWcoKTtcblxuICAgIGlmICh0aGlzLmxpc3RLZXlTZWxlY3RlZCgpIHx8IHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5sZW5ndGhLZXlzLnNldCh0aGlzLmxpc3RLZXlTZWxlY3RlZCgpID8gMSA6IHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKT8ubGVuZ3RoIHx8IDApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5sZW5ndGhLZXlzKCkgJiYgbGlzdENvbmZpZyAmJiAobGlzdENvbmZpZy5hdXRvU2VsZWN0Rmlyc3RJdGVtIHx8IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/LmF1dG9TZWxlY3RBbGxJdGVtIHx8IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSAmJiBsaXN0Q29uZmlnLmh0dHBSZXF1ZXN0RGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldCh0cnVlKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3REYXRhID0gbGlzdENvbmZpZy5odHRwUmVxdWVzdERhdGEoKTtcbiAgICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IGh0dHBSZXF1ZXN0RGF0YTtcbiAgICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IC4uLnRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpLCBkcm9wZG93blRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUgfSwge30sICcnLCB0cnVlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKGh0dHBSZXF1ZXN0RGF0YSk7XG4gICAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzdWx0Py5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQocmVzdWx0LmRhdGEpO1xuICAgICAgICAgIHRoaXMuZW1pdEF1dG9TZWxlY3RLZXkocmVzdWx0LmRhdGEsIGxpc3RDb25maWcudHlwZSk7XG4gICAgICAgICAgdGhpcy5hdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZS5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaXRlbXMoKSk7XG4gICAgfVxuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKHRydWUpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc2V0OiB0aGlzLnJlc2V0LmJpbmQodGhpcyksXG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMudmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlc2V0RXJyb3I6IHRoaXMucmVzZXRFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgc2V0RXJyb3I6IHRoaXMuc2V0RXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUxpc3Q6IGFzeW5jICgpID0+IHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpLFxuICAgICAgZ2V0RGlzYWJsZTogYXN5bmMgKCkgPT4gdGhpcy5kaXNhYmxlKCkgPz8gZmFsc2UsXG4gICAgICB1cGRhdGVMYWJlbEl0ZW1TZWxlY3RlZDogYXN5bmMgKGxhYmVsKSA9PiB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFt0aGlzLmZpZWxkTGFiZWwoKV06IHRoaXMudHJhbnNsYXRlLmluc3RhbnQobGFiZWwpIH0pKSxcbiAgICAgIHJlZnJlc2hMaXN0OiBhc3luYyAoKSA9PiB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVmcmVzaCgpLFxuICAgICAgc2V0SXRlbVNlbGVjdGVkQnlLZXk6IHRoaXMuc2V0SXRlbVNlbGVjdGVkQnlLZXkuYmluZCh0aGlzKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29udmVydEl0ZW1TZWxlY3RlZChpdGVtOiB1bmtub3duKSB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkR2V0TGFiZWwgPSB0aGlzLmZpZWxkR2V0TGFiZWwoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkR2V0TGFiZWwgPyBnZXQ8YW55PihpdGVtLCBmaWVsZEdldExhYmVsKSA6IHVuZGVmaW5lZDtcbiAgICBzZXQ8YW55PihpdGVtLCB0aGlzLmZpZWxkTGFiZWwoKSwgdmFsdWUgPz8gZ2V0PGFueT4oaXRlbSwgJ2xhYmVsJykgPz8gZ2V0PGFueT4oaXRlbSwgJ25hbWUnKSA/PyAnICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYWJlbEl0ZW1TZWxlY3RlZCgpIHtcbiAgICBsZXQgbGFiZWwgPSAnICc7XG4gICAgaWYgKCF0aGlzLmxlbmd0aEtleXMoKSkge1xuICAgICAgbGFiZWwgPSB0aGlzLnRleHREaXNwbGF5V2hlbk5vU2VsZWN0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSA+IDEpIHtcbiAgICAgIGxhYmVsID0gdGhpcy50ZXh0RGlzcGxheVdoZW5NdWx0aVNlbGVjdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgPT09IDEpIHtcbiAgICAgIGxhYmVsID0gZ2V0KHRoaXMuaXRlbXNTZWxlY3RlZCgpLCB0aGlzLmZpZWxkTGFiZWwoKSkgfHwgdGhpcy50ZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCgpO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICBwcml2YXRlIGVtaXRBdXRvU2VsZWN0S2V5KGl0ZW1zOiBBcnJheTx1bmtub3duPiwgdHlwZTogVFlQRV9URU1QTEFURSkge1xuICAgIGNvbnN0IGxpc3RDb25maWcgPSB0aGlzLmxpc3RDb25maWcoKTtcbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggfHwgIWxpc3RDb25maWcgfHwgKCFsaXN0Q29uZmlnLmF1dG9TZWxlY3RGaXJzdEl0ZW0gJiYgIWxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/LmF1dG9TZWxlY3RBbGxJdGVtICYmICFsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpPy5mbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QgPSBsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpPy5mbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdDtcbiAgICBpZiAodHlwZSA9PT0gJ2dyb3VwJyAmJiBmbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdCkge1xuICAgICAgaXRlbXMgPSBmbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdChpdGVtcyk7XG4gICAgfVxuICAgIGlmIChsaXN0Q29uZmlnLmF1dG9TZWxlY3RGaXJzdEl0ZW0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1swXTtcbiAgICAgIGNvbnN0IGtleSA9IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpO1xuICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycgfHwgdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkS2V5KHsga2V5LCBpdGVtLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5U2VsZWN0ZWQuc2V0KGtleSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlclNlbGVjdE11bHRpS2V5KHsga2V5czogW2tleV0sIG1hcEtleXM6IFt7IGtleSwgaXRlbSwgaXNDbGlja01hbnVhbDogZmFsc2UgfV0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZC5zZXQoW2tleV0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSAhPT0gJ2NoZWNrYm94JyAmJiB0eXBlICE9PSAnZ3JvdXAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBtYXBLZXlzOiBBcnJheTxJTGlzdERhdGFFbWl0S2V5PiA9IFtdO1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGdldChpdGVtLCB0aGlzLmZpZWxkS2V5KCkpO1xuICAgICAgaWYgKGlzTmlsKGtleSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICBtYXBLZXlzLnB1c2goeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuaGFuZGxlclNlbGVjdE11bHRpS2V5KHsga2V5cywgbWFwS2V5cywgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZC5zZXQoa2V5cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50KHR5cGU6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIGlmICh0eXBlID09PSAnY2xpY2snKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAncmVtb3ZlJykge1xuICAgICAgdGhpcy5zaG93TGlzdC5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5vdXRTaG93TGlzdC5lbWl0KHRoaXMuc2hvd0xpc3QoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd0xpc3Quc2V0KHRydWUpO1xuICAgIHRoaXMub3V0U2hvd0xpc3QuZW1pdCh0aGlzLnNob3dMaXN0KCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJEYXRhQ2hhbmdlKGl0ZW1zOiBBcnJheTx1bmtub3duPikge1xuICAgIHRoaXMuaXRlbXMuc2V0KGl0ZW1zKTtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8udXBkYXRlUG9wb3Zlck92ZXJsYXlQb3NpdGlvbigpO1xuICAgIHRoaXMub3V0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaXRlbXMoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUZsYWdNb3VzZShldmVudDogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMuZmxhZ01vdXNlQ29udGVudC5zZXQoZXZlbnQpO1xuICAgIHRoaXMubWVyZ2VGbGFnTW91c2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcihidXR0b246IElCdXR0b24pIHtcbiAgICB0aGlzLm91dENsaWNrQnV0dG9uT3RoZXIuZW1pdChidXR0b24pO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyQ29udHJvbEV2ZW50KGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sLnNldChldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdGVkS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2V5ID0gZXZlbnQ/LmtleTtcbiAgICBjb25zdCBpdGVtID0gZXZlbnQ/Lml0ZW07XG4gICAgY29uc3QgaXNDbGlja01hbnVhbCA9IGV2ZW50Py5pc0NsaWNrTWFudWFsO1xuICAgIHRoaXMubGVuZ3RoS2V5cy5zZXQoIShpc05pbChrZXkpIHx8ICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkgPT09ICcnKSkgPyAxIDogMCk7XG4gICAgdGhpcy5saXN0S2V5U2VsZWN0ZWQuc2V0KGtleSk7XG4gICAgaWYgKCF0aGlzLmFsbG93U2VsZWN0SXRlbU11bHRpcGxlKCkgJiYgdGhpcy5pdGVtc1NlbGVjdGVkKCkgJiYgZ2V0KHRoaXMuaXRlbXNTZWxlY3RlZCgpLCB0aGlzLmZpZWxkS2V5KCkpID09PSBrZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlzQ2xpY2tNYW51YWwpIHtcbiAgICAgIGlmICghKGlzTmlsKGtleSkgfHwgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleSA9PT0gJycpKSAmJiAoaXRlbSB8fCB0aGlzLml0ZW1zU2VsZWN0ZWQoKSkpIHtcbiAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSAmJiAhaXRlbSAmJiB0aGlzLmh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQoKSkge1xuICAgICAgbGV0IGl0ZW1TZWxlY3RlZCA9IGF3YWl0IHRoaXMuc2V0SXRlbVNlbGVjdGVkQnlLZXkoa2V5KTtcbiAgICAgIGlmICghaXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIGl0ZW1TZWxlY3RlZCA9IHtcbiAgICAgICAgICBbdGhpcy5maWVsZEtleSgpXToga2V5LFxuICAgICAgICAgIFt0aGlzLmZpZWxkTGFiZWwoKV06IENIQVJBQ1RFUl9EQVRBX0VNUFRZLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KGl0ZW1TZWxlY3RlZCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuaXRlbSA9IGl0ZW1TZWxlY3RlZDtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQoeyAuLi5ldmVudCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KGNsb25lRGVlcChpdGVtKSk7XG4gICAgdGhpcy5idWlsZERpc3BsYXkoKTtcbiAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KHsgLi4uZXZlbnQsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0TXVsdGlLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRNdWx0aUtleSB8IHVuZGVmaW5lZCwgaXNDbGlja01hbnVhbCA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMubGlzdENvbmZpZygpPy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKT8uc2luZ2xlU2VsZWN0SXRlbSAmJiBldmVudD8ubWFwS2V5cz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpdGVtQ2xpY2tNYW51YWwgPSBldmVudC5tYXBLZXlzLmZpbmQoKG1hcEtleSkgPT4gbWFwS2V5Lml0ZW0gJiYgbWFwS2V5Lml0ZW0uaXNDaGVja01hbnVhbCk7XG4gICAgICBpZiAoaXRlbUNsaWNrTWFudWFsKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKGl0ZW1DbGlja01hbnVhbC5pdGVtLmlzQ2hlY2tNYW51YWwgPSBmYWxzZSkpO1xuICAgICAgICBldmVudC5rZXlzID0gW2l0ZW1DbGlja01hbnVhbC5rZXldO1xuICAgICAgICBldmVudC5tYXBLZXlzID0gW2l0ZW1DbGlja01hbnVhbF07XG4gICAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoWy4uLihldmVudD8ua2V5cyB8fCBbXSldKTtcbiAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldChbLi4uKGV2ZW50Py5rZXlzIHx8IFtdKV0pO1xuICAgIHRoaXMubGVuZ3RoS2V5cy5zZXQoZXZlbnQ/LmtleXM/Lmxlbmd0aCB8fCAwKTtcbiAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgPiAxKSB7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoeyAuLi4oZXZlbnQgfHwge30pLCBpc0NsaWNrTWFudWFsLCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGV2ZW50Py5rZXlzWzBdO1xuICAgIGxldCBpdGVtID0gZXZlbnQ/Lm1hcEtleXM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBrZXkpPy5pdGVtO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpICYmICFpdGVtICYmIHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCgpKSB7XG4gICAgICBpdGVtID0gYXdhaXQgdGhpcy5zZXRJdGVtU2VsZWN0ZWRCeUtleShrZXkpO1xuICAgICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHsga2V5czogW2tleV0sIG1hcEtleXM6IFt7IGtleSwgaXRlbSB9XSwgaXNDbGlja01hbnVhbCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KGNsb25lRGVlcChpdGVtKSk7XG4gICAgdGhpcy5idWlsZERpc3BsYXkoKTtcbiAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoeyAuLi4oZXZlbnQgfHwge30pLCBpc0NsaWNrTWFudWFsLCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldEl0ZW1TZWxlY3RlZEJ5S2V5KGtleTogdW5rbm93bikge1xuICAgIGNvbnN0IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQgPSB0aGlzLmh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQoKTtcbiAgICBpZiAoIWh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQgfHwgdGhpcy5sb2FkaW5nRGV0YWlsKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQodHJ1ZSk7XG4gICAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZDtcbiAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyBrZXksIGRyb3Bkb3duVGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0sIHt9LCAnJywgZmFsc2UsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQpO1xuICAgICAgY29uc3QgaXRlbSA9IGNsb25lRGVlcChyZXN1bHQ/LmRhdGE/LlswXSB8fCByZXN1bHQ/LmRhdGEpO1xuICAgICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChpdGVtKTtcbiAgICAgIHRoaXMuYnVpbGREaXNwbGF5KCk7XG4gICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVRhYigpIHtcbiAgICB0aGlzLm91dENoYW5nZVRhYktleUFjdGl2ZS5lbWl0KHRoaXMudGFiS2V5QWN0aXZlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMb2FkaW5nTGlzdChldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZ0xpc3Quc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHsgbWVzc2FnZTogZXJyb3IgfSk7XG4gICAgdGhpcy5zaG93Qm9yZGVyRXJyb3Iuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZCgpIHtcbiAgICBpZiAodGhpcy5lcnJvcigpPy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tWYWxpZCh2YWxpZGF0ZURlZmF1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICBjb25zdCB2YWxpZCA9IHsgcmVxdWlyZWQ6IHRydWUsIGxpbWl0TWF4SXRlbVNlbGVjdDogdHJ1ZSB9O1xuICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKSAmJiAhdGhpcy5sZW5ndGhLZXlzKCkpIHtcbiAgICAgIHZhbGlkLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWxpZE1heEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmxlbmd0aEtleXMoKSA+IHZhbGlkTWF4SXRlbVNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHQgJiYgdmFsaWQucmVxdWlyZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IC4uLih2YWxpZFJlcXVpcmVkIHx8IHt9KSwgbWVzc2FnZTogdmFsaWRSZXF1aXJlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEIH0pO1xuICAgIH1cbiAgICBpZiAoIXZhbGlkYXRlRGVmYXVsdCAmJiAhdGhpcy5lcnJvcigpICYmIHZhbGlkLmxpbWl0TWF4SXRlbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi4odmFsaWRNYXhJdGVtU2VsZWN0ZWQgfHwge30pLCBtZXNzYWdlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHsgdmFsdWU6IHZhbGlkTWF4SXRlbVNlbGVjdGVkPy52YWx1ZSB9IH0pO1xuICAgIH1cbiAgICB0aGlzLm91dFZhbGlkRXZlbnQuZW1pdCh2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QpO1xuICAgIHJldHVybiB2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3Q7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnNob3dCb3JkZXJFcnJvci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbChldmVudDogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLmZsYWdNb3VzZS5zZXQoZmxhZyk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldCgpIHtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldCgwKTtcbiAgICB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVzZXRLZXlTZWxlY3RlZCgpO1xuICAgIGlmICghdGhpcy5zaG93TGlzdCgpICYmIHRoaXMub25seUVtaXREYXRhV2hlblJlc2V0KCkpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGREaXNwbGF5KCkge1xuICAgIGlmICh0aGlzLml0ZW1zU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5jb252ZXJ0SXRlbVNlbGVjdGVkKCkodGhpcy5pdGVtc1NlbGVjdGVkKCksIHRoaXMudHJhbnNsYXRlKTtcbiAgICAgIGNvbnN0IGdldFBvcG92ZXJJdGVtU2VsZWN0ZWQgPSB0aGlzLmdldFBvcG92ZXJJdGVtU2VsZWN0ZWQoKTtcbiAgICAgIGlmIChnZXRQb3BvdmVySXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMucG9wb3Zlckl0ZW1TZWxlY3RlZC5zZXQoYXdhaXQgZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZCh0aGlzLml0ZW1zU2VsZWN0ZWQsIHRoaXMudHJhbnNsYXRlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUZsYWdNb3VzZSgpIHtcbiAgICBjb25zdCBmbGFnOiBJRmxhZ01vdXNlID0geyBpc01vdXNlRW50ZXI6IGZhbHNlLCBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSwgaXNDb250YWluZXJIYXNTY3JvbGw6IGZhbHNlIH07XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc01vdXNlRW50ZXIgfHwgdGhpcy5mbGFnTW91c2UoKS5pc01vdXNlRW50ZXIpIHtcbiAgICAgIGZsYWcuaXNNb3VzZUVudGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc01vdXNlRW50ZXJDb250ZW50IHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyQ29udGVudCkge1xuICAgICAgZmxhZy5pc01vdXNlRW50ZXJDb250ZW50ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmxhZ01vdXNlQ29udGVudCgpPy5pc0NvbnRhaW5lckhhc1Njcm9sbCB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzQ29udGFpbmVySGFzU2Nyb2xsKSB7XG4gICAgICBmbGFnLmlzQ29udGFpbmVySGFzU2Nyb2xsID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoZmxhZyk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICBAaWYgKGxhYmVsQ29uZmlnKCk7IGFzIGxhYmVsKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgW2NsYXNzSW5jbHVkZV09XCJsYWJlbC5jbGFzc0luY2x1ZGVcIlxuICAgICAgW2xhYmVsTGVmdF09XCJsYWJlbC5sYWJlbExlZnRcIlxuICAgICAgW2xhYmVsTGVmdENsYXNzXT1cImxhYmVsLmxhYmVsTGVmdENsYXNzXCJcbiAgICAgIFtyZXF1aXJlZF09XCJsYWJlbC5yZXF1aXJlZFwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwibGFiZWwuZGVzY3JpcHRpb25cIlxuICAgICAgW2Rlc2NyaXB0aW9uQ2xhc3NdPVwibGFiZWwuZGVzY3JpcHRpb25DbGFzc1wiXG4gICAgICBbbGFiZWxSaWdodF09XCJsYWJlbC5sYWJlbFJpZ2h0XCJcbiAgICAgIFtsYWJlbFJpZ2h0Q2xhc3NdPVwibGFiZWwubGFiZWxSaWdodENsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2J1dHRvbnNMZWZ0XT1cImxhYmVsLmJ1dHRvbnNMZWZ0XCJcbiAgICAgIFtidXR0b25zUmlnaHRdPVwibGFiZWwuYnV0dG9uc1JpZ2h0XCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0xlZnRdPVwibGFiZWwuZGlzYWJsZUJ1dHRvbnNMZWZ0IHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zUmlnaHRdPVwibGFiZWwuZGlzYWJsZUJ1dHRvbnNSaWdodCB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtoYXNUb2dnbGVdPVwibGFiZWwuaGFzVG9nZ2xlXCJcbiAgICAgIFt0b2dnbGVBY3RpdmVdPVwibGFiZWwudG9nZ2xlQWN0aXZlXCJcbiAgICAgIFt0b2dnbGVEaXNhYmxlXT1cImxhYmVsLnRvZ2dsZURpc2FibGUgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbcG9wb3Zlcl09XCJsYWJlbC5wb3BvdmVyXCJcbiAgICAgIFtpY29uUG9wb3ZlckNsYXNzXT1cImxhYmVsLmljb25Qb3BvdmVyQ2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWwub25seVNob3dDb3VudFwiXG4gICAgICBbbGltaXRMZW5ndGhdPVwibGFiZWwubGltaXRMZW5ndGhcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbC5idXR0b25zRGVzY3JpcHRpb25cIlxuICAgICAgW2Rpc2FibGVCdXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWwuZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbiB8fCBkaXNhYmxlKClcIlxuICAgICAgW2J1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXT1cImxhYmVsLmJ1dHRvbnNEZXNjcmlwdGlvbkNvbnRhaW5lckNsYXNzXCJcbiAgICAgIFtjb3VudF09XCJsYWJlbC5jb3VudFwiIC8+XG4gIH1cbiAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImRpc2FibGUoKSB8fCByZWFkb25seSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgW2NsYXNzXT1cImNsYXNzSW5jbHVkZSgpIHx8ICd3LWZ1bGwnXCJcbiAgICBbbW9kZV09XCInY2xpY2stdG9nZ2xlJ1wiXG4gICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gICAgW2lnbm9yZUN1cnNvclBvaW50ZXJNb2RlTGlrZUNsaWNrXT1cInRydWVcIlxuICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudCgpXCJcbiAgICBbZWxlbWVudFJlZkN1c3RvbV09XCJwb3BvdmVyRWxlbWVudFJlZkN1c3RvbSgpXCJcbiAgICBbY29uZmlnXT1cIntcbiAgICAgIGFuaW1hdGlvbkNvbmZpZzogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5hbmltYXRpb25Db25maWcgfHwge30sXG4gICAgICB6SW5kZXg6IHpJbmRleCgpID8/IDEwMDAsXG4gICAgICB3aWR0aEJ5UGFyZW50OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LndpZHRoQnlQYXJlbnQgPz8gdHJ1ZSxcbiAgICAgIHBhcmVudEJvcmRlcldpZHRoOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBhcmVudEJvcmRlcldpZHRoID8/IDAsXG4gICAgICBtYXhIZWlnaHQ6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ubWF4SGVpZ2h0ID8/IDIwNDgsXG4gICAgICBtYXhXaWR0aDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5tYXhXaWR0aCA/PyAyMDQ4LFxuICAgICAgZGlyZWN0aW9uOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmRpcmVjdGlvbiA/PyAnYm90dG9tJyxcbiAgICAgIHRlbXBsYXRlOiBsaXN0Vmlld0VsLFxuICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgIHRpbWVyRGVzdHJveTogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy50aW1lckRlc3Ryb3kgPz8gMCxcbiAgICAgIGlnbm9yZUFycm93OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/Lmlnbm9yZUFycm93ID8/IHRydWUsXG4gICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgIGNsYXNzSW5jbHVkZTogJyFyb3VuZGVkLVs0cHhdIG92ZXJmbG93LWhpZGRlbiAnICsgKHBvcG92ZXJDdXN0b21Db25maWcoKT8uY2xhc3NJbmNsdWRlID8/ICdsaWJzLXVpLWJvcmRlci1nZW5lcmFsICcpLFxuICAgICAgcG9zaXRpb246IHBvcG92ZXJDdXN0b21Db25maWcoKT8ucG9zaXRpb24gfHwgeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMCB9LFxuICAgICAgd2lkdGg6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ud2lkdGgsXG4gICAgICBjbGFzc0luY2x1ZGVPdmVybGF5Qm9keTogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5jbGFzc0luY2x1ZGVPdmVybGF5Qm9keSxcbiAgICB9XCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyUG9wb3ZlckNvbnRyb2xFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0RXZlbnQpPVwiaGFuZGxlckV2ZW50KCRldmVudClcIlxuICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiPlxuICAgIEBpZiAoIWlzTmdDb250ZW50KCkpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgW2NsYXNzXT1cIidsaWJzLXVpLWRyb3Bkb3duICcgKyAoY2xhc3NJbmNsdWRlQ29udGVudCgpIHx8ICcnKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1nZW5lcmFsXT1cIiFlcnJvcigpICYmICFzaG93Qm9yZGVyRXJyb3IoKSAmJiAhc2hvd0xpc3QoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1wcmltYXJ5LWZvY3VzLWdlbmVyYWxdPVwiIWVycm9yKCkgJiYgIXNob3dCb3JkZXJFcnJvcigpICYmIHNob3dMaXN0KClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItZXJyb3ItZ2VuZXJhbF09XCJlcnJvcigpIHx8IHNob3dCb3JkZXJFcnJvcigpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5LWJhY2tncm91bmRdPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhKGRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKCkgfHwgcmVhZG9ubHkoKSlcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlLWJhY2tncm91bmRdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1ub25lXT1cImxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgIFtjbGFzcy5yb3VuZGVkLXRyLTBdPVwiaGFzQ29udGVudFVuaXRSaWdodCgpXCJcbiAgICAgICAgW2NsYXNzLnJvdW5kZWQtYnItMF09XCJoYXNDb250ZW50VW5pdFJpZ2h0KClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGwgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGwgYWJzb2x1dGVcIlxuICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1kcm9wZG93bi1wbGFjZWhvbGRlcl09XCIhbGVuZ3RoS2V5cygpXCI+XG4gICAgICAgICAgICAgIEBpZiAobGVuZ3RoS2V5cygpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgQGlmIChpdGVtc1NlbGVjdGVkKCk7IGFzIGl0ZW1zU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRHZXRJbWFnZSgpOyBhcyBmaWVsZEdldEltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYXZhdGFyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0F2YXRhckluY2x1ZGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVTaGFwZV09XCJ0eXBlU2hhcGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiaW1hZ2VTaXplKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyXT1cIml0ZW1zU2VsZWN0ZWRbZmllbGRHZXRJbWFnZV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtsaW5rQXZhdGFyRXJyb3JdPVwibGlua0ltYWdlRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lkR2VuQ29sb3JdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldENvbG9yQXZhdGFyKCkgfHwgZmllbGRHZXRUZXh0QXZhdGFyKCldXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZ2V0TGFzdFRleHRBZnRlclNwYWNlXT1cImdldExhc3RUZXh0QWZ0ZXJTcGFjZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGV4dEF2YXRhcl09XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0VGV4dEF2YXRhcigpXVwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkR2V0SWNvbigpOyBhcyBmaWVsZEdldEljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW1zU2VsZWN0ZWRbZmllbGRHZXRJY29uXSArICcgbXItWzhweF0nXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiKGxhYmVsUG9wb3ZlckZ1bGxXaWR0aCgpID8gJ3ctMTAwICcgOiAnJykgKyBjbGFzc0luY2x1ZGVUZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImxhYmVsSXRlbVNlbGVjdGVkQ29tcHV0ZWQoKSB8IHRyYW5zbGF0ZTogeyB2YWx1ZTogbGVuZ3RoS2V5cygpIH0gfCBMaWJzVWlQaXBlc1NlY3VyaXR5VHJ1c3RQaXBlOiAnaHRtbCcgOiB1c2VYc3NGaWx0ZXIoKSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBbY29uZmlnXT1cInsgbWF4V2lkdGg6IGxhYmVsUG9wb3ZlckNvbmZpZygpPy5tYXhXaWR0aCB8fCAyNTAsIGRpcmVjdGlvbjogJ3RvcCcsIHpJbmRleDogbGFiZWxQb3BvdmVyQ29uZmlnKCk/LnpJbmRleCwgdGltZXJEZXN0cm95OiBsYWJlbFBvcG92ZXJDb25maWcoKT8udGltZXJEZXN0cm95IHx8IDAgfVwiXG4gICAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIiAvPlxuXG4gICAgICAgICAgICAgIEBpZiAocG9wb3Zlckl0ZW1TZWxlY3RlZCgpOyBhcyBwb3BvdmVySXRlbVNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJwb3BvdmVySXRlbVNlbGVjdGVkLnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnXT1cInBvcG92ZXJJdGVtU2VsZWN0ZWQuY29uZmlnIHx8IHt9XCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKHBvcG92ZXJJdGVtU2VsZWN0ZWQuZGF0YVZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cInBvcG92ZXJJdGVtU2VsZWN0ZWQuZGF0YVZpZXcgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmUgdGV4dC1bMTZweF0gbXgtWzhweF1cIj48L2k+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1bMTZweF0gbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIHRleHQtWyM2YTczODNdIHt7IGNsYXNzSW5jbHVkZUljb24oKSB9fVwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1kaXNhYmxlXT1cInJlYWRvbmx5KCkgfHwgZGlzYWJsZSgpXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgQGlmIChzaG93RXJyb3IoKSkge1xuICAgIEBpZiAoZXJyb3IoKTsgYXMgZXJyb3IpIHtcbiAgICAgIEBsZXQgY29uc3RIdG1sTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgJyAnO1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm10LVs4cHhdIGxpYnMtdWktdGV4dC1lcnJvciBsaWJzLXVpLWZvbnQtaDdyXCJcbiAgICAgICAgW2lubmVySHRtbF09XCJjb25zdEh0bWxNZXNzYWdlIHwgdHJhbnNsYXRlOiBlcnJvci5pbnRlcnBvbGF0ZVBhcmFtcyB8fCB7fVwiPjwvZGl2PlxuICAgIH1cbiAgfVxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2xpc3RWaWV3RWw+XG4gIDxkaXZcbiAgICBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW5cIlxuICAgIFtjbGFzcy5oLWZ1bGxdPVwibGlzdE1heEl0ZW1TaG93KCkgPT09IC0xXCI+XG4gICAgQGlmICh0YWJzQ29uZmlnKCk7IGFzIHRhYnNDb25maWcpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24tdGFic1xuICAgICAgICBbdGFic0NvbmZpZ109XCJ0YWJzQ29uZmlnXCJcbiAgICAgICAgWyh0YWJLZXlBY3RpdmUpXT1cInRhYktleUFjdGl2ZVwiXG4gICAgICAgIFtpZ25vcmVCb3JkZXJCb3R0b21dPVwiaWdub3JlQm9yZGVyQm90dG9tKClcIlxuICAgICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpIHx8IGxvYWRpbmdMaXN0KClcIlxuICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUYWIoKVwiIC8+XG4gICAgfVxuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdFxuICAgICAgW2NsYXNzLmgtZnVsbF09XCJsaXN0TWF4SXRlbVNob3coKSA9PT0gLTFcIlxuICAgICAgW3NlYXJjaENvbmZpZ109XCJsaXN0U2VhcmNoQ29uZmlnKClcIlxuICAgICAgW2lzU2VhcmNoT25saW5lXT1cImlzU2VhcmNoT25saW5lKClcIlxuICAgICAgW2Ryb3Bkb3duVGFiS2V5QWN0aXZlXT1cInRhYktleUFjdGl2ZSgpXCJcbiAgICAgIFtrZXlTZWFyY2hdPVwibGlzdEtleVNlYXJjaCgpXCJcbiAgICAgIFtjb25maWddPVwibGlzdENvbmZpZygpXCJcbiAgICAgIFthdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZV09XCJhdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSgpXCJcbiAgICAgIFtwYWRkaW5nTGVmdEl0ZW1dPVwicG9wb3ZlckN1c3RvbUNvbmZpZygpPy5wYWRkaW5nTGVmdEl0ZW0gPz8gZmFsc2VcIlxuICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbZGlzYWJsZUxhYmVsXT1cImRpc2FibGVMYWJlbCgpXCJcbiAgICAgIFtoaWRkZW5JbnB1dFNlYXJjaF09XCJsaXN0SGlkZGVuSW5wdXRTZWFyY2goKVwiXG4gICAgICBbc2VhcmNoUGFkZGluZ109XCJsaXN0U2VhcmNoUGFkZGluZygpXCJcbiAgICAgIFttYXhJdGVtU2hvd109XCJsaXN0TWF4SXRlbVNob3coKVwiXG4gICAgICBba2V5U2VsZWN0ZWRdPVwibGlzdEtleVNlbGVjdGVkKClcIlxuICAgICAgW211bHRpS2V5U2VsZWN0ZWRdPVwibGlzdE11bHRpS2V5U2VsZWN0ZWQoKVwiXG4gICAgICBbY2xpY2tFeGFjdGx5XT1cInBvcG92ZXJDdXN0b21Db25maWcoKT8uY2xpY2tFeGFjdGx5ID8/IGZhbHNlXCJcbiAgICAgIFtkaXZpZGVyQ2xhc3NJbmNsdWRlXT1cImxpc3RTZWFyY2hDb25maWcoKSA/IGxpc3REaXZpZGVyQ2xhc3NJbmNsdWRlKCkgOiAnaGlkZGVuJ1wiXG4gICAgICBbYnV0dG9uc090aGVyXT1cImxpc3RCdXR0b25zT3RoZXIoKVwiXG4gICAgICBbYmFja2dyb3VuZExpc3RDdXN0b21dPVwibGlzdEJhY2tncm91bmRDdXN0b20oKVwiXG4gICAgICBba2V5c0Rpc2FibGVJdGVtXT1cImxpc3RLZXlzRGlzYWJsZSgpXCJcbiAgICAgIFtrZXlzSGlkZGVuSXRlbV09XCJsaXN0S2V5c0hpZGRlbigpXCJcbiAgICAgIFtoYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb24oKSA/PyAoIXBvcG92ZXJDdXN0b21Db25maWcoKSAmJiAhbGFiZWxDb25maWcoKT8ucmVxdWlyZWQgJiYgKGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3RleHQnIHx8IGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3JhZGlvJykpXCJcbiAgICAgIFt0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YV09XCJsaXN0U2VhcmNoTm9EYXRhVGVtcGxhdGVSZWYoKVwiXG4gICAgICBbZm9jdXNJbnB1dFNlYXJjaF09XCJmb2N1c0lucHV0U2VhcmNoKClcIlxuICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICBbcmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd25dPVwicmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5KClcIlxuICAgICAgW2lnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtXT1cImxpc3RJZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbSgpXCJcbiAgICAgIFtoYXNEaXZpZGVyXT1cImxpc3RDb25maWdIYXNEaXZpZGVyKClcIlxuICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiXG4gICAgICAob3V0U2VsZWN0TXVsdGlLZXkpPVwiaGFuZGxlclNlbGVjdE11bHRpS2V5KCRldmVudCwgdHJ1ZSlcIlxuICAgICAgKG91dENoYW5nZVZpZXcpPVwiaGFuZGxlckRhdGFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAob3V0Q2xpY2tCdXR0b25PdGhlcik9XCJoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcigkZXZlbnQpXCJcbiAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCJcbiAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9XCJoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgIChvdXRMb2FkaW5nKT1cImhhbmRsZXJMb2FkaW5nTGlzdCgkZXZlbnQpXCIgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19