phoenix-ui-components 2.5.1 → 2.7.0

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.
Files changed (64) hide show
  1. package/dist/components/file-explorer/file-explorer.component.d.ts +29 -0
  2. package/dist/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.d.ts +1 -0
  3. package/dist/components/phoenix-ui.module.d.ts +20 -14
  4. package/dist/components/ring-loader/ring-loader.component.d.ts +5 -0
  5. package/dist/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.d.ts +28 -0
  6. package/dist/components/ui-menu/event-data-explorer/event-data-explorer.component.d.ts +13 -0
  7. package/dist/components/ui-menu/index.d.ts +2 -0
  8. package/dist/components/ui-menu/object-clipping/object-clipping.component.d.ts +4 -2
  9. package/dist/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.d.ts +1 -1
  10. package/dist/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.d.ts +6 -5
  11. package/dist/components/ui-menu/tree-menu/tree-menu.component.d.ts +2 -12
  12. package/dist/esm2020/components/embed-menu/embed-menu.component.mjs +3 -3
  13. package/dist/esm2020/components/embed-menu/experiment-link/experiment-link.component.mjs +3 -3
  14. package/dist/esm2020/components/file-explorer/file-explorer.component.mjs +49 -0
  15. package/dist/esm2020/components/loader/loader.component.mjs +3 -3
  16. package/dist/esm2020/components/nav/nav.component.mjs +3 -3
  17. package/dist/esm2020/components/phoenix-menu/config/config-slider/config-slider.component.mjs +3 -3
  18. package/dist/esm2020/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.mjs +10 -6
  19. package/dist/esm2020/components/phoenix-menu/phoenix-menu.component.mjs +3 -3
  20. package/dist/esm2020/components/phoenix-ui.module.mjs +35 -12
  21. package/dist/esm2020/components/ring-loader/ring-loader.component.mjs +11 -0
  22. package/dist/esm2020/components/ui-menu/animate-camera/animate-camera.component.mjs +3 -3
  23. package/dist/esm2020/components/ui-menu/animate-event/animate-event.component.mjs +3 -3
  24. package/dist/esm2020/components/ui-menu/ar-toggle/ar-toggle.component.mjs +3 -3
  25. package/dist/esm2020/components/ui-menu/auto-rotate/auto-rotate.component.mjs +3 -3
  26. package/dist/esm2020/components/ui-menu/collections-info/collections-info-overlay/collections-info-overlay.component.mjs +3 -3
  27. package/dist/esm2020/components/ui-menu/collections-info/collections-info.component.mjs +3 -3
  28. package/dist/esm2020/components/ui-menu/dark-theme/dark-theme.component.mjs +3 -3
  29. package/dist/esm2020/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.mjs +106 -0
  30. package/dist/esm2020/components/ui-menu/event-data-explorer/event-data-explorer.component.mjs +26 -0
  31. package/dist/esm2020/components/ui-menu/event-selector/event-selector.component.mjs +3 -3
  32. package/dist/esm2020/components/ui-menu/experiment-info/experiment-info.component.mjs +3 -3
  33. package/dist/esm2020/components/ui-menu/index.mjs +3 -1
  34. package/dist/esm2020/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.mjs +3 -3
  35. package/dist/esm2020/components/ui-menu/info-panel/info-panel.component.mjs +3 -3
  36. package/dist/esm2020/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.mjs +4 -4
  37. package/dist/esm2020/components/ui-menu/io-options/io-options.component.mjs +3 -3
  38. package/dist/esm2020/components/ui-menu/main-view-toggle/main-view-toggle.component.mjs +3 -3
  39. package/dist/esm2020/components/ui-menu/menu-toggle/menu-toggle.component.mjs +3 -3
  40. package/dist/esm2020/components/ui-menu/object-clipping/object-clipping.component.mjs +14 -9
  41. package/dist/esm2020/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.mjs +3 -3
  42. package/dist/esm2020/components/ui-menu/object-selection/object-selection.component.mjs +3 -3
  43. package/dist/esm2020/components/ui-menu/overlay/overlay.component.mjs +3 -3
  44. package/dist/esm2020/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.mjs +3 -3
  45. package/dist/esm2020/components/ui-menu/overlay-view/overlay-view.component.mjs +3 -3
  46. package/dist/esm2020/components/ui-menu/performance-toggle/performance-toggle.component.mjs +3 -3
  47. package/dist/esm2020/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.mjs +4 -4
  48. package/dist/esm2020/components/ui-menu/share-link/share-link.component.mjs +3 -3
  49. package/dist/esm2020/components/ui-menu/ss-mode/ss-mode.component.mjs +3 -3
  50. package/dist/esm2020/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.mjs +4 -4
  51. package/dist/esm2020/components/ui-menu/tree-menu/tree-menu.component.mjs +4 -4
  52. package/dist/esm2020/components/ui-menu/ui-menu.component.mjs +3 -3
  53. package/dist/esm2020/components/ui-menu/view-options/view-options.component.mjs +3 -3
  54. package/dist/esm2020/components/ui-menu/vr-toggle/vr-toggle.component.mjs +3 -3
  55. package/dist/esm2020/components/ui-menu/zoom-controls/zoom-controls.component.mjs +3 -3
  56. package/dist/esm2020/public_api.mjs +3 -1
  57. package/dist/esm2020/services/event-display.service.mjs +3 -3
  58. package/dist/esm2020/services/extras/attribute.pipe.mjs +3 -3
  59. package/dist/fesm2015/phoenix-ui-components.mjs +344 -140
  60. package/dist/fesm2015/phoenix-ui-components.mjs.map +1 -1
  61. package/dist/fesm2020/phoenix-ui-components.mjs +340 -140
  62. package/dist/fesm2020/phoenix-ui-components.mjs.map +1 -1
  63. package/dist/public_api.d.ts +2 -0
  64. package/package.json +7 -7
@@ -0,0 +1,29 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { NestedTreeControl } from '@angular/cdk/tree';
3
+ import { MatTreeNestedDataSource } from '@angular/material/tree';
4
+ import * as i0 from "@angular/core";
5
+ export declare class FileNode {
6
+ name: string;
7
+ url: string;
8
+ children: {
9
+ [key: string]: FileNode;
10
+ };
11
+ constructor(name?: string);
12
+ }
13
+ export declare class FileExplorerComponent implements OnChanges {
14
+ rootFileNode: FileNode;
15
+ onFileSelect: EventEmitter<string>;
16
+ treeControl: NestedTreeControl<FileNode, FileNode>;
17
+ dataSource: MatTreeNestedDataSource<FileNode>;
18
+ ngOnChanges(changes: SimpleChanges): void;
19
+ hasChildren: (_: number, node: FileNode) => boolean;
20
+ onSelect(url: string): void;
21
+ /**
22
+ * Sort the FileNode's children with folders before files.
23
+ * @param node FileNode whose children are to be sorted.
24
+ * @returns An array of sorted FileNodes.
25
+ */
26
+ getSortedChildren(node: FileNode): FileNode[];
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileExplorerComponent, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileExplorerComponent, "app-file-explorer", never, { "rootFileNode": "rootFileNode"; }, { "onFileSelect": "onFileSelect"; }, never, never>;
29
+ }
@@ -8,6 +8,7 @@ export declare class PhoenixMenuItemComponent {
8
8
  configTop: number;
9
9
  constructor(cdr: ChangeDetectorRef);
10
10
  calculateConfigTop(): void;
11
+ castConfigsToAny(configs: PhoenixMenuNode['configs']): any[];
11
12
  static ɵfac: i0.ɵɵFactoryDeclaration<PhoenixMenuItemComponent, never>;
12
13
  static ɵcmp: i0.ɵɵComponentDeclaration<PhoenixMenuItemComponent, "app-phoenix-menu-item", never, { "currentNode": "currentNode"; }, {}, never, never>;
13
14
  }
@@ -38,21 +38,27 @@ import * as i36 from "./ui-menu/share-link/share-link.component";
38
38
  import * as i37 from "./ui-menu/share-link/share-link-dialog/share-link-dialog.component";
39
39
  import * as i38 from "./embed-menu/embed-menu.component";
40
40
  import * as i39 from "./embed-menu/experiment-link/experiment-link.component";
