@libs-ui/components-dropdown 0.2.357-0 → 0.2.357-10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -10
- package/dropdown.component.d.ts +5 -1
- package/esm2022/dropdown.component.mjs +58 -7
- package/esm2022/interfaces/function-control-event.interface.mjs +1 -1
- package/fesm2022/libs-ui-components-dropdown.mjs +57 -6
- package/fesm2022/libs-ui-components-dropdown.mjs.map +1 -1
- package/interfaces/function-control-event.interface.d.ts +6 -0
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -462,7 +462,20 @@ handlerChangeTab(key: string | undefined): void {
|
|
|
462
462
|
|
|
463
463
|
Dùng khi dropdown chỉ nhận được key (id) từ server, cần gọi API riêng để lấy thông tin hiển thị.
|
|
464
464
|
|
|
465
|
+
> 🔴 **Lỗi phổ biến:** Truyền `[(listKeySelected)]="selectedKey"` (key có sẵn) **NHƯNG quên** `[httpRequestDetailItemById]`. Dropdown chỉ có key, không có item → label hiển thị trắng. BẮT BUỘC cấu hình `[httpRequestDetailItemById]` như ví dụ dưới.
|
|
466
|
+
|
|
467
|
+
```html
|
|
468
|
+
<!-- ❌ SAI — có key nhưng thiếu httpRequestDetailItemById → label trắng -->
|
|
469
|
+
<libs_ui-components-dropdown
|
|
470
|
+
[labelConfig]="{ labelLeft: 'Thiếu detail config' }"
|
|
471
|
+
[listConfig]="listConfig"
|
|
472
|
+
[(listKeySelected)]="selectedKey"
|
|
473
|
+
[convertItemSelected]="convertItemSelected"
|
|
474
|
+
/>
|
|
475
|
+
```
|
|
476
|
+
|
|
465
477
|
```html
|
|
478
|
+
<!-- ✅ ĐÚNG -->
|
|
466
479
|
<libs_ui-components-dropdown
|
|
467
480
|
[labelConfig]="{ labelLeft: 'Dropdown lazy-load detail' }"
|
|
468
481
|
[listConfig]="listConfig"
|
|
@@ -492,14 +505,28 @@ selectedKey = signal<string>('item-id-123'); // sẽ tự gọi API để load t
|
|
|
492
505
|
|
|
493
506
|
### 11. Dropdown không load list trước khi search
|
|
494
507
|
|
|
508
|
+
Cơ chế "chưa search thì chưa load" được bật qua `ignoreShowDataWhenNotSearch: true` **bên trong `listConfig`** (thuộc `IListConfigItem`), không phải một input riêng của dropdown.
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
readonly listConfigNotSearch: IListConfigItem = {
|
|
512
|
+
type: 'text',
|
|
513
|
+
httpRequestData: signal<IHttpRequestConfig>({
|
|
514
|
+
objectInstance: new UserService(),
|
|
515
|
+
functionName: 'list',
|
|
516
|
+
argumentsValue: [],
|
|
517
|
+
}),
|
|
518
|
+
ignoreShowDataWhenNotSearch: true, // không load list khi vừa mở; chỉ load khi có keyword
|
|
519
|
+
configTemplateText: signal({ fieldKey: 'id', getValue: (item) => item.name }),
|
|
520
|
+
};
|
|
521
|
+
```
|
|
522
|
+
|
|
495
523
|
```html
|
|
496
524
|
<libs_ui-components-dropdown
|
|
497
525
|
[labelConfig]="{ labelLeft: 'Gõ keyword để bắt đầu load' }"
|
|
498
|
-
[listConfig]="
|
|
526
|
+
[listConfig]="listConfigNotSearch"
|
|
499
527
|
[isSearchOnline]="true"
|
|
500
528
|
[listHiddenInputSearch]="false"
|
|
501
529
|
[listSearchConfig]="{ noBorder: true, placeholder: 'Nhập để tìm kiếm...' }"
|
|
502
|
-
[dropdownIgnoreNotSearch]="true"
|
|
503
530
|
/>
|
|
504
531
|
```
|
|
505
532
|
|
|
@@ -639,6 +666,8 @@ handlerFunctionsControl(event: IDropdownFunctionControlEvent): void {
|
|
|
639
666
|
| `resetError()` | `() => Promise<void>` | Xóa error message đang hiển thị và border đỏ |
|
|
640
667
|
| `setError(message)` | `(message: string) => Promise<void>` | Hiển thị error message tùy chỉnh (có thể truyền i18n key) |
|
|
641
668
|
| `setItemSelectedByKey(id)` | `(id: unknown) => Promise<void>` | Chọn item theo key, tự gọi API `httpRequestDetailItemById` nếu có để lấy chi tiết |
|
|
669
|
+
| `setSelectedKey(key, options?)` | `(key: unknown, options?: { reset?: boolean }) => Promise<void>` | Set key đã chọn theo chương trình (single select); `options.reset=true` sẽ reset trước khi set |
|
|
670
|
+
| `setSelectedMultiKey(keys, options?)` | `(keys: unknown[], options?: { reset?: boolean }) => Promise<void>` | Set mảng key đã chọn theo chương trình (multi select); `options.reset=true` sẽ reset trước khi set |
|
|
642
671
|
| `updateLabelItemSelected(label)` | `(label: string) => Promise<void>` | Cập nhật text hiển thị của item đã chọn mà không cần reload |
|
|
643
672
|
|
|
644
673
|
## Types & Interfaces
|
|
@@ -732,6 +761,8 @@ interface IDropdownFunctionControlEvent {
|
|
|
732
761
|
reset: () => Promise<void>;
|
|
733
762
|
refreshList: () => Promise<void>;
|
|
734
763
|
setItemSelectedByKey: (id: unknown) => Promise<void>;
|
|
764
|
+
setSelectedKey: (key: unknown, options?: { reset?: boolean }) => Promise<void>;
|
|
765
|
+
setSelectedMultiKey: (keys: unknown[], options?: { reset?: boolean }) => Promise<void>;
|
|
735
766
|
getDisable: () => Promise<boolean>;
|
|
736
767
|
}
|
|
737
768
|
```
|
|
@@ -759,6 +790,8 @@ Component tabs nội bộ, được sử dụng tự động khi truyền `[tabs
|
|
|
759
790
|
|
|
760
791
|
⚠️ **`convertItemSelected` là bắt buộc để hiển thị đúng label**: Hàm này cần gán giá trị vào field `labelDisplay` (hoặc field được chỉ định bởi `[fieldLabel]`) của item. Thiếu hàm này dropdown sẽ hiển thị trắng sau khi chọn.
|
|
761
792
|
|
|
793
|
+
⚠️ **Truyền key có sẵn (`listKeySelected`/`listMultiKeySelected`) BẮT BUỘC kèm `[httpRequestDetailItemById]`** (lỗi phổ biến nhất): Khi bạn truyền key đã chọn từ server (vd: `[(listKeySelected)]="selectedId"`) mà dropdown CHƯA load list, component chỉ có **key** chứ không có **item** tương ứng để dựng label → trigger sẽ **hiển thị trắng**. Phải cấu hình `[httpRequestDetailItemById]` để dropdown tự gọi API lấy chi tiết item theo key. Nếu thiếu, component sẽ in `console.warn` cảnh báo. Xem mục _"10. Dropdown lazy-load chi tiết item theo key"_.
|
|
794
|
+
|
|
762
795
|
⚠️ **FunctionControl phát sinh sau ngOnInit**: `(outFunctionsControl)` emit 1 lần duy nhất trong `ngOnInit`. Lưu tham chiếu vào biến class để dùng sau.
|
|
763
796
|
|
|
764
797
|
⚠️ **`listKeysDisable` không dùng kèm `configCheckboxCheckAll`**: Khi listConfig có cấu hình `configCheckboxCheckAll`, không được dùng `[listKeysDisable]` vì sẽ gây lỗi logic chọn tất cả.
|
|
@@ -766,11 +799,3 @@ Component tabs nội bộ, được sử dụng tự động khi truyền `[tabs
|
|
|
766
799
|
⚠️ **`listKeysHidden` không dùng kèm `configCheckboxCheckAll`**: Tương tự `listKeysDisable`, tránh dùng kết hợp với `configCheckboxCheckAll`.
|
|
767
800
|
|
|
768
801
|
⚠️ **XSS Safety**: Khi `getValue`/`getLabelItem` trả về HTML có thể chứa dữ liệu từ người dùng, BẮT BUỘC bọc trong `escapeHtml()` từ `@libs-ui/utils`.
|
|
769
|
-
|
|
770
|
-
## Demo
|
|
771
|
-
|
|
772
|
-
```bash
|
|
773
|
-
npx nx serve core-ui
|
|
774
|
-
```
|
|
775
|
-
|
|
776
|
-
Truy cập: http://localhost:4500/dropdown
|
package/dropdown.component.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare class LibsUiComponentsDropdownComponent implements OnInit {
|
|
|
21
21
|
protected popoverItemSelected: import("@angular/core").WritableSignal<IPopover | undefined>;
|
|
22
22
|
protected labelItemSelectedComputed: import("@angular/core").Signal<string>;
|
|
23
23
|
protected autoSelectedFirstItemCallOutsideBefore: import("@angular/core").WritableSignal<boolean>;
|
|
24
|
+
private readonly isSelectingInternally;
|
|
24
25
|
private readonly keysSelected;
|
|
25
26
|
private readonly popoverFunctionControl;
|
|
26
27
|
private readonly fieldKey;
|
|
@@ -110,13 +111,16 @@ export declare class LibsUiComponentsDropdownComponent implements OnInit {
|
|
|
110
111
|
private defaultConvertItemSelected;
|
|
111
112
|
private getLabelItemSelected;
|
|
112
113
|
private emitAutoSelectKey;
|
|
114
|
+
private warnMissingHttpRequestDetailItemById;
|
|
113
115
|
protected handlerEvent(type: TYPE_POPOVER_EVENT): void;
|
|
114
116
|
protected handlerDataChange(items: Array<unknown>): void;
|
|
115
117
|
protected handlerChangeFlagMouse(event: IFlagMouse): void;
|
|
116
118
|
protected handlerClickButtonOther(button: IButton): void;
|
|
117
119
|
protected handlerPopoverControlEvent(event: IPopoverFunctionControlEvent): void;
|
|
118
120
|
protected handlerSelectedKey(event: IListDataEmitKey | undefined): Promise<void>;
|
|
121
|
+
private processSelectedKey;
|
|
119
122
|
protected handlerSelectMultiKey(event: IListDataEmitMultiKey | undefined, isClickManual?: boolean): Promise<void>;
|
|
123
|
+
private processSelectMultiKey;
|
|
120
124
|
private setItemSelectedByKey;
|
|
121
125
|
protected handlerChangeTab(): void;
|
|
122
126
|
protected handlerLoadingList(event: boolean): void;
|
|
@@ -127,7 +131,7 @@ export declare class LibsUiComponentsDropdownComponent implements OnInit {
|
|
|
127
131
|
protected handlerListFunctionsControl(event: IListFunctionControlEvent): void;
|
|
128
132
|
protected handlerChangStageFlagMouse(flag: IFlagMouse): void;
|
|
129
133
|
private reset;
|
|
130
|
-
private
|
|
134
|
+
private prepareItemSelectedDisplay;
|
|
131
135
|
private mergeFlagMouse;
|
|
132
136
|
static ɵfac: i0.ɵɵFactoryDeclaration<LibsUiComponentsDropdownComponent, never>;
|
|
133
137
|
static ɵcmp: i0.ɵɵComponentDeclaration<LibsUiComponentsDropdownComponent, "libs_ui-components-dropdown", never, { "useXssFilter": { "alias": "useXssFilter"; "required": false; "isSignal": true; }; "popoverElementRefCustom": { "alias": "popoverElementRefCustom"; "required": false; "isSignal": true; }; "classInclude": { "alias": "classInclude"; "required": false; "isSignal": true; }; "ignoreStopPropagationEvent": { "alias": "ignoreStopPropagationEvent"; "required": false; "isSignal": true; }; "flagMouse": { "alias": "flagMouse"; "required": false; "isSignal": true; }; "flagMouseContent": { "alias": "flagMouseContent"; "required": false; "isSignal": true; }; "popoverCustomConfig": { "alias": "popoverCustomConfig"; "required": false; "isSignal": true; }; "isNgContent": { "alias": "isNgContent"; "required": false; "isSignal": true; }; "zIndex": { "alias": "zIndex"; "required": false; "isSignal": true; }; "convertItemSelected": { "alias": "convertItemSelected"; "required": false; "isSignal": true; }; "getPopoverItemSelected": { "alias": "getPopoverItemSelected"; "required": false; "isSignal": true; }; "httpRequestDetailItemById": { "alias": "httpRequestDetailItemById"; "required": false; "isSignal": true; }; "lengthKeys": { "alias": "lengthKeys"; "required": false; "isSignal": true; }; "textDisplayWhenNoSelect": { "alias": "textDisplayWhenNoSelect"; "required": false; "isSignal": true; }; "textDisplayWhenMultiSelect": { "alias": "textDisplayWhenMultiSelect"; "required": false; "isSignal": true; }; "classIncludeTextDisplayWhenNoSelect": { "alias": "classIncludeTextDisplayWhenNoSelect"; "required": false; "isSignal": true; }; "fieldLabel": { "alias": "fieldLabel"; "required": false; "isSignal": true; }; "fieldGetLabel": { "alias": "fieldGetLabel"; "required": false; "isSignal": true; }; "labelPopoverConfig": { "alias": "labelPopoverConfig"; "required": false; "isSignal": true; }; "labelPopoverFullWidth": { "alias": "labelPopoverFullWidth"; "required": false; "isSignal": true; }; "hasContentUnitRight": { "alias": "hasContentUnitRight"; "required": false; "isSignal": true; }; "listSearchNoDataTemplateRef": { "alias": "listSearchNoDataTemplateRef"; "required": false; "isSignal": true; }; "dropdownTemplateRefNotSearchNoData": { "alias": "dropdownTemplateRefNotSearchNoData"; "required": false; "isSignal": true; }; "fieldGetImage": { "alias": "fieldGetImage"; "required": false; "isSignal": true; }; "imageSize": { "alias": "imageSize"; "required": false; "isSignal": true; }; "typeShape": { "alias": "typeShape"; "required": false; "isSignal": true; }; "fieldGetIcon": { "alias": "fieldGetIcon"; "required": false; "isSignal": true; }; "fieldGetTextAvatar": { "alias": "fieldGetTextAvatar"; "required": false; "isSignal": true; }; "fieldGetColorAvatar": { "alias": "fieldGetColorAvatar"; "required": false; "isSignal": true; }; "classAvatarInclude": { "alias": "classAvatarInclude"; "required": false; "isSignal": true; }; "getLastTextAfterSpace": { "alias": "getLastTextAfterSpace"; "required": false; "isSignal": true; }; "linkImageError": { "alias": "linkImageError"; "required": false; "isSignal": true; }; "showError": { "alias": "showError"; "required": false; "isSignal": true; }; "showBorderError": { "alias": "showBorderError"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "labelConfig": { "alias": "labelConfig"; "required": false; "isSignal": true; }; "disableLabel": { "alias": "disableLabel"; "required": false; "isSignal": true; }; "listSearchConfig": { "alias": "listSearchConfig"; "required": false; "isSignal": true; }; "isSearchOnline": { "alias": "isSearchOnline"; "required": false; "isSignal": true; }; "listHiddenInputSearch": { "alias": "listHiddenInputSearch"; "required": false; "isSignal": true; }; "listSearchPadding": { "alias": "listSearchPadding"; "required": false; "isSignal": true; }; "listKeySearch": { "alias": "listKeySearch"; "required": false; "isSignal": true; }; "listDividerClassInclude": { "alias": "listDividerClassInclude"; "required": false; "isSignal": true; }; "listConfig": { "alias": "listConfig"; "required": false; "isSignal": true; }; "listButtonsOther": { "alias": "listButtonsOther"; "required": false; "isSignal": true; }; "listHasButtonUnSelectOption": { "alias": "listHasButtonUnSelectOption"; "required": false; "isSignal": true; }; "listClickExactly": { "alias": "listClickExactly"; "required": false; "isSignal": true; }; "listBackgroundCustom": { "alias": "listBackgroundCustom"; "required": false; "isSignal": true; }; "listMaxItemShow": { "alias": "listMaxItemShow"; "required": false; "isSignal": true; }; "listKeySelected": { "alias": "listKeySelected"; "required": false; "isSignal": true; }; "listMultiKeySelected": { "alias": "listMultiKeySelected"; "required": false; "isSignal": true; }; "listKeysDisable": { "alias": "listKeysDisable"; "required": false; "isSignal": true; }; "listKeysHidden": { "alias": "listKeysHidden"; "required": false; "isSignal": true; }; "validRequired": { "alias": "validRequired"; "required": false; "isSignal": true; }; "validMaxItemSelected": { "alias": "validMaxItemSelected"; "required": false; "isSignal": true; }; "changeValidUndefinedResetError": { "alias": "changeValidUndefinedResetError"; "required": false; "isSignal": true; }; "allowSelectItemMultiple": { "alias": "allowSelectItemMultiple"; "required": false; "isSignal": true; }; "focusInputSearch": { "alias": "focusInputSearch"; "required": false; "isSignal": true; }; "onlyEmitDataWhenReset": { "alias": "onlyEmitDataWhenReset"; "required": false; "isSignal": true; }; "resetKeyWhenSelectAllKey": { "alias": "resetKeyWhenSelectAllKey"; "required": false; "isSignal": true; }; "listConfigHasDivider": { "alias": "listConfigHasDivider"; "required": false; "isSignal": true; }; "classIncludeIcon": { "alias": "classIncludeIcon"; "required": false; "isSignal": true; }; "classIncludeContent": { "alias": "classIncludeContent"; "required": false; "isSignal": true; }; "listIgnoreClassDisableDefaultWhenUseKeysDisableItem": { "alias": "listIgnoreClassDisableDefaultWhenUseKeysDisableItem"; "required": false; "isSignal": true; }; "tabKeyActive": { "alias": "tabKeyActive"; "required": false; "isSignal": true; }; "tabsConfig": { "alias": "tabsConfig"; "required": false; "isSignal": true; }; "ignoreBorderBottom": { "alias": "ignoreBorderBottom"; "required": false; "isSignal": true; }; }, { "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"; }, never, ["*"], true, never>;
|
|
@@ -23,6 +23,9 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
23
23
|
popoverItemSelected = signal(undefined);
|
|
24
24
|
labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));
|
|
25
25
|
autoSelectedFirstItemCallOutsideBefore = signal(false);
|
|
26
|
+
// Cờ: true khi đang chọn item nội bộ → effect tự-chọn (constructor) bỏ qua, tránh race async.
|
|
27
|
+
// Đọc trong effect bằng untracked() để KHÔNG thành dependency (tránh effect tự kích lại khi reset cờ).
|
|
28
|
+
isSelectingInternally = signal(false);
|
|
26
29
|
keysSelected = signal([]);
|
|
27
30
|
popoverFunctionControl = signal(undefined);
|
|
28
31
|
fieldKey = signal('id');
|
|
@@ -117,7 +120,9 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
117
120
|
}
|
|
118
121
|
});
|
|
119
122
|
effect(() => {
|
|
120
|
-
|
|
123
|
+
// Đọc cờ qua untracked để cờ KHÔNG trở thành dependency của effect (tránh tự kích lại khi set cờ).
|
|
124
|
+
const isSelectingInternally = untracked(() => this.isSelectingInternally());
|
|
125
|
+
if (!isNil(this.listKeySelected()) && this.listKeySelected() !== '' && !this.itemsSelected() && !this.autoSelectedFirstItemCallOutsideBefore() && !isSelectingInternally) {
|
|
121
126
|
untracked(() => {
|
|
122
127
|
this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });
|
|
123
128
|
});
|
|
@@ -129,7 +134,9 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
129
134
|
}
|
|
130
135
|
});
|
|
131
136
|
effect(() => {
|
|
132
|
-
|
|
137
|
+
// Đọc cờ qua untracked để không thành dependency (xem handlerSelectedKey / handlerSelectMultiKey).
|
|
138
|
+
const isSelectingInternally = untracked(() => this.isSelectingInternally());
|
|
139
|
+
if (this.listMultiKeySelected() && !this.autoSelectedFirstItemCallOutsideBefore() && !isSelectingInternally) {
|
|
133
140
|
untracked(() => {
|
|
134
141
|
const previousValue = this.keysSelected() || [];
|
|
135
142
|
const currentValue = this.listMultiKeySelected() || [];
|
|
@@ -146,6 +153,7 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
146
153
|
if (this.listKeySelected() || this.listMultiKeySelected()) {
|
|
147
154
|
this.lengthKeys.set(this.listKeySelected() ? 1 : this.listMultiKeySelected()?.length || 0);
|
|
148
155
|
}
|
|
156
|
+
this.warnMissingHttpRequestDetailItemById();
|
|
149
157
|
if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.()?.autoSelectAllItem || listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {
|
|
150
158
|
try {
|
|
151
159
|
this.loadingDetail.set(true);
|
|
@@ -182,6 +190,18 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
182
190
|
updateLabelItemSelected: async (label) => this.itemsSelected.update((value) => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),
|
|
183
191
|
refreshList: async () => this.listFunctionControl()?.refresh(),
|
|
184
192
|
setItemSelectedByKey: this.setItemSelectedByKey.bind(this),
|
|
193
|
+
setSelectedKey: async (key, options) => {
|
|
194
|
+
if (options?.reset) {
|
|
195
|
+
await this.reset();
|
|
196
|
+
}
|
|
197
|
+
await this.handlerSelectedKey({ key, item: undefined, isClickManual: false });
|
|
198
|
+
},
|
|
199
|
+
setSelectedMultiKey: async (keys, options) => {
|
|
200
|
+
if (options?.reset) {
|
|
201
|
+
await this.reset();
|
|
202
|
+
}
|
|
203
|
+
await this.handlerSelectMultiKey({ keys, mapKeys: [], isClickManual: false });
|
|
204
|
+
},
|
|
185
205
|
};
|
|
186
206
|
}
|
|
187
207
|
defaultConvertItemSelected(item) {
|
|
@@ -242,6 +262,16 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
242
262
|
this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });
|
|
243
263
|
this.listMultiKeySelected.set(keys);
|
|
244
264
|
}
|
|
265
|
+
warnMissingHttpRequestDetailItemById() {
|
|
266
|
+
if (this.httpRequestDetailItemById()) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const hasPreselectedKey = (!isNil(this.listKeySelected()) && this.listKeySelected() !== '') || !!this.listMultiKeySelected()?.length;
|
|
270
|
+
if (!hasPreselectedKey) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
console.warn(`[LibsUiComponentsDropdownComponent] Đang truyền sẵn "listKeySelected/listMultiKeySelected" nhưng CHƯA cấu hình [httpRequestDetailItemById]. Khi dropdown chỉ nhận key (không có sẵn item tương ứng), label của item đã chọn sẽ KHÔNG hiển thị được (hiện trắng). Hãy cấu hình [httpRequestDetailItemById] để dropdown tự gọi API lấy chi tiết item theo key. Xem README mục "Dropdown lazy-load chi tiết item theo key".`);
|
|
274
|
+
}
|
|
245
275
|
handlerEvent(type) {
|
|
246
276
|
if (type === 'click') {
|
|
247
277
|
return;
|
|
@@ -271,6 +301,17 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
271
301
|
this.popoverFunctionControl.set(event);
|
|
272
302
|
}
|
|
273
303
|
async handlerSelectedKey(event) {
|
|
304
|
+
// Bật cờ đồng bộ ngay đầu để effect tự-chọn (constructor) bỏ qua trong lúc đang chọn nội bộ.
|
|
305
|
+
// Tránh race: listKeySelected.set() (đồng bộ) kích effect TRƯỚC khi itemsSelected.set() (sau await) kịp chạy.
|
|
306
|
+
this.isSelectingInternally.set(true);
|
|
307
|
+
try {
|
|
308
|
+
await this.processSelectedKey(event);
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
this.isSelectingInternally.set(false);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async processSelectedKey(event) {
|
|
274
315
|
const key = event?.key;
|
|
275
316
|
const item = event?.item;
|
|
276
317
|
const isClickManual = event?.isClickManual;
|
|
@@ -300,10 +341,20 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
300
341
|
this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
|
|
301
342
|
return;
|
|
302
343
|
}
|
|
303
|
-
this.itemsSelected.set(await this.
|
|
344
|
+
this.itemsSelected.set(await this.prepareItemSelectedDisplay(item));
|
|
304
345
|
this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
|
|
305
346
|
}
|
|
306
347
|
async handlerSelectMultiKey(event, isClickManual = false) {
|
|
348
|
+
// Bật cờ đồng bộ để effect tự-chọn multi (constructor) bỏ qua trong lúc đang chọn nội bộ (tránh race async).
|
|
349
|
+
this.isSelectingInternally.set(true);
|
|
350
|
+
try {
|
|
351
|
+
await this.processSelectMultiKey(event, isClickManual);
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
this.isSelectingInternally.set(false);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
async processSelectMultiKey(event, isClickManual = false) {
|
|
307
358
|
if (this.listConfig()?.configTemplateGroup?.()?.singleSelectItem && event?.mapKeys?.length) {
|
|
308
359
|
const itemClickManual = event.mapKeys.find((mapKey) => mapKey.item?.isCheckManual);
|
|
309
360
|
if (itemClickManual) {
|
|
@@ -328,7 +379,7 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
328
379
|
this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
329
380
|
return;
|
|
330
381
|
}
|
|
331
|
-
this.itemsSelected.set(await this.
|
|
382
|
+
this.itemsSelected.set(await this.prepareItemSelectedDisplay(item));
|
|
332
383
|
this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
333
384
|
}
|
|
334
385
|
async setItemSelectedByKey(key) {
|
|
@@ -341,7 +392,7 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
341
392
|
const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;
|
|
342
393
|
this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);
|
|
343
394
|
const result = await this.httpRequestService.callApi(httpRequestDetailItemById);
|
|
344
|
-
this.itemsSelected.set(await this.
|
|
395
|
+
this.itemsSelected.set(await this.prepareItemSelectedDisplay(result?.data?.[0] || result?.data));
|
|
345
396
|
this.loadingDetail.set(false);
|
|
346
397
|
return this.itemsSelected();
|
|
347
398
|
}
|
|
@@ -412,7 +463,7 @@ export class LibsUiComponentsDropdownComponent {
|
|
|
412
463
|
this.keysSelected.set([]);
|
|
413
464
|
this.error.set(undefined);
|
|
414
465
|
}
|
|
415
|
-
async
|
|
466
|
+
async prepareItemSelectedDisplay(item) {
|
|
416
467
|
const itemClone = cloneDeep(item);
|
|
417
468
|
if (itemClone) {
|
|
418
469
|
this.convertItemSelected()(itemClone, this.translate);
|
|
@@ -443,4 +494,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
443
494
|
type: Component,
|
|
444
495
|
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 [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 [class.h-full]=\"listMaxItemShow() === -1\"\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 && !validRequired() && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [templateRefNotSearchNoData]=\"dropdownTemplateRefNotSearchNoData()\"\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"] }]
|
|
445
496
|
}], ctorParameters: () => [] });
|
|
446
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSwrQkFBK0IsRUFBOEMsTUFBTSw0QkFBNEIsQ0FBQztBQUd6SCxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBQ2hNLE9BQU8sRUFBdUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFFeEssT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxFQUFzQix3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0ksT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3hFLE9BQU8s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U0FBUyw4Q0FBRSw4QkFBOEIsNHFCQUFFLGdDQUFnQyxvZ0JBQUUsK0JBQStCLDZYQUFFLDZCQUE2QiwyaENBQUUscUNBQXFDOzs0RkFFaE8saUNBQWlDO2tCQVQ3QyxTQUFTOytCQUVFLDZCQUE2QixjQUczQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLEVBQUUsU0FBUyxFQUFFLDhCQUE4QixFQUFFLGdDQUFnQyxFQUFFLCtCQUErQixFQUFFLDZCQUE2QixFQUFFLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBUWVBFX1NIQVBFX0FWQVRBUiwgVFlQRV9TSVpFX0FWQVRBUl9DT05GSUcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBJQnV0dG9uIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJSW5wdXRTZWFyY2hDb25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IGdldEZpZWxkS2V5QnlUeXBlLCBJTGlzdENvbmZpZ0l0ZW0sIElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSwgSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnQsIFRZUEVfVEVNUExBVEUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpc3QnO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSwgSVBvcG92ZXIsIElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIElQb3BvdmVyT3ZlcmxheSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJTWVzc2FnZVRyYW5zbGF0ZSwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1zZWN1cml0eS10cnVzdCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdCc7XG5pbXBvcnQgeyBDSEFSQUNURVJfREFUQV9FTVBUWSwgY2xvbmVEZWVwLCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElELCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgZ2V0LCBpc0VxdWFsLCBpc05pbCwgc2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJRHJvcGRvd25UYWJzSXRlbSwgSUVtaXRNdWx0aUtleSwgSUVtaXRTZWxlY3RLZXksIElQb3BvdmVyQ3VzdG9tQ29uZmlnLCBJVmFsaWRNYXhJdGVtU2VsZWN0ZWQgfSBmcm9tICcuL2ludGVyZmFjZXMvZHJvcGRvd24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNEcm9wZG93blRhYnNDb21wb25lbnQgfSBmcm9tICcuL3RhYnMvdGFicy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSwgQXN5bmNQaXBlLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duVGFic0NvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGVycm9yID0gc2lnbmFsPElNZXNzYWdlVHJhbnNsYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgc2hvd0xpc3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgaXRlbXNTZWxlY3RlZCA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsb2FkaW5nRGV0YWlsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdMaXN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByb3RlY3RlZCBwb3BvdmVySXRlbVNlbGVjdGVkID0gc2lnbmFsPElQb3BvdmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGFiZWxJdGVtU2VsZWN0ZWRDb21wdXRlZCA9IGNvbXB1dGVkKHRoaXMuZ2V0TGFiZWxJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG4gIHByb3RlY3RlZCBhdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpZWxkS2V5ID0gc2lnbmFsPHN0cmluZz4oJ2lkJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdEZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgdXNlWHNzRmlsdGVyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBwb3BvdmVyRWxlbWVudFJlZkN1c3RvbSA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBmbGFnTW91c2UgPSBtb2RlbDxJRmxhZ01vdXNlPih7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlIH0pO1xuICByZWFkb25seSBmbGFnTW91c2VDb250ZW50ID0gbW9kZWw8SUZsYWdNb3VzZT4oKTtcbiAgcmVhZG9ubHkgcG9wb3ZlckN1c3RvbUNvbmZpZyA9IGlucHV0PElQb3BvdmVyQ3VzdG9tQ29uZmlnPigpO1xuICByZWFkb25seSBpc05nQ29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgY29udmVydEl0ZW1TZWxlY3RlZCA9IGlucHV0PChpdGVtOiB1bmtub3duLCB0cmFuc2xhdGU/OiBUcmFuc2xhdGVTZXJ2aWNlKSA9PiB2b2lkPih0aGlzLmRlZmF1bHRDb252ZXJ0SXRlbVNlbGVjdGVkLmJpbmQodGhpcykpO1xuICByZWFkb25seSBnZXRQb3BvdmVySXRlbVNlbGVjdGVkID0gaW5wdXQ8KGl0ZW06IHVua25vd24sIHRyYW5zbGF0ZT86IFRyYW5zbGF0ZVNlcnZpY2UpID0+IFByb21pc2U8SVBvcG92ZXIgfCB1bmRlZmluZWQ+PigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBsZW5ndGhLZXlzID0gbW9kZWw8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgdGV4dERpc3BsYXlXaGVuTm9TZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdpMThuX3NlbGVjdF9pbmZvcm1hdGlvbicpO1xuICByZWFkb25seSB0ZXh0RGlzcGxheVdoZW5NdWx0aVNlbGVjdCA9IGlucHV0PHN0cmluZz4oJ2kxOG5fc2VsZWN0aW5nX29wdGlvbnMnKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVGV4dERpc3BsYXlXaGVuTm9TZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDVyJyk7XG4gIHJlYWRvbmx5IGZpZWxkTGFiZWwgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xhYmVsRGlzcGxheScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdsYWJlbERpc3BsYXknIH0pO1xuICByZWFkb25seSBmaWVsZEdldExhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsYWJlbFBvcG92ZXJDb25maWcgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXk+KCk7XG4gIHJlYWRvbmx5IGxhYmVsUG9wb3ZlckZ1bGxXaWR0aCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNDb250ZW50VW5pdFJpZ2h0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaE5vRGF0YVRlbXBsYXRlUmVmID0gaW5wdXQ8VGVtcGxhdGVSZWY8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVGVtcGxhdGVSZWZOb3RTZWFyY2hOb0RhdGEgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0SW1hZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGltYWdlU2l6ZSA9IGlucHV0PFRZUEVfU0laRV9BVkFUQVJfQ09ORklHPigxNik7XG4gIHJlYWRvbmx5IHR5cGVTaGFwZSA9IGlucHV0PFRZUEVfU0hBUEVfQVZBVEFSPignY2lyY2xlJyk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0SWNvbiA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRUZXh0QXZhdGFyID0gaW5wdXQ8c3RyaW5nPigndXNlcm5hbWUnKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRDb2xvckF2YXRhciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NBdmF0YXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtci1bOHB4XScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdtci1bOHB4XScgfSk7XG4gIHJlYWRvbmx5IGdldExhc3RUZXh0QWZ0ZXJTcGFjZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpbmtJbWFnZUVycm9yID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBzaG93RXJyb3IgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxDb25maWcgPSBpbnB1dDxJTGFiZWw+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVMYWJlbCA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgbGlzdFNlYXJjaENvbmZpZyA9IGlucHV0PElJbnB1dFNlYXJjaENvbmZpZywgSUlucHV0U2VhcmNoQ29uZmlnIHwgdW5kZWZpbmVkPih7IG5vQm9yZGVyOiB0cnVlIH0sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IHsgbm9Cb3JkZXI6IHRydWUgfSB9KTtcbiAgcmVhZG9ubHkgaXNTZWFyY2hPbmxpbmUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxpc3RIaWRkZW5JbnB1dFNlYXJjaCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RTZWFyY2hQYWRkaW5nID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdEtleVNlYXJjaCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdERpdmlkZXJDbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RDb25maWcgPSBpbnB1dDxJTGlzdENvbmZpZ0l0ZW0+KCk7XG4gIHJlYWRvbmx5IGxpc3RCdXR0b25zT3RoZXIgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdENsaWNrRXhhY3RseSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RCYWNrZ3JvdW5kQ3VzdG9tID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0TWF4SXRlbVNob3cgPSBpbnB1dDxudW1iZXI+KDUpO1xuICByZWFkb25seSBsaXN0S2V5U2VsZWN0ZWQgPSBtb2RlbDx1bmtub3duPigpO1xuICByZWFkb25seSBsaXN0TXVsdGlLZXlTZWxlY3RlZCA9IG1vZGVsPEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBsaXN0S2V5c0Rpc2FibGUgPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpOyAvLyBraMO0bmcgZMO5bmcgZ2nDoSB0cuG7iyBuw6B5IGvhur90IGjhu6NwIHbhu5tpIHRlbXBsYXRlIGNoZWNrYm94IGPDsyBjb25maWcgY2jhu6lhIGNvbmZpZ0NoZWNrYm94Q2hlY2tBbGxcbiAgcmVhZG9ubHkgbGlzdEtleXNIaWRkZW4gPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpOyAvLyBraMO0bmcgZMO5bmcgZ2nDoSB0cuG7iyBuw6B5IGvhur90IGjhu6NwIHbhu5tpIHRlbXBsYXRlIGNoZWNrYm94IGPDsyBjb25maWcgY2jhu6lhIGNvbmZpZ0NoZWNrYm94Q2hlY2tBbGxcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PElWYWxpZE1heEl0ZW1TZWxlY3RlZD4oKTtcbiAgcmVhZG9ubHkgY2hhbmdlVmFsaWRVbmRlZmluZWRSZXNldEVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWxsb3dTZWxlY3RJdGVtTXVsdGlwbGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBmb2N1c0lucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IG9ubHlFbWl0RGF0YVdoZW5SZXNldCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRydWUga2hpIG114buRbiBlbWl0IHPhu7Ega2nhu4duIHRoYXkgxJHhu5VpIGtleVxuICByZWFkb25seSByZXNldEtleVdoZW5TZWxlY3RBbGxLZXkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0Q29uZmlnSGFzRGl2aWRlciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVJY29uID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtbC1bOHB4XScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdtbC1bOHB4XScgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUNvbnRlbnQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RJZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIGLhu48gY2jhur8gxJHhu5kgZGlzYWJsZSBpdGVtIHRyw6puIGh0bWwgbGlzdCB2aWV3IMSR4buDIGRpc2FibGUgdOG7q25nIHBo4bqnbiB0cm9uZyByb3dzXG4gIHJlYWRvbmx5IHRhYktleUFjdGl2ZSA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdGFic0NvbmZpZyA9IGlucHV0PEFycmF5PElEcm9wZG93blRhYnNJdGVtPj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVyQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRTZWxlY3RLZXkgPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNo4buNbiAxLlxuICByZWFkb25seSBvdXRTZWxlY3RNdWx0aUtleSA9IG91dHB1dDxJRW1pdE11bHRpS2V5IHwgdW5kZWZpbmVkPigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSBjaG8gcGjDqXAgY2jhu41uIG5oaeG7gXUuXG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFZhbGlkRXZlbnQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBvdXREYXRhQ2hhbmdlID0gb3V0cHV0PEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbk90aGVyID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dFNob3dMaXN0ID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVRhYktleUFjdGl2ZSA9IG91dHB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyogSU5KRUNUKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3RDb25maWcgPSB0aGlzLmxpc3RDb25maWcoKTtcbiAgICAgIGlmIChsaXN0Q29uZmlnKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmZpZWxkS2V5LnNldChnZXRGaWVsZEtleUJ5VHlwZShsaXN0Q29uZmlnLCAnaWQnKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIWlzTmlsKHRoaXMubGlzdEtleVNlbGVjdGVkKCkpICYmIHRoaXMubGlzdEtleVNlbGVjdGVkKCkgIT09ICcnICYmICF0aGlzLml0ZW1zU2VsZWN0ZWQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkS2V5KHsga2V5OiB0aGlzLmxpc3RLZXlTZWxlY3RlZCgpLCBpdGVtOiB1bmRlZmluZWQsIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsaWRVbmRlZmluZWRSZXNldEVycm9yKCkgJiYgdGhpcy52YWxpZFJlcXVpcmVkKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMucmVzZXRFcnJvcigpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLmtleXNTZWxlY3RlZCgpIHx8IFtdO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSB8fCBbXTtcblxuICAgICAgICAgIGlmIChpc0VxdWFsKGNsb25lRGVlcChwcmV2aW91c1ZhbHVlKSwgY2xvbmVEZWVwKGN1cnJlbnRWYWx1ZSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBjdXJyZW50VmFsdWUsIG1hcEtleXM6IFtdLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG5cbiAgICBpZiAodGhpcy5saXN0S2V5U2VsZWN0ZWQoKSB8fCB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMubGVuZ3RoS2V5cy5zZXQodGhpcy5saXN0S2V5U2VsZWN0ZWQoKSA/IDEgOiB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aCB8fCAwKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMubGVuZ3RoS2V5cygpICYmIGxpc3RDb25maWcgJiYgKGxpc3RDb25maWcuYXV0b1NlbGVjdEZpcnN0SXRlbSB8fCBsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5hdXRvU2VsZWN0QWxsSXRlbSB8fCBsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlR3JvdXA/LigpPy5mbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdCkgJiYgbGlzdENvbmZpZy5odHRwUmVxdWVzdERhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0RGF0YSA9IGxpc3RDb25maWcuaHR0cFJlcXVlc3REYXRhKCk7XG4gICAgICAgIGNvbnN0IHsgYXJndW1lbnRzVmFsdWUsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlIH0gPSBodHRwUmVxdWVzdERhdGE7XG4gICAgICAgIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5mYWtlUmVzcG9uc2VQYWdpbmdBcGkoKSwgZHJvcGRvd25UYWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlIH0sIHt9LCAnJywgdHJ1ZSwgZmFsc2UsIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaShodHRwUmVxdWVzdERhdGEpO1xuICAgICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgICAgaWYgKHJlc3VsdD8uZGF0YSkge1xuICAgICAgICAgIHRoaXMuaXRlbXMuc2V0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICB0aGlzLmVtaXRBdXRvU2VsZWN0S2V5KHJlc3VsdC5kYXRhLCBsaXN0Q29uZmlnLnR5cGUpO1xuICAgICAgICAgIHRoaXMuYXV0b1NlbGVjdGVkRmlyc3RJdGVtQ2FsbE91dHNpZGVCZWZvcmUuc2V0KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dERhdGFDaGFuZ2UuZW1pdCh0aGlzLml0ZW1zKCkpO1xuICAgIH1cbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh0aGlzLkZ1bmN0aW9uc0NvbnRyb2wpO1xuICAgIHRoaXMuY2hlY2tWYWxpZCh0cnVlKTtcbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICByZXNldDogdGhpcy5yZXNldC5iaW5kKHRoaXMpLFxuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkLmJpbmQodGhpcyksXG4gICAgICByZXNldEVycm9yOiB0aGlzLnJlc2V0RXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIHNldEVycm9yOiB0aGlzLnNldEVycm9yLmJpbmQodGhpcyksXG4gICAgICByZW1vdmVMaXN0OiBhc3luYyAoKSA9PiB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKSxcbiAgICAgIGdldERpc2FibGU6IGFzeW5jICgpID0+IHRoaXMuZGlzYWJsZSgpID8/IGZhbHNlLFxuICAgICAgdXBkYXRlTGFiZWxJdGVtU2VsZWN0ZWQ6IGFzeW5jIChsYWJlbCkgPT4gdGhpcy5pdGVtc1NlbGVjdGVkLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlLCBbdGhpcy5maWVsZExhYmVsKCldOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGxhYmVsKSB9KSksXG4gICAgICByZWZyZXNoTGlzdDogYXN5bmMgKCkgPT4gdGhpcy5saXN0RnVuY3Rpb25Db250cm9sKCk/LnJlZnJlc2goKSxcbiAgICAgIHNldEl0ZW1TZWxlY3RlZEJ5S2V5OiB0aGlzLnNldEl0ZW1TZWxlY3RlZEJ5S2V5LmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZGVmYXVsdENvbnZlcnRJdGVtU2VsZWN0ZWQoaXRlbTogdW5rbm93bikge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZEdldExhYmVsID0gdGhpcy5maWVsZEdldExhYmVsKCk7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZEdldExhYmVsID8gZ2V0KGl0ZW0sIGZpZWxkR2V0TGFiZWwpIDogdW5kZWZpbmVkO1xuICAgIHNldChpdGVtLCB0aGlzLmZpZWxkTGFiZWwoKSwgdmFsdWUgPz8gZ2V0KGl0ZW0sICdsYWJlbCcpID8/IGdldChpdGVtLCAnbmFtZScpID8/ICcgJyk7XG4gIH1cblxuICBwcml2YXRlIGdldExhYmVsSXRlbVNlbGVjdGVkKCkge1xuICAgIGxldCBsYWJlbCA9ICcgJztcbiAgICBpZiAoIXRoaXMubGVuZ3RoS2V5cygpKSB7XG4gICAgICBsYWJlbCA9IHRoaXMudGV4dERpc3BsYXlXaGVuTm9TZWxlY3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpID4gMSkge1xuICAgICAgbGFiZWwgPSB0aGlzLnRleHREaXNwbGF5V2hlbk11bHRpU2VsZWN0KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSA9PT0gMSkge1xuICAgICAgbGFiZWwgPSBnZXQodGhpcy5pdGVtc1NlbGVjdGVkKCksIHRoaXMuZmllbGRMYWJlbCgpKSB8fCB0aGlzLnRleHREaXNwbGF5V2hlbk5vU2VsZWN0KCk7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEF1dG9TZWxlY3RLZXkoaXRlbXM6IEFycmF5PHVua25vd24+LCB0eXBlOiBUWVBFX1RFTVBMQVRFKSB7XG4gICAgY29uc3QgbGlzdENvbmZpZyA9IHRoaXMubGlzdENvbmZpZygpO1xuICAgIGlmICghaXRlbXM/Lmxlbmd0aCB8fCAhbGlzdENvbmZpZyB8fCAoIWxpc3RDb25maWcuYXV0b1NlbGVjdEZpcnN0SXRlbSAmJiAhbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUNoZWNrYm94Py4oKT8uYXV0b1NlbGVjdEFsbEl0ZW0gJiYgIWxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmbGF0SXRlbXNTdXBwb3J0QXV0b1NlbGVjdCA9IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0O1xuICAgIGlmICh0eXBlID09PSAnZ3JvdXAnICYmIGZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSB7XG4gICAgICBpdGVtcyA9IGZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KGl0ZW1zKTtcbiAgICB9XG4gICAgaWYgKGxpc3RDb25maWcuYXV0b1NlbGVjdEZpcnN0SXRlbSkge1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgY29uc3Qga2V5ID0gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSk7XG4gICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJyB8fCB0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9XSwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldChba2V5XSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlICE9PSAnY2hlY2tib3gnICYmIHR5cGUgIT09ICdncm91cCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IG1hcEtleXM6IEFycmF5PElMaXN0RGF0YUVtaXRLZXk+ID0gW107XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0KGl0ZW0sIHRoaXMuZmllbGRLZXkoKSk7XG4gICAgICBpZiAoaXNOaWwoa2V5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIG1hcEtleXMucHVzaCh7IGtleSwgaXRlbSwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5oYW5kbGVyU2VsZWN0TXVsdGlLZXkoeyBrZXlzLCBtYXBLZXlzLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldChrZXlzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRXZlbnQodHlwZTogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgaWYgKHR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgICB0aGlzLnNob3dMaXN0LnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dFNob3dMaXN0LmVtaXQodGhpcy5zaG93TGlzdCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93TGlzdC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vdXRTaG93TGlzdC5lbWl0KHRoaXMuc2hvd0xpc3QoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckRhdGFDaGFuZ2UoaXRlbXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgdGhpcy5pdGVtcy5zZXQoaXRlbXMpO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgdGhpcy5vdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pdGVtcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGV2ZW50OiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5mbGFnTW91c2VDb250ZW50LnNldChldmVudCk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbk90aGVyKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25PdGhlci5lbWl0KGJ1dHRvbik7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRLZXkgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBrZXkgPSBldmVudD8ua2V5O1xuICAgIGNvbnN0IGl0ZW0gPSBldmVudD8uaXRlbTtcbiAgICBjb25zdCBpc0NsaWNrTWFudWFsID0gZXZlbnQ/LmlzQ2xpY2tNYW51YWw7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldCghKGlzTmlsKGtleSkgfHwgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleSA9PT0gJycpKSA/IDEgOiAwKTtcbiAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQoa2V5KTtcbiAgICBpZiAoIXRoaXMuYWxsb3dTZWxlY3RJdGVtTXVsdGlwbGUoKSAmJiB0aGlzLml0ZW1zU2VsZWN0ZWQoKSAmJiBnZXQodGhpcy5pdGVtc1NlbGVjdGVkKCksIHRoaXMuZmllbGRLZXkoKSkgPT09IGtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNDbGlja01hbnVhbCkge1xuICAgICAgaWYgKCEoaXNOaWwoa2V5KSB8fCAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5ID09PSAnJykpICYmIChpdGVtIHx8IHRoaXMuaXRlbXNTZWxlY3RlZCgpKSkge1xuICAgICAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2woKT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpICYmICFpdGVtICYmIHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCgpKSB7XG4gICAgICBsZXQgaXRlbVNlbGVjdGVkID0gYXdhaXQgdGhpcy5zZXRJdGVtU2VsZWN0ZWRCeUtleShrZXkpO1xuICAgICAgaWYgKCFpdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgaXRlbVNlbGVjdGVkID0ge1xuICAgICAgICAgIFt0aGlzLmZpZWxkS2V5KCldOiBrZXksXG4gICAgICAgICAgW3RoaXMuZmllbGRMYWJlbCgpXTogQ0hBUkFDVEVSX0RBVEFfRU1QVFksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoaXRlbVNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5pdGVtID0gaXRlbVNlbGVjdGVkO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IC4uLmV2ZW50LCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoYXdhaXQgdGhpcy5jbG9uZUl0ZW1JbnB1dEFuZEJ1aWxkRGlzcGxheShpdGVtKSk7XG4gICAgdGhpcy5vdXRTZWxlY3RLZXkuZW1pdCh7IC4uLmV2ZW50LCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlbGVjdE11bHRpS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQsIGlzQ2xpY2tNYW51YWwgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmxpc3RDb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LnNpbmdsZVNlbGVjdEl0ZW0gJiYgZXZlbnQ/Lm1hcEtleXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbUNsaWNrTWFudWFsID0gZXZlbnQubWFwS2V5cy5maW5kKChtYXBLZXkpID0+IG1hcEtleS5pdGVtPy5pc0NoZWNrTWFudWFsKTtcbiAgICAgIGlmIChpdGVtQ2xpY2tNYW51YWwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiAoaXRlbUNsaWNrTWFudWFsLml0ZW0uaXNDaGVja01hbnVhbCA9IGZhbHNlKSk7XG4gICAgICAgIGV2ZW50LmtleXMgPSBbaXRlbUNsaWNrTWFudWFsLmtleV07XG4gICAgICAgIGV2ZW50Lm1hcEtleXMgPSBbaXRlbUNsaWNrTWFudWFsXTtcbiAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbLi4uKGV2ZW50Py5rZXlzIHx8IFtdKV0pO1xuICAgIHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQuc2V0KFsuLi4oZXZlbnQ/LmtleXMgfHwgW10pXSk7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldChldmVudD8ua2V5cz8ubGVuZ3RoIHx8IDApO1xuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSA+IDEpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh7IC4uLihldmVudCB8fCB7fSksIGlzQ2xpY2tNYW51YWwsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gZXZlbnQ/LmtleXNbMF07XG4gICAgbGV0IGl0ZW0gPSBldmVudD8ubWFwS2V5cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGtleSk/Lml0ZW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgJiYgIWl0ZW0gJiYgdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCkpIHtcbiAgICAgIGl0ZW0gPSBhd2FpdCB0aGlzLnNldEl0ZW1TZWxlY3RlZEJ5S2V5KGtleSk7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtIH1dLCBpc0NsaWNrTWFudWFsLCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoYXdhaXQgdGhpcy5jbG9uZUl0ZW1JbnB1dEFuZEJ1aWxkRGlzcGxheShpdGVtKSk7XG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHsgLi4uKGV2ZW50IHx8IHt9KSwgaXNDbGlja01hbnVhbCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRJdGVtU2VsZWN0ZWRCeUtleShrZXk6IHVua25vd24pIHtcbiAgICBjb25zdCBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkID0gdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCk7XG4gICAgaWYgKCFodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkIHx8IHRoaXMubG9hZGluZ0RldGFpbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KHRydWUpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQ7XG4gICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsga2V5LCBkcm9wZG93blRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9LCB7fSwgJycsIGZhbHNlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaShodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKTtcbiAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoYXdhaXQgdGhpcy5jbG9uZUl0ZW1JbnB1dEFuZEJ1aWxkRGlzcGxheShyZXN1bHQ/LmRhdGE/LlswXSB8fCByZXN1bHQ/LmRhdGEpKTtcbiAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXNTZWxlY3RlZCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVRhYigpIHtcbiAgICB0aGlzLm91dENoYW5nZVRhYktleUFjdGl2ZS5lbWl0KHRoaXMudGFiS2V5QWN0aXZlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMb2FkaW5nTGlzdChldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZ0xpc3Quc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHsgbWVzc2FnZTogZXJyb3IgfSk7XG4gICAgdGhpcy5zaG93Qm9yZGVyRXJyb3Iuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZCgpIHtcbiAgICBpZiAodGhpcy5lcnJvcigpPy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tWYWxpZCh2YWxpZGF0ZURlZmF1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICBjb25zdCB2YWxpZCA9IHsgcmVxdWlyZWQ6IHRydWUsIGxpbWl0TWF4SXRlbVNlbGVjdDogdHJ1ZSB9O1xuICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKSAmJiAhdGhpcy5sZW5ndGhLZXlzKCkpIHtcbiAgICAgIHZhbGlkLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWxpZE1heEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmxlbmd0aEtleXMoKSA+IHZhbGlkTWF4SXRlbVNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHQgJiYgdmFsaWQucmVxdWlyZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IC4uLih2YWxpZFJlcXVpcmVkIHx8IHt9KSwgbWVzc2FnZTogdmFsaWRSZXF1aXJlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEIH0pO1xuICAgIH1cbiAgICBpZiAoIXZhbGlkYXRlRGVmYXVsdCAmJiAhdGhpcy5lcnJvcigpICYmIHZhbGlkLmxpbWl0TWF4SXRlbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi4odmFsaWRNYXhJdGVtU2VsZWN0ZWQgfHwge30pLCBtZXNzYWdlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHsgdmFsdWU6IHZhbGlkTWF4SXRlbVNlbGVjdGVkPy52YWx1ZSB9IH0pO1xuICAgIH1cbiAgICB0aGlzLm91dFZhbGlkRXZlbnQuZW1pdCh2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QpO1xuICAgIHJldHVybiB2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3Q7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnNob3dCb3JkZXJFcnJvci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbChldmVudDogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLmZsYWdNb3VzZS5zZXQoZmxhZyk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldCgpIHtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldCgwKTtcbiAgICB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVzZXRLZXlTZWxlY3RlZCgpO1xuICAgIGlmICghdGhpcy5zaG93TGlzdCgpICYmIHRoaXMub25seUVtaXREYXRhV2hlblJlc2V0KCkpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xvbmVJdGVtSW5wdXRBbmRCdWlsZERpc3BsYXkoaXRlbTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGl0ZW1DbG9uZSA9IGNsb25lRGVlcChpdGVtKTtcbiAgICBpZiAoaXRlbUNsb25lKSB7XG4gICAgICB0aGlzLmNvbnZlcnRJdGVtU2VsZWN0ZWQoKShpdGVtQ2xvbmUsIHRoaXMudHJhbnNsYXRlKTtcbiAgICAgIGNvbnN0IGdldFBvcG92ZXJJdGVtU2VsZWN0ZWQgPSB0aGlzLmdldFBvcG92ZXJJdGVtU2VsZWN0ZWQoKTtcbiAgICAgIGlmIChnZXRQb3BvdmVySXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMucG9wb3Zlckl0ZW1TZWxlY3RlZC5zZXQoYXdhaXQgZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZChpdGVtQ2xvbmUsIHRoaXMudHJhbnNsYXRlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1DbG9uZTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VGbGFnTW91c2UoKSB7XG4gICAgY29uc3QgZmxhZzogSUZsYWdNb3VzZSA9IHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UsIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBmYWxzZSB9O1xuICAgIGlmICh0aGlzLmZsYWdNb3VzZUNvbnRlbnQoKT8uaXNNb3VzZUVudGVyIHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNNb3VzZUVudGVyKSB7XG4gICAgICBmbGFnLmlzTW91c2VFbnRlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmZsYWdNb3VzZUNvbnRlbnQoKT8uaXNNb3VzZUVudGVyQ29udGVudCB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlckNvbnRlbnQpIHtcbiAgICAgIGZsYWcuaXNNb3VzZUVudGVyQ29udGVudCA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmZsYWdNb3VzZUNvbnRlbnQoKT8uaXNDb250YWluZXJIYXNTY3JvbGwgfHwgdGhpcy5mbGFnTW91c2UoKS5pc0NvbnRhaW5lckhhc1Njcm9sbCkge1xuICAgICAgZmxhZy5pc0NvbnRhaW5lckhhc1Njcm9sbCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWcpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB3LWZ1bGxcIj5cbiAgQGlmIChsYWJlbENvbmZpZygpOyBhcyBsYWJlbCkge1xuICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtbGFiZWxcbiAgICAgIFtjbGFzc0luY2x1ZGVdPVwibGFiZWwuY2xhc3NJbmNsdWRlXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWwubGFiZWxMZWZ0XCJcbiAgICAgIFtsYWJlbExlZnRDbGFzc109XCJsYWJlbC5sYWJlbExlZnRDbGFzc1wiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWwucmVxdWlyZWRcIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cImxhYmVsLmRlc2NyaXB0aW9uXCJcbiAgICAgIFtkZXNjcmlwdGlvbkNsYXNzXT1cImxhYmVsLmRlc2NyaXB0aW9uQ2xhc3NcIlxuICAgICAgW2xhYmVsUmlnaHRdPVwibGFiZWwubGFiZWxSaWdodFwiXG4gICAgICBbbGFiZWxSaWdodENsYXNzXT1cImxhYmVsLmxhYmVsUmlnaHRDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbC5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtidXR0b25zTGVmdF09XCJsYWJlbC5idXR0b25zTGVmdFwiXG4gICAgICBbYnV0dG9uc1JpZ2h0XT1cImxhYmVsLmJ1dHRvbnNSaWdodFwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNMZWZ0XT1cImxhYmVsLmRpc2FibGVCdXR0b25zTGVmdCB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc1JpZ2h0XT1cImxhYmVsLmRpc2FibGVCdXR0b25zUmlnaHQgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbaGFzVG9nZ2xlXT1cImxhYmVsLmhhc1RvZ2dsZVwiXG4gICAgICBbdG9nZ2xlQWN0aXZlXT1cImxhYmVsLnRvZ2dsZUFjdGl2ZVwiXG4gICAgICBbdG9nZ2xlRGlzYWJsZV09XCJsYWJlbC50b2dnbGVEaXNhYmxlIHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW3BvcG92ZXJdPVwibGFiZWwucG9wb3ZlclwiXG4gICAgICBbaWNvblBvcG92ZXJDbGFzc109XCJsYWJlbC5pY29uUG9wb3ZlckNsYXNzXCJcbiAgICAgIFtvbmx5U2hvd0NvdW50XT1cImxhYmVsLm9ubHlTaG93Q291bnRcIlxuICAgICAgW2xpbWl0TGVuZ3RoXT1cImxhYmVsLmxpbWl0TGVuZ3RoXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25dPVwibGFiZWwuYnV0dG9uc0Rlc2NyaXB0aW9uXCJcbiAgICAgIFtkaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsLmRpc2FibGVCdXR0b25zRGVzY3JpcHRpb24gfHwgZGlzYWJsZSgpXCJcbiAgICAgIFtidXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc109XCJsYWJlbC5idXR0b25zRGVzY3JpcHRpb25Db250YWluZXJDbGFzc1wiXG4gICAgICBbY291bnRdPVwibGFiZWwuY291bnRcIiAvPlxuICB9XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJkaXNhYmxlKCkgfHwgcmVhZG9ubHkoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgIFtjbGFzc109XCJjbGFzc0luY2x1ZGUoKSB8fCAndy1mdWxsJ1wiXG4gICAgW21vZGVdPVwiJ2NsaWNrLXRvZ2dsZSdcIlxuICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICAgIFtpZ25vcmVDdXJzb3JQb2ludGVyTW9kZUxpa2VDbGlja109XCJ0cnVlXCJcbiAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwiaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnQoKVwiXG4gICAgW2VsZW1lbnRSZWZDdXN0b21dPVwicG9wb3ZlckVsZW1lbnRSZWZDdXN0b20oKVwiXG4gICAgW2NvbmZpZ109XCJ7XG4gICAgICBhbmltYXRpb25Db25maWc6IHBvcG92ZXJDdXN0b21Db25maWcoKT8uYW5pbWF0aW9uQ29uZmlnIHx8IHt9LFxuICAgICAgekluZGV4OiB6SW5kZXgoKSA/PyAxMDAwLFxuICAgICAgd2lkdGhCeVBhcmVudDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy53aWR0aEJ5UGFyZW50ID8/IHRydWUsXG4gICAgICBwYXJlbnRCb3JkZXJXaWR0aDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5wYXJlbnRCb3JkZXJXaWR0aCA/PyAwLFxuICAgICAgbWF4SGVpZ2h0OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/Lm1heEhlaWdodCA/PyAyMDQ4LFxuICAgICAgbWF4V2lkdGg6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ubWF4V2lkdGggPz8gMjA0OCxcbiAgICAgIGRpcmVjdGlvbjogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5kaXJlY3Rpb24gPz8gJ2JvdHRvbScsXG4gICAgICB0ZW1wbGF0ZTogbGlzdFZpZXdFbCxcbiAgICAgIHdoaXRlVGhlbWU6IHRydWUsXG4gICAgICB0aW1lckRlc3Ryb3k6IHBvcG92ZXJDdXN0b21Db25maWcoKT8udGltZXJEZXN0cm95ID8/IDAsXG4gICAgICBpZ25vcmVBcnJvdzogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5pZ25vcmVBcnJvdyA/PyB0cnVlLFxuICAgICAgZGlyZWN0aW9uRGlzdGFuY2U6IDIsXG4gICAgICBjbGFzc0luY2x1ZGU6ICchcm91bmRlZC1bNHB4XSBvdmVyZmxvdy1oaWRkZW4gJyArIChwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmNsYXNzSW5jbHVkZSA/PyAnbGlicy11aS1ib3JkZXItZ2VuZXJhbCAnKSxcbiAgICAgIHBvc2l0aW9uOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBvc2l0aW9uIHx8IHsgbW9kZTogJ3N0YXJ0JywgZGlzdGFuY2U6IDAgfSxcbiAgICAgIHdpZHRoOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LndpZHRoLFxuICAgICAgY2xhc3NJbmNsdWRlT3ZlcmxheUJvZHk6IHBvcG92ZXJDdXN0b21Db25maWcoKT8uY2xhc3NJbmNsdWRlT3ZlcmxheUJvZHksXG4gICAgfVwiXG4gICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dEV2ZW50KT1cImhhbmRsZXJFdmVudCgkZXZlbnQpXCJcbiAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIFtjbGFzc109XCInbGlicy11aS1kcm9wZG93biAnICsgKGNsYXNzSW5jbHVkZUNvbnRlbnQoKSB8fCAnJylcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItZ2VuZXJhbF09XCIhZXJyb3IoKSAmJiAhc2hvd0JvcmRlckVycm9yKCkgJiYgIXNob3dMaXN0KClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItcHJpbWFyeS1mb2N1cy1nZW5lcmFsXT1cIiFlcnJvcigpICYmICFzaG93Qm9yZGVyRXJyb3IoKSAmJiBzaG93TGlzdCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWVycm9yLWdlbmVyYWxdPVwiZXJyb3IoKSB8fCBzaG93Qm9yZGVyRXJyb3IoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLXJlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1yZWFkb25seS1iYWNrZ3JvdW5kXT1cInJlYWRvbmx5KClcIlxuICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIShkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpIHx8IHJlYWRvbmx5KCkpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZS1iYWNrZ3JvdW5kXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgICBbY2xhc3MucG9pbnRlci1ldmVudHMtbm9uZV09XCJsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgICBbY2xhc3Mucm91bmRlZC10ci0wXT1cImhhc0NvbnRlbnRVbml0UmlnaHQoKVwiXG4gICAgICAgIFtjbGFzcy5yb3VuZGVkLWJyLTBdPVwiaGFzQ29udGVudFVuaXRSaWdodCgpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsIGFic29sdXRlXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktZHJvcGRvd24tcGxhY2Vob2xkZXJdPVwiIWxlbmd0aEtleXMoKVwiPlxuICAgICAgICAgICAgICBAaWYgKGxlbmd0aEtleXMoKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIEBpZiAoaXRlbXNTZWxlY3RlZCgpOyBhcyBpdGVtc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkR2V0SW1hZ2UoKTsgYXMgZmllbGRHZXRJbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWF2YXRhclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NBdmF0YXJJbmNsdWRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0eXBlU2hhcGVdPVwidHlwZVNoYXBlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cImltYWdlU2l6ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhcl09XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0SW1hZ2VdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGlua0F2YXRhckVycm9yXT1cImxpbmtJbWFnZUVycm9yKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpZEdlbkNvbG9yXT1cIml0ZW1zU2VsZWN0ZWRbZmllbGRHZXRDb2xvckF2YXRhcigpIHx8IGZpZWxkR2V0VGV4dEF2YXRhcigpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2dldExhc3RUZXh0QWZ0ZXJTcGFjZV09XCJnZXRMYXN0VGV4dEFmdGVyU3BhY2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRBdmF0YXJdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldFRleHRBdmF0YXIoKV1cIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZEdldEljb24oKTsgYXMgZmllbGRHZXRJY29uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0SWNvbl0gKyAnIG1yLVs4cHhdJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIihsYWJlbFBvcG92ZXJGdWxsV2lkdGgoKSA/ICd3LTEwMCAnIDogJycpICsgY2xhc3NJbmNsdWRlVGV4dERpc3BsYXlXaGVuTm9TZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEl0ZW1TZWxlY3RlZENvbXB1dGVkKCkgfCB0cmFuc2xhdGU6IHsgdmFsdWU6IGxlbmd0aEtleXMoKSB9IHwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZTogJ2h0bWwnIDogdXNlWHNzRmlsdGVyKCkgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IG1heFdpZHRoOiBsYWJlbFBvcG92ZXJDb25maWcoKT8ubWF4V2lkdGggfHwgMjUwLCBkaXJlY3Rpb246ICd0b3AnLCB6SW5kZXg6IGxhYmVsUG9wb3ZlckNvbmZpZygpPy56SW5kZXgsIHRpbWVyRGVzdHJveTogbGFiZWxQb3BvdmVyQ29uZmlnKCk/LnRpbWVyRGVzdHJveSB8fCAwIH1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cblxuICAgICAgICAgICAgICBAaWYgKHBvcG92ZXJJdGVtU2VsZWN0ZWQoKTsgYXMgcG9wb3Zlckl0ZW1TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICAgICAgW3R5cGVdPVwicG9wb3Zlckl0ZW1TZWxlY3RlZC50eXBlIHx8ICdvdGhlcidcIlxuICAgICAgICAgICAgICAgICAgW2NvbmZpZ109XCJwb3BvdmVySXRlbVNlbGVjdGVkLmNvbmZpZyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChwb3BvdmVySXRlbVNlbGVjdGVkLmRhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySHRtbF09XCJwb3BvdmVySXRlbVNlbGVjdGVkLmRhdGFWaWV3IHwgdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tdG9vbHRpcC1vdXRsaW5lIHRleHQtWzE2cHhdIG14LVs4cHhdXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCB0ZXh0LVsjNmE3MzgzXSB7eyBjbGFzc0luY2x1ZGVJY29uKCkgfX1cIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktZGlzYWJsZV09XCJyZWFkb25seSgpIHx8IGRpc2FibGUoKVwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICB9XG4gIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gIEBpZiAoc2hvd0Vycm9yKCkpIHtcbiAgICBAaWYgKGVycm9yKCk7IGFzIGVycm9yKSB7XG4gICAgICBAbGV0IGNvbnN0SHRtbE1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8ICcgJztcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtdC1bOHB4XSBsaWJzLXVpLXRleHQtZXJyb3IgbGlicy11aS1mb250LWg3clwiXG4gICAgICAgIFtpbm5lckh0bWxdPVwiY29uc3RIdG1sTWVzc2FnZSB8IHRyYW5zbGF0ZTogZXJyb3IuaW50ZXJwb2xhdGVQYXJhbXMgfHwge31cIj48L2Rpdj5cbiAgICB9XG4gIH1cbjwvZGl2PlxuPG5nLXRlbXBsYXRlICNsaXN0Vmlld0VsPlxuICA8ZGl2XG4gICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uXCJcbiAgICBbY2xhc3MuaC1mdWxsXT1cImxpc3RNYXhJdGVtU2hvdygpID09PSAtMVwiPlxuICAgIEBpZiAodGFic0NvbmZpZygpOyBhcyB0YWJzQ29uZmlnKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duLXRhYnNcbiAgICAgICAgW3RhYnNDb25maWddPVwidGFic0NvbmZpZ1wiXG4gICAgICAgIFsodGFiS2V5QWN0aXZlKV09XCJ0YWJLZXlBY3RpdmVcIlxuICAgICAgICBbaWdub3JlQm9yZGVyQm90dG9tXT1cImlnbm9yZUJvcmRlckJvdHRvbSgpXCJcbiAgICAgICAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCBsb2FkaW5nTGlzdCgpXCJcbiAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGFiKClcIiAvPlxuICAgIH1cbiAgICA8bGlic191aS1jb21wb25lbnRzLWxpc3RcbiAgICAgIFtzZWFyY2hDb25maWddPVwibGlzdFNlYXJjaENvbmZpZygpXCJcbiAgICAgIFtpc1NlYXJjaE9ubGluZV09XCJpc1NlYXJjaE9ubGluZSgpXCJcbiAgICAgIFtkcm9wZG93blRhYktleUFjdGl2ZV09XCJ0YWJLZXlBY3RpdmUoKVwiXG4gICAgICBba2V5U2VhcmNoXT1cImxpc3RLZXlTZWFyY2goKVwiXG4gICAgICBbY29uZmlnXT1cImxpc3RDb25maWcoKVwiXG4gICAgICBbYXV0b1NlbGVjdGVkRmlyc3RJdGVtQ2FsbE91dHNpZGVCZWZvcmVdPVwiYXV0b1NlbGVjdGVkRmlyc3RJdGVtQ2FsbE91dHNpZGVCZWZvcmUoKVwiXG4gICAgICBbcGFkZGluZ0xlZnRJdGVtXT1cInBvcG92ZXJDdXN0b21Db25maWcoKT8ucGFkZGluZ0xlZnRJdGVtID8/IGZhbHNlXCJcbiAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2Rpc2FibGVMYWJlbF09XCJkaXNhYmxlTGFiZWwoKVwiXG4gICAgICBbaGlkZGVuSW5wdXRTZWFyY2hdPVwibGlzdEhpZGRlbklucHV0U2VhcmNoKClcIlxuICAgICAgW3NlYXJjaFBhZGRpbmddPVwibGlzdFNlYXJjaFBhZGRpbmcoKVwiXG4gICAgICBbY2xhc3MuaC1mdWxsXT1cImxpc3RNYXhJdGVtU2hvdygpID09PSAtMVwiXG4gICAgICBbbWF4SXRlbVNob3ddPVwibGlzdE1heEl0ZW1TaG93KClcIlxuICAgICAgW2tleVNlbGVjdGVkXT1cImxpc3RLZXlTZWxlY3RlZCgpXCJcbiAgICAgIFttdWx0aUtleVNlbGVjdGVkXT1cImxpc3RNdWx0aUtleVNlbGVjdGVkKClcIlxuICAgICAgW2NsaWNrRXhhY3RseV09XCJwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmNsaWNrRXhhY3RseSA/PyBmYWxzZVwiXG4gICAgICBbZGl2aWRlckNsYXNzSW5jbHVkZV09XCJsaXN0U2VhcmNoQ29uZmlnKCkgPyBsaXN0RGl2aWRlckNsYXNzSW5jbHVkZSgpIDogJ2hpZGRlbidcIlxuICAgICAgW2J1dHRvbnNPdGhlcl09XCJsaXN0QnV0dG9uc090aGVyKClcIlxuICAgICAgW2JhY2tncm91bmRMaXN0Q3VzdG9tXT1cImxpc3RCYWNrZ3JvdW5kQ3VzdG9tKClcIlxuICAgICAgW2tleXNEaXNhYmxlSXRlbV09XCJsaXN0S2V5c0Rpc2FibGUoKVwiXG4gICAgICBba2V5c0hpZGRlbkl0ZW1dPVwibGlzdEtleXNIaWRkZW4oKVwiXG4gICAgICBbaGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwibGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uKCkgPz8gKCFwb3BvdmVyQ3VzdG9tQ29uZmlnKCkgJiYgIWxhYmVsQ29uZmlnKCk/LnJlcXVpcmVkICYmICF2YWxpZFJlcXVpcmVkKCkgJiYgKGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3RleHQnIHx8IGxpc3RDb25maWcoKT8udHlwZSA9PT0gJ3JhZGlvJykpXCJcbiAgICAgIFt0ZW1wbGF0ZVJlZlNlYXJjaE5vRGF0YV09XCJsaXN0U2VhcmNoTm9EYXRhVGVtcGxhdGVSZWYoKVwiXG4gICAgICBbdGVtcGxhdGVSZWZOb3RTZWFyY2hOb0RhdGFdPVwiZHJvcGRvd25UZW1wbGF0ZVJlZk5vdFNlYXJjaE5vRGF0YSgpXCJcbiAgICAgIFtmb2N1c0lucHV0U2VhcmNoXT1cImZvY3VzSW5wdXRTZWFyY2goKVwiXG4gICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgIFtyZXNldEtleVdoZW5TZWxlY3RBbGxLZXlEcm9wZG93bl09XCJyZXNldEtleVdoZW5TZWxlY3RBbGxLZXkoKVwiXG4gICAgICBbaWdub3JlQ2xhc3NEaXNhYmxlRGVmYXVsdFdoZW5Vc2VLZXlzRGlzYWJsZUl0ZW1dPVwibGlzdElnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtKClcIlxuICAgICAgW2hhc0RpdmlkZXJdPVwibGlzdENvbmZpZ0hhc0RpdmlkZXIoKVwiXG4gICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZEtleSgkZXZlbnQpXCJcbiAgICAgIChvdXRTZWxlY3RNdWx0aUtleSk9XCJoYW5kbGVyU2VsZWN0TXVsdGlLZXkoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAob3V0Q2hhbmdlVmlldyk9XCJoYW5kbGVyRGF0YUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChvdXRDbGlja0J1dHRvbk90aGVyKT1cImhhbmRsZXJDbGlja0J1dHRvbk90aGVyKCRldmVudClcIlxuICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckxpc3RGdW5jdGlvbnNDb250cm9sKCRldmVudClcIlxuICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2VQb3BvdmVyKT1cImhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgKG91dExvYWRpbmcpPVwiaGFuZGxlckxvYWRpbmdMaXN0KCRldmVudClcIiAvPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
497
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2Ryb3Bkb3duL3NyYy9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSwrQkFBK0IsRUFBOEMsTUFBTSw0QkFBNEIsQ0FBQztBQUd6SCxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXVGLDZCQUE2QixFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBQ2hNLE9BQU8sRUFBdUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFFeEssT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxFQUFzQix3QkFBd0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUseUJBQXlCLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0ksT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3hFLE9BQU8s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QUFFLGdDQUFnQyxvZ0JBQUUsK0JBQStCLDZYQUFFLDZCQUE2QiwyaENBQUUscUNBQXFDOzs0RkFFaE8saUNBQWlDO2tCQVQ3QyxTQUFTOytCQUVFLDZCQUE2QixjQUczQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLEVBQUUsU0FBUyxFQUFFLDhCQUE4QixFQUFFLGdDQUFnQyxFQUFFLCtCQUErQixFQUFFLDZCQUE2QixFQUFFLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBUWVBFX1NIQVBFX0FWQVRBUiwgVFlQRV9TSVpFX0FWQVRBUl9DT05GSUcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWF2YXRhcic7XG5pbXBvcnQgeyBJQnV0dG9uIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJSW5wdXRTZWFyY2hDb25maWcgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IGdldEZpZWxkS2V5QnlUeXBlLCBJTGlzdENvbmZpZ0l0ZW0sIElMaXN0RGF0YUVtaXRLZXksIElMaXN0RGF0YUVtaXRNdWx0aUtleSwgSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0xpc3RDb21wb25lbnQsIFRZUEVfVEVNUExBVEUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpc3QnO1xuaW1wb3J0IHsgSUZsYWdNb3VzZSwgSVBvcG92ZXIsIElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIElQb3BvdmVyT3ZlcmxheSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBJTWVzc2FnZVRyYW5zbGF0ZSwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1zZWN1cml0eS10cnVzdCc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdCc7XG5pbXBvcnQgeyBDSEFSQUNURVJfREFUQV9FTVBUWSwgY2xvbmVEZWVwLCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElELCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgZ2V0LCBpc0VxdWFsLCBpc05pbCwgc2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJRHJvcGRvd25UYWJzSXRlbSwgSUVtaXRNdWx0aUtleSwgSUVtaXRTZWxlY3RLZXksIElQb3BvdmVyQ3VzdG9tQ29uZmlnLCBJVmFsaWRNYXhJdGVtU2VsZWN0ZWQgfSBmcm9tICcuL2ludGVyZmFjZXMvZHJvcGRvd24uaW50ZXJmYWNlJztcbmltcG9ydCB7IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wtZXZlbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNEcm9wZG93blRhYnNDb21wb25lbnQgfSBmcm9tICcuL3RhYnMvdGFicy5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpUGlwZXNTZWN1cml0eVRydXN0UGlwZSwgQXN5bmNQaXBlLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQXZhdGFyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duVGFic0NvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGVycm9yID0gc2lnbmFsPElNZXNzYWdlVHJhbnNsYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgc2hvd0xpc3QgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgaXRlbXNTZWxlY3RlZCA9IHNpZ25hbDxhbnk+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsb2FkaW5nRGV0YWlsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmdMaXN0ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByb3RlY3RlZCBwb3BvdmVySXRlbVNlbGVjdGVkID0gc2lnbmFsPElQb3BvdmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGFiZWxJdGVtU2VsZWN0ZWRDb21wdXRlZCA9IGNvbXB1dGVkKHRoaXMuZ2V0TGFiZWxJdGVtU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG4gIHByb3RlY3RlZCBhdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIC8vIEPhu506IHRydWUga2hpIMSRYW5nIGNo4buNbiBpdGVtIG7hu5lpIGLhu5kg4oaSIGVmZmVjdCB04buxLWNo4buNbiAoY29uc3RydWN0b3IpIGLhu48gcXVhLCB0csOhbmggcmFjZSBhc3luYy5cbiAgLy8gxJDhu41jIHRyb25nIGVmZmVjdCBi4bqxbmcgdW50cmFja2VkKCkgxJHhu4MgS0jDlE5HIHRow6BuaCBkZXBlbmRlbmN5ICh0csOhbmggZWZmZWN0IHThu7Ega8OtY2ggbOG6oWkga2hpIHJlc2V0IGPhu50pLlxuICBwcml2YXRlIHJlYWRvbmx5IGlzU2VsZWN0aW5nSW50ZXJuYWxseSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PHVua25vd24+PihbXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9wb3ZlckZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpZWxkS2V5ID0gc2lnbmFsPHN0cmluZz4oJ2lkJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdEZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxJTGlzdEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgdXNlWHNzRmlsdGVyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBwb3BvdmVyRWxlbWVudFJlZkN1c3RvbSA9IGlucHV0PEhUTUxFbGVtZW50PigpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBmbGFnTW91c2UgPSBtb2RlbDxJRmxhZ01vdXNlPih7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlIH0pO1xuICByZWFkb25seSBmbGFnTW91c2VDb250ZW50ID0gbW9kZWw8SUZsYWdNb3VzZT4oKTtcbiAgcmVhZG9ubHkgcG9wb3ZlckN1c3RvbUNvbmZpZyA9IGlucHV0PElQb3BvdmVyQ3VzdG9tQ29uZmlnPigpO1xuICByZWFkb25seSBpc05nQ29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgY29udmVydEl0ZW1TZWxlY3RlZCA9IGlucHV0PChpdGVtOiB1bmtub3duLCB0cmFuc2xhdGU/OiBUcmFuc2xhdGVTZXJ2aWNlKSA9PiB2b2lkPih0aGlzLmRlZmF1bHRDb252ZXJ0SXRlbVNlbGVjdGVkLmJpbmQodGhpcykpO1xuICByZWFkb25seSBnZXRQb3BvdmVySXRlbVNlbGVjdGVkID0gaW5wdXQ8KGl0ZW06IHVua25vd24sIHRyYW5zbGF0ZT86IFRyYW5zbGF0ZVNlcnZpY2UpID0+IFByb21pc2U8SVBvcG92ZXIgfCB1bmRlZmluZWQ+PigpO1xuICByZWFkb25seSBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBsZW5ndGhLZXlzID0gbW9kZWw8bnVtYmVyPigwKTtcbiAgcmVhZG9ubHkgdGV4dERpc3BsYXlXaGVuTm9TZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdpMThuX3NlbGVjdF9pbmZvcm1hdGlvbicpO1xuICByZWFkb25seSB0ZXh0RGlzcGxheVdoZW5NdWx0aVNlbGVjdCA9IGlucHV0PHN0cmluZz4oJ2kxOG5fc2VsZWN0aW5nX29wdGlvbnMnKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVGV4dERpc3BsYXlXaGVuTm9TZWxlY3QgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDVyJyk7XG4gIHJlYWRvbmx5IGZpZWxkTGFiZWwgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2xhYmVsRGlzcGxheScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdsYWJlbERpc3BsYXknIH0pO1xuICByZWFkb25seSBmaWVsZEdldExhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsYWJlbFBvcG92ZXJDb25maWcgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXk+KCk7XG4gIHJlYWRvbmx5IGxhYmVsUG9wb3ZlckZ1bGxXaWR0aCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNDb250ZW50VW5pdFJpZ2h0ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdFNlYXJjaE5vRGF0YVRlbXBsYXRlUmVmID0gaW5wdXQ8VGVtcGxhdGVSZWY8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IGRyb3Bkb3duVGVtcGxhdGVSZWZOb3RTZWFyY2hOb0RhdGEgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0SW1hZ2UgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGltYWdlU2l6ZSA9IGlucHV0PFRZUEVfU0laRV9BVkFUQVJfQ09ORklHPigxNik7XG4gIHJlYWRvbmx5IHR5cGVTaGFwZSA9IGlucHV0PFRZUEVfU0hBUEVfQVZBVEFSPignY2lyY2xlJyk7XG4gIHJlYWRvbmx5IGZpZWxkR2V0SWNvbiA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRUZXh0QXZhdGFyID0gaW5wdXQ8c3RyaW5nPigndXNlcm5hbWUnKTtcbiAgcmVhZG9ubHkgZmllbGRHZXRDb2xvckF2YXRhciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgY2xhc3NBdmF0YXJJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtci1bOHB4XScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdtci1bOHB4XScgfSk7XG4gIHJlYWRvbmx5IGdldExhc3RUZXh0QWZ0ZXJTcGFjZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpbmtJbWFnZUVycm9yID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBzaG93RXJyb3IgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0JvcmRlckVycm9yID0gbW9kZWw8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGlzYWJsZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxDb25maWcgPSBpbnB1dDxJTGFiZWw+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVMYWJlbCA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgbGlzdFNlYXJjaENvbmZpZyA9IGlucHV0PElJbnB1dFNlYXJjaENvbmZpZywgSUlucHV0U2VhcmNoQ29uZmlnIHwgdW5kZWZpbmVkPih7IG5vQm9yZGVyOiB0cnVlIH0sIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IHsgbm9Cb3JkZXI6IHRydWUgfSB9KTtcbiAgcmVhZG9ubHkgaXNTZWFyY2hPbmxpbmUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxpc3RIaWRkZW5JbnB1dFNlYXJjaCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RTZWFyY2hQYWRkaW5nID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdEtleVNlYXJjaCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbGlzdERpdmlkZXJDbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RDb25maWcgPSBpbnB1dDxJTGlzdENvbmZpZ0l0ZW0+KCk7XG4gIHJlYWRvbmx5IGxpc3RCdXR0b25zT3RoZXIgPSBpbnB1dDxBcnJheTxJQnV0dG9uPj4oKTtcbiAgcmVhZG9ubHkgbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbGlzdENsaWNrRXhhY3RseSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxpc3RCYWNrZ3JvdW5kQ3VzdG9tID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBsaXN0TWF4SXRlbVNob3cgPSBpbnB1dDxudW1iZXI+KDUpO1xuICByZWFkb25seSBsaXN0S2V5U2VsZWN0ZWQgPSBtb2RlbDx1bmtub3duPigpO1xuICByZWFkb25seSBsaXN0TXVsdGlLZXlTZWxlY3RlZCA9IG1vZGVsPEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBsaXN0S2V5c0Rpc2FibGUgPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpOyAvLyBraMO0bmcgZMO5bmcgZ2nDoSB0cuG7iyBuw6B5IGvhur90IGjhu6NwIHbhu5tpIHRlbXBsYXRlIGNoZWNrYm94IGPDsyBjb25maWcgY2jhu6lhIGNvbmZpZ0NoZWNrYm94Q2hlY2tBbGxcbiAgcmVhZG9ubHkgbGlzdEtleXNIaWRkZW4gPSBpbnB1dDxBcnJheTxzdHJpbmc+PigpOyAvLyBraMO0bmcgZMO5bmcgZ2nDoSB0cuG7iyBuw6B5IGvhur90IGjhu6NwIHbhu5tpIHRlbXBsYXRlIGNoZWNrYm94IGPDsyBjb25maWcgY2jhu6lhIGNvbmZpZ0NoZWNrYm94Q2hlY2tBbGxcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElNZXNzYWdlVHJhbnNsYXRlPigpO1xuICByZWFkb25seSB2YWxpZE1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PElWYWxpZE1heEl0ZW1TZWxlY3RlZD4oKTtcbiAgcmVhZG9ubHkgY2hhbmdlVmFsaWRVbmRlZmluZWRSZXNldEVycm9yID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgYWxsb3dTZWxlY3RJdGVtTXVsdGlwbGUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBmb2N1c0lucHV0U2VhcmNoID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IG9ubHlFbWl0RGF0YVdoZW5SZXNldCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRydWUga2hpIG114buRbiBlbWl0IHPhu7Ega2nhu4duIHRoYXkgxJHhu5VpIGtleVxuICByZWFkb25seSByZXNldEtleVdoZW5TZWxlY3RBbGxLZXkgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBsaXN0Q29uZmlnSGFzRGl2aWRlciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGVJY29uID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdtbC1bOHB4XScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdtbC1bOHB4XScgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUNvbnRlbnQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGxpc3RJZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbSA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIGLhu48gY2jhur8gxJHhu5kgZGlzYWJsZSBpdGVtIHRyw6puIGh0bWwgbGlzdCB2aWV3IMSR4buDIGRpc2FibGUgdOG7q25nIHBo4bqnbiB0cm9uZyByb3dzXG4gIHJlYWRvbmx5IHRhYktleUFjdGl2ZSA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdGFic0NvbmZpZyA9IGlucHV0PEFycmF5PElEcm9wZG93blRhYnNJdGVtPj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVyQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRTZWxlY3RLZXkgPSBvdXRwdXQ8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KCk7IC8vIHPhu60gZOG7pW5nIGNobyB0eXBlIGNo4buNbiAxLlxuICByZWFkb25seSBvdXRTZWxlY3RNdWx0aUtleSA9IG91dHB1dDxJRW1pdE11bHRpS2V5IHwgdW5kZWZpbmVkPigpOyAvLyBz4butIGThu6VuZyBjaG8gdHlwZSBjaG8gcGjDqXAgY2jhu41uIG5oaeG7gXUuXG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFZhbGlkRXZlbnQgPSBvdXRwdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuICByZWFkb25seSBvdXREYXRhQ2hhbmdlID0gb3V0cHV0PEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbk90aGVyID0gb3V0cHV0PElCdXR0b24+KCk7XG4gIHJlYWRvbmx5IG91dFNob3dMaXN0ID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVRhYktleUFjdGl2ZSA9IG91dHB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbiAgLyogSU5KRUNUKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGxpc3RDb25maWcgPSB0aGlzLmxpc3RDb25maWcoKTtcbiAgICAgIGlmIChsaXN0Q29uZmlnKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmZpZWxkS2V5LnNldChnZXRGaWVsZEtleUJ5VHlwZShsaXN0Q29uZmlnLCAnaWQnKSkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyDEkOG7jWMgY+G7nSBxdWEgdW50cmFja2VkIMSR4buDIGPhu50gS0jDlE5HIHRy4bufIHRow6BuaCBkZXBlbmRlbmN5IGPhu6dhIGVmZmVjdCAodHLDoW5oIHThu7Ega8OtY2ggbOG6oWkga2hpIHNldCBj4budKS5cbiAgICAgIGNvbnN0IGlzU2VsZWN0aW5nSW50ZXJuYWxseSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmlzU2VsZWN0aW5nSW50ZXJuYWxseSgpKTtcbiAgICAgIGlmICghaXNOaWwodGhpcy5saXN0S2V5U2VsZWN0ZWQoKSkgJiYgdGhpcy5saXN0S2V5U2VsZWN0ZWQoKSAhPT0gJycgJiYgIXRoaXMuaXRlbXNTZWxlY3RlZCgpICYmICF0aGlzLmF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlKCkgJiYgIWlzU2VsZWN0aW5nSW50ZXJuYWxseSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkS2V5KHsga2V5OiB0aGlzLmxpc3RLZXlTZWxlY3RlZCgpLCBpdGVtOiB1bmRlZmluZWQsIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhbmdlVmFsaWRVbmRlZmluZWRSZXNldEVycm9yKCkgJiYgdGhpcy52YWxpZFJlcXVpcmVkKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMucmVzZXRFcnJvcigpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gxJDhu41jIGPhu50gcXVhIHVudHJhY2tlZCDEkeG7gyBraMO0bmcgdGjDoG5oIGRlcGVuZGVuY3kgKHhlbSBoYW5kbGVyU2VsZWN0ZWRLZXkgLyBoYW5kbGVyU2VsZWN0TXVsdGlLZXkpLlxuICAgICAgY29uc3QgaXNTZWxlY3RpbmdJbnRlcm5hbGx5ID0gdW50cmFja2VkKCgpID0+IHRoaXMuaXNTZWxlY3RpbmdJbnRlcm5hbGx5KCkpO1xuICAgICAgaWYgKHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQoKSAmJiAhdGhpcy5hdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZSgpICYmICFpc1NlbGVjdGluZ0ludGVybmFsbHkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5rZXlzU2VsZWN0ZWQoKSB8fCBbXTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkKCkgfHwgW107XG5cbiAgICAgICAgICBpZiAoaXNFcXVhbChjbG9uZURlZXAocHJldmlvdXNWYWx1ZSksIGNsb25lRGVlcChjdXJyZW50VmFsdWUpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdE11bHRpS2V5KHsga2V5czogY3VycmVudFZhbHVlLCBtYXBLZXlzOiBbXSwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgbGlzdENvbmZpZyA9IHRoaXMubGlzdENvbmZpZygpO1xuXG4gICAgaWYgKHRoaXMubGlzdEtleVNlbGVjdGVkKCkgfHwgdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLmxlbmd0aEtleXMuc2V0KHRoaXMubGlzdEtleVNlbGVjdGVkKCkgPyAxIDogdGhpcy5saXN0TXVsdGlLZXlTZWxlY3RlZCgpPy5sZW5ndGggfHwgMCk7XG4gICAgfVxuXG4gICAgdGhpcy53YXJuTWlzc2luZ0h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQoKTtcblxuICAgIGlmICghdGhpcy5sZW5ndGhLZXlzKCkgJiYgbGlzdENvbmZpZyAmJiAobGlzdENvbmZpZy5hdXRvU2VsZWN0Rmlyc3RJdGVtIHx8IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVDaGVja2JveD8uKCk/LmF1dG9TZWxlY3RBbGxJdGVtIHx8IGxpc3RDb25maWcuY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LmZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0KSAmJiBsaXN0Q29uZmlnLmh0dHBSZXF1ZXN0RGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nRGV0YWlsLnNldCh0cnVlKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3REYXRhID0gbGlzdENvbmZpZy5odHRwUmVxdWVzdERhdGEoKTtcbiAgICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IGh0dHBSZXF1ZXN0RGF0YTtcbiAgICAgICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IC4uLnRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpLCBkcm9wZG93blRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUgfSwge30sICcnLCB0cnVlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKGh0dHBSZXF1ZXN0RGF0YSk7XG4gICAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgICBpZiAocmVzdWx0Py5kYXRhKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQocmVzdWx0LmRhdGEpO1xuICAgICAgICAgIHRoaXMuZW1pdEF1dG9TZWxlY3RLZXkocmVzdWx0LmRhdGEsIGxpc3RDb25maWcudHlwZSk7XG4gICAgICAgICAgdGhpcy5hdXRvU2VsZWN0ZWRGaXJzdEl0ZW1DYWxsT3V0c2lkZUJlZm9yZS5zZXQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3V0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaXRlbXMoKSk7XG4gICAgfVxuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gICAgdGhpcy5jaGVja1ZhbGlkKHRydWUpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc2V0OiB0aGlzLnJlc2V0LmJpbmQodGhpcyksXG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMudmFsaWQuYmluZCh0aGlzKSxcbiAgICAgIHJlc2V0RXJyb3I6IHRoaXMucmVzZXRFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgc2V0RXJyb3I6IHRoaXMuc2V0RXJyb3IuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUxpc3Q6IGFzeW5jICgpID0+IHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpLFxuICAgICAgZ2V0RGlzYWJsZTogYXN5bmMgKCkgPT4gdGhpcy5kaXNhYmxlKCkgPz8gZmFsc2UsXG4gICAgICB1cGRhdGVMYWJlbEl0ZW1TZWxlY3RlZDogYXN5bmMgKGxhYmVsKSA9PiB0aGlzLml0ZW1zU2VsZWN0ZWQudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUsIFt0aGlzLmZpZWxkTGFiZWwoKV06IHRoaXMudHJhbnNsYXRlLmluc3RhbnQobGFiZWwpIH0pKSxcbiAgICAgIHJlZnJlc2hMaXN0OiBhc3luYyAoKSA9PiB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVmcmVzaCgpLFxuICAgICAgc2V0SXRlbVNlbGVjdGVkQnlLZXk6IHRoaXMuc2V0SXRlbVNlbGVjdGVkQnlLZXkuYmluZCh0aGlzKSxcbiAgICAgIHNldFNlbGVjdGVkS2V5OiBhc3luYyAoa2V5OiB1bmtub3duLCBvcHRpb25zPzogeyByZXNldD86IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVzZXQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVyU2VsZWN0ZWRLZXkoeyBrZXksIGl0ZW06IHVuZGVmaW5lZCwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICB9LFxuICAgICAgc2V0U2VsZWN0ZWRNdWx0aUtleTogYXN5bmMgKGtleXM6IHVua25vd25bXSwgb3B0aW9ucz86IHsgcmVzZXQ/OiBib29sZWFuIH0pID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlc2V0KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlclNlbGVjdE11bHRpS2V5KHsga2V5cywgbWFwS2V5czogW10sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29udmVydEl0ZW1TZWxlY3RlZChpdGVtOiB1bmtub3duKSB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkR2V0TGFiZWwgPSB0aGlzLmZpZWxkR2V0TGFiZWwoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkR2V0TGFiZWwgPyBnZXQoaXRlbSwgZmllbGRHZXRMYWJlbCkgOiB1bmRlZmluZWQ7XG4gICAgc2V0KGl0ZW0sIHRoaXMuZmllbGRMYWJlbCgpLCB2YWx1ZSA/PyBnZXQoaXRlbSwgJ2xhYmVsJykgPz8gZ2V0KGl0ZW0sICduYW1lJykgPz8gJyAnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFiZWxJdGVtU2VsZWN0ZWQoKSB7XG4gICAgbGV0IGxhYmVsID0gJyAnO1xuICAgIGlmICghdGhpcy5sZW5ndGhLZXlzKCkpIHtcbiAgICAgIGxhYmVsID0gdGhpcy50ZXh0RGlzcGxheVdoZW5Ob1NlbGVjdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgPiAxKSB7XG4gICAgICBsYWJlbCA9IHRoaXMudGV4dERpc3BsYXlXaGVuTXVsdGlTZWxlY3QoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGVuZ3RoS2V5cygpID09PSAxKSB7XG4gICAgICBsYWJlbCA9IGdldCh0aGlzLml0ZW1zU2VsZWN0ZWQoKSwgdGhpcy5maWVsZExhYmVsKCkpIHx8IHRoaXMudGV4dERpc3BsYXlXaGVuTm9TZWxlY3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXV0b1NlbGVjdEtleShpdGVtczogQXJyYXk8dW5rbm93bj4sIHR5cGU6IFRZUEVfVEVNUExBVEUpIHtcbiAgICBjb25zdCBsaXN0Q29uZmlnID0gdGhpcy5saXN0Q29uZmlnKCk7XG4gICAgaWYgKCFpdGVtcz8ubGVuZ3RoIHx8ICFsaXN0Q29uZmlnIHx8ICghbGlzdENvbmZpZy5hdXRvU2VsZWN0Rmlyc3RJdGVtICYmICFsaXN0Q29uZmlnLmNvbmZpZ1RlbXBsYXRlQ2hlY2tib3g/LigpPy5hdXRvU2VsZWN0QWxsSXRlbSAmJiAhbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKT8uZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZsYXRJdGVtc1N1cHBvcnRBdXRvU2VsZWN0ID0gbGlzdENvbmZpZy5jb25maWdUZW1wbGF0ZUdyb3VwPy4oKT8uZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3Q7XG4gICAgaWYgKHR5cGUgPT09ICdncm91cCcgJiYgZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QpIHtcbiAgICAgIGl0ZW1zID0gZmxhdEl0ZW1zU3VwcG9ydEF1dG9TZWxlY3QoaXRlbXMpO1xuICAgIH1cbiAgICBpZiAobGlzdENvbmZpZy5hdXRvU2VsZWN0Rmlyc3RJdGVtKSB7XG4gICAgICBjb25zdCBpdGVtID0gaXRlbXNbMF07XG4gICAgICBjb25zdCBrZXkgPSBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKTtcbiAgICAgIGlmICh0eXBlID09PSAncmFkaW8nIHx8IHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICB0aGlzLmhhbmRsZXJTZWxlY3RlZEtleSh7IGtleSwgaXRlbSwgaXNDbGlja01hbnVhbDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMubGlzdEtleVNlbGVjdGVkLnNldChrZXkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZXJTZWxlY3RNdWx0aUtleSh7IGtleXM6IFtrZXldLCBtYXBLZXlzOiBbeyBrZXksIGl0ZW0sIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH1dLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICAgIHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQuc2V0KFtrZXldKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgIT09ICdjaGVja2JveCcgJiYgdHlwZSAhPT0gJ2dyb3VwJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3QgbWFwS2V5czogQXJyYXk8SUxpc3REYXRhRW1pdEtleT4gPSBbXTtcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBnZXQoaXRlbSwgdGhpcy5maWVsZEtleSgpKTtcbiAgICAgIGlmIChpc05pbChrZXkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgbWFwS2V5cy5wdXNoKHsga2V5LCBpdGVtLCBpc0NsaWNrTWFudWFsOiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmhhbmRsZXJTZWxlY3RNdWx0aUtleSh7IGtleXMsIG1hcEtleXMsIGlzQ2xpY2tNYW51YWw6IGZhbHNlIH0pO1xuICAgIHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQuc2V0KGtleXMpO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXJuTWlzc2luZ0h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQoKSB7XG4gICAgaWYgKHRoaXMuaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhc1ByZXNlbGVjdGVkS2V5ID0gKCFpc05pbCh0aGlzLmxpc3RLZXlTZWxlY3RlZCgpKSAmJiB0aGlzLmxpc3RLZXlTZWxlY3RlZCgpICE9PSAnJykgfHwgISF0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkKCk/Lmxlbmd0aDtcbiAgICBpZiAoIWhhc1ByZXNlbGVjdGVkS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50XSDEkGFuZyB0cnV54buBbiBz4bq1biBcImxpc3RLZXlTZWxlY3RlZC9saXN0TXVsdGlLZXlTZWxlY3RlZFwiIG5oxrBuZyBDSMavQSBj4bqldSBow6xuaCBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF0uIEtoaSBkcm9wZG93biBjaOG7iSBuaOG6rW4ga2V5IChraMO0bmcgY8OzIHPhurVuIGl0ZW0gdMawxqFuZyDhu6luZyksIGxhYmVsIGPhu6dhIGl0ZW0gxJHDoyBjaOG7jW4gc+G6vSBLSMOUTkcgaGnhu4NuIHRo4buLIMSRxrDhu6NjIChoaeG7h24gdHLhuq9uZykuIEjDo3kgY+G6pXUgaMOsbmggW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdIMSR4buDIGRyb3Bkb3duIHThu7EgZ+G7jWkgQVBJIGzhuqV5IGNoaSB0aeG6v3QgaXRlbSB0aGVvIGtleS4gWGVtIFJFQURNRSBt4bulYyBcIkRyb3Bkb3duIGxhenktbG9hZCBjaGkgdGnhur90IGl0ZW0gdGhlbyBrZXlcIi5gXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRXZlbnQodHlwZTogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgaWYgKHR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgICB0aGlzLnNob3dMaXN0LnNldChmYWxzZSk7XG4gICAgICB0aGlzLm91dFNob3dMaXN0LmVtaXQodGhpcy5zaG93TGlzdCgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93TGlzdC5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vdXRTaG93TGlzdC5lbWl0KHRoaXMuc2hvd0xpc3QoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckRhdGFDaGFuZ2UoaXRlbXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgdGhpcy5pdGVtcy5zZXQoaXRlbXMpO1xuICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy51cGRhdGVQb3BvdmVyT3ZlcmxheVBvc2l0aW9uKCk7XG4gICAgdGhpcy5vdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pdGVtcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGV2ZW50OiBJRmxhZ01vdXNlKSB7XG4gICAgdGhpcy5mbGFnTW91c2VDb250ZW50LnNldChldmVudCk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0J1dHRvbk90aGVyKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25PdGhlci5lbWl0KGJ1dHRvbik7XG4gICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclBvcG92ZXJDb250cm9sRXZlbnQoZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLnBvcG92ZXJGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0ZWRLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRLZXkgfCB1bmRlZmluZWQpIHtcbiAgICAvLyBC4bqtdCBj4budIMSR4buTbmcgYuG7mSBuZ2F5IMSR4bqndSDEkeG7gyBlZmZlY3QgdOG7sS1jaOG7jW4gKGNvbnN0cnVjdG9yKSBi4buPIHF1YSB0cm9uZyBsw7pjIMSRYW5nIGNo4buNbiBu4buZaSBi4buZLlxuICAgIC8vIFRyw6FuaCByYWNlOiBsaXN0S2V5U2VsZWN0ZWQuc2V0KCkgKMSR4buTbmcgYuG7mSkga8OtY2ggZWZmZWN0IFRSxq/hu5pDIGtoaSBpdGVtc1NlbGVjdGVkLnNldCgpIChzYXUgYXdhaXQpIGvhu4twIGNo4bqheS5cbiAgICB0aGlzLmlzU2VsZWN0aW5nSW50ZXJuYWxseS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1NlbGVjdGVkS2V5KGV2ZW50KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc1NlbGVjdGluZ0ludGVybmFsbHkuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NTZWxlY3RlZEtleShldmVudDogSUxpc3REYXRhRW1pdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGtleSA9IGV2ZW50Py5rZXk7XG4gICAgY29uc3QgaXRlbSA9IGV2ZW50Py5pdGVtO1xuICAgIGNvbnN0IGlzQ2xpY2tNYW51YWwgPSBldmVudD8uaXNDbGlja01hbnVhbDtcbiAgICB0aGlzLmxlbmd0aEtleXMuc2V0KCEoaXNOaWwoa2V5KSB8fCAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5ID09PSAnJykpID8gMSA6IDApO1xuICAgIHRoaXMubGlzdEtleVNlbGVjdGVkLnNldChrZXkpO1xuICAgIGlmICghdGhpcy5hbGxvd1NlbGVjdEl0ZW1NdWx0aXBsZSgpICYmIHRoaXMuaXRlbXNTZWxlY3RlZCgpICYmIGdldCh0aGlzLml0ZW1zU2VsZWN0ZWQoKSwgdGhpcy5maWVsZEtleSgpKSA9PT0ga2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0NsaWNrTWFudWFsKSB7XG4gICAgICBpZiAoIShpc05pbChrZXkpIHx8ICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkgPT09ICcnKSkgJiYgKGl0ZW0gfHwgdGhpcy5pdGVtc1NlbGVjdGVkKCkpKSB7XG4gICAgICAgIHRoaXMucG9wb3ZlckZ1bmN0aW9uQ29udHJvbCgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgJiYgIWl0ZW0gJiYgdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCkpIHtcbiAgICAgIGxldCBpdGVtU2VsZWN0ZWQgPSBhd2FpdCB0aGlzLnNldEl0ZW1TZWxlY3RlZEJ5S2V5KGtleSk7XG4gICAgICBpZiAoIWl0ZW1TZWxlY3RlZCkge1xuICAgICAgICBpdGVtU2VsZWN0ZWQgPSB7XG4gICAgICAgICAgW3RoaXMuZmllbGRLZXkoKV06IGtleSxcbiAgICAgICAgICBbdGhpcy5maWVsZExhYmVsKCldOiBDSEFSQUNURVJfREFUQV9FTVBUWSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChpdGVtU2VsZWN0ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50Lml0ZW0gPSBpdGVtU2VsZWN0ZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KHsgLi4uZXZlbnQsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtc1NlbGVjdGVkLnNldChhd2FpdCB0aGlzLnByZXBhcmVJdGVtU2VsZWN0ZWREaXNwbGF5KGl0ZW0pKTtcbiAgICB0aGlzLm91dFNlbGVjdEtleS5lbWl0KHsgLi4uZXZlbnQsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0TXVsdGlLZXkoZXZlbnQ6IElMaXN0RGF0YUVtaXRNdWx0aUtleSB8IHVuZGVmaW5lZCwgaXNDbGlja01hbnVhbCA9IGZhbHNlKSB7XG4gICAgLy8gQuG6rXQgY+G7nSDEkeG7k25nIGLhu5kgxJHhu4MgZWZmZWN0IHThu7EtY2jhu41uIG11bHRpIChjb25zdHJ1Y3RvcikgYuG7jyBxdWEgdHJvbmcgbMO6YyDEkWFuZyBjaOG7jW4gbuG7mWkgYuG7mSAodHLDoW5oIHJhY2UgYXN5bmMpLlxuICAgIHRoaXMuaXNTZWxlY3RpbmdJbnRlcm5hbGx5LnNldCh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU2VsZWN0TXVsdGlLZXkoZXZlbnQsIGlzQ2xpY2tNYW51YWwpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU2VsZWN0aW5nSW50ZXJuYWxseS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1NlbGVjdE11bHRpS2V5KGV2ZW50OiBJTGlzdERhdGFFbWl0TXVsdGlLZXkgfCB1bmRlZmluZWQsIGlzQ2xpY2tNYW51YWwgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmxpc3RDb25maWcoKT8uY29uZmlnVGVtcGxhdGVHcm91cD8uKCk/LnNpbmdsZVNlbGVjdEl0ZW0gJiYgZXZlbnQ/Lm1hcEtleXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbUNsaWNrTWFudWFsID0gZXZlbnQubWFwS2V5cy5maW5kKChtYXBLZXkpID0+IG1hcEtleS5pdGVtPy5pc0NoZWNrTWFudWFsKTtcbiAgICAgIGlmIChpdGVtQ2xpY2tNYW51YWwpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiAoaXRlbUNsaWNrTWFudWFsLml0ZW0uaXNDaGVja01hbnVhbCA9IGZhbHNlKSk7XG4gICAgICAgIGV2ZW50LmtleXMgPSBbaXRlbUNsaWNrTWFudWFsLmtleV07XG4gICAgICAgIGV2ZW50Lm1hcEtleXMgPSBbaXRlbUNsaWNrTWFudWFsXTtcbiAgICAgICAgdGhpcy5wb3BvdmVyRnVuY3Rpb25Db250cm9sKCk/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbLi4uKGV2ZW50Py5rZXlzIHx8IFtdKV0pO1xuICAgIHRoaXMubGlzdE11bHRpS2V5U2VsZWN0ZWQuc2V0KFsuLi4oZXZlbnQ/LmtleXMgfHwgW10pXSk7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldChldmVudD8ua2V5cz8ubGVuZ3RoIHx8IDApO1xuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIGlmICh0aGlzLmxlbmd0aEtleXMoKSA+IDEpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh7IC4uLihldmVudCB8fCB7fSksIGlzQ2xpY2tNYW51YWwsIHRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gZXZlbnQ/LmtleXNbMF07XG4gICAgbGV0IGl0ZW0gPSBldmVudD8ubWFwS2V5cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5rZXkgPT09IGtleSk/Lml0ZW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGhLZXlzKCkgJiYgIWl0ZW0gJiYgdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCkpIHtcbiAgICAgIGl0ZW0gPSBhd2FpdCB0aGlzLnNldEl0ZW1TZWxlY3RlZEJ5S2V5KGtleSk7XG4gICAgICB0aGlzLm91dFNlbGVjdE11bHRpS2V5LmVtaXQoeyBrZXlzOiBba2V5XSwgbWFwS2V5czogW3sga2V5LCBpdGVtIH1dLCBpc0NsaWNrTWFudWFsLCB0YWJLZXlBY3RpdmU6IHRoaXMudGFiS2V5QWN0aXZlKCkgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoYXdhaXQgdGhpcy5wcmVwYXJlSXRlbVNlbGVjdGVkRGlzcGxheShpdGVtKSk7XG4gICAgdGhpcy5vdXRTZWxlY3RNdWx0aUtleS5lbWl0KHsgLi4uKGV2ZW50IHx8IHt9KSwgaXNDbGlja01hbnVhbCwgdGFiS2V5QWN0aXZlOiB0aGlzLnRhYktleUFjdGl2ZSgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRJdGVtU2VsZWN0ZWRCeUtleShrZXk6IHVua25vd24pIHtcbiAgICBjb25zdCBodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkID0gdGhpcy5odHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKCk7XG4gICAgaWYgKCFodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkIHx8IHRoaXMubG9hZGluZ0RldGFpbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KHRydWUpO1xuICAgICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IGh0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWQ7XG4gICAgICB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS51cGRhdGVBcmd1bWVudHMoYXJndW1lbnRzVmFsdWUsIHsga2V5LCBkcm9wZG93blRhYktleUFjdGl2ZTogdGhpcy50YWJLZXlBY3RpdmUoKSB9LCB7fSwgJycsIGZhbHNlLCBmYWxzZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaShodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkKTtcbiAgICAgIHRoaXMuaXRlbXNTZWxlY3RlZC5zZXQoYXdhaXQgdGhpcy5wcmVwYXJlSXRlbVNlbGVjdGVkRGlzcGxheShyZXN1bHQ/LmRhdGE/LlswXSB8fCByZXN1bHQ/LmRhdGEpKTtcbiAgICAgIHRoaXMubG9hZGluZ0RldGFpbC5zZXQoZmFsc2UpO1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXNTZWxlY3RlZCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLmxvYWRpbmdEZXRhaWwuc2V0KGZhbHNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVRhYigpIHtcbiAgICB0aGlzLm91dENoYW5nZVRhYktleUFjdGl2ZS5lbWl0KHRoaXMudGFiS2V5QWN0aXZlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMb2FkaW5nTGlzdChldmVudDogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZ0xpc3Quc2V0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHsgbWVzc2FnZTogZXJyb3IgfSk7XG4gICAgdGhpcy5zaG93Qm9yZGVyRXJyb3Iuc2V0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZCgpIHtcbiAgICBpZiAodGhpcy5lcnJvcigpPy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrVmFsaWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tWYWxpZCh2YWxpZGF0ZURlZmF1bHQ/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICBjb25zdCB2YWxpZCA9IHsgcmVxdWlyZWQ6IHRydWUsIGxpbWl0TWF4SXRlbVNlbGVjdDogdHJ1ZSB9O1xuICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgIGlmICh0aGlzLnZhbGlkUmVxdWlyZWQoKSAmJiAhdGhpcy5sZW5ndGhLZXlzKCkpIHtcbiAgICAgIHZhbGlkLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWxpZE1heEl0ZW1TZWxlY3RlZCAmJiB0aGlzLmxlbmd0aEtleXMoKSA+IHZhbGlkTWF4SXRlbVNlbGVjdGVkLnZhbHVlKSB7XG4gICAgICB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHQgJiYgdmFsaWQucmVxdWlyZWQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IC4uLih2YWxpZFJlcXVpcmVkIHx8IHt9KSwgbWVzc2FnZTogdmFsaWRSZXF1aXJlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEIH0pO1xuICAgIH1cbiAgICBpZiAoIXZhbGlkYXRlRGVmYXVsdCAmJiAhdGhpcy5lcnJvcigpICYmIHZhbGlkLmxpbWl0TWF4SXRlbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHZhbGlkTWF4SXRlbVNlbGVjdGVkID0gdGhpcy52YWxpZE1heEl0ZW1TZWxlY3RlZCgpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyAuLi4odmFsaWRNYXhJdGVtU2VsZWN0ZWQgfHwge30pLCBtZXNzYWdlOiB2YWxpZE1heEl0ZW1TZWxlY3RlZD8ubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX01BWF9WQUxJRCwgaW50ZXJwb2xhdGVQYXJhbXM6IHsgdmFsdWU6IHZhbGlkTWF4SXRlbVNlbGVjdGVkPy52YWx1ZSB9IH0pO1xuICAgIH1cbiAgICB0aGlzLm91dFZhbGlkRXZlbnQuZW1pdCh2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3QpO1xuICAgIHJldHVybiB2YWxpZC5yZXF1aXJlZCAmJiB2YWxpZC5saW1pdE1heEl0ZW1TZWxlY3Q7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLnNob3dCb3JkZXJFcnJvci5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbChldmVudDogSUxpc3RGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMubGlzdEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ1N0YWdlRmxhZ01vdXNlKGZsYWc6IElGbGFnTW91c2UpIHtcbiAgICB0aGlzLmZsYWdNb3VzZS5zZXQoZmxhZyk7XG4gICAgdGhpcy5tZXJnZUZsYWdNb3VzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNldCgpIHtcbiAgICB0aGlzLml0ZW1zU2VsZWN0ZWQuc2V0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5sZW5ndGhLZXlzLnNldCgwKTtcbiAgICB0aGlzLmxpc3RGdW5jdGlvbkNvbnRyb2woKT8ucmVzZXRLZXlTZWxlY3RlZCgpO1xuICAgIGlmICghdGhpcy5zaG93TGlzdCgpICYmIHRoaXMub25seUVtaXREYXRhV2hlblJlc2V0KCkpIHtcbiAgICAgIHRoaXMub3V0U2VsZWN0S2V5LmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMub3V0U2VsZWN0TXVsdGlLZXkuZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0aGlzLmxpc3RLZXlTZWxlY3RlZC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmxpc3RNdWx0aUtleVNlbGVjdGVkLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUl0ZW1TZWxlY3RlZERpc3BsYXkoaXRlbTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGl0ZW1DbG9uZSA9IGNsb25lRGVlcChpdGVtKTtcbiAgICBpZiAoaXRlbUNsb25lKSB7XG4gICAgICB0aGlzLmNvbnZlcnRJdGVtU2VsZWN0ZWQoKShpdGVtQ2xvbmUsIHRoaXMudHJhbnNsYXRlKTtcbiAgICAgIGNvbnN0IGdldFBvcG92ZXJJdGVtU2VsZWN0ZWQgPSB0aGlzLmdldFBvcG92ZXJJdGVtU2VsZWN0ZWQoKTtcbiAgICAgIGlmIChnZXRQb3BvdmVySXRlbVNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMucG9wb3Zlckl0ZW1TZWxlY3RlZC5zZXQoYXdhaXQgZ2V0UG9wb3Zlckl0ZW1TZWxlY3RlZChpdGVtQ2xvbmUsIHRoaXMudHJhbnNsYXRlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtQ2xvbmU7XG4gIH1cblxuICBwcml2YXRlIG1lcmdlRmxhZ01vdXNlKCkge1xuICAgIGNvbnN0IGZsYWc6IElGbGFnTW91c2UgPSB7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLCBpc0NvbnRhaW5lckhhc1Njcm9sbDogZmFsc2UgfTtcbiAgICBpZiAodGhpcy5mbGFnTW91c2VDb250ZW50KCk/LmlzTW91c2VFbnRlciB8fCB0aGlzLmZsYWdNb3VzZSgpLmlzTW91c2VFbnRlcikge1xuICAgICAgZmxhZy5pc01vdXNlRW50ZXIgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFnTW91c2VDb250ZW50KCk/LmlzTW91c2VFbnRlckNvbnRlbnQgfHwgdGhpcy5mbGFnTW91c2UoKS5pc01vdXNlRW50ZXJDb250ZW50KSB7XG4gICAgICBmbGFnLmlzTW91c2VFbnRlckNvbnRlbnQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5mbGFnTW91c2VDb250ZW50KCk/LmlzQ29udGFpbmVySGFzU2Nyb2xsIHx8IHRoaXMuZmxhZ01vdXNlKCkuaXNDb250YWluZXJIYXNTY3JvbGwpIHtcbiAgICAgIGZsYWcuaXNDb250YWluZXJIYXNTY3JvbGwgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLm91dENoYW5nU3RhZ2VGbGFnTW91c2UuZW1pdChmbGFnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gIEBpZiAobGFiZWxDb25maWcoKTsgYXMgbGFiZWwpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cImxhYmVsLmNsYXNzSW5jbHVkZVwiXG4gICAgICBbbGFiZWxMZWZ0XT1cImxhYmVsLmxhYmVsTGVmdFwiXG4gICAgICBbbGFiZWxMZWZ0Q2xhc3NdPVwibGFiZWwubGFiZWxMZWZ0Q2xhc3NcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsLnJlcXVpcmVkXCJcbiAgICAgIFtkZXNjcmlwdGlvbl09XCJsYWJlbC5kZXNjcmlwdGlvblwiXG4gICAgICBbZGVzY3JpcHRpb25DbGFzc109XCJsYWJlbC5kZXNjcmlwdGlvbkNsYXNzXCJcbiAgICAgIFtsYWJlbFJpZ2h0XT1cImxhYmVsLmxhYmVsUmlnaHRcIlxuICAgICAgW2xhYmVsUmlnaHRDbGFzc109XCJsYWJlbC5sYWJlbFJpZ2h0Q2xhc3NcIlxuICAgICAgW29ubHlTaG93Q291bnRdPVwibGFiZWwub25seVNob3dDb3VudFwiXG4gICAgICBbYnV0dG9uc0xlZnRdPVwibGFiZWwuYnV0dG9uc0xlZnRcIlxuICAgICAgW2J1dHRvbnNSaWdodF09XCJsYWJlbC5idXR0b25zUmlnaHRcIlxuICAgICAgW2Rpc2FibGVCdXR0b25zTGVmdF09XCJsYWJlbC5kaXNhYmxlQnV0dG9uc0xlZnQgfHwgZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNSaWdodF09XCJsYWJlbC5kaXNhYmxlQnV0dG9uc1JpZ2h0IHx8IGRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKClcIlxuICAgICAgW2hhc1RvZ2dsZV09XCJsYWJlbC5oYXNUb2dnbGVcIlxuICAgICAgW3RvZ2dsZUFjdGl2ZV09XCJsYWJlbC50b2dnbGVBY3RpdmVcIlxuICAgICAgW3RvZ2dsZURpc2FibGVdPVwibGFiZWwudG9nZ2xlRGlzYWJsZSB8fCBkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtwb3BvdmVyXT1cImxhYmVsLnBvcG92ZXJcIlxuICAgICAgW2ljb25Qb3BvdmVyQ2xhc3NdPVwibGFiZWwuaWNvblBvcG92ZXJDbGFzc1wiXG4gICAgICBbb25seVNob3dDb3VudF09XCJsYWJlbC5vbmx5U2hvd0NvdW50XCJcbiAgICAgIFtsaW1pdExlbmd0aF09XCJsYWJlbC5saW1pdExlbmd0aFwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uXT1cImxhYmVsLmJ1dHRvbnNEZXNjcmlwdGlvblwiXG4gICAgICBbZGlzYWJsZUJ1dHRvbnNEZXNjcmlwdGlvbl09XCJsYWJlbC5kaXNhYmxlQnV0dG9uc0Rlc2NyaXB0aW9uIHx8IGRpc2FibGUoKVwiXG4gICAgICBbYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NdPVwibGFiZWwuYnV0dG9uc0Rlc2NyaXB0aW9uQ29udGFpbmVyQ2xhc3NcIlxuICAgICAgW2NvdW50XT1cImxhYmVsLmNvdW50XCIgLz5cbiAgfVxuICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwiZGlzYWJsZSgpIHx8IHJlYWRvbmx5KCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICBbY2xhc3NdPVwiY2xhc3NJbmNsdWRlKCkgfHwgJ3ctZnVsbCdcIlxuICAgIFttb2RlXT1cIidjbGljay10b2dnbGUnXCJcbiAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbaWdub3JlQ3Vyc29yUG9pbnRlck1vZGVMaWtlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cImlnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50KClcIlxuICAgIFtlbGVtZW50UmVmQ3VzdG9tXT1cInBvcG92ZXJFbGVtZW50UmVmQ3VzdG9tKClcIlxuICAgIFtjb25maWddPVwie1xuICAgICAgYW5pbWF0aW9uQ29uZmlnOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmFuaW1hdGlvbkNvbmZpZyB8fCB7fSxcbiAgICAgIHpJbmRleDogekluZGV4KCkgPz8gMTAwMCxcbiAgICAgIHdpZHRoQnlQYXJlbnQ6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ud2lkdGhCeVBhcmVudCA/PyB0cnVlLFxuICAgICAgcGFyZW50Qm9yZGVyV2lkdGg6IHBvcG92ZXJDdXN0b21Db25maWcoKT8ucGFyZW50Qm9yZGVyV2lkdGggPz8gMCxcbiAgICAgIG1heEhlaWdodDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5tYXhIZWlnaHQgPz8gMjA0OCxcbiAgICAgIG1heFdpZHRoOiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/Lm1heFdpZHRoID8/IDIwNDgsXG4gICAgICBkaXJlY3Rpb246IHBvcG92ZXJDdXN0b21Db25maWcoKT8uZGlyZWN0aW9uID8/ICdib3R0b20nLFxuICAgICAgdGVtcGxhdGU6IGxpc3RWaWV3RWwsXG4gICAgICB3aGl0ZVRoZW1lOiB0cnVlLFxuICAgICAgdGltZXJEZXN0cm95OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnRpbWVyRGVzdHJveSA/PyAwLFxuICAgICAgaWdub3JlQXJyb3c6IHBvcG92ZXJDdXN0b21Db25maWcoKT8uaWdub3JlQXJyb3cgPz8gdHJ1ZSxcbiAgICAgIGRpcmVjdGlvbkRpc3RhbmNlOiAyLFxuICAgICAgY2xhc3NJbmNsdWRlOiAnIXJvdW5kZWQtWzRweF0gb3ZlcmZsb3ctaGlkZGVuICcgKyAocG9wb3ZlckN1c3RvbUNvbmZpZygpPy5jbGFzc0luY2x1ZGUgPz8gJ2xpYnMtdWktYm9yZGVyLWdlbmVyYWwgJyksXG4gICAgICBwb3NpdGlvbjogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy5wb3NpdGlvbiB8fCB7IG1vZGU6ICdzdGFydCcsIGRpc3RhbmNlOiAwIH0sXG4gICAgICB3aWR0aDogcG9wb3ZlckN1c3RvbUNvbmZpZygpPy53aWR0aCxcbiAgICAgIGNsYXNzSW5jbHVkZU92ZXJsYXlCb2R5OiBwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LmNsYXNzSW5jbHVkZU92ZXJsYXlCb2R5LFxuICAgIH1cIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJQb3BvdmVyQ29udHJvbEV2ZW50KCRldmVudClcIlxuICAgIChvdXRFdmVudCk9XCJoYW5kbGVyRXZlbnQoJGV2ZW50KVwiXG4gICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCI+XG4gICAgQGlmICghaXNOZ0NvbnRlbnQoKSkge1xuICAgICAgPGRpdlxuICAgICAgICBbY2xhc3NdPVwiJ2xpYnMtdWktZHJvcGRvd24gJyArIChjbGFzc0luY2x1ZGVDb250ZW50KCkgfHwgJycpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWdlbmVyYWxdPVwiIWVycm9yKCkgJiYgIXNob3dCb3JkZXJFcnJvcigpICYmICFzaG93TGlzdCgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLXByaW1hcnktZm9jdXMtZ2VuZXJhbF09XCIhZXJyb3IoKSAmJiAhc2hvd0JvcmRlckVycm9yKCkgJiYgc2hvd0xpc3QoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1lcnJvci1nZW5lcmFsXT1cImVycm9yKCkgfHwgc2hvd0JvcmRlckVycm9yKClcIlxuICAgICAgICBbY2xhc3MubGlicy11aS1yZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmxpYnMtdWktcmVhZG9ubHktYmFja2dyb3VuZF09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiEoZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKSB8fCByZWFkb25seSgpKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwiZGlzYWJsZSgpIHx8IGxvYWRpbmdEZXRhaWwoKVwiXG4gICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGUtYmFja2dyb3VuZF09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwibG9hZGluZ0RldGFpbCgpXCJcbiAgICAgICAgW2NsYXNzLnJvdW5kZWQtdHItMF09XCJoYXNDb250ZW50VW5pdFJpZ2h0KClcIlxuICAgICAgICBbY2xhc3Mucm91bmRlZC1ici0wXT1cImhhc0NvbnRlbnRVbml0UmlnaHQoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdy1mdWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctZnVsbCByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHctZnVsbCBhYnNvbHV0ZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWRyb3Bkb3duLXBsYWNlaG9sZGVyXT1cIiFsZW5ndGhLZXlzKClcIj5cbiAgICAgICAgICAgICAgQGlmIChsZW5ndGhLZXlzKCkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW1zU2VsZWN0ZWQoKTsgYXMgaXRlbXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgQGlmIChmaWVsZEdldEltYWdlKCk7IGFzIGZpZWxkR2V0SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1hdmF0YXJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzQXZhdGFySW5jbHVkZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZVNoYXBlXT1cInR5cGVTaGFwZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCJpbWFnZVNpemUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbmtBdmF0YXJdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldEltYWdlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbmtBdmF0YXJFcnJvcl09XCJsaW5rSW1hZ2VFcnJvcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaWRHZW5Db2xvcl09XCJpdGVtc1NlbGVjdGVkW2ZpZWxkR2V0Q29sb3JBdmF0YXIoKSB8fCBmaWVsZEdldFRleHRBdmF0YXIoKV1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtnZXRMYXN0VGV4dEFmdGVyU3BhY2VdPVwiZ2V0TGFzdFRleHRBZnRlclNwYWNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0QXZhdGFyXT1cIml0ZW1zU2VsZWN0ZWRbZmllbGRHZXRUZXh0QXZhdGFyKCldXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoZmllbGRHZXRJY29uKCk7IGFzIGZpZWxkR2V0SWNvbikge1xuICAgICAgICAgICAgICAgICAgICA8aSBbY2xhc3NdPVwiaXRlbXNTZWxlY3RlZFtmaWVsZEdldEljb25dICsgJyBtci1bOHB4XSdcIj48L2k+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIobGFiZWxQb3BvdmVyRnVsbFdpZHRoKCkgPyAndy0xMDAgJyA6ICcnKSArIGNsYXNzSW5jbHVkZVRleHREaXNwbGF5V2hlbk5vU2VsZWN0KClcIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibGFiZWxJdGVtU2VsZWN0ZWRDb21wdXRlZCgpIHwgdHJhbnNsYXRlOiB7IHZhbHVlOiBsZW5ndGhLZXlzKCkgfSB8IExpYnNVaVBpcGVzU2VjdXJpdHlUcnVzdFBpcGU6ICdodG1sJyA6IHVzZVhzc0ZpbHRlcigpIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtjb25maWddPVwieyBtYXhXaWR0aDogbGFiZWxQb3BvdmVyQ29uZmlnKCk/Lm1heFdpZHRoIHx8IDI1MCwgZGlyZWN0aW9uOiAndG9wJywgekluZGV4OiBsYWJlbFBvcG92ZXJDb25maWcoKT8uekluZGV4LCB0aW1lckRlc3Ryb3k6IGxhYmVsUG9wb3ZlckNvbmZpZygpPy50aW1lckRlc3Ryb3kgfHwgMCB9XCJcbiAgICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiIC8+XG5cbiAgICAgICAgICAgICAgQGlmIChwb3BvdmVySXRlbVNlbGVjdGVkKCk7IGFzIHBvcG92ZXJJdGVtU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cInBvcG92ZXJJdGVtU2VsZWN0ZWQudHlwZSB8fCAnb3RoZXInXCJcbiAgICAgICAgICAgICAgICAgIFtjb25maWddPVwicG9wb3Zlckl0ZW1TZWxlY3RlZC5jb25maWcgfHwge31cIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAocG9wb3Zlckl0ZW1TZWxlY3RlZC5kYXRhVmlldykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwicG9wb3Zlckl0ZW1TZWxlY3RlZC5kYXRhVmlldyB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLXRvb2x0aXAtb3V0bGluZSB0ZXh0LVsxNnB4XSBteC1bOHB4XVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LVsxNnB4XSBsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgdGV4dC1bIzZhNzM4M10ge3sgY2xhc3NJbmNsdWRlSWNvbigpIH19XCJcbiAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWRpc2FibGVdPVwicmVhZG9ubHkoKSB8fCBkaXNhYmxlKClcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICBAaWYgKHNob3dFcnJvcigpKSB7XG4gICAgQGlmIChlcnJvcigpOyBhcyBlcnJvcikge1xuICAgICAgQGxldCBjb25zdEh0bWxNZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCAnICc7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibXQtWzhweF0gbGlicy11aS10ZXh0LWVycm9yIGxpYnMtdWktZm9udC1oN3JcIlxuICAgICAgICBbaW5uZXJIdG1sXT1cImNvbnN0SHRtbE1lc3NhZ2UgfCB0cmFuc2xhdGU6IGVycm9yLmludGVycG9sYXRlUGFyYW1zIHx8IHt9XCI+PC9kaXY+XG4gICAgfVxuICB9XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjbGlzdFZpZXdFbD5cbiAgPGRpdlxuICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtblwiXG4gICAgW2NsYXNzLmgtZnVsbF09XCJsaXN0TWF4SXRlbVNob3coKSA9PT0gLTFcIj5cbiAgICBAaWYgKHRhYnNDb25maWcoKTsgYXMgdGFic0NvbmZpZykge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bi10YWJzXG4gICAgICAgIFt0YWJzQ29uZmlnXT1cInRhYnNDb25maWdcIlxuICAgICAgICBbKHRhYktleUFjdGl2ZSldPVwidGFiS2V5QWN0aXZlXCJcbiAgICAgICAgW2lnbm9yZUJvcmRlckJvdHRvbV09XCJpZ25vcmVCb3JkZXJCb3R0b20oKVwiXG4gICAgICAgIFtkaXNhYmxlXT1cImRpc2FibGUoKSB8fCBsb2FkaW5nRGV0YWlsKCkgfHwgbG9hZGluZ0xpc3QoKVwiXG4gICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVRhYigpXCIgLz5cbiAgICB9XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1saXN0XG4gICAgICBbc2VhcmNoQ29uZmlnXT1cImxpc3RTZWFyY2hDb25maWcoKVwiXG4gICAgICBbaXNTZWFyY2hPbmxpbmVdPVwiaXNTZWFyY2hPbmxpbmUoKVwiXG4gICAgICBbZHJvcGRvd25UYWJLZXlBY3RpdmVdPVwidGFiS2V5QWN0aXZlKClcIlxuICAgICAgW2tleVNlYXJjaF09XCJsaXN0S2V5U2VhcmNoKClcIlxuICAgICAgW2NvbmZpZ109XCJsaXN0Q29uZmlnKClcIlxuICAgICAgW2F1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlXT1cImF1dG9TZWxlY3RlZEZpcnN0SXRlbUNhbGxPdXRzaWRlQmVmb3JlKClcIlxuICAgICAgW3BhZGRpbmdMZWZ0SXRlbV09XCJwb3BvdmVyQ3VzdG9tQ29uZmlnKCk/LnBhZGRpbmdMZWZ0SXRlbSA/PyBmYWxzZVwiXG4gICAgICBbZGlzYWJsZV09XCJkaXNhYmxlKCkgfHwgbG9hZGluZ0RldGFpbCgpXCJcbiAgICAgIFtkaXNhYmxlTGFiZWxdPVwiZGlzYWJsZUxhYmVsKClcIlxuICAgICAgW2hpZGRlbklucHV0U2VhcmNoXT1cImxpc3RIaWRkZW5JbnB1dFNlYXJjaCgpXCJcbiAgICAgIFtzZWFyY2hQYWRkaW5nXT1cImxpc3RTZWFyY2hQYWRkaW5nKClcIlxuICAgICAgW2NsYXNzLmgtZnVsbF09XCJsaXN0TWF4SXRlbVNob3coKSA9PT0gLTFcIlxuICAgICAgW21heEl0ZW1TaG93XT1cImxpc3RNYXhJdGVtU2hvdygpXCJcbiAgICAgIFtrZXlTZWxlY3RlZF09XCJsaXN0S2V5U2VsZWN0ZWQoKVwiXG4gICAgICBbbXVsdGlLZXlTZWxlY3RlZF09XCJsaXN0TXVsdGlLZXlTZWxlY3RlZCgpXCJcbiAgICAgIFtjbGlja0V4YWN0bHldPVwicG9wb3ZlckN1c3RvbUNvbmZpZygpPy5jbGlja0V4YWN0bHkgPz8gZmFsc2VcIlxuICAgICAgW2RpdmlkZXJDbGFzc0luY2x1ZGVdPVwibGlzdFNlYXJjaENvbmZpZygpID8gbGlzdERpdmlkZXJDbGFzc0luY2x1ZGUoKSA6ICdoaWRkZW4nXCJcbiAgICAgIFtidXR0b25zT3RoZXJdPVwibGlzdEJ1dHRvbnNPdGhlcigpXCJcbiAgICAgIFtiYWNrZ3JvdW5kTGlzdEN1c3RvbV09XCJsaXN0QmFja2dyb3VuZEN1c3RvbSgpXCJcbiAgICAgIFtrZXlzRGlzYWJsZUl0ZW1dPVwibGlzdEtleXNEaXNhYmxlKClcIlxuICAgICAgW2tleXNIaWRkZW5JdGVtXT1cImxpc3RLZXlzSGlkZGVuKClcIlxuICAgICAgW2hhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImxpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbigpID8/ICghcG9wb3ZlckN1c3RvbUNvbmZpZygpICYmICFsYWJlbENvbmZpZygpPy5yZXF1aXJlZCAmJiAhdmFsaWRSZXF1aXJlZCgpICYmIChsaXN0Q29uZmlnKCk/LnR5cGUgPT09ICd0ZXh0JyB8fCBsaXN0Q29uZmlnKCk/LnR5cGUgPT09ICdyYWRpbycpKVwiXG4gICAgICBbdGVtcGxhdGVSZWZTZWFyY2hOb0RhdGFdPVwibGlzdFNlYXJjaE5vRGF0YVRlbXBsYXRlUmVmKClcIlxuICAgICAgW3RlbXBsYXRlUmVmTm90U2VhcmNoTm9EYXRhXT1cImRyb3Bkb3duVGVtcGxhdGVSZWZOb3RTZWFyY2hOb0RhdGEoKVwiXG4gICAgICBbZm9jdXNJbnB1dFNlYXJjaF09XCJmb2N1c0lucHV0U2VhcmNoKClcIlxuICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICBbcmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5RHJvcGRvd25dPVwicmVzZXRLZXlXaGVuU2VsZWN0QWxsS2V5KClcIlxuICAgICAgW2lnbm9yZUNsYXNzRGlzYWJsZURlZmF1bHRXaGVuVXNlS2V5c0Rpc2FibGVJdGVtXT1cImxpc3RJZ25vcmVDbGFzc0Rpc2FibGVEZWZhdWx0V2hlblVzZUtleXNEaXNhYmxlSXRlbSgpXCJcbiAgICAgIFtoYXNEaXZpZGVyXT1cImxpc3RDb25maWdIYXNEaXZpZGVyKClcIlxuICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWRLZXkoJGV2ZW50KVwiXG4gICAgICAob3V0U2VsZWN0TXVsdGlLZXkpPVwiaGFuZGxlclNlbGVjdE11bHRpS2V5KCRldmVudCwgdHJ1ZSlcIlxuICAgICAgKG91dENoYW5nZVZpZXcpPVwiaGFuZGxlckRhdGFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAob3V0Q2xpY2tCdXR0b25PdGhlcik9XCJoYW5kbGVyQ2xpY2tCdXR0b25PdGhlcigkZXZlbnQpXCJcbiAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJMaXN0RnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCJcbiAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlUG9wb3Zlcik9XCJoYW5kbGVyQ2hhbmdTdGFnZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgIChvdXRMb2FkaW5nKT1cImhhbmRsZXJMb2FkaW5nTGlzdCgkZXZlbnQpXCIgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICBjaGVja0lzVmFsaWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlc2V0RXJyb3I6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHNldEVycm9yPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVtb3ZlTGlzdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgdXBkYXRlTGFiZWxJdGVtU2VsZWN0ZWQ6IChsYWJlbDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXNldDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVmcmVzaExpc3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHNldEl0ZW1TZWxlY3RlZEJ5S2V5OiAoaWQ6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGdldERpc2FibGU6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG59XG4iXX0=
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZHJvcGRvd24vc3JjL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQge1xuICBjaGVja0lzVmFsaWQ6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlc2V0RXJyb3I6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHNldEVycm9yPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVtb3ZlTGlzdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgdXBkYXRlTGFiZWxJdGVtU2VsZWN0ZWQ6IChsYWJlbDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZXNldDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVmcmVzaExpc3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHNldEl0ZW1TZWxlY3RlZEJ5S2V5OiAoaWQ6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHNldFNlbGVjdGVkS2V5OiAoa2V5OiB1bmtub3duLCBvcHRpb25zPzogeyByZXNldD86IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc2V0U2VsZWN0ZWRNdWx0aUtleTogKGtleXM6IHVua25vd25bXSwgb3B0aW9ucz86IHsgcmVzZXQ/OiBib29sZWFuIH0pID0+IFByb21pc2U8dm9pZD47XG4gIGdldERpc2FibGU6ICgpID0+IFByb21pc2U8Ym9vbGVhbj47XG59XG4iXX0=
|
|
@@ -42,6 +42,9 @@ class LibsUiComponentsDropdownComponent {
|
|
|
42
42
|
popoverItemSelected = signal(undefined);
|
|
43
43
|
labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));
|
|
44
44
|
autoSelectedFirstItemCallOutsideBefore = signal(false);
|
|
45
|
+
// Cờ: true khi đang chọn item nội bộ → effect tự-chọn (constructor) bỏ qua, tránh race async.
|
|
46
|
+
// Đọc trong effect bằng untracked() để KHÔNG thành dependency (tránh effect tự kích lại khi reset cờ).
|
|
47
|
+
isSelectingInternally = signal(false);
|
|
45
48
|
keysSelected = signal([]);
|
|
46
49
|
popoverFunctionControl = signal(undefined);
|
|
47
50
|
fieldKey = signal('id');
|
|
@@ -136,7 +139,9 @@ class LibsUiComponentsDropdownComponent {
|
|
|
136
139
|
}
|
|
137
140
|
});
|
|
138
141
|
effect(() => {
|
|
139
|
-
|
|
142
|
+
// Đọc cờ qua untracked để cờ KHÔNG trở thành dependency của effect (tránh tự kích lại khi set cờ).
|
|
143
|
+
const isSelectingInternally = untracked(() => this.isSelectingInternally());
|
|
144
|
+
if (!isNil(this.listKeySelected()) && this.listKeySelected() !== '' && !this.itemsSelected() && !this.autoSelectedFirstItemCallOutsideBefore() && !isSelectingInternally) {
|
|
140
145
|
untracked(() => {
|
|
141
146
|
this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });
|
|
142
147
|
});
|
|
@@ -148,7 +153,9 @@ class LibsUiComponentsDropdownComponent {
|
|
|
148
153
|
}
|
|
149
154
|
});
|
|
150
155
|
effect(() => {
|
|
151
|
-
|
|
156
|
+
// Đọc cờ qua untracked để không thành dependency (xem handlerSelectedKey / handlerSelectMultiKey).
|
|
157
|
+
const isSelectingInternally = untracked(() => this.isSelectingInternally());
|
|
158
|
+
if (this.listMultiKeySelected() && !this.autoSelectedFirstItemCallOutsideBefore() && !isSelectingInternally) {
|
|
152
159
|
untracked(() => {
|
|
153
160
|
const previousValue = this.keysSelected() || [];
|
|
154
161
|
const currentValue = this.listMultiKeySelected() || [];
|
|
@@ -165,6 +172,7 @@ class LibsUiComponentsDropdownComponent {
|
|
|
165
172
|
if (this.listKeySelected() || this.listMultiKeySelected()) {
|
|
166
173
|
this.lengthKeys.set(this.listKeySelected() ? 1 : this.listMultiKeySelected()?.length || 0);
|
|
167
174
|
}
|
|
175
|
+
this.warnMissingHttpRequestDetailItemById();
|
|
168
176
|
if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.()?.autoSelectAllItem || listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {
|
|
169
177
|
try {
|
|
170
178
|
this.loadingDetail.set(true);
|
|
@@ -201,6 +209,18 @@ class LibsUiComponentsDropdownComponent {
|
|
|
201
209
|
updateLabelItemSelected: async (label) => this.itemsSelected.update((value) => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),
|
|
202
210
|
refreshList: async () => this.listFunctionControl()?.refresh(),
|
|
203
211
|
setItemSelectedByKey: this.setItemSelectedByKey.bind(this),
|
|
212
|
+
setSelectedKey: async (key, options) => {
|
|
213
|
+
if (options?.reset) {
|
|
214
|
+
await this.reset();
|
|
215
|
+
}
|
|
216
|
+
await this.handlerSelectedKey({ key, item: undefined, isClickManual: false });
|
|
217
|
+
},
|
|
218
|
+
setSelectedMultiKey: async (keys, options) => {
|
|
219
|
+
if (options?.reset) {
|
|
220
|
+
await this.reset();
|
|
221
|
+
}
|
|
222
|
+
await this.handlerSelectMultiKey({ keys, mapKeys: [], isClickManual: false });
|
|
223
|
+
},
|
|
204
224
|
};
|
|
205
225
|
}
|
|
206
226
|
defaultConvertItemSelected(item) {
|
|
@@ -261,6 +281,16 @@ class LibsUiComponentsDropdownComponent {
|
|
|
261
281
|
this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });
|
|
262
282
|
this.listMultiKeySelected.set(keys);
|
|
263
283
|
}
|
|
284
|
+
warnMissingHttpRequestDetailItemById() {
|
|
285
|
+
if (this.httpRequestDetailItemById()) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const hasPreselectedKey = (!isNil(this.listKeySelected()) && this.listKeySelected() !== '') || !!this.listMultiKeySelected()?.length;
|
|
289
|
+
if (!hasPreselectedKey) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
console.warn(`[LibsUiComponentsDropdownComponent] Đang truyền sẵn "listKeySelected/listMultiKeySelected" nhưng CHƯA cấu hình [httpRequestDetailItemById]. Khi dropdown chỉ nhận key (không có sẵn item tương ứng), label của item đã chọn sẽ KHÔNG hiển thị được (hiện trắng). Hãy cấu hình [httpRequestDetailItemById] để dropdown tự gọi API lấy chi tiết item theo key. Xem README mục "Dropdown lazy-load chi tiết item theo key".`);
|
|
293
|
+
}
|
|
264
294
|
handlerEvent(type) {
|
|
265
295
|
if (type === 'click') {
|
|
266
296
|
return;
|
|
@@ -290,6 +320,17 @@ class LibsUiComponentsDropdownComponent {
|
|
|
290
320
|
this.popoverFunctionControl.set(event);
|
|
291
321
|
}
|
|
292
322
|
async handlerSelectedKey(event) {
|
|
323
|
+
// Bật cờ đồng bộ ngay đầu để effect tự-chọn (constructor) bỏ qua trong lúc đang chọn nội bộ.
|
|
324
|
+
// Tránh race: listKeySelected.set() (đồng bộ) kích effect TRƯỚC khi itemsSelected.set() (sau await) kịp chạy.
|
|
325
|
+
this.isSelectingInternally.set(true);
|
|
326
|
+
try {
|
|
327
|
+
await this.processSelectedKey(event);
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
this.isSelectingInternally.set(false);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async processSelectedKey(event) {
|
|
293
334
|
const key = event?.key;
|
|
294
335
|
const item = event?.item;
|
|
295
336
|
const isClickManual = event?.isClickManual;
|
|
@@ -319,10 +360,20 @@ class LibsUiComponentsDropdownComponent {
|
|
|
319
360
|
this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
|
|
320
361
|
return;
|
|
321
362
|
}
|
|
322
|
-
this.itemsSelected.set(await this.
|
|
363
|
+
this.itemsSelected.set(await this.prepareItemSelectedDisplay(item));
|
|
323
364
|
this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });
|
|
324
365
|
}
|
|
325
366
|
async handlerSelectMultiKey(event, isClickManual = false) {
|
|
367
|
+
// Bật cờ đồng bộ để effect tự-chọn multi (constructor) bỏ qua trong lúc đang chọn nội bộ (tránh race async).
|
|
368
|
+
this.isSelectingInternally.set(true);
|
|
369
|
+
try {
|
|
370
|
+
await this.processSelectMultiKey(event, isClickManual);
|
|
371
|
+
}
|
|
372
|
+
finally {
|
|
373
|
+
this.isSelectingInternally.set(false);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
async processSelectMultiKey(event, isClickManual = false) {
|
|
326
377
|
if (this.listConfig()?.configTemplateGroup?.()?.singleSelectItem && event?.mapKeys?.length) {
|
|
327
378
|
const itemClickManual = event.mapKeys.find((mapKey) => mapKey.item?.isCheckManual);
|
|
328
379
|
if (itemClickManual) {
|
|
@@ -347,7 +398,7 @@ class LibsUiComponentsDropdownComponent {
|
|
|
347
398
|
this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
348
399
|
return;
|
|
349
400
|
}
|
|
350
|
-
this.itemsSelected.set(await this.
|
|
401
|
+
this.itemsSelected.set(await this.prepareItemSelectedDisplay(item));
|
|
351
402
|
this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });
|
|
352
403
|
}
|
|
353
404
|
async setItemSelectedByKey(key) {
|
|
@@ -360,7 +411,7 @@ class LibsUiComponentsDropdownComponent {
|
|
|
360
411
|
const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;
|
|
361
412
|
this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);
|
|
362
413
|
const result = await this.httpRequestService.callApi(httpRequestDetailItemById);
|
|
363
|
-
this.itemsSelected.set(await this.
|
|
414
|
+
this.itemsSelected.set(await this.prepareItemSelectedDisplay(result?.data?.[0] || result?.data));
|
|
364
415
|
this.loadingDetail.set(false);
|
|
365
416
|
return this.itemsSelected();
|
|
366
417
|
}
|
|
@@ -431,7 +482,7 @@ class LibsUiComponentsDropdownComponent {
|
|
|
431
482
|
this.keysSelected.set([]);
|
|
432
483
|
this.error.set(undefined);
|
|
433
484
|
}
|
|
434
|
-
async
|
|
485
|
+
async prepareItemSelectedDisplay(item) {
|
|
435
486
|
const itemClone = cloneDeep(item);
|
|
436
487
|
if (itemClone) {
|
|
437
488
|
this.convertItemSelected()(itemClone, this.translate);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-dropdown.mjs","sources":["../../../../../libs-ui/components/dropdown/src/tabs/tabs.component.ts","../../../../../libs-ui/components/dropdown/src/tabs/tabs.component.html","../../../../../libs-ui/components/dropdown/src/dropdown.component.ts","../../../../../libs-ui/components/dropdown/src/dropdown.component.html","../../../../../libs-ui/components/dropdown/src/libs-ui-components-dropdown.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IDropdownTabsItem } from '../interfaces/dropdown.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-dropdown-tabs',\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule],\n})\nexport class LibsUiComponentsDropdownTabsComponent {\n readonly ignoreBorderBottom = input<boolean>();\n readonly tabsConfig = input<Array<IDropdownTabsItem>>();\n readonly tabKeyActive = model<string>();\n readonly disable = input<boolean>();\n\n readonly outChange = output<void>();\n\n protected handlerSelectTab(event: Event, key: string) {\n event.stopPropagation();\n this.tabKeyActive.set(key);\n this.outChange.emit();\n }\n}\n","<div\n class=\"libs-ui-dropdown-tab-container\"\n [class.libs-ui-border-bottom-general]=\"!ignoreBorderBottom()\">\n @for (tab of tabsConfig(); track tab) {\n <div\n class=\"libs-ui-dropdown-tab-container-item libs-ui-font-h6m\"\n [class.libs-ui-dropdown-tab-container-item-active]=\"tabKeyActive() === tab.key\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"handlerSelectTab($event, tab.key)\"\n (keydown.enter)=\"handlerSelectTab($event, tab.key)\">\n {{ tab.name | translate }}\n </div>\n }\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, OnInit, output, signal, TemplateRef, untracked } from '@angular/core';\nimport { LibsUiComponentsAvatarComponent, TYPE_SHAPE_AVATAR, TYPE_SIZE_AVATAR_CONFIG } from '@libs-ui/components-avatar';\nimport { IButton } from '@libs-ui/components-buttons-button';\nimport { IInputSearchConfig } from '@libs-ui/components-inputs-search';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { getFieldKeyByType, IListConfigItem, IListDataEmitKey, IListDataEmitMultiKey, IListFunctionControlEvent, LibsUiComponentsListComponent, TYPE_TEMPLATE } from '@libs-ui/components-list';\nimport { IFlagMouse, IPopover, IPopoverFunctionControlEvent, IPopoverOverlay, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { IMessageTranslate, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { IHttpRequestConfig, LibsUiHttpRequestService } from '@libs-ui/services-http-request';\nimport { CHARACTER_DATA_EMPTY, cloneDeep, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_VALID, get, isEqual, isNil, set } from '@libs-ui/utils';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { IDropdownTabsItem, IEmitMultiKey, IEmitSelectKey, IPopoverCustomConfig, IValidMaxItemSelected } from './interfaces/dropdown.interface';\nimport { IDropdownFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { LibsUiComponentsDropdownTabsComponent } from './tabs/tabs.component';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrl: './dropdown.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiPipesSecurityTrustPipe, AsyncPipe, LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsAvatarComponent, LibsUiComponentsListComponent, LibsUiComponentsDropdownTabsComponent],\n})\nexport class LibsUiComponentsDropdownComponent implements OnInit {\n // #region PROPERTY\n protected error = signal<IMessageTranslate | undefined>(undefined);\n protected showList = signal<boolean>(false);\n protected itemsSelected = signal<any>(undefined);\n protected loadingDetail = signal<boolean>(false);\n protected loadingList = signal<boolean>(false);\n protected items = signal<Array<unknown>>([]);\n protected popoverItemSelected = signal<IPopover | undefined>(undefined);\n protected labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));\n protected autoSelectedFirstItemCallOutsideBefore = signal<boolean>(false);\n private readonly keysSelected = signal<Array<unknown>>([]);\n private readonly popoverFunctionControl = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n private readonly fieldKey = signal<string>('id');\n private readonly listFunctionControl = signal<IListFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly useXssFilter = input<boolean>(false);\n readonly popoverElementRefCustom = input<HTMLElement>();\n readonly classInclude = input<string>();\n readonly ignoreStopPropagationEvent = input<boolean>(false);\n readonly flagMouse = model<IFlagMouse>({ isMouseEnter: false, isMouseEnterContent: false });\n readonly flagMouseContent = model<IFlagMouse>();\n readonly popoverCustomConfig = input<IPopoverCustomConfig>();\n readonly isNgContent = input<boolean>();\n readonly zIndex = input<number>();\n readonly convertItemSelected = input<(item: unknown, translate?: TranslateService) => void>(this.defaultConvertItemSelected.bind(this));\n readonly getPopoverItemSelected = input<(item: unknown, translate?: TranslateService) => Promise<IPopover | undefined>>();\n readonly httpRequestDetailItemById = input<IHttpRequestConfig>();\n readonly lengthKeys = model<number>(0);\n readonly textDisplayWhenNoSelect = input<string>('i18n_select_information');\n readonly textDisplayWhenMultiSelect = input<string>('i18n_selecting_options');\n readonly classIncludeTextDisplayWhenNoSelect = input<string>('libs-ui-font-h5r');\n readonly fieldLabel = input<string, string | undefined>('labelDisplay', { transform: (value) => value || 'labelDisplay' });\n readonly fieldGetLabel = input<string>();\n readonly labelPopoverConfig = input<IPopoverOverlay>();\n readonly labelPopoverFullWidth = input<boolean>(true);\n readonly hasContentUnitRight = input<boolean>();\n readonly listSearchNoDataTemplateRef = input<TemplateRef<unknown>>();\n readonly dropdownTemplateRefNotSearchNoData = input<TemplateRef<TYPE_TEMPLATE_REF> | undefined>(undefined);\n readonly fieldGetImage = input<string>();\n readonly imageSize = input<TYPE_SIZE_AVATAR_CONFIG>(16);\n readonly typeShape = input<TYPE_SHAPE_AVATAR>('circle');\n readonly fieldGetIcon = input<string>();\n readonly fieldGetTextAvatar = input<string>('username');\n readonly fieldGetColorAvatar = input<string>();\n readonly classAvatarInclude = input<string, string | undefined>('mr-[8px]', { transform: (value) => value || 'mr-[8px]' });\n readonly getLastTextAfterSpace = input<boolean>();\n readonly linkImageError = input<string>();\n readonly showError = input<boolean>(true);\n readonly showBorderError = model<boolean>();\n readonly disable = input<boolean>();\n readonly readonly = input<boolean>();\n readonly labelConfig = input<ILabel>();\n readonly disableLabel = input<boolean>();\n\n readonly listSearchConfig = input<IInputSearchConfig, IInputSearchConfig | undefined>({ noBorder: true }, { transform: (value) => value || { noBorder: true } });\n readonly isSearchOnline = input<boolean>(false);\n readonly listHiddenInputSearch = input<boolean>();\n readonly listSearchPadding = input<boolean>();\n readonly listKeySearch = input<string>();\n readonly listDividerClassInclude = input<string>();\n readonly listConfig = input<IListConfigItem>();\n readonly listButtonsOther = input<Array<IButton>>();\n readonly listHasButtonUnSelectOption = input<boolean>();\n readonly listClickExactly = input<boolean>();\n readonly listBackgroundCustom = input<string>();\n readonly listMaxItemShow = input<number>(5);\n readonly listKeySelected = model<unknown>();\n readonly listMultiKeySelected = model<Array<unknown>>();\n readonly listKeysDisable = input<Array<string>>(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll\n readonly listKeysHidden = input<Array<string>>(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll\n readonly validRequired = input<IMessageTranslate>();\n readonly validMaxItemSelected = input<IValidMaxItemSelected>();\n readonly changeValidUndefinedResetError = input<boolean>();\n readonly allowSelectItemMultiple = input<boolean>();\n readonly focusInputSearch = input<boolean>(true);\n readonly onlyEmitDataWhenReset = input<boolean>(); // true khi muốn emit sự kiện thay đổi key\n readonly resetKeyWhenSelectAllKey = input<boolean>();\n readonly listConfigHasDivider = input<boolean>(true);\n readonly classIncludeIcon = input<string, string | undefined>('ml-[8px]', { transform: (value) => value || 'ml-[8px]' });\n readonly classIncludeContent = input<string>();\n readonly listIgnoreClassDisableDefaultWhenUseKeysDisableItem = input<boolean>(); // bỏ chế độ disable item trên html list view để disable từng phần trong rows\n readonly tabKeyActive = model<string>();\n readonly tabsConfig = input<Array<IDropdownTabsItem>>();\n readonly ignoreBorderBottom = input<boolean>();\n\n // #region OUTPUT\n readonly outSelectKey = output<IEmitSelectKey | undefined>(); // sử dụng cho type chọn 1.\n readonly outSelectMultiKey = output<IEmitMultiKey | undefined>(); // sử dụng cho type cho phép chọn nhiều.\n readonly outFunctionsControl = output<IDropdownFunctionControlEvent>();\n readonly outValidEvent = output<boolean>();\n readonly outChangStageFlagMouse = output<IFlagMouse>();\n readonly outDataChange = output<Array<unknown>>();\n readonly outClickButtonOther = output<IButton>();\n readonly outShowList = output<boolean>();\n readonly outChangeTabKeyActive = output<string | undefined>();\n\n /* INJECT*/\n private readonly translate = inject(TranslateService);\n private readonly httpRequestService = inject(LibsUiHttpRequestService);\n\n constructor() {\n effect(() => {\n const listConfig = this.listConfig();\n if (listConfig) {\n untracked(() => this.fieldKey.set(getFieldKeyByType(listConfig, 'id')));\n }\n });\n effect(() => {\n if (!isNil(this.listKeySelected()) && this.listKeySelected() !== '' && !this.itemsSelected()) {\n untracked(() => {\n this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });\n });\n }\n });\n effect(() => {\n if (this.changeValidUndefinedResetError() && this.validRequired()) {\n untracked(() => this.resetError());\n }\n });\n effect(() => {\n if (this.listMultiKeySelected()) {\n untracked(() => {\n const previousValue = this.keysSelected() || [];\n const currentValue = this.listMultiKeySelected() || [];\n\n if (isEqual(cloneDeep(previousValue), cloneDeep(currentValue))) {\n return;\n }\n\n this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });\n });\n }\n });\n }\n\n async ngOnInit() {\n const listConfig = this.listConfig();\n\n if (this.listKeySelected() || this.listMultiKeySelected()) {\n this.lengthKeys.set(this.listKeySelected() ? 1 : this.listMultiKeySelected()?.length || 0);\n }\n\n if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.()?.autoSelectAllItem || listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {\n try {\n this.loadingDetail.set(true);\n const httpRequestData = listConfig.httpRequestData();\n const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestData;\n this.httpRequestService.updateArguments(argumentsValue, { ...this.httpRequestService.fakeResponsePagingApi(), dropdownTabKeyActive: this.tabKeyActive }, {}, '', true, false, guideAutoUpdateArgumentsValue);\n const result = await this.httpRequestService.callApi(httpRequestData);\n this.loadingDetail.set(false);\n if (result?.data) {\n this.items.set(result.data);\n this.emitAutoSelectKey(result.data, listConfig.type);\n this.autoSelectedFirstItemCallOutsideBefore.set(true);\n }\n } catch (error) {\n console.log(error);\n this.items.set([]);\n this.loadingDetail.set(false);\n }\n this.outDataChange.emit(this.items());\n }\n this.outFunctionsControl.emit(this.FunctionsControl);\n this.checkValid(true);\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): IDropdownFunctionControlEvent {\n return {\n reset: this.reset.bind(this),\n checkIsValid: this.valid.bind(this),\n resetError: this.resetError.bind(this),\n setError: this.setError.bind(this),\n removeList: async () => this.popoverFunctionControl()?.removePopoverOverlay(),\n getDisable: async () => this.disable() ?? false,\n updateLabelItemSelected: async (label) => this.itemsSelected.update((value) => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),\n refreshList: async () => this.listFunctionControl()?.refresh(),\n setItemSelectedByKey: this.setItemSelectedByKey.bind(this),\n };\n }\n\n private defaultConvertItemSelected(item: unknown) {\n if (!item) {\n return;\n }\n const fieldGetLabel = this.fieldGetLabel();\n const value = fieldGetLabel ? get(item, fieldGetLabel) : undefined;\n set(item, this.fieldLabel(), value ?? get(item, 'label') ?? get(item, 'name') ?? ' ');\n }\n\n private getLabelItemSelected() {\n let label = ' ';\n if (!this.lengthKeys()) {\n label = this.textDisplayWhenNoSelect();\n }\n if (this.lengthKeys() > 1) {\n label = this.textDisplayWhenMultiSelect();\n }\n if (this.lengthKeys() === 1) {\n label = get(this.itemsSelected(), this.fieldLabel()) || this.textDisplayWhenNoSelect();\n }\n return label;\n }\n\n private emitAutoSelectKey(items: Array<unknown>, type: TYPE_TEMPLATE) {\n const listConfig = this.listConfig();\n if (!items?.length || !listConfig || (!listConfig.autoSelectFirstItem && !listConfig.configTemplateCheckbox?.()?.autoSelectAllItem && !listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect)) {\n return;\n }\n const flatItemsSupportAutoSelect = listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect;\n if (type === 'group' && flatItemsSupportAutoSelect) {\n items = flatItemsSupportAutoSelect(items);\n }\n if (listConfig.autoSelectFirstItem) {\n const item = items[0];\n const key = get(item, this.fieldKey());\n if (type === 'radio' || type === 'text') {\n this.handlerSelectedKey({ key, item, isClickManual: false });\n this.listKeySelected.set(key);\n return;\n }\n this.handlerSelectMultiKey({ keys: [key], mapKeys: [{ key, item, isClickManual: false }], isClickManual: false });\n this.listMultiKeySelected.set([key]);\n return;\n }\n if (type !== 'checkbox' && type !== 'group') {\n return;\n }\n const keys: Array<string> = [];\n const mapKeys: Array<IListDataEmitKey> = [];\n items.forEach((item) => {\n const key = get(item, this.fieldKey());\n if (isNil(key)) {\n return;\n }\n keys.push(key);\n mapKeys.push({ key, item, isClickManual: false });\n });\n this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });\n this.listMultiKeySelected.set(keys);\n }\n\n protected handlerEvent(type: TYPE_POPOVER_EVENT) {\n if (type === 'click') {\n return;\n }\n if (type === 'remove') {\n this.showList.set(false);\n this.outShowList.emit(this.showList());\n return;\n }\n this.showList.set(true);\n this.outShowList.emit(this.showList());\n }\n\n protected handlerDataChange(items: Array<unknown>) {\n this.items.set(items);\n this.popoverFunctionControl()?.updatePopoverOverlayPosition();\n this.outDataChange.emit(this.items());\n }\n\n protected handlerChangeFlagMouse(event: IFlagMouse) {\n this.flagMouseContent.set(event);\n this.mergeFlagMouse();\n }\n\n protected handlerClickButtonOther(button: IButton) {\n this.outClickButtonOther.emit(button);\n this.popoverFunctionControl()?.removePopoverOverlay();\n }\n\n protected handlerPopoverControlEvent(event: IPopoverFunctionControlEvent) {\n this.popoverFunctionControl.set(event);\n }\n\n protected async handlerSelectedKey(event: IListDataEmitKey | undefined) {\n const key = event?.key;\n const item = event?.item;\n const isClickManual = event?.isClickManual;\n this.lengthKeys.set(!(isNil(key) || (typeof key === 'string' && key === '')) ? 1 : 0);\n this.listKeySelected.set(key);\n if (!this.allowSelectItemMultiple() && this.itemsSelected() && get(this.itemsSelected(), this.fieldKey()) === key) {\n return;\n }\n if (isClickManual) {\n if (!(isNil(key) || (typeof key === 'string' && key === '')) && (item || this.itemsSelected())) {\n this.popoverFunctionControl()?.removePopoverOverlay();\n }\n }\n this.checkValid();\n if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {\n let itemSelected = await this.setItemSelectedByKey(key);\n if (!itemSelected) {\n itemSelected = {\n [this.fieldKey()]: key,\n [this.fieldLabel()]: CHARACTER_DATA_EMPTY,\n };\n this.itemsSelected.set(itemSelected);\n }\n if (event) {\n event.item = itemSelected;\n }\n this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });\n return;\n }\n this.itemsSelected.set(await this.cloneItemInputAndBuildDisplay(item));\n this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });\n }\n\n protected async handlerSelectMultiKey(event: IListDataEmitMultiKey | undefined, isClickManual = false) {\n if (this.listConfig()?.configTemplateGroup?.()?.singleSelectItem && event?.mapKeys?.length) {\n const itemClickManual = event.mapKeys.find((mapKey) => mapKey.item?.isCheckManual);\n if (itemClickManual) {\n setTimeout(() => (itemClickManual.item.isCheckManual = false));\n event.keys = [itemClickManual.key];\n event.mapKeys = [itemClickManual];\n this.popoverFunctionControl()?.removePopoverOverlay();\n }\n }\n this.keysSelected.set([...(event?.keys || [])]);\n this.listMultiKeySelected.set([...(event?.keys || [])]);\n this.lengthKeys.set(event?.keys?.length || 0);\n this.checkValid();\n if (this.lengthKeys() > 1) {\n this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });\n return;\n }\n const key = event?.keys[0];\n let item = event?.mapKeys?.find((item) => item.key === key)?.item;\n\n if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {\n item = await this.setItemSelectedByKey(key);\n this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });\n return;\n }\n this.itemsSelected.set(await this.cloneItemInputAndBuildDisplay(item));\n this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });\n }\n\n private async setItemSelectedByKey(key: unknown) {\n const httpRequestDetailItemById = this.httpRequestDetailItemById();\n if (!httpRequestDetailItemById || this.loadingDetail()) {\n return;\n }\n try {\n this.loadingDetail.set(true);\n const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;\n this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);\n const result = await this.httpRequestService.callApi(httpRequestDetailItemById);\n this.itemsSelected.set(await this.cloneItemInputAndBuildDisplay(result?.data?.[0] || result?.data));\n this.loadingDetail.set(false);\n return this.itemsSelected();\n } catch (error) {\n console.log(error);\n this.loadingDetail.set(false);\n return;\n }\n }\n\n protected handlerChangeTab() {\n this.outChangeTabKeyActive.emit(this.tabKeyActive());\n }\n\n protected handlerLoadingList(event: boolean) {\n this.loadingList.set(event);\n }\n\n private async setError(error: string) {\n this.error.set({ message: error });\n this.showBorderError.set(true);\n }\n\n private async valid() {\n if (this.error()?.message) {\n return false;\n }\n return this.checkValid();\n }\n\n private checkValid(validateDefault?: boolean): boolean {\n this.error.set(undefined);\n const valid = { required: true, limitMaxItemSelect: true };\n const validMaxItemSelected = this.validMaxItemSelected();\n if (this.validRequired() && !this.lengthKeys()) {\n valid.required = false;\n }\n if (validMaxItemSelected && this.lengthKeys() > validMaxItemSelected.value) {\n valid.limitMaxItemSelect = false;\n }\n if (!validateDefault && valid.required === false) {\n const validRequired = this.validRequired();\n this.error.set({ ...(validRequired || {}), message: validRequired?.message || ERROR_MESSAGE_EMPTY_VALID });\n }\n if (!validateDefault && !this.error() && valid.limitMaxItemSelect === false) {\n const validMaxItemSelected = this.validMaxItemSelected();\n this.error.set({ ...(validMaxItemSelected || {}), message: validMaxItemSelected?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: { value: validMaxItemSelected?.value } });\n }\n this.outValidEvent.emit(valid.required && valid.limitMaxItemSelect);\n return valid.required && valid.limitMaxItemSelect;\n }\n\n private async resetError() {\n this.error.set(undefined);\n this.showBorderError.set(false);\n }\n\n protected handlerListFunctionsControl(event: IListFunctionControlEvent) {\n this.listFunctionControl.set(event);\n }\n\n protected handlerChangStageFlagMouse(flag: IFlagMouse) {\n this.flagMouse.set(flag);\n this.mergeFlagMouse();\n }\n\n private async reset() {\n this.itemsSelected.set(undefined);\n this.lengthKeys.set(0);\n this.listFunctionControl()?.resetKeySelected();\n if (!this.showList() && this.onlyEmitDataWhenReset()) {\n this.outSelectKey.emit(undefined);\n this.outSelectMultiKey.emit(undefined);\n }\n this.listKeySelected.set(undefined);\n this.listMultiKeySelected.set(undefined);\n this.keysSelected.set([]);\n this.error.set(undefined);\n }\n\n private async cloneItemInputAndBuildDisplay(item: unknown): Promise<unknown> {\n const itemClone = cloneDeep(item);\n if (itemClone) {\n this.convertItemSelected()(itemClone, this.translate);\n const getPopoverItemSelected = this.getPopoverItemSelected();\n if (getPopoverItemSelected) {\n this.popoverItemSelected.set(await getPopoverItemSelected(itemClone, this.translate));\n }\n }\n\n return itemClone;\n }\n\n private mergeFlagMouse() {\n const flag: IFlagMouse = { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false };\n if (this.flagMouseContent()?.isMouseEnter || this.flagMouse().isMouseEnter) {\n flag.isMouseEnter = true;\n }\n if (this.flagMouseContent()?.isMouseEnterContent || this.flagMouse().isMouseEnterContent) {\n flag.isMouseEnterContent = true;\n }\n if (this.flagMouseContent()?.isContainerHasScroll || this.flagMouse().isContainerHasScroll) {\n flag.isContainerHasScroll = true;\n }\n this.outChangStageFlagMouse.emit(flag);\n }\n}\n","<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 [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 [class.h-full]=\"listMaxItemShow() === -1\"\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 && !validRequired() && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [templateRefNotSearchNoData]=\"dropdownTemplateRefNotSearchNoData()\"\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;MAaa,qCAAqC,CAAA;IACvC,kBAAkB,GAAG,KAAK,EAAW,CAAC;IACtC,UAAU,GAAG,KAAK,EAA4B,CAAC;IAC/C,YAAY,GAAG,KAAK,EAAU,CAAC;IAC/B,OAAO,GAAG,KAAK,EAAW,CAAC;IAE3B,SAAS,GAAG,MAAM,EAAQ,CAAC;IAE1B,gBAAgB,CAAC,KAAY,EAAE,GAAW,EAAA;QAClD,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;wGAZU,qCAAqC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;4FAArC,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECblD,wlBAeA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDJY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEd,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBATjD,SAAS;+BAEE,kCAAkC,EAAA,UAAA,EAGhC,IAAI,EACC,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,eAAe,CAAC,EAAA,QAAA,EAAA,wlBAAA,EAAA,MAAA,EAAA,CAAA,gnBAAA,CAAA,EAAA,CAAA;;;AEX5B;MA2Ba,iCAAiC,CAAA;;AAElC,IAAA,KAAK,GAAG,MAAM,CAAgC,SAAS,CAAC,CAAC;AACzD,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AAClC,IAAA,aAAa,GAAG,MAAM,CAAM,SAAS,CAAC,CAAC;AACvC,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACrC,IAAA,KAAK,GAAG,MAAM,CAAiB,EAAE,CAAC,CAAC;AACnC,IAAA,mBAAmB,GAAG,MAAM,CAAuB,SAAS,CAAC,CAAC;AAC9D,IAAA,yBAAyB,GAAG,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3E,IAAA,sCAAsC,GAAG,MAAM,CAAU,KAAK,CAAC,CAAC;AACzD,IAAA,YAAY,GAAG,MAAM,CAAiB,EAAE,CAAC,CAAC;AAC1C,IAAA,sBAAsB,GAAG,MAAM,CAA2C,SAAS,CAAC,CAAC;AACrF,IAAA,QAAQ,GAAG,MAAM,CAAS,IAAI,CAAC,CAAC;AAChC,IAAA,mBAAmB,GAAG,MAAM,CAAwC,SAAS,CAAC,CAAC;;AAGvF,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,CAAC,CAAC;IACrC,uBAAuB,GAAG,KAAK,EAAe,CAAC;IAC/C,YAAY,GAAG,KAAK,EAAU,CAAC;AAC/B,IAAA,0BAA0B,GAAG,KAAK,CAAU,KAAK,CAAC,CAAC;AACnD,IAAA,SAAS,GAAG,KAAK,CAAa,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,gBAAgB,GAAG,KAAK,EAAc,CAAC;IACvC,mBAAmB,GAAG,KAAK,EAAwB,CAAC;IACpD,WAAW,GAAG,KAAK,EAAW,CAAC;IAC/B,MAAM,GAAG,KAAK,EAAU,CAAC;AACzB,IAAA,mBAAmB,GAAG,KAAK,CAAwD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/H,sBAAsB,GAAG,KAAK,EAAkF,CAAC;IACjH,yBAAyB,GAAG,KAAK,EAAsB,CAAC;AACxD,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,CAAC,CAAC;AAC9B,IAAA,uBAAuB,GAAG,KAAK,CAAS,yBAAyB,CAAC,CAAC;AACnE,IAAA,0BAA0B,GAAG,KAAK,CAAS,wBAAwB,CAAC,CAAC;AACrE,IAAA,mCAAmC,GAAG,KAAK,CAAS,kBAAkB,CAAC,CAAC;AACxE,IAAA,UAAU,GAAG,KAAK,CAA6B,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,cAAc,EAAE,CAAC,CAAC;IAClH,aAAa,GAAG,KAAK,EAAU,CAAC;IAChC,kBAAkB,GAAG,KAAK,EAAmB,CAAC;AAC9C,IAAA,qBAAqB,GAAG,KAAK,CAAU,IAAI,CAAC,CAAC;IAC7C,mBAAmB,GAAG,KAAK,EAAW,CAAC;IACvC,2BAA2B,GAAG,KAAK,EAAwB,CAAC;AAC5D,IAAA,kCAAkC,GAAG,KAAK,CAA6C,SAAS,CAAC,CAAC;IAClG,aAAa,GAAG,KAAK,EAAU,CAAC;AAChC,IAAA,SAAS,GAAG,KAAK,CAA0B,EAAE,CAAC,CAAC;AAC/C,IAAA,SAAS,GAAG,KAAK,CAAoB,QAAQ,CAAC,CAAC;IAC/C,YAAY,GAAG,KAAK,EAAU,CAAC;AAC/B,IAAA,kBAAkB,GAAG,KAAK,CAAS,UAAU,CAAC,CAAC;IAC/C,mBAAmB,GAAG,KAAK,EAAU,CAAC;AACtC,IAAA,kBAAkB,GAAG,KAAK,CAA6B,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC;IAClH,qBAAqB,GAAG,KAAK,EAAW,CAAC;IACzC,cAAc,GAAG,KAAK,EAAU,CAAC;AACjC,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,CAAC,CAAC;IACjC,eAAe,GAAG,KAAK,EAAW,CAAC;IACnC,OAAO,GAAG,KAAK,EAAW,CAAC;IAC3B,QAAQ,GAAG,KAAK,EAAW,CAAC;IAC5B,WAAW,GAAG,KAAK,EAAU,CAAC;IAC9B,YAAY,GAAG,KAAK,EAAW,CAAC;IAEhC,gBAAgB,GAAG,KAAK,CAAqD,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACxJ,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,CAAC,CAAC;IACvC,qBAAqB,GAAG,KAAK,EAAW,CAAC;IACzC,iBAAiB,GAAG,KAAK,EAAW,CAAC;IACrC,aAAa,GAAG,KAAK,EAAU,CAAC;IAChC,uBAAuB,GAAG,KAAK,EAAU,CAAC;IAC1C,UAAU,GAAG,KAAK,EAAmB,CAAC;IACtC,gBAAgB,GAAG,KAAK,EAAkB,CAAC;IAC3C,2BAA2B,GAAG,KAAK,EAAW,CAAC;IAC/C,gBAAgB,GAAG,KAAK,EAAW,CAAC;IACpC,oBAAoB,GAAG,KAAK,EAAU,CAAC;AACvC,IAAA,eAAe,GAAG,KAAK,CAAS,CAAC,CAAC,CAAC;IACnC,eAAe,GAAG,KAAK,EAAW,CAAC;IACnC,oBAAoB,GAAG,KAAK,EAAkB,CAAC;AAC/C,IAAA,eAAe,GAAG,KAAK,EAAiB,CAAC;AACzC,IAAA,cAAc,GAAG,KAAK,EAAiB,CAAC;IACxC,aAAa,GAAG,KAAK,EAAqB,CAAC;IAC3C,oBAAoB,GAAG,KAAK,EAAyB,CAAC;IACtD,8BAA8B,GAAG,KAAK,EAAW,CAAC;IAClD,uBAAuB,GAAG,KAAK,EAAW,CAAC;AAC3C,IAAA,gBAAgB,GAAG,KAAK,CAAU,IAAI,CAAC,CAAC;AACxC,IAAA,qBAAqB,GAAG,KAAK,EAAW,CAAC;IACzC,wBAAwB,GAAG,KAAK,EAAW,CAAC;AAC5C,IAAA,oBAAoB,GAAG,KAAK,CAAU,IAAI,CAAC,CAAC;AAC5C,IAAA,gBAAgB,GAAG,KAAK,CAA6B,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,UAAU,EAAE,CAAC,CAAC;IAChH,mBAAmB,GAAG,KAAK,EAAU,CAAC;AACtC,IAAA,mDAAmD,GAAG,KAAK,EAAW,CAAC;IACvE,YAAY,GAAG,KAAK,EAAU,CAAC;IAC/B,UAAU,GAAG,KAAK,EAA4B,CAAC;IAC/C,kBAAkB,GAAG,KAAK,EAAW,CAAC;;AAGtC,IAAA,YAAY,GAAG,MAAM,EAA8B,CAAC;AACpD,IAAA,iBAAiB,GAAG,MAAM,EAA6B,CAAC;IACxD,mBAAmB,GAAG,MAAM,EAAiC,CAAC;IAC9D,aAAa,GAAG,MAAM,EAAW,CAAC;IAClC,sBAAsB,GAAG,MAAM,EAAc,CAAC;IAC9C,aAAa,GAAG,MAAM,EAAkB,CAAC;IACzC,mBAAmB,GAAG,MAAM,EAAW,CAAC;IACxC,WAAW,GAAG,MAAM,EAAW,CAAC;IAChC,qBAAqB,GAAG,MAAM,EAAsB,CAAC;;AAG7C,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACrC,IAAA,kBAAkB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAEvE,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,UAAU,EAAE;AACd,gBAAA,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;aACzE;AACH,SAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;gBAC5F,SAAS,CAAC,MAAK;oBACb,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AAClG,iBAAC,CAAC,CAAC;aACJ;AACH,SAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,8BAA8B,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;gBACjE,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;aACpC;AACH,SAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;gBAC/B,SAAS,CAAC,MAAK;oBACb,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;oBAChD,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;AAEvD,oBAAA,IAAI,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE;wBAC9D,OAAO;qBACR;AAED,oBAAA,IAAI,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AACxF,iBAAC,CAAC,CAAC;aACJ;AACH,SAAC,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;YACzD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;SAC5F;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,UAAU,KAAK,UAAU,CAAC,mBAAmB,IAAI,UAAU,CAAC,sBAAsB,IAAI,EAAE,iBAAiB,IAAI,UAAU,CAAC,mBAAmB,IAAI,EAAE,0BAA0B,CAAC,IAAI,UAAU,CAAC,eAAe,EAAE;AACpO,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,gBAAA,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;AACrD,gBAAA,MAAM,EAAE,cAAc,EAAE,6BAA6B,EAAE,GAAG,eAAe,CAAC;AAC1E,gBAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,EAAE,oBAAoB,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,6BAA6B,CAAC,CAAC;gBAC7M,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AACtE,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9B,gBAAA,IAAI,MAAM,EAAE,IAAI,EAAE;oBAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AACrD,oBAAA,IAAI,CAAC,sCAAsC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;iBACvD;aACF;YAAC,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnB,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC/B;YACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;SACvC;QACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;KACvB;;AAGD,IAAA,IAAW,gBAAgB,GAAA;QACzB,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAClC,UAAU,EAAE,YAAY,IAAI,CAAC,sBAAsB,EAAE,EAAE,oBAAoB,EAAE;YAC7E,UAAU,EAAE,YAAY,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK;AAC/C,YAAA,uBAAuB,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClJ,WAAW,EAAE,YAAY,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE;YAC9D,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC3D,CAAC;KACH;AAEO,IAAA,0BAA0B,CAAC,IAAa,EAAA;QAC9C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;AACD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAC3C,QAAA,MAAM,KAAK,GAAG,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC;QACnE,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;KACvF;IAEO,oBAAoB,GAAA;QAC1B,IAAI,KAAK,GAAG,GAAG,CAAC;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACtB,YAAA,KAAK,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;SACxC;AACD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;AACzB,YAAA,KAAK,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;SAC3C;AACD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;AAC3B,YAAA,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;SACxF;AACD,QAAA,OAAO,KAAK,CAAC;KACd;IAEO,iBAAiB,CAAC,KAAqB,EAAE,IAAmB,EAAA;AAClE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,UAAU,KAAK,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,UAAU,CAAC,sBAAsB,IAAI,EAAE,iBAAiB,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,0BAA0B,CAAC,EAAE;YACtM,OAAO;SACR;QACD,MAAM,0BAA0B,GAAG,UAAU,CAAC,mBAAmB,IAAI,EAAE,0BAA0B,CAAC;AAClG,QAAA,IAAI,IAAI,KAAK,OAAO,IAAI,0BAA0B,EAAE;AAClD,YAAA,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;SAC3C;AACD,QAAA,IAAI,UAAU,CAAC,mBAAmB,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE;AACvC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO;aACR;AACD,YAAA,IAAI,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YAClH,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,OAAO;SACR;QACD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,EAAE;YAC3C,OAAO;SACR;QACD,MAAM,IAAI,GAAkB,EAAE,CAAC;QAC/B,MAAM,OAAO,GAA4B,EAAE,CAAC;AAC5C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YACrB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAA,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;gBACd,OAAO;aACR;AACD,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACrC;AAES,IAAA,YAAY,CAAC,IAAwB,EAAA;AAC7C,QAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,OAAO;SACR;AACD,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvC,OAAO;SACR;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;KACxC;AAES,IAAA,iBAAiB,CAAC,KAAqB,EAAA;AAC/C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,4BAA4B,EAAE,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;KACvC;AAES,IAAA,sBAAsB,CAAC,KAAiB,EAAA;AAChD,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;AAES,IAAA,uBAAuB,CAAC,MAAe,EAAA;AAC/C,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,oBAAoB,EAAE,CAAC;KACvD;AAES,IAAA,0BAA0B,CAAC,KAAmC,EAAA;AACtE,QAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACxC;IAES,MAAM,kBAAkB,CAAC,KAAmC,EAAA;AACpE,QAAA,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;AACvB,QAAA,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC;AACzB,QAAA,MAAM,aAAa,GAAG,KAAK,EAAE,aAAa,CAAC;AAC3C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACtF,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,GAAG,EAAE;YACjH,OAAO;SACR;QACD,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;AAC9F,gBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,oBAAoB,EAAE,CAAC;aACvD;SACF;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;YAClE,IAAI,YAAY,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAA,YAAY,GAAG;AACb,oBAAA,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG;AACtB,oBAAA,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,oBAAoB;iBAC1C,CAAC;AACF,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aACtC;YACD,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;aAC3B;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACxE,OAAO;SACR;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;KACzE;AAES,IAAA,MAAM,qBAAqB,CAAC,KAAwC,EAAE,aAAa,GAAG,KAAK,EAAA;AACnG,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,mBAAmB,IAAI,EAAE,gBAAgB,IAAI,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;AAC1F,YAAA,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACnF,IAAI,eAAe,EAAE;AACnB,gBAAA,UAAU,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC/D,KAAK,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACnC,gBAAA,KAAK,CAAC,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC;AAClC,gBAAA,IAAI,CAAC,sBAAsB,EAAE,EAAE,oBAAoB,EAAE,CAAC;aACvD;SACF;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;AAClB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACpG,OAAO;SACR;QACD,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC;AAElE,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE;YAClE,IAAI,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACzH,OAAO;SACR;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;KACrG;IAEO,MAAM,oBAAoB,CAAC,GAAY,EAAA;AAC7C,QAAA,MAAM,yBAAyB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACnE,IAAI,CAAC,yBAAyB,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACtD,OAAO;SACR;AACD,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,YAAA,MAAM,EAAE,cAAc,EAAE,6BAA6B,EAAE,GAAG,yBAAyB,CAAC;AACpF,YAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,CAAC,CAAC;YACjK,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAChF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACpG,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC9B,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;SAC7B;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO;SACR;KACF;IAES,gBAAgB,GAAA;QACxB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;KACtD;AAES,IAAA,kBAAkB,CAAC,KAAc,EAAA;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KAC7B;IAEO,MAAM,QAAQ,CAAC,KAAa,EAAA;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAChC;AAEO,IAAA,MAAM,KAAK,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE;AACzB,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;KAC1B;AAEO,IAAA,UAAU,CAAC,eAAyB,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;AAC3D,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,IAAI,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AAC9C,YAAA,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;SACxB;QACD,IAAI,oBAAoB,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,oBAAoB,CAAC,KAAK,EAAE;AAC1E,YAAA,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC;SAClC;QACD,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE;AAChD,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,aAAa,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,yBAAyB,EAAE,CAAC,CAAC;SAC5G;AACD,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,kBAAkB,KAAK,KAAK,EAAE;AAC3E,YAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;AACzD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,oBAAoB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,OAAO,IAAI,uBAAuB,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;SACnL;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AACpE,QAAA,OAAO,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,kBAAkB,CAAC;KACnD;AAEO,IAAA,MAAM,UAAU,GAAA;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACjC;AAES,IAAA,2BAA2B,CAAC,KAAgC,EAAA;AACpE,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KACrC;AAES,IAAA,0BAA0B,CAAC,IAAgB,EAAA;AACnD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;AAEO,IAAA,MAAM,KAAK,GAAA;AACjB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,mBAAmB,EAAE,EAAE,gBAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;AACpD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACxC;AACD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACpC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;KAC3B;IAEO,MAAM,6BAA6B,CAAC,IAAa,EAAA;AACvD,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AACtD,YAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC7D,IAAI,sBAAsB,EAAE;AAC1B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACvF;SACF;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;IAEO,cAAc,GAAA;AACpB,QAAA,MAAM,IAAI,GAAe,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;AAC1G,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,EAAE;AAC1E,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;SAC1B;AACD,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,mBAAmB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,mBAAmB,EAAE;AACxF,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACjC;AACD,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,oBAAoB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,oBAAoB,EAAE;AAC1F,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;SAClC;AACD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACxC;wGAxcU,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iCAAiC,0sWC3B9C,ggTAwLA,EAAA,MAAA,EAAA,CAAA,mOAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/JY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,4BAA4B,EAAE,IAAA,EAAA,8BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,SAAS,EAAE,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,8BAA8B,4qBAAE,gCAAgC,EAAA,QAAA,EAAA,+DAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,6BAAA,EAAA,cAAA,EAAA,0CAAA,EAAA,4BAAA,EAAA,kCAAA,EAAA,8BAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,+BAA+B,EAAE,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,iCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,6BAA6B,2hCAAE,qCAAqC,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEhO,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAT7C,SAAS;+BAEE,6BAA6B,EAAA,UAAA,EAG3B,IAAI,EACC,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,eAAe,EAAE,4BAA4B,EAAE,SAAS,EAAE,8BAA8B,EAAE,gCAAgC,EAAE,+BAA+B,EAAE,6BAA6B,EAAE,qCAAqC,CAAC,EAAA,QAAA,EAAA,ggTAAA,EAAA,MAAA,EAAA,CAAA,mOAAA,CAAA,EAAA,CAAA;;;AEzB9O;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-dropdown.mjs","sources":["../../../../../libs-ui/components/dropdown/src/tabs/tabs.component.ts","../../../../../libs-ui/components/dropdown/src/tabs/tabs.component.html","../../../../../libs-ui/components/dropdown/src/dropdown.component.ts","../../../../../libs-ui/components/dropdown/src/dropdown.component.html","../../../../../libs-ui/components/dropdown/src/libs-ui-components-dropdown.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IDropdownTabsItem } from '../interfaces/dropdown.interface';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-dropdown-tabs',\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule],\n})\nexport class LibsUiComponentsDropdownTabsComponent {\n readonly ignoreBorderBottom = input<boolean>();\n readonly tabsConfig = input<Array<IDropdownTabsItem>>();\n readonly tabKeyActive = model<string>();\n readonly disable = input<boolean>();\n\n readonly outChange = output<void>();\n\n protected handlerSelectTab(event: Event, key: string) {\n event.stopPropagation();\n this.tabKeyActive.set(key);\n this.outChange.emit();\n }\n}\n","<div\n class=\"libs-ui-dropdown-tab-container\"\n [class.libs-ui-border-bottom-general]=\"!ignoreBorderBottom()\">\n @for (tab of tabsConfig(); track tab) {\n <div\n class=\"libs-ui-dropdown-tab-container-item libs-ui-font-h6m\"\n [class.libs-ui-dropdown-tab-container-item-active]=\"tabKeyActive() === tab.key\"\n [class.libs-ui-disable]=\"disable()\"\n [class.pointer-events-none]=\"disable()\"\n (click)=\"handlerSelectTab($event, tab.key)\"\n (keydown.enter)=\"handlerSelectTab($event, tab.key)\">\n {{ tab.name | translate }}\n </div>\n }\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, OnInit, output, signal, TemplateRef, untracked } from '@angular/core';\nimport { LibsUiComponentsAvatarComponent, TYPE_SHAPE_AVATAR, TYPE_SIZE_AVATAR_CONFIG } from '@libs-ui/components-avatar';\nimport { IButton } from '@libs-ui/components-buttons-button';\nimport { IInputSearchConfig } from '@libs-ui/components-inputs-search';\nimport { ILabel, LibsUiComponentsLabelComponent } from '@libs-ui/components-label';\nimport { getFieldKeyByType, IListConfigItem, IListDataEmitKey, IListDataEmitMultiKey, IListFunctionControlEvent, LibsUiComponentsListComponent, TYPE_TEMPLATE } from '@libs-ui/components-list';\nimport { IFlagMouse, IPopover, IPopoverFunctionControlEvent, IPopoverOverlay, LibsUiComponentsPopoverComponent, TYPE_POPOVER_EVENT } from '@libs-ui/components-popover';\nimport { IMessageTranslate, TYPE_TEMPLATE_REF } from '@libs-ui/interfaces-types';\nimport { LibsUiPipesSecurityTrustPipe } from '@libs-ui/pipes-security-trust';\nimport { IHttpRequestConfig, LibsUiHttpRequestService } from '@libs-ui/services-http-request';\nimport { CHARACTER_DATA_EMPTY, cloneDeep, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_VALID, get, isEqual, isNil, set } from '@libs-ui/utils';\nimport { TranslateModule, TranslateService } from '@ngx-translate/core';\nimport { IDropdownTabsItem, IEmitMultiKey, IEmitSelectKey, IPopoverCustomConfig, IValidMaxItemSelected } from './interfaces/dropdown.interface';\nimport { IDropdownFunctionControlEvent } from './interfaces/function-control-event.interface';\nimport { LibsUiComponentsDropdownTabsComponent } from './tabs/tabs.component';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrl: './dropdown.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiPipesSecurityTrustPipe, AsyncPipe, LibsUiComponentsLabelComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsAvatarComponent, LibsUiComponentsListComponent, LibsUiComponentsDropdownTabsComponent],\n})\nexport class LibsUiComponentsDropdownComponent implements OnInit {\n // #region PROPERTY\n protected error = signal<IMessageTranslate | undefined>(undefined);\n protected showList = signal<boolean>(false);\n protected itemsSelected = signal<any>(undefined);\n protected loadingDetail = signal<boolean>(false);\n protected loadingList = signal<boolean>(false);\n protected items = signal<Array<unknown>>([]);\n protected popoverItemSelected = signal<IPopover | undefined>(undefined);\n protected labelItemSelectedComputed = computed(this.getLabelItemSelected.bind(this));\n protected autoSelectedFirstItemCallOutsideBefore = signal<boolean>(false);\n // Cờ: true khi đang chọn item nội bộ → effect tự-chọn (constructor) bỏ qua, tránh race async.\n // Đọc trong effect bằng untracked() để KHÔNG thành dependency (tránh effect tự kích lại khi reset cờ).\n private readonly isSelectingInternally = signal<boolean>(false);\n private readonly keysSelected = signal<Array<unknown>>([]);\n private readonly popoverFunctionControl = signal<IPopoverFunctionControlEvent | undefined>(undefined);\n private readonly fieldKey = signal<string>('id');\n private readonly listFunctionControl = signal<IListFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly useXssFilter = input<boolean>(false);\n readonly popoverElementRefCustom = input<HTMLElement>();\n readonly classInclude = input<string>();\n readonly ignoreStopPropagationEvent = input<boolean>(false);\n readonly flagMouse = model<IFlagMouse>({ isMouseEnter: false, isMouseEnterContent: false });\n readonly flagMouseContent = model<IFlagMouse>();\n readonly popoverCustomConfig = input<IPopoverCustomConfig>();\n readonly isNgContent = input<boolean>();\n readonly zIndex = input<number>();\n readonly convertItemSelected = input<(item: unknown, translate?: TranslateService) => void>(this.defaultConvertItemSelected.bind(this));\n readonly getPopoverItemSelected = input<(item: unknown, translate?: TranslateService) => Promise<IPopover | undefined>>();\n readonly httpRequestDetailItemById = input<IHttpRequestConfig>();\n readonly lengthKeys = model<number>(0);\n readonly textDisplayWhenNoSelect = input<string>('i18n_select_information');\n readonly textDisplayWhenMultiSelect = input<string>('i18n_selecting_options');\n readonly classIncludeTextDisplayWhenNoSelect = input<string>('libs-ui-font-h5r');\n readonly fieldLabel = input<string, string | undefined>('labelDisplay', { transform: (value) => value || 'labelDisplay' });\n readonly fieldGetLabel = input<string>();\n readonly labelPopoverConfig = input<IPopoverOverlay>();\n readonly labelPopoverFullWidth = input<boolean>(true);\n readonly hasContentUnitRight = input<boolean>();\n readonly listSearchNoDataTemplateRef = input<TemplateRef<unknown>>();\n readonly dropdownTemplateRefNotSearchNoData = input<TemplateRef<TYPE_TEMPLATE_REF> | undefined>(undefined);\n readonly fieldGetImage = input<string>();\n readonly imageSize = input<TYPE_SIZE_AVATAR_CONFIG>(16);\n readonly typeShape = input<TYPE_SHAPE_AVATAR>('circle');\n readonly fieldGetIcon = input<string>();\n readonly fieldGetTextAvatar = input<string>('username');\n readonly fieldGetColorAvatar = input<string>();\n readonly classAvatarInclude = input<string, string | undefined>('mr-[8px]', { transform: (value) => value || 'mr-[8px]' });\n readonly getLastTextAfterSpace = input<boolean>();\n readonly linkImageError = input<string>();\n readonly showError = input<boolean>(true);\n readonly showBorderError = model<boolean>();\n readonly disable = input<boolean>();\n readonly readonly = input<boolean>();\n readonly labelConfig = input<ILabel>();\n readonly disableLabel = input<boolean>();\n\n readonly listSearchConfig = input<IInputSearchConfig, IInputSearchConfig | undefined>({ noBorder: true }, { transform: (value) => value || { noBorder: true } });\n readonly isSearchOnline = input<boolean>(false);\n readonly listHiddenInputSearch = input<boolean>();\n readonly listSearchPadding = input<boolean>();\n readonly listKeySearch = input<string>();\n readonly listDividerClassInclude = input<string>();\n readonly listConfig = input<IListConfigItem>();\n readonly listButtonsOther = input<Array<IButton>>();\n readonly listHasButtonUnSelectOption = input<boolean>();\n readonly listClickExactly = input<boolean>();\n readonly listBackgroundCustom = input<string>();\n readonly listMaxItemShow = input<number>(5);\n readonly listKeySelected = model<unknown>();\n readonly listMultiKeySelected = model<Array<unknown>>();\n readonly listKeysDisable = input<Array<string>>(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll\n readonly listKeysHidden = input<Array<string>>(); // không dùng giá trị này kết hợp với template checkbox có config chứa configCheckboxCheckAll\n readonly validRequired = input<IMessageTranslate>();\n readonly validMaxItemSelected = input<IValidMaxItemSelected>();\n readonly changeValidUndefinedResetError = input<boolean>();\n readonly allowSelectItemMultiple = input<boolean>();\n readonly focusInputSearch = input<boolean>(true);\n readonly onlyEmitDataWhenReset = input<boolean>(); // true khi muốn emit sự kiện thay đổi key\n readonly resetKeyWhenSelectAllKey = input<boolean>();\n readonly listConfigHasDivider = input<boolean>(true);\n readonly classIncludeIcon = input<string, string | undefined>('ml-[8px]', { transform: (value) => value || 'ml-[8px]' });\n readonly classIncludeContent = input<string>();\n readonly listIgnoreClassDisableDefaultWhenUseKeysDisableItem = input<boolean>(); // bỏ chế độ disable item trên html list view để disable từng phần trong rows\n readonly tabKeyActive = model<string>();\n readonly tabsConfig = input<Array<IDropdownTabsItem>>();\n readonly ignoreBorderBottom = input<boolean>();\n\n // #region OUTPUT\n readonly outSelectKey = output<IEmitSelectKey | undefined>(); // sử dụng cho type chọn 1.\n readonly outSelectMultiKey = output<IEmitMultiKey | undefined>(); // sử dụng cho type cho phép chọn nhiều.\n readonly outFunctionsControl = output<IDropdownFunctionControlEvent>();\n readonly outValidEvent = output<boolean>();\n readonly outChangStageFlagMouse = output<IFlagMouse>();\n readonly outDataChange = output<Array<unknown>>();\n readonly outClickButtonOther = output<IButton>();\n readonly outShowList = output<boolean>();\n readonly outChangeTabKeyActive = output<string | undefined>();\n\n /* INJECT*/\n private readonly translate = inject(TranslateService);\n private readonly httpRequestService = inject(LibsUiHttpRequestService);\n\n constructor() {\n effect(() => {\n const listConfig = this.listConfig();\n if (listConfig) {\n untracked(() => this.fieldKey.set(getFieldKeyByType(listConfig, 'id')));\n }\n });\n effect(() => {\n // Đọc cờ qua untracked để cờ KHÔNG trở thành dependency của effect (tránh tự kích lại khi set cờ).\n const isSelectingInternally = untracked(() => this.isSelectingInternally());\n if (!isNil(this.listKeySelected()) && this.listKeySelected() !== '' && !this.itemsSelected() && !this.autoSelectedFirstItemCallOutsideBefore() && !isSelectingInternally) {\n untracked(() => {\n this.handlerSelectedKey({ key: this.listKeySelected(), item: undefined, isClickManual: false });\n });\n }\n });\n effect(() => {\n if (this.changeValidUndefinedResetError() && this.validRequired()) {\n untracked(() => this.resetError());\n }\n });\n effect(() => {\n // Đọc cờ qua untracked để không thành dependency (xem handlerSelectedKey / handlerSelectMultiKey).\n const isSelectingInternally = untracked(() => this.isSelectingInternally());\n if (this.listMultiKeySelected() && !this.autoSelectedFirstItemCallOutsideBefore() && !isSelectingInternally) {\n untracked(() => {\n const previousValue = this.keysSelected() || [];\n const currentValue = this.listMultiKeySelected() || [];\n\n if (isEqual(cloneDeep(previousValue), cloneDeep(currentValue))) {\n return;\n }\n\n this.handlerSelectMultiKey({ keys: currentValue, mapKeys: [], isClickManual: false });\n });\n }\n });\n }\n\n async ngOnInit() {\n const listConfig = this.listConfig();\n\n if (this.listKeySelected() || this.listMultiKeySelected()) {\n this.lengthKeys.set(this.listKeySelected() ? 1 : this.listMultiKeySelected()?.length || 0);\n }\n\n this.warnMissingHttpRequestDetailItemById();\n\n if (!this.lengthKeys() && listConfig && (listConfig.autoSelectFirstItem || listConfig.configTemplateCheckbox?.()?.autoSelectAllItem || listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect) && listConfig.httpRequestData) {\n try {\n this.loadingDetail.set(true);\n const httpRequestData = listConfig.httpRequestData();\n const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestData;\n this.httpRequestService.updateArguments(argumentsValue, { ...this.httpRequestService.fakeResponsePagingApi(), dropdownTabKeyActive: this.tabKeyActive }, {}, '', true, false, guideAutoUpdateArgumentsValue);\n const result = await this.httpRequestService.callApi(httpRequestData);\n this.loadingDetail.set(false);\n if (result?.data) {\n this.items.set(result.data);\n this.emitAutoSelectKey(result.data, listConfig.type);\n this.autoSelectedFirstItemCallOutsideBefore.set(true);\n }\n } catch (error) {\n console.log(error);\n this.items.set([]);\n this.loadingDetail.set(false);\n }\n this.outDataChange.emit(this.items());\n }\n this.outFunctionsControl.emit(this.FunctionsControl);\n this.checkValid(true);\n }\n\n /* FUNCTIONS */\n public get FunctionsControl(): IDropdownFunctionControlEvent {\n return {\n reset: this.reset.bind(this),\n checkIsValid: this.valid.bind(this),\n resetError: this.resetError.bind(this),\n setError: this.setError.bind(this),\n removeList: async () => this.popoverFunctionControl()?.removePopoverOverlay(),\n getDisable: async () => this.disable() ?? false,\n updateLabelItemSelected: async (label) => this.itemsSelected.update((value) => ({ ...value, [this.fieldLabel()]: this.translate.instant(label) })),\n refreshList: async () => this.listFunctionControl()?.refresh(),\n setItemSelectedByKey: this.setItemSelectedByKey.bind(this),\n setSelectedKey: async (key: unknown, options?: { reset?: boolean }) => {\n if (options?.reset) {\n await this.reset();\n }\n await this.handlerSelectedKey({ key, item: undefined, isClickManual: false });\n },\n setSelectedMultiKey: async (keys: unknown[], options?: { reset?: boolean }) => {\n if (options?.reset) {\n await this.reset();\n }\n await this.handlerSelectMultiKey({ keys, mapKeys: [], isClickManual: false });\n },\n };\n }\n\n private defaultConvertItemSelected(item: unknown) {\n if (!item) {\n return;\n }\n const fieldGetLabel = this.fieldGetLabel();\n const value = fieldGetLabel ? get(item, fieldGetLabel) : undefined;\n set(item, this.fieldLabel(), value ?? get(item, 'label') ?? get(item, 'name') ?? ' ');\n }\n\n private getLabelItemSelected() {\n let label = ' ';\n if (!this.lengthKeys()) {\n label = this.textDisplayWhenNoSelect();\n }\n if (this.lengthKeys() > 1) {\n label = this.textDisplayWhenMultiSelect();\n }\n if (this.lengthKeys() === 1) {\n label = get(this.itemsSelected(), this.fieldLabel()) || this.textDisplayWhenNoSelect();\n }\n return label;\n }\n\n private emitAutoSelectKey(items: Array<unknown>, type: TYPE_TEMPLATE) {\n const listConfig = this.listConfig();\n if (!items?.length || !listConfig || (!listConfig.autoSelectFirstItem && !listConfig.configTemplateCheckbox?.()?.autoSelectAllItem && !listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect)) {\n return;\n }\n const flatItemsSupportAutoSelect = listConfig.configTemplateGroup?.()?.flatItemsSupportAutoSelect;\n if (type === 'group' && flatItemsSupportAutoSelect) {\n items = flatItemsSupportAutoSelect(items);\n }\n if (listConfig.autoSelectFirstItem) {\n const item = items[0];\n const key = get(item, this.fieldKey());\n if (type === 'radio' || type === 'text') {\n this.handlerSelectedKey({ key, item, isClickManual: false });\n this.listKeySelected.set(key);\n return;\n }\n this.handlerSelectMultiKey({ keys: [key], mapKeys: [{ key, item, isClickManual: false }], isClickManual: false });\n this.listMultiKeySelected.set([key]);\n return;\n }\n if (type !== 'checkbox' && type !== 'group') {\n return;\n }\n const keys: Array<string> = [];\n const mapKeys: Array<IListDataEmitKey> = [];\n items.forEach((item) => {\n const key = get(item, this.fieldKey());\n if (isNil(key)) {\n return;\n }\n keys.push(key);\n mapKeys.push({ key, item, isClickManual: false });\n });\n this.handlerSelectMultiKey({ keys, mapKeys, isClickManual: false });\n this.listMultiKeySelected.set(keys);\n }\n\n private warnMissingHttpRequestDetailItemById() {\n if (this.httpRequestDetailItemById()) {\n return;\n }\n const hasPreselectedKey = (!isNil(this.listKeySelected()) && this.listKeySelected() !== '') || !!this.listMultiKeySelected()?.length;\n if (!hasPreselectedKey) {\n return;\n }\n console.warn(\n `[LibsUiComponentsDropdownComponent] Đang truyền sẵn \"listKeySelected/listMultiKeySelected\" nhưng CHƯA cấu hình [httpRequestDetailItemById]. Khi dropdown chỉ nhận key (không có sẵn item tương ứng), label của item đã chọn sẽ KHÔNG hiển thị được (hiện trắng). Hãy cấu hình [httpRequestDetailItemById] để dropdown tự gọi API lấy chi tiết item theo key. Xem README mục \"Dropdown lazy-load chi tiết item theo key\".`\n );\n }\n\n protected handlerEvent(type: TYPE_POPOVER_EVENT) {\n if (type === 'click') {\n return;\n }\n if (type === 'remove') {\n this.showList.set(false);\n this.outShowList.emit(this.showList());\n return;\n }\n this.showList.set(true);\n this.outShowList.emit(this.showList());\n }\n\n protected handlerDataChange(items: Array<unknown>) {\n this.items.set(items);\n this.popoverFunctionControl()?.updatePopoverOverlayPosition();\n this.outDataChange.emit(this.items());\n }\n\n protected handlerChangeFlagMouse(event: IFlagMouse) {\n this.flagMouseContent.set(event);\n this.mergeFlagMouse();\n }\n\n protected handlerClickButtonOther(button: IButton) {\n this.outClickButtonOther.emit(button);\n this.popoverFunctionControl()?.removePopoverOverlay();\n }\n\n protected handlerPopoverControlEvent(event: IPopoverFunctionControlEvent) {\n this.popoverFunctionControl.set(event);\n }\n\n protected async handlerSelectedKey(event: IListDataEmitKey | undefined) {\n // Bật cờ đồng bộ ngay đầu để effect tự-chọn (constructor) bỏ qua trong lúc đang chọn nội bộ.\n // Tránh race: listKeySelected.set() (đồng bộ) kích effect TRƯỚC khi itemsSelected.set() (sau await) kịp chạy.\n this.isSelectingInternally.set(true);\n try {\n await this.processSelectedKey(event);\n } finally {\n this.isSelectingInternally.set(false);\n }\n }\n\n private async processSelectedKey(event: IListDataEmitKey | undefined) {\n const key = event?.key;\n const item = event?.item;\n const isClickManual = event?.isClickManual;\n this.lengthKeys.set(!(isNil(key) || (typeof key === 'string' && key === '')) ? 1 : 0);\n this.listKeySelected.set(key);\n if (!this.allowSelectItemMultiple() && this.itemsSelected() && get(this.itemsSelected(), this.fieldKey()) === key) {\n return;\n }\n if (isClickManual) {\n if (!(isNil(key) || (typeof key === 'string' && key === '')) && (item || this.itemsSelected())) {\n this.popoverFunctionControl()?.removePopoverOverlay();\n }\n }\n this.checkValid();\n if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {\n let itemSelected = await this.setItemSelectedByKey(key);\n if (!itemSelected) {\n itemSelected = {\n [this.fieldKey()]: key,\n [this.fieldLabel()]: CHARACTER_DATA_EMPTY,\n };\n this.itemsSelected.set(itemSelected);\n }\n if (event) {\n event.item = itemSelected;\n }\n this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });\n return;\n }\n this.itemsSelected.set(await this.prepareItemSelectedDisplay(item));\n this.outSelectKey.emit({ ...event, tabKeyActive: this.tabKeyActive() });\n }\n\n protected async handlerSelectMultiKey(event: IListDataEmitMultiKey | undefined, isClickManual = false) {\n // Bật cờ đồng bộ để effect tự-chọn multi (constructor) bỏ qua trong lúc đang chọn nội bộ (tránh race async).\n this.isSelectingInternally.set(true);\n try {\n await this.processSelectMultiKey(event, isClickManual);\n } finally {\n this.isSelectingInternally.set(false);\n }\n }\n\n private async processSelectMultiKey(event: IListDataEmitMultiKey | undefined, isClickManual = false) {\n if (this.listConfig()?.configTemplateGroup?.()?.singleSelectItem && event?.mapKeys?.length) {\n const itemClickManual = event.mapKeys.find((mapKey) => mapKey.item?.isCheckManual);\n if (itemClickManual) {\n setTimeout(() => (itemClickManual.item.isCheckManual = false));\n event.keys = [itemClickManual.key];\n event.mapKeys = [itemClickManual];\n this.popoverFunctionControl()?.removePopoverOverlay();\n }\n }\n this.keysSelected.set([...(event?.keys || [])]);\n this.listMultiKeySelected.set([...(event?.keys || [])]);\n this.lengthKeys.set(event?.keys?.length || 0);\n this.checkValid();\n if (this.lengthKeys() > 1) {\n this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });\n return;\n }\n const key = event?.keys[0];\n let item = event?.mapKeys?.find((item) => item.key === key)?.item;\n\n if (this.lengthKeys() && !item && this.httpRequestDetailItemById()) {\n item = await this.setItemSelectedByKey(key);\n this.outSelectMultiKey.emit({ keys: [key], mapKeys: [{ key, item }], isClickManual, tabKeyActive: this.tabKeyActive() });\n return;\n }\n this.itemsSelected.set(await this.prepareItemSelectedDisplay(item));\n this.outSelectMultiKey.emit({ ...(event || {}), isClickManual, tabKeyActive: this.tabKeyActive() });\n }\n\n private async setItemSelectedByKey(key: unknown) {\n const httpRequestDetailItemById = this.httpRequestDetailItemById();\n if (!httpRequestDetailItemById || this.loadingDetail()) {\n return;\n }\n try {\n this.loadingDetail.set(true);\n const { argumentsValue, guideAutoUpdateArgumentsValue } = httpRequestDetailItemById;\n this.httpRequestService.updateArguments(argumentsValue, { key, dropdownTabKeyActive: this.tabKeyActive() }, {}, '', false, false, guideAutoUpdateArgumentsValue);\n const result = await this.httpRequestService.callApi(httpRequestDetailItemById);\n this.itemsSelected.set(await this.prepareItemSelectedDisplay(result?.data?.[0] || result?.data));\n this.loadingDetail.set(false);\n return this.itemsSelected();\n } catch (error) {\n console.log(error);\n this.loadingDetail.set(false);\n return;\n }\n }\n\n protected handlerChangeTab() {\n this.outChangeTabKeyActive.emit(this.tabKeyActive());\n }\n\n protected handlerLoadingList(event: boolean) {\n this.loadingList.set(event);\n }\n\n private async setError(error: string) {\n this.error.set({ message: error });\n this.showBorderError.set(true);\n }\n\n private async valid() {\n if (this.error()?.message) {\n return false;\n }\n return this.checkValid();\n }\n\n private checkValid(validateDefault?: boolean): boolean {\n this.error.set(undefined);\n const valid = { required: true, limitMaxItemSelect: true };\n const validMaxItemSelected = this.validMaxItemSelected();\n if (this.validRequired() && !this.lengthKeys()) {\n valid.required = false;\n }\n if (validMaxItemSelected && this.lengthKeys() > validMaxItemSelected.value) {\n valid.limitMaxItemSelect = false;\n }\n if (!validateDefault && valid.required === false) {\n const validRequired = this.validRequired();\n this.error.set({ ...(validRequired || {}), message: validRequired?.message || ERROR_MESSAGE_EMPTY_VALID });\n }\n if (!validateDefault && !this.error() && valid.limitMaxItemSelect === false) {\n const validMaxItemSelected = this.validMaxItemSelected();\n this.error.set({ ...(validMaxItemSelected || {}), message: validMaxItemSelected?.message || ERROR_MESSAGE_MAX_VALID, interpolateParams: { value: validMaxItemSelected?.value } });\n }\n this.outValidEvent.emit(valid.required && valid.limitMaxItemSelect);\n return valid.required && valid.limitMaxItemSelect;\n }\n\n private async resetError() {\n this.error.set(undefined);\n this.showBorderError.set(false);\n }\n\n protected handlerListFunctionsControl(event: IListFunctionControlEvent) {\n this.listFunctionControl.set(event);\n }\n\n protected handlerChangStageFlagMouse(flag: IFlagMouse) {\n this.flagMouse.set(flag);\n this.mergeFlagMouse();\n }\n\n private async reset() {\n this.itemsSelected.set(undefined);\n this.lengthKeys.set(0);\n this.listFunctionControl()?.resetKeySelected();\n if (!this.showList() && this.onlyEmitDataWhenReset()) {\n this.outSelectKey.emit(undefined);\n this.outSelectMultiKey.emit(undefined);\n }\n this.listKeySelected.set(undefined);\n this.listMultiKeySelected.set(undefined);\n this.keysSelected.set([]);\n this.error.set(undefined);\n }\n\n private async prepareItemSelectedDisplay(item: unknown): Promise<unknown> {\n const itemClone = cloneDeep(item);\n if (itemClone) {\n this.convertItemSelected()(itemClone, this.translate);\n const getPopoverItemSelected = this.getPopoverItemSelected();\n if (getPopoverItemSelected) {\n this.popoverItemSelected.set(await getPopoverItemSelected(itemClone, this.translate));\n }\n }\n return itemClone;\n }\n\n private mergeFlagMouse() {\n const flag: IFlagMouse = { isMouseEnter: false, isMouseEnterContent: false, isContainerHasScroll: false };\n if (this.flagMouseContent()?.isMouseEnter || this.flagMouse().isMouseEnter) {\n flag.isMouseEnter = true;\n }\n if (this.flagMouseContent()?.isMouseEnterContent || this.flagMouse().isMouseEnterContent) {\n flag.isMouseEnterContent = true;\n }\n if (this.flagMouseContent()?.isContainerHasScroll || this.flagMouse().isContainerHasScroll) {\n flag.isContainerHasScroll = true;\n }\n this.outChangStageFlagMouse.emit(flag);\n }\n}\n","<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 [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 [class.h-full]=\"listMaxItemShow() === -1\"\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 && !validRequired() && (listConfig()?.type === 'text' || listConfig()?.type === 'radio'))\"\n [templateRefSearchNoData]=\"listSearchNoDataTemplateRef()\"\n [templateRefNotSearchNoData]=\"dropdownTemplateRefNotSearchNoData()\"\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -7,5 +7,11 @@ export interface IDropdownFunctionControlEvent {
|
|
|
7
7
|
reset: () => Promise<void>;
|
|
8
8
|
refreshList: () => Promise<void>;
|
|
9
9
|
setItemSelectedByKey: (id: unknown) => Promise<void>;
|
|
10
|
+
setSelectedKey: (key: unknown, options?: {
|
|
11
|
+
reset?: boolean;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
setSelectedMultiKey: (keys: unknown[], options?: {
|
|
14
|
+
reset?: boolean;
|
|
15
|
+
}) => Promise<void>;
|
|
10
16
|
getDisable: () => Promise<boolean>;
|
|
11
17
|
}
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-dropdown",
|
|
3
|
-
"version": "0.2.357-
|
|
3
|
+
"version": "0.2.357-10",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=18.0.0",
|
|
6
6
|
"@angular/core": ">=18.0.0",
|
|
7
|
-
"@libs-ui/components-avatar": "0.2.357-
|
|
8
|
-
"@libs-ui/components-buttons-button": "0.2.357-
|
|
9
|
-
"@libs-ui/components-inputs-search": "0.2.357-
|
|
10
|
-
"@libs-ui/components-label": "0.2.357-
|
|
11
|
-
"@libs-ui/components-list": "0.2.357-
|
|
12
|
-
"@libs-ui/components-popover": "0.2.357-
|
|
13
|
-
"@libs-ui/pipes-security-trust": "0.2.357-
|
|
14
|
-
"@libs-ui/services-http-request": "0.2.357-
|
|
15
|
-
"@libs-ui/utils": "0.2.357-
|
|
7
|
+
"@libs-ui/components-avatar": "0.2.357-10",
|
|
8
|
+
"@libs-ui/components-buttons-button": "0.2.357-10",
|
|
9
|
+
"@libs-ui/components-inputs-search": "0.2.357-10",
|
|
10
|
+
"@libs-ui/components-label": "0.2.357-10",
|
|
11
|
+
"@libs-ui/components-list": "0.2.357-10",
|
|
12
|
+
"@libs-ui/components-popover": "0.2.357-10",
|
|
13
|
+
"@libs-ui/pipes-security-trust": "0.2.357-10",
|
|
14
|
+
"@libs-ui/services-http-request": "0.2.357-10",
|
|
15
|
+
"@libs-ui/utils": "0.2.357-10",
|
|
16
16
|
"@ngx-translate/core": "^15.0.0",
|
|
17
|
-
"@libs-ui/interfaces-types": "0.2.357-
|
|
17
|
+
"@libs-ui/interfaces-types": "0.2.357-10"
|
|
18
18
|
},
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"module": "fesm2022/libs-ui-components-dropdown.mjs",
|