cloud-ide-layout 0.0.1 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +466 -13
  2. package/esm2022/lib/cloud-ide-layout.routes.mjs +24 -10
  3. package/esm2022/lib/layout/console/console-wrapper/console-wrapper.component.mjs +6 -6
  4. package/esm2022/lib/layout/console/console.service.mjs +28 -0
  5. package/esm2022/lib/layout/footer/footer-wrapper/footer-wrapper.component.mjs +16 -8
  6. package/esm2022/lib/layout/footer/footer.service.mjs +28 -0
  7. package/esm2022/lib/layout/header/header-wrapper/header-wrapper.component.mjs +69 -18
  8. package/esm2022/lib/layout/header/header.service.mjs +17 -6
  9. package/esm2022/lib/layout/home/home-wrapper/home-wrapper.component.mjs +194 -7
  10. package/esm2022/lib/layout/layout/layout-wrapper/layout-wrapper.component.mjs +18 -9
  11. package/esm2022/lib/layout/request/request-wrapper/request-wrapper.component.mjs +54 -6
  12. package/esm2022/lib/layout/request/request.service.mjs +235 -0
  13. package/esm2022/lib/layout/request/tab-content/tab-content.component.mjs +84 -0
  14. package/esm2022/lib/layout/shared/shared-wrapper/shared-wrapper.component.mjs +32 -20
  15. package/esm2022/lib/layout/shared/shared.service.mjs +490 -14
  16. package/esm2022/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.mjs +480 -15
  17. package/esm2022/lib/layout/sidebar/sidebar.service.mjs +20 -7
  18. package/esm2022/lib/layout/sidedrawer/cide-lyt-drawer-base.class.mjs +40 -0
  19. package/esm2022/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.mjs +296 -0
  20. package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.mjs +175 -0
  21. package/esm2022/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.mjs +51 -0
  22. package/esm2022/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.mjs +254 -9
  23. package/esm2022/lib/layout/sidedrawer/sidedrawer.service.mjs +70 -0
  24. package/esm2022/lib/services/app-state/app-state-helper.service.mjs +222 -0
  25. package/esm2022/lib/services/app-state/app-state.service.mjs +256 -0
  26. package/esm2022/lib/services/app-state/index.mjs +3 -0
  27. package/esm2022/lib/services/cache-manager/cache-manager.service.mjs +112 -0
  28. package/esm2022/lib/services/file-manager/file-manager.service.mjs +7 -7
  29. package/esm2022/lib/services/tab-state.service.mjs +128 -0
  30. package/esm2022/lib/services/theme/theme.service.mjs +151 -0
  31. package/esm2022/lib/services/user-status/user-status.service.mjs +135 -0
  32. package/esm2022/lib/utils/custom-route-reuse-strategy.mjs +61 -0
  33. package/esm2022/lib/utils/index.mjs +2 -0
  34. package/esm2022/public-api.mjs +7 -1
  35. package/fesm2022/cloud-ide-layout-cloud-ide-layout-DqL3A73V.mjs +2914 -0
  36. package/fesm2022/cloud-ide-layout-cloud-ide-layout-DqL3A73V.mjs.map +1 -0
  37. package/fesm2022/cloud-ide-layout-drawer-theme.component-xd8IG3WP.mjs +443 -0
  38. package/fesm2022/cloud-ide-layout-drawer-theme.component-xd8IG3WP.mjs.map +1 -0
  39. package/fesm2022/cloud-ide-layout-home-wrapper.component-DEdsEiaq.mjs +197 -0
  40. package/fesm2022/cloud-ide-layout-home-wrapper.component-DEdsEiaq.mjs.map +1 -0
  41. package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-ds12wZbh.mjs +260 -0
  42. package/fesm2022/cloud-ide-layout-sidedrawer-notes.component-ds12wZbh.mjs.map +1 -0
  43. package/fesm2022/cloud-ide-layout.mjs +1 -261
  44. package/fesm2022/cloud-ide-layout.mjs.map +1 -1
  45. package/lib/cloud-ide-layout.routes.d.ts +1 -0
  46. package/lib/layout/console/console-wrapper/console-wrapper.component.d.ts +3 -3
  47. package/lib/layout/console/console.service.d.ts +9 -0
  48. package/lib/layout/footer/footer-wrapper/footer-wrapper.component.d.ts +7 -3
  49. package/lib/layout/footer/footer.service.d.ts +9 -0
  50. package/lib/layout/header/header-wrapper/header-wrapper.component.d.ts +17 -9
  51. package/lib/layout/header/header.service.d.ts +4 -3
  52. package/lib/layout/home/home-wrapper/home-wrapper.component.d.ts +90 -1
  53. package/lib/layout/request/request-wrapper/request-wrapper.component.d.ts +10 -1
  54. package/lib/layout/request/request.service.d.ts +60 -0
  55. package/lib/layout/request/tab-content/tab-content.component.d.ts +19 -0
  56. package/lib/layout/shared/shared-wrapper/shared-wrapper.component.d.ts +4 -5
  57. package/lib/layout/shared/shared.service.d.ts +104 -6
  58. package/lib/layout/sidebar/sidebar-wrapper/sidebar-wrapper.component.d.ts +135 -6
  59. package/lib/layout/sidebar/sidebar.service.d.ts +3 -2
  60. package/lib/layout/sidedrawer/cide-lyt-drawer-base.class.d.ts +16 -0
  61. package/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.d.ts +71 -0
  62. package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.d.ts +48 -0
  63. package/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.d.ts +13 -0
  64. package/lib/layout/sidedrawer/sidedrawer-wrapper/sidedrawer-wrapper.component.d.ts +28 -3
  65. package/lib/layout/sidedrawer/sidedrawer.service.d.ts +30 -0
  66. package/lib/services/app-state/app-state-helper.service.d.ts +150 -0
  67. package/lib/services/app-state/app-state.service.d.ts +85 -0
  68. package/lib/services/app-state/index.d.ts +3 -0
  69. package/lib/services/cache-manager/cache-manager.service.d.ts +64 -0
  70. package/lib/services/file-manager/file-manager.service.d.ts +0 -2
  71. package/lib/services/tab-state.service.d.ts +79 -0
  72. package/lib/services/theme/theme.service.d.ts +71 -0
  73. package/lib/services/user-status/user-status.service.d.ts +57 -0
  74. package/lib/utils/custom-route-reuse-strategy.d.ts +15 -0
  75. package/lib/utils/index.d.ts +1 -0
  76. package/package.json +2 -2
  77. package/public-api.d.ts +4 -0
  78. package/src/lib/assets/css/cide-lyt-style.scss +182 -0
  79. package/src/lib/assets/css/cide-lyt-variable.scss +119 -0
  80. package/fesm2022/cloud-ide-layout-home-wrapper.component-BV7ptL0Y.mjs +0 -14
  81. package/fesm2022/cloud-ide-layout-home-wrapper.component-BV7ptL0Y.mjs.map +0 -1
@@ -1,12 +1,257 @@
1
- import { Component } from '@angular/core';
2
- import { CideIconComponent } from 'cloud-ide-element';
1
+ import { Component, ViewContainerRef, ViewChild, inject, effect } from '@angular/core';
2
+ import { computed } from '@angular/core';
3
+ import { CideEleResizerDirective, CideIconComponent, TooltipDirective } from 'cloud-ide-element';
4
+ import { CideEleSkeletonLoaderComponent } from 'cloud-ide-element';
5
+ import { CideLytSidedrawerService } from '../sidedrawer.service';
6
+ import { take } from 'rxjs';
7
+ import { NgClass, NgFor, NgIf } from '@angular/common';
8
+ import { CideLytRequestService } from '../../request/request.service'; // Import request service
9
+ import { TabStateService } from '../../../services/tab-state.service';
3
10
  import * as i0 from "@angular/core";
4
- export class SidedrawerWrapperComponent {
5
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: SidedrawerWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: SidedrawerWrapperComponent, isStandalone: true, selector: "cide-lyt-sidedrawer-wrapper", ngImport: i0, template: "<nav class=\"cide-sidebar tw-w-6 tw-border-b-gray-200 tw-border-solid tw-border-l tw-absolute tw-justify-between tw-bg-gray-50 tw-h-[calc(100vh-2.5rem)] tw-select-none tw-z-[100] tw-top-9 tw-right-0 tw-flex\">\r\n <cide-ele-icon class=\"tw-my-1\" type=\"none\">info</cide-ele-icon>\r\n</nav>", styles: [""], dependencies: [{ kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }] }); }
11
+ // Type guard for setState/getState
12
+ function hasStateMethods(instance) {
13
+ return !!instance && typeof instance.getState === 'function' && typeof instance.setState === 'function';
7
14
  }