41
- import * as i40 from "@angular/common";
42
- import * as i41 from "@angular/router";
43
- import * as i42 from "@angular/cdk/drag-drop";
44
- import * as i43 from "@angular/material/dialog";
45
- import * as i44 from "@angular/material/button";
46
- import * as i45 from "@angular/material/tooltip";
47
- import * as i46 from "@angular/cdk/overlay";
48
- import * as i47 from "@angular/material/menu";
49
- import * as i48 from "@angular/material/slider";
50
- import * as i49 from "@angular/material/slide-toggle";
51
- import * as i50 from "@angular/material/checkbox";
52
- import * as i51 from "@angular/material/icon";
53
- import * as i52 from "@angular-slider/ngx-slider";
41
+ import * as i40 from "./ui-menu/event-data-explorer/event-data-explorer.component";
42
+ import * as i41 from "./ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component";
43
+ import * as i42 from "./file-explorer/file-explorer.component";
44
+ import * as i43 from "./ring-loader/ring-loader.component";
45
+ import * as i44 from "@angular/common";
46
+ import * as i45 from "@angular/router";
47
+ import * as i46 from "@angular/cdk/drag-drop";
48
+ import * as i47 from "@angular/material/dialog";
49
+ import * as i48 from "@angular/material/button";
50
+ import * as i49 from "@angular/material/tooltip";
51
+ import * as i50 from "@angular/cdk/overlay";
52
+ import * as i51 from "@angular/material/menu";
53
+ import * as i52 from "@angular/material/slider";
54
+ import * as i53 from "@angular/material/slide-toggle";
55
+ import * as i54 from "@angular/material/checkbox";
56
+ import * as i55 from "@angular/material/icon";
57
+ import * as i56 from "@rp3e11/ngx-slider";
58
+ import * as i57 from "@angular/cdk/tree";
59
+ import * as i58 from "@angular/material/tabs";
54
60
  export declare class PhoenixUIModule {
55
61
  static ɵfac: i0.ɵɵFactoryDeclaration<PhoenixUIModule, never>;
56
- static ɵmod: i0.ɵɵNgModuleDeclaration<PhoenixUIModule, [typeof i1.NavComponent, typeof i2.UiMenuComponent, typeof i3.CollectionsInfoComponent, typeof i4.MenuToggleComponent, typeof i5.CollectionsInfoOverlayComponent, typeof i6.IoOptionsComponent, typeof i7.IOOptionsDialogComponent, typeof i8.OverlayViewComponent, typeof i9.AttributePipe, typeof i10.ObjectSelectionComponent, typeof i11.ObjectSelectionOverlayComponent, typeof i12.EventSelectorComponent, typeof i13.ObjectClippingComponent, typeof i14.DarkThemeComponent, typeof i15.AutoRotateComponent, typeof i16.ViewOptionsComponent, typeof i17.OverlayViewWindowComponent, typeof i18.OverlayComponent, typeof i19.ExperimentInfoComponent, typeof i20.InfoPanelComponent, typeof i21.InfoPanelOverlayComponent, typeof i22.MainViewToggleComponent, typeof i23.ZoomControlsComponent, typeof i24.TreeMenuComponent, typeof i25.TreeMenuItemComponent, typeof i26.PhoenixMenuComponent, typeof i27.PhoenixMenuItemComponent, typeof i28.ConfigSliderComponent, typeof i29.AnimateCameraComponent, typeof i30.AnimateEventComponent, typeof i31.VrToggleComponent, typeof i32.ArToggleComponent, typeof i33.SSModeComponent, typeof i34.PerformanceToggleComponent, typeof i35.LoaderComponent, typeof i36.ShareLinkComponent, typeof i37.ShareLinkDialogComponent, typeof i38.EmbedMenuComponent, typeof i39.ExperimentLinkComponent], [typeof i40.CommonModule, typeof i41.RouterModule, typeof i42.DragDropModule, typeof i43.MatDialogModule, typeof i44.MatButtonModule, typeof i45.MatTooltipModule, typeof i46.OverlayModule, typeof i47.MatMenuModule, typeof i48.MatSliderModule, typeof i49.MatSlideToggleModule, typeof i50.MatCheckboxModule, typeof i51.MatIconModule, typeof i52.NgxSliderModule], [typeof i1.NavComponent, typeof i2.UiMenuComponent, typeof i3.CollectionsInfoComponent, typeof i4.MenuToggleComponent, typeof i5.CollectionsInfoOverlayComponent, typeof i6.IoOptionsComponent, typeof i7.IOOptionsDialogComponent, typeof i8.OverlayViewComponent, typeof i9.AttributePipe, typeof i10.ObjectSelectionComponent, typeof i11.ObjectSelectionOverlayComponent, typeof i12.EventSelectorComponent, typeof i13.ObjectClippingComponent, typeof i14.DarkThemeComponent, typeof i15.AutoRotateComponent, typeof i16.ViewOptionsComponent, typeof i17.OverlayViewWindowComponent, typeof i18.OverlayComponent, typeof i19.ExperimentInfoComponent, typeof i20.InfoPanelComponent, typeof i21.InfoPanelOverlayComponent, typeof i22.MainViewToggleComponent, typeof i23.ZoomControlsComponent, typeof i24.TreeMenuComponent, typeof i25.TreeMenuItemComponent, typeof i26.PhoenixMenuComponent, typeof i27.PhoenixMenuItemComponent, typeof i28.ConfigSliderComponent, typeof i29.AnimateCameraComponent, typeof i30.AnimateEventComponent, typeof i31.VrToggleComponent, typeof i32.ArToggleComponent, typeof i33.SSModeComponent, typeof i34.PerformanceToggleComponent, typeof i35.LoaderComponent, typeof i36.ShareLinkComponent, typeof i37.ShareLinkDialogComponent, typeof i38.EmbedMenuComponent, typeof i39.ExperimentLinkComponent]>;
62
+ static ɵmod: i0.ɵɵNgModuleDeclaration<PhoenixUIModule, [typeof i1.NavComponent, typeof i2.UiMenuComponent, typeof i3.CollectionsInfoComponent, typeof i4.MenuToggleComponent, typeof i5.CollectionsInfoOverlayComponent, typeof i6.IoOptionsComponent, typeof i7.IOOptionsDialogComponent, typeof i8.OverlayViewComponent, typeof i9.AttributePipe, typeof i10.ObjectSelectionComponent, typeof i11.ObjectSelectionOverlayComponent, typeof i12.EventSelectorComponent, typeof i13.ObjectClippingComponent, typeof i14.DarkThemeComponent, typeof i15.AutoRotateComponent, typeof i16.ViewOptionsComponent, typeof i17.OverlayViewWindowComponent, typeof i18.OverlayComponent, typeof i19.ExperimentInfoComponent, typeof i20.InfoPanelComponent, typeof i21.InfoPanelOverlayComponent, typeof i22.MainViewToggleComponent, typeof i23.ZoomControlsComponent, typeof i24.TreeMenuComponent, typeof i25.TreeMenuItemComponent, typeof i26.PhoenixMenuComponent, typeof i27.PhoenixMenuItemComponent, typeof i28.ConfigSliderComponent, typeof i29.AnimateCameraComponent, typeof i30.AnimateEventComponent, typeof i31.VrToggleComponent, typeof i32.ArToggleComponent, typeof i33.SSModeComponent, typeof i34.PerformanceToggleComponent, typeof i35.LoaderComponent, typeof i36.ShareLinkComponent, typeof i37.ShareLinkDialogComponent, typeof i38.EmbedMenuComponent, typeof i39.ExperimentLinkComponent, typeof i40.EventDataExplorerComponent, typeof i41.EventDataExplorerDialogComponent, typeof i42.FileExplorerComponent, typeof i43.RingLoaderComponent], [typeof i44.CommonModule, typeof i45.RouterModule, typeof i46.DragDropModule, typeof i47.MatDialogModule, typeof i48.MatButtonModule, typeof i49.MatTooltipModule, typeof i50.OverlayModule, typeof i51.MatMenuModule, typeof i52.MatSliderModule, typeof i53.MatSlideToggleModule, typeof i54.MatCheckboxModule, typeof i55.MatIconModule, typeof i56.NgxSliderModule, typeof i57.CdkTreeModule, typeof i58.MatTabsModule], [typeof i1.NavComponent, typeof i2.UiMenuComponent, typeof i3.CollectionsInfoComponent, typeof i4.MenuToggleComponent, typeof i5.CollectionsInfoOverlayComponent, typeof i6.IoOptionsComponent, typeof i7.IOOptionsDialogComponent, typeof i8.OverlayViewComponent, typeof i9.AttributePipe, typeof i10.ObjectSelectionComponent, typeof i11.ObjectSelectionOverlayComponent, typeof i12.EventSelectorComponent, typeof i13.ObjectClippingComponent, typeof i14.DarkThemeComponent, typeof i15.AutoRotateComponent, typeof i16.ViewOptionsComponent, typeof i17.OverlayViewWindowComponent, typeof i18.OverlayComponent, typeof i19.ExperimentInfoComponent, typeof i20.InfoPanelComponent, typeof i21.InfoPanelOverlayComponent, typeof i22.MainViewToggleComponent, typeof i23.ZoomControlsComponent, typeof i24.TreeMenuComponent, typeof i25.TreeMenuItemComponent, typeof i26.PhoenixMenuComponent, typeof i27.PhoenixMenuItemComponent, typeof i28.ConfigSliderComponent, typeof i29.AnimateCameraComponent, typeof i30.AnimateEventComponent, typeof i31.VrToggleComponent, typeof i32.ArToggleComponent, typeof i33.SSModeComponent, typeof i34.PerformanceToggleComponent, typeof i35.LoaderComponent, typeof i36.ShareLinkComponent, typeof i37.ShareLinkDialogComponent, typeof i38.EmbedMenuComponent, typeof i39.ExperimentLinkComponent, typeof i40.EventDataExplorerComponent, typeof i41.EventDataExplorerDialogComponent, typeof i42.FileExplorerComponent, typeof i43.RingLoaderComponent]>;
57
63
  static ɵinj: i0.ɵɵInjectorDeclaration<PhoenixUIModule>;
58
64
  }
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class RingLoaderComponent {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<RingLoaderComponent, never>;
4
+ static ɵcmp: i0.ɵɵComponentDeclaration<RingLoaderComponent, "app-ring-loader", never, {}, {}, never, never>;
5
+ }
@@ -0,0 +1,28 @@
1
+ import { MatDialogRef } from '@angular/material/dialog';
2
+ import { EventDisplayService } from '../../../../services/event-display.service';
3
+ import { FileNode } from '../../../file-explorer/file-explorer.component';
4
+ import { EventDataExplorerDialogData } from '../event-data-explorer.component';
5
+ import * as i0 from "@angular/core";
6
+ export declare type FileResponse = {
7
+ name: string;
8
+ url: string;
9
+ };
10
+ export declare class EventDataExplorerDialogComponent {
11
+ private eventDisplay;
12
+ private dialogRef;
13
+ private dialogData;
14
+ eventDataFileNode: FileNode;
15
+ configFileNode: FileNode;
16
+ loading: boolean;
17
+ error: boolean;
18
+ constructor(eventDisplay: EventDisplayService, dialogRef: MatDialogRef<EventDataExplorerDialogComponent>, dialogData: EventDataExplorerDialogData);
19
+ loadEvent(file: string): void;
20
+ private loadJSONEvent;
21
+ private loadJiveXMLEvent;
22
+ loadConfig(file: string): void;
23
+ onClose(): void;
24
+ makeRequest(urlPath: string, responseType: 'json' | 'text', onData: (data: any) => void): void;
25
+ private buildFileNode;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<EventDataExplorerDialogComponent, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<EventDataExplorerDialogComponent, "app-event-data-explorer-dialog", never, {}, {}, never, never>;
28
+ }
@@ -0,0 +1,13 @@
1
+ import { MatDialog } from '@angular/material/dialog';
2
+ import * as i0 from "@angular/core";
3
+ export declare type EventDataExplorerDialogData = {
4
+ apiURL: string;
5
+ };
6
+ export declare class EventDataExplorerComponent {
7
+ private dialog;
8
+ apiURL: string;
9
+ constructor(dialog: MatDialog);
10
+ openEventDataExplorerDialog(): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<EventDataExplorerComponent, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<EventDataExplorerComponent, "app-event-data-explorer", never, { "apiURL": "apiURL"; }, {}, never, never>;
13
+ }
@@ -29,3 +29,5 @@ export * from './performance-toggle/performance-toggle.component';
29
29
  export * from './ui-menu.component';
30
30
  export * from './share-link/share-link.component';
31
31
  export * from './share-link/share-link-dialog/share-link-dialog.component';
