phoenix-ui-components 2.7.0 → 2.10.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 (65) hide show
  1. package/README.md +11 -3
  2. package/dist/README.md +11 -3
  3. package/dist/components/phoenix-menu/index.d.ts +1 -1
  4. package/dist/components/phoenix-menu/{pheonix-menu-item → phoenix-menu-item}/phoenix-menu-item.component.d.ts +0 -0
  5. package/dist/components/phoenix-ui.module.d.ts +60 -58
  6. package/dist/components/ui-menu/cycle-events/cycle-events.component.d.ts +16 -0
  7. package/dist/components/ui-menu/experiment-info/experiment-info.component.d.ts +4 -3
  8. package/dist/components/ui-menu/index.d.ts +2 -0
  9. package/dist/components/ui-menu/ui-menu-wrapper/ui-menu-wrapper.component.d.ts +6 -0
  10. package/dist/components/ui-menu/ui-menu.component.d.ts +0 -1
  11. package/dist/esm2020/components/embed-menu/embed-menu.component.mjs +3 -3
  12. package/dist/esm2020/components/embed-menu/experiment-link/experiment-link.component.mjs +3 -3
  13. package/dist/esm2020/components/file-explorer/file-explorer.component.mjs +3 -3
  14. package/dist/esm2020/components/loader/loader.component.mjs +3 -3
  15. package/dist/esm2020/components/nav/nav.component.mjs +3 -3
  16. package/dist/esm2020/components/phoenix-menu/config/config-slider/config-slider.component.mjs +3 -3
  17. package/dist/esm2020/components/phoenix-menu/index.mjs +2 -2
  18. package/dist/esm2020/components/phoenix-menu/phoenix-menu-item/phoenix-menu-item.component.mjs +36 -0
  19. package/dist/esm2020/components/phoenix-menu/phoenix-menu.component.mjs +4 -4
  20. package/dist/esm2020/components/phoenix-ui.module.mjs +14 -8
  21. package/dist/esm2020/components/ring-loader/ring-loader.component.mjs +3 -3
  22. package/dist/esm2020/components/ui-menu/animate-camera/animate-camera.component.mjs +7 -8
  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/cycle-events/cycle-events.component.mjs +36 -0
  29. package/dist/esm2020/components/ui-menu/dark-theme/dark-theme.component.mjs +3 -3
  30. package/dist/esm2020/components/ui-menu/event-data-explorer/event-data-explorer-dialog/event-data-explorer-dialog.component.mjs +3 -3
  31. package/dist/esm2020/components/ui-menu/event-data-explorer/event-data-explorer.component.mjs +3 -3
  32. package/dist/esm2020/components/ui-menu/event-selector/event-selector.component.mjs +3 -3
  33. package/dist/esm2020/components/ui-menu/experiment-info/experiment-info.component.mjs +9 -7
  34. package/dist/esm2020/components/ui-menu/index.mjs +3 -1
  35. package/dist/esm2020/components/ui-menu/info-panel/info-panel-overlay/info-panel-overlay.component.mjs +3 -3
  36. package/dist/esm2020/components/ui-menu/info-panel/info-panel.component.mjs +3 -3
  37. package/dist/esm2020/components/ui-menu/io-options/io-options-dialog/io-options-dialog.component.mjs +3 -3
  38. package/dist/esm2020/components/ui-menu/io-options/io-options.component.mjs +3 -3
  39. package/dist/esm2020/components/ui-menu/main-view-toggle/main-view-toggle.component.mjs +3 -3
  40. package/dist/esm2020/components/ui-menu/menu-toggle/menu-toggle.component.mjs +3 -3
  41. package/dist/esm2020/components/ui-menu/object-clipping/object-clipping.component.mjs +5 -5
  42. package/dist/esm2020/components/ui-menu/object-selection/object-selection-overlay/object-selection-overlay.component.mjs +3 -3
  43. package/dist/esm2020/components/ui-menu/object-selection/object-selection.component.mjs +3 -3
  44. package/dist/esm2020/components/ui-menu/overlay/overlay.component.mjs +3 -3
  45. package/dist/esm2020/components/ui-menu/overlay-view/overlay-view-window/overlay-view-window.component.mjs +3 -3
  46. package/dist/esm2020/components/ui-menu/overlay-view/overlay-view.component.mjs +3 -3
  47. package/dist/esm2020/components/ui-menu/performance-toggle/performance-toggle.component.mjs +3 -3
  48. package/dist/esm2020/components/ui-menu/share-link/share-link-dialog/share-link-dialog.component.mjs +3 -3
  49. package/dist/esm2020/components/ui-menu/share-link/share-link.component.mjs +3 -3
  50. package/dist/esm2020/components/ui-menu/ss-mode/ss-mode.component.mjs +4 -4
  51. package/dist/esm2020/components/ui-menu/tree-menu/tree-menu-item/tree-menu-item.component.mjs +3 -3
  52. package/dist/esm2020/components/ui-menu/tree-menu/tree-menu.component.mjs +3 -3
  53. package/dist/esm2020/components/ui-menu/ui-menu-wrapper/ui-menu-wrapper.component.mjs +16 -0
  54. package/dist/esm2020/components/ui-menu/ui-menu.component.mjs +25 -27
  55. package/dist/esm2020/components/ui-menu/view-options/view-options.component.mjs +3 -3
  56. package/dist/esm2020/components/ui-menu/vr-toggle/vr-toggle.component.mjs +3 -3
  57. package/dist/esm2020/components/ui-menu/zoom-controls/zoom-controls.component.mjs +3 -3
  58. package/dist/esm2020/services/event-display.service.mjs +3 -3
  59. package/dist/esm2020/services/extras/attribute.pipe.mjs +3 -3
  60. package/dist/fesm2015/phoenix-ui-components.mjs +201 -151
  61. package/dist/fesm2015/phoenix-ui-components.mjs.map +1 -1
  62. package/dist/fesm2020/phoenix-ui-components.mjs +201 -151
  63. package/dist/fesm2020/phoenix-ui-components.mjs.map +1 -1
  64. package/package.json +6 -6
  65. package/dist/esm2020/components/phoenix-menu/pheonix-menu-item/phoenix-menu-item.component.mjs +0 -36
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phoenix-ui-components",
3
- "version": "2.7.0",
3
+ "version": "2.10.0",
4
4
  "description": "Reusable Angular components of the Phoenix event display application.",
