@libs-ui/components-table 0.2.179 → 0.2.181
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/esm2022/interfaces/table-config.interface.mjs +1 -1
- package/esm2022/pipes/calculator-column.pipe.mjs +52 -0
- package/esm2022/table.component.mjs +49 -12
- package/esm2022/templates/templates.component.mjs +9 -9
- package/fesm2022/libs-ui-components-table.mjs +106 -20
- package/fesm2022/libs-ui-components-table.mjs.map +1 -1
- package/interfaces/table-config.interface.d.ts +1 -0
- package/package.json +23 -23
- package/pipes/calculator-column.pipe.d.ts +9 -0
- package/table.component.d.ts +14 -6
- package/templates/templates.component.d.ts +1 -1
|
@@ -18,17 +18,20 @@ import { cloneDeep, convertObjectToSignal, deleteUnicode, get, set, viewDataNumb
|
|
|
18
18
|
import { TranslateModule } from "@ngx-translate/core";
|
|
19
19
|
import { fromEvent, lastValueFrom, of, Subject, takeUntil, timer } from "rxjs";
|
|
20
20
|
import { LibsUiComponentsTableTemplatesComponent } from "./templates/templates.component";
|
|
21
|
+
import { LibsUiTableCalculatorColumnPipe } from "./pipes/calculator-column.pipe";
|
|
22
|
+
import { LibsUiPipesConvertObjectToSignalPipe } from "@libs-ui/pipes-convert-object-to-signal";
|
|
21
23
|
import * as i0 from "@angular/core";
|
|
22
24
|
import * as i1 from "@ngx-translate/core";
|
|
23
25
|
import * as i2 from "@iharbeck/ngx-virtual-scroller";
|
|
24
26
|
export class LibsUiComponentsTableComponent {
|
|
25
27
|
/** PROPERTY */
|
|
26
|
-
classHeaderContainer = computed(() => `libs-ui-table-header-container w-full flex ${this.ignoreClassBgHeader() ? '' : 'bg-white'} overflow-x-hidden z-[1] items-center ${this.
|
|
28
|
+
classHeaderContainer = computed(() => `libs-ui-table-header-container w-full flex shrink-0 ${this.ignoreClassBgHeader() ? '' : 'bg-white'} overflow-x-hidden z-[1] items-center ${this.classHeaderContainerInclude() || ''}`);
|
|
29
|
+
classHeaderLeftContainer = computed(() => `h-full flex sticky top-0 left-0 z-[1] ${this.ignoreClassBgHeader() ? '' : 'bg-white'} ${this.classHeaderLeftInclude() || ''}`);
|
|
27
30
|
keysSelected = signal([]);
|
|
28
31
|
loading = signal(false);
|
|
29
32
|
stores = signal([]);
|
|
30
33
|
items = signal([]);
|
|
31
|
-
itemFooter = signal(
|
|
34
|
+
itemFooter = signal(undefined);
|
|
32
35
|
itemOfIndexHover;
|
|
33
36
|
keySearch = signal('');
|
|
34
37
|
totalItemInBackend = signal(0);
|
|
@@ -60,6 +63,7 @@ export class LibsUiComponentsTableComponent {
|
|
|
60
63
|
storeParamsCallApi = signal({});
|
|
61
64
|
timeoutLeaveItem = signal(undefined);
|
|
62
65
|
functionControlSelectMoreItem;
|
|
66
|
+
mouseScrollContext = signal(undefined);
|
|
63
67
|
onDestroy = new Subject();
|
|
64
68
|
/** INPUT */
|
|
65
69
|
timeHighlighNewItem = input(2000, { transform: val => val ?? 2000 });
|
|
@@ -76,7 +80,8 @@ export class LibsUiComponentsTableComponent {
|
|
|
76
80
|
bufferAmount = input(5, { transform: val => val ? (val > 25 ? 25 : val) : 5 });
|
|
77
81
|
totalItem = input();
|
|
78
82
|
isDashBorder = input();
|
|
79
|
-
|
|
83
|
+
classHeaderContainerInclude = input();
|
|
84
|
+
classHeaderLeftInclude = input();
|
|
80
85
|
classBodyInclude = input('', { transform: val => val ?? '' });
|
|
81
86
|
classFooterInclude = input('', { transform: val => val ?? '' });
|
|
82
87
|
classTableContainerInclude = input('', { transform: val => val ?? '' });
|
|
@@ -256,7 +261,7 @@ export class LibsUiComponentsTableComponent {
|
|
|
256
261
|
const { argumentsValue, guideAutoUpdateArgumentsValue } = this.httpRequestDataFooter();
|
|
257
262
|
this.httpRequestService.updateArguments(argumentsValue, { storeParamsCallApi: this.storeParamsCallApi() }, this.pagingStore(), this.keySearch(), true, false, guideAutoUpdateArgumentsValue);
|
|
258
263
|
const result = await this.httpRequestService.callApi(this.httpRequestDataFooter());
|
|
259
|
-
this.itemFooter.set(convertObjectToSignal(result.data)
|
|
264
|
+
this.itemFooter.set(convertObjectToSignal(result.data));
|
|
260
265
|
}
|
|
261
266
|
async addItems(items, addFirst, ignoreHightLight, ignoreReCallFooter, autoCountNewItem) {
|
|
262
267
|
if (!items() || !items().length) {
|
|
@@ -342,14 +347,28 @@ export class LibsUiComponentsTableComponent {
|
|
|
342
347
|
}
|
|
343
348
|
return this.items().length;
|
|
344
349
|
}
|
|
345
|
-
|
|
350
|
+
handlerScrollBody(e) {
|
|
346
351
|
e.stopPropagation();
|
|
352
|
+
if (this.mouseScrollContext() !== 'body') {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
347
355
|
this.headerElementRef().nativeElement.scrollLeft = e.target.scrollLeft;
|
|
348
356
|
if (this.footerElementRef()) {
|
|
349
357
|
this.footerElementRef().nativeElement.scrollLeft = e.target.scrollLeft;
|
|
350
358
|
}
|
|
351
359
|
this.resetIndexHover(e);
|
|
352
360
|
}
|
|
361
|
+
handlerScrollHeader(e) {
|
|
362
|
+
e.stopPropagation();
|
|
363
|
+
if (this.mouseScrollContext() !== 'header') {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
this.bodyElementRef().nativeElement.scrollLeft = e.target.scrollLeft;
|
|
367
|
+
if (this.footerElementRef()) {
|
|
368
|
+
this.footerElementRef().nativeElement.scrollLeft = e.target.scrollLeft;
|
|
369
|
+
}
|
|
370
|
+
this.resetIndexHover(e);
|
|
371
|
+
}
|
|
353
372
|
handlerScrollBottom(e) {
|
|
354
373
|
e.stopPropagation();
|
|
355
374
|
this.loadMore();
|
|
@@ -550,8 +569,18 @@ export class LibsUiComponentsTableComponent {
|
|
|
550
569
|
}
|
|
551
570
|
this.itemOfIndexHover = undefined;
|
|
552
571
|
}
|
|
553
|
-
|
|
572
|
+
handlerMouseEnterHeader(event) {
|
|
554
573
|
event.stopPropagation();
|
|
574
|
+
this.setMouseContext('header');
|
|
575
|
+
this.resetIndexHover(event);
|
|
576
|
+
}
|
|
577
|
+
handlerMouseEnterBody(event) {
|
|
578
|
+
event.stopPropagation();
|
|
579
|
+
this.setMouseContext('body');
|
|
580
|
+
}
|
|
581
|
+
handlerMouseEnterFooter(event) {
|
|
582
|
+
event.stopPropagation();
|
|
583
|
+
this.setMouseContext('footer');
|
|
555
584
|
this.resetIndexHover(event);
|
|
556
585
|
if (this.classFooterInclude()) {
|
|
557
586
|
this.footerElementRef()?.nativeElement?.classList.remove('bg-[#f8f9fa]');
|
|
@@ -560,7 +589,12 @@ export class LibsUiComponentsTableComponent {
|
|
|
560
589
|
this.footerLeftElementRef()?.nativeElement?.classList.add(this.classFooterInclude());
|
|
561
590
|
}
|
|
562
591
|
}
|
|
563
|
-
|
|
592
|
+
handlerMouseLeaveContainer(event) {
|
|
593
|
+
event.stopPropagation();
|
|
594
|
+
this.setMouseContext(undefined);
|
|
595
|
+
this.resetIndexHover(event);
|
|
596
|
+
}
|
|
597
|
+
handlerMouseLeaveFooter(event) {
|
|
564
598
|
event.stopPropagation();
|
|
565
599
|
if (this.classFooterInclude()) {
|
|
566
600
|
this.footerElementRef()?.nativeElement?.classList.remove(this.classFooterInclude());
|
|
@@ -569,6 +603,9 @@ export class LibsUiComponentsTableComponent {
|
|
|
569
603
|
this.footerLeftElementRef()?.nativeElement?.classList.add('bg-[#f8f9fa]');
|
|
570
604
|
}
|
|
571
605
|
}
|
|
606
|
+
setMouseContext(context) {
|
|
607
|
+
this.mouseScrollContext.set(context);
|
|
608
|
+
}
|
|
572
609
|
resetScroll() {
|
|
573
610
|
if (this.headerElementRef()) {
|
|
574
611
|
this.headerElementRef().nativeElement.scrollLeft = 0;
|
|
@@ -619,18 +656,18 @@ export class LibsUiComponentsTableComponent {
|
|
|
619
656
|
clearTimeout(this.timeoutLeaveItem());
|
|
620
657
|
}
|
|
621
658
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
622
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderInclude: { classPropertyName: "classHeaderInclude", publicName: "classHeaderInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outClickButtonAction: "outClickButtonAction", outSort: "outSort", outClickBarButton: "outClickBarButton", outHoverButtonAction: "outHoverButtonAction", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"resetIndexHover($event)\">\n <div #headerElementRef\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (headerLeft().length) {\n <div class=\"h-full flex sticky top-0 left-0 z-[1] {{ classHeaderInclude() }}\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n @if (items().length) {\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScroll($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n\n @if ((!items().length) && !loading() && noDataConfig()) {\n <div class=\"h-full\"\n [style.flex]=\"'0 0 '+headerElementRef.scrollWidth+'px'\">\n </div>\n }\n </div>\n }\n @if ((!items().length) && !loading()) {\n <div class=\"relative h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? (header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnter($event)\"\n (mouseleave)=\"handlerMouseLeave($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
659
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsTableComponent, isStandalone: true, selector: "libs_ui-components-table", inputs: { timeHighlighNewItem: { classPropertyName: "timeHighlighNewItem", publicName: "timeHighlighNewItem", isSignal: true, isRequired: false, transformFunction: null }, headerLeft: { classPropertyName: "headerLeft", publicName: "headerLeft", isSignal: true, isRequired: false, transformFunction: null }, headerRight: { classPropertyName: "headerRight", publicName: "headerRight", isSignal: true, isRequired: false, transformFunction: null }, configTemplateItemCollapseExpand: { classPropertyName: "configTemplateItemCollapseExpand", publicName: "configTemplateItemCollapseExpand", isSignal: true, isRequired: false, transformFunction: null }, showFooter: { classPropertyName: "showFooter", publicName: "showFooter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderFooter: { classPropertyName: "ignoreBorderFooter", publicName: "ignoreBorderFooter", isSignal: true, isRequired: false, transformFunction: null }, customPositionFooter: { classPropertyName: "customPositionFooter", publicName: "customPositionFooter", isSignal: true, isRequired: false, transformFunction: null }, footerLeft: { classPropertyName: "footerLeft", publicName: "footerLeft", isSignal: true, isRequired: false, transformFunction: null }, footerRight: { classPropertyName: "footerRight", publicName: "footerRight", isSignal: true, isRequired: false, transformFunction: null }, disableCheckbox: { classPropertyName: "disableCheckbox", publicName: "disableCheckbox", isSignal: true, isRequired: false, transformFunction: null }, enableUnequalChildrenSizes: { classPropertyName: "enableUnequalChildrenSizes", publicName: "enableUnequalChildrenSizes", isSignal: true, isRequired: false, transformFunction: null }, bufferAmount: { classPropertyName: "bufferAmount", publicName: "bufferAmount", isSignal: true, isRequired: false, transformFunction: null }, totalItem: { classPropertyName: "totalItem", publicName: "totalItem", isSignal: true, isRequired: false, transformFunction: null }, isDashBorder: { classPropertyName: "isDashBorder", publicName: "isDashBorder", isSignal: true, isRequired: false, transformFunction: null }, classHeaderContainerInclude: { classPropertyName: "classHeaderContainerInclude", publicName: "classHeaderContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classHeaderLeftInclude: { classPropertyName: "classHeaderLeftInclude", publicName: "classHeaderLeftInclude", isSignal: true, isRequired: false, transformFunction: null }, classBodyInclude: { classPropertyName: "classBodyInclude", publicName: "classBodyInclude", isSignal: true, isRequired: false, transformFunction: null }, classFooterInclude: { classPropertyName: "classFooterInclude", publicName: "classFooterInclude", isSignal: true, isRequired: false, transformFunction: null }, classTableContainerInclude: { classPropertyName: "classTableContainerInclude", publicName: "classTableContainerInclude", isSignal: true, isRequired: false, transformFunction: null }, classBarInclude: { classPropertyName: "classBarInclude", publicName: "classBarInclude", isSignal: true, isRequired: false, transformFunction: null }, fieldKey: { classPropertyName: "fieldKey", publicName: "fieldKey", isSignal: true, isRequired: false, transformFunction: null }, defaultKeysSelected: { classPropertyName: "defaultKeysSelected", publicName: "defaultKeysSelected", isSignal: true, isRequired: false, transformFunction: null }, labelBarNoSelectItem: { classPropertyName: "labelBarNoSelectItem", publicName: "labelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, labelBarButtons: { classPropertyName: "labelBarButtons", publicName: "labelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarButtons: { classPropertyName: "classLabelBarButtons", publicName: "classLabelBarButtons", isSignal: true, isRequired: false, transformFunction: null }, barButtons: { classPropertyName: "barButtons", publicName: "barButtons", isSignal: true, isRequired: false, transformFunction: null }, sortLocal: { classPropertyName: "sortLocal", publicName: "sortLocal", isSignal: true, isRequired: false, transformFunction: null }, filterOrSortLocal: { classPropertyName: "filterOrSortLocal", publicName: "filterOrSortLocal", isSignal: true, isRequired: false, transformFunction: null }, httpRequestData: { classPropertyName: "httpRequestData", publicName: "httpRequestData", isSignal: true, isRequired: false, transformFunction: null }, httpRequestDataFooter: { classPropertyName: "httpRequestDataFooter", publicName: "httpRequestDataFooter", isSignal: true, isRequired: false, transformFunction: null }, newData: { classPropertyName: "newData", publicName: "newData", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, ignoreBar: { classPropertyName: "ignoreBar", publicName: "ignoreBar", isSignal: true, isRequired: false, transformFunction: null }, classLabelBarNoSelectItem: { classPropertyName: "classLabelBarNoSelectItem", publicName: "classLabelBarNoSelectItem", isSignal: true, isRequired: false, transformFunction: null }, ignoreClassBgHeader: { classPropertyName: "ignoreClassBgHeader", publicName: "ignoreClassBgHeader", isSignal: true, isRequired: false, transformFunction: null }, noDataConfig: { classPropertyName: "noDataConfig", publicName: "noDataConfig", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItemLast: { classPropertyName: "ignoreBorderItemLast", publicName: "ignoreBorderItemLast", isSignal: true, isRequired: false, transformFunction: null }, isHiddenHeaderWhenNodata: { classPropertyName: "isHiddenHeaderWhenNodata", publicName: "isHiddenHeaderWhenNodata", isSignal: true, isRequired: false, transformFunction: null }, maxItemSelected: { classPropertyName: "maxItemSelected", publicName: "maxItemSelected", isSignal: true, isRequired: false, transformFunction: null }, configSelectMoreItem: { classPropertyName: "configSelectMoreItem", publicName: "configSelectMoreItem", isSignal: true, isRequired: false, transformFunction: null }, onlyShowNoResult: { classPropertyName: "onlyShowNoResult", publicName: "onlyShowNoResult", isSignal: true, isRequired: false, transformFunction: null }, ignoreBorderItem: { classPropertyName: "ignoreBorderItem", publicName: "ignoreBorderItem", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outLoadMore: "outLoadMore", outScrollIsGone: "outScrollIsGone", outLoading: "outLoading", outClickButtonAction: "outClickButtonAction", outSort: "outSort", outClickBarButton: "outClickBarButton", outHoverButtonAction: "outHoverButtonAction", outKeysSelected: "outKeysSelected", outFunctionsControl: "outFunctionsControl", outLoadDataComplete: "outLoadDataComplete", outTotalItem: "outTotalItem", outLoadDataError: "outLoadDataError" }, viewQueries: [{ propertyName: "headerElementRef", first: true, predicate: ["headerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerElementRef", first: true, predicate: ["footerElementRef"], descendants: true, isSignal: true }, { propertyName: "footerLeftElementRef", first: true, predicate: ["footerLeftElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyElementRef", first: true, predicate: ["bodyElementRef"], descendants: true, isSignal: true }, { propertyName: "bodyComponentRef", first: true, predicate: ["bodyComponentRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollbarWidth: 0}\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\"\n (mouseenter)=\"handlerMouseEnterBody($event)\">\n @if (items().length) {\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div\n [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? ((header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: LibsUiComponentsTableTemplatesComponent, selector: "libs_ui-components-table-templates", inputs: ["isHover", "configs", "templateCssWrapper", "item"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: VirtualScrollerModule }, { kind: "component", type: i2.VirtualScrollerComponent, selector: "virtual-scroller,[virtualScroller]", inputs: ["executeRefreshOutsideAngularZone", "enableUnequalChildrenSizes", "RTL", "useMarginInsteadOfTranslate", "modifyOverflowStyleOfParentScroll", "stripedTable", "scrollbarWidth", "scrollbarHeight", "childWidth", "childHeight", "ssrChildWidth", "ssrChildHeight", "ssrViewportWidth", "ssrViewportHeight", "bufferAmount", "scrollAnimationTime", "resizeBypassRefreshThreshold", "scrollThrottlingTime", "scrollDebounceTime", "checkResizeInterval", "items", "compareItems", "horizontal", "parentScroll"], outputs: ["vsUpdate", "vsChange", "vsStart", "vsEnd"], exportAs: ["virtualScroller"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiPipesConvertObjectToSignalPipe, name: "LibsUiPipesConvertObjectToSignalPipe" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsSortArrowComponent, selector: "libs_ui-components-buttons-sort-arrow", inputs: ["size", "mode", "fieldSort", "disable", "ignorePopoverContent", "popoverContentAsc", "popoverContentDesc", "defaultMode", "zIndex"], outputs: ["modeChange", "outChange"] }, { kind: "component", type: LibsUiComponentsCheckboxSingleComponent, selector: "libs_ui-components-checkbox-single", inputs: ["key", "checked", "label", "classLabelInclude", "ignoreShowPopoverLabel", "typeLabelPopover", "popover", "linkImage", "linkImageError", "avatarConfig", "classImageInclude", "imgTypeIcon", "bullet", "classInclude", "clickExactly", "disable", "disableLabel", "ignoreCheckbox", "zIndexLabel", "stillOtherOptions", "error", "showBorderError", "description", "iconImageClass", "classIconInclude", "modeBorder"], outputs: ["checkedChange", "linkImageChange", "outChange", "outEventPopover", "outClickLabel", "outChangStageFlagMousePopover"] }, { kind: "pipe", type: LibsUiTableCalculatorColumnPipe, name: "LibsUiTableCalculatorColumnPipe" }, { kind: "component", type: LibsUiComponentsSpinnerComponent, selector: "libs_ui-components-spinner", inputs: ["type", "size"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "pipe", type: LibsUiIconsGetIconComponentPipe, name: "LibsUiIconsGetIconComponentPipe" }, { kind: "pipe", type: LibsUiPipesCallFunctionInTemplatePipe, name: "LibsUiPipesCallFunctionInTemplatePipe" }, { kind: "pipe", type: LibsUiPipesCheckSelectedByKeyPipe, name: "LibsUiPipesCheckSelectedByKeyPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
623
660
|
}
|
|
624
661
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsTableComponent, decorators: [{
|
|
625
662
|
type: Component,
|
|
626
663
|
args: [{ selector: 'libs_ui-components-table', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
627
664
|
NgClass, NgStyle, AsyncPipe, NgTemplateOutlet, NgComponentOutlet, LibsUiComponentsTableTemplatesComponent,
|
|
628
|
-
TranslateModule, VirtualScrollerModule, LibsUiComponentsButtonsButtonComponent,
|
|
665
|
+
TranslateModule, VirtualScrollerModule, LibsUiComponentsButtonsButtonComponent, LibsUiPipesConvertObjectToSignalPipe,
|
|
629
666
|
LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsSortArrowComponent,
|
|
630
|
-
LibsUiComponentsCheckboxSingleComponent,
|
|
667
|
+
LibsUiComponentsCheckboxSingleComponent, LibsUiTableCalculatorColumnPipe,
|
|
631
668
|
LibsUiComponentsSpinnerComponent, LibsUiComponentsPopoverComponent,
|
|
632
669
|
LibsUiComponentsScrollOverlayDirective, LibsUiIconsGetIconComponentPipe,
|
|
633
670
|
LibsUiPipesCallFunctionInTemplatePipe, LibsUiPipesCheckSelectedByKeyPipe
|
|
634
|
-
], template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"resetIndexHover($event)\">\n <div #headerElementRef\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (mouseenter)=\"resetIndexHover($event)\">\n @if (headerLeft().length) {\n <div class=\"h-full flex sticky top-0 left-0 z-[1] {{ classHeaderInclude() }}\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n @if (items().length) {\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScroll($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\">\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n\n @if ((!items().length) && !loading() && noDataConfig()) {\n <div class=\"h-full\"\n [style.flex]=\"'0 0 '+headerElementRef.scrollWidth+'px'\">\n </div>\n }\n </div>\n }\n @if ((!items().length) && !loading()) {\n <div class=\"relative h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? (header.ngStyle || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnter($event)\"\n (mouseleave)=\"handlerMouseLeave($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"footer.ngStyle || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"itemFooter\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"] }]
|
|
671
|
+
], template: "<div class='flex flex-col w-full h-full'>\n @if (!ignoreBar()) {\n <div\n class=\"flex items-center relative z-[1] bottom-0 left-0 w-full bg-white libs-ui-table-shadow-bottom {{ classBarInclude() }}\"\n [class.px-[16px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n [class.py-[6px]]=\"keysSelected().length || labelBarNoSelectItem()\"\n (mouseenter)=\"resetIndexHover($event)\">\n <ng-content select='div.libs-ui-table-bar-left'></ng-content>\n @if (!keysSelected().length && labelBarNoSelectItem()) {\n <div class=\"{{ classLabelBarNoSelectItem() ?? 'px-[12px] py-[5px]' }}\"\n [innerHtml]='labelBarNoSelectItem() | translate:{value:totalItemDisplay()}'>\n </div>\n }\n @if (keysSelected().length) {\n <div class=\"flex items-center pl-[12px]\">\n <div class=\"flex items-center h-full mt-[-2px]\">\n <libs_ui-components-checkbox-single [checked]=\"true\"\n [disable]=\"loading() || disableCheckbox()\"\n (outChange)=\"handlerChangeAllChecked()\" />\n </div>\n <div class=\"libs-ui-font-h5m text-[#071631] mr-[8px] {{ classLabelBarButtons() }}\">\n {{ labelBarButtons() | translate:{ value:keysSelected().length } }}\n </div>\n @if (configSelectMoreItem()) {\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{\n widthByParent:false,\n ignoreArrow: true,\n maxHeight: 2048,\n classInclude:'!w-[121px]',\n position: {\n mode:'start',\n distance:0\n }\n }\"\n [listConfig]=\"listConfigMoreItem()\"\n [listHiddenInputSearch]=\"true\"\n [listMaxItemShow]=\"5\"\n class=\"!w-[16px] h-[16px] mr-[8px]\"\n (outSelectKey)=\"handlerSelectedMoreItem($event)\"\n (outFunctionsControl)=\"handlerFunctionControlMoreSelectItem($event)\">\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [classInclude]=\"'!p-0 m-0'\"\n [classIconLeft]=\"'before:!text-[16px] libs-ui-icon-move-right rotate-90 mr-[6px]'\"\n [popover]=\"{config:{content:'i18n_more_select'}}\"\n [ignoreStopPropagationEvent]=\"true\" />\n </libs_ui-components-dropdown>\n }\n <div class=\"h-[16px] libs-ui-border-left-general ml-[16px]\"></div>\n @if (barButtons()?.length) {\n @for (button of barButtons();track button) {\n <libs_ui-components-buttons-button [type]=\"button.type || 'button-link-primary'\"\n [classIconLeft]=\"button.classIconLeft || ''\"\n [classInclude]=\"button.classInclude || ''\"\n [label]=\"(button.label || ' ') | translate\"\n (outClick)=\"handlerBarButtonClick(button)\" />\n }\n }\n </div>\n }\n <ng-content select='div.libs-ui-table-bar-right'></ng-content>\n </div>\n }\n\n <div #tableContainerElementRef\n class=\"libs-ui-table flex flex-col w-full h-full relative {{ classTableContainerInclude() }}\"\n [class.px-[16px]]='!ignoreBar()'\n (mouseleave)=\"handlerMouseLeaveContainer($event)\">\n <div #headerElementRef\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollbarWidth: 0}\"\n [class.libs-ui-border-bottom-dashed-general]=\"!hasItemHightLight() && isDashBorder()\"\n [class.libs-ui-border-bottom-general]=\"!hasItemHightLight() && !isDashBorder()\"\n [class.!hidden]=\"!items().length && isHiddenHeaderWhenNodata()\"\n [class]=\"classHeaderContainer()\"\n (outScroll)=\"handlerScrollHeader($event)\"\n (mouseenter)=\"handlerMouseEnterHeader($event)\">\n @if (headerLeft().length) {\n <div [class]=\"classHeaderLeftContainer()\">\n @for (header of headerLeft();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:true}\" />\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <ng-container *ngTemplateOutlet=\"templateHeaderRef;context:{headerItem:header,isHeaderLeft:false}\" />\n }\n }\n </div>\n @if (showFooter() && itemFooter() && customPositionFooter() === 'top') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n <div class=\"relative flex flex-col w-full h-full overflow-x-hidden bg-white {{ classBodyInclude() || '' }}\">\n <div #bodyElementRef\n class=\"flex h-full w-full relative\"\n LibsUiComponentsScrollOverlayDirective\n [options]=\"{scrollX: (!headerLeft().length || !headerRight()) ? 'hidden':'scroll'}\"\n (outScroll)=\"handlerScrollBody($event)\"\n (outScrollBottom)=\"handlerScrollBottom($event)\"\n (mouseenter)=\"handlerMouseEnterBody($event)\">\n @if (items().length) {\n <virtual-scroller #bodyComponentRef\n [items]=\"items()\"\n [enableUnequalChildrenSizes]=\"enableUnequalChildrenSizes()\"\n class=\"h-full\"\n [style.width.px]=\"headerElementRef.scrollWidth > (bodyElementRef ? bodyElementRef.scrollWidth : 0) ? headerElementRef.scrollWidth: undefined\"\n [parentScroll]=\"bodyElementRef\"\n [bufferAmount]=\"bufferAmount()\">\n @for (data of bodyComponentRef.viewPortItems;track data()) {\n <div #elementHover\n class=\"flex\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\"\n [class.libs-ui-border-top-1px-36d3d3]=\"data().specificHightLight && $first && !ignoreBorderItem()\"\n [class.libs-ui-border-bottom-1px-36d3d3]=\"data().specificHightLight && !ignoreBorderItem()\"\n [ngClass]=\"(data().specificHightLight || ($last && ignoreBorderItemLast())) ? 'libs-ui-border-radius-bottom-left-4px libs-ui-border-radius-bottom-right-4px' : ignoreBorderItem() ? '' : isDashBorder() ? 'libs-ui-border-bottom-dashed-general' : 'libs-ui-border-bottom-general'\"\n [style.width.px]=\"headerElementRef.scrollWidth\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n (mouseenter)=\"setIndexHover($event,data)\"\n (mouseleave)=\"resetIndexHoverWhenMouseLeave($event)\">\n @if (headerLeft().length || headerRight().length) {\n <div class=\"flex flex-col w-full\">\n <div class=\"flex w-full\">\n @if (headerLeft().length) {\n <div class=\"flex sticky top-0 left-0 z-[1]\"\n [class.bg-white]=\"!data().specificHightLight\"\n [class.bg-[#f3fcfc]]=\"data().specificHightLight\">\n @for (header of headerLeft();track header) {\n <div\n class=\"relative flex px-[12px] py-[8px] {{ header.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [class.bg-[#f8f9fa]]=\"itemOfIndexHover === data && !data().specificHightLight\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n </div>\n }\n @if (headerRight().length) {\n @for (header of headerRight();track header) {\n <div class=\"relative flex px-[12px] py-[8px]\"\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n <ng-container *ngTemplateOutlet=\"templateBodyRef;context:{header:header,data:data}\" />\n </div>\n }\n }\n </div>\n @if (configTemplateItemCollapseExpand() && data().specificExpand && data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']) {\n <div [class]=\"configTemplateItemCollapseExpand()?.cssWrapper || 'flex w-full'\">\n @for (dataExpand of data()[configTemplateItemCollapseExpand()?.fieldGetDataExpand || 'specificDataExpand']();track $index) {\n @if (configTemplateItemCollapseExpand()?.colTemplateConfig) {\n <libs_ui-components-table-templates [item]=\"dataExpand\"\n [templateCssWrapper]=\"configTemplateItemCollapseExpand()?.templateCssWrapper\"\n [configs]=\"configTemplateItemCollapseExpand()?.colTemplateConfig\" />\n }\n } @empty {\n <div class=\"relative h-[100px]\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </virtual-scroller>\n } @else if (!loading()) {\n <div class=\"sticky left-0 top-0 z-[1] h-full w-full\">\n <ng-container *ngTemplateOutlet=\"templateNodataRef\" />\n </div>\n }\n </div>\n\n @if (showFooter() && itemFooter() && customPositionFooter() === 'bottom') {\n <ng-container *ngTemplateOutlet='templateFooterRef' />\n }\n\n @if (loading()) {\n <div class=\"absolute w-full h-full z-[2] flex items-center content-center\">\n <libs_ui-components-spinner />\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #templateHeaderRef\n let-header='headerItem'\n let-isHeaderLeft='isHeaderLeft'>\n <div\n [class]=\"'relative flex '+ (header.paddingLeftRightHeaderContainer ?? ' px-[12px] ') + (isHeaderLeft && !header.ignoreBorderRight ? ' libs-ui-border-right-general ' : ' ')+ ' libs-ui-table-header-col '\"\n [class.flex-col]=\"header.rowsConfig\"\n [class.py-[8px]]='!header.ignorePyDefault'\n [ngStyle]=\"(header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})\"\n [ngClass]=\"header.ngClass || {}\">\n @if (!header.rowsConfig) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:header,isColRender:false}\" />\n }\n @if (header.rowsConfig;as rowsConfig) {\n @for (row of rowsConfig.rows;track row) {\n <div [class]=\"row.classRow\">\n @for (col of row.cols ; track col) {\n <ng-container *ngTemplateOutlet=\"templateHeaderContentRef;context:{headerItem:col,isColRender:true}\" />\n }\n </div>\n }\n }\n </div>\n</ng-template>\n\n<ng-template #templateHeaderContentRef\n let-header='headerItem'\n let-isColRender='isColRender'>\n <div class=\"flex libs-ui-font-h6m min-h-[18px] text-[#6a7383] max-w-full\"\n [class.items-center]='header.contentHeaderAlignCenter ?? true'\n [class.justify-end]='header.contentHeaderJustifyContentEnd'\n [class.w-full]=\"header.isShowIndexOnRow\"\n [ngStyle]=\"isColRender ? ((header|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:headerLeft():headerRight()) || (header.isShowIndexOnRow ? {width:'50px','flex-shirk':'0',padding:'8px'} : {})) : {}\"\n [ngClass]=\"isColRender ? (header.ngClass || {}) : {}\">\n @if (header.hasCheckbox) {\n @if (header.hasCheckboxAll) {\n <div class=\"flex h-full {{ header.checkboxAllClassInclude || 'mr-[16px]' }}\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"'all'\"\n [stillOtherOptions]=\"!!keysSelected().length && keysSelected().length !== items().length\"\n [checked]=\"!!keysSelected().length && keysSelected().length === items().length\"\n [disable]=\"loading()\"\n [classInclude]=\"header.checkboxClassInclude\"\n (outChange)=\"handlerChangeCheckedAllItems($event)\" />\n </div>\n } @else {\n <div class=\"flex h-full ml-[24px] {{ header.checkboxClassInclude }}\">\n </div>\n }\n }\n\n @if (header.isShowIndexOnRow) {\n <div class=\"flex w-full h-full items-center justify-center {{ header.classIncludeIndexOnRow || '' }}\">\n {{ header.label ?? '#' }}\n </div>\n } @else {\n @if ((header.label | LibsUiPipesCallFunctionInTemplatePipe:header.parseValue:header) | async | translate; as labelHeaderColumn) {\n <libs_ui-components-popover [type]=\"header?.labelConfig?.type || 'text'\"\n [mode]=\"header?.labelConfig?.mode || 'hover'\"\n [classInclude]=\"(header?.labelConfig?.classInclude || '')\"\n [ignoreShowPopover]=\"header?.labelConfig?.ignoreShowTooltip || false\"\n [config]=\"header.labelConfig?.config || {content:labelHeaderColumn}\"\n [innerHTML]=\"labelHeaderColumn\" />\n }\n }\n\n @if (header.tooltipOther; as tooltip) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-popover [type]=\"tooltip?.type || 'other'\"\n [mode]=\"tooltip?.mode || 'hover'\"\n [classInclude]=\"tooltip.classInclude || 'text-[#6a7383]'\"\n [ignoreShowPopover]=\"tooltip.ignoreShowTooltip || false\"\n [config]=\"tooltip.config || {content:(tooltip.dataView || ' ') | translate, position: {\n mode: 'center',\n distance: 0,\n autoUpdatePosition: {\n endDistance: 12,\n startDistance: -12\n }\n }}\"\n [innerHTML]=\"tooltip.dataView\" />\n </div>\n }\n\n @if (header.hasSort && header.orderby) {\n <div class=\"ml-[4px]\">\n <libs_ui-components-buttons-sort-arrow [disable]=\"loading() || !items().length\"\n [fieldSort]=\"header.orderby\"\n [ignorePopoverContent]=\"header.sortIgnoreTooltipContent ?? true\"\n [popoverContentAsc]=\"header.sortTooltipContentAsc\"\n [popoverContentDesc]=\"header.sortTooltipContentDesc\"\n [defaultMode]=\"header.defaultMode\"\n [zIndex]=\"header.zIndexTooltipSort\"\n (outChange)=\"handlerChangeSort($event)\" />\n </div>\n }\n </div>\n @if (header.labelDescription) {\n <div class=\"flex\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"header.labelDescription.classInclude || ''\"\n [config]=\"{content: header.labelDescription.content | translate}\"\n [innerHTML]=\"header.labelDescription.content | translate\" />\n </div>\n }\n</ng-template>\n\n<ng-template #templateBodyRef\n let-header='header'\n let-data='data'>\n <div class=\"flex w-full h-full\">\n @if (header.hasCheckbox) {\n <div class=\"flex h-full\"\n [class.invisible]=\"header.checkConditionCheckBoxHidden &&( data() | LibsUiPipesCallFunctionInTemplatePipe:header.checkConditionCheckBoxHidden:data() | async)\"\n [class.items-center]=\"header.checkboxAlignCenter\">\n <libs_ui-components-checkbox-single [key]=\"data()[fieldKey()]\"\n [classInclude]=\"header.checkboxClassInclude\"\n [checked]=\"data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length\"\n [disable]=\"loading() || disableCheckbox() || !!(maxItemSelected() && !(data()[fieldKey()] | LibsUiPipesCheckSelectedByKeyPipe:keysSelected():keysSelected().length) && keysSelected().length >= maxItemSelected())\"\n (outChange)=\"handlerChangeItemChecked($event,data())\" />\n </div>\n }\n\n @if (header.isShowIndexOnRow; as config) {\n <div class=\"w-full flex items-center justify-center libs-ui-font-h4r{{ config.classIncludeIndexOnRow || '' }}\">\n <div LibsUiComponentsPopoverDirective\n [type]=\"'text'\"\n [config]=\"{}\"\n [innerHTML]=\"data | LibsUiPipesCallFunctionInTemplatePipe:getIndexRow | async\">\n </div>\n </div>\n }\n\n @if (header.colTemplateConfig) {\n <libs_ui-components-table-templates [isHover]=\"itemOfIndexHover === data && !data.specificHightLight\"\n [class]=\"header.templateCssWrapperHost || ''\"\n [item]=\"data\"\n [templateCssWrapper]=\"header.templateCssWrapper\"\n [configs]=\"header.colTemplateConfig\" />\n }\n </div>\n</ng-template>\n\n<ng-template #templateFooterRef>\n @if (!isHiddenHeaderWhenNodata() || (isHiddenHeaderWhenNodata() && items().length)) {\n <div #footerElementRef\n class=\"flex w-full bg-[#f8f9fa] overflow-x-hidden z-[1] {{ ignoreBorderFooter() ? '': (customPositionFooter() === 'top' ? 'libs-ui-border-bottom-general':'libs-ui-table-shadow-top libs-ui-border-top-general') }} min-h-[35px]\"\n (mouseenter)=\"handlerMouseEnterFooter($event)\"\n (mouseleave)=\"handlerMouseLeaveFooter($event)\">\n @if (footerLeft()) {\n <div #footerLeftElementRef\n class=\"flex sticky top-0 left-0 z-[1] bg-[#f8f9fa]\">\n @for (footer of footerLeft();track footer) {\n <div\n class=\"flex items-center px-[12px] py-[8px] {{ footer.ignoreBorderRight ? '': 'libs-ui-border-right-general' }}\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n </div>\n }\n @if (footerRight()) {\n @for (footer of footerRight();track footer) {\n <div class=\"flex items-center px-[12px] py-[8px]\"\n [ngStyle]=\"(footer|LibsUiTableCalculatorColumnPipe:headerElementRef.clientWidth:footerLeft():footerRight()) || {}\"\n [ngClass]=\"footer.ngClass || {}\">\n @if (footer.colTemplateConfig && itemFooter()) {\n <libs_ui-components-table-templates [item]=\"itemFooter|LibsUiPipesConvertObjectToSignalPipe\"\n [templateCssWrapper]=\"footer.templateCssWrapper\"\n [configs]=\"footer.colTemplateConfig\" />\n }\n </div>\n }\n }\n\n </div>\n }\n</ng-template>\n\n<ng-template #templateNodataRef>\n @if (noDataConfig(); as config) {\n <div class=\"flex items-center justify-center w-full h-full absolute left-0 top-0 z-[1]\">\n <div class=\"flex flex-col items-center justify-center w-full h-full shrink-0\"\n LibsUiComponentsScrollOverlayDirective>\n @if (!keySearch() && !onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\" ('no-data' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textNoData | translate\">\n </div>\n }\n @if (keySearch() || onlyShowNoResult()) {\n <ng-container *ngComponentOutlet=\"('no-result' | LibsUiIconsGetIconComponentPipe | async);inputs:{size:64}\" />\n <div class=\"libs-ui-table-no-data-config-text\"\n [ngStyle]=\"config.ngStyle || {}\"\n [ngClass]=\"config.ngClass || {}\"\n [innerHtml]=\"config.textSearchNoData | translate\">\n </div>\n }\n </div>\n </div>\n }\n</ng-template>\n", styles: [".libs-ui-table-header-container{height:33px;flex-shrink:0}.libs-ui-table-header-col{height:100%;width:100%;align-items:center}.libs-ui-table-no-data-config-text{margin-top:16px;font-size:12px;color:#9ca2ad;font-family:var(--libs-ui-font-family-name, \"Arial\");font-weight:400}.libs-ui-table-no-data-config-icon{margin-bottom:12px}.libs-ui-table-no-data-config-icon:before{font-size:84px;color:#c1c1c1}.libs-ui-table-shadow-bottom{box-shadow:0 1px 1px #00143305,0 4px 8px #0014330a}@media only screen and (min-width: 1921px){.libs-ui-border-bottom-general{border-bottom:solid 2px #e6e8ed!important}}\n"] }]
|
|
635
672
|
}], ctorParameters: () => [] });
|
|
636
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUE0QixxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pGLE9BQU8sRUFBc0Isd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoSCxPQUFPLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkvRSxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7OztBQW9CMUYsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxlQUFlO0lBQ0wsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLDhDQUE4QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLHlDQUF5QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzNNLFlBQVksR0FBRyxNQUFNLENBQWEsRUFBRSxDQUFDLENBQUM7SUFDdEMsT0FBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNqQyxNQUFNLEdBQUcsTUFBTSxDQUFxQyxFQUFFLENBQUMsQ0FBQztJQUN4RCxLQUFLLEdBQUcsTUFBTSxDQUFxQyxFQUFFLENBQUMsQ0FBQztJQUN2RCxVQUFVLEdBQUcsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLGdCQUFnQixDQUF3QjtJQUN4QyxTQUFTLEdBQUcsTUFBTSxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLGtCQUFrQixHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztJQUN2QyxpQkFBaUIsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDM0MsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwSCxrQkFBa0IsR0FBRyxRQUFRLENBQWtCLEdBQUcsRUFBRTtRQUM1RCxPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU07WUFDWixrQkFBa0IsRUFBRSxNQUFNLENBQUM7Z0JBQ3pCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxRQUFRO2dCQUMvQyxrQkFBa0IsRUFBRSxNQUFNLENBQUM7b0JBQ3pCLE1BQU0sRUFBRSxJQUFJO2lCQUNiLENBQUM7YUFDSCxDQUFDO1lBQ0YsZUFBZSxFQUFFLE1BQU0sQ0FBQztnQkFDdEIsWUFBWSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFVBQVUsQ0FBQztnQkFDdkUsWUFBWSxFQUFFLE1BQU07Z0JBQ3BCLGNBQWMsRUFBRSxFQUFFO2FBQ25CLENBQUM7U0FDSCxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFTSxTQUFTLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQ25DLFlBQVksR0FBRyxNQUFNLENBQW9CLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELDhCQUE4QixHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUN4RCxXQUFXLEdBQUcsTUFBTSxDQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLGNBQWMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDeEMsa0JBQWtCLEdBQUcsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDekQsNkJBQTZCLENBQWlDO0lBQzlELFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXhDLFlBQVk7SUFDSCxtQkFBbUIsR0FBRyxLQUFLLENBQTZCLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLFVBQVUsR0FBRyxLQUFLLENBQW1FLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFILFdBQVcsR0FBRyxLQUFLLENBQW1FLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNILGdDQUFnQyxHQUFHLEtBQUssRUFBcUMsQ0FBQztJQUM5RSxVQUFVLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDOUIsa0JBQWtCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDdEMsb0JBQW9CLEdBQUcsS0FBSyxDQUFpRCxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM5SCxVQUFVLEdBQUcsS0FBSyxFQUF5QyxDQUFDO0lBQzVELFdBQVcsR0FBRyxLQUFLLEVBQXlDLENBQUM7SUFDN0QsZUFBZSxHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakcsMEJBQTBCLEdBQUcsS0FBSyxDQUErQixLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1RyxZQUFZLEdBQUcsS0FBSyxDQUE2QixDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMxRyxTQUFTLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDNUIsWUFBWSxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ2hDLGtCQUFrQixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3JDLGdCQUFnQixHQUFHLEtBQUssQ0FBNkIsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUYsa0JBQWtCLEdBQUcsS0FBSyxDQUE2QixFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RiwwQkFBMEIsR0FBRyxLQUFLLENBQTZCLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLGVBQWUsR0FBRyxLQUFLLENBQVMsMkJBQTJCLENBQUMsQ0FBQztJQUU3RCxRQUFRLEdBQUcsS0FBSyxDQUE2QixJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUNoSSxtQkFBbUIsR0FBRyxLQUFLLEVBQWMsQ0FBQztJQUMxQyxvQkFBb0IsR0FBRyxLQUFLLENBQVMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUN0RyxlQUFlLEdBQUcsS0FBSyxDQUE2QiwyQkFBMkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSwyQkFBMkIsRUFBRSxDQUFDLENBQUMsQ0FBQyx5Q0FBeUM7SUFDckwsb0JBQW9CLEdBQUcsS0FBSyxDQUE2QixFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUN4SSxVQUFVLEdBQUcsS0FBSyxFQUFrQixDQUFDO0lBQ3JDLFNBQVMsR0FBRyxLQUFLLEVBQVcsQ0FBQyxDQUFDLGlHQUFpRztJQUMvSCxpQkFBaUIsR0FBRyxLQUFLLEVBQXFCLENBQUM7SUFDL0MsZUFBZSxHQUFHLEtBQUssRUFBc0IsQ0FBQztJQUM5QyxxQkFBcUIsR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFDcEQsT0FBTyxHQUFHLEtBQUssRUFBdUIsQ0FBQztJQUN2QyxNQUFNLEdBQUcsS0FBSyxDQUE2RCxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEosU0FBUyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQzdCLHlCQUF5QixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQzVDLG1CQUFtQixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ3ZDLFlBQVksR0FBRyxLQUFLLENBQXFCLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUNqSCxvQkFBb0IsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUN4Qyx3QkFBd0IsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM1QyxlQUFlLEdBQUcsS0FBSyxDQUE2QixHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMzRixvQkFBb0IsR0FBRyxLQUFLLEVBQXlCLENBQUM7SUFDdEQsZ0JBQWdCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDcEMsZ0JBQWdCLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFFN0MsYUFBYTtJQUVKLFdBQVcsR0FBRyxNQUFNLEVBQWtCLENBQUM7SUFDdkMsZUFBZSxHQUFHLE1BQU0sRUFBa0IsQ0FBQztJQUMzQyxVQUFVLEdBQUcsTUFBTSxFQUFXLENBQUM7SUFDL0Isb0JBQW9CLEdBQUcsTUFBTSxFQUEyQixDQUFDO0lBQ3pELE9BQU8sR0FBRyxNQUFNLEVBQWMsQ0FBQztJQUMvQixpQkFBaUIsR0FBRyxNQUFNLEVBQW1CLENBQUM7SUFDOUMsb0JBQW9CLEdBQUcsTUFBTSxFQUEyQixDQUFDO0lBQ3pELGVBQWUsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFDakQsbUJBQW1CLEdBQUcsTUFBTSxFQUE4QixDQUFDO0lBQzNELG1CQUFtQixHQUFHLE1BQU0sRUFBOEMsQ0FBQztJQUMzRSxZQUFZLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFDaEMsZ0JBQWdCLEdBQUcsTUFBTSxFQUFzQixDQUFDO0lBRXpELGdCQUFnQjtJQUNOLGdCQUFnQixHQUFHLFNBQVMsQ0FBYSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLFNBQVMsQ0FBYSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzdELG9CQUFvQixHQUFHLFNBQVMsQ0FBYSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3ZFLGNBQWMsR0FBRyxTQUFTLENBQWEsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxnQkFBZ0IsR0FBRyxTQUFTLENBQTJCLGtCQUFrQixDQUFDLENBQUM7SUFBQSxDQUFDO0lBRXBGLFlBQVk7SUFDSixrQkFBa0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN0RCxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFeEM7UUFDRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDdkMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUM5RixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pFLE9BQU87WUFDVCxDQUFDO1lBQ0QsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7b0JBQ2xHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDM0YsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFFekosT0FBTztnQkFDVCxDQUFDO2dCQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztRQUVMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDNUIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDeEMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN0RCxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7Z0JBQ3RCLE9BQU87WUFDVCxDQUFDO1lBQ0QsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pELGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtTQUM5QyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6RSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLFdBQVcsR0FBRyxDQUFDLElBQXFDLEVBQUUsRUFBRTtRQUNoRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQTtJQUVPLGtCQUFrQjtRQUN4QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBOEIsQ0FBQztJQUM3RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWtCLEVBQUUsaUJBQTJCO1FBQzVFLElBQUksQ0FBQztZQUNILElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUN2RSxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsY0FBYyxFQUFFLDZCQUE2QixFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBd0IsQ0FBQztZQUV2RyxJQUFJLDZCQUE2QixJQUFJLENBQUMsNkJBQTZCLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUN2Ryw2QkFBNkIsQ0FBQyxXQUFXLEdBQUc7b0JBQzFDLGFBQWEsRUFBRSwyQ0FBMkM7b0JBQzFELFdBQVcsRUFBRSxLQUFLO29CQUNsQixjQUFjLEVBQUUsVUFBVTtpQkFDM0IsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLDZCQUE2QixJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUN6Ryw2QkFBNkIsQ0FBQyxhQUFhLEdBQUc7b0JBQzVDLGFBQWEsRUFBRSxzQ0FBc0M7b0JBQ3JELFdBQVcsRUFBRSxLQUFLO29CQUNsQixjQUFjLEVBQUUsWUFBWTtpQkFDN0IsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQixDQUFDO2dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1lBQ25RLENBQUM7WUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBd0IsQ0FBQyxDQUFDO1lBRW5HLElBQUksU0FBUyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7WUFDalAsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQTJCLENBQUMsQ0FBQztRQUMxRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVTLGVBQWU7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxjQUFjLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQXdCLENBQUM7UUFFN0csSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzdMLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQXdCLENBQUMsQ0FBQztRQUV6RyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQXNCLEVBQUUsUUFBaUIsRUFBRSxnQkFBMEIsRUFBRSxrQkFBNEIsRUFBRSxnQkFBMEI7UUFDcEosSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBdUMsRUFBRSxDQUFDO1FBRXhELEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMvQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7Z0JBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBRTVDLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsT0FBb0M7UUFDekQsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUcsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFvQixFQUFFLGtCQUE0QjtRQUMxRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFFckIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbkMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDO3dCQUM5QyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNoQixPQUFPLEtBQUssQ0FBQztvQkFDZixDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUVILE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN6QixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBRXJCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ25DLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQzt3QkFDOUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsT0FBTyxLQUFLLENBQUM7b0JBQ2YsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQztnQkFFSCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4RCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sUUFBUTtRQUNkLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRVMsYUFBYSxDQUFDLENBQU07UUFDNUIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsRUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDaEYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVTLG1CQUFtQixDQUFDLENBQVE7UUFDcEMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU8sUUFBUTtRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBd0Q7UUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVTLHVCQUF1QjtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyw0QkFBNEIsQ0FBQyxLQUFxQjtRQUMxRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxSixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXpELE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sS0FBSyxDQUFDLCtCQUErQixDQUFDLElBQWlDO1FBQzdFLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEcsYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBb0MsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDN0gsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN0RyxhQUFhLEdBQUcsTUFBTSxhQUFhLENBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUFvQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUM5SCxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVTLHdCQUF3QixDQUFDLEtBQW9CLEVBQUUsSUFBaUI7UUFDeEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxJQUFXO1FBQ3JDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNoQixJQUFJLEVBQUUsSUFBSTtZQUNWLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQVc7UUFDbEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBRW5JLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRXRFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM3RCxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ25ELE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDckQsQ0FBQztnQkFFRCxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztnQkFFRCxPQUFPLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRVMsb0NBQW9DLENBQUMsZUFBOEM7UUFDM0YsSUFBSSxDQUFDLDZCQUE2QixHQUFHLGVBQWUsQ0FBQztJQUN2RCxDQUFDO0lBRVMsdUJBQXVCLENBQUMsS0FBaUM7UUFDakUsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ3pELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEtBQUssRUFBRSxDQUFDO1FBRTVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzdFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFlBQVksQ0FBQztRQUVqRSxJQUFJLFdBQVcsR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFaEcsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2xELEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx3QkFBd0IsQ0FBQyxPQUF3QjtRQUN2RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsY0FBYyxDQUFDO1FBRTlELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFVBQVUsSUFBSSxVQUFVLENBQUM7UUFFekUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFakMsSUFBSSxRQUFRLFlBQVksVUFBVSxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBRXhELFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0MsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUV0QyxPQUFPLGNBQWMsQ0FBQztZQUN4QixDQUFDO1lBRUQsSUFBSSxRQUFRLFlBQVksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUV4RCxHQUFHLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFFbkMsT0FBTyxjQUFjLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRVMsa0JBQWtCLENBQUMsSUFBa0MsRUFBRSxrQkFBdUIsRUFBRSxNQUFlO1FBQ3ZHLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVTLHFCQUFxQixDQUFDLE1BQWU7UUFDN0MsTUFBTSxLQUFLLEdBQStCLEVBQUUsQ0FBQztRQUU3QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRWxGLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDakMsTUFBTTtZQUNOLEtBQUs7WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN6QixnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7Z0JBQ3JCLE9BQU87WUFDVCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLDBCQUEwQixDQUFDLFNBQTZCO1FBQ2hFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxTQUFTLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFUyxhQUFhLENBQUMsQ0FBUSxFQUFFLElBQWlDO1FBQ2pFLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV2QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVTLDZCQUE2QixDQUFDLENBQVM7UUFDL0MsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBRXBELFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0UsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRVMsZUFBZSxDQUFDLENBQVM7UUFDakMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLDhCQUE4QixFQUFFLEVBQUUsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVTLGlCQUFpQixDQUFDLEtBQVk7UUFDdEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVTLGlCQUFpQixDQUFDLEtBQVk7UUFDdEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDeEYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsYUFBYSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQW1CO1FBQy9CLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVc7UUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRW5DLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDM0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDeEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3BGLENBQUM7Z0JBQ0QsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO3dCQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBYyxXQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsQ0FBQztJQUM5QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO3dHQW5yQlUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsdXZPQzVDM0MsOGtuQkEyWUEsbXBCRHhXSSxPQUFPLG9GQUFFLE9BQU8sc0VBQUUsU0FBUyw4Q0FBRSxnQkFBZ0Isb0pBQUUsaUJBQWlCLG9QQUFFLHVDQUF1Qyw0SUFDekcsZUFBZSwyRkFBRSxxQkFBcUIsdXRCQUFFLHNDQUFzQyxpaEJBQzlFLGlDQUFpQyxtMERBQUUseUNBQXlDLHNRQUM1RSx1Q0FBdUMsZ25CQUN2QyxnQ0FBZ0MsaUdBQUUsZ0NBQWdDLHFlQUNsRSxzQ0FBc0MseVFBQUUsK0JBQStCLG1FQUN2RSxxQ0FBcUMseUVBQUUsaUNBQWlDOzs0RkFHL0QsOEJBQThCO2tCQWpCMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FHeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLHVDQUF1Qzt3QkFDekcsZUFBZSxFQUFFLHFCQUFxQixFQUFFLHNDQUFzQzt3QkFDOUUsaUNBQWlDLEVBQUUseUNBQXlDO3dCQUM1RSx1Q0FBdUM7d0JBQ3ZDLGdDQUFnQyxFQUFFLGdDQUFnQzt3QkFDbEUsc0NBQXNDLEVBQUUsK0JBQStCO3dCQUN2RSxxQ0FBcUMsRUFBRSxpQ0FBaUM7cUJBQ3pFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVNvcnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNvcnQnO1xuaW1wb3J0IHsgSUNoZWNrYm94SXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwXCI7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXCI7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXlcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lclwiO1xuaW1wb3J0IHsgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB9IGZyb20gXCJAbGlicy11aS9pY29uc1wiO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSBcIkBsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGVcIjtcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSwgcmV0dXJuTGlzdE9iamVjdCB9IGZyb20gXCJAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3RcIjtcbmltcG9ydCB7IGNsb25lRGVlcCwgY29udmVydE9iamVjdFRvU2lnbmFsLCBkZWxldGVVbmljb2RlLCBnZXQsIHNldCwgdmlld0RhdGFOdW1iZXJCeUxhbmd1YWdlIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBvZiwgU3ViamVjdCwgdGFrZVVudGlsLCB0aW1lciB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBJQnV0dG9uQmFyRXZlbnQsIElDb25maWdTZWxlY3RNb3JlSXRlbSwgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLCBJSG92ZXJCdXR0b25BY3Rpb25FdmVudCwgSUxvYWRNb3JlRXZlbnQsIElTb3J0RXZlbnQsIElUYWJlbEJ1dHRvbkFjdGlvbkV2ZW50LCBJVGFibGVGb290ZXJDb25maWcsIElUYWJsZUhlYWRlckNvbmZpZywgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX1RBQkxFLCBUWVBFX0lURU1fREFUQV9UQUJMRSwgVFlQRV9ORVdfREFUQV9UQUJMRSwgVFlQRV9UQUJMRV9GSUxURVIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gXCIuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElUYWJsZU5vRGF0YUNvbmZpZyB9IGZyb20gXCIuL2ludGVyZmFjZXMvbm8tZGF0YS1jb25maWcuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tIFwiLi90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGlzdFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsIE5nU3R5bGUsIEFzeW5jUGlwZSwgTmdUZW1wbGF0ZU91dGxldCwgTmdDb21wb25lbnRPdXRsZXQsIExpYnNVaUNvbXBvbmVudHNUYWJsZVRlbXBsYXRlc0NvbXBvbmVudCxcbiAgICBUcmFuc2xhdGVNb2R1bGUsIFZpcnR1YWxTY3JvbGxlck1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsIExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCBjbGFzc0hlYWRlckNvbnRhaW5lciA9IGNvbXB1dGVkKCgpID0+IGBsaWJzLXVpLXRhYmxlLWhlYWRlci1jb250YWluZXIgdy1mdWxsIGZsZXggJHt0aGlzLmlnbm9yZUNsYXNzQmdIZWFkZXIoKSA/ICcnIDogJ2JnLXdoaXRlJ30gb3ZlcmZsb3cteC1oaWRkZW4gei1bMV0gaXRlbXMtY2VudGVyICR7dGhpcy5jbGFzc0hlYWRlckluY2x1ZGUoKSB8fCAnJ31gKVxuICBwcm90ZWN0ZWQga2V5c1NlbGVjdGVkID0gc2lnbmFsPEFycmF5PGFueT4+KFtdKTtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgc3RvcmVzID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1zID0gc2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KFtdKTtcbiAgcHJvdGVjdGVkIGl0ZW1Gb290ZXIgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJvdGVjdGVkIGl0ZW1PZkluZGV4SG92ZXI/OiBUWVBFX0lURU1fREFUQV9UQUJMRTtcbiAgcHJvdGVjdGVkIGtleVNlYXJjaCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbUluQmFja2VuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgaGFzSXRlbUhpZ2h0TGlnaHQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSgodGhpcy50b3RhbEl0ZW0oKSA/PyB0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpKSwgZmFsc2UpKTtcbiAgcHJvdGVjdGVkIGxpc3RDb25maWdNb3JlSXRlbSA9IGNvbXB1dGVkPElMaXN0Q29uZmlnSXRlbT4oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICBjb25maWdUZW1wbGF0ZVRleHQ6IHNpZ25hbCh7XG4gICAgICAgIGZpZWxkS2V5OiAna2V5JyxcbiAgICAgICAgaWdub3JlSWNvblNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBnZXRWYWx1ZTogdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5nZXRWYWx1ZSxcbiAgICAgICAgY29uZmlnTGFiZWxQb3BvdmVyOiBzaWduYWwoe1xuICAgICAgICAgIHpJbmRleDogMTIwMFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBodHRwUmVxdWVzdERhdGE6IHNpZ25hbCh7XG4gICAgICAgIHNlcnZpY2VPdGhlcjogcmV0dXJuTGlzdE9iamVjdCh0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/Lmxpc3RPcHRpb24pLFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdsaXN0JyxcbiAgICAgICAgYXJndW1lbnRzVmFsdWU6IFtdXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICBwcml2YXRlIGhhc1Njcm9sbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaW5zdGFuY2VTb3J0ID0gc2lnbmFsPElTb3J0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcGFnaW5nU3RvcmUgPSBzaWduYWw8SVBhZ2luZz4oe30pO1xuICBwcml2YXRlIGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIElOUFVUICovXG4gIHJlYWRvbmx5IHRpbWVIaWdobGlnaE5ld0l0ZW0gPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMjAwMCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMjAwMCB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyTGVmdCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gW10gfSk7XG4gIHJlYWRvbmx5IGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kID0gaW5wdXQ8SUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kPigpO1xuICByZWFkb25seSBzaG93Rm9vdGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVyRm9vdGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY3VzdG9tUG9zaXRpb25Gb290ZXIgPSBpbnB1dDwndG9wJyB8ICdib3R0b20nLCAndG9wJyB8ICdib3R0b20nIHwgdW5kZWZpbmVkPignYm90dG9tJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJ2JvdHRvbScgfSk7XG4gIHJlYWRvbmx5IGZvb3RlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBmb290ZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVDaGVja2JveCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGJ1ZmZlckFtb3VudCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPig1LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/ICh2YWwgPiAyNSA/IDI1IDogdmFsKSA6IDUgfSlcbiAgcmVhZG9ubHkgdG90YWxJdGVtID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBpc0Rhc2hCb3JkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzQm9keUluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0Zvb3RlckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQmFySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJ2p1c3RpZnktYmV0d2VlbiBtYi1bMTZweF0nKTtcblxuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaWQnIH0pOyAvLyB0w6puIGZpZWxkIMSR4buLbmggZGFuaCBpdGVtIGPhu6dhIGxpc3REYXRhc1xuICByZWFkb25seSBkZWZhdWx0S2V5c1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KGBpMThuX3RvdGFsX3F1YW50aXR5YCk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBsYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBjbGFzc0xhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBiYXJCdXR0b25zID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IHNvcnRMb2NhbCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRyxrDhu51uZyBo4bujcCBu4bq/dSBzb3J0TG9jYWwgbsOgeSBraMO0bmcgxJHDoXAg4bupbmcgxJHGsOG7o2MgbmdoaeG7h3AgduG7pSB0aMOsIG3hu5tpIGPDom4gbmjhuq9jIHPhu60gZOG7pW5nIGZpbHRlckxvY2FsXG4gIHJlYWRvbmx5IGZpbHRlck9yU29ydExvY2FsID0gaW5wdXQ8VFlQRV9UQUJMRV9GSUxURVI+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YSA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhRm9vdGVyID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBuZXdEYXRhID0gaW5wdXQ8VFlQRV9ORVdfREFUQV9UQUJMRT4oKTtcbiAgcmVhZG9ubHkgZmlsdGVyID0gaW5wdXQ8VFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSB8IHVuZGVmaW5lZD4oeyBmaWx0ZXJEYXRhOiB7fSB9LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB7IGZpbHRlckRhdGE6IHt9IH0gfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsYXNzQmdIZWFkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBub0RhdGFDb25maWcgPSBpbnB1dDxJVGFibGVOb0RhdGFDb25maWc+KHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0pO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogT1VUUFVUICovXG5cbiAgcmVhZG9ubHkgb3V0TG9hZE1vcmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNjcm9sbElzR29uZSA9IG91dHB1dDxJTG9hZE1vcmVFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZGluZyA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbkFjdGlvbiA9IG91dHB1dDxJVGFiZWxCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U29ydCA9IG91dHB1dDxJU29ydEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0JhckJ1dHRvbiA9IG91dHB1dDxJQnV0dG9uQmFyRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEhvdmVyQnV0dG9uQWN0aW9uID0gb3V0cHV0PElIb3ZlckJ1dHRvbkFjdGlvbkV2ZW50PigpO1xuICByZWFkb25seSBvdXRLZXlzU2VsZWN0ZWQgPSBvdXRwdXQ8eyBrZXlzOiBBcnJheTxhbnk+IH0+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWREYXRhQ29tcGxldGUgPSBvdXRwdXQ8V3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+PigpO1xuICByZWFkb25seSBvdXRUb3RhbEl0ZW0gPSBvdXRwdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUVycm9yID0gb3V0cHV0PElIdHRwUmVzcG9uc2VFcnJvcj4oKTtcblxuICAvKipWSUVXIENISUxEICovXG4gIHByb3RlY3RlZCBoZWFkZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdoZWFkZXJFbGVtZW50UmVmJyk7XG4gIHByb3RlY3RlZCBmb290ZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmb290ZXJFbGVtZW50UmVmJyk7XG4gIHByb3RlY3RlZCBmb290ZXJMZWZ0RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyTGVmdEVsZW1lbnRSZWYnKTtcbiAgcHJpdmF0ZSBib2R5RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignYm9keUVsZW1lbnRSZWYnKTtcbiAgcHJpdmF0ZSBib2R5Q29tcG9uZW50UmVmID0gdmlld0NoaWxkPFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudD4oJ2JvZHlDb21wb25lbnRSZWYnKTs7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZShrZXlzID0+IChbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5ld0RhdGEoKT8uZGF0YSgpLmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hZGRJdGVtcyh0aGlzLm5ld0RhdGEoKT8uZGF0YSBhcyBhbnksICF0aGlzLm5ld0RhdGEoKT8uYWRkVG9MYXN0TGlzdCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHRoaXMuZmlsdGVyKCkuaWdub3JlQ2FsbEFwaUF1dG8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlTZWFyY2guc2V0KGdldDxhbnk+KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi4odGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHt9KSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pIHx8IFtdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7XG4gICAgICByZXNldDogdGhpcy5yZXNldC5iaW5kKHRoaXMpLFxuICAgICAgY2FsbEFwaUJ5U2VydmljZTogdGhpcy5jYWxsQXBpQnlTZXJ2aWNlLmJpbmQodGhpcyksXG4gICAgICByZXNldFNjcm9sbDogdGhpcy5yZXNldFNjcm9sbC5iaW5kKHRoaXMpLFxuICAgICAgYWRkSXRlbXM6IHRoaXMuYWRkSXRlbXMuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUl0ZW1zOiB0aGlzLnJlbW92ZUl0ZW1zLmJpbmQodGhpcyksXG4gICAgICBnZXRDb3VudDogdGhpcy5nZXRDb3VudC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcbiAgICB9KTtcblxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY3JvbGxDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUNvbXBvbmVudFJlZigpIGFzIFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsbEFwaUJ5U2VydmljZShmaXJzdENhbGw6IGJvb2xlYW4sIHJlc2V0QWZ0ZXJDYWxsQXBpPzogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGEoKSB8fCB0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmxvYWRlZExhc3RJdGVtKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICAgIGlmIChndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSAmJiAhZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSA9IHtcbiAgICAgICAgICBmaWVsZEdldFZhbHVlOiAnc3RvcmVQYXJhbXNDYWxsQXBpLmluc3RhbmNlU29ydC5maWVsZFNvcnQnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX2J5J1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIGlmICghcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmZha2VSZXNwb25zZUFwaSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnKTtcblxuICAgICAgaWYgKGZpcnN0Q2FsbCAmJiByZXNldEFmdGVyQ2FsbEFwaSkge1xuICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZ2luZ1N0b3JlLnNldChyZXN1bHQucGFnaW5nKTtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnNldChyZXN1bHQucGFnaW5nPy50b3RhbF9pdGVtcyB8fCAwKTtcbiAgICAgIHRoaXMub3V0VG90YWxJdGVtLmVtaXQodGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSk7XG4gICAgICBpZiAoIXRoaXMucGFnaW5nU3RvcmUoKSkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCksIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRkSXRlbXMoY29udmVydE9iamVjdFRvU2lnbmFsKHJlc3VsdC5kYXRhIHx8IFtdKSwgZmFsc2UsIHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLmVtaXQodGhpcy5zdG9yZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLm91dExvYWREYXRhRXJyb3IuZW1pdChlcnJvciBhcyBJSHR0cFJlc3BvbnNlRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZmFrZVJlc3BvbnNlQXBpKCk6IFRZUEVfT0JKRUNUIHtcbiAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQoe30pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCksIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEl0ZW1zKGl0ZW1zOiBUWVBFX0RBVEFfVEFCTEUsIGFkZEZpcnN0OiBib29sZWFuLCBpZ25vcmVIaWdodExpZ2h0PzogYm9vbGVhbiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbiwgYXV0b0NvdW50TmV3SXRlbT86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWl0ZW1zKCkgfHwgIWl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zQWRkOiBBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+ID0gW107XG5cbiAgICBpdGVtcygpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY2hlY2tFeGlzdEl0ZW0oaXRlbSkpIHtcbiAgICAgICAgaXRlbXNBZGQucHVzaChpdGVtKTtcbiAgICAgICAgaWYgKCFpZ25vcmVIaWdodExpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5oYXNJdGVtSGlnaHRMaWdodC5zZXQodHJ1ZSk7XG4gICAgICAgICAgaXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0hpZ2h0TGlnaHQ6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhZGRGaXJzdCkge1xuICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGRhdGEgPT4gW2l0ZW0sIC4uLmRhdGFdKTtcbiAgICAgICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoZGF0YSA9PiBbaXRlbSwgLi4uZGF0YV0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGRhdGEgPT4gWy4uLmRhdGEsIGl0ZW1dKTtcbiAgICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKGRhdGEgPT4gWy4uLmRhdGEsIGl0ZW1dKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYXV0b0NvdW50TmV3SXRlbSAmJiBpdGVtc0FkZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSh2YWx1ZSA9PiB2YWx1ZSArIGl0ZW1zQWRkLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmICghaWdub3JlSGlnaHRMaWdodCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGl0ZW1zQWRkLmZvckVhY2goaXRlbSA9PiBpdGVtLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIHNwZWNpZmljSGlnaHRMaWdodDogZmFsc2UgfSkpKTtcbiAgICAgICAgdGhpcy5oYXNJdGVtSGlnaHRMaWdodC5zZXQoZmFsc2UpO1xuICAgICAgfSwgdGhpcy50aW1lSGlnaGxpZ2hOZXdJdGVtKCkpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFeGlzdEl0ZW0oaXRlbU5ldzogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMoKS5maW5kKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7aXRlbU5ldygpW3RoaXMuZmllbGRLZXkoKV19YCkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbW92ZUl0ZW1zKGtleXM6IEFycmF5PHVua25vd24+LCBpZ25vcmVSZUNhbGxGb290ZXI/OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIGxldCBpc1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1zID0gaXRlbXMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCkge1xuICAgICAgICAgICAgaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGlzVXBkYXRlID8gbmV3SXRlbXMgOiBpdGVtcztcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN0b3Jlcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICBpZiAoYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmtleXNTZWxlY3RlZCgpIHx8ICF0aGlzLmtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmtleXNTZWxlY3RlZC51cGRhdGUoa2V5cyA9PiBrZXlzLmZpbHRlcihrZXlTZWxlY3RlZCA9PiBrZXlTZWxlY3RlZCAhPT0ga2V5KSk7XG4gICAgfSk7XG4gICAgdGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQudXBkYXRlKHZhbHVlID0+IHZhbHVlIC0ga2V5cy5sZW5ndGgpO1xuICAgIGF3YWl0IHRoaXMuY2hlY2tTY3JvbGwoKTtcbiAgICBpZiAoIWlnbm9yZVJlQ2FsbEZvb3Rlcikge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCk7XG4gICAgfVxuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmh0dHBSZXF1ZXN0RGF0YSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmdTdG9yZSgpPy50b3RhbF9pdGVtcyB8fCB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLml0ZW1zKCkubGVuZ3RoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGwoZTogYW55KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBlLnRhcmdldC5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gZS50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgdGhpcy5yZXNldEluZGV4SG92ZXIoZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNjcm9sbEJvdHRvbShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5sb2FkTW9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9yZSgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vdXRMb2FkTW9yZS5lbWl0KHsgbG9hZE1vcmVTdWNjZXNzOiB0aGlzLmxvYWRNb3JlU3VjY2Vzcy5iaW5kKHRoaXMpIH0pO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZShmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlU3VjY2VzcyhkYXRhOiBXcml0YWJsZVNpZ25hbDxBcnJheTxXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4+Pikge1xuICAgIHRoaXMuYWRkSXRlbXMoZGF0YSwgZmFsc2UpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlQWxsQ2hlY2tlZCgpIHtcbiAgICB0aGlzLmtleXNTZWxlY3RlZC5zZXQoW10pO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VDaGVja2VkQWxsSXRlbXMoZXZlbnQ6IElDaGVja2JveEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldCh0aGlzLml0ZW1zKCkuZmlsdGVyKGFzeW5jIChpdGVtKSA9PiAhKGF3YWl0IHRoaXMuY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtKSkpLm1hcChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWApKTtcbiAgICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ2FuY2VsQ29uZGl0aW9uQ2hlY2tlZEl0ZW0oaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgbGV0IGlzQ2FuY2VsQ2hlY2sgPSBmYWxzZTtcblxuICAgIGlmICghaXNDYW5jZWxDaGVjayAmJiB0aGlzLmhlYWRlckxlZnQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyTGVmdCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4gYXMgYW55KSh7IGl0ZW06IGl0ZW0oKSB9KSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyUmlnaHQoKS5sZW5ndGggJiYgdGhpcy5oZWFkZXJSaWdodCgpWzBdLmNoZWNrQ29uZGl0aW9uQ2hlY2tCb3hIaWRkZW4pIHtcbiAgICAgIGlzQ2FuY2VsQ2hlY2sgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKCh0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNDYW5jZWxDaGVjaztcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoZXZlbnQ6IElDaGVja2JveEl0ZW0sIGl0ZW06IFRZUEVfT0JKRUNUKSB7XG4gICAgY29uc3Qga2V5ID0gaXRlbVt0aGlzLmZpZWxkS2V5KCldO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KHRoaXMua2V5c1NlbGVjdGVkKCkpO1xuXG4gICAga2V5cy5hZGQoa2V5KTtcbiAgICBpZiAoIWV2ZW50LmNoZWNrZWQpIHtcbiAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChBcnJheS5mcm9tKGtleXMpKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlU29ydChzb3J0OiBJU29ydCkge1xuICAgIGlmICh0aGlzLmluc3RhbmNlU29ydCAmJiB0aGlzLmluc3RhbmNlU29ydCgpPy5maWVsZFNvcnQgIT09IHNvcnQuZmllbGRTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgIH1cbiAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQoc29ydCk7XG4gICAgaWYgKHRoaXMuc29ydExvY2FsKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNvcnRMb2NhbChzb3J0KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICB0aGlzLm91dFNvcnQuZW1pdCh7XG4gICAgICBzb3J0OiBzb3J0LFxuICAgICAgb25Tb3J0U3VjY2VzczogdGhpcy5vblNvcnRTdWNjZXNzLmJpbmQodGhpcylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNvcnRMb2NhbChzb3J0OiBJU29ydCkge1xuICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKT8uKHNpZ25hbChbLi4udGhpcy5zdG9yZXMoKV0pLCB7IC4uLnRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCksIGluc3RhbmNlU29ydDogc29ydCB9KSB8fCBbXSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBmaWVsZFNvcnQsIG1vZGUgfSA9IHNvcnQ7XG5cbiAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICBpdGVtcy5zb3J0KChpdGVtQSwgaXRlbUIpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlMSA9IG1vZGUgPT09ICdhc2MnID8gaXRlbUEoKVtmaWVsZFNvcnRdIDogaXRlbUIoKVtmaWVsZFNvcnRdO1xuICAgICAgICBsZXQgdmFsdWUyID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQigpW2ZpZWxkU29ydF0gOiBpdGVtQSgpW2ZpZWxkU29ydF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTEgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZTIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFsdWUxID0gZGVsZXRlVW5pY29kZSh2YWx1ZTEpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdmFsdWUyID0gZGVsZXRlVW5pY29kZSh2YWx1ZTIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTEgPiB2YWx1ZTIgPyAxIDogLTE7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgfSk7XG4gICAgdGhpcy5vblNvcnRTdWNjZXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZ1bmN0aW9uQ29udHJvbE1vcmVTZWxlY3RJdGVtKGZ1bmN0aW9uQ29udHJvbDogSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtID0gZnVuY3Rpb25Db250cm9sO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZE1vcmVJdGVtKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmtleSB8fCAhdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT8ucmVzZXQoKTtcblxuICAgIGNvbnN0IHBlclBhZ2UgPSBOdW1iZXIoZXZlbnQua2V5KS52YWx1ZU9mKCk7XG4gICAgY29uc3QgY3VycmVudFBhZ2UgPSBOdW1iZXIodGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0ocGVyUGFnZSkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpc1BhZ2luZ051bWJlciA9IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ucGFnaW5nTnVtYmVyO1xuXG4gICAgaWYgKGN1cnJlbnRQYWdlID4gcGVyUGFnZSB8fCB0aGlzLml0ZW1zLmxlbmd0aCA+PSBwZXJQYWdlKSB7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldCh0aGlzLml0ZW1zKCkuc2xpY2UoMCwgcGVyUGFnZSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUsIHRydWUpO1xuICAgIGNvbnN0IHN1YiA9IHRoaXMub3V0TG9hZERhdGFDb21wbGV0ZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICBpZiAoIWlzUGFnaW5nTnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldCh0aGlzLml0ZW1zKCkuc2xpY2UoMCwgcGVyUGFnZSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRMb2FkRGF0YUVycm9yLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShjdXJyZW50UGFnZSk7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0ocGVyUGFnZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcmd1bWVudHNWYWx1ZSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhKCk/LmFyZ3VtZW50c1ZhbHVlO1xuXG4gICAgaWYgKCFhcmd1bWVudHNWYWx1ZSB8fCAhdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpKSB7XG4gICAgICByZXR1cm4gJy0xJztcbiAgICB9XG4gICAgY29uc3Qga2V5UGVyUGFnZSA9IHRoaXMuY29uZmlnU2VsZWN0TW9yZUl0ZW0oKT8ua2V5UGVyUGFnZSB8fCAncGVyX3BhZ2UnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHNWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGFyZ3VtZW50ID0gYXJndW1lbnRzVmFsdWVbaV07XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIEh0dHBQYXJhbXMgJiYgYXJndW1lbnQuaGFzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gYXJndW1lbnQuZ2V0KGtleVBlclBhZ2UpIHx8ICcyNSc7XG5cbiAgICAgICAgYXJndW1lbnQgPSBhcmd1bWVudC5zZXQoa2V5UGVyUGFnZSwgcGVyUGFnZSk7XG4gICAgICAgIHNldChhcmd1bWVudHNWYWx1ZSwgYCR7aX1gLCBhcmd1bWVudCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQZXJQYWdlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgT2JqZWN0LmtleXMoYXJndW1lbnQpLmluY2x1ZGVzKGtleVBlclBhZ2UpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQZXJQYWdlID0gYXJndW1lbnQuZ2V0KGtleVBlclBhZ2UpIHx8ICcyNSc7XG5cbiAgICAgICAgc2V0KGFyZ3VtZW50LCBrZXlQZXJQYWdlLCBwZXJQYWdlKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICctMSc7XG4gIH1cblxuICBwcml2YXRlIG9uU29ydFN1Y2Nlc3MoKSB7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQnV0dG9uQ2xpY2sodHlwZTogJ2J1dHRvbicgfCAnYnV0dG9uLWRyb3Bkb3duJywgYnV0dG9uRHJvcGRvd25EYXRhOiBhbnksIGJ1dHRvbjogSUJ1dHRvbikgeyAvLyBidXR0b25PcmlnaW4gY2jhu4kgc+G7rSBk4bulbmcga2hpIGTDuW5nIGJ1dHRvbkFjdGlvbnMgY8OzIGJ1dHRvbi1kcm9wZG93blxuICAgIGlmICh0eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgcmV0dXJuIHRoaXMub3V0Q2xpY2tCdXR0b25BY3Rpb24uZW1pdCh7IGl0ZW06IHRoaXMuaXRlbU9mSW5kZXhIb3ZlciwgYnV0dG9uOiBidXR0b24gfSk7XG4gICAgfVxuICAgIHRoaXMub3V0Q2xpY2tCdXR0b25BY3Rpb24uZW1pdCh7IGl0ZW06IHRoaXMuaXRlbU9mSW5kZXhIb3ZlciwgYnV0dG9uLCBidXR0b25Ecm9wZG93bkRhdGEgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbjogSUJ1dHRvbikge1xuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxXcml0YWJsZVNpZ25hbDxhbnk+PiA9IFtdO1xuXG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQoKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcygpLmZpbmQoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gID09PSBgJHtrZXl9YCk7XG5cbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5vdXRDbGlja0JhckJ1dHRvbi5lbWl0KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGl0ZW1zLFxuICAgICAga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSxcbiAgICAgIGhpZGRlbkJhckJ1dHRvbnM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25Ecm9wZG93bkV2ZW50KGV2ZW50TmFtZTogVFlQRV9QT1BPVkVSX0VWRU5UKSB7XG4gICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KHRydWUpO1xuICAgIGlmIChldmVudE5hbWUgPT09ICdyZW1vdmUnIHx8IGV2ZW50TmFtZSA9PT0gJ21vdXNlbGVhdmUtY29udGVudCcpIHtcbiAgICAgIHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50LnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluZGV4SG92ZXIoZTogRXZlbnQsIGl0ZW06IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPikge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IGl0ZW07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyV2hlbk1vdXNlTGVhdmUoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY3VycmVudEluZGV4SXRlbUhvdmVyID0gdGhpcy5pdGVtT2ZJbmRleEhvdmVyO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgICB0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0uc2V0KHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAmJiB0aGlzLml0ZW1PZkluZGV4SG92ZXIgIT09IGN1cnJlbnRJbmRleEl0ZW1Ib3Zlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRJbmRleEhvdmVyKGU/OiBFdmVudCkge1xuICAgIGU/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VFbnRlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LnJlbW92ZSgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICAgIHRoaXMuZm9vdGVyTGVmdEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCh0aGlzLmNsYXNzRm9vdGVySW5jbHVkZSgpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlTGVhdmUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpIHtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsKCkge1xuICAgIGlmICh0aGlzLmhlYWRlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICAgIHRoaXMuQm9keUVsZW1lbnQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KGNsZWFyU29ydD86IGJvb2xlYW4pIHtcbiAgICBpZiAoY2xlYXJTb3J0KSB7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydCgpPy5yZXNldCgpO1xuICAgICAgdGhpcy5pbnN0YW5jZVNvcnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU2Nyb2xsLnNldChmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICAgIHRoaXMuaXRlbXMuc2V0KFtdKTtcbiAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgIHRoaXMuZmFrZVJlc3BvbnNlQXBpKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrU2Nyb2xsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aW1lcig1MDApLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuQm9keUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQodGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxIZWlnaHQgPiB0aGlzLkJvZHlFbGVtZW50Lm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Njcm9sbCAmJiAhdGhpcy5oYXNTY3JvbGwoKSkge1xuICAgICAgICAgIHRoaXMub3V0U2Nyb2xsSXNHb25lLmVtaXQoe30pO1xuICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBCb2R5RWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMub25EZXN0cm95Lm5leHQoKTtcbiAgICB0aGlzLm9uRGVzdHJveS5jb21wbGV0ZSgpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRMZWF2ZUl0ZW0oKSk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz0nZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsJz5cbiAgQGlmICghaWdub3JlQmFyKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmUgei1bMV0gYm90dG9tLTAgbGVmdC0wIHctZnVsbCBiZy13aGl0ZSBsaWJzLXVpLXRhYmxlLXNoYWRvdy1ib3R0b20ge3sgY2xhc3NCYXJJbmNsdWRlKCkgfX1cIlxuICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICBbY2xhc3MucHktWzZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwicmVzZXRJbmRleEhvdmVyKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0nZGl2LmxpYnMtdWktdGFibGUtYmFyLWxlZnQnPjwvbmctY29udGVudD5cbiAgICAgIEBpZiAoIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBsYWJlbEJhck5vU2VsZWN0SXRlbSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtKCkgPz8gJ3B4LVsxMnB4XSBweS1bNXB4XScgfX1cIlxuICAgICAgICAgIFtpbm5lckh0bWxdPSdsYWJlbEJhck5vU2VsZWN0SXRlbSgpIHwgdHJhbnNsYXRlOnt2YWx1ZTp0b3RhbEl0ZW1EaXNwbGF5KCl9Jz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtWzEycHhdXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGgtZnVsbCBtdC1bLTJweF1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtjaGVja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyMwNzE2MzFdIG1yLVs4cHhdIHt7IGNsYXNzTGFiZWxCYXJCdXR0b25zKCkgfX1cIj5cbiAgICAgICAgICAgIHt7IGxhYmVsQmFyQnV0dG9ucygpIHwgdHJhbnNsYXRlOnsgdmFsdWU6a2V5c1NlbGVjdGVkKCkubGVuZ3RoIH0gfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDpmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICAyMDQ4LFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTonIXctWzEyMXB4XScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6J3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOjBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ01vcmVJdGVtKClcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIiF3LVsxNnB4XSBoLVsxNnB4XSBtci1bOHB4XVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG0tMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidiZWZvcmU6IXRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBtci1bNnB4XSdcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIntjb25maWc6e2NvbnRlbnQ6J2kxOG5fbW9yZV9zZWxlY3QnfX1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gbGlicy11aS1ib3JkZXItbGVmdC1nZW5lcmFsIG1sLVsxNnB4XVwiPjwvZGl2PlxuICAgICAgICAgIEBpZiAoYmFyQnV0dG9ucygpPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBiYXJCdXR0b25zKCk7dHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGJ1dHRvbi5sYWJlbCB8fCAnICcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9J2Rpdi5saWJzLXVpLXRhYmxlLWJhci1yaWdodCc+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdiAjdGFibGVDb250YWluZXJFbGVtZW50UmVmXG4gICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSB7eyBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSgpIH19XCJcbiAgICBbY2xhc3MucHgtWzE2cHhdXT0nIWlnbm9yZUJhcigpJ1xuICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcigkZXZlbnQpXCI+XG4gICAgPGRpdiAjaGVhZGVyRWxlbWVudFJlZlxuICAgICAgW2NsYXNzLmxpYnMtdWktYm9yZGVyLWJvdHRvbS1kYXNoZWQtZ2VuZXJhbF09XCIhaGFzSXRlbUhpZ2h0TGlnaHQoKSAmJiBpc0Rhc2hCb3JkZXIoKVwiXG4gICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWdlbmVyYWxdPVwiIWhhc0l0ZW1IaWdodExpZ2h0KCkgJiYgIWlzRGFzaEJvcmRlcigpXCJcbiAgICAgIFtjbGFzcy4haGlkZGVuXT1cIiFpdGVtcygpLmxlbmd0aCAmJiBpc0hpZGRlbkhlYWRlcldoZW5Ob2RhdGEoKVwiXG4gICAgICBbY2xhc3NdPVwiY2xhc3NIZWFkZXJDb250YWluZXIoKVwiXG4gICAgICAobW91c2VlbnRlcik9XCJyZXNldEluZGV4SG92ZXIoJGV2ZW50KVwiPlxuICAgICAgQGlmIChoZWFkZXJMZWZ0KCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgZmxleCBzdGlja3kgdG9wLTAgbGVmdC0wIHotWzFdIHt7IGNsYXNzSGVhZGVySW5jbHVkZSgpIH19XCI+XG4gICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmhlYWRlcixpc0hlYWRlckxlZnQ6dHJ1ZX1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJSaWdodCgpO3RyYWNrIGhlYWRlcikge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlclJlZjtjb250ZXh0OntoZWFkZXJJdGVtOmhlYWRlcixpc0hlYWRlckxlZnQ6ZmFsc2V9XCIgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoc2hvd0Zvb3RlcigpICYmIGl0ZW1Gb290ZXIoKSAmJiBjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJykge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0ndGVtcGxhdGVGb290ZXJSZWYnIC8+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwgb3ZlcmZsb3cteC1oaWRkZW4gYmctd2hpdGUge3sgY2xhc3NCb2R5SW5jbHVkZSgpIHx8ICcnIH19XCI+XG4gICAgICBAaWYgKGl0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgI2JvZHlFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIlxuICAgICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgICAgW29wdGlvbnNdPVwie3Njcm9sbFg6ICghaGVhZGVyTGVmdCgpLmxlbmd0aCB8fCAhaGVhZGVyUmlnaHQoKSkgPyAnaGlkZGVuJzonc2Nyb2xsJ31cIlxuICAgICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbCgkZXZlbnQpXCJcbiAgICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oJGV2ZW50KVwiPlxuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNib2R5Q29tcG9uZW50UmVmXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA+IChib2R5RWxlbWVudFJlZiA/IGJvZHlFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogMCkgPyBoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczt0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiAjZWxlbWVudEhvdmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci10b3AtMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICRmaXJzdCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLTFweC0zNmQzZDNdPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSkpID8gJ2xpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdC00cHggbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodC00cHgnIDogaWdub3JlQm9yZGVySXRlbSgpID8gJycgOiBpc0Rhc2hCb3JkZXIoKSA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnIDogJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SW5kZXhIb3ZlcigkZXZlbnQsZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBweC1bMTJweF0gcHktWzhweF0ge3sgaGVhZGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyc6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmOGY5ZmFdXT1cIml0ZW1PZkluZGV4SG92ZXIgPT09IGRhdGEgJiYgIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8ICB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlQm9keVJlZjtjb250ZXh0OntoZWFkZXI6aGVhZGVyLGRhdGE6ZGF0YX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlclJpZ2h0KCk7dHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IHB4LVsxMnB4XSBweS1bOHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7Y29udGV4dDp7aGVhZGVyOmhlYWRlcixkYXRhOmRhdGF9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpO3RyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtWzEwMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cblxuICAgICAgICAgIEBpZiAoKCFpdGVtcygpLmxlbmd0aCkgJiYgIWxvYWRpbmcoKSAmJiBub0RhdGFDb25maWcoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5mbGV4XT1cIicwIDAgJytoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoKydweCdcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKCghaXRlbXMoKS5sZW5ndGgpICYmICFsb2FkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtZnVsbCB3LWZ1bGxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVOb2RhdGFSZWZcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzaG93Rm9vdGVyKCkgJiYgaXRlbUZvb3RlcigpICYmIGN1c3RvbVBvc2l0aW9uRm9vdGVyKCkgPT09ICdib3R0b20nKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9J3RlbXBsYXRlRm9vdGVyUmVmJyAvPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgdy1mdWxsIGgtZnVsbCB6LVsyXSBmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc3Bpbm5lciAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUhlYWRlclJlZlxuICBsZXQtaGVhZGVyPSdoZWFkZXJJdGVtJ1xuICBsZXQtaXNIZWFkZXJMZWZ0PSdpc0hlYWRlckxlZnQnPlxuICA8ZGl2IFtjbGFzc109XCIncmVsYXRpdmUgZmxleCAnKyAoaGVhZGVyLnBhZGRpbmdMZWZ0UmlnaHRIZWFkZXJDb250YWluZXIgPz8gJyBweC1bMTJweF0gJykgKyAoaXNIZWFkZXJMZWZ0ICYmICFoZWFkZXIuaWdub3JlQm9yZGVyUmlnaHQgPyAnIGxpYnMtdWktYm9yZGVyLXJpZ2h0LWdlbmVyYWwgJyA6ICcgJykrICcgbGlicy11aS10YWJsZS1oZWFkZXItY29sICdcIlxuICAgIFtjbGFzcy5mbGV4LWNvbF09XCJoZWFkZXIucm93c0NvbmZpZ1wiXG4gICAgW2NsYXNzLnB5LVs4cHhdXT0nIWhlYWRlci5pZ25vcmVQeURlZmF1bHQnXG4gICAgW25nU3R5bGVdPVwiaGVhZGVyLm5nU3R5bGUgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgIEBpZiAoIWhlYWRlci5yb3dzQ29uZmlnKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50UmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06aGVhZGVyLGlzQ29sUmVuZGVyOmZhbHNlfVwiIC8+XG4gICAgfVxuICAgIEBpZiAoaGVhZGVyLnJvd3NDb25maWc7YXMgcm93c0NvbmZpZykge1xuICAgICAgQGZvciAocm93IG9mIHJvd3NDb25maWcucm93czt0cmFjayByb3cpIHtcbiAgICAgICAgPGRpdiBbY2xhc3NdPVwicm93LmNsYXNzUm93XCI+XG4gICAgICAgICAgQGZvciAoY29sIG9mIHJvdy5jb2xzIDsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50UmVmO2NvbnRleHQ6e2hlYWRlckl0ZW06Y29sLGlzQ29sUmVuZGVyOnRydWV9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlSGVhZGVyQ29udGVudFJlZlxuICBsZXQtaGVhZGVyPSdoZWFkZXJJdGVtJ1xuICBsZXQtaXNDb2xSZW5kZXI9J2lzQ29sUmVuZGVyJz5cbiAgPGRpdiBjbGFzcz1cImZsZXggbGlicy11aS1mb250LWg2bSBtaW4taC1bMThweF0gdGV4dC1bIzZhNzM4M10gbWF4LXctZnVsbFwiXG4gICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09J2hlYWRlci5jb250ZW50SGVhZGVyQWxpZ25DZW50ZXIgPz8gdHJ1ZSdcbiAgICBbY2xhc3MuanVzdGlmeS1lbmRdPSdoZWFkZXIuY29udGVudEhlYWRlckp1c3RpZnlDb250ZW50RW5kJ1xuICAgIFtjbGFzcy53LWZ1bGxdPVwiaGVhZGVyLmlzU2hvd0luZGV4T25Sb3dcIlxuICAgIFtuZ1N0eWxlXT1cImlzQ29sUmVuZGVyID8gKGhlYWRlci5uZ1N0eWxlIHx8IChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHt3aWR0aDonNTBweCcsJ2ZsZXgtc2hpcmsnOicwJyxwYWRkaW5nOic4cHgnfSA6IHt9KSkgOiB7fVwiXG4gICAgW25nQ2xhc3NdPVwiaXNDb2xSZW5kZXIgPyAoaGVhZGVyLm5nQ2xhc3MgfHwge30pIDoge31cIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3hBbGwpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIHt7IGhlYWRlci5jaGVja2JveEFsbENsYXNzSW5jbHVkZSB8fCAnbXItWzE2cHhdJyB9fVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtrZXldPVwiJ2FsbCdcIlxuICAgICAgICAgICAgW3N0aWxsT3RoZXJPcHRpb25zXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCAhPT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID09PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKClcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwgbWwtWzI0cHhdIHt7IGhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZSB9fVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLnBhcnNlVmFsdWU6aGVhZGVyKSB8IGFzeW5jIHwgdHJhbnNsYXRlOyBhcyBsYWJlbEhlYWRlckNvbHVtbikge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnKVwiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImhlYWRlci5sYWJlbENvbmZpZz8uY29uZmlnIHx8IHtjb250ZW50OmxhYmVsSGVhZGVyQ29sdW1ufVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEhlYWRlckNvbHVtblwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIudG9vbHRpcE90aGVyOyBhcyB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cInRvb2x0aXAuY29uZmlnIHx8IHtjb250ZW50Oih0b29sdGlwLmRhdGFWaWV3IHx8ICcgJykgfCB0cmFuc2xhdGUsIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJ0b29sdGlwLmRhdGFWaWV3XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmhhc1NvcnQgJiYgaGVhZGVyLm9yZGVyYnkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc29ydC1hcnJvdyBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgIWl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZmllbGRTb3J0XT1cImhlYWRlci5vcmRlcmJ5XCJcbiAgICAgICAgICBbaWdub3JlUG9wb3ZlckNvbnRlbnRdPVwiaGVhZGVyLnNvcnRJZ25vcmVUb29sdGlwQ29udGVudCA/PyB0cnVlXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnRBc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudEFzY1wiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50RGVzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50RGVzY1wiXG4gICAgICAgICAgW2RlZmF1bHRNb2RlXT1cImhlYWRlci5kZWZhdWx0TW9kZVwiXG4gICAgICAgICAgW3pJbmRleF09XCJoZWFkZXIuekluZGV4VG9vbHRpcFNvcnRcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVNvcnQoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGhlYWRlci5sYWJlbERlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6IGhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGV9XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUJvZHlSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVyJ1xuICBsZXQtZGF0YT0nZGF0YSc+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGxcIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsXCJcbiAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCJoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiAmJiggZGF0YSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbjpkYXRhKCkgfCBhc3luYylcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtrZXldPVwiZGF0YSgpW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTZWxlY3RlZCgpOmtleXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpIHx8ICEhKG1heEl0ZW1TZWxlY3RlZCgpICYmICEoZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTZWxlY3RlZCgpOmtleXNTZWxlY3RlZCgpLmxlbmd0aCkgJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID49IG1heEl0ZW1TZWxlY3RlZCgpKVwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50LGRhdGEoKSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdzsgYXMgY29uZmlnKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGxpYnMtdWktZm9udC1oNHJ7eyBjb25maWcuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbY29uZmlnXT1cInt9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhdGEgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmdldEluZGV4Um93IHwgYXN5bmNcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2lzSG92ZXJdPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICBbaXRlbV09XCJkYXRhXCJcbiAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUZvb3RlclJlZj5cbiAgQGlmICghaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgfHwgKGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpICYmIGl0ZW1zKCkubGVuZ3RoKSkge1xuICAgIDxkaXYgI2Zvb3RlckVsZW1lbnRSZWZcbiAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctWyNmOGY5ZmFdIG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIHt7IGlnbm9yZUJvcmRlckZvb3RlcigpID8gJyc6IChjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJyA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCc6J2xpYnMtdWktdGFibGUtc2hhZG93LXRvcCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCcpIH19IG1pbi1oLVszNXB4XVwiXG4gICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgIEBpZiAoZm9vdGVyTGVmdCgpKSB7XG4gICAgICAgIDxkaXYgI2Zvb3RlckxlZnRFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gYmctWyNmOGY5ZmFdXCI+XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlckxlZnQoKTt0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF0ge3sgZm9vdGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyc6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImZvb3Rlci5uZ1N0eWxlIHx8IHt9XCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgICAgQGlmIChmb290ZXIuY29sVGVtcGxhdGVDb25maWcpIHtcbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXRhYmxlLXRlbXBsYXRlcyBbaXRlbV09XCJpdGVtRm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChmb290ZXJSaWdodCgpKSB7XG4gICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJSaWdodCgpO3RyYWNrIGZvb3Rlcikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZm9vdGVyLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZm9vdGVyLm5nQ2xhc3MgfHwge31cIj5cbiAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpdGVtXT1cIml0ZW1Gb290ZXJcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOb2RhdGFSZWY+XG4gIEBpZiAobm9EYXRhQ29uZmlnKCk7IGFzIGNvbmZpZykge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCB6LVsxXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgc2hyaW5rLTBcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIW9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiICgnbm8tZGF0YScgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmMpO2lucHV0czp7c2l6ZTo2NH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dE5vRGF0YSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoa2V5U2VhcmNoKCkgfHwgb25seVNob3dOb1Jlc3VsdCgpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCIoJ25vLXJlc3VsdCcgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmMpO2lucHV0czp7c2l6ZTo2NH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dFNlYXJjaE5vRGF0YSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
673
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3RhYmxlL3NyYy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvdGFibGUvc3JjL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDNU0sT0FBTyxFQUE0QixxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pHLE9BQU8sRUFBVyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JHLE9BQU8sRUFBUyx5Q0FBeUMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RyxPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFFLGdDQUFnQyxFQUFzQixNQUFNLDZCQUE2QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBRSwrQkFBK0Is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Q3pFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0NvbXBvbmVudE91dGxldCwgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIFZpcnR1YWxTY3JvbGxlck1vZHVsZSB9IGZyb20gJ0BpaGFyYmVjay9uZ3gtdmlydHVhbC1zY3JvbGxlcic7XG5pbXBvcnQgeyBJQnV0dG9uLCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSVNvcnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zU29ydEFycm93Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLXNvcnQnO1xuaW1wb3J0IHsgSUNoZWNrYm94SXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWNoZWNrYm94LWdyb3VwXCI7XG5pbXBvcnQgeyBJQ2hlY2tib3hFdmVudCwgTGlic1VpQ29tcG9uZW50c0NoZWNrYm94U2luZ2xlQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlXCI7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXJcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXlcIjtcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTcGlubmVyQ29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtc3Bpbm5lclwiO1xuaW1wb3J0IHsgTGlic1VpSWNvbnNHZXRJY29uQ29tcG9uZW50UGlwZSB9IGZyb20gXCJAbGlicy11aS9pY29uc1wiO1xuaW1wb3J0IHsgSUh0dHBSZXNwb25zZUVycm9yLCBJUGFnaW5nLCBUWVBFX09CSkVDVCB9IGZyb20gXCJAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzXCI7XG5pbXBvcnQgeyBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlIH0gZnJvbSBcIkBsaWJzLXVpL3BpcGVzLWNhbGwtZnVuY3Rpb24taW4tdGVtcGxhdGVcIjtcbmltcG9ydCB7IExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZSB9IGZyb20gJ0BsaWJzLXVpL3BpcGVzLWNoZWNrLXNlbGVjdGVkLWJ5LWtleSc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcsIExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSwgcmV0dXJuTGlzdE9iamVjdCB9IGZyb20gXCJAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3RcIjtcbmltcG9ydCB7IGNsb25lRGVlcCwgY29udmVydE9iamVjdFRvU2lnbmFsLCBkZWxldGVVbmljb2RlLCBnZXQsIHNldCwgdmlld0RhdGFOdW1iZXJCeUxhbmd1YWdlIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBvZiwgU3ViamVjdCwgdGFrZVVudGlsLCB0aW1lciB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBJQnV0dG9uQmFyRXZlbnQsIElDb25maWdTZWxlY3RNb3JlSXRlbSwgSUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kLCBJSG92ZXJCdXR0b25BY3Rpb25FdmVudCwgSUxvYWRNb3JlRXZlbnQsIElTb3J0RXZlbnQsIElUYWJlbEJ1dHRvbkFjdGlvbkV2ZW50LCBJVGFibGVGb290ZXJDb25maWcsIElUYWJsZUhlYWRlckNvbmZpZywgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX1RBQkxFLCBUWVBFX0lURU1fREFUQV9UQUJMRSwgVFlQRV9ORVdfREFUQV9UQUJMRSwgVFlQRV9UQUJMRV9GSUxURVIgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBJVGFibGVGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gXCIuL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC1ldmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElUYWJsZU5vRGF0YUNvbmZpZyB9IGZyb20gXCIuL2ludGVyZmFjZXMvbm8tZGF0YS1jb25maWcuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tIFwiLi90ZW1wbGF0ZXMvdGVtcGxhdGVzLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtbGlzdFwiO1xuaW1wb3J0IHsgTGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZSB9IGZyb20gXCIuL3BpcGVzL2NhbGN1bGF0b3ItY29sdW1uLnBpcGVcIjtcbmltcG9ydCB7IExpYnNVaVBpcGVzQ29udmVydE9iamVjdFRvU2lnbmFsUGlwZSB9IGZyb20gXCJAbGlicy11aS9waXBlcy1jb252ZXJ0LW9iamVjdC10by1zaWduYWxcIjtcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLCBOZ1N0eWxlLCBBc3luY1BpcGUsIE5nVGVtcGxhdGVPdXRsZXQsIE5nQ29tcG9uZW50T3V0bGV0LCBMaWJzVWlDb21wb25lbnRzVGFibGVUZW1wbGF0ZXNDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlTW9kdWxlLCBWaXJ0dWFsU2Nyb2xsZXJNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LCBMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NvcnRBcnJvd0NvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQ2hlY2tib3hTaW5nbGVDb21wb25lbnQsIExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGUsXG4gICAgTGlic1VpQ29tcG9uZW50c1NwaW5uZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlLFxuICAgIExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGUsIExpYnNVaVBpcGVzQ2hlY2tTZWxlY3RlZEJ5S2V5UGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCBjbGFzc0hlYWRlckNvbnRhaW5lciA9IGNvbXB1dGVkKCgpID0+IGBsaWJzLXVpLXRhYmxlLWhlYWRlci1jb250YWluZXIgdy1mdWxsIGZsZXggc2hyaW5rLTAgJHt0aGlzLmlnbm9yZUNsYXNzQmdIZWFkZXIoKSA/ICcnIDogJ2JnLXdoaXRlJ30gb3ZlcmZsb3cteC1oaWRkZW4gei1bMV0gaXRlbXMtY2VudGVyICR7dGhpcy5jbGFzc0hlYWRlckNvbnRhaW5lckluY2x1ZGUoKSB8fCAnJ31gKVxuICBwcm90ZWN0ZWQgY2xhc3NIZWFkZXJMZWZ0Q29udGFpbmVyID0gY29tcHV0ZWQoKCkgPT4gYGgtZnVsbCBmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gJHt0aGlzLmlnbm9yZUNsYXNzQmdIZWFkZXIoKSA/ICcnIDogJ2JnLXdoaXRlJ30gJHt0aGlzLmNsYXNzSGVhZGVyTGVmdEluY2x1ZGUoKSB8fCAnJ31gKVxuXG4gIHByb3RlY3RlZCBrZXlzU2VsZWN0ZWQgPSBzaWduYWw8QXJyYXk8YW55Pj4oW10pO1xuICBwcm90ZWN0ZWQgbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBzdG9yZXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbXMgPSBzaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+Pj4oW10pO1xuICBwcm90ZWN0ZWQgaXRlbUZvb3RlciA9IHNpZ25hbDxUWVBFX09CSkVDVCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGl0ZW1PZkluZGV4SG92ZXI/OiBUWVBFX0lURU1fREFUQV9UQUJMRTtcbiAgcHJvdGVjdGVkIGtleVNlYXJjaCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIHRvdGFsSXRlbUluQmFja2VuZCA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcm90ZWN0ZWQgaGFzSXRlbUhpZ2h0TGlnaHQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgdG90YWxJdGVtRGlzcGxheSA9IGNvbXB1dGVkKCgpID0+IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSgodGhpcy50b3RhbEl0ZW0oKSA/PyB0aGlzLnRvdGFsSXRlbUluQmFja2VuZCgpKSwgZmFsc2UpKTtcbiAgcHJvdGVjdGVkIGxpc3RDb25maWdNb3JlSXRlbSA9IGNvbXB1dGVkPElMaXN0Q29uZmlnSXRlbT4oKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICBjb25maWdUZW1wbGF0ZVRleHQ6IHNpZ25hbCh7XG4gICAgICAgIGZpZWxkS2V5OiAna2V5JyxcbiAgICAgICAgaWdub3JlSWNvblNlbGVjdGVkOiB0cnVlLFxuICAgICAgICBnZXRWYWx1ZTogdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5nZXRWYWx1ZSxcbiAgICAgICAgY29uZmlnTGFiZWxQb3BvdmVyOiBzaWduYWwoe1xuICAgICAgICAgIHpJbmRleDogMTIwMFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgICBodHRwUmVxdWVzdERhdGE6IHNpZ25hbCh7XG4gICAgICAgIHNlcnZpY2VPdGhlcjogcmV0dXJuTGlzdE9iamVjdCh0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCk/Lmxpc3RPcHRpb24pLFxuICAgICAgICBmdW5jdGlvbk5hbWU6ICdsaXN0JyxcbiAgICAgICAgYXJndW1lbnRzVmFsdWU6IFtdXG4gICAgICB9KVxuICAgIH1cbiAgfSlcblxuICBwcml2YXRlIGhhc1Njcm9sbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaW5zdGFuY2VTb3J0ID0gc2lnbmFsPElTb3J0IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcGFnaW5nU3RvcmUgPSBzaWduYWw8SVBhZ2luZz4oe30pO1xuICBwcml2YXRlIGxvYWRlZExhc3RJdGVtID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzdG9yZVBhcmFtc0NhbGxBcGkgPSBzaWduYWw8VFlQRV9PQkpFQ1Q+KHt9KTtcbiAgcHJpdmF0ZSB0aW1lb3V0TGVhdmVJdGVtID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xTZWxlY3RNb3JlSXRlbT86IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50O1xuICBwcml2YXRlIG1vdXNlU2Nyb2xsQ29udGV4dCA9IHNpZ25hbDwnaGVhZGVyJyB8ICdib2R5JyB8ICdmb290ZXInIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9uRGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIElOUFVUICovXG4gIHJlYWRvbmx5IHRpbWVIaWdobGlnaE5ld0l0ZW0gPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMjAwMCwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gMjAwMCB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyTGVmdCA9IGlucHV0PEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4sIEFycmF5PElUYWJsZUhlYWRlckNvbmZpZz4gfCB1bmRlZmluZWQ+KFtdLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBbXSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVyUmlnaHQgPSBpbnB1dDxBcnJheTxJVGFibGVIZWFkZXJDb25maWc+LCBBcnJheTxJVGFibGVIZWFkZXJDb25maWc+IHwgdW5kZWZpbmVkPihbXSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gW10gfSk7XG4gIHJlYWRvbmx5IGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kID0gaW5wdXQ8SUNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kPigpO1xuICByZWFkb25seSBzaG93Rm9vdGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQm9yZGVyRm9vdGVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY3VzdG9tUG9zaXRpb25Gb290ZXIgPSBpbnB1dDwndG9wJyB8ICdib3R0b20nLCAndG9wJyB8ICdib3R0b20nIHwgdW5kZWZpbmVkPignYm90dG9tJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJ2JvdHRvbScgfSk7XG4gIHJlYWRvbmx5IGZvb3RlckxlZnQgPSBpbnB1dDxBcnJheTxJVGFibGVGb290ZXJDb25maWc+IHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBmb290ZXJSaWdodCA9IGlucHV0PEFycmF5PElUYWJsZUZvb3RlckNvbmZpZz4gfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGRpc2FibGVDaGVja2JveCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGJ1ZmZlckFtb3VudCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPig1LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/ICh2YWwgPiAyNSA/IDI1IDogdmFsKSA6IDUgfSlcbiAgcmVhZG9ubHkgdG90YWxJdGVtID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBpc0Rhc2hCb3JkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBjbGFzc0hlYWRlckNvbnRhaW5lckluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSGVhZGVyTGVmdEluY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGNsYXNzQm9keUluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0Zvb3RlckluY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQmFySW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJ2p1c3RpZnktYmV0d2VlbiBtYi1bMTZweF0nKTtcblxuICByZWFkb25seSBmaWVsZEtleSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaWQnIH0pOyAvLyB0w6puIGZpZWxkIMSR4buLbmggZGFuaCBpdGVtIGPhu6dhIGxpc3REYXRhc1xuICByZWFkb25seSBkZWZhdWx0S2V5c1NlbGVjdGVkID0gaW5wdXQ8QXJyYXk8YW55Pj4oKTtcbiAgcmVhZG9ubHkgbGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KGBpMThuX3RvdGFsX3F1YW50aXR5YCk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBsYWJlbEJhckJ1dHRvbnMgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5fbnVtYmVyX2l0ZW1fc2VsZWN0ZWQnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCB8fCAnaTE4bl9udW1iZXJfaXRlbV9zZWxlY3RlZCcgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBjbGFzc0xhYmVsQmFyQnV0dG9ucyA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJycgfSk7IC8vIHPhu60gZOG7pW5nIMSR4buDIGhpw6puIHRo4buLIGtoaSB0w61jaCBjaOG7jW4gaXRlbVxuICByZWFkb25seSBiYXJCdXR0b25zID0gaW5wdXQ8QXJyYXk8SUJ1dHRvbj4+KCk7XG4gIHJlYWRvbmx5IHNvcnRMb2NhbCA9IGlucHV0PGJvb2xlYW4+KCk7IC8vIHRyxrDhu51uZyBo4bujcCBu4bq/dSBzb3J0TG9jYWwgbsOgeSBraMO0bmcgxJHDoXAg4bupbmcgxJHGsOG7o2MgbmdoaeG7h3AgduG7pSB0aMOsIG3hu5tpIGPDom4gbmjhuq9jIHPhu60gZOG7pW5nIGZpbHRlckxvY2FsXG4gIHJlYWRvbmx5IGZpbHRlck9yU29ydExvY2FsID0gaW5wdXQ8VFlQRV9UQUJMRV9GSUxURVI+KCk7XG4gIHJlYWRvbmx5IGh0dHBSZXF1ZXN0RGF0YSA9IGlucHV0PElIdHRwUmVxdWVzdENvbmZpZz4oKTtcbiAgcmVhZG9ubHkgaHR0cFJlcXVlc3REYXRhRm9vdGVyID0gaW5wdXQ8SUh0dHBSZXF1ZXN0Q29uZmlnPigpO1xuICByZWFkb25seSBuZXdEYXRhID0gaW5wdXQ8VFlQRV9ORVdfREFUQV9UQUJMRT4oKTtcbiAgcmVhZG9ubHkgZmlsdGVyID0gaW5wdXQ8VFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSwgVFlQRV9EQVRBX0ZJTFRFUl9UQUJMRSB8IHVuZGVmaW5lZD4oeyBmaWx0ZXJEYXRhOiB7fSB9LCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyB7IGZpbHRlckRhdGE6IHt9IH0gfSk7XG4gIHJlYWRvbmx5IGlnbm9yZUJhciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzTGFiZWxCYXJOb1NlbGVjdEl0ZW0gPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNsYXNzQmdIZWFkZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBub0RhdGFDb25maWcgPSBpbnB1dDxJVGFibGVOb0RhdGFDb25maWc+KHsgdGV4dE5vRGF0YTogJ2kxOG5fbm9fZGF0YV95ZXQnLCB0ZXh0U2VhcmNoTm9EYXRhOiAnaTE4bl9ub19yZXN1bHQnIH0pO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtTGFzdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1heEl0ZW1TZWxlY3RlZCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMDAsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/IDEwMCB9KTtcbiAgcmVhZG9ubHkgY29uZmlnU2VsZWN0TW9yZUl0ZW0gPSBpbnB1dDxJQ29uZmlnU2VsZWN0TW9yZUl0ZW0+KCk7XG4gIHJlYWRvbmx5IG9ubHlTaG93Tm9SZXN1bHQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBpZ25vcmVCb3JkZXJJdGVtID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogT1VUUFVUICovXG5cbiAgcmVhZG9ubHkgb3V0TG9hZE1vcmUgPSBvdXRwdXQ8SUxvYWRNb3JlRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dFNjcm9sbElzR29uZSA9IG91dHB1dDxJTG9hZE1vcmVFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0TG9hZGluZyA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRDbGlja0J1dHRvbkFjdGlvbiA9IG91dHB1dDxJVGFiZWxCdXR0b25BY3Rpb25FdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0U29ydCA9IG91dHB1dDxJU29ydEV2ZW50PigpO1xuICByZWFkb25seSBvdXRDbGlja0JhckJ1dHRvbiA9IG91dHB1dDxJQnV0dG9uQmFyRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dEhvdmVyQnV0dG9uQWN0aW9uID0gb3V0cHV0PElIb3ZlckJ1dHRvbkFjdGlvbkV2ZW50PigpO1xuICByZWFkb25seSBvdXRLZXlzU2VsZWN0ZWQgPSBvdXRwdXQ8eyBrZXlzOiBBcnJheTxhbnk+IH0+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uc0NvbnRyb2wgPSBvdXRwdXQ8SVRhYmxlRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IG91dExvYWREYXRhQ29tcGxldGUgPSBvdXRwdXQ8V3JpdGFibGVTaWduYWw8QXJyYXk8V3JpdGFibGVTaWduYWw8YW55Pj4+PigpO1xuICByZWFkb25seSBvdXRUb3RhbEl0ZW0gPSBvdXRwdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvdXRMb2FkRGF0YUVycm9yID0gb3V0cHV0PElIdHRwUmVzcG9uc2VFcnJvcj4oKTtcblxuICAvKipWSUVXIENISUxEICovXG4gIHByb3RlY3RlZCBoZWFkZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdoZWFkZXJFbGVtZW50UmVmJyk7XG4gIHByb3RlY3RlZCBmb290ZXJFbGVtZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdmb290ZXJFbGVtZW50UmVmJyk7XG4gIHByb3RlY3RlZCBmb290ZXJMZWZ0RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignZm9vdGVyTGVmdEVsZW1lbnRSZWYnKTtcbiAgcHJpdmF0ZSBib2R5RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPignYm9keUVsZW1lbnRSZWYnKTtcbiAgcHJpdmF0ZSBib2R5Q29tcG9uZW50UmVmID0gdmlld0NoaWxkPFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudD4oJ2JvZHlDb21wb25lbnRSZWYnKTs7XG5cbiAgLyoqSU5KRUNUICovXG4gIHByaXZhdGUgaHR0cFJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUh0dHBSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpPy5sZW5ndGgpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnVwZGF0ZShrZXlzID0+IChbLi4ua2V5cywgLi4uKHRoaXMuZGVmYXVsdEtleXNTZWxlY3RlZCgpIHx8IFtdKV0pKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNob3dGb290ZXIoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm5ld0RhdGEoKT8uZGF0YSgpLmxlbmd0aCkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hZGRJdGVtcyh0aGlzLm5ld0RhdGEoKT8uZGF0YSBhcyBhbnksICF0aGlzLm5ld0RhdGEoKT8uYWRkVG9MYXN0TGlzdCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHRoaXMuZmlsdGVyKCkuaWdub3JlQ2FsbEFwaUF1dG8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5rZXlTZWFyY2guc2V0KGdldDxhbnk+KHRoaXMuZmlsdGVyKCkuZmlsdGVyRGF0YSwgJ2tleVNlYXJjaCcsICcnKSk7XG4gICAgICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnNldChjbG9uZURlZXAodGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcigpPy5maWx0ZXJEYXRhICYmICF0aGlzLmZpbHRlcigpLmZpbHRlckRhdGFbJ2luc3RhbmNlU29ydCddICYmIHRoaXMuaW5zdGFuY2VTb3J0KCkpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlUGFyYW1zQ2FsbEFwaS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBpbnN0YW5jZVNvcnQ6IHRoaXMuaW5zdGFuY2VTb3J0KCkgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck9yU29ydExvY2FsKCkgJiYgdGhpcy5zdG9yZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnNldCh0aGlzLmZpbHRlck9yU29ydExvY2FsKCk/LihzaWduYWwoWy4uLnRoaXMuc3RvcmVzKCldKSwgeyAuLi4odGhpcy5maWx0ZXIoKS5maWx0ZXJEYXRhIHx8IHt9KSwgaW5zdGFuY2VTb3J0OiB0aGlzLmluc3RhbmNlU29ydCgpIH0pIHx8IFtdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7XG4gICAgICByZXNldDogdGhpcy5yZXNldC5iaW5kKHRoaXMpLFxuICAgICAgY2FsbEFwaUJ5U2VydmljZTogdGhpcy5jYWxsQXBpQnlTZXJ2aWNlLmJpbmQodGhpcyksXG4gICAgICByZXNldFNjcm9sbDogdGhpcy5yZXNldFNjcm9sbC5iaW5kKHRoaXMpLFxuICAgICAgYWRkSXRlbXM6IHRoaXMuYWRkSXRlbXMuYmluZCh0aGlzKSxcbiAgICAgIHJlbW92ZUl0ZW1zOiB0aGlzLnJlbW92ZUl0ZW1zLmJpbmQodGhpcyksXG4gICAgICBnZXRDb3VudDogdGhpcy5nZXRDb3VudC5iaW5kKHRoaXMpLFxuICAgICAgZ2V0U2Nyb2xsQ29udGFpbmVyOiB0aGlzLmdldFNjcm9sbENvbnRhaW5lci5iaW5kKHRoaXMpLFxuICAgICAgaGlkZVRvb2xCYXJCb3R0b206ICgpID0+IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSxcbiAgICAgIHJlc2V0S2V5U2VsZWN0ZWQ6ICgpID0+IHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSksXG4gICAgICBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcbiAgICB9KTtcblxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0SW5kZXhSb3cgPSAoZGF0YTogeyB2YWx1ZTogVFlQRV9JVEVNX0RBVEFfVEFCTEUgfSkgPT4ge1xuICAgIHJldHVybiBvZih0aGlzLml0ZW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBkYXRhLnZhbHVlKSArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTY3JvbGxDb250YWluZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYm9keUNvbXBvbmVudFJlZigpIGFzIFZpcnR1YWxTY3JvbGxlckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsbEFwaUJ5U2VydmljZShmaXJzdENhbGw6IGJvb2xlYW4sIHJlc2V0QWZ0ZXJDYWxsQXBpPzogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGEoKSB8fCB0aGlzLmxvYWRpbmcoKSB8fCB0aGlzLmxvYWRlZExhc3RJdGVtKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2FkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgICBjb25zdCB7IGFyZ3VtZW50c1ZhbHVlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSB9ID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKSBhcyBJSHR0cFJlcXVlc3RDb25maWc7XG5cbiAgICAgIGlmIChndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSAmJiAhZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUuc29ydE9yZGVyQnkgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJCeSA9IHtcbiAgICAgICAgICBmaWVsZEdldFZhbHVlOiAnc3RvcmVQYXJhbXNDYWxsQXBpLmluc3RhbmNlU29ydC5maWVsZFNvcnQnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX2J5J1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgJiYgIWd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlLnNvcnRPcmRlclR5cGUgJiYgdGhpcy5pbnN0YW5jZVNvcnQoKSkge1xuICAgICAgICBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZS5zb3J0T3JkZXJUeXBlID0ge1xuICAgICAgICAgIGZpZWxkR2V0VmFsdWU6ICdzdG9yZVBhcmFtc0NhbGxBcGkuaW5zdGFuY2VTb3J0Lm1vZGUnLFxuICAgICAgICAgIGZpZWxkVXBkYXRlOiAnWzBdJyxcbiAgICAgICAgICBzdWJGaWVsZFVwZGF0ZTogJ29yZGVyX3R5cGUnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZmlyc3RDYWxsKSB7XG4gICAgICAgIGlmICghcmVzZXRBZnRlckNhbGxBcGkpIHtcbiAgICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgICAgICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi50aGlzLmZha2VSZXNwb25zZUFwaSgpLCBzdG9yZVBhcmFtc0NhbGxBcGk6IHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpKCkgfSwgdGhpcy5wYWdpbmdTdG9yZSgpLCB0aGlzLmtleVNlYXJjaCgpLCB0cnVlLCB0aGlzLmxvYWRlZExhc3RJdGVtKCksIGd1aWRlQXV0b1VwZGF0ZUFyZ3VtZW50c1ZhbHVlKSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBSZXF1ZXN0U2VydmljZS5jYWxsQXBpKHRoaXMuaHR0cFJlcXVlc3REYXRhKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnKTtcblxuICAgICAgaWYgKGZpcnN0Q2FsbCAmJiByZXNldEFmdGVyQ2FsbEFwaSkge1xuICAgICAgICB0aGlzLmhhc1Njcm9sbC5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnN0b3Jlcy5zZXQoW10pO1xuICAgICAgICB0aGlzLml0ZW1zLnNldChbXSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZ2luZ1N0b3JlLnNldChyZXN1bHQucGFnaW5nKTtcbiAgICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnNldChyZXN1bHQucGFnaW5nPy50b3RhbF9pdGVtcyB8fCAwKTtcbiAgICAgIHRoaXMub3V0VG90YWxJdGVtLmVtaXQodGhpcy50b3RhbEl0ZW1JbkJhY2tlbmQoKSk7XG4gICAgICBpZiAoIXRoaXMucGFnaW5nU3RvcmUoKSkge1xuICAgICAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGVkTGFzdEl0ZW0uc2V0KHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHNWYWx1ZSwgeyAuLi5yZXN1bHQsIHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCksIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIHRoaXMubG9hZGVkTGFzdEl0ZW0oKSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUpKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRkSXRlbXMoY29udmVydE9iamVjdFRvU2lnbmFsKHJlc3VsdC5kYXRhIHx8IFtdKSwgZmFsc2UsIHRydWUpO1xuICAgICAgdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLmVtaXQodGhpcy5zdG9yZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB0aGlzLm91dExvYWREYXRhRXJyb3IuZW1pdChlcnJvciBhcyBJSHR0cFJlc3BvbnNlRXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMub3V0TG9hZGluZy5lbWl0KHRoaXMubG9hZGluZygpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZmFrZVJlc3BvbnNlQXBpKCk6IFRZUEVfT0JKRUNUIHtcbiAgICB0aGlzLmxvYWRlZExhc3RJdGVtLnNldChmYWxzZSk7XG4gICAgdGhpcy5wYWdpbmdTdG9yZS5zZXQoe30pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFJlcXVlc3RTZXJ2aWNlLmZha2VSZXNwb25zZVBhZ2luZ0FwaSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxsQXBpQnlTZXJ2aWNlRm9vdGVyKCkge1xuICAgIGlmICghdGhpcy5odHRwUmVxdWVzdERhdGFGb290ZXIoKSB8fCAhdGhpcy5zaG93Rm9vdGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBhcmd1bWVudHNWYWx1ZSwgZ3VpZGVBdXRvVXBkYXRlQXJndW1lbnRzVmFsdWUgfSA9IHRoaXMuaHR0cFJlcXVlc3REYXRhRm9vdGVyKCkgYXMgSUh0dHBSZXF1ZXN0Q29uZmlnO1xuXG4gICAgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UudXBkYXRlQXJndW1lbnRzKGFyZ3VtZW50c1ZhbHVlLCB7IHN0b3JlUGFyYW1zQ2FsbEFwaTogdGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSB9LCB0aGlzLnBhZ2luZ1N0b3JlKCksIHRoaXMua2V5U2VhcmNoKCksIHRydWUsIGZhbHNlLCBndWlkZUF1dG9VcGRhdGVBcmd1bWVudHNWYWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5odHRwUmVxdWVzdFNlcnZpY2UuY2FsbEFwaSh0aGlzLmh0dHBSZXF1ZXN0RGF0YUZvb3RlcigpIGFzIElIdHRwUmVxdWVzdENvbmZpZyk7XG5cbiAgICB0aGlzLml0ZW1Gb290ZXIuc2V0KGNvbnZlcnRPYmplY3RUb1NpZ25hbChyZXN1bHQuZGF0YSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRJdGVtcyhpdGVtczogVFlQRV9EQVRBX1RBQkxFLCBhZGRGaXJzdDogYm9vbGVhbiwgaWdub3JlSGlnaHRMaWdodD86IGJvb2xlYW4sIGlnbm9yZVJlQ2FsbEZvb3Rlcj86IGJvb2xlYW4sIGF1dG9Db3VudE5ld0l0ZW0/OiBib29sZWFuKSB7XG4gICAgaWYgKCFpdGVtcygpIHx8ICFpdGVtcygpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpdGVtc0FkZDogQXJyYXk8V3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+PiA9IFtdO1xuXG4gICAgaXRlbXMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgaWYgKCF0aGlzLmNoZWNrRXhpc3RJdGVtKGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1zQWRkLnB1c2goaXRlbSk7XG4gICAgICAgIGlmICghaWdub3JlSGlnaHRMaWdodCkge1xuICAgICAgICAgIHRoaXMuaGFzSXRlbUhpZ2h0TGlnaHQuc2V0KHRydWUpO1xuICAgICAgICAgIGl0ZW0udXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgc3BlY2lmaWNIaWdodExpZ2h0OiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkRmlyc3QpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShkYXRhID0+IFtpdGVtLCAuLi5kYXRhXSk7XG4gICAgICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKGRhdGEgPT4gW2l0ZW0sIC4uLmRhdGFdKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShkYXRhID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICAgIHRoaXMuc3RvcmVzLnVwZGF0ZShkYXRhID0+IFsuLi5kYXRhLCBpdGVtXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGF1dG9Db3VudE5ld0l0ZW0gJiYgaXRlbXNBZGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvdGFsSXRlbUluQmFja2VuZC51cGRhdGUodmFsdWUgPT4gdmFsdWUgKyBpdGVtc0FkZC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoIWlnbm9yZUhpZ2h0TGlnaHQpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpdGVtc0FkZC5mb3JFYWNoKGl0ZW0gPT4gaXRlbS51cGRhdGUoZGF0YSA9PiAoeyAuLi5kYXRhLCBzcGVjaWZpY0hpZ2h0TGlnaHQ6IGZhbHNlIH0pKSk7XG4gICAgICAgIHRoaXMuaGFzSXRlbUhpZ2h0TGlnaHQuc2V0KGZhbHNlKTtcbiAgICAgIH0sIHRoaXMudGltZUhpZ2hsaWdoTmV3SXRlbSgpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgIGlmICghaWdub3JlUmVDYWxsRm9vdGVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxBcGlCeVNlcnZpY2VGb290ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXhpc3RJdGVtKGl0ZW1OZXc6IFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2l0ZW1OZXcoKVt0aGlzLmZpZWxkS2V5KCldfWApID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVJdGVtcyhrZXlzOiBBcnJheTx1bmtub3duPiwgaWdub3JlUmVDYWxsRm9vdGVyPzogYm9vbGVhbikge1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG4gICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBsZXQgaXNVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICBpZiAoYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCA9PT0gYCR7a2V5fWApIHtcbiAgICAgICAgICAgIGlzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpc1VwZGF0ZSA/IG5ld0l0ZW1zIDogaXRlbXM7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zdG9yZXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgbGV0IGlzVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSBpdGVtcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKSB7XG4gICAgICAgICAgICBpc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaXNVcGRhdGUgPyBuZXdJdGVtcyA6IGl0ZW1zO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5rZXlzU2VsZWN0ZWQoKSB8fCAhdGhpcy5rZXlzU2VsZWN0ZWQoKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQudXBkYXRlKGtleXMgPT4ga2V5cy5maWx0ZXIoa2V5U2VsZWN0ZWQgPT4ga2V5U2VsZWN0ZWQgIT09IGtleSkpO1xuICAgIH0pO1xuICAgIHRoaXMudG90YWxJdGVtSW5CYWNrZW5kLnVwZGF0ZSh2YWx1ZSA9PiB2YWx1ZSAtIGtleXMubGVuZ3RoKTtcbiAgICBhd2FpdCB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgaWYgKCFpZ25vcmVSZUNhbGxGb290ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbEFwaUJ5U2VydmljZUZvb3RlcigpO1xuICAgIH1cbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5odHRwUmVxdWVzdERhdGEoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFnaW5nU3RvcmUoKT8udG90YWxfaXRlbXMgfHwgdGhpcy5pdGVtcygpLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pdGVtcygpLmxlbmd0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm9keShlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubW91c2VTY3JvbGxDb250ZXh0KCkgIT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxIZWFkZXIoZTogRXZlbnQpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLm1vdXNlU2Nyb2xsQ29udGV4dCgpICE9PSAnaGVhZGVyJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAodGhpcy5ib2R5RWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIGlmICh0aGlzLmZvb3RlckVsZW1lbnRSZWYoKSkge1xuICAgICAgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpIGFzIGFueSkubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKGU6IEV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmxvYWRNb3JlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRNb3JlKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmcoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm91dExvYWRNb3JlLmVtaXQoeyBsb2FkTW9yZVN1Y2Nlc3M6IHRoaXMubG9hZE1vcmVTdWNjZXNzLmJpbmQodGhpcykgfSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1vcmVTdWNjZXNzKGRhdGE6IFdyaXRhYmxlU2lnbmFsPEFycmF5PFdyaXRhYmxlU2lnbmFsPFRZUEVfT0JKRUNUPj4+KSB7XG4gICAgdGhpcy5hZGRJdGVtcyhkYXRhLCBmYWxzZSk7XG4gICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRMb2FkaW5nLmVtaXQodGhpcy5sb2FkaW5nKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKCkge1xuICAgIHRoaXMua2V5c1NlbGVjdGVkLnNldChbXSk7XG4gICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZUNoZWNrZWRBbGxJdGVtcyhldmVudDogSUNoZWNrYm94RXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5maWx0ZXIoYXN5bmMgKGl0ZW0pID0+ICEoYXdhaXQgdGhpcy5jaGVja0NhbmNlbENvbmRpdGlvbkNoZWNrZWRJdGVtKGl0ZW0pKSkubWFwKGl0ZW0gPT4gYCR7aXRlbSgpW3RoaXMuZmllbGRLZXkoKV19YCkpO1xuICAgICAgdGhpcy5vdXRLZXlzU2VsZWN0ZWQuZW1pdCh7IGtleXM6IHRoaXMua2V5c1NlbGVjdGVkKCkgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KFtdKTtcbiAgICB0aGlzLm91dEtleXNTZWxlY3RlZC5lbWl0KHsga2V5czogdGhpcy5rZXlzU2VsZWN0ZWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tDYW5jZWxDb25kaXRpb25DaGVja2VkSXRlbShpdGVtOiBXcml0YWJsZVNpZ25hbDxUWVBFX09CSkVDVD4pIHtcbiAgICBsZXQgaXNDYW5jZWxDaGVjayA9IGZhbHNlO1xuXG4gICAgaWYgKCFpc0NhbmNlbENoZWNrICYmIHRoaXMuaGVhZGVyTGVmdCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlckxlZnQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuKSB7XG4gICAgICBpc0NhbmNlbENoZWNrID0gYXdhaXQgbGFzdFZhbHVlRnJvbSgodGhpcy5oZWFkZXJMZWZ0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiBhcyBhbnkpKHsgaXRlbTogaXRlbSgpIH0pKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FuY2VsQ2hlY2sgJiYgdGhpcy5oZWFkZXJSaWdodCgpLmxlbmd0aCAmJiB0aGlzLmhlYWRlclJpZ2h0KClbMF0uY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbikge1xuICAgICAgaXNDYW5jZWxDaGVjayA9IGF3YWl0IGxhc3RWYWx1ZUZyb20oKHRoaXMuaGVhZGVyUmlnaHQoKVswXS5jaGVja0NvbmRpdGlvbkNoZWNrQm94SGlkZGVuIGFzIGFueSkoeyBpdGVtOiBpdGVtKCkgfSkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBpc0NhbmNlbENoZWNrO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VJdGVtQ2hlY2tlZChldmVudDogSUNoZWNrYm94SXRlbSwgaXRlbTogVFlQRV9PQkpFQ1QpIHtcbiAgICBjb25zdCBrZXkgPSBpdGVtW3RoaXMuZmllbGRLZXkoKV07XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQodGhpcy5rZXlzU2VsZWN0ZWQoKSk7XG5cbiAgICBrZXlzLmFkZChrZXkpO1xuICAgIGlmICghZXZlbnQuY2hlY2tlZCkge1xuICAgICAga2V5cy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KEFycmF5LmZyb20oa2V5cykpO1xuICAgIHRoaXMub3V0S2V5c1NlbGVjdGVkLmVtaXQoeyBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VTb3J0KHNvcnQ6IElTb3J0KSB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2VTb3J0ICYmIHRoaXMuaW5zdGFuY2VTb3J0KCk/LmZpZWxkU29ydCAhPT0gc29ydC5maWVsZFNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFuY2VTb3J0LnNldChzb3J0KTtcbiAgICBpZiAodGhpcy5zb3J0TG9jYWwoKSkge1xuICAgICAgdGhpcy5oYW5kbGVyU29ydExvY2FsKHNvcnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RvcmVQYXJhbXNDYWxsQXBpLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIGluc3RhbmNlU29ydDogdGhpcy5pbnN0YW5jZVNvcnQoKSB9KSk7XG4gICAgdGhpcy5jYWxsQXBpQnlTZXJ2aWNlKHRydWUpO1xuICAgIHRoaXMub3V0U29ydC5lbWl0KHtcbiAgICAgIHNvcnQ6IHNvcnQsXG4gICAgICBvblNvcnRTdWNjZXNzOiB0aGlzLm9uU29ydFN1Y2Nlc3MuYmluZCh0aGlzKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU29ydExvY2FsKHNvcnQ6IElTb3J0KSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyT3JTb3J0TG9jYWwoKSAmJiB0aGlzLnN0b3JlcygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pdGVtcy5zZXQodGhpcy5maWx0ZXJPclNvcnRMb2NhbCgpPy4oc2lnbmFsKFsuLi50aGlzLnN0b3JlcygpXSksIHsgLi4udGhpcy5zdG9yZVBhcmFtc0NhbGxBcGkoKSwgaW5zdGFuY2VTb3J0OiBzb3J0IH0pIHx8IFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGZpZWxkU29ydCwgbW9kZSB9ID0gc29ydDtcblxuICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgIGl0ZW1zLnNvcnQoKGl0ZW1BLCBpdGVtQikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUxID0gbW9kZSA9PT0gJ2FzYycgPyBpdGVtQSgpW2ZpZWxkU29ydF0gOiBpdGVtQigpW2ZpZWxkU29ydF07XG4gICAgICAgIGxldCB2YWx1ZTIgPSBtb2RlID09PSAnYXNjJyA/IGl0ZW1CKClbZmllbGRTb3J0XSA6IGl0ZW1BKClbZmllbGRTb3J0XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZTEgPSBkZWxldGVVbmljb2RlKHZhbHVlMSkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICB2YWx1ZTIgPSBkZWxldGVVbmljb2RlKHZhbHVlMikudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlMSA+IHZhbHVlMiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICB9KTtcbiAgICB0aGlzLm9uU29ydFN1Y2Nlc3MoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sTW9yZVNlbGVjdEl0ZW0oZnVuY3Rpb25Db250cm9sOiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9sU2VsZWN0TW9yZUl0ZW0gPSBmdW5jdGlvbkNvbnRyb2w7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQua2V5IHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbFNlbGVjdE1vcmVJdGVtPy5yZXNldCgpO1xuXG4gICAgY29uc3QgcGVyUGFnZSA9IE51bWJlcihldmVudC5rZXkpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBjdXJyZW50UGFnZSA9IE51bWJlcih0aGlzLnNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlKSkudmFsdWVPZigpO1xuICAgIGNvbnN0IGlzUGFnaW5nTnVtYmVyID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5wYWdpbmdOdW1iZXI7XG5cbiAgICBpZiAoY3VycmVudFBhZ2UgPiBwZXJQYWdlIHx8IHRoaXMuaXRlbXMubGVuZ3RoID49IHBlclBhZ2UpIHtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5zbGljZSgwLCBwZXJQYWdlKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxBcGlCeVNlcnZpY2UodHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3Qgc3ViID0gdGhpcy5vdXRMb2FkRGF0YUNvbXBsZXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIGlmICghaXNQYWdpbmdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRQZXJQYWdlU2VsZWN0TW9yZUl0ZW0oY3VycmVudFBhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5rZXlzU2VsZWN0ZWQuc2V0KHRoaXMuaXRlbXMoKS5zbGljZSgwLCBwZXJQYWdlKS5tYXAoaXRlbSA9PiBgJHtpdGVtKClbdGhpcy5maWVsZEtleSgpXX1gKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm91dExvYWREYXRhRXJyb3Iuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc2V0UGVyUGFnZVNlbGVjdE1vcmVJdGVtKGN1cnJlbnRQYWdlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldFBlclBhZ2VTZWxlY3RNb3JlSXRlbShwZXJQYWdlOiBzdHJpbmcgfCBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyZ3VtZW50c1ZhbHVlID0gdGhpcy5odHRwUmVxdWVzdERhdGEoKT8uYXJndW1lbnRzVmFsdWU7XG5cbiAgICBpZiAoIWFyZ3VtZW50c1ZhbHVlIHx8ICF0aGlzLmNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgIHJldHVybiAnLTEnO1xuICAgIH1cbiAgICBjb25zdCBrZXlQZXJQYWdlID0gdGhpcy5jb25maWdTZWxlY3RNb3JlSXRlbSgpPy5rZXlQZXJQYWdlIHx8ICdwZXJfcGFnZSc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50c1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYXJndW1lbnQgPSBhcmd1bWVudHNWYWx1ZVtpXTtcblxuICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgSHR0cFBhcmFtcyAmJiBhcmd1bWVudC5oYXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBhcmd1bWVudC5nZXQoa2V5UGVyUGFnZSkgfHwgJzI1JztcblxuICAgICAgICBhcmd1bWVudCA9IGFyZ3VtZW50LnNldChrZXlQZXJQYWdlLCBwZXJQYWdlKTtcbiAgICAgICAgc2V0KGFyZ3VtZW50c1ZhbHVlLCBgJHtpfWAsIGFyZ3VtZW50KTtcblxuICAgICAgICByZXR1cm4gY3VycmVudFBlclBhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYmplY3Qua2V5cyhhcmd1bWVudCkuaW5jbHVkZXMoa2V5UGVyUGFnZSkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBlclBhZ2UgPSBhcmd1bWVudC5nZXQoa2V5UGVyUGFnZSkgfHwgJzI1JztcblxuICAgICAgICBzZXQoYXJndW1lbnQsIGtleVBlclBhZ2UsIHBlclBhZ2UpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50UGVyUGFnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJy0xJztcbiAgfVxuXG4gIHByaXZhdGUgb25Tb3J0U3VjY2VzcygpIHtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJCdXR0b25DbGljayh0eXBlOiAnYnV0dG9uJyB8ICdidXR0b24tZHJvcGRvd24nLCBidXR0b25Ecm9wZG93bkRhdGE6IGFueSwgYnV0dG9uOiBJQnV0dG9uKSB7IC8vIGJ1dHRvbk9yaWdpbiBjaOG7iSBz4butIGThu6VuZyBraGkgZMO5bmcgYnV0dG9uQWN0aW9ucyBjw7MgYnV0dG9uLWRyb3Bkb3duXG4gICAgaWYgKHR5cGUgPT09ICdidXR0b24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b246IGJ1dHRvbiB9KTtcbiAgICB9XG4gICAgdGhpcy5vdXRDbGlja0J1dHRvbkFjdGlvbi5lbWl0KHsgaXRlbTogdGhpcy5pdGVtT2ZJbmRleEhvdmVyLCBidXR0b24sIGJ1dHRvbkRyb3Bkb3duRGF0YSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQmFyQnV0dG9uQ2xpY2soYnV0dG9uOiBJQnV0dG9uKSB7XG4gICAgY29uc3QgaXRlbXM6IEFycmF5PFdyaXRhYmxlU2lnbmFsPGFueT4+ID0gW107XG5cbiAgICB0aGlzLmtleXNTZWxlY3RlZCgpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGAke2l0ZW0oKVt0aGlzLmZpZWxkS2V5KCldfWAgPT09IGAke2tleX1gKTtcblxuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm91dENsaWNrQmFyQnV0dG9uLmVtaXQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgaXRlbXMsXG4gICAgICBrZXlzOiB0aGlzLmtleXNTZWxlY3RlZCgpLFxuICAgICAgaGlkZGVuQmFyQnV0dG9uczogKCkgPT4ge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckJ1dHRvbkRyb3Bkb3duRXZlbnQoZXZlbnROYW1lOiBUWVBFX1BPUE9WRVJfRVZFTlQpIHtcbiAgICB0aGlzLmhhc0FjdGlvbkJ1dHRvbkRyb3Bkb3duQ29udGVudC5zZXQodHJ1ZSk7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3JlbW92ZScgfHwgZXZlbnROYW1lID09PSAnbW91c2VsZWF2ZS1jb250ZW50Jykge1xuICAgICAgdGhpcy5oYXNBY3Rpb25CdXR0b25Ecm9wZG93bkNvbnRlbnQuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0SW5kZXhIb3ZlcihlOiBFdmVudCwgaXRlbTogV3JpdGFibGVTaWduYWw8VFlQRV9PQkpFQ1Q+KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gaXRlbTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXJXaGVuTW91c2VMZWF2ZShlPzogRXZlbnQpIHtcbiAgICBlPy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjdXJyZW50SW5kZXhJdGVtSG92ZXIgPSB0aGlzLml0ZW1PZkluZGV4SG92ZXI7XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0TGVhdmVJdGVtKCkpO1xuICAgIHRoaXMudGltZW91dExlYXZlSXRlbS5zZXQoc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pdGVtT2ZJbmRleEhvdmVyICYmIHRoaXMuaXRlbU9mSW5kZXhIb3ZlciAhPT0gY3VycmVudEluZGV4SXRlbUhvdmVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGUpO1xuICAgIH0pKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEluZGV4SG92ZXIoZT86IEV2ZW50KSB7XG4gICAgZT8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaGFzQWN0aW9uQnV0dG9uRHJvcGRvd25Db250ZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pdGVtT2ZJbmRleEhvdmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJNb3VzZUVudGVySGVhZGVyKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2V0TW91c2VDb250ZXh0KCdoZWFkZXInKTtcbiAgICB0aGlzLnJlc2V0SW5kZXhIb3ZlcihldmVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJCb2R5KGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2V0TW91c2VDb250ZXh0KCdib2R5Jyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlck1vdXNlRW50ZXJGb290ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZXRNb3VzZUNvbnRleHQoJ2Zvb3RlcicpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUoJ2JnLVsjZjhmOWZhXScpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QucmVtb3ZlKCdiZy1bI2Y4ZjlmYV0nKTtcbiAgICAgIHRoaXMuZm9vdGVyRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgICAgdGhpcy5mb290ZXJMZWZ0RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jbGFzc0xpc3QuYWRkKHRoaXMuY2xhc3NGb290ZXJJbmNsdWRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUNvbnRhaW5lcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNldE1vdXNlQ29udGV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMucmVzZXRJbmRleEhvdmVyKGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTW91c2VMZWF2ZUZvb3RlcihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSkge1xuICAgICAgdGhpcy5mb290ZXJFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5jbGFzc0Zvb3RlckluY2x1ZGUoKSk7XG4gICAgICB0aGlzLmZvb3RlckVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2xhc3NMaXN0LmFkZCgnYmctWyNmOGY5ZmFdJyk7XG4gICAgICB0aGlzLmZvb3RlckxlZnRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ2JnLVsjZjhmOWZhXScpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRNb3VzZUNvbnRleHQoY29udGV4dDogJ2hlYWRlcicgfCAnYm9keScgfCAnZm9vdGVyJyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMubW91c2VTY3JvbGxDb250ZXh0LnNldChjb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTY3JvbGwoKSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5oZWFkZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5Cb2R5RWxlbWVudCkge1xuICAgICAgdGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgdGhpcy5Cb2R5RWxlbWVudC5zY3JvbGxMZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9vdGVyRWxlbWVudFJlZigpKSB7XG4gICAgICAodGhpcy5mb290ZXJFbGVtZW50UmVmKCkgYXMgYW55KS5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoY2xlYXJTb3J0PzogYm9vbGVhbikge1xuICAgIGlmIChjbGVhclNvcnQpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VTb3J0KCk/LnJlc2V0KCk7XG4gICAgICB0aGlzLmluc3RhbmNlU29ydC5zZXQodW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdGhpcy5oYXNTY3JvbGwuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dExvYWRpbmcuZW1pdCh0aGlzLmxvYWRpbmcoKSk7XG4gICAgdGhpcy5pdGVtcy5zZXQoW10pO1xuICAgIHRoaXMuc3RvcmVzLnNldChbXSk7XG4gICAgdGhpcy5mYWtlUmVzcG9uc2VBcGkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tTY3JvbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzU2Nyb2xsID0gdGhpcy5oYXNTY3JvbGwoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRpbWVyKDUwMCkucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5Cb2R5RWxlbWVudCkge1xuICAgICAgICAgIHRoaXMuaGFzU2Nyb2xsLnNldCh0aGlzLkJvZHlFbGVtZW50LnNjcm9sbEhlaWdodCA+IHRoaXMuQm9keUVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzU2Nyb2xsICYmICF0aGlzLmhhc1Njcm9sbCgpKSB7XG4gICAgICAgICAgdGhpcy5vdXRTY3JvbGxJc0dvbmUuZW1pdCh7fSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpbHRlck9yU29ydExvY2FsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbEFwaUJ5U2VydmljZSh0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IEJvZHlFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5RWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dExlYXZlSXRlbSgpKTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPSdmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGwnPlxuICBAaWYgKCFpZ25vcmVCYXIoKSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmUgei1bMV0gYm90dG9tLTAgbGVmdC0wIHctZnVsbCBiZy13aGl0ZSBsaWJzLXVpLXRhYmxlLXNoYWRvdy1ib3R0b20ge3sgY2xhc3NCYXJJbmNsdWRlKCkgfX1cIlxuICAgICAgW2NsYXNzLnB4LVsxNnB4XV09XCJrZXlzU2VsZWN0ZWQoKS5sZW5ndGggfHwgbGFiZWxCYXJOb1NlbGVjdEl0ZW0oKVwiXG4gICAgICBbY2xhc3MucHktWzZweF1dPVwia2V5c1NlbGVjdGVkKCkubGVuZ3RoIHx8IGxhYmVsQmFyTm9TZWxlY3RJdGVtKClcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwicmVzZXRJbmRleEhvdmVyKCRldmVudClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0nZGl2LmxpYnMtdWktdGFibGUtYmFyLWxlZnQnPjwvbmctY29udGVudD5cbiAgICAgIEBpZiAoIWtleXNTZWxlY3RlZCgpLmxlbmd0aCAmJiBsYWJlbEJhck5vU2VsZWN0SXRlbSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBjbGFzc0xhYmVsQmFyTm9TZWxlY3RJdGVtKCkgPz8gJ3B4LVsxMnB4XSBweS1bNXB4XScgfX1cIlxuICAgICAgICAgIFtpbm5lckh0bWxdPSdsYWJlbEJhck5vU2VsZWN0SXRlbSgpIHwgdHJhbnNsYXRlOnt2YWx1ZTp0b3RhbEl0ZW1EaXNwbGF5KCl9Jz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAaWYgKGtleXNTZWxlY3RlZCgpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcGwtWzEycHhdXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGgtZnVsbCBtdC1bLTJweF1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtjaGVja2VkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgZGlzYWJsZUNoZWNrYm94KClcIlxuICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VBbGxDaGVja2VkKClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVtIHRleHQtWyMwNzE2MzFdIG1yLVs4cHhdIHt7IGNsYXNzTGFiZWxCYXJCdXR0b25zKCkgfX1cIj5cbiAgICAgICAgICAgIHt7IGxhYmVsQmFyQnV0dG9ucygpIHwgdHJhbnNsYXRlOnsgdmFsdWU6a2V5c1NlbGVjdGVkKCkubGVuZ3RoIH0gfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvbmZpZ1NlbGVjdE1vcmVJdGVtKCkpIHtcbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7XG4gICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDpmYWxzZSxcbiAgICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6ICAyMDQ4LFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTonIXctWzEyMXB4XScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICAgIG1vZGU6J3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOjBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ01vcmVJdGVtKClcIlxuICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIiF3LVsxNnB4XSBoLVsxNnB4XSBtci1bOHB4XVwiXG4gICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkTW9yZUl0ZW0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xNb3JlU2VsZWN0SXRlbSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG0tMCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidiZWZvcmU6IXRleHQtWzE2cHhdIGxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCBtci1bNnB4XSdcIlxuICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIntjb25maWc6e2NvbnRlbnQ6J2kxOG5fbW9yZV9zZWxlY3QnfX1cIlxuICAgICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMTZweF0gbGlicy11aS1ib3JkZXItbGVmdC1nZW5lcmFsIG1sLVsxNnB4XVwiPjwvZGl2PlxuICAgICAgICAgIEBpZiAoYmFyQnV0dG9ucygpPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIEBmb3IgKGJ1dHRvbiBvZiBiYXJCdXR0b25zKCk7dHJhY2sgYnV0dG9uKSB7XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiYnV0dG9uLnR5cGUgfHwgJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJidXR0b24uY2xhc3NJY29uTGVmdCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJidXR0b24uY2xhc3NJbmNsdWRlIHx8ICcnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiKGJ1dHRvbi5sYWJlbCB8fCAnICcpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckJhckJ1dHRvbkNsaWNrKGJ1dHRvbilcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9J2Rpdi5saWJzLXVpLXRhYmxlLWJhci1yaWdodCc+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICB9XG5cbiAgPGRpdiAjdGFibGVDb250YWluZXJFbGVtZW50UmVmXG4gICAgY2xhc3M9XCJsaWJzLXVpLXRhYmxlIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtZnVsbCByZWxhdGl2ZSB7eyBjbGFzc1RhYmxlQ29udGFpbmVySW5jbHVkZSgpIH19XCJcbiAgICBbY2xhc3MucHgtWzE2cHhdXT0nIWlnbm9yZUJhcigpJ1xuICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlQ29udGFpbmVyKCRldmVudClcIj5cbiAgICA8ZGl2ICNoZWFkZXJFbGVtZW50UmVmXG4gICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgW29wdGlvbnNdPVwie3Njcm9sbGJhcldpZHRoOiAwfVwiXG4gICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLWRhc2hlZC1nZW5lcmFsXT1cIiFoYXNJdGVtSGlnaHRMaWdodCgpICYmIGlzRGFzaEJvcmRlcigpXCJcbiAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbF09XCIhaGFzSXRlbUhpZ2h0TGlnaHQoKSAmJiAhaXNEYXNoQm9yZGVyKClcIlxuICAgICAgW2NsYXNzLiFoaWRkZW5dPVwiIWl0ZW1zKCkubGVuZ3RoICYmIGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpXCJcbiAgICAgIFtjbGFzc109XCJjbGFzc0hlYWRlckNvbnRhaW5lcigpXCJcbiAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbEhlYWRlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJNb3VzZUVudGVySGVhZGVyKCRldmVudClcIj5cbiAgICAgIEBpZiAoaGVhZGVyTGVmdCgpLmxlbmd0aCkge1xuICAgICAgICA8ZGl2IFtjbGFzc109XCJjbGFzc0hlYWRlckxlZnRDb250YWluZXIoKVwiPlxuICAgICAgICAgIEBmb3IgKGhlYWRlciBvZiBoZWFkZXJMZWZ0KCk7dHJhY2sgaGVhZGVyKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJSZWY7Y29udGV4dDp7aGVhZGVySXRlbTpoZWFkZXIsaXNIZWFkZXJMZWZ0OnRydWV9XCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChoZWFkZXJSaWdodCgpLmxlbmd0aCkge1xuICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJSZWY7Y29udGV4dDp7aGVhZGVySXRlbTpoZWFkZXIsaXNIZWFkZXJMZWZ0OmZhbHNlfVwiIC8+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ3RvcCcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9J3RlbXBsYXRlRm9vdGVyUmVmJyAvPlxuICAgIH1cbiAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1mdWxsIG92ZXJmbG93LXgtaGlkZGVuIGJnLXdoaXRlIHt7IGNsYXNzQm9keUluY2x1ZGUoKSB8fCAnJyB9fVwiPlxuICAgICAgPGRpdiAjYm9keUVsZW1lbnRSZWZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICBbb3B0aW9uc109XCJ7c2Nyb2xsWDogKCFoZWFkZXJMZWZ0KCkubGVuZ3RoIHx8ICFoZWFkZXJSaWdodCgpKSA/ICdoaWRkZW4nOidzY3JvbGwnfVwiXG4gICAgICAgIChvdXRTY3JvbGwpPVwiaGFuZGxlclNjcm9sbEJvZHkoJGV2ZW50KVwiXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlck1vdXNlRW50ZXJCb2R5KCRldmVudClcIj5cbiAgICAgICAgQGlmIChpdGVtcygpLmxlbmd0aCkge1xuICAgICAgICAgIDx2aXJ0dWFsLXNjcm9sbGVyICNib2R5Q29tcG9uZW50UmVmXG4gICAgICAgICAgICBbaXRlbXNdPVwiaXRlbXMoKVwiXG4gICAgICAgICAgICBbZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXNdPVwiZW5hYmxlVW5lcXVhbENoaWxkcmVuU2l6ZXMoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImgtZnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaGVhZGVyRWxlbWVudFJlZi5zY3JvbGxXaWR0aCA+IChib2R5RWxlbWVudFJlZiA/IGJvZHlFbGVtZW50UmVmLnNjcm9sbFdpZHRoIDogMCkgPyBoZWFkZXJFbGVtZW50UmVmLnNjcm9sbFdpZHRoOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW3BhcmVudFNjcm9sbF09XCJib2R5RWxlbWVudFJlZlwiXG4gICAgICAgICAgICBbYnVmZmVyQW1vdW50XT1cImJ1ZmZlckFtb3VudCgpXCI+XG4gICAgICAgICAgICBAZm9yIChkYXRhIG9mIGJvZHlDb21wb25lbnRSZWYudmlld1BvcnRJdGVtczt0cmFjayBkYXRhKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiAjZWxlbWVudEhvdmVyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWJvcmRlci10b3AtMXB4LTM2ZDNkM109XCJkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0ICYmICRmaXJzdCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubGlicy11aS1ib3JkZXItYm90dG9tLTFweC0zNmQzZDNdPVwiZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCAmJiAhaWdub3JlQm9yZGVySXRlbSgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodCB8fCAoJGxhc3QgJiYgaWdub3JlQm9yZGVySXRlbUxhc3QoKSkpID8gJ2xpYnMtdWktYm9yZGVyLXJhZGl1cy1ib3R0b20tbGVmdC00cHggbGlicy11aS1ib3JkZXItcmFkaXVzLWJvdHRvbS1yaWdodC00cHgnIDogaWdub3JlQm9yZGVySXRlbSgpID8gJycgOiBpc0Rhc2hCb3JkZXIoKSA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZGFzaGVkLWdlbmVyYWwnIDogJ2xpYnMtdWktYm9yZGVyLWJvdHRvbS1nZW5lcmFsJ1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImhlYWRlckVsZW1lbnRSZWYuc2Nyb2xsV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5iZy1bI2Y4ZjlmYV1dPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YSgpLnNwZWNpZmljSGlnaHRMaWdodFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SW5kZXhIb3ZlcigkZXZlbnQsZGF0YSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInJlc2V0SW5kZXhIb3ZlcldoZW5Nb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGggfHwgaGVhZGVyUmlnaHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlckxlZnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIWRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmctWyNmM2ZjZmNdXT1cImRhdGEoKS5zcGVjaWZpY0hpZ2h0TGlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoaGVhZGVyIG9mIGhlYWRlckxlZnQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdIHt7IGhlYWRlci5pZ25vcmVCb3JkZXJSaWdodCA/ICcnOiAnbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbCcgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJnLVsjZjhmOWZhXV09XCJpdGVtT2ZJbmRleEhvdmVyID09PSBkYXRhICYmICFkYXRhKCkuc3BlY2lmaWNIaWdodExpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihoZWFkZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmhlYWRlckxlZnQoKTpoZWFkZXJSaWdodCgpKSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaGVhZGVyLm5nQ2xhc3MgfHwgIHt9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVCb2R5UmVmO2NvbnRleHQ6e2hlYWRlcjpoZWFkZXIsZGF0YTpkYXRhfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclJpZ2h0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChoZWFkZXIgb2YgaGVhZGVyUmlnaHQoKTt0cmFjayBoZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggcHgtWzEycHhdIHB5LVs4cHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCIoaGVhZGVyfExpYnNVaVRhYmxlQ2FsY3VsYXRvckNvbHVtblBpcGU6aGVhZGVyRWxlbWVudFJlZi5jbGllbnRXaWR0aDpoZWFkZXJMZWZ0KCk6aGVhZGVyUmlnaHQoKSkgfHwgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93ID8ge3dpZHRoOic1MHB4JywnZmxleC1zaGlyayc6JzAnLHBhZGRpbmc6JzhweCd9IDoge30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJoZWFkZXIubmdDbGFzcyB8fCB7fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUJvZHlSZWY7Y29udGV4dDp7aGVhZGVyOmhlYWRlcixkYXRhOmRhdGF9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpICYmIGRhdGEoKS5zcGVjaWZpY0V4cGFuZCAmJiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNzc1dyYXBwZXIgfHwgJ2ZsZXggdy1mdWxsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUV4cGFuZCBvZiBkYXRhKClbY29uZmlnVGVtcGxhdGVJdGVtQ29sbGFwc2VFeHBhbmQoKT8uZmllbGRHZXREYXRhRXhwYW5kIHx8ICdzcGVjaWZpY0RhdGFFeHBhbmQnXSgpO3RyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LmNvbFRlbXBsYXRlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiZGF0YUV4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVDc3NXcmFwcGVyXT1cImNvbmZpZ1RlbXBsYXRlSXRlbUNvbGxhcHNlRXhwYW5kKCk/LnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJjb25maWdUZW1wbGF0ZUl0ZW1Db2xsYXBzZUV4cGFuZCgpPy5jb2xUZW1wbGF0ZUNvbmZpZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVtcHR5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGgtWzEwMHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cbiAgICAgICAgfSBAZWxzZSBpZiAoIWxvYWRpbmcoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGlja3kgbGVmdC0wIHRvcC0wIHotWzFdIGgtZnVsbCB3LWZ1bGxcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZU5vZGF0YVJlZlwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHNob3dGb290ZXIoKSAmJiBpdGVtRm9vdGVyKCkgJiYgY3VzdG9tUG9zaXRpb25Gb290ZXIoKSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD0ndGVtcGxhdGVGb290ZXJSZWYnIC8+XG4gICAgICB9XG5cbiAgICAgIEBpZiAobG9hZGluZygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSB3LWZ1bGwgaC1mdWxsIHotWzJdIGZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1zcGlubmVyIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3RlbXBsYXRlSGVhZGVyUmVmXG4gIGxldC1oZWFkZXI9J2hlYWRlckl0ZW0nXG4gIGxldC1pc0hlYWRlckxlZnQ9J2lzSGVhZGVyTGVmdCc+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiJ3JlbGF0aXZlIGZsZXggJysgKGhlYWRlci5wYWRkaW5nTGVmdFJpZ2h0SGVhZGVyQ29udGFpbmVyID8/ICcgcHgtWzEycHhdICcpICsgKGlzSGVhZGVyTGVmdCAmJiAhaGVhZGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyBsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsICcgOiAnICcpKyAnIGxpYnMtdWktdGFibGUtaGVhZGVyLWNvbCAnXCJcbiAgICBbY2xhc3MuZmxleC1jb2xdPVwiaGVhZGVyLnJvd3NDb25maWdcIlxuICAgIFtjbGFzcy5weS1bOHB4XV09JyFoZWFkZXIuaWdub3JlUHlEZWZhdWx0J1xuICAgIFtuZ1N0eWxlXT1cIihoZWFkZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmhlYWRlckxlZnQoKTpoZWFkZXJSaWdodCgpKSB8fCAoaGVhZGVyLmlzU2hvd0luZGV4T25Sb3cgPyB7d2lkdGg6JzUwcHgnLCdmbGV4LXNoaXJrJzonMCcscGFkZGluZzonOHB4J30gOiB7fSlcIlxuICAgIFtuZ0NsYXNzXT1cImhlYWRlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgQGlmICghaGVhZGVyLnJvd3NDb25maWcpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7Y29udGV4dDp7aGVhZGVySXRlbTpoZWFkZXIsaXNDb2xSZW5kZXI6ZmFsc2V9XCIgLz5cbiAgICB9XG4gICAgQGlmIChoZWFkZXIucm93c0NvbmZpZzthcyByb3dzQ29uZmlnKSB7XG4gICAgICBAZm9yIChyb3cgb2Ygcm93c0NvbmZpZy5yb3dzO3RyYWNrIHJvdykge1xuICAgICAgICA8ZGl2IFtjbGFzc109XCJyb3cuY2xhc3NSb3dcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2Ygcm93LmNvbHMgOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZUhlYWRlckNvbnRlbnRSZWY7Y29udGV4dDp7aGVhZGVySXRlbTpjb2wsaXNDb2xSZW5kZXI6dHJ1ZX1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVIZWFkZXJDb250ZW50UmVmXG4gIGxldC1oZWFkZXI9J2hlYWRlckl0ZW0nXG4gIGxldC1pc0NvbFJlbmRlcj0naXNDb2xSZW5kZXInPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBsaWJzLXVpLWZvbnQtaDZtIG1pbi1oLVsxOHB4XSB0ZXh0LVsjNmE3MzgzXSBtYXgtdy1mdWxsXCJcbiAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT0naGVhZGVyLmNvbnRlbnRIZWFkZXJBbGlnbkNlbnRlciA/PyB0cnVlJ1xuICAgIFtjbGFzcy5qdXN0aWZ5LWVuZF09J2hlYWRlci5jb250ZW50SGVhZGVySnVzdGlmeUNvbnRlbnRFbmQnXG4gICAgW2NsYXNzLnctZnVsbF09XCJoZWFkZXIuaXNTaG93SW5kZXhPblJvd1wiXG4gICAgW25nU3R5bGVdPVwiaXNDb2xSZW5kZXIgPyAoKGhlYWRlcnxMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOmhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGg6aGVhZGVyTGVmdCgpOmhlYWRlclJpZ2h0KCkpIHx8IChoZWFkZXIuaXNTaG93SW5kZXhPblJvdyA/IHt3aWR0aDonNTBweCcsJ2ZsZXgtc2hpcmsnOicwJyxwYWRkaW5nOic4cHgnfSA6IHt9KSkgOiB7fVwiXG4gICAgW25nQ2xhc3NdPVwiaXNDb2xSZW5kZXIgPyAoaGVhZGVyLm5nQ2xhc3MgfHwge30pIDoge31cIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgQGlmIChoZWFkZXIuaGFzQ2hlY2tib3hBbGwpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIHt7IGhlYWRlci5jaGVja2JveEFsbENsYXNzSW5jbHVkZSB8fCAnbXItWzE2cHhdJyB9fVwiXG4gICAgICAgICAgW2NsYXNzLml0ZW1zLWNlbnRlcl09XCJoZWFkZXIuY2hlY2tib3hBbGlnbkNlbnRlclwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtrZXldPVwiJ2FsbCdcIlxuICAgICAgICAgICAgW3N0aWxsT3RoZXJPcHRpb25zXT1cIiEha2V5c1NlbGVjdGVkKCkubGVuZ3RoICYmIGtleXNTZWxlY3RlZCgpLmxlbmd0aCAhPT0gaXRlbXMoKS5sZW5ndGhcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFrZXlzU2VsZWN0ZWQoKS5sZW5ndGggJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID09PSBpdGVtcygpLmxlbmd0aFwiXG4gICAgICAgICAgICBbZGlzYWJsZV09XCJsb2FkaW5nKClcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJoZWFkZXIuY2hlY2tib3hDbGFzc0luY2x1ZGVcIlxuICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlQ2hlY2tlZEFsbEl0ZW1zKCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBoLWZ1bGwgbWwtWzI0cHhdIHt7IGhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZSB9fVwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5pc1Nob3dJbmRleE9uUm93KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgaC1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB7eyBoZWFkZXIuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICB7eyBoZWFkZXIubGFiZWwgPz8gJyMnIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAoKGhlYWRlci5sYWJlbCB8IExpYnNVaVBpcGVzQ2FsbEZ1bmN0aW9uSW5UZW1wbGF0ZVBpcGU6aGVhZGVyLnBhcnNlVmFsdWU6aGVhZGVyKSB8IGFzeW5jIHwgdHJhbnNsYXRlOyBhcyBsYWJlbEhlYWRlckNvbHVtbikge1xuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW3R5cGVdPVwiaGVhZGVyPy5sYWJlbENvbmZpZz8udHlwZSB8fCAndGV4dCdcIlxuICAgICAgICAgIFttb2RlXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lm1vZGUgfHwgJ2hvdmVyJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIoaGVhZGVyPy5sYWJlbENvbmZpZz8uY2xhc3NJbmNsdWRlIHx8ICcnKVwiXG4gICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cImhlYWRlcj8ubGFiZWxDb25maWc/Lmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cImhlYWRlci5sYWJlbENvbmZpZz8uY29uZmlnIHx8IHtjb250ZW50OmxhYmVsSGVhZGVyQ29sdW1ufVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJsYWJlbEhlYWRlckNvbHVtblwiIC8+XG4gICAgICB9XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIudG9vbHRpcE90aGVyOyBhcyB0b29sdGlwKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWwtWzRweF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cInRvb2x0aXA/LnR5cGUgfHwgJ290aGVyJ1wiXG4gICAgICAgICAgW21vZGVdPVwidG9vbHRpcD8ubW9kZSB8fCAnaG92ZXInXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cInRvb2x0aXAuY2xhc3NJbmNsdWRlIHx8ICd0ZXh0LVsjNmE3MzgzXSdcIlxuICAgICAgICAgIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0b29sdGlwLmlnbm9yZVNob3dUb29sdGlwIHx8IGZhbHNlXCJcbiAgICAgICAgICBbY29uZmlnXT1cInRvb2x0aXAuY29uZmlnIHx8IHtjb250ZW50Oih0b29sdGlwLmRhdGFWaWV3IHx8ICcgJykgfCB0cmFuc2xhdGUsIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIG1vZGU6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBkaXN0YW5jZTogMCxcbiAgICAgICAgICAgICAgYXV0b1VwZGF0ZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgZW5kRGlzdGFuY2U6IDEyLFxuICAgICAgICAgICAgICAgIHN0YXJ0RGlzdGFuY2U6IC0xMlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJ0b29sdGlwLmRhdGFWaWV3XCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIEBpZiAoaGVhZGVyLmhhc1NvcnQgJiYgaGVhZGVyLm9yZGVyYnkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtbC1bNHB4XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc29ydC1hcnJvdyBbZGlzYWJsZV09XCJsb2FkaW5nKCkgfHwgIWl0ZW1zKCkubGVuZ3RoXCJcbiAgICAgICAgICBbZmllbGRTb3J0XT1cImhlYWRlci5vcmRlcmJ5XCJcbiAgICAgICAgICBbaWdub3JlUG9wb3ZlckNvbnRlbnRdPVwiaGVhZGVyLnNvcnRJZ25vcmVUb29sdGlwQ29udGVudCA/PyB0cnVlXCJcbiAgICAgICAgICBbcG9wb3ZlckNvbnRlbnRBc2NdPVwiaGVhZGVyLnNvcnRUb29sdGlwQ29udGVudEFzY1wiXG4gICAgICAgICAgW3BvcG92ZXJDb250ZW50RGVzY109XCJoZWFkZXIuc29ydFRvb2x0aXBDb250ZW50RGVzY1wiXG4gICAgICAgICAgW2RlZmF1bHRNb2RlXT1cImhlYWRlci5kZWZhdWx0TW9kZVwiXG4gICAgICAgICAgW3pJbmRleF09XCJoZWFkZXIuekluZGV4VG9vbHRpcFNvcnRcIlxuICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVNvcnQoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKGhlYWRlci5sYWJlbERlc2NyaXB0aW9uKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNsYXNzSW5jbHVkZSB8fCAnJ1wiXG4gICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6IGhlYWRlci5sYWJlbERlc2NyaXB0aW9uLmNvbnRlbnQgfCB0cmFuc2xhdGV9XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWFkZXIubGFiZWxEZXNjcmlwdGlvbi5jb250ZW50IHwgdHJhbnNsYXRlXCIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUJvZHlSZWZcbiAgbGV0LWhlYWRlcj0naGVhZGVyJ1xuICBsZXQtZGF0YT0nZGF0YSc+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBoLWZ1bGxcIj5cbiAgICBAaWYgKGhlYWRlci5oYXNDaGVja2JveCkge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsXCJcbiAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCJoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbiAmJiggZGF0YSgpIHwgTGlic1VpUGlwZXNDYWxsRnVuY3Rpb25JblRlbXBsYXRlUGlwZTpoZWFkZXIuY2hlY2tDb25kaXRpb25DaGVja0JveEhpZGRlbjpkYXRhKCkgfCBhc3luYylcIlxuICAgICAgICBbY2xhc3MuaXRlbXMtY2VudGVyXT1cImhlYWRlci5jaGVja2JveEFsaWduQ2VudGVyXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtY2hlY2tib3gtc2luZ2xlIFtrZXldPVwiZGF0YSgpW2ZpZWxkS2V5KCldXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImhlYWRlci5jaGVja2JveENsYXNzSW5jbHVkZVwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTZWxlY3RlZCgpOmtleXNTZWxlY3RlZCgpLmxlbmd0aFwiXG4gICAgICAgICAgW2Rpc2FibGVdPVwibG9hZGluZygpIHx8IGRpc2FibGVDaGVja2JveCgpIHx8ICEhKG1heEl0ZW1TZWxlY3RlZCgpICYmICEoZGF0YSgpW2ZpZWxkS2V5KCldIHwgTGlic1VpUGlwZXNDaGVja1NlbGVjdGVkQnlLZXlQaXBlOmtleXNTZWxlY3RlZCgpOmtleXNTZWxlY3RlZCgpLmxlbmd0aCkgJiYga2V5c1NlbGVjdGVkKCkubGVuZ3RoID49IG1heEl0ZW1TZWxlY3RlZCgpKVwiXG4gICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlSXRlbUNoZWNrZWQoJGV2ZW50LGRhdGEoKSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChoZWFkZXIuaXNTaG93SW5kZXhPblJvdzsgYXMgY29uZmlnKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGxpYnMtdWktZm9udC1oNHJ7eyBjb25maWcuY2xhc3NJbmNsdWRlSW5kZXhPblJvdyB8fCAnJyB9fVwiPlxuICAgICAgICA8ZGl2IExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICBbY29uZmlnXT1cInt9XCJcbiAgICAgICAgICBbaW5uZXJIVE1MXT1cImRhdGEgfCBMaWJzVWlQaXBlc0NhbGxGdW5jdGlvbkluVGVtcGxhdGVQaXBlOmdldEluZGV4Um93IHwgYXN5bmNcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhlYWRlci5jb2xUZW1wbGF0ZUNvbmZpZykge1xuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2lzSG92ZXJdPVwiaXRlbU9mSW5kZXhIb3ZlciA9PT0gZGF0YSAmJiAhZGF0YS5zcGVjaWZpY0hpZ2h0TGlnaHRcIlxuICAgICAgICBbY2xhc3NdPVwiaGVhZGVyLnRlbXBsYXRlQ3NzV3JhcHBlckhvc3QgfHwgJydcIlxuICAgICAgICBbaXRlbV09XCJkYXRhXCJcbiAgICAgICAgW3RlbXBsYXRlQ3NzV3JhcHBlcl09XCJoZWFkZXIudGVtcGxhdGVDc3NXcmFwcGVyXCJcbiAgICAgICAgW2NvbmZpZ3NdPVwiaGVhZGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZUZvb3RlclJlZj5cbiAgQGlmICghaXNIaWRkZW5IZWFkZXJXaGVuTm9kYXRhKCkgfHwgKGlzSGlkZGVuSGVhZGVyV2hlbk5vZGF0YSgpICYmIGl0ZW1zKCkubGVuZ3RoKSkge1xuICAgIDxkaXYgI2Zvb3RlckVsZW1lbnRSZWZcbiAgICAgIGNsYXNzPVwiZmxleCB3LWZ1bGwgYmctWyNmOGY5ZmFdIG92ZXJmbG93LXgtaGlkZGVuIHotWzFdIHt7IGlnbm9yZUJvcmRlckZvb3RlcigpID8gJyc6IChjdXN0b21Qb3NpdGlvbkZvb3RlcigpID09PSAndG9wJyA/ICdsaWJzLXVpLWJvcmRlci1ib3R0b20tZ2VuZXJhbCc6J2xpYnMtdWktdGFibGUtc2hhZG93LXRvcCBsaWJzLXVpLWJvcmRlci10b3AtZ2VuZXJhbCcpIH19IG1pbi1oLVszNXB4XVwiXG4gICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVyTW91c2VFbnRlckZvb3RlcigkZXZlbnQpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhhbmRsZXJNb3VzZUxlYXZlRm9vdGVyKCRldmVudClcIj5cbiAgICAgIEBpZiAoZm9vdGVyTGVmdCgpKSB7XG4gICAgICAgIDxkaXYgI2Zvb3RlckxlZnRFbGVtZW50UmVmXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IHN0aWNreSB0b3AtMCBsZWZ0LTAgei1bMV0gYmctWyNmOGY5ZmFdXCI+XG4gICAgICAgICAgQGZvciAoZm9vdGVyIG9mIGZvb3RlckxlZnQoKTt0cmFjayBmb290ZXIpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF0ge3sgZm9vdGVyLmlnbm9yZUJvcmRlclJpZ2h0ID8gJyc6ICdsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsJyB9fVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihmb290ZXJ8TGlic1VpVGFibGVDYWxjdWxhdG9yQ29sdW1uUGlwZTpoZWFkZXJFbGVtZW50UmVmLmNsaWVudFdpZHRoOmZvb3RlckxlZnQoKTpmb290ZXJSaWdodCgpKSB8fCB7fVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvb3Rlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICAgIEBpZiAoZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnICYmIGl0ZW1Gb290ZXIoKSkge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtdGFibGUtdGVtcGxhdGVzIFtpdGVtXT1cIml0ZW1Gb290ZXJ8TGlic1VpUGlwZXNDb252ZXJ0T2JqZWN0VG9TaWduYWxQaXBlXCJcbiAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJmb290ZXIuY29sVGVtcGxhdGVDb25maWdcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChmb290ZXJSaWdodCgpKSB7XG4gICAgICAgIEBmb3IgKGZvb3RlciBvZiBmb290ZXJSaWdodCgpO3RyYWNrIGZvb3Rlcikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBweC1bMTJweF0gcHktWzhweF1cIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiKGZvb3RlcnxMaWJzVWlUYWJsZUNhbGN1bGF0b3JDb2x1bW5QaXBlOmhlYWRlckVsZW1lbnRSZWYuY2xpZW50V2lkdGg6Zm9vdGVyTGVmdCgpOmZvb3RlclJpZ2h0KCkpIHx8IHt9XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvb3Rlci5uZ0NsYXNzIHx8IHt9XCI+XG4gICAgICAgICAgICBAaWYgKGZvb3Rlci5jb2xUZW1wbGF0ZUNvbmZpZyAmJiBpdGVtRm9vdGVyKCkpIHtcbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy10YWJsZS10ZW1wbGF0ZXMgW2l0ZW1dPVwiaXRlbUZvb3RlcnxMaWJzVWlQaXBlc0NvbnZlcnRPYmplY3RUb1NpZ25hbFBpcGVcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZUNzc1dyYXBwZXJdPVwiZm9vdGVyLnRlbXBsYXRlQ3NzV3JhcHBlclwiXG4gICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwiZm9vdGVyLmNvbFRlbXBsYXRlQ29uZmlnXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgPC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOb2RhdGFSZWY+XG4gIEBpZiAobm9EYXRhQ29uZmlnKCk7IGFzIGNvbmZpZykge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGFic29sdXRlIGxlZnQtMCB0b3AtMCB6LVsxXVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgc2hyaW5rLTBcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGlmICgha2V5U2VhcmNoKCkgJiYgIW9ubHlTaG93Tm9SZXN1bHQoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiICgnbm8tZGF0YScgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmMpO2lucHV0czp7c2l6ZTo2NH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dE5vRGF0YSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoa2V5U2VhcmNoKCkgfHwgb25seVNob3dOb1Jlc3VsdCgpKSB7XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCIoJ25vLXJlc3VsdCcgfCBMaWJzVWlJY29uc0dldEljb25Db21wb25lbnRQaXBlIHwgYXN5bmMpO2lucHV0czp7c2l6ZTo2NH1cIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLXRhYmxlLW5vLWRhdGEtY29uZmlnLXRleHRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiY29uZmlnLm5nU3R5bGUgfHwge31cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29uZmlnLm5nQ2xhc3MgfHwge31cIlxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJjb25maWcudGV4dFNlYXJjaE5vRGF0YSB8IHRyYW5zbGF0ZVwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|