32
+ export * from './event-data-explorer/event-data-explorer.component';
33
+ export * from './event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component';
@@ -5,9 +5,11 @@ import * as i0 from "@angular/core";
5
5
  export declare class ObjectClippingComponent {
6
6
  private eventDisplay;
7
7
  clippingEnabled: boolean;
8
- clippingAngle: number;
8
+ startClippingAngle: number;
9
+ openingClippingAngle: number;
9
10
  constructor(eventDisplay: EventDisplayService);
10
- changeClippingAngle(change: MatSliderChange): void;
11
+ changeStartClippingAngle(change: MatSliderChange): void;
12
+ changeOpeningClippingAngle(change: MatSliderChange): void;
11
13
  toggleClipping(change: MatCheckboxChange): void;
12
14
  static ɵfac: i0.ɵɵFactoryDeclaration<ObjectClippingComponent, never>;
13
15
  static ɵcmp: i0.ɵɵComponentDeclaration<ObjectClippingComponent, "app-object-clipping", never, {}, {}, never, never>;
@@ -19,7 +19,7 @@ export declare class ShareLinkDialogComponent implements AfterViewInit {
19
19
  ngAfterViewInit(): void;
20
20
  onClose(): void;
21
21
  getEmbedLink(urlParametersString?: string): string;
22
- setOptionValue(option: string, value: string): void;
22
+ setOptionValue(option: string, value: string | boolean): void;
23
23
  onOptionsChange(): void;
24
24
  copyText(text: string, element: HTMLElement): void;
25
25
  updateQRCode(link: string): void;
@@ -1,14 +1,15 @@
1
1
  import type { QueryList } from '@angular/core';
2
2
  import { EventDisplayService } from '../../../../services/event-display.service';
3
3
  import * as i0 from "@angular/core";
4
+ export declare type TreeMenuNode = {
5
+ name: string;
6
+ geometryId: string;
7
+ children?: TreeMenuNode[];
8
+ };
4
9
  export declare class TreeMenuItemComponent {
5
10
  private eventDisplay;
6
11
  children: QueryList<TreeMenuItemComponent>;
7
- node: {
8
- name: string;
9
- geometryId: string;
10
- children: [];
11
- };
12
+ node: TreeMenuNode;
12
13
  isExpanded: boolean;
13
14
  visible: boolean;
14
15
  constructor(eventDisplay: EventDisplayService);
@@ -1,18 +1,8 @@
1
1
  import { OnInit } from '@angular/core';
2
+ import { TreeMenuNode } from './tree-menu-item/tree-menu-item.component';
2
3
  import * as i0 from "@angular/core";
3
4
  export declare class TreeMenuComponent implements OnInit {
4
- rootNode: {
5
- name: string;
6
- geometryId: string;
7
- children: {
8
- name: string;
9
- geometryId: string;
10
- children: {
11
- name: string;
12
- geometryId: string;
13
- }[];
14
- }[];
15
- };
5
+ rootNode: TreeMenuNode;
16
6
  constructor();
17
7
  ngOnInit(): void;
18
8
  static ɵfac: i0.ɵɵFactoryDeclaration<TreeMenuComponent, never>;
@@ -8,9 +8,9 @@ import * as i5 from "../ui-menu/animate-camera/animate-camera.component";
8
8
  import * as i6 from "./experiment-link/experiment-link.component";
9
9
  export class EmbedMenuComponent {
10
10
  }
11
- EmbedMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: EmbedMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
- EmbedMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: EmbedMenuComponent, selector: "app-embed-menu", ngImport: i0, template: "<div id=\"embedMenu\">\n <div id=\"embedMenuInner\">\n <app-dark-theme></app-dark-theme>\n <app-auto-rotate></app-auto-rotate>\n <app-main-view-toggle></app-main-view-toggle>\n <app-animate-event></app-animate-event>\n <app-animate-camera></app-animate-camera>\n <app-experiment-link></app-experiment-link>\n </div>\n</div>\n", styles: ["#embedMenu{display:none}#embedMenu #embedMenuInner{display:flex;position:absolute;left:1rem;bottom:1rem;background:var(--phoenix-background-color-secondary);border:1px solid var(--phoenix-background-color-tertiary);box-shadow:var(--phoenix-box-shadow);border-radius:30px;padding:.25rem 0}\n"], components: [{ type: i1.DarkThemeComponent, selector: "app-dark-theme" }, { type: i2.AutoRotateComponent, selector: "app-auto-rotate" }, { type: i3.MainViewToggleComponent, selector: "app-main-view-toggle" }, { type: i4.AnimateEventComponent, selector: "app-animate-event" }, { type: i5.AnimateCameraComponent, selector: "app-animate-camera", inputs: ["animationPresets"] }, { type: i6.ExperimentLinkComponent, selector: "app-experiment-link" }] });
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: EmbedMenuComponent, decorators: [{
11
+ EmbedMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: EmbedMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
+ EmbedMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: EmbedMenuComponent, selector: "app-embed-menu", ngImport: i0, template: "<div id=\"embedMenu\">\n <div id=\"embedMenuInner\">\n <app-dark-theme></app-dark-theme>\n <app-auto-rotate></app-auto-rotate>\n <app-main-view-toggle></app-main-view-toggle>\n <app-animate-event></app-animate-event>\n <app-animate-camera></app-animate-camera>\n <app-experiment-link></app-experiment-link>\n </div>\n</div>\n", styles: ["#embedMenu{display:none}#embedMenu #embedMenuInner{display:flex;position:absolute;left:1rem;bottom:1rem;background:var(--phoenix-background-color-secondary);border:1px solid var(--phoenix-background-color-tertiary);box-shadow:var(--phoenix-box-shadow);border-radius:30px;padding:.25rem 0}\n"], components: [{ type: i1.DarkThemeComponent, selector: "app-dark-theme" }, { type: i2.AutoRotateComponent, selector: "app-auto-rotate" }, { type: i3.MainViewToggleComponent, selector: "app-main-view-toggle" }, { type: i4.AnimateEventComponent, selector: "app-animate-event" }, { type: i5.AnimateCameraComponent, selector: "app-animate-camera", inputs: ["animationPresets"] }, { type: i6.ExperimentLinkComponent, selector: "app-experiment-link" }] });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: EmbedMenuComponent, decorators: [{
14
14
  type: Component,
15
15
  args: [{ selector: 'app-embed-menu', template: "<div id=\"embedMenu\">\n <div id=\"embedMenuInner\">\n <app-dark-theme></app-dark-theme>\n <app-auto-rotate></app-auto-rotate>\n <app-main-view-toggle></app-main-view-toggle>\n <app-animate-event></app-animate-event>\n <app-animate-camera></app-animate-camera>\n <app-experiment-link></app-experiment-link>\n </div>\n</div>\n", styles: ["#embedMenu{display:none}#embedMenu #embedMenuInner{display:flex;position:absolute;left:1rem;bottom:1rem;background:var(--phoenix-background-color-secondary);border:1px solid var(--phoenix-background-color-tertiary);box-shadow:var(--phoenix-box-shadow);border-radius:30px;padding:.25rem 0}\n"] }]
16
16
  }] });
@@ -9,9 +9,9 @@ export class ExperimentLinkComponent {
9
9
  window.open(this.experimentLink, '_blank');
10
10
  }
11
11
  }
12
- ExperimentLinkComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ExperimentLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
- ExperimentLinkComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: ExperimentLinkComponent, selector: "app-experiment-link", ngImport: i0, template: "<app-menu-toggle\n tooltip=\"See full event display\"\n icon=\"link\"\n (click)=\"goToExperiment()\"\n></app-menu-toggle>\n", styles: [""], components: [{ type: i1.MenuToggleComponent, selector: "app-menu-toggle", inputs: ["icon", "active", "tooltip", "disabled"] }] });
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ExperimentLinkComponent, decorators: [{
12
+ ExperimentLinkComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ExperimentLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
+ ExperimentLinkComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: ExperimentLinkComponent, selector: "app-experiment-link", ngImport: i0, template: "<app-menu-toggle\n tooltip=\"See full event display\"\n icon=\"link\"\n (click)=\"goToExperiment()\"\n></app-menu-toggle>\n", styles: [""], components: [{ type: i1.MenuToggleComponent, selector: "app-menu-toggle", inputs: ["icon", "active", "tooltip", "disabled"] }] });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ExperimentLinkComponent, decorators: [{
15
15
  type: Component,
16
16
  args: [{ selector: 'app-experiment-link', template: "<app-menu-toggle\n tooltip=\"See full event display\"\n icon=\"link\"\n (click)=\"goToExperiment()\"\n></app-menu-toggle>\n", styles: [""] }]
17
17
  }] });