5
5
  "author": "Phoenix contributors (https://github.com/HSF/phoenix/graphs/contributors)",
6
6
  "license": "Apache-2.0",
@@ -25,13 +25,13 @@
25
25
  "zone.js": "*"
26
26
  },
27
27
  "dependencies": {
28
- "@angular/cdk": "^13.2.3",
29
- "@angular/material": "^13.2.3",
28
+ "@angular/cdk": "^13.3.7",
29
+ "@angular/material": "^13.3.7",
30
30
  "@rp3e11/ngx-slider": "^13.0.1",
31
31
  "css-element-queries": "^1.2.3",
32
32
  "qrcode": "1.5.0",
33
- "three": "^0.137.5",
34
- "tslib": "^2.3.1"
33
+ "three": "^0.140.2",
34
+ "tslib": "^2.4.0"
35
35
  },
36
36
  "module": "dist/fesm2015/phoenix-ui-components.mjs",
37
37
  "es2020": "dist/fesm2020/phoenix-ui-components.mjs",
@@ -40,5 +40,5 @@
40
40
  "fesm2015": "dist/fesm2015/phoenix-ui-components.mjs",
41
41
  "typings": "dist/phoenix-ui-components.d.ts",
42
42
  "sideEffects": false,
43
- "gitHead": "5c18db3f3df95d50af0830e452845d143b2bf380"
43
+ "gitHead": "0fdd6528570a58d48309b403def502373ca5e7f2"
44
44
  }
@@ -1,36 +0,0 @@
1
- import { Component, Input, ViewChild, ViewEncapsulation, } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/material/slide-toggle";
4
- import * as i2 from "@angular/material/checkbox";
5
- import * as i3 from "../config/config-slider/config-slider.component";
6
- import * as i4 from "@angular/material/button";
7
- import * as i5 from "@rp3e11/ngx-slider";
8
- import * as i6 from "@angular/common";
9
- export class PhoenixMenuItemComponent {
10
- constructor(cdr) {
11
- this.cdr = cdr;
12
- }
13
- calculateConfigTop() {
14
- if (this.phoenixMenuItem) {
15
- this.configTop =
16
- this.phoenixMenuItem.nativeElement.getBoundingClientRect().top;
17
- this.cdr.detectChanges();
18
- }
19
- }
20
- // Casting to `any` as a workaround to bypass strict template checks.
21
- castConfigsToAny(configs) {
22
- return configs;
23
- }
24
- }
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: [{
28
- type: Component,
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"] }]
30
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { currentNode: [{
31
- type: Input
32
- }], phoenixMenuItem: [{
33
- type: ViewChild,
34
- args: ['phoenixMenuItem']
35
- }] } });
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==