@acorex/modules 20.5.0-next.0 → 20.5.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/index.d.ts +11 -17
- package/fesm2022/{acorex-modules-application-management-acorex-modules-application-management-CQMnhxLa.mjs → acorex-modules-application-management-acorex-modules-application-management-BqYLpEvY.mjs} +23 -41
- package/fesm2022/acorex-modules-application-management-acorex-modules-application-management-BqYLpEvY.mjs.map +1 -0
- package/fesm2022/acorex-modules-application-management-menu-list.component-D4uW0aXY.mjs +830 -0
- package/fesm2022/acorex-modules-application-management-menu-list.component-D4uW0aXY.mjs.map +1 -0
- package/fesm2022/acorex-modules-application-management.mjs +1 -1
- package/fesm2022/acorex-modules-common.mjs +429 -559
- package/fesm2022/acorex-modules-common.mjs.map +1 -1
- package/fesm2022/acorex-modules-data-management.mjs +0 -2
- package/fesm2022/acorex-modules-data-management.mjs.map +1 -1
- package/package.json +14 -14
- package/fesm2022/acorex-modules-application-management-acorex-modules-application-management-CQMnhxLa.mjs.map +0 -1
- package/fesm2022/acorex-modules-application-management-menu-list.component-BMbl5rtn.mjs +0 -1046
- package/fesm2022/acorex-modules-application-management-menu-list.component-BMbl5rtn.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-modules-application-management-menu-list.component-BMbl5rtn.mjs","sources":["../tmp-esm2022/application-management/lib/features/menu-management/components/menu-tree-item/menu-tree-item.component.js","../tmp-esm2022/application-management/lib/features/menu-management/menu-management.service.js","../tmp-esm2022/application-management/lib/features/menu-management/pages/menu-list/menu-list.component.js"],"sourcesContent":["import { CdkDrag, CdkDropList, CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { ChangeDetectionStrategy, Component, input, output, signal, ViewEncapsulation, } from '@angular/core';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@acorex/components/button\";\nimport * as i2 from \"@acorex/components/decorators\";\nimport * as i3 from \"@acorex/components/dropdown\";\nimport * as i4 from \"@angular/common\";\nimport * as i5 from \"@acorex/core/translation\";\n//#region ---- Menu Tree Item Component ----\nexport class AXMMenuTreeItemComponent {\n constructor() {\n //#region ---- Inputs ----\n this.item = input.required(...(ngDevMode ? [{ debugName: \"item\" }] : []));\n this.level = input(0, ...(ngDevMode ? [{ debugName: \"level\" }] : []));\n this.canDelete = input(false, ...(ngDevMode ? [{ debugName: \"canDelete\" }] : []));\n this.connectedDropLists = input([], ...(ngDevMode ? [{ debugName: \"connectedDropLists\" }] : []));\n this.canMoveUp = input(false, ...(ngDevMode ? [{ debugName: \"canMoveUp\" }] : []));\n this.canMoveDown = input(false, ...(ngDevMode ? [{ debugName: \"canMoveDown\" }] : []));\n this.canMoveToParent = input(false, ...(ngDevMode ? [{ debugName: \"canMoveToParent\" }] : []));\n //#endregion\n //#region ---- Outputs ----\n this.actionTriggered = output();\n this.itemDropped = output();\n //#endregion\n //#region ---- Component State ----\n this.isExpanded = signal(true, ...(ngDevMode ? [{ debugName: \"isExpanded\" }] : []));\n }\n //#endregion\n //#region ---- Helper Methods ----\n /**\n * Get unique drop list ID for this item's children\n */\n getDropListId() {\n const item = this.item();\n return `menu-${item.name || item.path || 'unnamed'}`;\n }\n /**\n * Get children array, ensuring it's always initialized\n * This allows drop zones to exist even for items with no children yet\n */\n getChildrenArray() {\n const item = this.item();\n if (!item.children) {\n // Initialize children array if it doesn't exist\n item.children = [];\n }\n return item.children;\n }\n //#endregion\n //#region ---- Event Handlers ----\n /**\n * Toggle expand/collapse\n */\n toggleExpand() {\n this.isExpanded.update((expanded) => !expanded);\n }\n /**\n * Handle action trigger\n */\n onAction(action) {\n this.actionTriggered.emit({ action, item: this.item() });\n }\n /**\n * Handle drop event\n */\n onDrop(event) {\n this.itemDropped.emit(event);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXMMenuTreeItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.4\", type: AXMMenuTreeItemComponent, isStandalone: true, selector: \"axm-menu-tree-item\", inputs: { item: { classPropertyName: \"item\", publicName: \"item\", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: \"level\", publicName: \"level\", isSignal: true, isRequired: false, transformFunction: null }, canDelete: { classPropertyName: \"canDelete\", publicName: \"canDelete\", isSignal: true, isRequired: false, transformFunction: null }, connectedDropLists: { classPropertyName: \"connectedDropLists\", publicName: \"connectedDropLists\", isSignal: true, isRequired: false, transformFunction: null }, canMoveUp: { classPropertyName: \"canMoveUp\", publicName: \"canMoveUp\", isSignal: true, isRequired: false, transformFunction: null }, canMoveDown: { classPropertyName: \"canMoveDown\", publicName: \"canMoveDown\", isSignal: true, isRequired: false, transformFunction: null }, canMoveToParent: { classPropertyName: \"canMoveToParent\", publicName: \"canMoveToParent\", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionTriggered: \"actionTriggered\", itemDropped: \"itemDropped\" }, host: { classAttribute: \"axm-menu-tree-item\" }, ngImport: i0, template: \"<div class=\\\"axm-menu-tree-item__container\\\" [style.padding-left.rem]=\\\"level()\\\">\\n <div\\n class=\\\"axm-menu-tree-item__content\\\"\\n cdkDrag\\n [cdkDragData]=\\\"item()\\\"\\n [class.--hidden]=\\\"item().isHidden\\\"\\n [class.--custom]=\\\"item().isCustom\\\"\\n >\\n <!-- Drag Handle -->\\n <div class=\\\"axm-menu-tree-item__drag-handle\\\" cdkDragHandle>\\n <i class=\\\"fa-light fa-grip-dots-vertical\\\"></i>\\n </div>\\n\\n <!-- Expand/Collapse Button -->\\n @if (item().children && item().children!.length > 0) {\\n <ax-button class=\\\"axm-menu-tree-item__expand-btn\\\" [look]=\\\"'blank'\\\" [size]=\\\"'sm'\\\" (onClick)=\\\"toggleExpand()\\\">\\n <i [class]=\\\"isExpanded() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-right'\\\"></i>\\n </ax-button>\\n } @else {\\n <div class=\\\"axm-menu-tree-item__spacer\\\"></div>\\n }\\n\\n <!-- Icon -->\\n @if (item().icon) {\\n <i class=\\\"axm-menu-tree-item__icon\\\" [class]=\\\"item().icon\\\"></i>\\n }\\n\\n <!-- Text or Info -->\\n @if (item().text) {\\n <span class=\\\"axm-menu-tree-item__text\\\">\\n {{ item().text | translate | async }}\\n </span>\\n } @else if (item().path) {\\n <span class=\\\"axm-menu-tree-item__path\\\">\\n <i class=\\\"fa-light fa-link\\\"></i>\\n {{ item().path }}\\n </span>\\n } @else {\\n <span class=\\\"axm-menu-tree-item__divider\\\">\\n <i class=\\\"fa-light fa-minus\\\"></i>\\n {{ '@application-management:menu-management.badge.divider' | translate | async }}\\n </span>\\n }\\n\\n <!-- Menu Name/Key -->\\n @if (item().name) {\\n <code class=\\\"axm-menu-tree-item__name\\\">\\n {{ item().name }}\\n </code>\\n }\\n\\n <!-- Actions Dropdown -->\\n <ax-button class=\\\"axm-menu-tree-item__actions\\\" [look]=\\\"'blank'\\\" [size]=\\\"'sm'\\\" [iconOnly]=\\\"true\\\">\\n <ax-prefix>\\n <i class=\\\"fa-light fa-ellipsis-vertical\\\"></i>\\n </ax-prefix>\\n\\n <ax-dropdown-panel #panel>\\n <ax-button-item-list>\\n <!-- Show/Hide (only for items with names) -->\\n @if (item().name && item().isBuiltIn) {\\n @if (item().isHidden) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.show' | translate | async)!\\\"\\n (onClick)=\\\"onAction('show'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-eye\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n } @else {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.hide' | translate | async)!\\\"\\n (onClick)=\\\"onAction('hide'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-eye-slash\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n }\\n\\n <!-- Edit (only for items with names) -->\\n @if (item().name) {\\n <ax-button-item\\n [text]=\\\"('@general:actions.edit.title' | translate | async)!\\\"\\n (onClick)=\\\"onAction('edit'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-edit\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Add Child -->\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.add-child' | translate | async)!\\\"\\n (onClick)=\\\"onAction('add-child'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-plus\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n\\n <!-- Move Actions -->\\n @if (canMoveUp() || canMoveDown() || canMoveToParent()) {\\n <ax-divider></ax-divider>\\n\\n <!-- Move Up -->\\n @if (canMoveUp()) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.move-up' | translate | async)!\\\"\\n (onClick)=\\\"onAction('move-up'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-arrow-up\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Move Down -->\\n @if (canMoveDown()) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.move-down' | translate | async)!\\\"\\n (onClick)=\\\"onAction('move-down'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-arrow-down\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Move to Parent -->\\n @if (canMoveToParent()) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.move-to-parent' | translate | async)!\\\"\\n (onClick)=\\\"onAction('move-to-parent'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-level-up\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n }\\n\\n <!-- Delete (only for custom items with names) -->\\n @if (item().name && item().isCustom && canDelete()) {\\n <ax-divider></ax-divider>\\n <ax-button-item\\n [color]=\\\"'danger'\\\"\\n [text]=\\\"('@general:actions.delete.title' | translate | async)!\\\"\\n (onClick)=\\\"onAction('delete'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-trash\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Info message for items without names -->\\n @if (!item().name) {\\n <ax-divider></ax-divider>\\n <div class=\\\"ax-p-2 ax-text-xs ax-text-neutral-500 ax-italic\\\">\\n {{ '@application-management:menu-management.messages.no-name-info' | translate | async }}\\n </div>\\n }\\n </ax-button-item-list>\\n </ax-dropdown-panel>\\n </ax-button>\\n </div>\\n\\n <!-- Children Drop Zone - Always render the drop list even when collapsed -->\\n <!-- The drop list must exist for items to be draggable FROM this container -->\\n <div\\n class=\\\"axm-menu-tree-item__children\\\"\\n cdkDropList\\n [id]=\\\"getDropListId()\\\"\\n [cdkDropListData]=\\\"getChildrenArray()\\\"\\n [cdkDropListConnectedTo]=\\\"connectedDropLists()\\\"\\n (cdkDropListDropped)=\\\"onDrop($event)\\\"\\n [class.--collapsed]=\\\"!isExpanded()\\\"\\n >\\n @if (isExpanded()) {\\n @for (child of getChildrenArray(); track child.name || child.path || $index; let i = $index) {\\n <axm-menu-tree-item\\n [item]=\\\"child\\\"\\n [level]=\\\"level() + 1\\\"\\n [canDelete]=\\\"canDelete()\\\"\\n [connectedDropLists]=\\\"connectedDropLists()\\\"\\n [canMoveUp]=\\\"i > 0\\\"\\n [canMoveDown]=\\\"i < getChildrenArray().length - 1\\\"\\n [canMoveToParent]=\\\"true\\\"\\n (actionTriggered)=\\\"actionTriggered.emit($event)\\\"\\n (itemDropped)=\\\"itemDropped.emit($event)\\\"\\n />\\n }\\n }\\n </div>\\n</div>\\n\", styles: [\".axm-menu-tree-item__container{display:flex;flex-direction:column}.axm-menu-tree-item__content{display:flex;align-items:center;gap:.5rem;border-radius:.375rem;padding:.5rem;border-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.axm-menu-tree-item__content:hover{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axm-menu-tree-item__content.--hidden{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1));opacity:.5;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.axm-menu-tree-item__content.--hidden .axm-menu-tree-item__icon{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__content.--hidden .axm-menu-tree-item__name{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__content.--custom{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1))}.axm-menu-tree-item__content.cdk-drag-preview{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));border-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1))}.axm-menu-tree-item__drag-handle{display:flex;align-items:center;justify-content:center;height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1));cursor:move}.axm-menu-tree-item__drag-handle:hover{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__expand-btn{height:1.5rem;width:1.5rem}.axm-menu-tree-item__spacer{width:1.5rem}.axm-menu-tree-item__icon{display:flex;align-items:center;justify-content:center;height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axm-menu-tree-item__text{flex:1 1 0%;font-size:.875rem;line-height:1.25rem;font-weight:500}.axm-menu-tree-item__divider,.axm-menu-tree-item__path{display:flex;flex:1 1 0%;align-items:center;gap:.5rem;font-size:.75rem;line-height:1rem;font-style:italic;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__divider i,.axm-menu-tree-item__path i{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__name{display:flex;align-items:center;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1));font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-weight:400;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));white-space:nowrap;-webkit-user-select:all;-moz-user-select:all;user-select:all}.axm-menu-tree-item__actions{margin-left:.5rem}.axm-menu-tree-item__children{display:flex;flex-direction:column;gap:.5rem;margin-top:.5rem;padding-left:1rem;border-left-width:2px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.axm-menu-tree-item__children.--collapsed{display:none}\\n\"], dependencies: [{ kind: \"component\", type: AXMMenuTreeItemComponent, selector: \"axm-menu-tree-item\", inputs: [\"item\", \"level\", \"canDelete\", \"connectedDropLists\", \"canMoveUp\", \"canMoveDown\", \"canMoveToParent\"], outputs: [\"actionTriggered\", \"itemDropped\"] }, { kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"directive\", type: CdkDragHandle, selector: \"[cdkDragHandle]\", inputs: [\"cdkDragHandleDisabled\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\", \"cdkDropListHasAnchor\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"ngmodule\", type: AXButtonModule }, { kind: \"component\", type: i1.AXButtonComponent, selector: \"ax-button\", inputs: [\"disabled\", \"size\", \"tabIndex\", \"color\", \"look\", \"text\", \"toggleable\", \"selected\", \"iconOnly\", \"type\", \"loadingText\"], outputs: [\"onBlur\", \"onFocus\", \"onClick\", \"selectedChange\", \"toggleableChange\", \"lookChange\", \"colorChange\", \"disabledChange\", \"loadingTextChange\"] }, { kind: \"component\", type: i1.AXButtonItemComponent, selector: \"ax-button-item\", inputs: [\"color\", \"disabled\", \"text\", \"selected\", \"divided\", \"data\", \"name\"], outputs: [\"onClick\", \"onFocus\", \"onBlur\", \"disabledChange\"] }, { kind: \"component\", type: i1.AXButtonItemListComponent, selector: \"ax-button-item-list\", inputs: [\"items\"], outputs: [\"onItemClick\"] }, { kind: \"ngmodule\", type: AXDecoratorModule }, { kind: \"component\", type: i2.AXDecoratorGenericComponent, selector: \"ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay\" }, { kind: \"ngmodule\", type: AXDropdownModule }, { kind: \"component\", type: i3.AXDropdownPanelComponent, selector: \"ax-dropdown-panel\", inputs: [\"isOpen\", \"fitParent\", \"dropdownWidth\", \"position\", \"placement\", \"_target\", \"adaptivityEnabled\"], outputs: [\"onOpened\", \"onClosed\"] }, { kind: \"ngmodule\", type: AXTranslationModule }, { kind: \"pipe\", type: i4.AsyncPipe, name: \"async\" }, { kind: \"pipe\", type: i5.AXTranslatorPipe, name: \"translate\" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXMMenuTreeItemComponent, decorators: [{\n type: Component,\n args: [{ selector: 'axm-menu-tree-item', imports: [\n CommonModule,\n CdkDrag,\n CdkDragHandle,\n CdkDropList,\n AXButtonModule,\n AXDecoratorModule,\n AXDropdownModule,\n AXTranslationModule,\n ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'axm-menu-tree-item' }, template: \"<div class=\\\"axm-menu-tree-item__container\\\" [style.padding-left.rem]=\\\"level()\\\">\\n <div\\n class=\\\"axm-menu-tree-item__content\\\"\\n cdkDrag\\n [cdkDragData]=\\\"item()\\\"\\n [class.--hidden]=\\\"item().isHidden\\\"\\n [class.--custom]=\\\"item().isCustom\\\"\\n >\\n <!-- Drag Handle -->\\n <div class=\\\"axm-menu-tree-item__drag-handle\\\" cdkDragHandle>\\n <i class=\\\"fa-light fa-grip-dots-vertical\\\"></i>\\n </div>\\n\\n <!-- Expand/Collapse Button -->\\n @if (item().children && item().children!.length > 0) {\\n <ax-button class=\\\"axm-menu-tree-item__expand-btn\\\" [look]=\\\"'blank'\\\" [size]=\\\"'sm'\\\" (onClick)=\\\"toggleExpand()\\\">\\n <i [class]=\\\"isExpanded() ? 'fa-light fa-chevron-down' : 'fa-light fa-chevron-right'\\\"></i>\\n </ax-button>\\n } @else {\\n <div class=\\\"axm-menu-tree-item__spacer\\\"></div>\\n }\\n\\n <!-- Icon -->\\n @if (item().icon) {\\n <i class=\\\"axm-menu-tree-item__icon\\\" [class]=\\\"item().icon\\\"></i>\\n }\\n\\n <!-- Text or Info -->\\n @if (item().text) {\\n <span class=\\\"axm-menu-tree-item__text\\\">\\n {{ item().text | translate | async }}\\n </span>\\n } @else if (item().path) {\\n <span class=\\\"axm-menu-tree-item__path\\\">\\n <i class=\\\"fa-light fa-link\\\"></i>\\n {{ item().path }}\\n </span>\\n } @else {\\n <span class=\\\"axm-menu-tree-item__divider\\\">\\n <i class=\\\"fa-light fa-minus\\\"></i>\\n {{ '@application-management:menu-management.badge.divider' | translate | async }}\\n </span>\\n }\\n\\n <!-- Menu Name/Key -->\\n @if (item().name) {\\n <code class=\\\"axm-menu-tree-item__name\\\">\\n {{ item().name }}\\n </code>\\n }\\n\\n <!-- Actions Dropdown -->\\n <ax-button class=\\\"axm-menu-tree-item__actions\\\" [look]=\\\"'blank'\\\" [size]=\\\"'sm'\\\" [iconOnly]=\\\"true\\\">\\n <ax-prefix>\\n <i class=\\\"fa-light fa-ellipsis-vertical\\\"></i>\\n </ax-prefix>\\n\\n <ax-dropdown-panel #panel>\\n <ax-button-item-list>\\n <!-- Show/Hide (only for items with names) -->\\n @if (item().name && item().isBuiltIn) {\\n @if (item().isHidden) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.show' | translate | async)!\\\"\\n (onClick)=\\\"onAction('show'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-eye\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n } @else {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.hide' | translate | async)!\\\"\\n (onClick)=\\\"onAction('hide'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-eye-slash\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n }\\n\\n <!-- Edit (only for items with names) -->\\n @if (item().name) {\\n <ax-button-item\\n [text]=\\\"('@general:actions.edit.title' | translate | async)!\\\"\\n (onClick)=\\\"onAction('edit'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-edit\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Add Child -->\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.add-child' | translate | async)!\\\"\\n (onClick)=\\\"onAction('add-child'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-plus\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n\\n <!-- Move Actions -->\\n @if (canMoveUp() || canMoveDown() || canMoveToParent()) {\\n <ax-divider></ax-divider>\\n\\n <!-- Move Up -->\\n @if (canMoveUp()) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.move-up' | translate | async)!\\\"\\n (onClick)=\\\"onAction('move-up'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-arrow-up\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Move Down -->\\n @if (canMoveDown()) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.move-down' | translate | async)!\\\"\\n (onClick)=\\\"onAction('move-down'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-arrow-down\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Move to Parent -->\\n @if (canMoveToParent()) {\\n <ax-button-item\\n [text]=\\\"('@application-management:menu-management.actions.move-to-parent' | translate | async)!\\\"\\n (onClick)=\\\"onAction('move-to-parent'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-level-up\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n }\\n\\n <!-- Delete (only for custom items with names) -->\\n @if (item().name && item().isCustom && canDelete()) {\\n <ax-divider></ax-divider>\\n <ax-button-item\\n [color]=\\\"'danger'\\\"\\n [text]=\\\"('@general:actions.delete.title' | translate | async)!\\\"\\n (onClick)=\\\"onAction('delete'); panel.close()\\\"\\n >\\n <ax-prefix>\\n <i class=\\\"fa-light fa-trash\\\"></i>\\n </ax-prefix>\\n </ax-button-item>\\n }\\n\\n <!-- Info message for items without names -->\\n @if (!item().name) {\\n <ax-divider></ax-divider>\\n <div class=\\\"ax-p-2 ax-text-xs ax-text-neutral-500 ax-italic\\\">\\n {{ '@application-management:menu-management.messages.no-name-info' | translate | async }}\\n </div>\\n }\\n </ax-button-item-list>\\n </ax-dropdown-panel>\\n </ax-button>\\n </div>\\n\\n <!-- Children Drop Zone - Always render the drop list even when collapsed -->\\n <!-- The drop list must exist for items to be draggable FROM this container -->\\n <div\\n class=\\\"axm-menu-tree-item__children\\\"\\n cdkDropList\\n [id]=\\\"getDropListId()\\\"\\n [cdkDropListData]=\\\"getChildrenArray()\\\"\\n [cdkDropListConnectedTo]=\\\"connectedDropLists()\\\"\\n (cdkDropListDropped)=\\\"onDrop($event)\\\"\\n [class.--collapsed]=\\\"!isExpanded()\\\"\\n >\\n @if (isExpanded()) {\\n @for (child of getChildrenArray(); track child.name || child.path || $index; let i = $index) {\\n <axm-menu-tree-item\\n [item]=\\\"child\\\"\\n [level]=\\\"level() + 1\\\"\\n [canDelete]=\\\"canDelete()\\\"\\n [connectedDropLists]=\\\"connectedDropLists()\\\"\\n [canMoveUp]=\\\"i > 0\\\"\\n [canMoveDown]=\\\"i < getChildrenArray().length - 1\\\"\\n [canMoveToParent]=\\\"true\\\"\\n (actionTriggered)=\\\"actionTriggered.emit($event)\\\"\\n (itemDropped)=\\\"itemDropped.emit($event)\\\"\\n />\\n }\\n }\\n </div>\\n</div>\\n\", styles: [\".axm-menu-tree-item__container{display:flex;flex-direction:column}.axm-menu-tree-item__content{display:flex;align-items:center;gap:.5rem;border-radius:.375rem;padding:.5rem;border-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.axm-menu-tree-item__content:hover{background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axm-menu-tree-item__content.--hidden{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1));opacity:.5;--tw-border-opacity: 1;border-color:rgb(212 212 212 / var(--tw-border-opacity, 1))}.axm-menu-tree-item__content.--hidden .axm-menu-tree-item__icon{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__content.--hidden .axm-menu-tree-item__name{--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__content.--custom{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1))}.axm-menu-tree-item__content.cdk-drag-preview{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface));border-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1))}.axm-menu-tree-item__drag-handle{display:flex;align-items:center;justify-content:center;height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1));cursor:move}.axm-menu-tree-item__drag-handle:hover{--tw-text-opacity: 1;color:rgb(82 82 82 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__expand-btn{height:1.5rem;width:1.5rem}.axm-menu-tree-item__spacer{width:1.5rem}.axm-menu-tree-item__icon{display:flex;align-items:center;justify-content:center;height:1.5rem;width:1.5rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axm-menu-tree-item__text{flex:1 1 0%;font-size:.875rem;line-height:1.25rem;font-weight:500}.axm-menu-tree-item__divider,.axm-menu-tree-item__path{display:flex;flex:1 1 0%;align-items:center;gap:.5rem;font-size:.75rem;line-height:1rem;font-style:italic;--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__divider i,.axm-menu-tree-item__path i{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.axm-menu-tree-item__name{display:flex;align-items:center;border-radius:.25rem;padding:.25rem .5rem;font-size:.75rem;line-height:1rem;--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(64 64 64 / var(--tw-text-opacity, 1));font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-weight:400;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1));white-space:nowrap;-webkit-user-select:all;-moz-user-select:all;user-select:all}.axm-menu-tree-item__actions{margin-left:.5rem}.axm-menu-tree-item__children{display:flex;flex-direction:column;gap:.5rem;margin-top:.5rem;padding-left:1rem;border-left-width:2px;--tw-border-opacity: 1;border-color:rgb(229 229 229 / var(--tw-border-opacity, 1))}.axm-menu-tree-item__children.--collapsed{display:none}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS10cmVlLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9tb2R1bGVzL2FwcGxpY2F0aW9uLW1hbmFnZW1lbnQvc3JjL2xpYi9mZWF0dXJlcy9tZW51LW1hbmFnZW1lbnQvY29tcG9uZW50cy9tZW51LXRyZWUtaXRlbS9tZW51LXRyZWUtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21vZHVsZXMvYXBwbGljYXRpb24tbWFuYWdlbWVudC9zcmMvbGliL2ZlYXR1cmVzL21lbnUtbWFuYWdlbWVudC9jb21wb25lbnRzL21lbnUtdHJlZS1pdGVtL21lbnUtdHJlZS1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQWUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04saUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBR3ZCLGdEQUFnRDtBQW9CaEQsTUFBTSxPQUFPLHdCQUF3QjtJQWxCckM7UUFvQkksOEJBQThCO1FBRTlCLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSwrQ0FBbUIsQ0FBQztRQUN6QyxVQUFLLEdBQUcsS0FBSyxDQUFTLENBQUMsaURBQUMsQ0FBQztRQUN6QixjQUFTLEdBQUcsS0FBSyxDQUFVLEtBQUsscURBQUMsQ0FBQztRQUNsQyx1QkFBa0IsR0FBRyxLQUFLLENBQVcsRUFBRSw4REFBQyxDQUFDO1FBQ3pDLGNBQVMsR0FBRyxLQUFLLENBQVUsS0FBSyxxREFBQyxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsS0FBSyxDQUFVLEtBQUssdURBQUMsQ0FBQztRQUNwQyxvQkFBZSxHQUFHLEtBQUssQ0FBVSxLQUFLLDJEQUFDLENBQUM7UUFFeEMsWUFBWTtRQUVaLCtCQUErQjtRQUUvQixvQkFBZSxHQUFHLE1BQU0sRUFBd0QsQ0FBQztRQUNqRixnQkFBVyxHQUFHLE1BQU0sRUFBa0MsQ0FBQztRQUV2RCxZQUFZO1FBRVosdUNBQXVDO1FBRXZDLGVBQVUsR0FBRyxNQUFNLENBQVUsSUFBSSxzREFBQyxDQUFDO0tBcUR0QztJQW5ERyxZQUFZO0lBRVosc0NBQXNDO0lBRXRDOztPQUVHO0lBQ08sYUFBYTtRQUNuQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsT0FBTyxRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sZ0JBQWdCO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLGdEQUFnRDtZQUNoRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxZQUFZO0lBRVosc0NBQXNDO0lBRXRDOztPQUVHO0lBQ08sWUFBWTtRQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxRQUFRLENBQUMsTUFBeUI7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ08sTUFBTSxDQUFDLEtBQXFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBekVRLHdCQUF3QjtrR0FBeEIsd0JBQXdCLDBvQ0NwQ3JDLG9wT0F1TUEseStIRG5LYSx3QkFBd0Isd05BZjdCLFlBQVksK0JBQ1osT0FBTyx3Y0FDUCxhQUFhLCtGQUNiLFdBQVcscWhCQUNYLGNBQWMsb3VCQUNkLGlCQUFpQixxUEFDakIsZ0JBQWdCLHFRQUNoQixtQkFBbUI7OzJGQVFkLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0ksb0JBQW9CLFdBQ3JCO3dCQUNMLFlBQVk7d0JBQ1osT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGdCQUFnQjt3QkFDaEIsbUJBQW1CO3FCQUN0QixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxRQUMvQixFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgQ2RrRHJhZ0hhbmRsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFYQnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBBWERlY29yYXRvck1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEFYRHJvcGRvd25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgQVhUcmFuc2xhdGlvbk1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29yZS90cmFuc2xhdGlvbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBpbnB1dCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUE1lbnVJdGVtQWN0aW9uLCBBWFBNZW51SXRlbU5vZGUgfSBmcm9tICcuLi8uLi9tZW51LWN1c3RvbWl6YXRpb24udHlwZXMnO1xuXG4vLyNyZWdpb24gLS0tLSAgIE1lbnUgVHJlZSBJdGVtIENvbXBvbmVudCAgIC0tLS1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdheG0tbWVudS10cmVlLWl0ZW0nLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBDZGtEcmFnLFxuICAgICAgICBDZGtEcmFnSGFuZGxlLFxuICAgICAgICBDZGtEcm9wTGlzdCxcbiAgICAgICAgQVhCdXR0b25Nb2R1bGUsXG4gICAgICAgIEFYRGVjb3JhdG9yTW9kdWxlLFxuICAgICAgICBBWERyb3Bkb3duTW9kdWxlLFxuICAgICAgICBBWFRyYW5zbGF0aW9uTW9kdWxlLFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUtdHJlZS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LXRyZWUtaXRlbS5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDogeyBjbGFzczogJ2F4bS1tZW51LXRyZWUtaXRlbScgfSxcbn0pXG5leHBvcnQgY2xhc3MgQVhNTWVudVRyZWVJdGVtQ29tcG9uZW50IHtcblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgSW5wdXRzICAgLS0tLVxuXG4gICAgaXRlbSA9IGlucHV0LnJlcXVpcmVkPEFYUE1lbnVJdGVtTm9kZT4oKTtcbiAgICBsZXZlbCA9IGlucHV0PG51bWJlcj4oMCk7XG4gICAgY2FuRGVsZXRlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGNvbm5lY3RlZERyb3BMaXN0cyA9IGlucHV0PHN0cmluZ1tdPihbXSk7XG4gICAgY2FuTW92ZVVwID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGNhbk1vdmVEb3duID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIGNhbk1vdmVUb1BhcmVudCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIC0tLS0gICBPdXRwdXRzICAgLS0tLVxuXG4gICAgYWN0aW9uVHJpZ2dlcmVkID0gb3V0cHV0PHsgYWN0aW9uOiBBWFBNZW51SXRlbUFjdGlvbjsgaXRlbTogQVhQTWVudUl0ZW1Ob2RlIH0+KCk7XG4gICAgaXRlbURyb3BwZWQgPSBvdXRwdXQ8Q2RrRHJhZ0Ryb3A8QVhQTWVudUl0ZW1Ob2RlW10+PigpO1xuXG4gICAgLy8jZW5kcmVnaW9uXG5cbiAgICAvLyNyZWdpb24gLS0tLSAgIENvbXBvbmVudCBTdGF0ZSAgIC0tLS1cblxuICAgIGlzRXhwYW5kZWQgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgSGVscGVyIE1ldGhvZHMgICAtLS0tXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdW5pcXVlIGRyb3AgbGlzdCBJRCBmb3IgdGhpcyBpdGVtJ3MgY2hpbGRyZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RHJvcExpc3RJZCgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtKCk7XG4gICAgICAgIHJldHVybiBgbWVudS0ke2l0ZW0ubmFtZSB8fCBpdGVtLnBhdGggfHwgJ3VubmFtZWQnfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNoaWxkcmVuIGFycmF5LCBlbnN1cmluZyBpdCdzIGFsd2F5cyBpbml0aWFsaXplZFxuICAgICAqIFRoaXMgYWxsb3dzIGRyb3Agem9uZXMgdG8gZXhpc3QgZXZlbiBmb3IgaXRlbXMgd2l0aCBubyBjaGlsZHJlbiB5ZXRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Q2hpbGRyZW5BcnJheSgpOiBBWFBNZW51SXRlbU5vZGVbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICAgICAgaWYgKCFpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIGNoaWxkcmVuIGFycmF5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgIGl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS5jaGlsZHJlbjtcbiAgICB9XG5cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgRXZlbnQgSGFuZGxlcnMgICAtLS0tXG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgZXhwYW5kL2NvbGxhcHNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHRvZ2dsZUV4cGFuZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0V4cGFuZGVkLnVwZGF0ZSgoZXhwYW5kZWQpID0+ICFleHBhbmRlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGFjdGlvbiB0cmlnZ2VyXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQWN0aW9uKGFjdGlvbjogQVhQTWVudUl0ZW1BY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3Rpb25UcmlnZ2VyZWQuZW1pdCh7IGFjdGlvbiwgaXRlbTogdGhpcy5pdGVtKCkgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGRyb3AgZXZlbnRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25Ecm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxBWFBNZW51SXRlbU5vZGVbXT4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtRHJvcHBlZC5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICAvLyNlbmRyZWdpb25cbn1cblxuLy8jZW5kcmVnaW9uXG5cbiIsIjxkaXYgY2xhc3M9XCJheG0tbWVudS10cmVlLWl0ZW1fX2NvbnRhaW5lclwiIFtzdHlsZS5wYWRkaW5nLWxlZnQucmVtXT1cImxldmVsKClcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiYXhtLW1lbnUtdHJlZS1pdGVtX19jb250ZW50XCJcbiAgICBjZGtEcmFnXG4gICAgW2Nka0RyYWdEYXRhXT1cIml0ZW0oKVwiXG4gICAgW2NsYXNzLi0taGlkZGVuXT1cIml0ZW0oKS5pc0hpZGRlblwiXG4gICAgW2NsYXNzLi0tY3VzdG9tXT1cIml0ZW0oKS5pc0N1c3RvbVwiXG4gID5cbiAgICA8IS0tIERyYWcgSGFuZGxlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJheG0tbWVudS10cmVlLWl0ZW1fX2RyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZT5cbiAgICAgIDxpIGNsYXNzPVwiZmEtbGlnaHQgZmEtZ3JpcC1kb3RzLXZlcnRpY2FsXCI+PC9pPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFeHBhbmQvQ29sbGFwc2UgQnV0dG9uIC0tPlxuICAgIEBpZiAoaXRlbSgpLmNoaWxkcmVuICYmIGl0ZW0oKS5jaGlsZHJlbiEubGVuZ3RoID4gMCkge1xuICAgICAgPGF4LWJ1dHRvbiBjbGFzcz1cImF4bS1tZW51LXRyZWUtaXRlbV9fZXhwYW5kLWJ0blwiIFtsb29rXT1cIidibGFuaydcIiBbc2l6ZV09XCInc20nXCIgKG9uQ2xpY2spPVwidG9nZ2xlRXhwYW5kKClcIj5cbiAgICAgICAgPGkgW2NsYXNzXT1cImlzRXhwYW5kZWQoKSA/ICdmYS1saWdodCBmYS1jaGV2cm9uLWRvd24nIDogJ2ZhLWxpZ2h0IGZhLWNoZXZyb24tcmlnaHQnXCI+PC9pPlxuICAgICAgPC9heC1idXR0b24+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiYXhtLW1lbnUtdHJlZS1pdGVtX19zcGFjZXJcIj48L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIEljb24gLS0+XG4gICAgQGlmIChpdGVtKCkuaWNvbikge1xuICAgICAgPGkgY2xhc3M9XCJheG0tbWVudS10cmVlLWl0ZW1fX2ljb25cIiBbY2xhc3NdPVwiaXRlbSgpLmljb25cIj48L2k+XG4gICAgfVxuXG4gICAgPCEtLSBUZXh0IG9yIEluZm8gLS0+XG4gICAgQGlmIChpdGVtKCkudGV4dCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJheG0tbWVudS10cmVlLWl0ZW1fX3RleHRcIj5cbiAgICAgICAge3sgaXRlbSgpLnRleHQgfCB0cmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgPC9zcGFuPlxuICAgIH0gQGVsc2UgaWYgKGl0ZW0oKS5wYXRoKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImF4bS1tZW51LXRyZWUtaXRlbV9fcGF0aFwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLWxpbmtcIj48L2k+XG4gICAgICAgIHt7IGl0ZW0oKS5wYXRoIH19XG4gICAgICA8L3NwYW4+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImF4bS1tZW51LXRyZWUtaXRlbV9fZGl2aWRlclwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLW1pbnVzXCI+PC9pPlxuICAgICAgICB7eyAnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LmJhZGdlLmRpdmlkZXInIHwgdHJhbnNsYXRlIHwgYXN5bmMgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICB9XG5cbiAgICA8IS0tIE1lbnUgTmFtZS9LZXkgLS0+XG4gICAgQGlmIChpdGVtKCkubmFtZSkge1xuICAgICAgPGNvZGUgY2xhc3M9XCJheG0tbWVudS10cmVlLWl0ZW1fX25hbWVcIj5cbiAgICAgICAge3sgaXRlbSgpLm5hbWUgfX1cbiAgICAgIDwvY29kZT5cbiAgICB9XG5cbiAgICA8IS0tIEFjdGlvbnMgRHJvcGRvd24gLS0+XG4gICAgPGF4LWJ1dHRvbiBjbGFzcz1cImF4bS1tZW51LXRyZWUtaXRlbV9fYWN0aW9uc1wiIFtsb29rXT1cIidibGFuaydcIiBbc2l6ZV09XCInc20nXCIgW2ljb25Pbmx5XT1cInRydWVcIj5cbiAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgIDxpIGNsYXNzPVwiZmEtbGlnaHQgZmEtZWxsaXBzaXMtdmVydGljYWxcIj48L2k+XG4gICAgICA8L2F4LXByZWZpeD5cblxuICAgICAgPGF4LWRyb3Bkb3duLXBhbmVsICNwYW5lbD5cbiAgICAgICAgPGF4LWJ1dHRvbi1pdGVtLWxpc3Q+XG4gICAgICAgICAgPCEtLSBTaG93L0hpZGUgKG9ubHkgZm9yIGl0ZW1zIHdpdGggbmFtZXMpIC0tPlxuICAgICAgICAgIEBpZiAoaXRlbSgpLm5hbWUgJiYgaXRlbSgpLmlzQnVpbHRJbikge1xuICAgICAgICAgICAgQGlmIChpdGVtKCkuaXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuYWN0aW9ucy5zaG93JyB8IHRyYW5zbGF0ZSB8IGFzeW5jKSFcIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQWN0aW9uKCdzaG93Jyk7IHBhbmVsLmNsb3NlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtbGlnaHQgZmEtZXllXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgICAgICAgICA8L2F4LWJ1dHRvbi1pdGVtPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxheC1idXR0b24taXRlbVxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIignQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LmFjdGlvbnMuaGlkZScgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkFjdGlvbignaGlkZScpOyBwYW5lbC5jbG9zZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLWV5ZS1zbGFzaFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIEVkaXQgKG9ubHkgZm9yIGl0ZW1zIHdpdGggbmFtZXMpIC0tPlxuICAgICAgICAgIEBpZiAoaXRlbSgpLm5hbWUpIHtcbiAgICAgICAgICAgIDxheC1idXR0b24taXRlbVxuICAgICAgICAgICAgICBbdGV4dF09XCIoJ0BnZW5lcmFsOmFjdGlvbnMuZWRpdC50aXRsZScgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25BY3Rpb24oJ2VkaXQnKTsgcGFuZWwuY2xvc2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saWdodCBmYS1lZGl0XCI+PC9pPlxuICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBBZGQgQ2hpbGQgLS0+XG4gICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtXG4gICAgICAgICAgICBbdGV4dF09XCIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5hY3Rpb25zLmFkZC1jaGlsZCcgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uQWN0aW9uKCdhZGQtY2hpbGQnKTsgcGFuZWwuY2xvc2UoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saWdodCBmYS1wbHVzXCI+PC9pPlxuICAgICAgICAgICAgPC9heC1wcmVmaXg+XG4gICAgICAgICAgPC9heC1idXR0b24taXRlbT5cblxuICAgICAgICAgIDwhLS0gTW92ZSBBY3Rpb25zIC0tPlxuICAgICAgICAgIEBpZiAoY2FuTW92ZVVwKCkgfHwgY2FuTW92ZURvd24oKSB8fCBjYW5Nb3ZlVG9QYXJlbnQoKSkge1xuICAgICAgICAgICAgPGF4LWRpdmlkZXI+PC9heC1kaXZpZGVyPlxuXG4gICAgICAgICAgICA8IS0tIE1vdmUgVXAgLS0+XG4gICAgICAgICAgICBAaWYgKGNhbk1vdmVVcCgpKSB7XG4gICAgICAgICAgICAgIDxheC1idXR0b24taXRlbVxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cIignQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LmFjdGlvbnMubW92ZS11cCcgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkFjdGlvbignbW92ZS11cCcpOyBwYW5lbC5jbG9zZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLWFycm93LXVwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgICAgICAgICA8L2F4LWJ1dHRvbi1pdGVtPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIE1vdmUgRG93biAtLT5cbiAgICAgICAgICAgIEBpZiAoY2FuTW92ZURvd24oKSkge1xuICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW1cbiAgICAgICAgICAgICAgICBbdGV4dF09XCIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5hY3Rpb25zLm1vdmUtZG93bicgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkFjdGlvbignbW92ZS1kb3duJyk7IHBhbmVsLmNsb3NlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtbGlnaHQgZmEtYXJyb3ctZG93blwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBNb3ZlIHRvIFBhcmVudCAtLT5cbiAgICAgICAgICAgIEBpZiAoY2FuTW92ZVRvUGFyZW50KCkpIHtcbiAgICAgICAgICAgICAgPGF4LWJ1dHRvbi1pdGVtXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuYWN0aW9ucy5tb3ZlLXRvLXBhcmVudCcgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkFjdGlvbignbW92ZS10by1wYXJlbnQnKTsgcGFuZWwuY2xvc2UoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1saWdodCBmYS1sZXZlbC11cFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIERlbGV0ZSAob25seSBmb3IgY3VzdG9tIGl0ZW1zIHdpdGggbmFtZXMpIC0tPlxuICAgICAgICAgIEBpZiAoaXRlbSgpLm5hbWUgJiYgaXRlbSgpLmlzQ3VzdG9tICYmIGNhbkRlbGV0ZSgpKSB7XG4gICAgICAgICAgICA8YXgtZGl2aWRlcj48L2F4LWRpdmlkZXI+XG4gICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW1cbiAgICAgICAgICAgICAgW2NvbG9yXT1cIidkYW5nZXInXCJcbiAgICAgICAgICAgICAgW3RleHRdPVwiKCdAZ2VuZXJhbDphY3Rpb25zLmRlbGV0ZS50aXRsZScgfCB0cmFuc2xhdGUgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25BY3Rpb24oJ2RlbGV0ZScpOyBwYW5lbC5jbG9zZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLWxpZ2h0IGZhLXRyYXNoXCI+PC9pPlxuICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPCEtLSBJbmZvIG1lc3NhZ2UgZm9yIGl0ZW1zIHdpdGhvdXQgbmFtZXMgLS0+XG4gICAgICAgICAgQGlmICghaXRlbSgpLm5hbWUpIHtcbiAgICAgICAgICAgIDxheC1kaXZpZGVyPjwvYXgtZGl2aWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1wLTIgYXgtdGV4dC14cyBheC10ZXh0LW5ldXRyYWwtNTAwIGF4LWl0YWxpY1wiPlxuICAgICAgICAgICAgICB7eyAnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLm5vLW5hbWUtaW5mbycgfCB0cmFuc2xhdGUgfCBhc3luYyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2F4LWJ1dHRvbi1pdGVtLWxpc3Q+XG4gICAgICA8L2F4LWRyb3Bkb3duLXBhbmVsPlxuICAgIDwvYXgtYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIENoaWxkcmVuIERyb3AgWm9uZSAtIEFsd2F5cyByZW5kZXIgdGhlIGRyb3AgbGlzdCBldmVuIHdoZW4gY29sbGFwc2VkIC0tPlxuICA8IS0tIFRoZSBkcm9wIGxpc3QgbXVzdCBleGlzdCBmb3IgaXRlbXMgdG8gYmUgZHJhZ2dhYmxlIEZST00gdGhpcyBjb250YWluZXIgLS0+XG4gIDxkaXZcbiAgICBjbGFzcz1cImF4bS1tZW51LXRyZWUtaXRlbV9fY2hpbGRyZW5cIlxuICAgIGNka0Ryb3BMaXN0XG4gICAgW2lkXT1cImdldERyb3BMaXN0SWQoKVwiXG4gICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJnZXRDaGlsZHJlbkFycmF5KClcIlxuICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cImNvbm5lY3RlZERyb3BMaXN0cygpXCJcbiAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgICBbY2xhc3MuLS1jb2xsYXBzZWRdPVwiIWlzRXhwYW5kZWQoKVwiXG4gID5cbiAgICBAaWYgKGlzRXhwYW5kZWQoKSkge1xuICAgICAgQGZvciAoY2hpbGQgb2YgZ2V0Q2hpbGRyZW5BcnJheSgpOyB0cmFjayBjaGlsZC5uYW1lIHx8IGNoaWxkLnBhdGggfHwgJGluZGV4OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICA8YXhtLW1lbnUtdHJlZS1pdGVtXG4gICAgICAgICAgW2l0ZW1dPVwiY2hpbGRcIlxuICAgICAgICAgIFtsZXZlbF09XCJsZXZlbCgpICsgMVwiXG4gICAgICAgICAgW2NhbkRlbGV0ZV09XCJjYW5EZWxldGUoKVwiXG4gICAgICAgICAgW2Nvbm5lY3RlZERyb3BMaXN0c109XCJjb25uZWN0ZWREcm9wTGlzdHMoKVwiXG4gICAgICAgICAgW2Nhbk1vdmVVcF09XCJpID4gMFwiXG4gICAgICAgICAgW2Nhbk1vdmVEb3duXT1cImkgPCBnZXRDaGlsZHJlbkFycmF5KCkubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgW2Nhbk1vdmVUb1BhcmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAoYWN0aW9uVHJpZ2dlcmVkKT1cImFjdGlvblRyaWdnZXJlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgIChpdGVtRHJvcHBlZCk9XCJpdGVtRHJvcHBlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==","import { AXPMenuProviderService, AXPMenuService } from '@acorex/platform/common';\nimport { AXPSettingService } from '@acorex/platform/common';\nimport { inject, Injectable } from '@angular/core';\nimport { cloneDeep, sortBy } from 'lodash-es';\nimport { AXP_MENU_CUSTOMIZATION_DEFAULT, AXP_MENU_CUSTOMIZATION_KEY } from './menu-customization.const';\nimport * as i0 from \"@angular/core\";\n//#region ---- Menu Management Service ----\nexport class AXPMenuManagementService {\n constructor() {\n //#region ---- Dependencies ----\n this.settingService = inject(AXPSettingService);\n this.menuProviderService = inject(AXPMenuProviderService);\n this.menuService = inject(AXPMenuService);\n }\n //#endregion\n //#region ---- Public Methods ----\n /**\n * Get all menu items with customization metadata\n */\n async getMenuTree(scope) {\n // Get RAW menu items (all items including hidden ones) - NO middleware to avoid duplicates\n const rawItems = await this.menuProviderService.rawItems();\n // Load customizations for the given scope\n const customization = await this.loadCustomization(scope);\n // Convert raw items to nodes\n const nodes = this.convertToNodes(rawItems, customization);\n // Add custom items to the management view\n const customNodes = this.convertCustomItemsToNodes(customization.customItems, customization);\n nodes.push(...customNodes);\n // Apply parent overrides to restructure the tree (this will move Sample 1 under Profile)\n const finalNodes = this.applyParentOverrides(nodes, customization);\n // Apply the EXACT same sorting logic as the sidebar for perfect synchronization\n const sortedNodes = this.applySidebarSorting(finalNodes);\n return sortedNodes;\n }\n /**\n * Load menu customization for a specific scope\n */\n async loadCustomization(scope) {\n try {\n const scopedSettings = this.settingService.scope(scope);\n const saved = await scopedSettings.get(AXP_MENU_CUSTOMIZATION_KEY);\n if (saved && saved.version) {\n return saved;\n }\n return cloneDeep(AXP_MENU_CUSTOMIZATION_DEFAULT);\n }\n catch (error) {\n return cloneDeep(AXP_MENU_CUSTOMIZATION_DEFAULT);\n }\n }\n /**\n * Save menu customization for a specific scope\n */\n async saveCustomization(scope, customization) {\n const scopedSettings = this.settingService.scope(scope);\n await scopedSettings.set(AXP_MENU_CUSTOMIZATION_KEY, customization);\n // Clear menu cache to force reload\n this.menuProviderService.clearCache();\n // Refresh the menu store to update the sidebar immediately\n const freshItems = await this.menuProviderService.items();\n this.menuService.setMenuItems(freshItems);\n // Force a small delay to ensure the signal update propagates\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n /**\n * Hide a menu item\n */\n async hideMenuItem(scope, menuName) {\n if (!menuName) {\n throw new Error('Menu item must have a name to be hidden');\n }\n const customization = await this.loadCustomization(scope);\n if (!customization.overrides[menuName]) {\n customization.overrides[menuName] = {};\n }\n customization.overrides[menuName].hidden = true;\n await this.saveCustomization(scope, customization);\n }\n /**\n * Show a menu item\n */\n async showMenuItem(scope, menuName) {\n if (!menuName) {\n throw new Error('Menu item must have a name to be shown');\n }\n const customization = await this.loadCustomization(scope);\n if (customization.overrides[menuName]) {\n delete customization.overrides[menuName].hidden;\n // Clean up if no other overrides exist\n if (Object.keys(customization.overrides[menuName]).length === 0) {\n delete customization.overrides[menuName];\n }\n }\n await this.saveCustomization(scope, customization);\n }\n /**\n * Update menu item priority\n */\n async updateMenuPriority(scope, menuName, priority) {\n const customization = await this.loadCustomization(scope);\n if (!customization.overrides[menuName]) {\n customization.overrides[menuName] = {};\n }\n customization.overrides[menuName].priority = priority;\n await this.saveCustomization(scope, customization);\n }\n /**\n * Move menu item to different parent\n */\n async moveMenuItem(scope, menuName, newParentName) {\n const customization = await this.loadCustomization(scope);\n if (!customization.overrides[menuName]) {\n customization.overrides[menuName] = {};\n }\n if (newParentName) {\n customization.overrides[menuName].parentName = newParentName;\n }\n else {\n delete customization.overrides[menuName].parentName;\n }\n await this.saveCustomization(scope, customization);\n }\n /**\n * Update menu item properties\n */\n async updateMenuProperties(scope, menuName, properties) {\n const customization = await this.loadCustomization(scope);\n if (!customization.overrides[menuName]) {\n customization.overrides[menuName] = {};\n }\n customization.overrides[menuName].properties = {\n ...customization.overrides[menuName].properties,\n ...properties,\n };\n await this.saveCustomization(scope, customization);\n }\n /**\n * Add custom menu item\n */\n async addCustomMenuItem(scope, menuItem) {\n const customization = await this.loadCustomization(scope);\n // Generate unique name if not provided\n if (!menuItem.name) {\n menuItem.name = `custom-menu-${Date.now()}`;\n }\n customization.customItems.push(menuItem);\n await this.saveCustomization(scope, customization);\n }\n /**\n * Add custom menu item as child of existing item\n */\n async addCustomMenuItemAsChild(scope, menuItem, parentName) {\n const customization = await this.loadCustomization(scope);\n // Generate unique name if not provided\n if (!menuItem.name) {\n menuItem.name = `custom-menu-${Date.now()}`;\n }\n // Add custom item\n customization.customItems.push(menuItem);\n // Set parent override to move it under the specified parent\n if (!customization.overrides[menuItem.name]) {\n customization.overrides[menuItem.name] = {};\n }\n customization.overrides[menuItem.name].parentName = parentName;\n await this.saveCustomization(scope, customization);\n }\n /**\n * Update custom menu item\n */\n async updateCustomMenuItem(scope, menuName, menuItem) {\n const customization = await this.loadCustomization(scope);\n const index = customization.customItems.findIndex((item) => item.name === menuName);\n if (index !== -1) {\n customization.customItems[index] = menuItem;\n await this.saveCustomization(scope, customization);\n }\n }\n /**\n * Delete custom menu item\n */\n async deleteCustomMenuItem(scope, menuName) {\n const customization = await this.loadCustomization(scope);\n customization.customItems = customization.customItems.filter((item) => item.name !== menuName);\n await this.saveCustomization(scope, customization);\n }\n /**\n * Reset all customizations for a scope\n */\n async resetCustomizations(scope) {\n await this.saveCustomization(scope, cloneDeep(AXP_MENU_CUSTOMIZATION_DEFAULT));\n }\n /**\n * Reorder menu items based on drag-drop\n */\n async reorderMenuItems(scope, items, parentName) {\n const customization = await this.loadCustomization(scope);\n // Update priorities for all items at this level (only for items with names)\n items.forEach((item, index) => {\n if (item.name) {\n if (!customization.overrides[item.name]) {\n customization.overrides[item.name] = {};\n }\n // Set priority based on index\n customization.overrides[item.name].priority = index * 100;\n // Update parentName to reflect the new parent\n // Use empty string for root level, actual name for nested items\n customization.overrides[item.name].parentName = parentName || '';\n }\n });\n await this.saveCustomization(scope, customization);\n }\n //#endregion\n //#region ---- Private Methods ----\n /**\n * Apply the EXACT same sorting logic as the sidebar for perfect synchronization\n * Uses the same sortBy logic: [(c) => c.priority ?? 0, (c) => c.text]\n */\n applySidebarSorting(nodes) {\n return sortBy(nodes, [(c) => c.priority ?? 0, (c) => c.text]).map(node => ({\n ...node,\n children: node.children ? this.applySidebarSorting(node.children) : undefined\n }));\n }\n /**\n * Convert custom items to nodes with metadata\n */\n convertCustomItemsToNodes(customItems, customization) {\n return customItems.map((item) => {\n const override = item.name ? customization.overrides[item.name] : undefined;\n const node = {\n ...item,\n name: item.name,\n isBuiltIn: false,\n isCustom: true,\n isHidden: override?.hidden || false,\n originalPriority: item.priority,\n originalParentName: undefined,\n // Apply priority override if it exists\n priority: override?.priority !== undefined ? override.priority : item.priority,\n // Apply icon override if it exists\n icon: override?.properties?.icon !== undefined ? override.properties.icon : item.icon,\n // Apply text override if it exists\n text: override?.properties?.text !== undefined ? override.properties.text : item.text,\n // Apply path override if it exists\n path: override?.properties?.path !== undefined ? override.properties.path : item.path,\n children: item.children ? this.convertToNodes(item.children, customization) : undefined,\n };\n return node;\n });\n }\n /**\n * Apply parentName overrides to restructure the tree\n */\n applyParentOverrides(nodes, customization) {\n // Check if there are any parentName overrides (even if value is undefined)\n const hasParentOverrides = Object.values(customization.overrides).some((override) => 'parentName' in override);\n if (!hasParentOverrides) {\n return nodes;\n }\n // Clone the tree to avoid mutations\n const clonedNodes = this.deepCloneNodes(nodes);\n // Find items that need to be moved based on parentName overrides\n Object.entries(customization.overrides).forEach(([itemName, override]) => {\n // Check if the override has a parentName property (even if it's an empty string)\n if ('parentName' in override) {\n const isRootLevel = !override.parentName || override.parentName === '';\n // Find and remove the item from its current location\n const removedItem = this.removeAndReturnNode(clonedNodes, itemName);\n if (removedItem) {\n if (isRootLevel) {\n // Move to root level\n clonedNodes.push(removedItem);\n }\n else {\n // Move to specified parent\n const newParent = this.findNodeByName(clonedNodes, override.parentName);\n if (newParent) {\n if (!newParent.children) {\n newParent.children = [];\n }\n newParent.children.push(removedItem);\n }\n else {\n // Fallback: add to root if parent not found\n clonedNodes.push(removedItem);\n }\n }\n }\n }\n });\n // Re-sort after restructuring\n this.sortNodesRecursive(clonedNodes);\n return clonedNodes;\n }\n /**\n * Remove a node from tree and return it\n */\n removeAndReturnNode(nodes, name) {\n for (let i = 0; i < nodes.length; i++) {\n if (nodes[i].name === name) {\n const [removed] = nodes.splice(i, 1);\n return removed;\n }\n if (nodes[i].children) {\n const found = this.removeAndReturnNode(nodes[i].children, name);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n /**\n * Deep clone nodes array\n */\n deepCloneNodes(nodes) {\n return nodes.map((node) => ({\n ...node,\n children: node.children ? this.deepCloneNodes(node.children) : undefined,\n }));\n }\n /**\n * Find a node by name in the tree\n */\n findNodeByName(nodes, name) {\n for (const node of nodes) {\n if (node.name === name) {\n return node;\n }\n if (node.children) {\n const found = this.findNodeByName(node.children, name);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n /**\n * Sort nodes recursively by priority first, then by text (same as sidebar)\n */\n sortNodesRecursive(nodes) {\n // Sort by priority first, then by text (same as sidebar)\n const sorted = sortBy(nodes, [(c) => c.priority ?? 0, (c) => c.text]);\n nodes.length = 0;\n nodes.push(...sorted);\n nodes.forEach((node) => {\n if (node.children) {\n this.sortNodesRecursive(node.children);\n }\n });\n }\n /**\n * Convert menu items to nodes with metadata\n */\n convertToNodes(items, customization) {\n const nodes = items.map((item) => {\n // Only use items that have a proper name property\n const itemName = item.name;\n const override = itemName ? customization.overrides[itemName] : undefined;\n const isCustom = itemName ? customization.customItems.some((ci) => ci.name === itemName) : false;\n const node = {\n ...item,\n name: itemName,\n isBuiltIn: !isCustom,\n isCustom,\n isHidden: override?.hidden || false,\n originalPriority: item.priority,\n originalParentName: undefined,\n // Apply priority override if it exists\n priority: override?.priority !== undefined ? override.priority : item.priority,\n // Apply icon override if it exists\n icon: override?.properties?.icon !== undefined ? override.properties.icon : item.icon,\n // Apply text override if it exists\n text: override?.properties?.text !== undefined ? override.properties.text : item.text,\n // Apply path override if it exists\n path: override?.properties?.path !== undefined ? override.properties.path : item.path,\n children: item.children ? this.convertToNodes(item.children, customization) : undefined,\n };\n return node;\n });\n // Don't sort here - sorting is applied at the top level in getMenuTree\n return nodes;\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXPMenuManagementService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXPMenuManagementService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXPMenuManagementService, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21vZHVsZXMvYXBwbGljYXRpb24tbWFuYWdlbWVudC9zcmMvbGliL2ZlYXR1cmVzL21lbnUtbWFuYWdlbWVudC9tZW51LW1hbmFnZW1lbnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLDBCQUEwQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBR3hHLCtDQUErQztBQUcvQyxNQUFNLE9BQU8sd0JBQXdCO0lBRHJDO1FBR0ksb0NBQW9DO1FBRTVCLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDM0Msd0JBQW1CLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckQsZ0JBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FvZGhEO0lBbGRHLFlBQVk7SUFFWixzQ0FBc0M7SUFFdEM7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQXVCO1FBQ3JDLDJGQUEyRjtRQUMzRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUzRCwwQ0FBMEM7UUFDMUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUQsNkJB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LEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDMUYsQ0FBQztZQUVGLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsdUVBQXVFO1FBQ3ZFLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7OEdBdGRRLHdCQUF3QjtrSEFBeEIsd0JBQXdCLGNBRFgsTUFBTTs7MkZBQ25CLHdCQUF3QjtrQkFEcEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWFBNZW51SXRlbSwgQVhQTWVudVByb3ZpZGVyU2VydmljZSwgQVhQTWVudVNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvbW1vbic7XG5pbXBvcnQgeyBBWFBQbGF0Zm9ybVNjb3BlIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb3JlJztcbmltcG9ydCB7IEFYUFNldHRpbmdTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb21tb24nO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBBWFBfTUVOVV9DVVNUT01JWkFUSU9OX0RFRkFVTFQsIEFYUF9NRU5VX0NVU1RPTUlaQVRJT05fS0VZIH0gZnJvbSAnLi9tZW51LWN1c3RvbWl6YXRpb24uY29uc3QnO1xuaW1wb3J0IHsgQVhQTWVudUN1c3RvbWl6YXRpb24sIEFYUE1lbnVJdGVtTm9kZSwgQVhQTWVudUl0ZW1PdmVycmlkZSB9IGZyb20gJy4vbWVudS1jdXN0b21pemF0aW9uLnR5cGVzJztcblxuLy8jcmVnaW9uIC0tLS0gICBNZW51IE1hbmFnZW1lbnQgU2VydmljZSAgIC0tLS1cblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBWFBNZW51TWFuYWdlbWVudFNlcnZpY2Uge1xuXG4gICAgLy8jcmVnaW9uIC0tLS0gICBEZXBlbmRlbmNpZXMgICAtLS0tXG5cbiAgICBwcml2YXRlIHNldHRpbmdTZXJ2aWNlID0gaW5qZWN0KEFYUFNldHRpbmdTZXJ2aWNlKTtcbiAgICBwcml2YXRlIG1lbnVQcm92aWRlclNlcnZpY2UgPSBpbmplY3QoQVhQTWVudVByb3ZpZGVyU2VydmljZSk7XG4gICAgcHJpdmF0ZSBtZW51U2VydmljZSA9IGluamVjdChBWFBNZW51U2VydmljZSk7XG5cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgUHVibGljIE1ldGhvZHMgICAtLS0tXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIG1lbnUgaXRlbXMgd2l0aCBjdXN0b21pemF0aW9uIG1ldGFkYXRhXG4gICAgICovXG4gICAgYXN5bmMgZ2V0TWVudVRyZWUoc2NvcGU6IEFYUFBsYXRmb3JtU2NvcGUpOiBQcm9taXNlPEFYUE1lbnVJdGVtTm9kZVtdPiB7XG4gICAgICAgIC8vIEdldCBSQVcgbWVudSBpdGVtcyAoYWxsIGl0ZW1zIGluY2x1ZGluZyBoaWRkZW4gb25lcykgLSBOTyBtaWRkbGV3YXJlIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgY29uc3QgcmF3SXRlbXMgPSBhd2FpdCB0aGlzLm1lbnVQcm92aWRlclNlcnZpY2UucmF3SXRlbXMoKTtcblxuICAgICAgICAvLyBMb2FkIGN1c3RvbWl6YXRpb25zIGZvciB0aGUgZ2l2ZW4gc2NvcGVcbiAgICAgICAgY29uc3QgY3VzdG9taXphdGlvbiA9IGF3YWl0IHRoaXMubG9hZEN1c3RvbWl6YXRpb24oc2NvcGUpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmF3IGl0ZW1zIHRvIG5vZGVzXG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5jb252ZXJ0VG9Ob2RlcyhyYXdJdGVtcywgY3VzdG9taXphdGlvbik7XG5cbiAgICAgICAgLy8gQWRkIGN1c3RvbSBpdGVtcyB0byB0aGUgbWFuYWdlbWVudCB2aWV3XG4gICAgICAgIGNvbnN0IGN1c3RvbU5vZGVzID0gdGhpcy5jb252ZXJ0Q3VzdG9tSXRlbXNUb05vZGVzKGN1c3RvbWl6YXRpb24uY3VzdG9tSXRlbXMsIGN1c3RvbWl6YXRpb24pO1xuICAgICAgICBub2Rlcy5wdXNoKC4uLmN1c3RvbU5vZGVzKTtcblxuICAgICAgICAvLyBBcHBseSBwYXJlbnQgb3ZlcnJpZGVzIHRvIHJlc3RydWN0dXJlIHRoZSB0cmVlICh0aGlzIHdpbGwgbW92ZSBTYW1wbGUgMSB1bmRlciBQcm9maWxlKVxuICAgICAgICBjb25zdCBmaW5hbE5vZGVzID0gdGhpcy5hcHBseVBhcmVudE92ZXJyaWRlcyhub2RlcywgY3VzdG9taXphdGlvbik7XG5cbiAgICAgICAgLy8gQXBwbHkgdGhlIEVYQUNUIHNhbWUgc29ydGluZyBsb2dpYyBhcyB0aGUgc2lkZWJhciBmb3IgcGVyZmVjdCBzeW5jaHJvbml6YXRpb25cbiAgICAgICAgY29uc3Qgc29ydGVkTm9kZXMgPSB0aGlzLmFwcGx5U2lkZWJhclNvcnRpbmcoZmluYWxOb2Rlcyk7XG5cbiAgICAgICAgcmV0dXJuIHNvcnRlZE5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgbWVudSBjdXN0b21pemF0aW9uIGZvciBhIHNwZWNpZmljIHNjb3BlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZEN1c3RvbWl6YXRpb24oc2NvcGU6IEFYUFBsYXRmb3JtU2NvcGUpOiBQcm9taXNlPEFYUE1lbnVDdXN0b21pemF0aW9uPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzY29wZWRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ1NlcnZpY2Uuc2NvcGUoc2NvcGUpO1xuICAgICAgICAgICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBzY29wZWRTZXR0aW5ncy5nZXQ8QVhQTWVudUN1c3RvbWl6YXRpb24+KEFYUF9NRU5VX0NVU1RPTUlaQVRJT05fS0VZKTtcblxuICAgICAgICAgICAgaWYgKHNhdmVkICYmIHNhdmVkLnZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2F2ZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjbG9uZURlZXAoQVhQX01FTlVfQ1VTVE9NSVpBVElPTl9ERUZBVUxUKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjbG9uZURlZXAoQVhQX01FTlVfQ1VTVE9NSVpBVElPTl9ERUZBVUxUKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmUgbWVudSBjdXN0b21pemF0aW9uIGZvciBhIHNwZWNpZmljIHNjb3BlXG4gICAgICovXG4gICAgYXN5bmMgc2F2ZUN1c3RvbWl6YXRpb24oc2NvcGU6IEFYUFBsYXRmb3JtU2NvcGUsIGN1c3RvbWl6YXRpb246IEFYUE1lbnVDdXN0b21pemF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHNjb3BlZFNldHRpbmdzID0gdGhpcy5zZXR0aW5nU2VydmljZS5zY29wZShzY29wZSk7XG4gICAgICAgIGF3YWl0IHNjb3BlZFNldHRpbmdzLnNldChBWFBfTUVOVV9DVVNUT01JWkFUSU9OX0tFWSwgY3VzdG9taXphdGlvbik7XG5cbiAgICAgICAgLy8gQ2xlYXIgbWVudSBjYWNoZSB0byBmb3JjZSByZWxvYWRcbiAgICAgICAgdGhpcy5tZW51UHJvdmlkZXJTZXJ2aWNlLmNsZWFyQ2FjaGUoKTtcblxuICAgICAgICAvLyBSZWZyZXNoIHRoZSBtZW51IHN0b3JlIHRvIHVwZGF0ZSB0aGUgc2lkZWJhciBpbW1lZGlhdGVseVxuICAgICAgICBjb25zdCBmcmVzaEl0ZW1zID0gYXdhaXQgdGhpcy5tZW51UHJvdmlkZXJTZXJ2aWNlLml0ZW1zKCk7XG5cbiAgICAgICAgdGhpcy5tZW51U2VydmljZS5zZXRNZW51SXRlbXMoZnJlc2hJdGVtcyk7XG5cbiAgICAgICAgLy8gRm9yY2UgYSBzbWFsbCBkZWxheSB0byBlbnN1cmUgdGhlIHNpZ25hbCB1cGRhdGUgcHJvcGFnYXRlc1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZSBhIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIGFzeW5jIGhpZGVNZW51SXRlbShzY29wZTogQVhQUGxhdGZvcm1TY29wZSwgbWVudU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIW1lbnVOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbnUgaXRlbSBtdXN0IGhhdmUgYSBuYW1lIHRvIGJlIGhpZGRlbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VzdG9taXphdGlvbiA9IGF3YWl0IHRoaXMubG9hZEN1c3RvbWl6YXRpb24oc2NvcGUpO1xuXG4gICAgICAgIGlmICghY3VzdG9taXphdGlvbi5vdmVycmlkZXNbbWVudU5hbWVdKSB7XG4gICAgICAgICAgICBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVOYW1lXS5oaWRkZW4gPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUN1c3RvbWl6YXRpb24oc2NvcGUsIGN1c3RvbWl6YXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYSBtZW51IGl0ZW1cbiAgICAgKi9cbiAgICBhc3luYyBzaG93TWVudUl0ZW0oc2NvcGU6IEFYUFBsYXRmb3JtU2NvcGUsIG1lbnVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFtZW51TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW51IGl0ZW0gbXVzdCBoYXZlIGEgbmFtZSB0byBiZSBzaG93bicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VzdG9taXphdGlvbiA9IGF3YWl0IHRoaXMubG9hZEN1c3RvbWl6YXRpb24oc2NvcGUpO1xuXG4gICAgICAgIGlmIChjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0uaGlkZGVuO1xuXG4gICAgICAgICAgICAvLyBDbGVhbiB1cCBpZiBubyBvdGhlciBvdmVycmlkZXMgZXhpc3RcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDdXN0b21pemF0aW9uKHNjb3BlLCBjdXN0b21pemF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgbWVudSBpdGVtIHByaW9yaXR5XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWVudVByaW9yaXR5KHNjb3BlOiBBWFBQbGF0Zm9ybVNjb3BlLCBtZW51TmFtZTogc3RyaW5nLCBwcmlvcml0eTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbWl6YXRpb24gPSBhd2FpdCB0aGlzLmxvYWRDdXN0b21pemF0aW9uKHNjb3BlKTtcblxuICAgICAgICBpZiAoIWN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVOYW1lXSkge1xuICAgICAgICAgICAgY3VzdG9taXphdGlvbi5vdmVycmlkZXNbbWVudU5hbWVdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0ucHJpb3JpdHkgPSBwcmlvcml0eTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDdXN0b21pemF0aW9uKHNjb3BlLCBjdXN0b21pemF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG1lbnUgaXRlbSB0byBkaWZmZXJlbnQgcGFyZW50XG4gICAgICovXG4gICAgYXN5bmMgbW92ZU1lbnVJdGVtKHNjb3BlOiBBWFBQbGF0Zm9ybVNjb3BlLCBtZW51TmFtZTogc3RyaW5nLCBuZXdQYXJlbnROYW1lOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbWl6YXRpb24gPSBhd2FpdCB0aGlzLmxvYWRDdXN0b21pemF0aW9uKHNjb3BlKTtcblxuICAgICAgICBpZiAoIWN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVOYW1lXSkge1xuICAgICAgICAgICAgY3VzdG9taXphdGlvbi5vdmVycmlkZXNbbWVudU5hbWVdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UGFyZW50TmFtZSkge1xuICAgICAgICAgICAgY3VzdG9taXphdGlvbi5vdmVycmlkZXNbbWVudU5hbWVdLnBhcmVudE5hbWUgPSBuZXdQYXJlbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVOYW1lXS5wYXJlbnROYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQ3VzdG9taXphdGlvbihzY29wZSwgY3VzdG9taXphdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIG1lbnUgaXRlbSBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWVudVByb3BlcnRpZXMoXG4gICAgICAgIHNjb3BlOiBBWFBQbGF0Zm9ybVNjb3BlLFxuICAgICAgICBtZW51TmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzOiBQYXJ0aWFsPEFYUE1lbnVJdGVtPlxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXN0b21pemF0aW9uID0gYXdhaXQgdGhpcy5sb2FkQ3VzdG9taXphdGlvbihzY29wZSk7XG5cbiAgICAgICAgaWYgKCFjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0pIHtcbiAgICAgICAgICAgIGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVOYW1lXSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY3VzdG9taXphdGlvbi5vdmVycmlkZXNbbWVudU5hbWVdLnByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAuLi5jdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51TmFtZV0ucHJvcGVydGllcyxcbiAgICAgICAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQ3VzdG9taXphdGlvbihzY29wZSwgY3VzdG9taXphdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGN1c3RvbSBtZW51IGl0ZW1cbiAgICAgKi9cbiAgICBhc3luYyBhZGRDdXN0b21NZW51SXRlbShzY29wZTogQVhQUGxhdGZvcm1TY29wZSwgbWVudUl0ZW06IEFYUE1lbnVJdGVtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbWl6YXRpb24gPSBhd2FpdCB0aGlzLmxvYWRDdXN0b21pemF0aW9uKHNjb3BlKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgbmFtZSBpZiBub3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKCFtZW51SXRlbS5uYW1lKSB7XG4gICAgICAgICAgICBtZW51SXRlbS5uYW1lID0gYGN1c3RvbS1tZW51LSR7RGF0ZS5ub3coKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VzdG9taXphdGlvbi5jdXN0b21JdGVtcy5wdXNoKG1lbnVJdGVtKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNhdmVDdXN0b21pemF0aW9uKHNjb3BlLCBjdXN0b21pemF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgY3VzdG9tIG1lbnUgaXRlbSBhcyBjaGlsZCBvZiBleGlzdGluZyBpdGVtXG4gICAgICovXG4gICAgYXN5bmMgYWRkQ3VzdG9tTWVudUl0ZW1Bc0NoaWxkKHNjb3BlOiBBWFBQbGF0Zm9ybVNjb3BlLCBtZW51SXRlbTogQVhQTWVudUl0ZW0sIHBhcmVudE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXN0b21pemF0aW9uID0gYXdhaXQgdGhpcy5sb2FkQ3VzdG9taXphdGlvbihzY29wZSk7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIG5hbWUgaWYgbm90IHByb3ZpZGVkXG4gICAgICAgIGlmICghbWVudUl0ZW0ubmFtZSkge1xuICAgICAgICAgICAgbWVudUl0ZW0ubmFtZSA9IGBjdXN0b20tbWVudS0ke0RhdGUubm93KCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gaXRlbVxuICAgICAgICBjdXN0b21pemF0aW9uLmN1c3RvbUl0ZW1zLnB1c2gobWVudUl0ZW0pO1xuXG4gICAgICAgIC8vIFNldCBwYXJlbnQgb3ZlcnJpZGUgdG8gbW92ZSBpdCB1bmRlciB0aGUgc3BlY2lmaWVkIHBhcmVudFxuICAgICAgICBpZiAoIWN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVJdGVtLm5hbWVdKSB7XG4gICAgICAgICAgICBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1ttZW51SXRlbS5uYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW21lbnVJdGVtLm5hbWVdLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUN1c3RvbWl6YXRpb24oc2NvcGUsIGN1c3RvbWl6YXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBjdXN0b20gbWVudSBpdGVtXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlQ3VzdG9tTWVudUl0ZW0oc2NvcGU6IEFYUFBsYXRmb3JtU2NvcGUsIG1lbnVOYW1lOiBzdHJpbmcsIG1lbnVJdGVtOiBBWFBNZW51SXRlbSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXN0b21pemF0aW9uID0gYXdhaXQgdGhpcy5sb2FkQ3VzdG9taXphdGlvbihzY29wZSk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBjdXN0b21pemF0aW9uLmN1c3RvbUl0ZW1zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBtZW51TmFtZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY3VzdG9taXphdGlvbi5jdXN0b21JdGVtc1tpbmRleF0gPSBtZW51SXRlbTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZUN1c3RvbWl6YXRpb24oc2NvcGUsIGN1c3RvbWl6YXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgY3VzdG9tIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUN1c3RvbU1lbnVJdGVtKHNjb3BlOiBBWFBQbGF0Zm9ybVNjb3BlLCBtZW51TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbWl6YXRpb24gPSBhd2FpdCB0aGlzLmxvYWRDdXN0b21pemF0aW9uKHNjb3BlKTtcblxuICAgICAgICBjdXN0b21pemF0aW9uLmN1c3RvbUl0ZW1zID0gY3VzdG9taXphdGlvbi5jdXN0b21JdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZSAhPT0gbWVudU5hbWUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUN1c3RvbWl6YXRpb24oc2NvcGUsIGN1c3RvbWl6YXRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0IGFsbCBjdXN0b21pemF0aW9ucyBmb3IgYSBzY29wZVxuICAgICAqL1xuICAgIGFzeW5jIHJlc2V0Q3VzdG9taXphdGlvbnMoc2NvcGU6IEFYUFBsYXRmb3JtU2NvcGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlQ3VzdG9taXphdGlvbihzY29wZSwgY2xvbmVEZWVwKEFYUF9NRU5VX0NVU1RPTUlaQVRJT05fREVGQVVMVCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgbWVudSBpdGVtcyBiYXNlZCBvbiBkcmFnLWRyb3BcbiAgICAgKi9cbiAgICBhc3luYyByZW9yZGVyTWVudUl0ZW1zKFxuICAgICAgICBzY29wZTogQVhQUGxhdGZvcm1TY29wZSxcbiAgICAgICAgaXRlbXM6IEFYUE1lbnVJdGVtTm9kZVtdLFxuICAgICAgICBwYXJlbnROYW1lOiBzdHJpbmcgfCBudWxsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbWl6YXRpb24gPSBhd2FpdCB0aGlzLmxvYWRDdXN0b21pemF0aW9uKHNjb3BlKTtcblxuICAgICAgICAvLyBVcGRhdGUgcHJpb3JpdGllcyBmb3IgYWxsIGl0ZW1zIGF0IHRoaXMgbGV2ZWwgKG9ubHkgZm9yIGl0ZW1zIHdpdGggbmFtZXMpXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXN0b21pemF0aW9uLm92ZXJyaWRlc1tpdGVtLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW2l0ZW0ubmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgcHJpb3JpdHkgYmFzZWQgb24gaW5kZXhcbiAgICAgICAgICAgICAgICBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1tpdGVtLm5hbWVdLnByaW9yaXR5ID0gaW5kZXggKiAxMDA7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcGFyZW50TmFtZSB0byByZWZsZWN0IHRoZSBuZXcgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gVXNlIGVtcHR5IHN0cmluZyBmb3Igcm9vdCBsZXZlbCwgYWN0dWFsIG5hbWUgZm9yIG5lc3RlZCBpdGVtc1xuICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW2l0ZW0ubmFtZV0ucGFyZW50TmFtZSA9IHBhcmVudE5hbWUgfHwgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZUN1c3RvbWl6YXRpb24oc2NvcGUsIGN1c3RvbWl6YXRpb24pO1xuICAgIH1cblxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIC0tLS0gICBQcml2YXRlIE1ldGhvZHMgICAtLS0tXG5cbiAgICAvKipcbiAgICAgKiBBcHBseSB0aGUgRVhBQ1Qgc2FtZSBzb3J0aW5nIGxvZ2ljIGFzIHRoZSBzaWRlYmFyIGZvciBwZXJmZWN0IHN5bmNocm9uaXphdGlvblxuICAgICAqIFVzZXMgdGhlIHNhbWUgc29ydEJ5IGxvZ2ljOiBbKGMpID0+IGMucHJpb3JpdHkgPz8gMCwgKGMpID0+IGMudGV4dF1cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5U2lkZWJhclNvcnRpbmcobm9kZXM6IEFYUE1lbnVJdGVtTm9kZVtdKTogQVhQTWVudUl0ZW1Ob2RlW10ge1xuICAgICAgICByZXR1cm4gc29ydEJ5KG5vZGVzLCBbKGMpID0+IGMucHJpb3JpdHkgPz8gMCwgKGMpID0+IGMudGV4dF0pLm1hcChub2RlID0+ICh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4gPyB0aGlzLmFwcGx5U2lkZWJhclNvcnRpbmcobm9kZS5jaGlsZHJlbikgOiB1bmRlZmluZWRcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgY3VzdG9tIGl0ZW1zIHRvIG5vZGVzIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnZlcnRDdXN0b21JdGVtc1RvTm9kZXMoY3VzdG9tSXRlbXM6IEFYUE1lbnVJdGVtW10sIGN1c3RvbWl6YXRpb246IEFYUE1lbnVDdXN0b21pemF0aW9uKTogQVhQTWVudUl0ZW1Ob2RlW10ge1xuICAgICAgICByZXR1cm4gY3VzdG9tSXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdmVycmlkZSA9IGl0ZW0ubmFtZSA/IGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzW2l0ZW0ubmFtZV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEFYUE1lbnVJdGVtTm9kZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICBpc0J1aWx0SW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQ3VzdG9tOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzSGlkZGVuOiBvdmVycmlkZT8uaGlkZGVuIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUHJpb3JpdHk6IGl0ZW0ucHJpb3JpdHksXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxQYXJlbnROYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgcHJpb3JpdHkgb3ZlcnJpZGUgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IG92ZXJyaWRlPy5wcmlvcml0eSAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUucHJpb3JpdHkgOiBpdGVtLnByaW9yaXR5LFxuICAgICAgICAgICAgICAgIC8vIEFwcGx5IGljb24gb3ZlcnJpZGUgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWNvbjogb3ZlcnJpZGU/LnByb3BlcnRpZXM/Lmljb24gIT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlLnByb3BlcnRpZXMuaWNvbiA6IGl0ZW0uaWNvbixcbiAgICAgICAgICAgICAgICAvLyBBcHBseSB0ZXh0IG92ZXJyaWRlIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgICAgIHRleHQ6IG92ZXJyaWRlPy5wcm9wZXJ0aWVzPy50ZXh0ICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZS5wcm9wZXJ0aWVzLnRleHQgOiBpdGVtLnRleHQsXG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgcGF0aCBvdmVycmlkZSBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgICAgICBwYXRoOiBvdmVycmlkZT8ucHJvcGVydGllcz8ucGF0aCAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUucHJvcGVydGllcy5wYXRoIDogaXRlbS5wYXRoLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBpdGVtLmNoaWxkcmVuID8gdGhpcy5jb252ZXJ0VG9Ob2RlcyhpdGVtLmNoaWxkcmVuLCBjdXN0b21pemF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBwYXJlbnROYW1lIG92ZXJyaWRlcyB0byByZXN0cnVjdHVyZSB0aGUgdHJlZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlQYXJlbnRPdmVycmlkZXMoXG4gICAgICAgIG5vZGVzOiBBWFBNZW51SXRlbU5vZGVbXSxcbiAgICAgICAgY3VzdG9taXphdGlvbjogQVhQTWVudUN1c3RvbWl6YXRpb25cbiAgICApOiBBWFBNZW51SXRlbU5vZGVbXSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGFyZW50TmFtZSBvdmVycmlkZXMgKGV2ZW4gaWYgdmFsdWUgaXMgdW5kZWZpbmVkKVxuICAgICAgICBjb25zdCBoYXNQYXJlbnRPdmVycmlkZXMgPSBPYmplY3QudmFsdWVzKGN1c3RvbWl6YXRpb24ub3ZlcnJpZGVzKS5zb21lKFxuICAgICAgICAgICAgKG92ZXJyaWRlKSA9PiAncGFyZW50TmFtZScgaW4gb3ZlcnJpZGVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWhhc1BhcmVudE92ZXJyaWRlcykge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvbmUgdGhlIHRyZWUgdG8gYXZvaWQgbXV0YXRpb25zXG4gICAgICAgIGNvbnN0IGNsb25lZE5vZGVzID0gdGhpcy5kZWVwQ2xvbmVOb2Rlcyhub2Rlcyk7XG5cbiAgICAgICAgLy8gRmluZCBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgbW92ZWQgYmFzZWQgb24gcGFyZW50TmFtZSBvdmVycmlkZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY3VzdG9taXphdGlvbi5vdmVycmlkZXMpLmZvckVhY2goKFtpdGVtTmFtZSwgb3ZlcnJpZGVdKSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgb3ZlcnJpZGUgaGFzIGEgcGFyZW50TmFtZSBwcm9wZXJ0eSAoZXZlbiBpZiBpdCdzIGFuIGVtcHR5IHN0cmluZylcbiAgICAgICAgICAgIGlmICgncGFyZW50TmFtZScgaW4gb3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1Jvb3RMZXZlbCA9ICFvdmVycmlkZS5wYXJlbnROYW1lIHx8IG92ZXJyaWRlLnBhcmVudE5hbWUgPT09ICcnO1xuXG4gICAgICAgICAgICAgICAgLy8gRmluZCBhbmQgcmVtb3ZlIHRoZSBpdGVtIGZyb20gaXRzIGN1cnJlbnQgbG9jYXRpb25cbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IHRoaXMucmVtb3ZlQW5kUmV0dXJuTm9kZShjbG9uZWROb2RlcywgaXRlbU5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Jvb3RMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byByb290IGxldmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9uZWROb2Rlcy5wdXNoKHJlbW92ZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gc3BlY2lmaWVkIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50ID0gdGhpcy5maW5kTm9kZUJ5TmFtZShjbG9uZWROb2Rlcywgb3ZlcnJpZGUucGFyZW50TmFtZSEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV3UGFyZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudC5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJlbnQuY2hpbGRyZW4ucHVzaChyZW1vdmVkSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBhZGQgdG8gcm9vdCBpZiBwYXJlbnQgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVkTm9kZXMucHVzaChyZW1vdmVkSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlLXNvcnQgYWZ0ZXIgcmVzdHJ1Y3R1cmluZ1xuICAgICAgICB0aGlzLnNvcnROb2Rlc1JlY3Vyc2l2ZShjbG9uZWROb2Rlcyk7XG5cbiAgICAgICAgcmV0dXJuIGNsb25lZE5vZGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIG5vZGUgZnJvbSB0cmVlIGFuZCByZXR1cm4gaXRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUFuZFJldHVybk5vZGUobm9kZXM6IEFYUE1lbnVJdGVtTm9kZVtdLCBuYW1lOiBzdHJpbmcpOiBBWFBNZW51SXRlbU5vZGUgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5vZGVzW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcmVtb3ZlZF0gPSBub2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZXNbaV0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMucmVtb3ZlQW5kUmV0dXJuTm9kZShub2Rlc1tpXS5jaGlsZHJlbiEsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZXAgY2xvbmUgbm9kZXMgYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIGRlZXBDbG9uZU5vZGVzKG5vZGVzOiBBWFBNZW51SXRlbU5vZGVbXSk6IEFYUE1lbnVJdGVtTm9kZVtdIHtcbiAgICAgICAgcmV0dXJuIG5vZGVzLm1hcCgobm9kZSkgPT4gKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbiA/IHRoaXMuZGVlcENsb25lTm9kZXMobm9kZS5jaGlsZHJlbikgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgbm9kZSBieSBuYW1lIGluIHRoZSB0cmVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kTm9kZUJ5TmFtZShub2RlczogQVhQTWVudUl0ZW1Ob2RlW10sIG5hbWU6IHN0cmluZyk6IEFYUE1lbnVJdGVtTm9kZSB8IG51bGwge1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmROb2RlQnlOYW1lKG5vZGUuY2hpbGRyZW4sIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNvcnQgbm9kZXMgcmVjdXJzaXZlbHkgYnkgcHJpb3JpdHkgZmlyc3QsIHRoZW4gYnkgdGV4dCAoc2FtZSBhcyBzaWRlYmFyKVxuICAgICAqL1xuICAgIHByaXZhdGUgc29ydE5vZGVzUmVjdXJzaXZlKG5vZGVzOiBBWFBNZW51SXRlbU5vZGVbXSk6IHZvaWQge1xuICAgICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IGZpcnN0LCB0aGVuIGJ5IHRleHQgKHNhbWUgYXMgc2lkZWJhcilcbiAgICAgICAgY29uc3Qgc29ydGVkID0gc29ydEJ5KG5vZGVzLCBbKGMpID0+IGMucHJpb3JpdHkgPz8gMCwgKGMpID0+IGMudGV4dF0pO1xuICAgICAgICBub2Rlcy5sZW5ndGggPSAwO1xuICAgICAgICBub2Rlcy5wdXNoKC4uLnNvcnRlZCk7XG5cbiAgICAgICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvcnROb2Rlc1JlY3Vyc2l2ZShub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBtZW51IGl0ZW1zIHRvIG5vZGVzIHdpdGggbWV0YWRhdGFcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnZlcnRUb05vZGVzKGl0ZW1zOiBBWFBNZW51SXRlbVtdLCBjdXN0b21pemF0aW9uOiBBWFBNZW51Q3VzdG9taXphdGlvbik6IEFYUE1lbnVJdGVtTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIC8vIE9ubHkgdXNlIGl0ZW1zIHRoYXQgaGF2ZSBhIHByb3BlciBuYW1lIHByb3BlcnR5XG4gICAgICAgICAgICBjb25zdCBpdGVtTmFtZSA9IGl0ZW0ubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlID0gaXRlbU5hbWUgPyBjdXN0b21pemF0aW9uLm92ZXJyaWRlc1tpdGVtTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBpc0N1c3RvbSA9IGl0ZW1OYW1lID8gY3VzdG9taXphdGlvbi5jdXN0b21JdGVtcy5zb21lKChjaSkgPT4gY2kubmFtZSA9PT0gaXRlbU5hbWUpIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGU6IEFYUE1lbnVJdGVtTm9kZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW1OYW1lLFxuICAgICAgICAgICAgICAgIGlzQnVpbHRJbjogIWlzQ3VzdG9tLFxuICAgICAgICAgICAgICAgIGlzQ3VzdG9tLFxuICAgICAgICAgICAgICAgIGlzSGlkZGVuOiBvdmVycmlkZT8uaGlkZGVuIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUHJpb3JpdHk6IGl0ZW0ucHJpb3JpdHksXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxQYXJlbnROYW1lOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgcHJpb3JpdHkgb3ZlcnJpZGUgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IG92ZXJyaWRlPy5wcmlvcml0eSAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUucHJpb3JpdHkgOiBpdGVtLnByaW9yaXR5LFxuICAgICAgICAgICAgICAgIC8vIEFwcGx5IGljb24gb3ZlcnJpZGUgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWNvbjogb3ZlcnJpZGU/LnByb3BlcnRpZXM/Lmljb24gIT09IHVuZGVmaW5lZCA/IG92ZXJyaWRlLnByb3BlcnRpZXMuaWNvbiA6IGl0ZW0uaWNvbixcbiAgICAgICAgICAgICAgICAvLyBBcHBseSB0ZXh0IG92ZXJyaWRlIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgICAgIHRleHQ6IG92ZXJyaWRlPy5wcm9wZXJ0aWVzPy50ZXh0ICE9PSB1bmRlZmluZWQgPyBvdmVycmlkZS5wcm9wZXJ0aWVzLnRleHQgOiBpdGVtLnRleHQsXG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgcGF0aCBvdmVycmlkZSBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgICAgICBwYXRoOiBvdmVycmlkZT8ucHJvcGVydGllcz8ucGF0aCAhPT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUucHJvcGVydGllcy5wYXRoIDogaXRlbS5wYXRoLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBpdGVtLmNoaWxkcmVuID8gdGhpcy5jb252ZXJ0VG9Ob2RlcyhpdGVtLmNoaWxkcmVuLCBjdXN0b21pemF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEb24ndCBzb3J0IGhlcmUgLSBzb3J0aW5nIGlzIGFwcGxpZWQgYXQgdGhlIHRvcCBsZXZlbCBpbiBnZXRNZW51VHJlZVxuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuXG5cbiAgICAvLyNlbmRyZWdpb25cbn1cblxuLy8jZW5kcmVnaW9uXG5cbiJdfQ==","import { CdkDropList, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, signal, ViewEncapsulation } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPPlatformScope } from '@acorex/platform/core';\nimport { AXPLayoutBuilderService } from '@acorex/platform/layout/builder';\nimport { AXPStateMessageComponent, AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';\nimport { AXPPageLayoutBaseComponent, AXPPageLayoutBase, AXPPageLayoutComponent } from '@acorex/platform/layout/views';\nimport { AXMMenuTreeItemComponent } from '../../components/menu-tree-item/menu-tree-item.component';\nimport { AXPMenuManagementService } from '../../menu-management.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@acorex/components/button\";\nimport * as i2 from \"@angular/common\";\nimport * as i3 from \"@acorex/core/translation\";\n//#region ---- Menu List Component ----\nexport class AXMMenuListComponent extends AXPPageLayoutBaseComponent {\n constructor() {\n super(...arguments);\n //#region ---- Dependencies ----\n this.menuManagementService = inject(AXPMenuManagementService);\n this.layoutBuilder = inject(AXPLayoutBuilderService);\n this.dialogService = inject(AXDialogService);\n this.toastService = inject(AXToastService);\n this.translationService = inject(AXTranslationService);\n this.route = inject(ActivatedRoute);\n //#endregion\n //#region ---- Component State ----\n this.menuItems = signal([], ...(ngDevMode ? [{ debugName: \"menuItems\" }] : []));\n this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: \"isLoading\" }] : []));\n this.error = signal('', ...(ngDevMode ? [{ debugName: \"error\" }] : []));\n this.currentScope = signal(AXPPlatformScope.User, ...(ngDevMode ? [{ debugName: \"currentScope\" }] : []));\n this.allDropListIds = signal([], ...(ngDevMode ? [{ debugName: \"allDropListIds\" }] : []));\n }\n //#endregion\n //#region ---- Lifecycle ----\n async ngOnInit() {\n await super.ngOnInit();\n // Get scope from route\n this.route.params.subscribe(async (params) => {\n const scope = params['scope'];\n if (scope) {\n this.currentScope.set(scope);\n await this.loadMenuItems();\n this.recompute(); // Update page header after loading\n }\n });\n }\n //#endregion\n //#region ---- Data Loading ----\n /**\n * Load menu items for current scope\n */\n async loadMenuItems() {\n try {\n this.isLoading.set(true);\n this.error.set('');\n const items = await this.menuManagementService.getMenuTree(this.currentScope());\n this.menuItems.set(items);\n // Collect all drop list IDs for connecting them\n const dropListIds = this.collectDropListIds(items);\n this.allDropListIds.set(dropListIds);\n this.recompute();\n }\n catch (error) {\n this.error.set(error instanceof Error ? error.message : 'Failed to load menu items');\n this.toastService.danger('@application-management:menu-management.messages.load-error');\n }\n finally {\n this.isLoading.set(false);\n }\n }\n /**\n * Recursively collect all drop list IDs from menu tree\n * Includes drop zones for all items, even those without children\n */\n collectDropListIds(items, ids = []) {\n // Add root only once at the start\n if (ids.length === 0) {\n ids.push('menu-root');\n }\n items.forEach((item) => {\n // Add drop list ID for every item (they all can have children dropped into them)\n const dropListId = `menu-${item.name || item.path || 'unnamed'}`;\n if (!ids.includes(dropListId)) {\n ids.push(dropListId);\n }\n // Recursively collect from children if they exist\n if (item.children && item.children.length > 0) {\n this.collectDropListIds(item.children, ids);\n }\n });\n return ids;\n }\n //#endregion\n //#region ---- Page Layout Interface ----\n /**\n * Get page title\n */\n async getPageTitle() {\n const scopeName = this.currentScope();\n const scopeKey = scopeName === AXPPlatformScope.User ? 'user' : 'tenant';\n return this.translationService.translateAsync(`@application-management:menu-management.${scopeKey}.title`);\n }\n /**\n * Get page description\n */\n async getPageDescription() {\n return this.translationService.translateAsync('@application-management:menu-management.description');\n }\n /**\n * Get primary menu items (actions)\n */\n async getPrimaryMenuItems() {\n return [\n {\n title: await this.translationService.translateAsync('@application-management:menu-management.actions.add-root'),\n icon: 'fa-light fa-plus',\n color: 'primary',\n command: { name: 'add-root' },\n },\n ];\n }\n /**\n * Get secondary menu items\n */\n async getSecondaryMenuItems() {\n return [\n {\n title: await this.translationService.translateAsync('@application-management:menu-management.actions.reset'),\n icon: 'fa-light fa-rotate-left',\n color: 'danger',\n command: { name: 'reset' },\n },\n ];\n }\n /**\n * Execute commands from page actions\n */\n async execute(command) {\n switch (command.name) {\n case 'add-root':\n await this.addRootMenuItem();\n break;\n case 'reset':\n await this.resetCustomizations();\n break;\n }\n }\n //#endregion\n //#region ---- Event Handlers ----\n /**\n * Handle menu item action\n */\n async onActionTriggered(event) {\n const { action, item } = event;\n switch (action) {\n case 'show':\n await this.showMenuItem(item);\n break;\n case 'hide':\n await this.hideMenuItem(item);\n break;\n case 'edit':\n await this.editMenuItem(item);\n break;\n case 'delete':\n await this.deleteMenuItem(item);\n break;\n case 'add-child':\n await this.addChildMenuItem(item);\n break;\n case 'move-up':\n await this.moveItemUp(item);\n break;\n case 'move-down':\n await this.moveItemDown(item);\n break;\n case 'move-to-parent':\n await this.moveItemToParent(item);\n break;\n }\n }\n /**\n * Handle drag and drop\n */\n async onItemDropped(event) {\n try {\n // IMPORTANT: Find parent containers BEFORE modifying arrays\n const targetParent = this.findParentOfContainer(event.container.data, this.menuItems());\n const targetParentName = targetParent?.name ?? null;\n const sourceParent = this.findParentOfContainer(event.previousContainer.data, this.menuItems());\n const sourceParentName = sourceParent?.name ?? null;\n // Now perform the array operations\n if (event.previousContainer === event.container) {\n // Same container - just reorder\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\n }\n else {\n // Different container - move between parents\n transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);\n }\n // Update signal to reflect the new order immediately\n this.menuItems.set([...this.menuItems()]);\n // Save the target container with correct parent context\n await this.menuManagementService.reorderMenuItems(this.currentScope(), event.container.data, targetParentName);\n // If moved between containers, also update the source container\n if (event.previousContainer !== event.container) {\n // Only reorder source if it still has items\n if (event.previousContainer.data.length > 0) {\n await this.menuManagementService.reorderMenuItems(this.currentScope(), event.previousContainer.data, sourceParentName);\n }\n }\n this.toastService.success('@application-management:menu-management.messages.reorder-success');\n // Force change detection by updating the signal\n // This ensures the UI reflects the changes without reloading from service\n this.menuItems.set([...this.menuItems()]);\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.reorder-error');\n // Reload on error to revert changes\n await this.loadMenuItems();\n }\n }\n /**\n * Find the parent item that owns a given children array\n * Returns the parent node, or null if the container is at root level\n */\n findParentOfContainer(containerData, items) {\n // Check if this is the root level\n if (containerData === items) {\n return null; // Root level has no parent\n }\n // Recursively search for the parent\n for (const item of items) {\n // Check if this item's children array is the target container\n if (item.children === containerData) {\n return item;\n }\n // Recursively search in children\n if (item.children && item.children.length > 0) {\n const found = this.findParentOfContainer(containerData, item.children);\n if (found !== null) {\n return found;\n }\n }\n }\n // Not found - this shouldn't happen in normal operation\n return null;\n }\n /**\n * Find an item in the tree and return its parent, container, and index\n */\n findItemAndParent(targetItem, items, parent = null) {\n // Search in current level\n const index = items.findIndex(item => item === targetItem);\n if (index !== -1) {\n return { parent, container: items, index };\n }\n // Search in children\n for (const item of items) {\n if (item.children && item.children.length > 0) {\n const found = this.findItemAndParent(targetItem, item.children, item);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n /**\n * Add new root menu item\n */\n async addRootMenuItem() {\n await this.showMenuItemDialog(null);\n }\n /**\n * Reset customizations\n */\n async resetCustomizations() {\n const confirmed = await this.dialogService.confirm('@application-management:menu-management.reset.title', '@application-management:menu-management.reset.message');\n if (!confirmed)\n return;\n try {\n await this.menuManagementService.resetCustomizations(this.currentScope());\n this.toastService.success('@application-management:menu-management.messages.reset-success');\n await this.loadMenuItems();\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.reset-error');\n }\n }\n //#endregion\n //#region ---- Menu Item Actions ----\n /**\n * Show menu item\n */\n async showMenuItem(item) {\n try {\n if (!item.name)\n return;\n await this.menuManagementService.showMenuItem(this.currentScope(), item.name);\n this.toastService.success('@application-management:menu-management.messages.show-success');\n await this.loadMenuItems();\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.show-error');\n }\n }\n /**\n * Hide menu item\n */\n async hideMenuItem(item) {\n try {\n if (!item.name)\n return;\n await this.menuManagementService.hideMenuItem(this.currentScope(), item.name);\n this.toastService.success('@application-management:menu-management.messages.hide-success');\n await this.loadMenuItems();\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.hide-error');\n }\n }\n /**\n * Edit menu item\n */\n async editMenuItem(item) {\n await this.showMenuItemDialog(item);\n }\n /**\n * Delete custom menu item\n */\n async deleteMenuItem(item) {\n const confirmed = await this.dialogService.confirm('@general:actions.delete.title', '@application-management:menu-management.delete.message');\n if (!confirmed)\n return;\n try {\n if (!item.name)\n return;\n await this.menuManagementService.deleteCustomMenuItem(this.currentScope(), item.name);\n this.toastService.success('@application-management:menu-management.messages.delete-success');\n await this.loadMenuItems();\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.delete-error');\n }\n }\n /**\n * Add child menu item\n */\n async addChildMenuItem(parent) {\n await this.showMenuItemDialog(null, parent);\n }\n /**\n * Move item up in its parent container\n */\n async moveItemUp(item) {\n try {\n const result = this.findItemAndParent(item, this.menuItems());\n if (!result)\n return;\n const { parent, container, index } = result;\n if (index <= 0)\n return; // Already at top\n // Swap with previous item\n moveItemInArray(container, index, index - 1);\n // Update signal to reflect the change\n this.menuItems.set([...this.menuItems()]);\n // Save the reordered container\n const parentName = parent?.name ?? null;\n await this.menuManagementService.reorderMenuItems(this.currentScope(), container, parentName);\n this.toastService.success('@application-management:menu-management.messages.reorder-success');\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.reorder-error');\n await this.loadMenuItems();\n }\n }\n /**\n * Move item down in its parent container\n */\n async moveItemDown(item) {\n try {\n const result = this.findItemAndParent(item, this.menuItems());\n if (!result)\n return;\n const { parent, container, index } = result;\n if (index >= container.length - 1)\n return; // Already at bottom\n // Swap with next item\n moveItemInArray(container, index, index + 1);\n // Update signal to reflect the change\n this.menuItems.set([...this.menuItems()]);\n // Save the reordered container\n const parentName = parent?.name ?? null;\n await this.menuManagementService.reorderMenuItems(this.currentScope(), container, parentName);\n this.toastService.success('@application-management:menu-management.messages.reorder-success');\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.reorder-error');\n await this.loadMenuItems();\n }\n }\n /**\n * Move item to its parent's level (move out of nested level)\n */\n async moveItemToParent(item) {\n try {\n const result = this.findItemAndParent(item, this.menuItems());\n if (!result || !result.parent)\n return; // No parent to move to\n const { parent, container, index } = result;\n // Find the grandparent container\n const grandParentResult = this.findItemAndParent(parent, this.menuItems());\n const targetContainer = grandParentResult ? grandParentResult.container : this.menuItems();\n const parentIndexInGrandparent = grandParentResult ? grandParentResult.index : this.menuItems().indexOf(parent);\n // Remove from current container\n const [movedItem] = container.splice(index, 1);\n // Insert after parent in grandparent container\n targetContainer.splice(parentIndexInGrandparent + 1, 0, movedItem);\n // Update signal to reflect the change\n this.menuItems.set([...this.menuItems()]);\n // Save both containers\n const parentName = parent?.name ?? null;\n await this.menuManagementService.reorderMenuItems(this.currentScope(), container, parentName);\n const grandParentName = grandParentResult?.parent?.name ?? null;\n await this.menuManagementService.reorderMenuItems(this.currentScope(), targetContainer, grandParentName);\n this.toastService.success('@application-management:menu-management.messages.reorder-success');\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.reorder-error');\n await this.loadMenuItems();\n }\n }\n //#endregion\n //#region ---- Dialog Helpers ----\n /**\n * Show menu item dialog (add/edit)\n */\n async showMenuItemDialog(item, parent) {\n const isEdit = !!item;\n const title = isEdit\n ? '@application-management:menu-management.edit-dialog.title'\n : '@application-management:menu-management.add-dialog.title';\n const context = {\n name: item?.name || '',\n text: item?.text || '',\n icon: item?.icon || '',\n path: item?.path || '',\n description: item?.description || '',\n };\n const dialogRef = await this.layoutBuilder\n .create()\n .dialog((dialog) => {\n dialog\n .setTitle(title)\n .setContext(context)\n .content((flex) => {\n flex\n .setDirection('column')\n .formField('@application-management:menu-management.fields.name', (field) => {\n field.path('name');\n field.textBox({\n placeholder: '@application-management:menu-management.fields.name',\n validations: [{ rule: 'required' }],\n disabled: isEdit && item?.isBuiltIn,\n });\n })\n .formField('@application-management:menu-management.fields.text', (field) => {\n field.path('text');\n field.textBox({\n placeholder: '@application-management:menu-management.fields.text',\n validations: [{ rule: 'required' }],\n });\n })\n .formField('@application-management:menu-management.fields.icon', (field) => {\n field.path('icon');\n field.customWidget('icon-chooser', {});\n })\n .formField('@application-management:menu-management.fields.path', (field) => {\n field.path('path');\n field.textBox({\n placeholder: '@application-management:menu-management.fields.path',\n disabled: isEdit && item?.isBuiltIn,\n });\n })\n .formField('@application-management:menu-management.fields.description', (field) => {\n field.path('description');\n field.largeTextBox({\n placeholder: '@application-management:menu-management.fields.description',\n rows: 3,\n });\n });\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title').submit('@general:actions.save.title');\n });\n })\n .show();\n const action = dialogRef.action();\n if (action === 'cancel') {\n dialogRef.close();\n return;\n }\n const formData = dialogRef.context();\n try {\n if (isEdit && item?.name) {\n // Update existing item\n if (item.isCustom) {\n await this.menuManagementService.updateCustomMenuItem(this.currentScope(), item.name, formData);\n }\n else {\n await this.menuManagementService.updateMenuProperties(this.currentScope(), item.name, formData);\n }\n }\n else {\n // Add new custom item\n const newItem = {\n name: formData.name,\n text: formData.text,\n icon: formData.icon,\n path: formData.path,\n priority: formData.priority,\n description: formData.description,\n };\n // If parent is specified, add as child\n if (parent?.name) {\n // Add custom item as child of parent\n await this.menuManagementService.addCustomMenuItemAsChild(this.currentScope(), newItem, parent.name);\n }\n else {\n // Add as root level item\n await this.menuManagementService.addCustomMenuItem(this.currentScope(), newItem);\n }\n }\n this.toastService.success('@application-management:menu-management.messages.save-success');\n await this.loadMenuItems();\n dialogRef.close();\n }\n catch (error) {\n this.toastService.danger('@application-management:menu-management.messages.save-error');\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXMMenuListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.3.4\", type: AXMMenuListComponent, isStandalone: true, selector: \"axm-menu-list\", host: { classAttribute: \"axm-menu-list-page\" }, providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMMenuListComponent,\n },\n ], usesInheritance: true, ngImport: i0, template: \"<axp-page-layout>\\n <axp-page-content>\\n @if (isLoading()) {\\n <!-- Loading State -->\\n <axp-state-message\\n mode=\\\"loading\\\"\\n icon=\\\"fa-light fa-spinner-third fa-spin\\\"\\n [title]=\\\"('@application-management:menu-management.loading.title' | translate | async) || 'Loading...'\\\"\\n [description]=\\\"\\n ('@application-management:menu-management.loading.description' | translate | async) || 'Please wait'\\n \\\"\\n />\\n } @else if (error()) {\\n <!-- Error State -->\\n <axp-state-message\\n mode=\\\"error\\\"\\n icon=\\\"fa-light fa-circle-exclamation\\\"\\n [title]=\\\"('@application-management:menu-management.error.title' | translate | async) || 'Error'\\\"\\n [description]=\\\"error() || 'An error occurred'\\\"\\n >\\n <ax-button\\n slot=\\\"actions\\\"\\n [text]=\\\"'@general:actions.retry.title' | translate | async\\\"\\n [look]=\\\"'outline'\\\"\\n [color]=\\\"'primary'\\\"\\n (onClick)=\\\"loadMenuItems()\\\"\\n >\\n <i class=\\\"fa-light fa-rotate-left\\\"></i>\\n </ax-button>\\n </axp-state-message>\\n } @else if (menuItems().length === 0) {\\n <!-- Empty State -->\\n <axp-state-message\\n mode=\\\"empty\\\"\\n icon=\\\"fa-light fa-bars\\\"\\n [title]=\\\"('@application-management:menu-management.empty-state.title' | translate | async) || 'No menu items'\\\"\\n [description]=\\\"\\n ('@application-management:menu-management.empty-state.description' | translate | async) ||\\n 'Add a new menu item to get started'\\n \\\"\\n >\\n <ax-button\\n slot=\\\"actions\\\"\\n [text]=\\\"'@application-management:menu-management.actions.add-root' | translate | async\\\"\\n [look]=\\\"'solid'\\\"\\n [color]=\\\"'primary'\\\"\\n (onClick)=\\\"addRootMenuItem()\\\"\\n >\\n <i class=\\\"fa-light fa-plus\\\"></i>\\n </ax-button>\\n </axp-state-message>\\n } @else {\\n <!-- Menu Tree Content -->\\n <div class=\\\"axm-menu-list__container\\\">\\n <!-- Menu Tree -->\\n <div\\n class=\\\"axm-menu-list__tree\\\"\\n cdkDropList\\n id=\\\"menu-root\\\"\\n [cdkDropListData]=\\\"menuItems()\\\"\\n [cdkDropListConnectedTo]=\\\"allDropListIds()\\\"\\n (cdkDropListDropped)=\\\"onItemDropped($event)\\\"\\n >\\n @for (item of menuItems(); track item.name || item.path || $index; let i = $index) {\\n <axm-menu-tree-item\\n [item]=\\\"item\\\"\\n [level]=\\\"0\\\"\\n [canDelete]=\\\"true\\\"\\n [connectedDropLists]=\\\"allDropListIds()\\\"\\n [canMoveUp]=\\\"i > 0\\\"\\n [canMoveDown]=\\\"i < menuItems().length - 1\\\"\\n [canMoveToParent]=\\\"false\\\"\\n (actionTriggered)=\\\"onActionTriggered($event)\\\"\\n (itemDropped)=\\\"onItemDropped($event)\\\"\\n />\\n }\\n </div>\\n </div>\\n }\\n </axp-page-content>\\n</axp-page-layout>\\n\", styles: [\".axm-menu-list-page .axm-menu-list__container{display:flex;flex-direction:column;gap:1rem;padding:1.5rem}.axm-menu-list-page .axm-menu-list__info-banner{display:flex;align-items:center;gap:.75rem;border-radius:.375rem;padding:1rem;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-primary-500),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.axm-menu-list-page .axm-menu-list__info-banner i{font-size:1.125rem;line-height:1.75rem}.axm-menu-list-page .axm-menu-list__info-banner span{font-size:.875rem;line-height:1.25rem}.axm-menu-list-page .axm-menu-list__tree{display:flex;flex-direction:column;gap:.5rem}\\n\"], dependencies: [{ kind: \"ngmodule\", type: CommonModule }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\", \"cdkDropListHasAnchor\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"ngmodule\", type: AXButtonModule }, { kind: \"component\", type: i1.AXButtonComponent, selector: \"ax-button\", inputs: [\"disabled\", \"size\", \"tabIndex\", \"color\", \"look\", \"text\", \"toggleable\", \"selected\", \"iconOnly\", \"type\", \"loadingText\"], outputs: [\"onBlur\", \"onFocus\", \"onClick\", \"selectedChange\", \"toggleableChange\", \"lookChange\", \"colorChange\", \"disabledChange\", \"loadingTextChange\"] }, { kind: \"ngmodule\", type: AXTranslationModule }, { kind: \"component\", type: AXPPageLayoutComponent, selector: \"axp-page-layout\" }, { kind: \"component\", type: AXPThemeLayoutBlockComponent, selector: \" axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, \" }, { kind: \"component\", type: AXPStateMessageComponent, selector: \"axp-state-message\", inputs: [\"mode\", \"icon\", \"title\", \"description\", \"variant\"] }, { kind: \"component\", type: AXMMenuTreeItemComponent, selector: \"axm-menu-tree-item\", inputs: [\"item\", \"level\", \"canDelete\", \"connectedDropLists\", \"canMoveUp\", \"canMoveDown\", \"canMoveToParent\"], outputs: [\"actionTriggered\", \"itemDropped\"] }, { kind: \"pipe\", type: i2.AsyncPipe, name: \"async\" }, { kind: \"pipe\", type: i3.AXTranslatorPipe, name: \"translate\" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.4\", ngImport: i0, type: AXMMenuListComponent, decorators: [{\n type: Component,\n args: [{ selector: 'axm-menu-list', standalone: true, imports: [\n CommonModule,\n CdkDropList,\n AXButtonModule,\n AXTranslationModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPStateMessageComponent,\n AXMMenuTreeItemComponent,\n ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMMenuListComponent,\n },\n ], host: { class: 'axm-menu-list-page' }, template: \"<axp-page-layout>\\n <axp-page-content>\\n @if (isLoading()) {\\n <!-- Loading State -->\\n <axp-state-message\\n mode=\\\"loading\\\"\\n icon=\\\"fa-light fa-spinner-third fa-spin\\\"\\n [title]=\\\"('@application-management:menu-management.loading.title' | translate | async) || 'Loading...'\\\"\\n [description]=\\\"\\n ('@application-management:menu-management.loading.description' | translate | async) || 'Please wait'\\n \\\"\\n />\\n } @else if (error()) {\\n <!-- Error State -->\\n <axp-state-message\\n mode=\\\"error\\\"\\n icon=\\\"fa-light fa-circle-exclamation\\\"\\n [title]=\\\"('@application-management:menu-management.error.title' | translate | async) || 'Error'\\\"\\n [description]=\\\"error() || 'An error occurred'\\\"\\n >\\n <ax-button\\n slot=\\\"actions\\\"\\n [text]=\\\"'@general:actions.retry.title' | translate | async\\\"\\n [look]=\\\"'outline'\\\"\\n [color]=\\\"'primary'\\\"\\n (onClick)=\\\"loadMenuItems()\\\"\\n >\\n <i class=\\\"fa-light fa-rotate-left\\\"></i>\\n </ax-button>\\n </axp-state-message>\\n } @else if (menuItems().length === 0) {\\n <!-- Empty State -->\\n <axp-state-message\\n mode=\\\"empty\\\"\\n icon=\\\"fa-light fa-bars\\\"\\n [title]=\\\"('@application-management:menu-management.empty-state.title' | translate | async) || 'No menu items'\\\"\\n [description]=\\\"\\n ('@application-management:menu-management.empty-state.description' | translate | async) ||\\n 'Add a new menu item to get started'\\n \\\"\\n >\\n <ax-button\\n slot=\\\"actions\\\"\\n [text]=\\\"'@application-management:menu-management.actions.add-root' | translate | async\\\"\\n [look]=\\\"'solid'\\\"\\n [color]=\\\"'primary'\\\"\\n (onClick)=\\\"addRootMenuItem()\\\"\\n >\\n <i class=\\\"fa-light fa-plus\\\"></i>\\n </ax-button>\\n </axp-state-message>\\n } @else {\\n <!-- Menu Tree Content -->\\n <div class=\\\"axm-menu-list__container\\\">\\n <!-- Menu Tree -->\\n <div\\n class=\\\"axm-menu-list__tree\\\"\\n cdkDropList\\n id=\\\"menu-root\\\"\\n [cdkDropListData]=\\\"menuItems()\\\"\\n [cdkDropListConnectedTo]=\\\"allDropListIds()\\\"\\n (cdkDropListDropped)=\\\"onItemDropped($event)\\\"\\n >\\n @for (item of menuItems(); track item.name || item.path || $index; let i = $index) {\\n <axm-menu-tree-item\\n [item]=\\\"item\\\"\\n [level]=\\\"0\\\"\\n [canDelete]=\\\"true\\\"\\n [connectedDropLists]=\\\"allDropListIds()\\\"\\n [canMoveUp]=\\\"i > 0\\\"\\n [canMoveDown]=\\\"i < menuItems().length - 1\\\"\\n [canMoveToParent]=\\\"false\\\"\\n (actionTriggered)=\\\"onActionTriggered($event)\\\"\\n (itemDropped)=\\\"onItemDropped($event)\\\"\\n />\\n }\\n </div>\\n </div>\\n }\\n </axp-page-content>\\n</axp-page-layout>\\n\", styles: [\".axm-menu-list-page .axm-menu-list__container{display:flex;flex-direction:column;gap:1rem;padding:1.5rem}.axm-menu-list-page .axm-menu-list__info-banner{display:flex;align-items:center;gap:.75rem;border-radius:.375rem;padding:1rem;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-primary-500),var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.axm-menu-list-page .axm-menu-list__info-banner i{font-size:1.125rem;line-height:1.75rem}.axm-menu-list-page .axm-menu-list__info-banner span{font-size:.875rem;line-height:1.25rem}.axm-menu-list-page .axm-menu-list__tree{display:flex;flex-direction:column;gap:.5rem}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbW9kdWxlcy9hcHBsaWNhdGlvbi1tYW5hZ2VtZW50L3NyYy9saWIvZmVhdHVyZXMvbWVudS1tYW5hZ2VtZW50L3BhZ2VzL21lbnUtbGlzdC9tZW51LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9tb2R1bGVzL2FwcGxpY2F0aW9uLW1hbmFnZW1lbnQvc3JjL2xpYi9mZWF0dXJlcy9tZW51LW1hbmFnZW1lbnQvcGFnZXMvbWVudS1saXN0L21lbnUtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsV0FBVyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBd0MsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUd0SCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7QUFFekUsMkNBQTJDO0FBMkIzQyxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsMEJBQTBCO0lBekJwRTs7UUEyQkksb0NBQW9DO1FBRTVCLDBCQUFxQixHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3pELGtCQUFhLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDOUMsa0JBQWEsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0IsaUJBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsVUFBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV2QyxZQUFZO1FBRVosdUNBQXVDO1FBRTdCLGNBQVMsR0FBRyxNQUFNLENBQW9CLEVBQUUscURBQUMsQ0FBQztRQUMxQyxjQUFTLEdBQUcsTUFBTSxDQUFVLEtBQUsscURBQUMsQ0FBQztRQUNuQyxVQUFLLEdBQUcsTUFBTSxDQUFTLEVBQUUsaURBQUMsQ0FBQztRQUMzQixpQkFBWSxHQUFHLE1BQU0sQ0FBbUIsZ0JBQWdCLENBQUMsSUFBSSx3REFBQyxDQUFDO1FBQy9ELG1CQUFjLEdBQUcsTUFBTSxDQUFXLEVBQUUsMERBQUMsQ0FBQztLQTRtQm5EO0lBMW1CRyxZQUFZO0lBRVosaUNBQWlDO0lBRXhCLEtBQUssQ0FBQyxRQUFRO1FBQ25CLE1BQU0sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZCLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQXFCLENBQUM7WUFDbEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztZQUN6RCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsWUFBWTtJQUVaLG9DQUFvQztJQUVwQzs7T0FFRztJQUNPLEtBQUssQ0FBQyxhQUFhO1FBQ3pCLElBQUksQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRW5CLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUVoRixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUxQixnREFBZ0Q7WUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXJDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUM1RixDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQixDQUFDLEtBQXdCLEVBQUUsTUFBZ0IsRUFBRTtRQUNuRSxrQ0FBa0M7UUFDbEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQixpRkFBaUY7WUFDakYsTUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBRUQsa0RBQWtEO1lBQ2xELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsWUFBWTtJQUVaLDZDQUE2QztJQUU3Qzs7T0FFRztJQUNNLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxTQUFTLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsMkNBQTJDLFFBQVEsUUFBUSxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUVEOztPQUVHO0lBQ00sS0FBSyxDQUFDLGtCQUFrQjtRQUM3QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMsbUJBQW1CO1FBQzlCLE9BQU87WUFDSDtnQkFDSSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLDBEQUEwRCxDQUFDO2dCQUMvRyxJQUFJLEVBQUUsa0JBQWtCO2dCQUN4QixLQUFLLEVBQUUsU0FBUztnQkFDaEIsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTthQUNoQztTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE9BQU87WUFDSDtnQkFDSSxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLHVEQUF1RCxDQUFDO2dCQUM1RyxJQUFJLEVBQUUseUJBQXlCO2dCQUMvQixLQUFLLEVBQUUsUUFBUTtnQkFDZixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO2FBQzdCO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBMEI7UUFDN0MsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsS0FBSyxVQUFVO2dCQUNYLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxPQUFPO2dCQUNSLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ2pDLE1BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7SUFFWixzQ0FBc0M7SUFFdEM7O09BRUc7SUFDTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBMkQ7UUFDekYsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFL0IsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNiLEtBQUssTUFBTTtnQkFDUCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLE1BQU07WUFDVixLQUFLLE1BQU07Z0JBQ1AsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QixNQUFNO1lBQ1YsS0FBSyxNQUFNO2dCQUNQLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsTUFBTTtZQUNWLEtBQUssUUFBUTtnQkFDVCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLE1BQU07WUFDVixLQUFLLFdBQVc7Z0JBQ1osTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xDLE1BQU07WUFDVixLQUFLLFNBQVM7Z0JBQ1YsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1YsS0FBSyxXQUFXO2dCQUNaLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsTUFBTTtZQUNWLEtBQUssZ0JBQWdCO2dCQUNqQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtRQUNkLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQXFDO1FBQy9ELElBQUksQ0FBQztZQUNELDREQUE0RDtZQUM1RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDeEYsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQztZQUVwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNoRyxNQUFNLGdCQUFnQixHQUFHLFlBQVksRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1lBRXBELG1DQUFtQztZQUNuQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzlDLGdDQUFnQztnQkFDaEMsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDSiw2Q0FBNkM7Z0JBQzdDLGlCQUFpQixDQUNiLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQzVCLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUNwQixLQUFLLENBQUMsYUFBYSxFQUNuQixLQUFLLENBQUMsWUFBWSxDQUNyQixDQUFDO1lBQ04sQ0FBQztZQUVELHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUxQyx3REFBd0Q7WUFDeEQsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQzdDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFDbkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQ3BCLGdCQUFnQixDQUNuQixDQUFDO1lBRUYsZ0VBQWdFO1lBQ2hFLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDOUMsNENBQTRDO2dCQUM1QyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMxQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FDN0MsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUNuQixLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUM1QixnQkFBZ0IsQ0FDbkIsQ0FBQztnQkFDTixDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7WUFFOUYsZ0RBQWdEO1lBQ2hELDBFQUEwRTtZQUMxRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGdFQUFnRSxDQUFDLENBQUM7WUFDM0Ysb0NBQW9DO1lBQ3BDLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCLENBQ3pCLGFBQWdDLEVBQ2hDLEtBQXdCO1FBRXhCLGtDQUFrQztRQUNsQyxJQUFJLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtRQUM1QyxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdkIsOERBQThEO1lBQzlELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUVELGlDQUFpQztZQUNqQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDakIsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUIsQ0FDckIsVUFBMkIsRUFDM0IsS0FBd0IsRUFDeEIsU0FBaUMsSUFBSTtRQUVyQywwQkFBMEI7UUFDMUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFFRCxxQkFBcUI7UUFDckIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDUixPQUFPLEtBQUssQ0FBQztnQkFDakIsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLGVBQWU7UUFDM0IsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLG1CQUFtQjtRQUMvQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUM5QyxxREFBcUQsRUFDckQsdURBQXVELENBQzFELENBQUM7UUFFRixJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFdkIsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztZQUM1RixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO0lBRVoseUNBQXlDO0lBRXpDOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFxQjtRQUM1QyxJQUFJLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUV2QixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFxQjtRQUM1QyxJQUFJLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUV2QixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFxQjtRQUM1QyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQXFCO1FBQzlDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQzlDLCtCQUErQixFQUMvQix3REFBd0QsQ0FDM0QsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUV2QixJQUFJLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUV2QixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7WUFDN0YsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1FBQzlGLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBdUI7UUFDbEQsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBcUI7UUFDMUMsSUFBSSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPO1lBRXBCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUU1QyxJQUFJLEtBQUssSUFBSSxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxpQkFBaUI7WUFFekMsMEJBQTBCO1lBQzFCLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU3QyxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFMUMsK0JBQStCO1lBQy9CLE1BQU0sVUFBVSxHQUFHLE1BQU0sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUM3QyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ25CLFNBQVMsRUFDVCxVQUFVLENBQ2IsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQXFCO1FBQzVDLElBQUksQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUVwQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7WUFFNUMsSUFBSSxLQUFLLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxvQkFBb0I7WUFFL0Qsc0JBQXNCO1lBQ3RCLGVBQWUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU3QyxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFMUMsK0JBQStCO1lBQy9CLE1BQU0sVUFBVSxHQUFHLE1BQU0sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUM3QyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ25CLFNBQVMsRUFDVCxVQUFVLENBQ2IsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBcUI7UUFDaEQsSUFBSSxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxDQUFDLHVCQUF1QjtZQUU5RCxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLENBQUM7WUFFNUMsaUNBQWlDO1lBQ2pDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUMzRSxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0YsTUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRWhILGdDQUFnQztZQUNoQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFL0MsK0NBQStDO1lBQy9DLGVBQWUsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVuRSxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFMUMsdUJBQXVCO1lBQ3ZCLE1BQU0sVUFBVSxHQUFHLE1BQU0sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUM3QyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ25CLFNBQVMsRUFDVCxVQUFVLENBQ2IsQ0FBQztZQUVGLE1BQU0sZUFBZSxHQUFHLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUM3QyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQ25CLGVBQWUsRUFDZixlQUFlLENBQ2xCLENBQUM7WUFFRixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztZQUMzRixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7SUFFWixzQ0FBc0M7SUFFdEM7O09BRUc7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBNEIsRUFBRSxNQUF3QjtRQUNuRixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLE1BQU07WUFDaEIsQ0FBQyxDQUFDLDJEQUEyRDtZQUM3RCxDQUFDLENBQUMsMERBQTBELENBQUM7UUFFakUsTUFBTSxPQUFPLEdBQUc7WUFDWixJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDdEIsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtZQUN0QixJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3RCLFdBQVcsRUFBRSxJQUFJLEVBQUUsV0FBVyxJQUFJLEVBQUU7U0FDdkMsQ0FBQztRQUVGLE1BQU0sU0FBUyxHQUFRLE1BQU0sSUFBSSxDQUFDLGFBQWE7YUFDMUMsTUFBTSxFQUFFO2FBQ1IsTUFBTSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDcEIsTUFBTTtpQkFDRCxRQUFRLENBQUMsS0FBSyxDQUFDO2lCQUNmLFVBQVUsQ0FBQyxPQUFPLENBQUM7aUJBQ25CLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNuQixJQUFJO3FCQUNDLFlBQVksQ0FBQyxRQUFRLENBQUM7cUJBQ3RCLFNBQVMsQ0FBQyxxREFBcUQsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUM3RSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDO3dCQUNWLFdBQVcsRUFBRSxxREFBcUQ7d0JBQ2xFLFdBQVcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO3dCQUNuQyxRQUFRLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxTQUFTO3FCQUN0QyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDO3FCQUNELFNBQVMsQ0FBQyxxREFBcUQsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUM3RSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDO3dCQUNWLFdBQVcsRUFBRSxxREFBcUQ7d0JBQ2xFLFdBQVcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO3FCQUN0QyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDO3FCQUNELFNBQVMsQ0FBQyxxREFBcUQsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUM3RSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNuQixLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDM0MsQ0FBQyxDQUFDO3FCQUNELFNBQVMsQ0FBQyxxREFBcUQsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO29CQUM3RSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDO3dCQUNWLFdBQVcsRUFBRSxxREFBcUQ7d0JBQ2xFLFFBQVEsRUFBRSxNQUFNLElBQUksSUFBSSxFQUFFLFNBQVM7cUJBQ3RDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUM7cUJBQ0QsU0FBUyxDQUFDLDREQUE0RCxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ3BGLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQzFCLEtBQUssQ0FBQyxZQUFZLENBQUM7d0JBQ2YsV0FBVyxFQUFFLDREQUE0RDt3QkFDekUsSUFBSSxFQUFFLENBQUM7cUJBQ1YsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDO2lCQUNELFVBQVUsQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO2dCQUN6QixPQUFPLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDMUYsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUM7YUFDRCxJQUFJLEVBQUUsQ0FBQztRQUVaLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN0QixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUEwQixDQUFDO1FBRTdELElBQUksQ0FBQztZQUNELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsdUJBQXVCO2dCQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBdUIsQ0FBQyxDQUFDO2dCQUNuSCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3BHLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osc0JBQXNCO2dCQUN0QixNQUFNLE9BQU8sR0FBZ0I7b0JBQ3pCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSztvQkFDcEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFLO29CQUNwQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7b0JBQ25CLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtvQkFDbkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO29CQUMzQixXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVc7aUJBQ3BDLENBQUM7Z0JBRUYsdUNBQXVDO2dCQUN2QyxJQUFJLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDZixxQ0FBcUM7b0JBQ3JDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6RyxDQUFDO3FCQUFNLENBQUM7b0JBQ0oseUJBQXlCO29CQUN6QixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JGLENBQUM7WUFDTCxDQUFDO1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUMzRixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBQzVGLENBQUM7SUFDTCxDQUFDOzhHQTVuQlEsb0JBQW9CO2tHQUFwQixvQkFBb0IsNEdBUmxCO1lBQ1A7Z0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLG9CQUFvQjthQUNwQztTQUNKLGlEQzFDTCw4OUZBaUZBLHN0QkR6RFEsWUFBWSwrQkFDWixXQUFXLHFoQkFDWCxjQUFjLDZYQUNkLG1CQUFtQiwrQkFDbkIsc0JBQXNCLDREQUN0Qiw0QkFBNEIsZ2lCQUM1Qix3QkFBd0IsMkhBQ3hCLHdCQUF3Qjs7MkZBY25CLG9CQUFvQjtrQkF6QmhDLFNBQVM7K0JBQ0ksZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLHNCQUFzQjt3QkFDdEIsNEJBQTRCO3dCQUM1Qix3QkFBd0I7d0JBQ3hCLHdCQUF3QjtxQkFDM0IsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksYUFDMUI7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxzQkFBc0I7eUJBQ3BDO3FCQUNKLFFBQ0ssRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRHJvcCwgQ2RrRHJvcExpc3QsIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCwgc2lnbmFsLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQVhCdXR0b25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7IEFYRGlhbG9nU2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kaWFsb2cnO1xuaW1wb3J0IHsgQVhUb2FzdFNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvdG9hc3QnO1xuaW1wb3J0IHsgQVhUcmFuc2xhdGlvbk1vZHVsZSwgQVhUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvcmUvdHJhbnNsYXRpb24nO1xuaW1wb3J0IHsgQVhQTWVudUl0ZW0gfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvbW1vbic7XG5pbXBvcnQgeyBBWFBQbGF0Zm9ybVNjb3BlLCBBWFBBY3Rpb25NZW51SXRlbSwgQVhQRXhlY3V0ZUNvbW1hbmQgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2NvcmUnO1xuaW1wb3J0IHsgQVhQTGF5b3V0QnVpbGRlclNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9idWlsZGVyJztcbmltcG9ydCB7IEFYUFN0YXRlTWVzc2FnZUNvbXBvbmVudCwgQVhQVGhlbWVMYXlvdXRCbG9ja0NvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvcGxhdGZvcm0vbGF5b3V0L2NvbXBvbmVudHMnO1xuaW1wb3J0IHsgQVhQUGFnZUxheW91dEJhc2VDb21wb25lbnQsIEFYUFBhZ2VMYXlvdXRCYXNlLCBBWFBQYWdlTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9sYXlvdXQvdmlld3MnO1xuaW1wb3J0IHsgTWVudU1hbmFnZW1lbnRDb25maWcgfSBmcm9tICcuLi8uLi9tZW51LWN1c3RvbWl6YXRpb24uY29uc3QnO1xuaW1wb3J0IHsgQVhQTWVudUl0ZW1BY3Rpb24sIEFYUE1lbnVJdGVtTm9kZSB9IGZyb20gJy4uLy4uL21lbnUtY3VzdG9taXphdGlvbi50eXBlcyc7XG5pbXBvcnQgeyBBWE1NZW51VHJlZUl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21lbnUtdHJlZS1pdGVtL21lbnUtdHJlZS1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBWFBNZW51TWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tZW51LW1hbmFnZW1lbnQuc2VydmljZSc7XG5cbi8vI3JlZ2lvbiAtLS0tICAgTWVudSBMaXN0IENvbXBvbmVudCAgIC0tLS1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdheG0tbWVudS1saXN0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBDZGtEcm9wTGlzdCxcbiAgICAgICAgQVhCdXR0b25Nb2R1bGUsXG4gICAgICAgIEFYVHJhbnNsYXRpb25Nb2R1bGUsXG4gICAgICAgIEFYUFBhZ2VMYXlvdXRDb21wb25lbnQsXG4gICAgICAgIEFYUFRoZW1lTGF5b3V0QmxvY2tDb21wb25lbnQsXG4gICAgICAgIEFYUFN0YXRlTWVzc2FnZUNvbXBvbmVudCxcbiAgICAgICAgQVhNTWVudVRyZWVJdGVtQ29tcG9uZW50LFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL21lbnUtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbWVudS1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQVhQUGFnZUxheW91dEJhc2UsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogQVhNTWVudUxpc3RDb21wb25lbnQsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBob3N0OiB7IGNsYXNzOiAnYXhtLW1lbnUtbGlzdC1wYWdlJyB9LFxufSlcbmV4cG9ydCBjbGFzcyBBWE1NZW51TGlzdENvbXBvbmVudCBleHRlbmRzIEFYUFBhZ2VMYXlvdXRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgRGVwZW5kZW5jaWVzICAgLS0tLVxuXG4gICAgcHJpdmF0ZSBtZW51TWFuYWdlbWVudFNlcnZpY2UgPSBpbmplY3QoQVhQTWVudU1hbmFnZW1lbnRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIGxheW91dEJ1aWxkZXIgPSBpbmplY3QoQVhQTGF5b3V0QnVpbGRlclNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCBkaWFsb2dTZXJ2aWNlID0gaW5qZWN0KEFYRGlhbG9nU2VydmljZSk7XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHRvYXN0U2VydmljZSA9IGluamVjdChBWFRvYXN0U2VydmljZSk7XG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2UgPSBpbmplY3QoQVhUcmFuc2xhdGlvblNlcnZpY2UpO1xuICAgIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuXG4gICAgLy8jZW5kcmVnaW9uXG5cbiAgICAvLyNyZWdpb24gLS0tLSAgIENvbXBvbmVudCBTdGF0ZSAgIC0tLS1cblxuICAgIHByb3RlY3RlZCBtZW51SXRlbXMgPSBzaWduYWw8QVhQTWVudUl0ZW1Ob2RlW10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgaXNMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgZXJyb3IgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gICAgcHJvdGVjdGVkIGN1cnJlbnRTY29wZSA9IHNpZ25hbDxBWFBQbGF0Zm9ybVNjb3BlPihBWFBQbGF0Zm9ybVNjb3BlLlVzZXIpO1xuICAgIHByb3RlY3RlZCBhbGxEcm9wTGlzdElkcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuXG4gICAgLy8jZW5kcmVnaW9uXG5cbiAgICAvLyNyZWdpb24gLS0tLSAgIExpZmVjeWNsZSAgIC0tLS1cblxuICAgIG92ZXJyaWRlIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIC8vIEdldCBzY29wZSBmcm9tIHJvdXRlXG4gICAgICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY29wZSA9IHBhcmFtc1snc2NvcGUnXSBhcyBBWFBQbGF0Zm9ybVNjb3BlO1xuICAgICAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2NvcGUuc2V0KHNjb3BlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRNZW51SXRlbXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29tcHV0ZSgpOyAvLyBVcGRhdGUgcGFnZSBoZWFkZXIgYWZ0ZXIgbG9hZGluZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgRGF0YSBMb2FkaW5nICAgLS0tLVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBtZW51IGl0ZW1zIGZvciBjdXJyZW50IHNjb3BlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGxvYWRNZW51SXRlbXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldCgnJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5tZW51TWFuYWdlbWVudFNlcnZpY2UuZ2V0TWVudVRyZWUodGhpcy5jdXJyZW50U2NvcGUoKSk7XG5cbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnNldChpdGVtcyk7XG5cbiAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIGRyb3AgbGlzdCBJRHMgZm9yIGNvbm5lY3RpbmcgdGhlbVxuICAgICAgICAgICAgY29uc3QgZHJvcExpc3RJZHMgPSB0aGlzLmNvbGxlY3REcm9wTGlzdElkcyhpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLmFsbERyb3BMaXN0SWRzLnNldChkcm9wTGlzdElkcyk7XG5cbiAgICAgICAgICAgIHRoaXMucmVjb21wdXRlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdGYWlsZWQgdG8gbG9hZCBtZW51IGl0ZW1zJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5kYW5nZXIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5sb2FkLWVycm9yJyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlbHkgY29sbGVjdCBhbGwgZHJvcCBsaXN0IElEcyBmcm9tIG1lbnUgdHJlZVxuICAgICAqIEluY2x1ZGVzIGRyb3Agem9uZXMgZm9yIGFsbCBpdGVtcywgZXZlbiB0aG9zZSB3aXRob3V0IGNoaWxkcmVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb2xsZWN0RHJvcExpc3RJZHMoaXRlbXM6IEFYUE1lbnVJdGVtTm9kZVtdLCBpZHM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIC8vIEFkZCByb290IG9ubHkgb25jZSBhdCB0aGUgc3RhcnRcbiAgICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlkcy5wdXNoKCdtZW51LXJvb3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIC8vIEFkZCBkcm9wIGxpc3QgSUQgZm9yIGV2ZXJ5IGl0ZW0gKHRoZXkgYWxsIGNhbiBoYXZlIGNoaWxkcmVuIGRyb3BwZWQgaW50byB0aGVtKVxuICAgICAgICAgICAgY29uc3QgZHJvcExpc3RJZCA9IGBtZW51LSR7aXRlbS5uYW1lIHx8IGl0ZW0ucGF0aCB8fCAndW5uYW1lZCd9YDtcbiAgICAgICAgICAgIGlmICghaWRzLmluY2x1ZGVzKGRyb3BMaXN0SWQpKSB7XG4gICAgICAgICAgICAgICAgaWRzLnB1c2goZHJvcExpc3RJZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbGxlY3QgZnJvbSBjaGlsZHJlbiBpZiB0aGV5IGV4aXN0XG4gICAgICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3REcm9wTGlzdElkcyhpdGVtLmNoaWxkcmVuLCBpZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaWRzO1xuICAgIH1cblxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIC0tLS0gICBQYWdlIExheW91dCBJbnRlcmZhY2UgICAtLS0tXG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGFnZSB0aXRsZVxuICAgICAqL1xuICAgIG92ZXJyaWRlIGFzeW5jIGdldFBhZ2VUaXRsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzY29wZU5hbWUgPSB0aGlzLmN1cnJlbnRTY29wZSgpO1xuICAgICAgICBjb25zdCBzY29wZUtleSA9IHNjb3BlTmFtZSA9PT0gQVhQUGxhdGZvcm1TY29wZS5Vc2VyID8gJ3VzZXInIDogJ3RlbmFudCc7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGVBc3luYyhgQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LiR7c2NvcGVLZXl9LnRpdGxlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHBhZ2UgZGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBvdmVycmlkZSBhc3luYyBnZXRQYWdlRGVzY3JpcHRpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZUFzeW5jKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuZGVzY3JpcHRpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcHJpbWFyeSBtZW51IGl0ZW1zIChhY3Rpb25zKVxuICAgICAqL1xuICAgIG92ZXJyaWRlIGFzeW5jIGdldFByaW1hcnlNZW51SXRlbXMoKTogUHJvbWlzZTxBWFBBY3Rpb25NZW51SXRlbVtdPiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGF3YWl0IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZUFzeW5jKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuYWN0aW9ucy5hZGQtcm9vdCcpLFxuICAgICAgICAgICAgICAgIGljb246ICdmYS1saWdodCBmYS1wbHVzJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHsgbmFtZTogJ2FkZC1yb290JyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2Vjb25kYXJ5IG1lbnUgaXRlbXNcbiAgICAgKi9cbiAgICBvdmVycmlkZSBhc3luYyBnZXRTZWNvbmRhcnlNZW51SXRlbXMoKTogUHJvbWlzZTxBWFBBY3Rpb25NZW51SXRlbVtdPiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGF3YWl0IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZUFzeW5jKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuYWN0aW9ucy5yZXNldCcpLFxuICAgICAgICAgICAgICAgIGljb246ICdmYS1saWdodCBmYS1yb3RhdGUtbGVmdCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICdkYW5nZXInLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHsgbmFtZTogJ3Jlc2V0JyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGNvbW1hbmRzIGZyb20gcGFnZSBhY3Rpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZShjb21tYW5kOiBBWFBFeGVjdXRlQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQubmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkLXJvb3QnOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkUm9vdE1lbnVJdGVtKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyZXNldCc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldEN1c3RvbWl6YXRpb25zKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIC8vI3JlZ2lvbiAtLS0tICAgRXZlbnQgSGFuZGxlcnMgICAtLS0tXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbWVudSBpdGVtIGFjdGlvblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBvbkFjdGlvblRyaWdnZXJlZChldmVudDogeyBhY3Rpb246IEFYUE1lbnVJdGVtQWN0aW9uOyBpdGVtOiBBWFBNZW51SXRlbU5vZGUgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgaXRlbSB9ID0gZXZlbnQ7XG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3Nob3cnOlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd01lbnVJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaGlkZSc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5oaWRlTWVudUl0ZW0oaXRlbSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVkaXRNZW51SXRlbShpdGVtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVNZW51SXRlbShpdGVtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FkZC1jaGlsZCc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRDaGlsZE1lbnVJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW92ZS11cCc6XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tb3ZlSXRlbVVwKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW92ZS1kb3duJzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1vdmVJdGVtRG93bihpdGVtKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vdmUtdG8tcGFyZW50JzpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1vdmVJdGVtVG9QYXJlbnQoaXRlbSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZHJhZyBhbmQgZHJvcFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBvbkl0ZW1Ecm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxBWFBNZW51SXRlbU5vZGVbXT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIElNUE9SVEFOVDogRmluZCBwYXJlbnQgY29udGFpbmVycyBCRUZPUkUgbW9kaWZ5aW5nIGFycmF5c1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UGFyZW50ID0gdGhpcy5maW5kUGFyZW50T2ZDb250YWluZXIoZXZlbnQuY29udGFpbmVyLmRhdGEsIHRoaXMubWVudUl0ZW1zKCkpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UGFyZW50TmFtZSA9IHRhcmdldFBhcmVudD8ubmFtZSA/PyBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VQYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnRPZkNvbnRhaW5lcihldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLCB0aGlzLm1lbnVJdGVtcygpKTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBhcmVudE5hbWUgPSBzb3VyY2VQYXJlbnQ/Lm5hbWUgPz8gbnVsbDtcblxuICAgICAgICAgICAgLy8gTm93IHBlcmZvcm0gdGhlIGFycmF5IG9wZXJhdGlvbnNcbiAgICAgICAgICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgLy8gU2FtZSBjb250YWluZXIgLSBqdXN0IHJlb3JkZXJcbiAgICAgICAgICAgICAgICBtb3ZlSXRlbUluQXJyYXkoZXZlbnQuY29udGFpbmVyLmRhdGEsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBjb250YWluZXIgLSBtb3ZlIGJldHdlZW4gcGFyZW50c1xuICAgICAgICAgICAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKFxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5jb250YWluZXIuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHNpZ25hbCB0byByZWZsZWN0IHRoZSBuZXcgb3JkZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIHRoaXMubWVudUl0ZW1zLnNldChbLi4udGhpcy5tZW51SXRlbXMoKV0pO1xuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSB0YXJnZXQgY29udGFpbmVyIHdpdGggY29ycmVjdCBwYXJlbnQgY29udGV4dFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZW51TWFuYWdlbWVudFNlcnZpY2UucmVvcmRlck1lbnVJdGVtcyhcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSgpLFxuICAgICAgICAgICAgICAgIGV2ZW50LmNvbnRhaW5lci5kYXRhLFxuICAgICAgICAgICAgICAgIHRhcmdldFBhcmVudE5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIElmIG1vdmVkIGJldHdlZW4gY29udGFpbmVycywgYWxzbyB1cGRhdGUgdGhlIHNvdXJjZSBjb250YWluZXJcbiAgICAgICAgICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciAhPT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSByZW9yZGVyIHNvdXJjZSBpZiBpdCBzdGlsbCBoYXMgaXRlbXNcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnJlb3JkZXJNZW51SXRlbXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhcmVudE5hbWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5yZW9yZGVyLXN1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgLy8gRm9yY2UgY2hhbmdlIGRldGVjdGlvbiBieSB1cGRhdGluZyB0aGUgc2lnbmFsXG4gICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhlIFVJIHJlZmxlY3RzIHRoZSBjaGFuZ2VzIHdpdGhvdXQgcmVsb2FkaW5nIGZyb20gc2VydmljZVxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc2V0KFsuLi50aGlzLm1lbnVJdGVtcygpXSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5kYW5nZXIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5yZW9yZGVyLWVycm9yJyk7XG4gICAgICAgICAgICAvLyBSZWxvYWQgb24gZXJyb3IgdG8gcmV2ZXJ0IGNoYW5nZXNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZE1lbnVJdGVtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgcGFyZW50IGl0ZW0gdGhhdCBvd25zIGEgZ2l2ZW4gY2hpbGRyZW4gYXJyYXlcbiAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbm9kZSwgb3IgbnVsbCBpZiB0aGUgY29udGFpbmVyIGlzIGF0IHJvb3QgbGV2ZWxcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRQYXJlbnRPZkNvbnRhaW5lcihcbiAgICAgICAgY29udGFpbmVyRGF0YTogQVhQTWVudUl0ZW1Ob2RlW10sXG4gICAgICAgIGl0ZW1zOiBBWFBNZW51SXRlbU5vZGVbXVxuICAgICk6IEFYUE1lbnVJdGVtTm9kZSB8IG51bGwge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSByb290IGxldmVsXG4gICAgICAgIGlmIChjb250YWluZXJEYXRhID09PSBpdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIFJvb3QgbGV2ZWwgaGFzIG5vIHBhcmVudFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGZvciB0aGUgcGFyZW50XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpdGVtJ3MgY2hpbGRyZW4gYXJyYXkgaXMgdGhlIHRhcmdldCBjb250YWluZXJcbiAgICAgICAgICAgIGlmIChpdGVtLmNoaWxkcmVuID09PSBjb250YWluZXJEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbiBjaGlsZHJlblxuICAgICAgICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRQYXJlbnRPZkNvbnRhaW5lcihjb250YWluZXJEYXRhLCBpdGVtLmNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdCBmb3VuZCAtIHRoaXMgc2hvdWxkbid0IGhhcHBlbiBpbiBub3JtYWwgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgYW4gaXRlbSBpbiB0aGUgdHJlZSBhbmQgcmV0dXJuIGl0cyBwYXJlbnQsIGNvbnRhaW5lciwgYW5kIGluZGV4XG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSXRlbUFuZFBhcmVudChcbiAgICAgICAgdGFyZ2V0SXRlbTogQVhQTWVudUl0ZW1Ob2RlLFxuICAgICAgICBpdGVtczogQVhQTWVudUl0ZW1Ob2RlW10sXG4gICAgICAgIHBhcmVudDogQVhQTWVudUl0ZW1Ob2RlIHwgbnVsbCA9IG51bGxcbiAgICApOiB7IHBhcmVudDogQVhQTWVudUl0ZW1Ob2RlIHwgbnVsbDsgY29udGFpbmVyOiBBWFBNZW51SXRlbU5vZGVbXTsgaW5kZXg6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgICAgIC8vIFNlYXJjaCBpbiBjdXJyZW50IGxldmVsXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbSA9PT0gdGFyZ2V0SXRlbSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHBhcmVudCwgY29udGFpbmVyOiBpdGVtcywgaW5kZXggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNlYXJjaCBpbiBjaGlsZHJlblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kSXRlbUFuZFBhcmVudCh0YXJnZXRJdGVtLCBpdGVtLmNoaWxkcmVuLCBpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBuZXcgcm9vdCBtZW51IGl0ZW1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYWRkUm9vdE1lbnVJdGVtKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNob3dNZW51SXRlbURpYWxvZyhudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldCBjdXN0b21pemF0aW9uc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyByZXNldEN1c3RvbWl6YXRpb25zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB0aGlzLmRpYWxvZ1NlcnZpY2UuY29uZmlybShcbiAgICAgICAgICAgICdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQucmVzZXQudGl0bGUnLFxuICAgICAgICAgICAgJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5yZXNldC5tZXNzYWdlJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm47XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnJlc2V0Q3VzdG9taXphdGlvbnModGhpcy5jdXJyZW50U2NvcGUoKSk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQubWVzc2FnZXMucmVzZXQtc3VjY2VzcycpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5kYW5nZXIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5yZXNldC1lcnJvcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8jZW5kcmVnaW9uXG5cbiAgICAvLyNyZWdpb24gLS0tLSAgIE1lbnUgSXRlbSBBY3Rpb25zICAgLS0tLVxuXG4gICAgLyoqXG4gICAgICogU2hvdyBtZW51IGl0ZW1cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHNob3dNZW51SXRlbShpdGVtOiBBWFBNZW51SXRlbU5vZGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5uYW1lKSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnNob3dNZW51SXRlbSh0aGlzLmN1cnJlbnRTY29wZSgpLCBpdGVtLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc3VjY2VzcygnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLnNob3ctc3VjY2VzcycpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5kYW5nZXIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5zaG93LWVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIaWRlIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgaGlkZU1lbnVJdGVtKGl0ZW06IEFYUE1lbnVJdGVtTm9kZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFpdGVtLm5hbWUpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZW51TWFuYWdlbWVudFNlcnZpY2UuaGlkZU1lbnVJdGVtKHRoaXMuY3VycmVudFNjb3BlKCksIGl0ZW0ubmFtZSk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQubWVzc2FnZXMuaGlkZS1zdWNjZXNzJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRNZW51SXRlbXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmRhbmdlcignQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLmhpZGUtZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXQgbWVudSBpdGVtXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBlZGl0TWVudUl0ZW0oaXRlbTogQVhQTWVudUl0ZW1Ob2RlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hvd01lbnVJdGVtRGlhbG9nKGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBjdXN0b20gbWVudSBpdGVtXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBkZWxldGVNZW51SXRlbShpdGVtOiBBWFBNZW51SXRlbU5vZGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5kaWFsb2dTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgICAgICAnQGdlbmVyYWw6YWN0aW9ucy5kZWxldGUudGl0bGUnLFxuICAgICAgICAgICAgJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5kZWxldGUubWVzc2FnZSdcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0ubmFtZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lbnVNYW5hZ2VtZW50U2VydmljZS5kZWxldGVDdXN0b21NZW51SXRlbSh0aGlzLmN1cnJlbnRTY29wZSgpLCBpdGVtLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc3VjY2VzcygnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLmRlbGV0ZS1zdWNjZXNzJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRNZW51SXRlbXMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmRhbmdlcignQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLmRlbGV0ZS1lcnJvcicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGNoaWxkIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgYWRkQ2hpbGRNZW51SXRlbShwYXJlbnQ6IEFYUE1lbnVJdGVtTm9kZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNob3dNZW51SXRlbURpYWxvZyhudWxsLCBwYXJlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgaXRlbSB1cCBpbiBpdHMgcGFyZW50IGNvbnRhaW5lclxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbW92ZUl0ZW1VcChpdGVtOiBBWFBNZW51SXRlbU5vZGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZEl0ZW1BbmRQYXJlbnQoaXRlbSwgdGhpcy5tZW51SXRlbXMoKSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB7IHBhcmVudCwgY29udGFpbmVyLCBpbmRleCB9ID0gcmVzdWx0O1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggPD0gMCkgcmV0dXJuOyAvLyBBbHJlYWR5IGF0IHRvcFxuXG4gICAgICAgICAgICAvLyBTd2FwIHdpdGggcHJldmlvdXMgaXRlbVxuICAgICAgICAgICAgbW92ZUl0ZW1JbkFycmF5KGNvbnRhaW5lciwgaW5kZXgsIGluZGV4IC0gMSk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzaWduYWwgdG8gcmVmbGVjdCB0aGUgY2hhbmdlXG4gICAgICAgICAgICB0aGlzLm1lbnVJdGVtcy5zZXQoWy4uLnRoaXMubWVudUl0ZW1zKCldKTtcblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgcmVvcmRlcmVkIGNvbnRhaW5lclxuICAgICAgICAgICAgY29uc3QgcGFyZW50TmFtZSA9IHBhcmVudD8ubmFtZSA/PyBudWxsO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tZW51TWFuYWdlbWVudFNlcnZpY2UucmVvcmRlck1lbnVJdGVtcyhcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSgpLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICBwYXJlbnROYW1lXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQubWVzc2FnZXMucmVvcmRlci1zdWNjZXNzJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5kYW5nZXIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5yZW9yZGVyLWVycm9yJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRNZW51SXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgaXRlbSBkb3duIGluIGl0cyBwYXJlbnQgY29udGFpbmVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtb3ZlSXRlbURvd24oaXRlbTogQVhQTWVudUl0ZW1Ob2RlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRJdGVtQW5kUGFyZW50KGl0ZW0sIHRoaXMubWVudUl0ZW1zKCkpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgeyBwYXJlbnQsIGNvbnRhaW5lciwgaW5kZXggfSA9IHJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID49IGNvbnRhaW5lci5sZW5ndGggLSAxKSByZXR1cm47IC8vIEFscmVhZHkgYXQgYm90dG9tXG5cbiAgICAgICAgICAgIC8vIFN3YXAgd2l0aCBuZXh0IGl0ZW1cbiAgICAgICAgICAgIG1vdmVJdGVtSW5BcnJheShjb250YWluZXIsIGluZGV4LCBpbmRleCArIDEpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2lnbmFsIHRvIHJlZmxlY3QgdGhlIGNoYW5nZVxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc2V0KFsuLi50aGlzLm1lbnVJdGVtcygpXSk7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHJlb3JkZXJlZCBjb250YWluZXJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBwYXJlbnQ/Lm5hbWUgPz8gbnVsbDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnJlb3JkZXJNZW51SXRlbXMoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2NvcGUoKSxcbiAgICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgICAgcGFyZW50TmFtZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc3VjY2VzcygnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLnJlb3JkZXItc3VjY2VzcycpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZGFuZ2VyKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQubWVzc2FnZXMucmVvcmRlci1lcnJvcicpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIGl0ZW0gdG8gaXRzIHBhcmVudCdzIGxldmVsIChtb3ZlIG91dCBvZiBuZXN0ZWQgbGV2ZWwpXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtb3ZlSXRlbVRvUGFyZW50KGl0ZW06IEFYUE1lbnVJdGVtTm9kZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kSXRlbUFuZFBhcmVudChpdGVtLCB0aGlzLm1lbnVJdGVtcygpKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQucGFyZW50KSByZXR1cm47IC8vIE5vIHBhcmVudCB0byBtb3ZlIHRvXG5cbiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50LCBjb250YWluZXIsIGluZGV4IH0gPSByZXN1bHQ7XG5cbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGdyYW5kcGFyZW50IGNvbnRhaW5lclxuICAgICAgICAgICAgY29uc3QgZ3JhbmRQYXJlbnRSZXN1bHQgPSB0aGlzLmZpbmRJdGVtQW5kUGFyZW50KHBhcmVudCwgdGhpcy5tZW51SXRlbXMoKSk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRDb250YWluZXIgPSBncmFuZFBhcmVudFJlc3VsdCA/IGdyYW5kUGFyZW50UmVzdWx0LmNvbnRhaW5lciA6IHRoaXMubWVudUl0ZW1zKCk7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleEluR3JhbmRwYXJlbnQgPSBncmFuZFBhcmVudFJlc3VsdCA/IGdyYW5kUGFyZW50UmVzdWx0LmluZGV4IDogdGhpcy5tZW51SXRlbXMoKS5pbmRleE9mKHBhcmVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGN1cnJlbnQgY29udGFpbmVyXG4gICAgICAgICAgICBjb25zdCBbbW92ZWRJdGVtXSA9IGNvbnRhaW5lci5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgICAgICAvLyBJbnNlcnQgYWZ0ZXIgcGFyZW50IGluIGdyYW5kcGFyZW50IGNvbnRhaW5lclxuICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLnNwbGljZShwYXJlbnRJbmRleEluR3JhbmRwYXJlbnQgKyAxLCAwLCBtb3ZlZEl0ZW0pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2lnbmFsIHRvIHJlZmxlY3QgdGhlIGNoYW5nZVxuICAgICAgICAgICAgdGhpcy5tZW51SXRlbXMuc2V0KFsuLi50aGlzLm1lbnVJdGVtcygpXSk7XG5cbiAgICAgICAgICAgIC8vIFNhdmUgYm90aCBjb250YWluZXJzXG4gICAgICAgICAgICBjb25zdCBwYXJlbnROYW1lID0gcGFyZW50Py5uYW1lID8/IG51bGw7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lbnVNYW5hZ2VtZW50U2VydmljZS5yZW9yZGVyTWVudUl0ZW1zKFxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNjb3BlKCksXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgICAgIHBhcmVudE5hbWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGdyYW5kUGFyZW50TmFtZSA9IGdyYW5kUGFyZW50UmVzdWx0Py5wYXJlbnQ/Lm5hbWUgPz8gbnVsbDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnJlb3JkZXJNZW51SXRlbXMoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2NvcGUoKSxcbiAgICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgICAgZ3JhbmRQYXJlbnROYW1lXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zdWNjZXNzKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQubWVzc2FnZXMucmVvcmRlci1zdWNjZXNzJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5kYW5nZXIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5tZXNzYWdlcy5yZW9yZGVyLWVycm9yJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRNZW51SXRlbXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgLy8jcmVnaW9uIC0tLS0gICBEaWFsb2cgSGVscGVycyAgIC0tLS1cblxuICAgIC8qKlxuICAgICAqIFNob3cgbWVudSBpdGVtIGRpYWxvZyAoYWRkL2VkaXQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBzaG93TWVudUl0ZW1EaWFsb2coaXRlbTogQVhQTWVudUl0ZW1Ob2RlIHwgbnVsbCwgcGFyZW50PzogQVhQTWVudUl0ZW1Ob2RlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlzRWRpdCA9ICEhaXRlbTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSBpc0VkaXRcbiAgICAgICAgICAgID8gJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5lZGl0LWRpYWxvZy50aXRsZSdcbiAgICAgICAgICAgIDogJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5hZGQtZGlhbG9nLnRpdGxlJztcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgbmFtZTogaXRlbT8ubmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHRleHQ6IGl0ZW0/LnRleHQgfHwgJycsXG4gICAgICAgICAgICBpY29uOiBpdGVtPy5pY29uIHx8ICcnLFxuICAgICAgICAgICAgcGF0aDogaXRlbT8ucGF0aCB8fCAnJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBpdGVtPy5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IGFueSA9IGF3YWl0IHRoaXMubGF5b3V0QnVpbGRlclxuICAgICAgICAgICAgLmNyZWF0ZSgpXG4gICAgICAgICAgICAuZGlhbG9nKChkaWFsb2c6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGRpYWxvZ1xuICAgICAgICAgICAgICAgICAgICAuc2V0VGl0bGUodGl0bGUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZXh0KGNvbnRleHQpXG4gICAgICAgICAgICAgICAgICAgIC5jb250ZW50KChmbGV4OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGlyZWN0aW9uKCdjb2x1bW4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtRmllbGQoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5maWVsZHMubmFtZScsIChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnBhdGgoJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGV4dEJveCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5maWVsZHMubmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uczogW3sgcnVsZTogJ3JlcXVpcmVkJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0VkaXQgJiYgaXRlbT8uaXNCdWlsdEluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtRmllbGQoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5maWVsZHMudGV4dCcsIChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnBhdGgoJ3RleHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQudGV4dEJveCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5maWVsZHMudGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uczogW3sgcnVsZTogJ3JlcXVpcmVkJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybUZpZWxkKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuZmllbGRzLmljb24nLCAoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5wYXRoKCdpY29uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmN1c3RvbVdpZGdldCgnaWNvbi1jaG9vc2VyJywge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1GaWVsZCgnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LmZpZWxkcy5wYXRoJywgKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQucGF0aCgncGF0aCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC50ZXh0Qm94KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LmZpZWxkcy5wYXRoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0VkaXQgJiYgaXRlbT8uaXNCdWlsdEluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtRmllbGQoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5maWVsZHMuZGVzY3JpcHRpb24nLCAoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5wYXRoKCdkZXNjcmlwdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5sYXJnZVRleHRCb3goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuZmllbGRzLmRlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M6IDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuc2V0QWN0aW9ucygoYWN0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25zLmNhbmNlbCgnQGdlbmVyYWw6YWN0aW9ucy5jYW5jZWwudGl0bGUnKS5zdWJtaXQoJ0BnZW5lcmFsOmFjdGlvbnMuc2F2ZS50aXRsZScpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc2hvdygpO1xuXG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGRpYWxvZ1JlZi5hY3Rpb24oKTtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBkaWFsb2dSZWYuY29udGV4dCgpIGFzIFBhcnRpYWw8QVhQTWVudUl0ZW0+O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoaXNFZGl0ICYmIGl0ZW0/Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgaXRlbVxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzQ3VzdG9tKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnVwZGF0ZUN1c3RvbU1lbnVJdGVtKHRoaXMuY3VycmVudFNjb3BlKCksIGl0ZW0ubmFtZSwgZm9ybURhdGEgYXMgQVhQTWVudUl0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLnVwZGF0ZU1lbnVQcm9wZXJ0aWVzKHRoaXMuY3VycmVudFNjb3BlKCksIGl0ZW0ubmFtZSwgZm9ybURhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBjdXN0b20gaXRlbVxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0l0ZW06IEFYUE1lbnVJdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmb3JtRGF0YS5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZm9ybURhdGEudGV4dCEsXG4gICAgICAgICAgICAgICAgICAgIGljb246IGZvcm1EYXRhLmljb24sXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZvcm1EYXRhLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBmb3JtRGF0YS5wcmlvcml0eSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZvcm1EYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBwYXJlbnQgaXMgc3BlY2lmaWVkLCBhZGQgYXMgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Py5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjdXN0b20gaXRlbSBhcyBjaGlsZCBvZiBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tZW51TWFuYWdlbWVudFNlcnZpY2UuYWRkQ3VzdG9tTWVudUl0ZW1Bc0NoaWxkKHRoaXMuY3VycmVudFNjb3BlKCksIG5ld0l0ZW0sIHBhcmVudC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYXMgcm9vdCBsZXZlbCBpdGVtXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWVudU1hbmFnZW1lbnRTZXJ2aWNlLmFkZEN1c3RvbU1lbnVJdGVtKHRoaXMuY3VycmVudFNjb3BlKCksIG5ld0l0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc3VjY2VzcygnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLnNhdmUtc3VjY2VzcycpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmRhbmdlcignQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50Lm1lc3NhZ2VzLnNhdmUtZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vI2VuZHJlZ2lvblxufVxuXG4vLyNlbmRyZWdpb25cblxuIiwiPGF4cC1wYWdlLWxheW91dD5cbiAgPGF4cC1wYWdlLWNvbnRlbnQ+XG4gICAgQGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgPCEtLSBMb2FkaW5nIFN0YXRlIC0tPlxuICAgICAgPGF4cC1zdGF0ZS1tZXNzYWdlXG4gICAgICAgIG1vZGU9XCJsb2FkaW5nXCJcbiAgICAgICAgaWNvbj1cImZhLWxpZ2h0IGZhLXNwaW5uZXItdGhpcmQgZmEtc3BpblwiXG4gICAgICAgIFt0aXRsZV09XCIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5sb2FkaW5nLnRpdGxlJyB8IHRyYW5zbGF0ZSB8IGFzeW5jKSB8fCAnTG9hZGluZy4uLidcIlxuICAgICAgICBbZGVzY3JpcHRpb25dPVwiXG4gICAgICAgICAgKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQubG9hZGluZy5kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGUgfCBhc3luYykgfHwgJ1BsZWFzZSB3YWl0J1xuICAgICAgICBcIlxuICAgICAgLz5cbiAgICB9IEBlbHNlIGlmIChlcnJvcigpKSB7XG4gICAgICA8IS0tIEVycm9yIFN0YXRlIC0tPlxuICAgICAgPGF4cC1zdGF0ZS1tZXNzYWdlXG4gICAgICAgIG1vZGU9XCJlcnJvclwiXG4gICAgICAgIGljb249XCJmYS1saWdodCBmYS1jaXJjbGUtZXhjbGFtYXRpb25cIlxuICAgICAgICBbdGl0bGVdPVwiKCdAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuZXJyb3IudGl0bGUnIHwgdHJhbnNsYXRlIHwgYXN5bmMpIHx8ICdFcnJvcidcIlxuICAgICAgICBbZGVzY3JpcHRpb25dPVwiZXJyb3IoKSB8fCAnQW4gZXJyb3Igb2NjdXJyZWQnXCJcbiAgICAgID5cbiAgICAgICAgPGF4LWJ1dHRvblxuICAgICAgICAgIHNsb3Q9XCJhY3Rpb25zXCJcbiAgICAgICAgICBbdGV4dF09XCInQGdlbmVyYWw6YWN0aW9ucy5yZXRyeS50aXRsZScgfCB0cmFuc2xhdGUgfCBhc3luY1wiXG4gICAgICAgICAgW2xvb2tdPVwiJ291dGxpbmUnXCJcbiAgICAgICAgICBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgICAob25DbGljayk9XCJsb2FkTWVudUl0ZW1zKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYS1saWdodCBmYS1yb3RhdGUtbGVmdFwiPjwvaT5cbiAgICAgICAgPC9heC1idXR0b24+XG4gICAgICA8L2F4cC1zdGF0ZS1tZXNzYWdlPlxuICAgIH0gQGVsc2UgaWYgKG1lbnVJdGVtcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cbiAgICAgIDxheHAtc3RhdGUtbWVzc2FnZVxuICAgICAgICBtb2RlPVwiZW1wdHlcIlxuICAgICAgICBpY29uPVwiZmEtbGlnaHQgZmEtYmFyc1wiXG4gICAgICAgIFt0aXRsZV09XCIoJ0BhcHBsaWNhdGlvbi1tYW5hZ2VtZW50Om1lbnUtbWFuYWdlbWVudC5lbXB0eS1zdGF0ZS50aXRsZScgfCB0cmFuc2xhdGUgfCBhc3luYykgfHwgJ05vIG1lbnUgaXRlbXMnXCJcbiAgICAgICAgW2Rlc2NyaXB0aW9uXT1cIlxuICAgICAgICAgICgnQGFwcGxpY2F0aW9uLW1hbmFnZW1lbnQ6bWVudS1tYW5hZ2VtZW50LmVtcHR5LXN0YXRlLmRlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB8IGFzeW5jKSB8fFxuICAgICAgICAgICdBZGQgYSBuZXcgbWVudSBpdGVtIHRvIGdldCBzdGFydGVkJ1xuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8YXgtYnV0dG9uXG4gICAgICAgICAgc2xvdD1cImFjdGlvbnNcIlxuICAgICAgICAgIFt0ZXh0XT1cIidAYXBwbGljYXRpb24tbWFuYWdlbWVudDptZW51LW1hbmFnZW1lbnQuYWN0aW9ucy5hZGQtcm9vdCcgfCB0cmFuc2xhdGUgfCBhc3luY1wiXG4gICAgICAgICAgW2xvb2tdPVwiJ3NvbGlkJ1wiXG4gICAgICAgICAgW2NvbG9yXT1cIidwcmltYXJ5J1wiXG4gICAgICAgICAgKG9uQ2xpY2spPVwiYWRkUm9vdE1lbnVJdGVtKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYS1saWdodCBmYS1wbHVzXCI+PC9pPlxuICAgICAgICA8L2F4LWJ1dHRvbj5cbiAgICAgIDwvYXhwLXN0YXRlLW1lc3NhZ2U+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIE1lbnUgVHJlZSBDb250ZW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImF4bS1tZW51LWxpc3RfX2NvbnRhaW5lclwiPlxuICAgICAgICA8IS0tIE1lbnUgVHJlZSAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYXhtLW1lbnUtbGlzdF9fdHJlZVwiXG4gICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICBpZD1cIm1lbnUtcm9vdFwiXG4gICAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJtZW51SXRlbXMoKVwiXG4gICAgICAgICAgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiYWxsRHJvcExpc3RJZHMoKVwiXG4gICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkl0ZW1Ecm9wcGVkKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBtZW51SXRlbXMoKTsgdHJhY2sgaXRlbS5uYW1lIHx8IGl0ZW0ucGF0aCB8fCAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8YXhtLW1lbnUtdHJlZS1pdGVtXG4gICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgICAgICBbbGV2ZWxdPVwiMFwiXG4gICAgICAgICAgICAgIFtjYW5EZWxldGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25uZWN0ZWREcm9wTGlzdHNdPVwiYWxsRHJvcExpc3RJZHMoKVwiXG4gICAgICAgICAgICAgIFtjYW5Nb3ZlVXBdPVwiaSA+IDBcIlxuICAgICAgICAgICAgICBbY2FuTW92ZURvd25dPVwiaSA8IG1lbnVJdGVtcygpLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICBbY2FuTW92ZVRvUGFyZW50XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKGFjdGlvblRyaWdnZXJlZCk9XCJvbkFjdGlvblRyaWdnZXJlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGl0ZW1Ecm9wcGVkKT1cIm9uSXRlbURyb3BwZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvYXhwLXBhZ2UtY29udGVudD5cbjwvYXhwLXBhZ2UtbGF5b3V0PlxuIl19"],"names":["i2","i3"],"mappings":"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"}
|