@@ -0,0 +1,49 @@
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { NestedTreeControl } from '@angular/cdk/tree';
3
+ import { MatTreeNestedDataSource } from '@angular/material/tree';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/cdk/tree";
6
+ import * as i2 from "@angular/material/button";
7
+ export class FileNode {
8
+ constructor(name) {
9
+ this.name = name;
10
+ }
11
+ }
12
+ export class FileExplorerComponent {
13
+ constructor() {
14
+ this.onFileSelect = new EventEmitter();
15
+ this.treeControl = new NestedTreeControl(this.getSortedChildren.bind(this));
16
+ this.dataSource = new MatTreeNestedDataSource();
17
+ this.hasChildren = (_, node) => !!node.children && Object.keys(node.children).length > 0;
18
+ }
19
+ ngOnChanges(changes) {
20
+ if (changes.rootFileNode?.currentValue) {
21
+ this.dataSource.data = this.getSortedChildren(changes.rootFileNode.currentValue);
22
+ }
23
+ }
24
+ onSelect(url) {
25
+ this.onFileSelect.emit(url);
26
+ }
27
+ /**
28
+ * Sort the FileNode's children with folders before files.
29
+ * @param node FileNode whose children are to be sorted.
30
+ * @returns An array of sorted FileNodes.
31
+ */
32
+ getSortedChildren(node) {
33
+ if (!node.children) {
34
+ return [];
35
+ }
36
+ return Object.values(node.children).sort((a, b) => !a.url && b.url ? -1 : 1);
37
+ }
38
+ }
39
+ FileExplorerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: FileExplorerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
40
+ FileExplorerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: FileExplorerComponent, selector: "app-file-explorer", inputs: { rootFileNode: "rootFileNode" }, outputs: { onFileSelect: "onFileSelect" }, usesOnChanges: true, ngImport: i0, template: "<cdk-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <cdk-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <button\n mat-button\n mat-stroked-button\n class=\"tree-node-button\"\n (click)=\"onSelect(node.url)\"\n >\n <svg class=\"node-icon\">\n <use href=\"assets/icons/file.svg#file\"></use>\n </svg>\n {{ node.name }}\n </button>\n </cdk-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let node; when: hasChildren\"\n class=\"tree-node\"\n >\n <button\n mat-button\n cdkTreeNodeToggle\n class=\"tree-node-button\"\n [attr.aria-label]=\"'Toggle ' + node.name\"\n >\n <svg\n class=\"node-icon\"\n [class.node-icon-filled]=\"!treeControl.isExpanded(node)\"\n >\n <use href=\"assets/icons/folder.svg#folder\"></use>\n </svg>\n {{ node.name }}\n </button>\n <div [class.file-tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".file-tree-invisible{display:none}.tree-node{display:block;margin:.25rem 0}.tree-node .tree-node{padding-left:1rem}.tree-node-button{outline:none;padding:0 .75rem}.node-icon{width:1rem;height:1rem;margin-right:.25rem;margin-top:-2px}.node-icon.node-icon-filled{--icon-fill: var(--phoenix-options-icon-path, #fff)}\n"], components: [{ type: i1.CdkTree, selector: "cdk-tree", inputs: ["dataSource", "treeControl", "trackBy"], exportAs: ["cdkTree"] }, { type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1.CdkTreeNodeDef, selector: "[cdkTreeNodeDef]", inputs: ["cdkTreeNodeDefWhen"] }, { type: i1.CdkTreeNode, selector: "cdk-tree-node", inputs: ["role"], exportAs: ["cdkTreeNode"] }, { type: i1.CdkNestedTreeNode, selector: "cdk-nested-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["cdkNestedTreeNode"] }, { type: i1.CdkTreeNodeToggle, selector: "[cdkTreeNodeToggle]", inputs: ["cdkTreeNodeToggleRecursive"] }, { type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }] });
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: FileExplorerComponent, decorators: [{
42
+ type: Component,
43
+ args: [{ selector: 'app-file-explorer', template: "<cdk-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n <!-- This is the tree node template for leaf nodes -->\n <cdk-tree-node *cdkTreeNodeDef=\"let node\" class=\"tree-node\">\n <button\n mat-button\n mat-stroked-button\n class=\"tree-node-button\"\n (click)=\"onSelect(node.url)\"\n >\n <svg class=\"node-icon\">\n <use href=\"assets/icons/file.svg#file\"></use>\n </svg>\n {{ node.name }}\n </button>\n </cdk-tree-node>\n <!-- This is the tree node template for expandable nodes -->\n <cdk-nested-tree-node\n *cdkTreeNodeDef=\"let node; when: hasChildren\"\n class=\"tree-node\"\n >\n <button\n mat-button\n cdkTreeNodeToggle\n class=\"tree-node-button\"\n [attr.aria-label]=\"'Toggle ' + node.name\"\n >\n <svg\n class=\"node-icon\"\n [class.node-icon-filled]=\"!treeControl.isExpanded(node)\"\n >\n <use href=\"assets/icons/folder.svg#folder\"></use>\n </svg>\n {{ node.name }}\n </button>\n <div [class.file-tree-invisible]=\"!treeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n</cdk-tree>\n", styles: [".file-tree-invisible{display:none}.tree-node{display:block;margin:.25rem 0}.tree-node .tree-node{padding-left:1rem}.tree-node-button{outline:none;padding:0 .75rem}.node-icon{width:1rem;height:1rem;margin-right:.25rem;margin-top:-2px}.node-icon.node-icon-filled{--icon-fill: var(--phoenix-options-icon-path, #fff)}\n"] }]
44
+ }], propDecorators: { rootFileNode: [{
45
+ type: Input
46
+ }], onFileSelect: [{
47
+ type: Output
48
+ }] } });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1leHBsb3Jlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvY29tcG9uZW50cy9maWxlLWV4cGxvcmVyL2ZpbGUtZXhwbG9yZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvZmlsZS1leHBsb3Jlci9maWxlLWV4cGxvcmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFFakUsTUFBTSxPQUFPLFFBQVE7SUFLbkIsWUFBWSxJQUFhO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQU9ELE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFPWSxpQkFBWSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRTFFLGdCQUFXLEdBQUcsSUFBSSxpQkFBaUIsQ0FDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbEMsQ0FBQztRQUNGLGVBQVUsR0FBRyxJQUFJLHVCQUF1QixFQUFZLENBQUM7UUFVckQsZ0JBQVcsR0FBRyxDQUFDLENBQVMsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBb0I1RDtJQTdCQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtZQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQzNDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNsQyxDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBS0QsUUFBUSxDQUFDLEdBQVc7UUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFjO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNoRCxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDekIsQ0FBQztJQUNKLENBQUM7O2tIQXJDVSxxQkFBcUI7c0dBQXJCLHFCQUFxQixtS0MxQmxDLDJzQ0F1Q0E7MkZEYmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjs4QkFLcEIsWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZXN0ZWRUcmVlQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay90cmVlJztcbmltcG9ydCB7IE1hdFRyZWVOZXN0ZWREYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlTm9kZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiB7IFtrZXk6IHN0cmluZ106IEZpbGVOb2RlIH07XG5cbiAgY29uc3RydWN0b3IobmFtZT86IHN0cmluZykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gIH1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZpbGUtZXhwbG9yZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1leHBsb3Jlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtZXhwbG9yZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZUV4cGxvcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgcm9vdEZpbGVOb2RlOiBGaWxlTm9kZTtcbiAgQE91dHB1dCgpIG9uRmlsZVNlbGVjdDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICB0cmVlQ29udHJvbCA9IG5ldyBOZXN0ZWRUcmVlQ29udHJvbDxGaWxlTm9kZT4oXG4gICAgdGhpcy5nZXRTb3J0ZWRDaGlsZHJlbi5iaW5kKHRoaXMpXG4gICk7XG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZU5lc3RlZERhdGFTb3VyY2U8RmlsZU5vZGU+KCk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnJvb3RGaWxlTm9kZT8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZ2V0U29ydGVkQ2hpbGRyZW4oXG4gICAgICAgIGNoYW5nZXMucm9vdEZpbGVOb2RlLmN1cnJlbnRWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBoYXNDaGlsZHJlbiA9IChfOiBudW1iZXIsIG5vZGU6IEZpbGVOb2RlKSA9PlxuICAgICEhbm9kZS5jaGlsZHJlbiAmJiBPYmplY3Qua2V5cyhub2RlLmNoaWxkcmVuKS5sZW5ndGggPiAwO1xuXG4gIG9uU2VsZWN0KHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5vbkZpbGVTZWxlY3QuZW1pdCh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvcnQgdGhlIEZpbGVOb2RlJ3MgY2hpbGRyZW4gd2l0aCBmb2xkZXJzIGJlZm9yZSBmaWxlcy5cbiAgICogQHBhcmFtIG5vZGUgRmlsZU5vZGUgd2hvc2UgY2hpbGRyZW4gYXJlIHRvIGJlIHNvcnRlZC5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc29ydGVkIEZpbGVOb2Rlcy5cbiAgICovXG4gIGdldFNvcnRlZENoaWxkcmVuKG5vZGU6IEZpbGVOb2RlKTogRmlsZU5vZGVbXSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobm9kZS5jaGlsZHJlbikuc29ydCgoYSwgYikgPT5cbiAgICAgICFhLnVybCAmJiBiLnVybCA/IC0xIDogMVxuICAgICk7XG4gIH1cbn1cbiIsIjxjZGstdHJlZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW3RyZWVDb250cm9sXT1cInRyZWVDb250cm9sXCI+XG4gIDwhLS0gVGhpcyBpcyB0aGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciBsZWFmIG5vZGVzIC0tPlxuICA8Y2RrLXRyZWUtbm9kZSAqY2RrVHJlZU5vZGVEZWY9XCJsZXQgbm9kZVwiIGNsYXNzPVwidHJlZS1ub2RlXCI+XG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWJ1dHRvblxuICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICBjbGFzcz1cInRyZWUtbm9kZS1idXR0b25cIlxuICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0KG5vZGUudXJsKVwiXG4gICAgPlxuICAgICAgPHN2ZyBjbGFzcz1cIm5vZGUtaWNvblwiPlxuICAgICAgICA8dXNlIGhyZWY9XCJhc3NldHMvaWNvbnMvZmlsZS5zdmcjZmlsZVwiPjwvdXNlPlxuICAgICAgPC9zdmc+XG4gICAgICB7eyBub2RlLm5hbWUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9jZGstdHJlZS1ub2RlPlxuICA8IS0tIFRoaXMgaXMgdGhlIHRyZWUgbm9kZSB0ZW1wbGF0ZSBmb3IgZXhwYW5kYWJsZSBub2RlcyAtLT5cbiAgPGNkay1uZXN0ZWQtdHJlZS1ub2RlXG4gICAgKmNka1RyZWVOb2RlRGVmPVwibGV0IG5vZGU7IHdoZW46IGhhc0NoaWxkcmVuXCJcbiAgICBjbGFzcz1cInRyZWUtbm9kZVwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtYnV0dG9uXG4gICAgICBjZGtUcmVlTm9kZVRvZ2dsZVxuICAgICAgY2xhc3M9XCJ0cmVlLW5vZGUtYnV0dG9uXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1RvZ2dsZSAnICsgbm9kZS5uYW1lXCJcbiAgICA+XG4gICAgICA8c3ZnXG4gICAgICAgIGNsYXNzPVwibm9kZS1pY29uXCJcbiAgICAgICAgW2NsYXNzLm5vZGUtaWNvbi1maWxsZWRdPVwiIXRyZWVDb250cm9sLmlzRXhwYW5kZWQobm9kZSlcIlxuICAgICAgPlxuICAgICAgICA8dXNlIGhyZWY9XCJhc3NldHMvaWNvbnMvZm9sZGVyLnN2ZyNmb2xkZXJcIj48L3VzZT5cbiAgICAgIDwvc3ZnPlxuICAgICAge3sgbm9kZS5uYW1lIH19XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBbY2xhc3MuZmlsZS10cmVlLWludmlzaWJsZV09XCIhdHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBjZGtUcmVlTm9kZU91dGxldD48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9jZGstbmVzdGVkLXRyZWUtbm9kZT5cbjwvY2RrLXRyZWU+XG4iXX0=
@@ -6,9 +6,9 @@ export class LoaderComponent {
6
6
  this.loaded = false;
7
7
  }
8
8
  }