8
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: SidedrawerWrapperComponent, decorators: [{
15
+ // Type guard for NotesComponentState
16
+ function isNotesComponentState(state) {
17
+ return !!state && typeof state === 'object' &&
18
+ 'newNoteModel' in state &&
19
+ 'isFormVisible' in state &&
20
+ 'scrollTop' in state;
21
+ }
22
+ export class CideLytSidedrawerWrapperComponent {
23
+ // Modern Angular v20 pattern: Use Signals directly
24
+ get drawerItems() { return this.sidedrawerService.drawerItems; }
25
+ get notesVisible() { return this.sidedrawerService.notesVisible; }
26
+ // Computed signal to determine if sidedrawer should be visible
27
+ get shouldShowSidedrawer() {
28
+ return computed(() => {
29
+ const items = this.drawerItems();
30
+ return items && items.length > 0;
31
+ });
32
+ }
33
+ constructor() {
34
+ this.sidedrawerSetupData = {
35
+ cide_lyt_sidedrawer_width: 0
36
+ };
37
+ this.isExpanded = false; // New property to track expansion state
38
+ this.currentComponentRef = null;
39
+ this.componentMap = {}; // Map configFor to component
40
+ this.currentTabId = null;
41
+ this.currentActiveComponent = null;
42
+ this.sidedrawerService = inject(CideLytSidedrawerService);
43
+ this.requestService = inject(CideLytRequestService);
44
+ this.tabStateService = inject(TabStateService);
45
+ // Modern Angular v20 pattern: Use Signals directly with effect
46
+ effect(() => {
47
+ const configFor = this.sidedrawerService.activeComponent();
48
+ this.currentActiveComponent = configFor;
49
+ this.loadComponent(configFor);
50
+ }, { allowSignalWrites: true });
51
+ // Effect to track active tab changes
52
+ effect(() => {
53
+ const activeTabId = this.requestService.activeTabId();
54
+ console.log('🔍 SIDEDRAWER - Active tab changed:', activeTabId);
55
+ this.currentTabId = activeTabId;
56
+ if (activeTabId) {
57
+ console.log('🔍 SIDEDRAWER - Loading tab state for:', activeTabId);
58
+ this.tabStateService.getTabState(activeTabId).pipe(take(1)).subscribe(tabState => {
59
+ console.log('🔍 SIDEDRAWER - Tab state loaded:', tabState);
60
+ const sideDrawer = tabState?.componentState.sideDrawer;
61
+ if (sideDrawer) {
62
+ console.log('🔍 SIDEDRAWER - Restoring drawer state:', sideDrawer);
63
+ // Restore activeComponent
64
+ this.sidedrawerService.setActiveComponent(sideDrawer.activeComponent);
65
+ // Modern ES2022+ pattern: Use Promise-based delay with microtask
66
+ Promise.resolve().then(() => {
67
+ if (sideDrawer.activeComponent && this.currentComponentRef && hasStateMethods(this.currentComponentRef.instance)) {
68
+ const compState = sideDrawer.componentState?.[sideDrawer.activeComponent];
69
+ // Add type guards for each component as needed
70
+ if (sideDrawer.activeComponent === 'drowar_notes' && isNotesComponentState(compState)) {
71
+ this.currentComponentRef.instance.setState(compState);
72
+ }
73
+ }
74
+ });
75
+ }
76
+ else {
77
+ console.log('🔍 SIDEDRAWER - No drawer state found, clearing active component');
78
+ this.sidedrawerService.setActiveComponent(null);
79
+ }
80
+ });
81
+ }
82
+ else {
83
+ console.log('🔍 SIDEDRAWER - No active tab, clearing drawer state');
84
+ this.sidedrawerService.setActiveComponent(null);
85
+ }
86
+ }, { allowSignalWrites: true });
87
+ // collecte the width of the sidebar by using the style property
88
+ const cide_lyt_sidedrawer_wrapper_width = parseInt(window.getComputedStyle(document.documentElement).getPropertyValue('--cide-lyt-sidedrawer-wrapper-width'));
89
+ this.sidedrawerSetupData.cide_lyt_sidedrawer_width = (cide_lyt_sidedrawer_wrapper_width);
90
+ }
91
+ ngOnInit() {
92
+ // Initialize the component map (You'd likely populate this from a config or service)
93
+ this.componentMap['drowar_notes'] = () => import('../sidedrawer-notes/sidedrawer-notes.component').then(m => m.CideLytSidedrawerNotesComponent);
94
+ this.componentMap['drawer_theme'] = () => import('../drawer-theme/drawer-theme.component').then(m => m.CideLytDrawerThemeComponent);
95
+ }
96
+ async loadComponent(configFor) {
97
+ console.log('🔍 SIDEDRAWER - Loading component:', configFor, 'Current tab:', this.currentTabId);
98
+ // Always clear the container and destroy the previous component
99
+ this.notesContainer?.clear();
100
+ if (this.currentComponentRef) {
101
+ this.currentComponentRef.destroy();
102
+ this.currentComponentRef = null;
103
+ }
104
+ if (!configFor) {
105
+ console.log('🔍 SIDEDRAWER - No component to load, collapsing');
106
+ this.isExpanded = false;
107
+ this.saveSidedrawerState(null);
108
+ return;
109
+ }
110
+ console.log('🔍 SIDEDRAWER - Expanding and loading:', configFor);
111
+ this.isExpanded = true;
112
+ const componentLoader = this.componentMap[configFor];
113
+ console.log('🔍 SIDEDRAWER - Component loader found:', !!componentLoader);
114
+ if (componentLoader) {
115
+ try {
116
+ console.log('🔍 SIDEDRAWER - Importing component for:', configFor);
117
+ const componentType = await componentLoader();
118
+ console.log('🔍 SIDEDRAWER - Component imported successfully');
119
+ this.currentComponentRef = this.notesContainer.createComponent(componentType);
120
+ console.log('🔍 SIDEDRAWER - Component created successfully');
121
+ // Add the cide-lyt-sidedrawer-wrapper-child class to the created component
122
+ if (this.currentComponentRef.location.nativeElement) {
123
+ this.currentComponentRef.location.nativeElement.classList.add('cide-lyt-sidedrawer-wrapper-child');
124
+ }
125
+ this.setComponentContext(configFor);
126
+ // Optionally restore state here if you have it
127
+ this.saveSidedrawerState(configFor);
128
+ console.log('🔍 SIDEDRAWER - Component setup completed');
129
+ }
130
+ catch (error) {
131
+ console.error(`🚨 SIDEDRAWER - Error loading component for ${configFor}:`, error);
132
+ this.isExpanded = false;
133
+ }
134
+ }
135
+ else {
136
+ console.warn(`⚠️ SIDEDRAWER - No component mapping found for configFor: ${configFor}`);
137
+ console.log('🔍 SIDEDRAWER - Available mappings:', Object.keys(this.componentMap));
138
+ this.isExpanded = false;
139
+ }
140
+ }
141
+ clearComponent(destroy = true) {
142
+ this.saveSidedrawerState();
143
+ this.notesContainer?.clear();
144
+ if (this.currentComponentRef && destroy) {
145
+ this.currentComponentRef.destroy();
146
+ }
147
+ this.currentComponentRef = null;
148
+ }
149
+ saveSidedrawerState(configForOverride) {
150
+ console.log('🔍 SIDEDRAWER - Saving state, current tab:', this.currentTabId);
151
+ if (!this.currentTabId) {
152
+ console.log('⚠️ SIDEDRAWER - No current tab, skipping state save');
153
+ return;
154
+ }
155
+ const activeComponent = configForOverride !== undefined ? configForOverride : this.currentActiveComponent;
156
+ console.log('🔍 SIDEDRAWER - Active component for save:', activeComponent);
157
+ let componentState = undefined;
158
+ if (this.currentComponentRef && hasStateMethods(this.currentComponentRef.instance) && activeComponent) {
159
+ const state = this.currentComponentRef.instance.getState();
160
+ // Add type guards for each component as needed
161
+ if (activeComponent === 'drowar_notes' && isNotesComponentState(state)) {
162
+ componentState = { [activeComponent]: state };
163
+ }
164
+ // Example for other components:
165
+ // else if (activeComponent === 'other_component' && isOtherComponentState(state)) {
166
+ // componentState = { [activeComponent]: state };
167
+ // }
168
+ }
169
+ console.log('🔍 SIDEDRAWER - Updating tab state with:', {
170
+ isOpen: !!activeComponent,
171
+ activeComponent,
172
+ componentState
173
+ });
174
+ this.tabStateService.updateActiveTabState({
175
+ sideDrawer: {
176
+ isOpen: !!activeComponent,
177
+ activeComponent,
178
+ componentState
179
+ }
180
+ });
181
+ }
182
+ setComponentContext(configFor) {
183
+ // You can adjust this logic to pass different context data based on configFor if needed.
184
+ const context = this.getNotesContext(configFor); // Using your existing method for now.
185
+ if (this.currentComponentRef && context && this.currentComponentRef.setInput) {
186
+ // Pass context data
187
+ this.currentComponentRef.setInput('context', context);
188
+ }
189
+ }
190
+ // This function needs to be enhanced to handle contexts for different components
191
+ getNotesContext(configFor) {
192
+ switch (configFor) {
193
+ case 'drowar_notes': {
194
+ // Example for notes component context
195
+ const activeTab = this.requestService.activeTab(); // Use the computed signal for active tab
196
+ return {
197
+ pageId: activeTab?.sytm_page_id_sypg,
198
+ themeId: activeTab?.themeId,
199
+ // Add other properties as needed for notes
200
+ };
201
+ }
202
+ case 'drawer_theme': {
203
+ // You can add theme context here if needed
204
+ return {};
205
+ }
206
+ default:
207
+ return null; // Or a default context if appropriate
208
+ }
209
+ }
210
+ onItemClick(item) {
211
+ const activeTabId = this.requestService.activeTabId();
212
+ console.log('🔍 SIDEDRAWER - Item clicked:', item);
213
+ console.log('🔍 SIDEDRAWER - Active tab ID:', activeTabId);
214
+ // Modern Angular v20 pattern: Use Signals directly
215
+ const activeComponent = this.sidedrawerService.activeComponent();
216
+ console.log('🔍 SIDEDRAWER - Current active component:', activeComponent);
217
+ console.log('🔍 SIDEDRAWER - Item configFor:', item.configFor);
218
+ if (activeComponent === item?.configFor) {
219
+ console.log('🔄 SIDEDRAWER - Same component clicked, toggling off');
220
+ const cide_lyt_sidedrawer_wrapper = document.querySelector('#cide-lyt-sidedrawer-wrapper');
221
+ const cide_lyt_outlet_wrapper = document.querySelector('#cide-lyt-outlet-wrapper');
222
+ if (cide_lyt_sidedrawer_wrapper instanceof HTMLElement && cide_lyt_outlet_wrapper instanceof HTMLElement) {
223
+ const width_of_prev = parseInt(cide_lyt_outlet_wrapper.style.width);
224
+ const width_of_next = parseInt(cide_lyt_sidedrawer_wrapper.style.width);
225
+ const width_of_next_default = 32;
226
+ const width_of_prev_default = width_of_prev + (width_of_next - width_of_next_default);
227
+ cide_lyt_outlet_wrapper.style.width = `${width_of_prev_default}px`;
228
+ cide_lyt_sidedrawer_wrapper.style.width = `${width_of_next_default}px`; // Fix: Cast to HTMLElement to access style property
229
+ }
230
+ this.sidedrawerService.setActiveComponent(null); // Destroy if same
231
+ this.saveSidedrawerState(null);
232
+ }
233
+ else {
234
+ console.log('✅ SIDEDRAWER - New component clicked, setting active:', item.configFor);
235
+ this.sidedrawerService.setActiveComponent(item.configFor); // Set new
236
+ this.saveSidedrawerState(item.configFor);
237
+ }
238
+ }
239
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
240
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: CideLytSidedrawerWrapperComponent, isStandalone: true, selector: "cide-lyt-sidedrawer-wrapper", viewQueries: [{ propertyName: "notesContainer", first: true, predicate: ["notesContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<nav *ngIf=\"shouldShowSidedrawer()\" \r\n [ngClass]=\"{'expanded tw-min-w-[var(--cide-lyt-sidedrawer-wrapper-width-expanded-min)]': isExpanded, 'tw-w-[var(--cide-lyt-sidedrawer-wrapper-width)]': !isExpanded}\"\r\n id=\"cide-lyt-sidedrawer-wrapper\" class=\"tw-flex tw-relative tw-flex-col tw-items-center tw-justify-between tw-h-full tw-bg-white tw-shadow-lg tw-border-l tw-border-gray-200\">\r\n <!-- Resizer Divider -->\r\n <div parentElementSelector=\"#cide-lyt-outlet-sidedrawer-wrapper\"\r\n [minNextSize]=\"sidedrawerSetupData.cide_lyt_sidedrawer_width\" prevElementSelector=\"#cide-lyt-outlet-wrapper\"\r\n nextElementSelector=\"#cide-lyt-sidedrawer-wrapper\" cideEleResizer direction=\"horizontal\" to=\"right-to-left\">\r\n <div class=\"cide-lyt-devider-track tw-w-full tw-h-full\"></div>\r\n </div>\r\n <!-- Main Icon Area -->\r\n <div class=\"tw-flex tw-justify-between tw-h-full tw-w-full\">\r\n <div class=\"tw-w-8 tw-h-full tw-border-r tw-border-gray-200\">\r\n <div class=\"sidedrawer-icon tw-flex tw-flex-col tw-items-center tw-gap-2\">\r\n <ng-container *ngIf=\"drawerItems() as items; else loading\">\r\n <div *ngFor=\"let item of items\" [title]=\"item.title\">\r\n <button (click)=\"onItemClick(item)\"\r\n class=\"tw-p-0 tw-rounded-md hover:tw-bg-gray-100 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n [ngClass]=\"{'tw-bg-blue-100 tw-text-blue-700': sidedrawerService.activeComponent() === item.configFor}\">\r\n <cide-ele-icon [cideEleTooltip]=\"item.title\" tooltipPlacement=\"left\" width=\"1.3rem\" height=\"1.5rem\" type=\"box\">{{item.icon}}</cide-ele-icon>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-template #loading>\r\n <cide-ele-skeleton-loader [width]=\"'2rem'\" [height]=\"'2rem'\" [count]=\"3\"\r\n [circle]=\"true\"></cide-ele-skeleton-loader>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex-1 cide-lyt-sidedrawer-wrapper-child-holder\">\r\n <div #notesContainer class=\"tw-h-full\">\r\n </div>\r\n </div>\r\n </div>\r\n</nav>", styles: [".cide-lyt-sidebar{display:flex;box-shadow:0 4px 12px var(--sidebar-shadow-color);overflow:hidden;background-color:var(--cide-theme-sidebar-color);--sidebar-tooltip-bg: var(--cide-theme-dark-color);--sidebar-tooltip-color: var(--cide-theme-light-color);--sidebar-shadow-color: var(--cide-theme-shadow-color, rgba(0, 0, 0, .05));transition:width .3s cubic-bezier(.4,0,.2,1);max-height:100%;isolation:isolate;will-change:width;position:relative}cide-ele-icon{color:var(--cide-theme-icon-color, var(--tw-gray-500));transition:all .2s ease}cide-ele-icon:hover{color:var(--cide-theme-icon-hover-color, var(--tw-gray-700));transform:scale(1.1)}.dark-mode .cide-lyt-sidebar{background-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track{background-color:color-mix(in srgb,var(--cide-theme-dark-color) 70%,var(--cide-theme-black, #000));border-left-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track:hover{background-color:color-mix(in srgb,var(--cide-theme-color-brand-primary) 20%,var(--cide-theme-dark-color))}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.tw-text-gray-500{color:var(--cide-theme-icon-color)}.hover\\:tw-text-gray-700:hover{color:var(--cide-theme-icon-hover-color)}.tw-text-gray-700{color:var(--cide-theme-text-color)}.tw-text-red-500,.tw-text-red-600,.tw-text-red-700{color:var(--cide-theme-error-color)}.tw-bg-gray-200{background-color:var(--cide-theme-border-color)}.hover\\:tw-bg-gray-100:hover{background-color:var(--cide-theme-hover-bg-color)}.tw-bg-white{background-color:var(--cide-theme-sidebar-color)}.tw-bg-green-500{background-color:var(--cide-theme-success-color)}.tw-border-gray-100,.tw-divide-gray-100{border-color:var(--cide-theme-border-color)}.tw-shadow-lg{box-shadow:0 10px 15px -3px var(--cide-theme-shadow-color),0 4px 6px -2px var(--cide-theme-shadow-color)}.tw-shadow-sm,.hover\\:tw-shadow:hover{box-shadow:0 1px 2px 0 var(--cide-theme-shadow-color)}.sidedrawer-icon{margin:.25rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{display:grid;height:100%;width:100%;overflow:auto}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "directive", type: CideEleResizerDirective, selector: "[cideEleResizer]", inputs: ["direction", "to", "prevElementSelector", "nextElementSelector", "parentElementSelector", "minPrevSize", "minNextSize", "usePercentage"], outputs: ["resizeStart", "resizing", "resizeEnd"] }, { kind: "component", type: CideEleSkeletonLoaderComponent, selector: "cide-ele-skeleton-loader", inputs: ["width", "height", "borderRadius", "count", "circle", "animation"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: TooltipDirective, selector: "[cideEleTooltip]", inputs: ["cideEleTooltip", "tooltipColor", "tooltipBg", "tooltipPlacement", "tooltipType", "tooltipDelay", "tooltipDir", "tooltipShowArrow", "tooltipMultiline", "tooltipMaxWidth", "tooltipInteractive", "tooltipClass"] }] }); }
241
+ }
242
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerWrapperComponent, decorators: [{
9
243
  type: Component,
10
- args: [{ selector: 'cide-lyt-sidedrawer-wrapper', standalone: true, imports: [CideIconComponent], template: "<nav class=\"cide-sidebar tw-w-6 tw-border-b-gray-200 tw-border-solid tw-border-l tw-absolute tw-justify-between tw-bg-gray-50 tw-h-[calc(100vh-2.5rem)] tw-select-none tw-z-[100] tw-top-9 tw-right-0 tw-flex\">\r\n <cide-ele-icon class=\"tw-my-1\" type=\"none\">info</cide-ele-icon>\r\n</nav>" }]
11
- }] });
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9sYXlvdXQvc2lkZWRyYXdlci9zaWRlZHJhd2VyLXdyYXBwZXIvc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9sYXlvdXQvc2lkZWRyYXdlci9zaWRlZHJhd2VyLXdyYXBwZXIvc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBU3RELE1BQU0sT0FBTywwQkFBMEI7OEdBQTFCLDBCQUEwQjtrR0FBMUIsMEJBQTBCLHVGQ1Z2Qyx3U0FFTSwwRERJTSxpQkFBaUI7OzJGQUloQiwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksV0FDUCxDQUFDLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENpZGVJY29uQ29tcG9uZW50IH0gZnJvbSAnY2xvdWQtaWRlLWVsZW1lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NpZGVJY29uQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaWRlZHJhd2VyV3JhcHBlckNvbXBvbmVudCB7XHJcblxyXG59XHJcbiIsIjxuYXYgY2xhc3M9XCJjaWRlLXNpZGViYXIgdHctdy02IHR3LWJvcmRlci1iLWdyYXktMjAwIHR3LWJvcmRlci1zb2xpZCB0dy1ib3JkZXItbCB0dy1hYnNvbHV0ZSB0dy1qdXN0aWZ5LWJldHdlZW4gdHctYmctZ3JheS01MCB0dy1oLVtjYWxjKDEwMHZoLTIuNXJlbSldIHR3LXNlbGVjdC1ub25lIHR3LXotWzEwMF0gdHctdG9wLTkgdHctcmlnaHQtMCB0dy1mbGV4XCI+XHJcbiAgICA8Y2lkZS1lbGUtaWNvbiBjbGFzcz1cInR3LW15LTFcIiB0eXBlPVwibm9uZVwiPmluZm88L2NpZGUtZWxlLWljb24+XHJcbjwvbmF2PiJdfQ==
244
+ args: [{ selector: 'cide-lyt-sidedrawer-wrapper', standalone: true, imports: [
245
+ NgClass,
246
+ CideIconComponent,
247
+ CideEleResizerDirective,
248
+ CideEleSkeletonLoaderComponent,
249
+ NgFor,
250
+ NgIf,
251
+ TooltipDirective
252
+ ], template: "<nav *ngIf=\"shouldShowSidedrawer()\" \r\n [ngClass]=\"{'expanded tw-min-w-[var(--cide-lyt-sidedrawer-wrapper-width-expanded-min)]': isExpanded, 'tw-w-[var(--cide-lyt-sidedrawer-wrapper-width)]': !isExpanded}\"\r\n id=\"cide-lyt-sidedrawer-wrapper\" class=\"tw-flex tw-relative tw-flex-col tw-items-center tw-justify-between tw-h-full tw-bg-white tw-shadow-lg tw-border-l tw-border-gray-200\">\r\n <!-- Resizer Divider -->\r\n <div parentElementSelector=\"#cide-lyt-outlet-sidedrawer-wrapper\"\r\n [minNextSize]=\"sidedrawerSetupData.cide_lyt_sidedrawer_width\" prevElementSelector=\"#cide-lyt-outlet-wrapper\"\r\n nextElementSelector=\"#cide-lyt-sidedrawer-wrapper\" cideEleResizer direction=\"horizontal\" to=\"right-to-left\">\r\n <div class=\"cide-lyt-devider-track tw-w-full tw-h-full\"></div>\r\n </div>\r\n <!-- Main Icon Area -->\r\n <div class=\"tw-flex tw-justify-between tw-h-full tw-w-full\">\r\n <div class=\"tw-w-8 tw-h-full tw-border-r tw-border-gray-200\">\r\n <div class=\"sidedrawer-icon tw-flex tw-flex-col tw-items-center tw-gap-2\">\r\n <ng-container *ngIf=\"drawerItems() as items; else loading\">\r\n <div *ngFor=\"let item of items\" [title]=\"item.title\">\r\n <button (click)=\"onItemClick(item)\"\r\n class=\"tw-p-0 tw-rounded-md hover:tw-bg-gray-100 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500\"\r\n [ngClass]=\"{'tw-bg-blue-100 tw-text-blue-700': sidedrawerService.activeComponent() === item.configFor}\">\r\n <cide-ele-icon [cideEleTooltip]=\"item.title\" tooltipPlacement=\"left\" width=\"1.3rem\" height=\"1.5rem\" type=\"box\">{{item.icon}}</cide-ele-icon>\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-template #loading>\r\n <cide-ele-skeleton-loader [width]=\"'2rem'\" [height]=\"'2rem'\" [count]=\"3\"\r\n [circle]=\"true\"></cide-ele-skeleton-loader>\r\n </ng-template>\r\n </div>\r\n </div>\r\n <div class=\"tw-flex-1 cide-lyt-sidedrawer-wrapper-child-holder\">\r\n <div #notesContainer class=\"tw-h-full\">\r\n </div>\r\n </div>\r\n </div>\r\n</nav>", styles: [".cide-lyt-sidebar{display:flex;box-shadow:0 4px 12px var(--sidebar-shadow-color);overflow:hidden;background-color:var(--cide-theme-sidebar-color);--sidebar-tooltip-bg: var(--cide-theme-dark-color);--sidebar-tooltip-color: var(--cide-theme-light-color);--sidebar-shadow-color: var(--cide-theme-shadow-color, rgba(0, 0, 0, .05));transition:width .3s cubic-bezier(.4,0,.2,1);max-height:100%;isolation:isolate;will-change:width;position:relative}cide-ele-icon{color:var(--cide-theme-icon-color, var(--tw-gray-500));transition:all .2s ease}cide-ele-icon:hover{color:var(--cide-theme-icon-hover-color, var(--tw-gray-700));transform:scale(1.1)}.dark-mode .cide-lyt-sidebar{background-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track{background-color:color-mix(in srgb,var(--cide-theme-dark-color) 70%,var(--cide-theme-black, #000));border-left-color:var(--cide-theme-dark-color)}.dark-mode .cide-lyt-devider-track:hover{background-color:color-mix(in srgb,var(--cide-theme-color-brand-primary) 20%,var(--cide-theme-dark-color))}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}.tw-text-gray-500{color:var(--cide-theme-icon-color)}.hover\\:tw-text-gray-700:hover{color:var(--cide-theme-icon-hover-color)}.tw-text-gray-700{color:var(--cide-theme-text-color)}.tw-text-red-500,.tw-text-red-600,.tw-text-red-700{color:var(--cide-theme-error-color)}.tw-bg-gray-200{background-color:var(--cide-theme-border-color)}.hover\\:tw-bg-gray-100:hover{background-color:var(--cide-theme-hover-bg-color)}.tw-bg-white{background-color:var(--cide-theme-sidebar-color)}.tw-bg-green-500{background-color:var(--cide-theme-success-color)}.tw-border-gray-100,.tw-divide-gray-100{border-color:var(--cide-theme-border-color)}.tw-shadow-lg{box-shadow:0 10px 15px -3px var(--cide-theme-shadow-color),0 4px 6px -2px var(--cide-theme-shadow-color)}.tw-shadow-sm,.hover\\:tw-shadow:hover{box-shadow:0 1px 2px 0 var(--cide-theme-shadow-color)}.sidedrawer-icon{margin:.25rem 0}.cide-lyt-sidedrawer-wrapper-child-holder{display:grid;height:100%;width:100%;overflow:auto}\n"] }]
253
+ }], ctorParameters: () => [], propDecorators: { notesContainer: [{
254
+ type: ViewChild,
255
+ args: ['notesContainer', { read: ViewContainerRef }]
256
+ }] } });
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9sYXlvdXQvc2lkZWRyYXdlci9zaWRlZHJhd2VyLXdyYXBwZXIvc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nsb3VkLWlkZS1sYXlvdXQvc3JjL2xpYi9sYXlvdXQvc2lkZWRyYXdlci9zaWRlZHJhd2VyLXdyYXBwZXIvc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFzQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUFFLHdCQUF3QixFQUFrQixNQUFNLHVCQUF1QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUMsQ0FBQyx5QkFBeUI7QUFFaEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQUV0RSxtQ0FBbUM7QUFDbkMsU0FBUyxlQUFlLENBQUMsUUFBaUI7SUFDeEMsT0FBTyxD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OzhHQS9PVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQyxvTEFpQlAsZ0JBQWdCLDZCQ3hEdkQsMDFFQWlDTSxzMUVETEYsT0FBTyxvRkFDUCxpQkFBaUIsK0ZBQ2pCLHVCQUF1QixtUUFDdkIsOEJBQThCLGtKQUM5QixLQUFLLG1IQUNMLElBQUksNkZBQ0osZ0JBQWdCOzsyRkFLUCxpQ0FBaUM7a0JBZjdDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksV0FDUDt3QkFDUCxPQUFPO3dCQUNQLGlCQUFpQjt3QkFDakIsdUJBQXVCO3dCQUN2Qiw4QkFBOEI7d0JBQzlCLEtBQUs7d0JBQ0wsSUFBSTt3QkFDSixnQkFBZ0I7cUJBQ2pCO3dEQXFCd0QsY0FBYztzQkFBdEUsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3Q2hpbGQsIENvbXBvbmVudFJlZiwgVHlwZSwgaW5qZWN0LCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaWRlRWxlUmVzaXplckRpcmVjdGl2ZSwgQ2lkZUljb25Db21wb25lbnQsIFRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBDaWRlRWxlU2tlbGV0b25Mb2FkZXJDb21wb25lbnQgfSBmcm9tICdjbG91ZC1pZGUtZWxlbWVudCc7XG5pbXBvcnQgeyBDaWRlTHl0U2lkZWRyYXdlclNlcnZpY2UsIFNpZGVkcmF3ZXJJdGVtIH0gZnJvbSAnLi4vc2lkZWRyYXdlci5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nQ2xhc3MsIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENpZGVMeXRSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3JlcXVlc3QvcmVxdWVzdC5zZXJ2aWNlJzsgLy8gSW1wb3J0IHJlcXVlc3Qgc2VydmljZVxuaW1wb3J0IHsgTm90ZXNDb21wb25lbnRTdGF0ZSB9IGZyb20gJy4uL3NpZGVkcmF3ZXItbm90ZXMvc2lkZWRyYXdlci1ub3Rlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFiU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdGFiLXN0YXRlLnNlcnZpY2UnO1xuXG4vLyBUeXBlIGd1YXJkIGZvciBzZXRTdGF0ZS9nZXRTdGF0ZVxuZnVuY3Rpb24gaGFzU3RhdGVNZXRob2RzKGluc3RhbmNlOiB1bmtub3duKTogaW5zdGFuY2UgaXMgeyBnZXRTdGF0ZTogKCkgPT4gTm90ZXNDb21wb25lbnRTdGF0ZTsgc2V0U3RhdGU6IChzdGF0ZTogTm90ZXNDb21wb25lbnRTdGF0ZSkgPT4gdm9pZDsgY29udGV4dD86IHsgY29uZmlnRm9yPzogc3RyaW5nIH0gfSB7XG4gIHJldHVybiAhIWluc3RhbmNlICYmIHR5cGVvZiAoaW5zdGFuY2UgYXMgeyBnZXRTdGF0ZT86IHVua25vd24gfSkuZ2V0U3RhdGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIChpbnN0YW5jZSBhcyB7IHNldFN0YXRlPzogdW5rbm93biB9KS5zZXRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gVHlwZSBndWFyZCBmb3IgTm90ZXNDb21wb25lbnRTdGF0ZVxuZnVuY3Rpb24gaXNOb3Rlc0NvbXBvbmVudFN0YXRlKHN0YXRlOiB1bmtub3duKTogc3RhdGUgaXMgTm90ZXNDb21wb25lbnRTdGF0ZSB7XG4gIHJldHVybiAhIXN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnbmV3Tm90ZU1vZGVsJyBpbiBzdGF0ZSAmJlxuICAgICdpc0Zvcm1WaXNpYmxlJyBpbiBzdGF0ZSAmJlxuICAgICdzY3JvbGxUb3AnIGluIHN0YXRlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBDaWRlSWNvbkNvbXBvbmVudCxcbiAgICBDaWRlRWxlUmVzaXplckRpcmVjdGl2ZSxcbiAgICBDaWRlRWxlU2tlbGV0b25Mb2FkZXJDb21wb25lbnQsXG4gICAgTmdGb3IsXG4gICAgTmdJZixcbiAgICBUb29sdGlwRGlyZWN0aXZlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlZHJhd2VyLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vc2lkZWRyYXdlci13cmFwcGVyLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIENpZGVMeXRTaWRlZHJhd2VyV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBzaWRlZHJhd2VyU2V0dXBEYXRhID0ge1xuICAgIGNpZGVfbHl0X3NpZGVkcmF3ZXJfd2lkdGg6IDBcbiAgfTtcbiAgLy8gTW9kZXJuIEFuZ3VsYXIgdjIwIHBhdHRlcm46IFVzZSBTaWduYWxzIGRpcmVjdGx5XG4gIHB1YmxpYyBnZXQgZHJhd2VySXRlbXMoKSB7IHJldHVybiB0aGlzLnNpZGVkcmF3ZXJTZXJ2aWNlLmRyYXdlckl0ZW1zOyB9XG4gIHB1YmxpYyBnZXQgbm90ZXNWaXNpYmxlKCkgeyByZXR1cm4gdGhpcy5zaWRlZHJhd2VyU2VydmljZS5ub3Rlc1Zpc2libGU7IH1cbiAgcHVibGljIGlzRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTsgLy8gTmV3IHByb3BlcnR5IHRvIHRyYWNrIGV4cGFuc2lvbiBzdGF0ZVxuXG4gIC8vIENvbXB1dGVkIHNpZ25hbCB0byBkZXRlcm1pbmUgaWYgc2lkZWRyYXdlciBzaG91bGQgYmUgdmlzaWJsZVxuICBwdWJsaWMgZ2V0IHNob3VsZFNob3dTaWRlZHJhd2VyKCkge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZHJhd2VySXRlbXMoKTtcbiAgICAgIHJldHVybiBpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwO1xuICAgIH0pO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnbm90ZXNDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgbm90ZXNDb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xuICBwcml2YXRlIGN1cnJlbnRDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjx1bmtub3duPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbXBvbmVudE1hcDogeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPFR5cGU8dW5rbm93bj4+IH0gPSB7fTsgLy8gTWFwIGNvbmZpZ0ZvciB0byBjb21wb25lbnRcbiAgcHJpdmF0ZSBjdXJyZW50VGFiSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRBY3RpdmVDb21wb25lbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBzaWRlZHJhd2VyU2VydmljZSA9IGluamVjdChDaWRlTHl0U2lkZWRyYXdlclNlcnZpY2UpO1xuICBwcml2YXRlIHJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KENpZGVMeXRSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgdGFiU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFRhYlN0YXRlU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gTW9kZXJuIEFuZ3VsYXIgdjIwIHBhdHRlcm46IFVzZSBTaWduYWxzIGRpcmVjdGx5IHdpdGggZWZmZWN0XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ0ZvciA9IHRoaXMuc2lkZWRyYXdlclNlcnZpY2UuYWN0aXZlQ29tcG9uZW50KCk7XG4gICAgICB0aGlzLmN1cnJlbnRBY3RpdmVDb21wb25lbnQgPSBjb25maWdGb3I7XG4gICAgICB0aGlzLmxvYWRDb21wb25lbnQoY29uZmlnRm9yKTtcbiAgICB9LCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pO1xuICAgIFxuICAgIC8vIEVmZmVjdCB0byB0cmFjayBhY3RpdmUgdGFiIGNoYW5nZXNcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlVGFiSWQgPSB0aGlzLnJlcXVlc3RTZXJ2aWNlLmFjdGl2ZVRhYklkKCk7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gQWN0aXZlIHRhYiBjaGFuZ2VkOicsIGFjdGl2ZVRhYklkKTtcbiAgICAgIHRoaXMuY3VycmVudFRhYklkID0gYWN0aXZlVGFiSWQ7XG4gICAgICBcbiAgICAgIGlmIChhY3RpdmVUYWJJZCkge1xuICAgICAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gTG9hZGluZyB0YWIgc3RhdGUgZm9yOicsIGFjdGl2ZVRhYklkKTtcbiAgICAgICAgdGhpcy50YWJTdGF0ZVNlcnZpY2UuZ2V0VGFiU3RhdGUoYWN0aXZlVGFiSWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHRhYlN0YXRlID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gVGFiIHN0YXRlIGxvYWRlZDonLCB0YWJTdGF0ZSk7XG4gICAgICAgICAgY29uc3Qgc2lkZURyYXdlciA9IHRhYlN0YXRlPy5jb21wb25lbnRTdGF0ZS5zaWRlRHJhd2VyO1xuICAgICAgICAgIGlmIChzaWRlRHJhd2VyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gUmVzdG9yaW5nIGRyYXdlciBzdGF0ZTonLCBzaWRlRHJhd2VyKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgYWN0aXZlQ29tcG9uZW50XG4gICAgICAgICAgICB0aGlzLnNpZGVkcmF3ZXJTZXJ2aWNlLnNldEFjdGl2ZUNvbXBvbmVudChzaWRlRHJhd2VyLmFjdGl2ZUNvbXBvbmVudCk7XG4gICAgICAgICAgICAvLyBNb2Rlcm4gRVMyMDIyKyBwYXR0ZXJuOiBVc2UgUHJvbWlzZS1iYXNlZCBkZWxheSB3aXRoIG1pY3JvdGFza1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzaWRlRHJhd2VyLmFjdGl2ZUNvbXBvbmVudCAmJiB0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYgJiYgaGFzU3RhdGVNZXRob2RzKHRoaXMuY3VycmVudENvbXBvbmVudFJlZi5pbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wU3RhdGUgPSBzaWRlRHJhd2VyLmNvbXBvbmVudFN0YXRlPy5bc2lkZURyYXdlci5hY3RpdmVDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0eXBlIGd1YXJkcyBmb3IgZWFjaCBjb21wb25lbnQgYXMgbmVlZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNpZGVEcmF3ZXIuYWN0aXZlQ29tcG9uZW50ID09PSAnZHJvd2FyX25vdGVzJyAmJiBpc05vdGVzQ29tcG9uZW50U3RhdGUoY29tcFN0YXRlKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29tcG9uZW50UmVmLmluc3RhbmNlLnNldFN0YXRlKGNvbXBTdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ/CflI0gU0lERURSQVdFUiAtIE5vIGRyYXdlciBzdGF0ZSBmb3VuZCwgY2xlYXJpbmcgYWN0aXZlIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgdGhpcy5zaWRlZHJhd2VyU2VydmljZS5zZXRBY3RpdmVDb21wb25lbnQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBObyBhY3RpdmUgdGFiLCBjbGVhcmluZyBkcmF3ZXIgc3RhdGUnKTtcbiAgICAgICAgdGhpcy5zaWRlZHJhd2VyU2VydmljZS5zZXRBY3RpdmVDb21wb25lbnQobnVsbCk7XG4gICAgICB9XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgICBcbiAgICAvLyBjb2xsZWN0ZSB0aGUgd2lkdGggb2YgdGhlIHNpZGViYXIgYnkgdXNpbmcgdGhlIHN0eWxlIHByb3BlcnR5XG4gICAgY29uc3QgY2lkZV9seXRfc2lkZWRyYXdlcl93cmFwcGVyX3dpZHRoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWNpZGUtbHl0LXNpZGVkcmF3ZXItd3JhcHBlci13aWR0aCcpKTtcbiAgICB0aGlzLnNpZGVkcmF3ZXJTZXR1cERhdGEuY2lkZV9seXRfc2lkZWRyYXdlcl93aWR0aCA9IChjaWRlX2x5dF9zaWRlZHJhd2VyX3dyYXBwZXJfd2lkdGgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IG1hcCAoWW91J2QgbGlrZWx5IHBvcHVsYXRlIHRoaXMgZnJvbSBhIGNvbmZpZyBvciBzZXJ2aWNlKVxuICAgIHRoaXMuY29tcG9uZW50TWFwWydkcm93YXJfbm90ZXMnXSA9ICgpID0+IGltcG9ydCgnLi4vc2lkZWRyYXdlci1ub3Rlcy9zaWRlZHJhd2VyLW5vdGVzLmNvbXBvbmVudCcpLnRoZW4obSA9PiBtLkNpZGVMeXRTaWRlZHJhd2VyTm90ZXNDb21wb25lbnQpO1xuICAgIHRoaXMuY29tcG9uZW50TWFwWydkcmF3ZXJfdGhlbWUnXSA9ICgpID0+IGltcG9ydCgnLi4vZHJhd2VyLXRoZW1lL2RyYXdlci10aGVtZS5jb21wb25lbnQnKS50aGVuKG0gPT4gbS5DaWRlTHl0RHJhd2VyVGhlbWVDb21wb25lbnQpO1xuICB9XG5cbiAgYXN5bmMgbG9hZENvbXBvbmVudChjb25maWdGb3I6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gTG9hZGluZyBjb21wb25lbnQ6JywgY29uZmlnRm9yLCAnQ3VycmVudCB0YWI6JywgdGhpcy5jdXJyZW50VGFiSWQpO1xuICAgIFxuICAgIC8vIEFsd2F5cyBjbGVhciB0aGUgY29udGFpbmVyIGFuZCBkZXN0cm95IHRoZSBwcmV2aW91cyBjb21wb25lbnRcbiAgICB0aGlzLm5vdGVzQ29udGFpbmVyPy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY3VycmVudENvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICB0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnRm9yKSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gTm8gY29tcG9uZW50IHRvIGxvYWQsIGNvbGxhcHNpbmcnKTtcbiAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zYXZlU2lkZWRyYXdlclN0YXRlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBFeHBhbmRpbmcgYW5kIGxvYWRpbmc6JywgY29uZmlnRm9yKTtcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB0cnVlO1xuICAgIFxuICAgIGNvbnN0IGNvbXBvbmVudExvYWRlciA9IHRoaXMuY29tcG9uZW50TWFwW2NvbmZpZ0Zvcl07XG4gICAgY29uc29sZS5sb2coJ/CflI0gU0lERURSQVdFUiAtIENvbXBvbmVudCBsb2FkZXIgZm91bmQ6JywgISFjb21wb25lbnRMb2FkZXIpO1xuICAgIFxuICAgIGlmIChjb21wb25lbnRMb2FkZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBJbXBvcnRpbmcgY29tcG9uZW50IGZvcjonLCBjb25maWdGb3IpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlID0gYXdhaXQgY29tcG9uZW50TG9hZGVyKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBDb21wb25lbnQgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYgPSB0aGlzLm5vdGVzQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICAgICAgY29uc29sZS5sb2coJ/CflI0gU0lERURSQVdFUiAtIENvbXBvbmVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgY2lkZS1seXQtc2lkZWRyYXdlci13cmFwcGVyLWNoaWxkIGNsYXNzIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudFxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXItY2hpbGQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q29tcG9uZW50Q29udGV4dChjb25maWdGb3IpO1xuICAgICAgICAvLyBPcHRpb25hbGx5IHJlc3RvcmUgc3RhdGUgaGVyZSBpZiB5b3UgaGF2ZSBpdFxuICAgICAgICB0aGlzLnNhdmVTaWRlZHJhd2VyU3RhdGUoY29uZmlnRm9yKTtcbiAgICAgICAgY29uc29sZS5sb2coJ/CflI0gU0lERURSQVdFUiAtIENvbXBvbmVudCBzZXR1cCBjb21wbGV0ZWQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYPCfmqggU0lERURSQVdFUiAtIEVycm9yIGxvYWRpbmcgY29tcG9uZW50IGZvciAke2NvbmZpZ0Zvcn06YCwgZXJyb3IpO1xuICAgICAgICB0aGlzLmlzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGDimqDvuI8gU0lERURSQVdFUiAtIE5vIGNvbXBvbmVudCBtYXBwaW5nIGZvdW5kIGZvciBjb25maWdGb3I6ICR7Y29uZmlnRm9yfWApO1xuICAgICAgY29uc29sZS5sb2coJ/CflI0gU0lERURSQVdFUiAtIEF2YWlsYWJsZSBtYXBwaW5nczonLCBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudE1hcCkpO1xuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckNvbXBvbmVudChkZXN0cm95OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMuc2F2ZVNpZGVkcmF3ZXJTdGF0ZSgpO1xuICAgIHRoaXMubm90ZXNDb250YWluZXI/LmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuY3VycmVudENvbXBvbmVudFJlZiAmJiBkZXN0cm95KSB7XG4gICAgICB0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlU2lkZWRyYXdlclN0YXRlKGNvbmZpZ0Zvck92ZXJyaWRlPzogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBTYXZpbmcgc3RhdGUsIGN1cnJlbnQgdGFiOicsIHRoaXMuY3VycmVudFRhYklkKTtcbiAgICBcbiAgICBpZiAoIXRoaXMuY3VycmVudFRhYklkKSB7XG4gICAgICBjb25zb2xlLmxvZygn4pqg77iPIFNJREVEUkFXRVIgLSBObyBjdXJyZW50IHRhYiwgc2tpcHBpbmcgc3RhdGUgc2F2ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBhY3RpdmVDb21wb25lbnQgPSBjb25maWdGb3JPdmVycmlkZSAhPT0gdW5kZWZpbmVkID8gY29uZmlnRm9yT3ZlcnJpZGUgOiB0aGlzLmN1cnJlbnRBY3RpdmVDb21wb25lbnQ7XG4gICAgY29uc29sZS5sb2coJ/CflI0gU0lERURSQVdFUiAtIEFjdGl2ZSBjb21wb25lbnQgZm9yIHNhdmU6JywgYWN0aXZlQ29tcG9uZW50KTtcbiAgICBcbiAgICBsZXQgY29tcG9uZW50U3RhdGU6IHsgW2NvbXBvbmVudEtleTogc3RyaW5nXTogdW5rbm93biB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb21wb25lbnRSZWYgJiYgaGFzU3RhdGVNZXRob2RzKHRoaXMuY3VycmVudENvbXBvbmVudFJlZi5pbnN0YW5jZSkgJiYgYWN0aXZlQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY3VycmVudENvbXBvbmVudFJlZi5pbnN0YW5jZS5nZXRTdGF0ZSgpO1xuICAgICAgLy8gQWRkIHR5cGUgZ3VhcmRzIGZvciBlYWNoIGNvbXBvbmVudCBhcyBuZWVkZWRcbiAgICAgIGlmIChhY3RpdmVDb21wb25lbnQgPT09ICdkcm93YXJfbm90ZXMnICYmIGlzTm90ZXNDb21wb25lbnRTdGF0ZShzdGF0ZSkpIHtcbiAgICAgICAgY29tcG9uZW50U3RhdGUgPSB7IFthY3RpdmVDb21wb25lbnRdOiBzdGF0ZSB9O1xuICAgICAgfVxuICAgICAgLy8gRXhhbXBsZSBmb3Igb3RoZXIgY29tcG9uZW50czpcbiAgICAgIC8vIGVsc2UgaWYgKGFjdGl2ZUNvbXBvbmVudCA9PT0gJ290aGVyX2NvbXBvbmVudCcgJiYgaXNPdGhlckNvbXBvbmVudFN0YXRlKHN0YXRlKSkge1xuICAgICAgLy8gICBjb21wb25lbnRTdGF0ZSA9IHsgW2FjdGl2ZUNvbXBvbmVudF06IHN0YXRlIH07XG4gICAgICAvLyB9XG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBVcGRhdGluZyB0YWIgc3RhdGUgd2l0aDonLCB7XG4gICAgICBpc09wZW46ICEhYWN0aXZlQ29tcG9uZW50LFxuICAgICAgYWN0aXZlQ29tcG9uZW50LFxuICAgICAgY29tcG9uZW50U3RhdGVcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLnRhYlN0YXRlU2VydmljZS51cGRhdGVBY3RpdmVUYWJTdGF0ZSh7XG4gICAgICBzaWRlRHJhd2VyOiB7XG4gICAgICAgIGlzT3BlbjogISFhY3RpdmVDb21wb25lbnQsXG4gICAgICAgIGFjdGl2ZUNvbXBvbmVudCxcbiAgICAgICAgY29tcG9uZW50U3RhdGVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50Q29udGV4dChjb25maWdGb3I6IHN0cmluZykge1xuICAgIC8vIFlvdSBjYW4gYWRqdXN0IHRoaXMgbG9naWMgdG8gcGFzcyBkaWZmZXJlbnQgY29udGV4dCBkYXRhIGJhc2VkIG9uIGNvbmZpZ0ZvciBpZiBuZWVkZWQuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Tm90ZXNDb250ZXh0KGNvbmZpZ0Zvcik7IC8vIFVzaW5nIHlvdXIgZXhpc3RpbmcgbWV0aG9kIGZvciBub3cuXG4gICAgaWYgKHRoaXMuY3VycmVudENvbXBvbmVudFJlZiAmJiBjb250ZXh0ICYmIHRoaXMuY3VycmVudENvbXBvbmVudFJlZi5zZXRJbnB1dCkge1xuICAgICAgLy8gUGFzcyBjb250ZXh0IGRhdGFcbiAgICAgIHRoaXMuY3VycmVudENvbXBvbmVudFJlZi5zZXRJbnB1dCgnY29udGV4dCcsIGNvbnRleHQpO1xuICAgIH1cbiAgfVxuICAvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGVuaGFuY2VkIHRvIGhhbmRsZSBjb250ZXh0cyBmb3IgZGlmZmVyZW50IGNvbXBvbmVudHNcbiAgcHJpdmF0ZSBnZXROb3Rlc0NvbnRleHQoY29uZmlnRm9yOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGNvbmZpZ0Zvcikge1xuICAgICAgY2FzZSAnZHJvd2FyX25vdGVzJzoge1xuICAgICAgICAvLyBFeGFtcGxlIGZvciBub3RlcyBjb21wb25lbnQgY29udGV4dFxuICAgICAgICBjb25zdCBhY3RpdmVUYWIgPSB0aGlzLnJlcXVlc3RTZXJ2aWNlLmFjdGl2ZVRhYigpOyAvLyBVc2UgdGhlIGNvbXB1dGVkIHNpZ25hbCBmb3IgYWN0aXZlIHRhYlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhZ2VJZDogYWN0aXZlVGFiPy5zeXRtX3BhZ2VfaWRfc3lwZyxcbiAgICAgICAgICB0aGVtZUlkOiBhY3RpdmVUYWI/LnRoZW1lSWQsXG4gICAgICAgICAgLy8gQWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkIGZvciBub3Rlc1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnZHJhd2VyX3RoZW1lJzoge1xuICAgICAgICAvLyBZb3UgY2FuIGFkZCB0aGVtZSBjb250ZXh0IGhlcmUgaWYgbmVlZGVkXG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsOyAgLy8gT3IgYSBkZWZhdWx0IGNvbnRleHQgaWYgYXBwcm9wcmlhdGVcbiAgICB9XG4gIH1cbiAgb25JdGVtQ2xpY2soaXRlbTogU2lkZWRyYXdlckl0ZW0pOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVUYWJJZCA9IHRoaXMucmVxdWVzdFNlcnZpY2UuYWN0aXZlVGFiSWQoKTtcbiAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gSXRlbSBjbGlja2VkOicsIGl0ZW0pO1xuICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBBY3RpdmUgdGFiIElEOicsIGFjdGl2ZVRhYklkKTtcbiAgICBcbiAgICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgcGF0dGVybjogVXNlIFNpZ25hbHMgZGlyZWN0bHlcbiAgICBjb25zdCBhY3RpdmVDb21wb25lbnQgPSB0aGlzLnNpZGVkcmF3ZXJTZXJ2aWNlLmFjdGl2ZUNvbXBvbmVudCgpO1xuICAgIGNvbnNvbGUubG9nKCfwn5SNIFNJREVEUkFXRVIgLSBDdXJyZW50IGFjdGl2ZSBjb21wb25lbnQ6JywgYWN0aXZlQ29tcG9uZW50KTtcbiAgICBjb25zb2xlLmxvZygn8J+UjSBTSURFRFJBV0VSIC0gSXRlbSBjb25maWdGb3I6JywgaXRlbS5jb25maWdGb3IpO1xuICAgIFxuICAgIGlmIChhY3RpdmVDb21wb25lbnQgPT09IGl0ZW0/LmNvbmZpZ0Zvcikge1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgU0lERURSQVdFUiAtIFNhbWUgY29tcG9uZW50IGNsaWNrZWQsIHRvZ2dsaW5nIG9mZicpO1xuICAgICAgY29uc3QgY2lkZV9seXRfc2lkZWRyYXdlcl93cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NpZGUtbHl0LXNpZGVkcmF3ZXItd3JhcHBlcicpO1xuICAgICAgY29uc3QgY2lkZV9seXRfb3V0bGV0X3dyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2lkZS1seXQtb3V0bGV0LXdyYXBwZXInKTtcbiAgICAgIGlmIChjaWRlX2x5dF9zaWRlZHJhd2VyX3dyYXBwZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBjaWRlX2x5dF9vdXRsZXRfd3JhcHBlciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHdpZHRoX29mX3ByZXYgPSBwYXJzZUludChjaWRlX2x5dF9vdXRsZXRfd3JhcHBlci5zdHlsZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHdpZHRoX29mX25leHQgPSBwYXJzZUludChjaWRlX2x5dF9zaWRlZHJhd2VyX3dyYXBwZXIuc3R5bGUud2lkdGgpO1xuICAgICAgICBjb25zdCB3aWR0aF9vZl9uZXh0X2RlZmF1bHQgPSAzMjtcbiAgICAgICAgY29uc3Qgd2lkdGhfb2ZfcHJldl9kZWZhdWx0ID0gd2lkdGhfb2ZfcHJldiArICh3aWR0aF9vZl9uZXh0IC0gd2lkdGhfb2ZfbmV4dF9kZWZhdWx0KTtcbiAgICAgICAgY2lkZV9seXRfb3V0bGV0X3dyYXBwZXIuc3R5bGUud2lkdGggPSBgJHt3aWR0aF9vZl9wcmV2X2RlZmF1bHR9cHhgO1xuICAgICAgICBjaWRlX2x5dF9zaWRlZHJhd2VyX3dyYXBwZXIuc3R5bGUud2lkdGggPSBgJHt3aWR0aF9vZl9uZXh0X2RlZmF1bHR9cHhgOyAvLyBGaXg6IENhc3QgdG8gSFRNTEVsZW1lbnQgdG8gYWNjZXNzIHN0eWxlIHByb3BlcnR5XG4gICAgICB9XG4gICAgICB0aGlzLnNpZGVkcmF3ZXJTZXJ2aWNlLnNldEFjdGl2ZUNvbXBvbmVudChudWxsKTsgLy8gRGVzdHJveSBpZiBzYW1lXG4gICAgICB0aGlzLnNhdmVTaWRlZHJhd2VyU3RhdGUobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinIUgU0lERURSQVdFUiAtIE5ldyBjb21wb25lbnQgY2xpY2tlZCwgc2V0dGluZyBhY3RpdmU6JywgaXRlbS5jb25maWdGb3IpO1xuICAgICAgdGhpcy5zaWRlZHJhd2VyU2VydmljZS5zZXRBY3RpdmVDb21wb25lbnQoaXRlbS5jb25maWdGb3IpOyAvLyBTZXQgbmV3XG4gICAgICB0aGlzLnNhdmVTaWRlZHJhd2VyU3RhdGUoaXRlbS5jb25maWdGb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPG5hdiAqbmdJZj1cInNob3VsZFNob3dTaWRlZHJhd2VyKClcIiBcclxuICBbbmdDbGFzc109XCJ7J2V4cGFuZGVkIHR3LW1pbi13LVt2YXIoLS1jaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXItd2lkdGgtZXhwYW5kZWQtbWluKV0nOiBpc0V4cGFuZGVkLCAndHctdy1bdmFyKC0tY2lkZS1seXQtc2lkZWRyYXdlci13cmFwcGVyLXdpZHRoKV0nOiAhaXNFeHBhbmRlZH1cIlxyXG4gIGlkPVwiY2lkZS1seXQtc2lkZWRyYXdlci13cmFwcGVyXCIgY2xhc3M9XCJ0dy1mbGV4IHR3LXJlbGF0aXZlIHR3LWZsZXgtY29sIHR3LWl0ZW1zLWNlbnRlciB0dy1qdXN0aWZ5LWJldHdlZW4gdHctaC1mdWxsIHR3LWJnLXdoaXRlIHR3LXNoYWRvdy1sZyB0dy1ib3JkZXItbCB0dy1ib3JkZXItZ3JheS0yMDBcIj5cclxuICAgIDwhLS0gUmVzaXplciBEaXZpZGVyIC0tPlxyXG4gICAgPGRpdiBwYXJlbnRFbGVtZW50U2VsZWN0b3I9XCIjY2lkZS1seXQtb3V0bGV0LXNpZGVkcmF3ZXItd3JhcHBlclwiXHJcbiAgICAgICAgW21pbk5leHRTaXplXT1cInNpZGVkcmF3ZXJTZXR1cERhdGEuY2lkZV9seXRfc2lkZWRyYXdlcl93aWR0aFwiIHByZXZFbGVtZW50U2VsZWN0b3I9XCIjY2lkZS1seXQtb3V0bGV0LXdyYXBwZXJcIlxyXG4gICAgICAgIG5leHRFbGVtZW50U2VsZWN0b3I9XCIjY2lkZS1seXQtc2lkZWRyYXdlci13cmFwcGVyXCIgY2lkZUVsZVJlc2l6ZXIgZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiIHRvPVwicmlnaHQtdG8tbGVmdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaWRlLWx5dC1kZXZpZGVyLXRyYWNrIHR3LXctZnVsbCB0dy1oLWZ1bGxcIj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBNYWluIEljb24gQXJlYSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dy1mbGV4IHR3LWp1c3RpZnktYmV0d2VlbiB0dy1oLWZ1bGwgdHctdy1mdWxsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctOCB0dy1oLWZ1bGwgdHctYm9yZGVyLXIgdHctYm9yZGVyLWdyYXktMjAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlZHJhd2VyLWljb24gdHctZmxleCB0dy1mbGV4LWNvbCB0dy1pdGVtcy1jZW50ZXIgdHctZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkcmF3ZXJJdGVtcygpIGFzIGl0ZW1zOyBlbHNlIGxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCIgW3RpdGxlXT1cIml0ZW0udGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1wLTAgdHctcm91bmRlZC1tZCBob3Zlcjp0dy1iZy1ncmF5LTEwMCBmb2N1czp0dy1vdXRsaW5lLW5vbmUgZm9jdXM6dHctcmluZy0yIGZvY3VzOnR3LXJpbmctYmx1ZS01MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0dy1iZy1ibHVlLTEwMCB0dy10ZXh0LWJsdWUtNzAwJzogc2lkZWRyYXdlclNlcnZpY2UuYWN0aXZlQ29tcG9uZW50KCkgPT09IGl0ZW0uY29uZmlnRm9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpZGUtZWxlLWljb24gW2NpZGVFbGVUb29sdGlwXT1cIml0ZW0udGl0bGVcIiB0b29sdGlwUGxhY2VtZW50PVwibGVmdFwiIHdpZHRoPVwiMS4zcmVtXCIgaGVpZ2h0PVwiMS41cmVtXCIgdHlwZT1cImJveFwiPnt7aXRlbS5pY29ufX08L2NpZGUtZWxlLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNpZGUtZWxlLXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzJyZW0nXCIgW2hlaWdodF09XCInMnJlbSdcIiBbY291bnRdPVwiM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaXJjbGVdPVwidHJ1ZVwiPjwvY2lkZS1lbGUtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LWZsZXgtMSBjaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXItY2hpbGQtaG9sZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgI25vdGVzQ29udGFpbmVyIGNsYXNzPVwidHctaC1mdWxsXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmF2PiJdfQ==
@@ -0,0 +1,70 @@
1
+ import { Injectable, signal } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class CideLytSidedrawerService {
4
+ constructor() {
5
+ this.sidedrawerVisible = false;
6
+ // Modern Angular signals for reactive state management
7
+ this.drawerItemsSignal = signal([]);
8
+ this.drawerItems = this.drawerItemsSignal.asReadonly();
9
+ this.notesVisibleSignal = signal(false);
10
+ this.notesVisible = this.notesVisibleSignal.asReadonly();
11
+ this.activeComponentSignal = signal(null);
12
+ this.activeComponent = this.activeComponentSignal.asReadonly();
13
+ this._pageId = null;
14
+ this._themeId = null;
15
+ }
16
+ setContext(pageId, themeId) {
17
+ this._pageId = pageId;
18
+ this._themeId = themeId;
19
+ }
20
+ get pageId() {
21
+ return this._pageId;
22
+ }
23
+ get themeId() {
24
+ return this._themeId;
25
+ }
26
+ // Hide Sidedrawer
27
+ hideSidedrawer() {
28
+ this.sidedrawerVisible = false;
29
+ document.querySelector(`#cide-lyt-sidedrawer-wrapper`)?.classList.add('cide-lyt-sidedrawer-wrapper-hide');
30
+ document.querySelector(`body`)?.classList.remove('cide-lyt-sidedrawer-exist');
31
+ }
32
+ // Show Sidedrawer
33
+ showSidedrawer() {
34
+ this.sidedrawerVisible = true;
35
+ document.querySelector(`#cide-lyt-sidedrawer-wrapper`)?.classList.remove('cide-lyt-sidedrawer-wrapper-hide');
36
+ document.querySelector(`body`)?.classList.remove('cide-lyt-sidedrawer-exist');
37
+ }
38
+ // Method to update drawer items from layout data
39
+ updateDrawerItems(layout) {
40
+ if (layout?.sytm_layout_drawer && layout.sytm_layout_drawer.length > 0) {
41
+ const items = layout.sytm_layout_drawer
42
+ .filter((item) => item.syth_status && item?.core_system_config?.syco_isactive) // Only show active items
43
+ .map(item => ({
44
+ status: item.syth_status,
45
+ configFor: item.syth_config_syco_for,
46
+ title: item.core_system_config?.syco_title,
47
+ icon: item.core_system_config?.syco_configuration.syco_icon,
48
+ description: item.core_system_config?.syco_desc || "",
49
+ isActive: item.core_system_config?.syco_isactive || false
50
+ }));
51
+ this.drawerItemsSignal.set(items);
52
+ }
53
+ else {
54
+ this.drawerItemsSignal.set([]); // Clear items if no drawer data
55
+ }
56
+ }
57
+ // Set the active component to display in the side drawer
58
+ setActiveComponent(configFor) {
59
+ this.activeComponentSignal.set(configFor);
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
62
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerService, providedIn: 'root' }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideLytSidedrawerService, decorators: [{
65
+ type: Injectable,
66
+ args: [{
67
+ providedIn: 'root'
68
+ }]
69
+ }] });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWRyYXdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWxheW91dC9zcmMvbGliL2xheW91dC9zaWRlZHJhd2VyL3NpZGVkcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFnQm5ELE1BQU0sT0FBTyx3QkFBd0I7SUFIckM7UUFJUyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFMUMsdURBQXVEO1FBQy9DLHNCQUFpQixHQUFHLE1BQU0sQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFDbEQsZ0JBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFakQsdUJBQWtCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRW5ELDBCQUFxQixHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7UUFDckQsb0JBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFekQsWUFBTyxHQUFrQixJQUFJLENBQUM7UUFDOUIsYUFBUSxHQUFrQixJQUFJLENBQUM7S0FvRHhDO0lBbERDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjO1FBQ1osSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixRQUFRLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsY0FBYztRQUNaLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsUUFBUSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUM3RyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsaURBQWlEO0lBQ2pELGlCQUFpQixDQUFDLE1BQStCO1FBQy9DLElBQUksTUFBTSxFQUFFLGtCQUFrQixJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkUsTUFBTSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxrQkFBa0I7aUJBQ3RELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLENBQUMseUJBQXlCO2lCQUN2RyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDeEIsU0FBUyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3BDLEtBQUssRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsVUFBb0I7Z0JBQ3BELElBQUksRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsU0FBUztnQkFDM0QsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLElBQUksRUFBRTtnQkFDckQsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxhQUFhLElBQUksS0FBSzthQUMxRCxDQUFDLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO1FBQ2xFLENBQUM7SUFDSCxDQUFDO0lBRUQseURBQXlEO0lBQ3pELGtCQUFrQixDQUFDLFNBQXdCO1FBQ3pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs4R0FqRVUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTs7MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSVN5dG1MYXlvdXQgfSBmcm9tICdjbG91ZC1pZGUtbG1zLW1vZGVsJztcblxuLy8gSXQncyBnb29kIHByYWN0aWNlIHRvIGRlZmluZSBhbiBpbnRlcmZhY2UgZm9yIHRoZSBkYXRhIHlvdSdyZSB3b3JraW5nIHdpdGguXG5leHBvcnQgaW50ZXJmYWNlIFNpZGVkcmF3ZXJJdGVtIHtcbiAgc3RhdHVzOiBib29sZWFuO1xuICBjb25maWdGb3I6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgaWNvbjogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ2lkZUx5dFNpZGVkcmF3ZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNpZGVkcmF3ZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBNb2Rlcm4gQW5ndWxhciBzaWduYWxzIGZvciByZWFjdGl2ZSBzdGF0ZSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgZHJhd2VySXRlbXNTaWduYWwgPSBzaWduYWw8U2lkZWRyYXdlckl0ZW1bXT4oW10pO1xuICBwdWJsaWMgZHJhd2VySXRlbXMgPSB0aGlzLmRyYXdlckl0ZW1zU2lnbmFsLmFzUmVhZG9ubHkoKTtcbiAgXG4gIHByaXZhdGUgbm90ZXNWaXNpYmxlU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIG5vdGVzVmlzaWJsZSA9IHRoaXMubm90ZXNWaXNpYmxlU2lnbmFsLmFzUmVhZG9ubHkoKTtcbiAgXG4gIHByaXZhdGUgYWN0aXZlQ29tcG9uZW50U2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgYWN0aXZlQ29tcG9uZW50ID0gdGhpcy5hY3RpdmVDb21wb25lbnRTaWduYWwuYXNSZWFkb25seSgpO1xuICBcbiAgcHJpdmF0ZSBfcGFnZUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdGhlbWVJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgc2V0Q29udGV4dChwYWdlSWQ6IHN0cmluZywgdGhlbWVJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFnZUlkID0gcGFnZUlkO1xuICAgIHRoaXMuX3RoZW1lSWQgPSB0aGVtZUlkO1xuICB9XG5cbiAgZ2V0IHBhZ2VJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUlkO1xuICB9XG5cbiAgZ2V0IHRoZW1lSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3RoZW1lSWQ7XG4gIH1cblxuICAvLyBIaWRlIFNpZGVkcmF3ZXJcbiAgaGlkZVNpZGVkcmF3ZXIoKSB7XG4gICAgdGhpcy5zaWRlZHJhd2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNjaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXJgKT8uY2xhc3NMaXN0LmFkZCgnY2lkZS1seXQtc2lkZWRyYXdlci13cmFwcGVyLWhpZGUnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBib2R5YCk/LmNsYXNzTGlzdC5yZW1vdmUoJ2NpZGUtbHl0LXNpZGVkcmF3ZXItZXhpc3QnKTtcbiAgfVxuXG4gIC8vIFNob3cgU2lkZWRyYXdlciAgXG4gIHNob3dTaWRlZHJhd2VyKCkge1xuICAgIHRoaXMuc2lkZWRyYXdlclZpc2libGUgPSB0cnVlO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCNjaWRlLWx5dC1zaWRlZHJhd2VyLXdyYXBwZXJgKT8uY2xhc3NMaXN0LnJlbW92ZSgnY2lkZS1seXQtc2lkZWRyYXdlci13cmFwcGVyLWhpZGUnKTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBib2R5YCk/LmNsYXNzTGlzdC5yZW1vdmUoJ2NpZGUtbHl0LXNpZGVkcmF3ZXItZXhpc3QnKTtcbiAgfVxuXG4gIC8vIE1ldGhvZCB0byB1cGRhdGUgZHJhd2VyIGl0ZW1zIGZyb20gbGF5b3V0IGRhdGFcbiAgdXBkYXRlRHJhd2VySXRlbXMobGF5b3V0OiBJU3l0bUxheW91dCB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChsYXlvdXQ/LnN5dG1fbGF5b3V0X2RyYXdlciAmJiBsYXlvdXQuc3l0bV9sYXlvdXRfZHJhd2VyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBTaWRlZHJhd2VySXRlbVtdID0gbGF5b3V0LnN5dG1fbGF5b3V0X2RyYXdlclxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN5dGhfc3RhdHVzICYmIGl0ZW0/LmNvcmVfc3lzdGVtX2NvbmZpZz8uc3ljb19pc2FjdGl2ZSkgLy8gT25seSBzaG93IGFjdGl2ZSBpdGVtc1xuICAgICAgICAubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgICBzdGF0dXM6IGl0ZW0uc3l0aF9zdGF0dXMsXG4gICAgICAgICAgY29uZmlnRm9yOiBpdGVtLnN5dGhfY29uZmlnX3N5Y29fZm9yLFxuICAgICAgICAgIHRpdGxlOiBpdGVtLmNvcmVfc3lzdGVtX2NvbmZpZz8uc3ljb190aXRsZSBhcyBzdHJpbmcsXG4gICAgICAgICAgaWNvbjogaXRlbS5jb3JlX3N5c3RlbV9jb25maWc/LnN5Y29fY29uZmlndXJhdGlvbi5zeWNvX2ljb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IGl0ZW0uY29yZV9zeXN0ZW1fY29uZmlnPy5zeWNvX2Rlc2MgfHwgXCJcIixcbiAgICAgICAgICBpc0FjdGl2ZTogaXRlbS5jb3JlX3N5c3RlbV9jb25maWc/LnN5Y29faXNhY3RpdmUgfHwgZmFsc2VcbiAgICAgICAgfSkpO1xuICAgICAgdGhpcy5kcmF3ZXJJdGVtc1NpZ25hbC5zZXQoaXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdlckl0ZW1zU2lnbmFsLnNldChbXSk7IC8vIENsZWFyIGl0ZW1zIGlmIG5vIGRyYXdlciBkYXRhXG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHRoZSBhY3RpdmUgY29tcG9uZW50IHRvIGRpc3BsYXkgaW4gdGhlIHNpZGUgZHJhd2VyXG4gIHNldEFjdGl2ZUNvbXBvbmVudChjb25maWdGb3I6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLmFjdGl2ZUNvbXBvbmVudFNpZ25hbC5zZXQoY29uZmlnRm9yKTtcbiAgfVxufVxuIl19