9
- LoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: LoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
- LoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: LoaderComponent, selector: "app-loader", inputs: { loaded: "loaded", progress: "progress" }, ngImport: i0, template: "<div\n class=\"loader-wrapper d-flex position-absolute flex-column justify-content-center align-items-center w-100 h-100 text-center\"\n [ngClass]=\"{ 'load-complete': loaded }\"\n>\n <img src=\"assets/images/logo-small.svg\" alt=\"Loader\" />\n <p class=\"mt-5\">\n Loading...<br />\n <small class=\"text-muted\">(This may take a while)</small>\n </p>\n <div class=\"loading-bar\" *ngIf=\"progress !== undefined\">\n <span [style]=\"{ width: progress + '%' }\"></span>\n </div>\n</div>\n", styles: [".loader-wrapper{background:var(--phoenix-background-color);z-index:9998}.loader-wrapper.load-complete{display:none!important}.loader-wrapper img{width:5rem;height:5rem;animation:loader 2s infinite}.loader-wrapper p{color:var(--phoenix-text-color)}.loader-wrapper .loading-bar{width:15rem;max-width:90%;height:.5rem;background:var(--phoenix-background-color-tertiary);border-radius:2.5rem;overflow:hidden}.loader-wrapper .loading-bar span{display:block;height:100%;border-radius:2.5rem;background:linear-gradient(to right,var(--phoenix-primary),var(--phoenix-secondary));transition:all .5s}@keyframes loader{0%,to{transform:scale(.1) rotate(0)}95%{transform:scale(1) rotate(15deg)}}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
11
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: LoaderComponent, decorators: [{
9
+ LoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
+ LoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: LoaderComponent, selector: "app-loader", inputs: { loaded: "loaded", progress: "progress" }, ngImport: i0, template: "<div\n class=\"loader-wrapper d-flex position-absolute flex-column justify-content-center align-items-center w-100 h-100 text-center\"\n [ngClass]=\"{ 'load-complete': loaded }\"\n>\n <img src=\"assets/images/logo-small.svg\" alt=\"Loader\" />\n <p class=\"mt-5\">\n Loading...<br />\n <small class=\"text-muted\">(This may take a while)</small>\n </p>\n <div class=\"loading-bar\" *ngIf=\"progress !== undefined\">\n <span [style]=\"{ width: progress + '%' }\"></span>\n </div>\n</div>\n", styles: [".loader-wrapper{background:var(--phoenix-background-color);z-index:9998}.loader-wrapper.load-complete{display:none!important}.loader-wrapper img{width:5rem;height:5rem;animation:loader 2s infinite}.loader-wrapper p{color:var(--phoenix-text-color)}.loader-wrapper .loading-bar{width:15rem;max-width:90%;height:.5rem;background:var(--phoenix-background-color-tertiary);border-radius:2.5rem;overflow:hidden}.loader-wrapper .loading-bar span{display:block;height:100%;border-radius:2.5rem;background:linear-gradient(to right,var(--phoenix-primary),var(--phoenix-secondary));transition:all .5s}@keyframes loader{0%,to{transform:scale(.1) rotate(0)}95%{transform:scale(1) rotate(15deg)}}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: LoaderComponent, decorators: [{
12
12
  type: Component,
13
13
  args: [{ selector: 'app-loader', template: "<div\n class=\"loader-wrapper d-flex position-absolute flex-column justify-content-center align-items-center w-100 h-100 text-center\"\n [ngClass]=\"{ 'load-complete': loaded }\"\n>\n <img src=\"assets/images/logo-small.svg\" alt=\"Loader\" />\n <p class=\"mt-5\">\n Loading...<br />\n <small class=\"text-muted\">(This may take a while)</small>\n </p>\n <div class=\"loading-bar\" *ngIf=\"progress !== undefined\">\n <span [style]=\"{ width: progress + '%' }\"></span>\n </div>\n</div>\n", styles: [".loader-wrapper{background:var(--phoenix-background-color);z-index:9998}.loader-wrapper.load-complete{display:none!important}.loader-wrapper img{width:5rem;height:5rem;animation:loader 2s infinite}.loader-wrapper p{color:var(--phoenix-text-color)}.loader-wrapper .loading-bar{width:15rem;max-width:90%;height:.5rem;background:var(--phoenix-background-color-tertiary);border-radius:2.5rem;overflow:hidden}.loader-wrapper .loading-bar span{display:block;height:100%;border-radius:2.5rem;background:linear-gradient(to right,var(--phoenix-primary),var(--phoenix-secondary));transition:all .5s}@keyframes loader{0%,to{transform:scale(.1) rotate(0)}95%{transform:scale(1) rotate(15deg)}}\n"] }]
14
14
  }], propDecorators: { loaded: [{
@@ -5,9 +5,9 @@ export class NavComponent {
5
5
  constructor() { }
6
6
  ngOnInit() { }
7
7
  }
8
- NavComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
- NavComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: NavComponent, selector: "app-nav", ngImport: i0, template: "<a id=\"mainLogo\" class=\"main-logo fixed-top p-2 mx-auto mt-2\" routerLink=\"/\">\n <img src=\"assets/images/logo-text.svg\" />\n</a>\n", styles: [".main-logo{width:140px;z-index:9999}.main-logo img{transition:all .5s}.main-logo:hover img{filter:drop-shadow(0px 0px 10px var(--phoenix-text-color));transition:all .5s}\n"], directives: [{ type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NavComponent, decorators: [{
8
+ NavComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ NavComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: NavComponent, selector: "app-nav", ngImport: i0, template: "<a id=\"mainLogo\" class=\"main-logo fixed-top p-2 mx-auto mt-2\" routerLink=\"/\">\n <img src=\"assets/images/logo-text.svg\" />\n</a>\n", styles: [".main-logo{width:140px;z-index:9999}.main-logo img{transition:all .5s}.main-logo:hover img{filter:drop-shadow(0px 0px 10px var(--phoenix-text-color));transition:all .5s}\n"], directives: [{ type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }] });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NavComponent, decorators: [{
11
11
  type: Component,
12
12
  args: [{ selector: 'app-nav', template: "<a id=\"mainLogo\" class=\"main-logo fixed-top p-2 mx-auto mt-2\" routerLink=\"/\">\n <img src=\"assets/images/logo-text.svg\" />\n</a>\n", styles: [".main-logo{width:140px;z-index:9999}.main-logo img{transition:all .5s}.main-logo:hover img{filter:drop-shadow(0px 0px 10px var(--phoenix-text-color));transition:all .5s}\n"] }]
13
13
  }], ctorParameters: function () { return []; } });
@@ -17,9 +17,9 @@ export class ConfigSliderComponent {
17
17
  }
18
18
  }
19
19
  }
20
- ConfigSliderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ConfigSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
- ConfigSliderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: ConfigSliderComponent, selector: "app-config-slider", inputs: { value: "value", min: "min", max: "max", step: "step", allowCustomValue: "allowCustomValue" }, outputs: { onChange: "onChange" }, ngImport: i0, template: "<div class=\"d-flex flex-row align-items-center\">\n <mat-slider\n #configSlider\n class=\"mx-2\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n thumbLabel\n (click)=\"$event.stopPropagation()\"\n (input)=\"onValueChange($event.value)\"\n >\n </mat-slider>\n <input\n #configSliderInput\n *ngIf=\"allowCustomValue\"\n class=\"config-slider-input\"\n type=\"number\"\n [value]=\"value\"\n (input)=\"onValueChange($event.target.value)\"\n />\n</div>\n", styles: [".config-slider-input{background:transparent;color:var(--phoenix-text-color);border:none;border-bottom:1px solid var(--phoenix-text-color);width:25%;-moz-appearance:textfield}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none}\n"], components: [{ type: i1.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "displayWith", "valueText", "vertical"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: ConfigSliderComponent, decorators: [{
20
+ ConfigSliderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ConfigSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
+ ConfigSliderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: ConfigSliderComponent, selector: "app-config-slider", inputs: { value: "value", min: "min", max: "max", step: "step", allowCustomValue: "allowCustomValue" }, outputs: { onChange: "onChange" }, ngImport: i0, template: "<div class=\"d-flex flex-row align-items-center\">\n <mat-slider\n #configSlider\n class=\"mx-2\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n thumbLabel\n (click)=\"$event.stopPropagation()\"\n (input)=\"onValueChange($event.value)\"\n >\n </mat-slider>\n <input\n #configSliderInput\n *ngIf=\"allowCustomValue\"\n class=\"config-slider-input\"\n type=\"number\"\n [value]=\"value\"\n (input)=\"onValueChange($event.target.value)\"\n />\n</div>\n", styles: [".config-slider-input{background:transparent;color:var(--phoenix-text-color);border:none;border-bottom:1px solid var(--phoenix-text-color);width:25%;-moz-appearance:textfield}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none}\n"], components: [{ type: i1.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "displayWith", "valueText", "vertical"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: ConfigSliderComponent, decorators: [{
23
23
  type: Component,
24
24
  args: [{ selector: 'app-config-slider', template: "<div class=\"d-flex flex-row align-items-center\">\n <mat-slider\n #configSlider\n class=\"mx-2\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n thumbLabel\n (click)=\"$event.stopPropagation()\"\n (input)=\"onValueChange($event.value)\"\n >\n </mat-slider>\n <input\n #configSliderInput\n *ngIf=\"allowCustomValue\"\n class=\"config-slider-input\"\n type=\"number\"\n [value]=\"value\"\n (input)=\"onValueChange($event.target.value)\"\n />\n</div>\n", styles: [".config-slider-input{background:transparent;color:var(--phoenix-text-color);border:none;border-bottom:1px solid var(--phoenix-text-color);width:25%;-moz-appearance:textfield}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none}\n"] }]
25
25
  }], propDecorators: { value: [{
@@ -4,7 +4,7 @@ import * as i1 from "@angular/material/slide-toggle";
4
4
  import * as i2 from "@angular/material/checkbox";
5
5
  import * as i3 from "../config/config-slider/config-slider.component";
6
6
  import * as i4 from "@angular/material/button";
7
- import * as i5 from "@angular-slider/ngx-slider";
7
+ import * as i5 from "@rp3e11/ngx-slider";
8
8
  import * as i6 from "@angular/common";
9
9
  export class PhoenixMenuItemComponent {
10
10
  constructor(cdr) {
@@ -17,16 +17,20 @@ export class PhoenixMenuItemComponent {
17
17
  this.cdr.detectChanges();
18
18
  }
19
19
  }
20
+ // Casting to `any` as a workaround to bypass strict template checks.
21
+ castConfigsToAny(configs) {
22
+ return configs;
23
+ }
20
24
  }
21
- PhoenixMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: PhoenixMenuItemComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
22
- PhoenixMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: PhoenixMenuItemComponent, selector: "app-phoenix-menu-item", inputs: { currentNode: "currentNode" }, viewQueries: [{ propertyName: "phoenixMenuItem", first: true, predicate: ["phoenixMenuItem"], descendants: true }], ngImport: i0, template: "<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of currentNode.configs\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n", styles: [".phoenix-menu-item{width:100%;padding:.6rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color);font-size:.8rem;transition:all .5s;display:flex;justify-content:space-between;align-items:center}.phoenix-menu-item-left{display:flex;justify-content:flex-start;min-width:0;padding-right:.5rem;overflow:hidden}.phoenix-menu-item-left .item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phoenix-menu-item-left .item-icon{margin-right:.2rem}.phoenix-menu-item-right{display:flex;justify-content:flex-end}.phoenix-menu-item-right .item-expand.expanded{transform:scaleY(-1)}.phoenix-menu-item-right .item-settings{margin-right:.2rem}.phoenix-menu-item-right .item-config-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:110}.phoenix-menu-item-right .item-config{position:absolute;margin-top:-5rem;right:100%;width:14rem;padding:.5rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color-secondary);box-shadow:var(--phoenix-box-shadow);display:flex;flex-direction:column;z-index:120}.phoenix-menu-item-right .item-config>*{margin-bottom:.4rem}.phoenix-menu-item-right .item-config>*:last-child{margin-bottom:0}.phoenix-menu-item-right .item-config .item-config-single{display:flex;flex-direction:row}.phoenix-menu-item-right .item-config .item-config-single .item-config-label{width:30%}.phoenix-menu-item-right .item-config .item-config-single .item-config-data{flex-grow:1;padding-left:.5rem}.phoenix-menu-item .icon-wrapper{display:inline-block;width:1.3rem;height:1.3rem;padding:.23rem;transition:all .4s}.phoenix-menu-item .icon-wrapper.icon-button:hover{background:var(--phoenix-options-icon-bg);border-radius:40%;cursor:pointer}.phoenix-menu-item .icon-wrapper svg{width:100%;height:100%;vertical-align:top}.phoenix-menu-item .mat-slide-toggle-bar{width:30px!important}.phoenix-menu-item .mat-slide-toggle-thumb{width:15px!important;height:15px!important;position:absolute;top:2px}.phoenix-menu-item .mat-slider-horizontal{min-width:0;width:100%;height:20px}.phoenix-menu-item .mat-slider-horizontal .mat-slider-wrapper{top:10px}.phoenix-menu-item label.mat-checkbox-layout{margin:0}@media screen and (max-width: 768px){.phoenix-menu-item{font-size:.75rem;padding:.5rem}.phoenix-menu-item .icon-wrapper{width:1rem;height:1rem;padding:.15rem}}.phoenix-menu-children{margin-left:.5rem;border-left:1px solid var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-bar{background:var(--phoenix-text-color-secondary);height:.2rem}.range-slider.ngx-slider .ngx-slider-selection{background:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer{width:1rem;height:1rem;top:-.45rem;bottom:0;background-color:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer:after{display:none}.range-slider.ngx-slider .ngx-slider-bubble{color:var(--phoenix-text-color);font-size:.8rem}.range-slider.ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:var(--phoenix-text-color-secondary)}\n"], components: [{ type: i1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3.ConfigSliderComponent, selector: "app-config-slider", inputs: ["value", "min", "max", "step", "allowCustomValue"], outputs: ["onChange"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.ɵa, selector: "ngx-slider", inputs: ["value", "highValue", "options", "manualRefresh", "triggerFocus"], outputs: ["valueChange", "highValueChange", "userChangeStart", "userChange", "userChangeEnd"] }, { type: PhoenixMenuItemComponent, selector: "app-phoenix-menu-item", inputs: ["currentNode"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], encapsulation: i0.ViewEncapsulation.None });
23
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: PhoenixMenuItemComponent, decorators: [{
25
+ PhoenixMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: PhoenixMenuItemComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
26
+ PhoenixMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: PhoenixMenuItemComponent, selector: "app-phoenix-menu-item", inputs: { currentNode: "currentNode" }, viewQueries: [{ propertyName: "phoenixMenuItem", first: true, predicate: ["phoenixMenuItem"], descendants: true }], ngImport: i0, template: "<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of castConfigsToAny(currentNode.configs)\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n", styles: [".phoenix-menu-item{width:100%;padding:.6rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color);font-size:.8rem;transition:all .5s;display:flex;justify-content:space-between;align-items:center}.phoenix-menu-item-left{display:flex;justify-content:flex-start;min-width:0;padding-right:.5rem;overflow:hidden}.phoenix-menu-item-left .item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phoenix-menu-item-left .item-icon{margin-right:.2rem}.phoenix-menu-item-right{display:flex;justify-content:flex-end}.phoenix-menu-item-right .item-expand.expanded{transform:scaleY(-1)}.phoenix-menu-item-right .item-settings{margin-right:.2rem}.phoenix-menu-item-right .item-config-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:110}.phoenix-menu-item-right .item-config{position:absolute;margin-top:-5rem;right:100%;width:14rem;padding:.5rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color-secondary);box-shadow:var(--phoenix-box-shadow);display:flex;flex-direction:column;z-index:120}.phoenix-menu-item-right .item-config>*{margin-bottom:.4rem}.phoenix-menu-item-right .item-config>*:last-child{margin-bottom:0}.phoenix-menu-item-right .item-config .item-config-single{display:flex;flex-direction:row}.phoenix-menu-item-right .item-config .item-config-single .item-config-label{width:30%}.phoenix-menu-item-right .item-config .item-config-single .item-config-data{flex-grow:1;padding-left:.5rem}.phoenix-menu-item .icon-wrapper{display:inline-block;width:1.3rem;height:1.3rem;padding:.23rem;transition:all .4s}.phoenix-menu-item .icon-wrapper.icon-button:hover{background:var(--phoenix-options-icon-bg);border-radius:40%;cursor:pointer}.phoenix-menu-item .icon-wrapper svg{width:100%;height:100%;vertical-align:top}.phoenix-menu-item .mat-slide-toggle-bar{width:30px!important}.phoenix-menu-item .mat-slide-toggle-thumb{width:15px!important;height:15px!important;position:absolute;top:2px}.phoenix-menu-item .mat-slider-horizontal{min-width:0;width:100%;height:20px}.phoenix-menu-item .mat-slider-horizontal .mat-slider-wrapper{top:10px}.phoenix-menu-item label.mat-checkbox-layout{margin:0}@media screen and (max-width: 768px){.phoenix-menu-item{font-size:.75rem;padding:.5rem}.phoenix-menu-item .icon-wrapper{width:1rem;height:1rem;padding:.15rem}}.phoenix-menu-children{margin-left:.5rem;border-left:1px solid var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-bar{background:var(--phoenix-text-color-secondary);height:.2rem}.range-slider.ngx-slider .ngx-slider-selection{background:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer{width:1rem;height:1rem;top:-.45rem;bottom:0;background-color:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer:after{display:none}.range-slider.ngx-slider .ngx-slider-bubble{color:var(--phoenix-text-color);font-size:.8rem}.range-slider.ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:var(--phoenix-text-color-secondary)}\n"], components: [{ type: i1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3.ConfigSliderComponent, selector: "app-config-slider", inputs: ["value", "min", "max", "step", "allowCustomValue"], outputs: ["onChange"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.SliderComponent, selector: "ngx-slider", inputs: ["value", "highValue", "options", "manualRefresh", "triggerFocus"], outputs: ["valueChange", "highValueChange", "userChangeStart", "userChange", "userChangeEnd"] }, { type: PhoenixMenuItemComponent, selector: "app-phoenix-menu-item", inputs: ["currentNode"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], encapsulation: i0.ViewEncapsulation.None });
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: PhoenixMenuItemComponent, decorators: [{
24
28
  type: Component,
25
- args: [{ selector: 'app-phoenix-menu-item', encapsulation: ViewEncapsulation.None, template: "<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of currentNode.configs\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n", styles: [".phoenix-menu-item{width:100%;padding:.6rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color);font-size:.8rem;transition:all .5s;display:flex;justify-content:space-between;align-items:center}.phoenix-menu-item-left{display:flex;justify-content:flex-start;min-width:0;padding-right:.5rem;overflow:hidden}.phoenix-menu-item-left .item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phoenix-menu-item-left .item-icon{margin-right:.2rem}.phoenix-menu-item-right{display:flex;justify-content:flex-end}.phoenix-menu-item-right .item-expand.expanded{transform:scaleY(-1)}.phoenix-menu-item-right .item-settings{margin-right:.2rem}.phoenix-menu-item-right .item-config-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:110}.phoenix-menu-item-right .item-config{position:absolute;margin-top:-5rem;right:100%;width:14rem;padding:.5rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color-secondary);box-shadow:var(--phoenix-box-shadow);display:flex;flex-direction:column;z-index:120}.phoenix-menu-item-right .item-config>*{margin-bottom:.4rem}.phoenix-menu-item-right .item-config>*:last-child{margin-bottom:0}.phoenix-menu-item-right .item-config .item-config-single{display:flex;flex-direction:row}.phoenix-menu-item-right .item-config .item-config-single .item-config-label{width:30%}.phoenix-menu-item-right .item-config .item-config-single .item-config-data{flex-grow:1;padding-left:.5rem}.phoenix-menu-item .icon-wrapper{display:inline-block;width:1.3rem;height:1.3rem;padding:.23rem;transition:all .4s}.phoenix-menu-item .icon-wrapper.icon-button:hover{background:var(--phoenix-options-icon-bg);border-radius:40%;cursor:pointer}.phoenix-menu-item .icon-wrapper svg{width:100%;height:100%;vertical-align:top}.phoenix-menu-item .mat-slide-toggle-bar{width:30px!important}.phoenix-menu-item .mat-slide-toggle-thumb{width:15px!important;height:15px!important;position:absolute;top:2px}.phoenix-menu-item .mat-slider-horizontal{min-width:0;width:100%;height:20px}.phoenix-menu-item .mat-slider-horizontal .mat-slider-wrapper{top:10px}.phoenix-menu-item label.mat-checkbox-layout{margin:0}@media screen and (max-width: 768px){.phoenix-menu-item{font-size:.75rem;padding:.5rem}.phoenix-menu-item .icon-wrapper{width:1rem;height:1rem;padding:.15rem}}.phoenix-menu-children{margin-left:.5rem;border-left:1px solid var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-bar{background:var(--phoenix-text-color-secondary);height:.2rem}.range-slider.ngx-slider .ngx-slider-selection{background:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer{width:1rem;height:1rem;top:-.45rem;bottom:0;background-color:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer:after{display:none}.range-slider.ngx-slider .ngx-slider-bubble{color:var(--phoenix-text-color);font-size:.8rem}.range-slider.ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:var(--phoenix-text-color-secondary)}\n"] }]
29
+ args: [{ selector: 'app-phoenix-menu-item', encapsulation: ViewEncapsulation.None, template: "<div class=\"phoenix-menu-item\" #phoenixMenuItem>\n <div class=\"phoenix-menu-item-left align-items-center\">\n <!-- If the item has some toggle function -->\n <ng-container *ngIf=\"currentNode.onToggle; else nodeName\">\n <mat-slide-toggle\n [checked]=\"currentNode.toggleState\"\n (change)=\"currentNode.toggleSelfAndDescendants($event.checked)\"\n >\n <ng-container *ngTemplateOutlet=\"nodeName\"></ng-container>\n </mat-slide-toggle>\n </ng-container>\n <!-- If the item has no toggle function -->\n <ng-template #nodeName>\n <span class=\"d-flex w-100 align-items-center\">\n <span *ngIf=\"currentNode.icon\" class=\"icon-wrapper item-icon\">\n <svg>\n <use\n attr.href=\"assets/icons/{{ currentNode.icon }}.svg#{{\n currentNode.icon\n }}\"\n ></use>\n </svg>\n </span>\n <span class=\"item-name\" [title]=\"currentNode.name\">{{\n currentNode.name\n }}</span>\n </span>\n </ng-template>\n </div>\n <div class=\"phoenix-menu-item-right\">\n <div *ngIf=\"currentNode.configs.length > 0\">\n <button\n class=\"icon-wrapper icon-button btn-blank item-settings\"\n (click)=\"\n calculateConfigTop();\n currentNode.configActive = !currentNode.configActive\n \"\n >\n <svg>\n <use href=\"assets/icons/gear.svg#gear\"></use>\n </svg>\n </button>\n <div\n class=\"item-config-backdrop\"\n *ngIf=\"currentNode.configActive\"\n (click)=\"currentNode.configActive = false\"\n ></div>\n <div\n class=\"item-config\"\n [hidden]=\"!currentNode.configActive\"\n [ngStyle]=\"{ 'top.px': configTop }\"\n >\n <ng-container\n *ngFor=\"let config of castConfigsToAny(currentNode.configs)\"\n [ngSwitch]=\"config.type\"\n >\n <!-- Config types -->\n <label class=\"item-config-single\" *ngIf=\"!config.hidden\">\n <span\n class=\"item-config-label\"\n *ngIf=\"config.type !== 'button'\"\n [ngClass]=\"{ 'font-weight-bold w-100': config.type === 'label' }\"\n >\n {{ config.label }}\n </span>\n <div\n class=\"item-config-data\"\n [ngClass]=\"{ 'p-0': config.type === 'button' }\"\n *ngIf=\"config.type !== 'label'\"\n >\n <mat-checkbox\n *ngSwitchCase=\"'checkbox'\"\n [checked]=\"config.isChecked\"\n (change)=\"\n config.onChange($event.checked);\n config.isChecked = $event.checked\n \"\n ></mat-checkbox>\n\n <app-config-slider\n *ngSwitchCase=\"'slider'\"\n [value]=\"config.value\"\n (onChange)=\"config.onChange($event); config.value = $event\"\n [min]=\"config.min\"\n [max]=\"config.max\"\n [step]=\"config.step\"\n [allowCustomValue]=\"config.allowCustomValue\"\n >\n </app-config-slider>\n\n <button\n *ngSwitchCase=\"'button'\"\n class=\"w-100\"\n (click)=\"config.onClick()\"\n mat-button\n mat-stroked-button\n >\n {{ config.label }}\n </button>\n\n <input\n *ngSwitchCase=\"'color'\"\n type=\"color\"\n [value]=\"config.color\"\n (input)=\"\n config.onChange($event.target.value);\n config.color = $event.target.value\n \"\n />\n\n <ngx-slider\n *ngSwitchCase=\"'rangeSlider'\"\n class=\"range-slider\"\n [value]=\"config.value ? config.value : config.min\"\n [highValue]=\"config.highValue ? config.highValue : config.max\"\n (userChange)=\"\n config.onChange($event);\n config.value = $event.value;\n config.highValue = $event.highValue\n \"\n [options]=\"{\n floor: config.min,\n ceil: config.max,\n step: config.step,\n animate: false\n }\"\n ></ngx-slider>\n\n <select\n *ngSwitchCase=\"'select'\"\n class=\"w-100\"\n (change)=\"config.onChange($event.target.value)\"\n >\n <option\n *ngFor=\"let singleOption of config.options\"\n [value]=\"singleOption\"\n >\n {{ singleOption }}\n </option>\n </select>\n </div>\n </label>\n <!-- Config types END -->\n </ng-container>\n </div>\n </div>\n <button\n class=\"icon-wrapper icon-button btn-blank item-expand\"\n *ngIf=\"currentNode.children.length > 0\"\n (click)=\"currentNode.childrenActive = !currentNode.childrenActive\"\n [ngClass]=\"{ expanded: currentNode.childrenActive }\"\n >\n <svg>\n <use href=\"assets/icons/expand.svg#expand\"></use>\n </svg>\n </button>\n </div>\n</div>\n<div class=\"phoenix-menu-children\" *ngIf=\"currentNode.childrenActive\">\n <app-phoenix-menu-item\n *ngFor=\"let childNode of currentNode.children\"\n [currentNode]=\"childNode\"\n >\n </app-phoenix-menu-item>\n</div>\n", styles: [".phoenix-menu-item{width:100%;padding:.6rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color);font-size:.8rem;transition:all .5s;display:flex;justify-content:space-between;align-items:center}.phoenix-menu-item-left{display:flex;justify-content:flex-start;min-width:0;padding-right:.5rem;overflow:hidden}.phoenix-menu-item-left .item-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.phoenix-menu-item-left .item-icon{margin-right:.2rem}.phoenix-menu-item-right{display:flex;justify-content:flex-end}.phoenix-menu-item-right .item-expand.expanded{transform:scaleY(-1)}.phoenix-menu-item-right .item-settings{margin-right:.2rem}.phoenix-menu-item-right .item-config-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:110}.phoenix-menu-item-right .item-config{position:absolute;margin-top:-5rem;right:100%;width:14rem;padding:.5rem;background:var(--phoenix-background-color-secondary);color:var(--phoenix-text-color-secondary);box-shadow:var(--phoenix-box-shadow);display:flex;flex-direction:column;z-index:120}.phoenix-menu-item-right .item-config>*{margin-bottom:.4rem}.phoenix-menu-item-right .item-config>*:last-child{margin-bottom:0}.phoenix-menu-item-right .item-config .item-config-single{display:flex;flex-direction:row}.phoenix-menu-item-right .item-config .item-config-single .item-config-label{width:30%}.phoenix-menu-item-right .item-config .item-config-single .item-config-data{flex-grow:1;padding-left:.5rem}.phoenix-menu-item .icon-wrapper{display:inline-block;width:1.3rem;height:1.3rem;padding:.23rem;transition:all .4s}.phoenix-menu-item .icon-wrapper.icon-button:hover{background:var(--phoenix-options-icon-bg);border-radius:40%;cursor:pointer}.phoenix-menu-item .icon-wrapper svg{width:100%;height:100%;vertical-align:top}.phoenix-menu-item .mat-slide-toggle-bar{width:30px!important}.phoenix-menu-item .mat-slide-toggle-thumb{width:15px!important;height:15px!important;position:absolute;top:2px}.phoenix-menu-item .mat-slider-horizontal{min-width:0;width:100%;height:20px}.phoenix-menu-item .mat-slider-horizontal .mat-slider-wrapper{top:10px}.phoenix-menu-item label.mat-checkbox-layout{margin:0}@media screen and (max-width: 768px){.phoenix-menu-item{font-size:.75rem;padding:.5rem}.phoenix-menu-item .icon-wrapper{width:1rem;height:1rem;padding:.15rem}}.phoenix-menu-children{margin-left:.5rem;border-left:1px solid var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-bar{background:var(--phoenix-text-color-secondary);height:.2rem}.range-slider.ngx-slider .ngx-slider-selection{background:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer{width:1rem;height:1rem;top:-.45rem;bottom:0;background-color:var(--phoenix-accent)}.range-slider.ngx-slider .ngx-slider-pointer:after{display:none}.range-slider.ngx-slider .ngx-slider-bubble{color:var(--phoenix-text-color);font-size:.8rem}.range-slider.ngx-slider .ngx-slider-bubble.ngx-slider-limit{color:var(--phoenix-text-color-secondary)}\n"] }]
26
30
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { currentNode: [{
27
31
  type: Input
28
32
  }], phoenixMenuItem: [{
29
33
  type: ViewChild,
30
34
  args: ['phoenixMenuItem']
31
35
  }] } });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvZW5peC1tZW51LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvcGhvZW5peC1tZW51L3BoZW9uaXgtbWVudS1pdGVtL3Bob2VuaXgtbWVudS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYi9jb21wb25lbnRzL3Bob2VuaXgtbWVudS9waGVvbml4LW1lbnUtaXRlbS9waG9lbml4LW1lbnUtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN2QixNQUFNLE9BQU8sd0JBQXdCO0lBS25DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUU5QyxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxTQUFTO2dCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDOztxSEFiVSx3QkFBd0I7eUdBQXhCLHdCQUF3Qix5TkNoQnJDLDhtTEFxS0Esc3RJRHJKYSx3QkFBd0I7MkZBQXhCLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSx1QkFBdUIsaUJBR2xCLGlCQUFpQixDQUFDLElBQUk7d0dBRzVCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ3dCLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBQaG9lbml4TWVudU5vZGUgfSBmcm9tICdwaG9lbml4LWV2ZW50LWRpc3BsYXknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcGhvZW5peC1tZW51LWl0ZW0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcGhvZW5peC1tZW51LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9waG9lbml4LW1lbnUtaXRlbS5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQaG9lbml4TWVudUl0ZW1Db21wb25lbnQge1xuICBASW5wdXQoKSBjdXJyZW50Tm9kZTogUGhvZW5peE1lbnVOb2RlO1xuICBAVmlld0NoaWxkKCdwaG9lbml4TWVudUl0ZW0nKSBwaG9lbml4TWVudUl0ZW06IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBjb25maWdUb3A6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgY2FsY3VsYXRlQ29uZmlnVG9wKCkge1xuICAgIGlmICh0aGlzLnBob2VuaXhNZW51SXRlbSkge1xuICAgICAgdGhpcy5jb25maWdUb3AgPVxuICAgICAgICB0aGlzLnBob2VuaXhNZW51SXRlbS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwaG9lbml4LW1lbnUtaXRlbVwiICNwaG9lbml4TWVudUl0ZW0+XG4gIDxkaXYgY2xhc3M9XCJwaG9lbml4LW1lbnUtaXRlbS1sZWZ0IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgIDwhLS0gSWYgdGhlIGl0ZW0gaGFzIHNvbWUgdG9nZ2xlIGZ1bmN0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50Tm9kZS5vblRvZ2dsZTsgZWxzZSBub2RlTmFtZVwiPlxuICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgW2NoZWNrZWRdPVwiY3VycmVudE5vZGUudG9nZ2xlU3RhdGVcIlxuICAgICAgICAoY2hhbmdlKT1cImN1cnJlbnROb2RlLnRvZ2dsZVNlbGZBbmREZXNjZW5kYW50cygkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZU5hbWVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIElmIHRoZSBpdGVtIGhhcyBubyB0b2dnbGUgZnVuY3Rpb24gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNub2RlTmFtZT5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZC1mbGV4IHctMTAwIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImN1cnJlbnROb2RlLmljb25cIiBjbGFzcz1cImljb24td3JhcHBlciBpdGVtLWljb25cIj5cbiAgICAgICAgICA8c3ZnPlxuICAgICAgICAgICAgPHVzZVxuICAgICAgICAgICAgICBhdHRyLmhyZWY9XCJhc3NldHMvaWNvbnMve3sgY3VycmVudE5vZGUuaWNvbiB9fS5zdmcje3tcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5pY29uXG4gICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgID48L3VzZT5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tbmFtZVwiIFt0aXRsZV09XCJjdXJyZW50Tm9kZS5uYW1lXCI+e3tcbiAgICAgICAgICBjdXJyZW50Tm9kZS5uYW1lXG4gICAgICAgIH19PC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicGhvZW5peC1tZW51LWl0ZW0tcmlnaHRcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudE5vZGUuY29uZmlncy5sZW5ndGggPiAwXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiaWNvbi13cmFwcGVyIGljb24tYnV0dG9uIGJ0bi1ibGFuayBpdGVtLXNldHRpbmdzXCJcbiAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgIGNhbGN1bGF0ZUNvbmZpZ1RvcCgpO1xuICAgICAgICAgIGN1cnJlbnROb2RlLmNvbmZpZ0FjdGl2ZSA9ICFjdXJyZW50Tm9kZS5jb25maWdBY3RpdmVcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPHN2Zz5cbiAgICAgICAgICA8dXNlIGhyZWY9XCJhc3NldHMvaWNvbnMvZ2Vhci5zdmcjZ2VhclwiPjwvdXNlPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIml0ZW0tY29uZmlnLWJhY2tkcm9wXCJcbiAgICAgICAgKm5nSWY9XCJjdXJyZW50Tm9kZS5jb25maWdBY3RpdmVcIlxuICAgICAgICAoY2xpY2spPVwiY3VycmVudE5vZGUuY29uZmlnQWN0aXZlID0gZmFsc2VcIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIml0ZW0tY29uZmlnXCJcbiAgICAgICAgW2hpZGRlbl09XCIhY3VycmVudE5vZGUuY29uZmlnQWN0aXZlXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyAndG9wLnB4JzogY29uZmlnVG9wIH1cIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbmZpZyBvZiBjdXJyZW50Tm9kZS5jb25maWdzXCJcbiAgICAgICAgICBbbmdTd2l0Y2hdPVwiY29uZmlnLnR5cGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBDb25maWcgdHlwZXMgLS0+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiaXRlbS1jb25maWctc2luZ2xlXCIgKm5nSWY9XCIhY29uZmlnLmhpZGRlblwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLWNvbmZpZy1sYWJlbFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnR5cGUgIT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZm9udC13ZWlnaHQtYm9sZCB3LTEwMCc6IGNvbmZpZy50eXBlID09PSAnbGFiZWwnIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLWNvbmZpZy1kYXRhXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC0wJzogY29uZmlnLnR5cGUgPT09ICdidXR0b24nIH1cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbmZpZy50eXBlICE9PSAnbGFiZWwnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjb25maWcuaXNDaGVja2VkXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgY29uZmlnLm9uQ2hhbmdlKCRldmVudC5jaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy5pc0NoZWNrZWQgPSAkZXZlbnQuY2hlY2tlZFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID48L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgICA8YXBwLWNvbmZpZy1zbGlkZXJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3NsaWRlcidcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb25maWcudmFsdWVcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJjb25maWcub25DaGFuZ2UoJGV2ZW50KTsgY29uZmlnLnZhbHVlID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICBbbWluXT1cImNvbmZpZy5taW5cIlxuICAgICAgICAgICAgICAgIFttYXhdPVwiY29uZmlnLm1heFwiXG4gICAgICAgICAgICAgICAgW3N0ZXBdPVwiY29uZmlnLnN0ZXBcIlxuICAgICAgICAgICAgICAgIFthbGxvd0N1c3RvbVZhbHVlXT1cImNvbmZpZy5hbGxvd0N1c3RvbVZhbHVlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2FwcC1jb25maWctc2xpZGVyPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maWcub25DbGljaygpXCJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidjb2xvcidcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmZpZy5jb2xvclwiXG4gICAgICAgICAgICAgICAgKGlucHV0KT1cIlxuICAgICAgICAgICAgICAgICAgY29uZmlnLm9uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbG9yID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgPG5neC1zbGlkZXJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3JhbmdlU2xpZGVyJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyYW5nZS1zbGlkZXJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjb25maWcudmFsdWUgPyBjb25maWcudmFsdWUgOiBjb25maWcubWluXCJcbiAgICAgICAgICAgICAgICBbaGlnaFZhbHVlXT1cImNvbmZpZy5oaWdoVmFsdWUgPyBjb25maWcuaGlnaFZhbHVlIDogY29uZmlnLm1heFwiXG4gICAgICAgICAgICAgICAgKHVzZXJDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICBjb25maWcub25DaGFuZ2UoJGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWx1ZSA9ICRldmVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy5oaWdoVmFsdWUgPSAkZXZlbnQuaGlnaFZhbHVlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ7XG4gICAgICAgICAgICAgICAgICBmbG9vcjogY29uZmlnLm1pbixcbiAgICAgICAgICAgICAgICAgIGNlaWw6IGNvbmZpZy5tYXgsXG4gICAgICAgICAgICAgICAgICBzdGVwOiBjb25maWcuc3RlcCxcbiAgICAgICAgICAgICAgICAgIGFuaW1hdGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgID48L25neC1zbGlkZXI+XG5cbiAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjb25maWcub25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNpbmdsZU9wdGlvbiBvZiBjb25maWcub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2luZ2xlT3B0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBzaW5nbGVPcHRpb24gfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwhLS0gQ29uZmlnIHR5cGVzIEVORCAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImljb24td3JhcHBlciBpY29uLWJ1dHRvbiBidG4tYmxhbmsgaXRlbS1leHBhbmRcIlxuICAgICAgKm5nSWY9XCJjdXJyZW50Tm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwXCJcbiAgICAgIChjbGljayk9XCJjdXJyZW50Tm9kZS5jaGlsZHJlbkFjdGl2ZSA9ICFjdXJyZW50Tm9kZS5jaGlsZHJlbkFjdGl2ZVwiXG4gICAgICBbbmdDbGFzc109XCJ7IGV4cGFuZGVkOiBjdXJyZW50Tm9kZS5jaGlsZHJlbkFjdGl2ZSB9XCJcbiAgICA+XG4gICAgICA8c3ZnPlxuICAgICAgICA8dXNlIGhyZWY9XCJhc3NldHMvaWNvbnMvZXhwYW5kLnN2ZyNleHBhbmRcIj48L3VzZT5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInBob2VuaXgtbWVudS1jaGlsZHJlblwiICpuZ0lmPVwiY3VycmVudE5vZGUuY2hpbGRyZW5BY3RpdmVcIj5cbiAgPGFwcC1waG9lbml4LW1lbnUtaXRlbVxuICAgICpuZ0Zvcj1cImxldCBjaGlsZE5vZGUgb2YgY3VycmVudE5vZGUuY2hpbGRyZW5cIlxuICAgIFtjdXJyZW50Tm9kZV09XCJjaGlsZE5vZGVcIlxuICA+XG4gIDwvYXBwLXBob2VuaXgtbWVudS1pdGVtPlxuPC9kaXY+XG4iXX0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvZW5peC1tZW51LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL2NvbXBvbmVudHMvcGhvZW5peC1tZW51L3BoZW9uaXgtbWVudS1pdGVtL3Bob2VuaXgtbWVudS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYi9jb21wb25lbnRzL3Bob2VuaXgtbWVudS9waGVvbml4LW1lbnUtaXRlbS9waG9lbml4LW1lbnUtaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULEtBQUssRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN2QixNQUFNLE9BQU8sd0JBQXdCO0lBS25DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO0lBQUcsQ0FBQztJQUU5QyxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxTQUFTO2dCQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLGdCQUFnQixDQUFDLE9BQW1DO1FBQ2xELE9BQU8sT0FBZ0IsQ0FBQztJQUMxQixDQUFDOztxSEFsQlUsd0JBQXdCO3lHQUF4Qix3QkFBd0IseU5DaEJyQyxnb0xBcUtBLG11SURySmEsd0JBQXdCOzJGQUF4Qix3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0UsdUJBQXVCLGlCQUdsQixpQkFBaUIsQ0FBQyxJQUFJO3dHQUc1QixXQUFXO3NCQUFuQixLQUFLO2dCQUN3QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgUGhvZW5peE1lbnVOb2RlIH0gZnJvbSAncGhvZW5peC1ldmVudC1kaXNwbGF5JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXBob2VuaXgtbWVudS1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Bob2VuaXgtbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGhvZW5peC1tZW51LWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgUGhvZW5peE1lbnVJdGVtQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY3VycmVudE5vZGU6IFBob2VuaXhNZW51Tm9kZTtcbiAgQFZpZXdDaGlsZCgncGhvZW5peE1lbnVJdGVtJykgcGhvZW5peE1lbnVJdGVtOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgY29uZmlnVG9wOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGNhbGN1bGF0ZUNvbmZpZ1RvcCgpIHtcbiAgICBpZiAodGhpcy5waG9lbml4TWVudUl0ZW0pIHtcbiAgICAgIHRoaXMuY29uZmlnVG9wID1cbiAgICAgICAgdGhpcy5waG9lbml4TWVudUl0ZW0ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FzdGluZyB0byBgYW55YCBhcyBhIHdvcmthcm91bmQgdG8gYnlwYXNzIHN0cmljdCB0ZW1wbGF0ZSBjaGVja3MuXG4gIGNhc3RDb25maWdzVG9BbnkoY29uZmlnczogUGhvZW5peE1lbnVOb2RlWydjb25maWdzJ10pIHtcbiAgICByZXR1cm4gY29uZmlncyBhcyBhbnlbXTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBob2VuaXgtbWVudS1pdGVtXCIgI3Bob2VuaXhNZW51SXRlbT5cbiAgPGRpdiBjbGFzcz1cInBob2VuaXgtbWVudS1pdGVtLWxlZnQgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgPCEtLSBJZiB0aGUgaXRlbSBoYXMgc29tZSB0b2dnbGUgZnVuY3Rpb24gLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnROb2RlLm9uVG9nZ2xlOyBlbHNlIG5vZGVOYW1lXCI+XG4gICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICBbY2hlY2tlZF09XCJjdXJyZW50Tm9kZS50b2dnbGVTdGF0ZVwiXG4gICAgICAgIChjaGFuZ2UpPVwiY3VycmVudE5vZGUudG9nZ2xlU2VsZkFuZERlc2NlbmRhbnRzKCRldmVudC5jaGVja2VkKVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlTmFtZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gSWYgdGhlIGl0ZW0gaGFzIG5vIHRvZ2dsZSBmdW5jdGlvbiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI25vZGVOYW1lPlxuICAgICAgPHNwYW4gY2xhc3M9XCJkLWZsZXggdy0xMDAgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY3VycmVudE5vZGUuaWNvblwiIGNsYXNzPVwiaWNvbi13cmFwcGVyIGl0ZW0taWNvblwiPlxuICAgICAgICAgIDxzdmc+XG4gICAgICAgICAgICA8dXNlXG4gICAgICAgICAgICAgIGF0dHIuaHJlZj1cImFzc2V0cy9pY29ucy97eyBjdXJyZW50Tm9kZS5pY29uIH19LnN2ZyN7e1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmljb25cbiAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgPjwvdXNlPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1uYW1lXCIgW3RpdGxlXT1cImN1cnJlbnROb2RlLm5hbWVcIj57e1xuICAgICAgICAgIGN1cnJlbnROb2RlLm5hbWVcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJwaG9lbml4LW1lbnUtaXRlbS1yaWdodFwiPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50Tm9kZS5jb25maWdzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJpY29uLXdyYXBwZXIgaWNvbi1idXR0b24gYnRuLWJsYW5rIGl0ZW0tc2V0dGluZ3NcIlxuICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgY2FsY3VsYXRlQ29uZmlnVG9wKCk7XG4gICAgICAgICAgY3VycmVudE5vZGUuY29uZmlnQWN0aXZlID0gIWN1cnJlbnROb2RlLmNvbmZpZ0FjdGl2ZVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8c3ZnPlxuICAgICAgICAgIDx1c2UgaHJlZj1cImFzc2V0cy9pY29ucy9nZWFyLnN2ZyNnZWFyXCI+PC91c2U+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaXRlbS1jb25maWctYmFja2Ryb3BcIlxuICAgICAgICAqbmdJZj1cImN1cnJlbnROb2RlLmNvbmZpZ0FjdGl2ZVwiXG4gICAgICAgIChjbGljayk9XCJjdXJyZW50Tm9kZS5jb25maWdBY3RpdmUgPSBmYWxzZVwiXG4gICAgICA+PC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiaXRlbS1jb25maWdcIlxuICAgICAgICBbaGlkZGVuXT1cIiFjdXJyZW50Tm9kZS5jb25maWdBY3RpdmVcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7ICd0b3AucHgnOiBjb25maWdUb3AgfVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29uZmlnIG9mIGNhc3RDb25maWdzVG9BbnkoY3VycmVudE5vZGUuY29uZmlncylcIlxuICAgICAgICAgIFtuZ1N3aXRjaF09XCJjb25maWcudHlwZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIENvbmZpZyB0eXBlcyAtLT5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpdGVtLWNvbmZpZy1zaW5nbGVcIiAqbmdJZj1cIiFjb25maWcuaGlkZGVuXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0tY29uZmlnLWxhYmVsXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWcudHlwZSAhPT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdmb250LXdlaWdodC1ib2xkIHctMTAwJzogY29uZmlnLnR5cGUgPT09ICdsYWJlbCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNvbmZpZy5sYWJlbCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0tY29uZmlnLWRhdGFcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdwLTAnOiBjb25maWcudHlwZSA9PT0gJ2J1dHRvbicgfVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnR5cGUgIT09ICdsYWJlbCdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImNvbmZpZy5pc0NoZWNrZWRcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICBjb25maWcub25DaGFuZ2UoJGV2ZW50LmNoZWNrZWQpO1xuICAgICAgICAgICAgICAgICAgY29uZmlnLmlzQ2hlY2tlZCA9ICRldmVudC5jaGVja2VkXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvbWF0LWNoZWNrYm94PlxuXG4gICAgICAgICAgICAgIDxhcHAtY29uZmlnLXNsaWRlclxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInc2xpZGVyJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmZpZy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImNvbmZpZy5vbkNoYW5nZSgkZXZlbnQpOyBjb25maWcudmFsdWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwiY29uZmlnLm1pblwiXG4gICAgICAgICAgICAgICAgW21heF09XCJjb25maWcubWF4XCJcbiAgICAgICAgICAgICAgICBbc3RlcF09XCJjb25maWcuc3RlcFwiXG4gICAgICAgICAgICAgICAgW2FsbG93Q3VzdG9tVmFsdWVdPVwiY29uZmlnLmFsbG93Q3VzdG9tVmFsdWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvYXBwLWNvbmZpZy1zbGlkZXI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpZy5vbkNsaWNrKClcIlxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGNvbmZpZy5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2NvbG9yJ1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29uZmlnLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwiXG4gICAgICAgICAgICAgICAgICBjb25maWcub25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICBjb25maWcuY29sb3IgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICA8bmd4LXNsaWRlclxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCIncmFuZ2VTbGlkZXInXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJhbmdlLXNsaWRlclwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbmZpZy52YWx1ZSA/IGNvbmZpZy52YWx1ZSA6IGNvbmZpZy5taW5cIlxuICAgICAgICAgICAgICAgIFtoaWdoVmFsdWVdPVwiY29uZmlnLmhpZ2hWYWx1ZSA/IGNvbmZpZy5oaWdoVmFsdWUgOiBjb25maWcubWF4XCJcbiAgICAgICAgICAgICAgICAodXNlckNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZSgkZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlID0gJGV2ZW50LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgY29uZmlnLmhpZ2hWYWx1ZSA9ICRldmVudC5oaWdoVmFsdWVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIntcbiAgICAgICAgICAgICAgICAgIGZsb29yOiBjb25maWcubWluLFxuICAgICAgICAgICAgICAgICAgY2VpbDogY29uZmlnLm1heCxcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IGNvbmZpZy5zdGVwLFxuICAgICAgICAgICAgICAgICAgYW5pbWF0ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPjwvbmd4LXNsaWRlcj5cblxuICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidzZWxlY3QnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbmZpZy5vbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2luZ2xlT3B0aW9uIG9mIGNvbmZpZy5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzaW5nbGVPcHRpb25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IHNpbmdsZU9wdGlvbiB9fVxuICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPCEtLSBDb25maWcgdHlwZXMgRU5EIC0tPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiaWNvbi13cmFwcGVyIGljb24tYnV0dG9uIGJ0bi1ibGFuayBpdGVtLWV4cGFuZFwiXG4gICAgICAqbmdJZj1cImN1cnJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDBcIlxuICAgICAgKGNsaWNrKT1cImN1cnJlbnROb2RlLmNoaWxkcmVuQWN0aXZlID0gIWN1cnJlbnROb2RlLmNoaWxkcmVuQWN0aXZlXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgZXhwYW5kZWQ6IGN1cnJlbnROb2RlLmNoaWxkcmVuQWN0aXZlIH1cIlxuICAgID5cbiAgICAgIDxzdmc+XG4gICAgICAgIDx1c2UgaHJlZj1cImFzc2V0cy9pY29ucy9leHBhbmQuc3ZnI2V4cGFuZFwiPjwvdXNlPlxuICAgICAgPC9zdmc+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicGhvZW5peC1tZW51LWNoaWxkcmVuXCIgKm5nSWY9XCJjdXJyZW50Tm9kZS5jaGlsZHJlbkFjdGl2ZVwiPlxuICA8YXBwLXBob2VuaXgtbWVudS1pdGVtXG4gICAgKm5nRm9yPVwibGV0IGNoaWxkTm9kZSBvZiBjdXJyZW50Tm9kZS5jaGlsZHJlblwiXG4gICAgW2N1cnJlbnROb2RlXT1cImNoaWxkTm9kZVwiXG4gID5cbiAgPC9hcHAtcGhvZW5peC1tZW51LWl0ZW0+XG48L2Rpdj5cbiJdfQ==