@mediusinc/mng-commons-layout 5.2.0 → 5.3.0-rc.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 (41) hide show
  1. package/esm2022/index.mjs +5 -2
  2. package/esm2022/lib/components/footer.component.mjs +5 -3
  3. package/esm2022/lib/components/main-layout.component.mjs +11 -13
  4. package/esm2022/lib/components/menu-item.component.mjs +64 -144
  5. package/esm2022/lib/components/menu.component.mjs +10 -13
  6. package/esm2022/lib/components/pages/error/error.page.component.mjs +20 -0
  7. package/esm2022/lib/components/pages/not-found/not-found.page.component.mjs +20 -0
  8. package/esm2022/lib/components/settings.component.mjs +89 -0
  9. package/esm2022/lib/components/sidebar.component.mjs +11 -12
  10. package/esm2022/lib/components/topbar-user.component.mjs +23 -4
  11. package/esm2022/lib/components/topbar.component.mjs +4 -4
  12. package/esm2022/lib/helpers/menu-items.mjs +26 -0
  13. package/esm2022/lib/models/menu.model.mjs +1 -1
  14. package/esm2022/lib/provide.mjs +3 -1
  15. package/esm2022/lib/services/layout-feature-config.token.mjs +1 -1
  16. package/esm2022/lib/services/layout.service.mjs +166 -0
  17. package/esm2022/lib/services/menu.service.mjs +37 -37
  18. package/fesm2022/mediusinc-mng-commons-layout.mjs +437 -287
  19. package/fesm2022/mediusinc-mng-commons-layout.mjs.map +1 -1
  20. package/index.d.ts +4 -1
  21. package/lib/components/footer.component.d.ts +2 -0
  22. package/lib/components/main-layout.component.d.ts +2 -5
  23. package/lib/components/menu-item.component.d.ts +15 -27
  24. package/lib/components/menu.component.d.ts +3 -4
  25. package/lib/components/pages/error/error.page.component.d.ts +7 -0
  26. package/lib/components/pages/not-found/not-found.page.component.d.ts +7 -0
  27. package/lib/components/settings.component.d.ts +30 -0
  28. package/lib/components/sidebar.component.d.ts +2 -4
  29. package/lib/components/topbar-user.component.d.ts +5 -0
  30. package/lib/components/topbar.component.d.ts +2 -2
  31. package/lib/helpers/menu-items.d.ts +2 -0
  32. package/lib/models/menu.model.d.ts +2 -2
  33. package/lib/services/layout-feature-config.token.d.ts +73 -0
  34. package/lib/services/layout.service.d.ts +46 -0
  35. package/lib/services/menu.service.d.ts +7 -8
  36. package/package.json +2 -2
  37. package/scss/layout/mng/_mng_layout_styles.scss +1 -0
  38. package/scss/layout/mng/_mng_sidebar_vertical.scss +8 -0
  39. package/version-info.json +6 -6
  40. package/esm2022/lib/services/main-layout.component.service.mjs +0 -71
  41. package/lib/services/main-layout.component.service.d.ts +0 -17
@@ -0,0 +1,166 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Injectable, PLATFORM_ID, afterNextRender, computed, effect, inject, signal } from '@angular/core';
3
+ import { Subject } from 'rxjs';
4
+ import { COMMONS_MODULE_CONFIG_IT, CommonsStorageService } from '@mediusinc/mng-commons/core';
5
+ import { COMMONS_LAYOUT_FEATURE_CONFIG_IT } from './layout-feature-config.token';
6
+ import * as i0 from "@angular/core";
7
+ export class LayoutService {
8
+ getInitColorScheme() {
9
+ let colorScheme = this.storageService.getItem(this.typeName, this.storageColorSchemeKey);
10
+ if (colorScheme == null || !['dark', 'light', 'auto'].includes(colorScheme)) {
11
+ colorScheme = this.getDefaultColorScheme();
12
+ }
13
+ return colorScheme;
14
+ }
15
+ getInitActualColorScheme(colorScheme) {
16
+ if (colorScheme === 'auto') {
17
+ return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
18
+ }
19
+ else {
20
+ return colorScheme;
21
+ }
22
+ }
23
+ getDefaultColorScheme() {
24
+ return this.config?.colorScheme ?? this.commonsConfig?.app?.colorScheme ?? 'auto';
25
+ }
26
+ setColorScheme(scheme) {
27
+ const defaultColorScheme = this.getDefaultColorScheme();
28
+ if (scheme === defaultColorScheme) {
29
+ this.storageService.removeItem(this.typeName, this.storageColorSchemeKey);
30
+ }
31
+ else {
32
+ this.storageService.setItem(this.typeName, this.storageColorSchemeKey, scheme);
33
+ }
34
+ this._colorSchemeSetting.set(scheme);
35
+ this._colorScheme.set(this.getInitActualColorScheme(scheme));
36
+ }
37
+ constructor() {
38
+ this.typeName = 'MainLayoutComponentService';
39
+ this.storageMenuModeKey = 'menuMode';
40
+ this.storageColorSchemeKey = 'colorScheme';
41
+ this.platformId = inject(PLATFORM_ID);
42
+ this.document = inject(DOCUMENT);
43
+ this.commonsConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
44
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
45
+ this.storageService = inject(CommonsStorageService);
46
+ this.state = signal({
47
+ staticMenuDesktopInactive: false,
48
+ overlayMenuActive: false,
49
+ rightMenuActive: false,
50
+ configSidebarVisible: false,
51
+ staticMenuMobileActive: false,
52
+ menuHoverActive: false,
53
+ sidebarActive: false,
54
+ anchored: false
55
+ });
56
+ this.overlayOpen = new Subject();
57
+ this.overlayOpen$ = this.overlayOpen.asObservable();
58
+ // color scheme
59
+ this._colorSchemeSetting = signal(this.getInitColorScheme());
60
+ this.colorSchemeSetting = this._colorSchemeSetting.asReadonly();
61
+ this._colorScheme = signal(this.getInitActualColorScheme(this.colorSchemeSetting()));
62
+ this.colorScheme = this._colorScheme.asReadonly();
63
+ this.colorSchemeIsLight = computed(() => this._colorScheme() === 'light');
64
+ // menu mode
65
+ this.menuModes = this.config?.menuModes ?? ['static', 'overlay', 'reveal', 'drawer', 'slim', 'slim-plus'];
66
+ this._menuMode = signal(this.initMenuMode());
67
+ this.menuMode = this._menuMode.asReadonly();
68
+ // logos
69
+ this.appLogoLight = signal(this.config?.logoPathLight ?? this.commonsConfig?.app?.logoPathLight ?? this.config?.logoPath ?? this.commonsConfig?.app?.logoPath ?? 'assets/layout/images/logo.png');
70
+ this.appLogoDark = signal(this.config?.logoPathLight ?? this.commonsConfig?.app?.logoPathDark ?? this.config?.logoPath ?? this.commonsConfig?.app?.logoPath ?? 'assets/layout/images/logo.png');
71
+ this.appLogo = computed(() => (this.colorSchemeIsLight() ? this.appLogoLight() : this.appLogoDark()));
72
+ this.appLogoNameLight = signal(this.config?.logoNamePathLight ??
73
+ this.commonsConfig?.app?.logoNamePathLight ??
74
+ this.config?.logoNamePath ??
75
+ this.commonsConfig?.app?.logoNamePath ??
76
+ 'assets/layout/images/logo-appname.png');
77
+ this.appLogoNameDark = signal(this.config?.logoNamePathDark ??
78
+ this.commonsConfig?.app?.logoNamePathDark ??
79
+ this.config?.logoNamePath ??
80
+ this.commonsConfig?.app?.logoNamePath ??
81
+ 'assets/layout/images/logo-appname.png');
82
+ this.appLogoName = computed(() => (this.colorSchemeIsLight() ? this.appLogoNameLight() : this.appLogoNameDark()));
83
+ // overlays
84
+ this.isOverlay = computed(() => this.menuMode() === 'overlay');
85
+ this.isSlim = computed(() => this.menuMode() === 'slim');
86
+ this.isSlimPlus = computed(() => this.menuMode() === 'slim-plus');
87
+ afterNextRender(() => {
88
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
89
+ if (this.colorSchemeSetting() === 'auto') {
90
+ const newColorScheme = event.matches ? 'dark' : 'light';
91
+ this._colorScheme.set(newColorScheme);
92
+ }
93
+ });
94
+ });
95
+ effect(() => {
96
+ const colorScheme = this._colorScheme();
97
+ const linkElement = this.document.getElementById('app-theme');
98
+ if (colorScheme === 'dark' && linkElement.href.includes('light')) {
99
+ linkElement.href = 'theme-dark.css';
100
+ }
101
+ else if (colorScheme === 'light' && linkElement.href.includes('dark')) {
102
+ linkElement.href = 'theme-light.css';
103
+ }
104
+ });
105
+ }
106
+ onMenuModeChange(mode) {
107
+ if (!this.menuModes.includes(mode)) {
108
+ return;
109
+ }
110
+ if (mode === this.config?.menuMode) {
111
+ this.storageService.removeItem(this.typeName, this.storageMenuModeKey);
112
+ }
113
+ else {
114
+ this.storageService.setItem(this.typeName, this.storageMenuModeKey, mode);
115
+ }
116
+ this._menuMode.set(mode);
117
+ }
118
+ onMenuToggle() {
119
+ if (this.isOverlay()) {
120
+ this.state.update(state => ({
121
+ ...state,
122
+ overlayMenuActive: !state.overlayMenuActive
123
+ }));
124
+ if (this.state().overlayMenuActive) {
125
+ this.overlayOpen.next(null);
126
+ }
127
+ }
128
+ if (this.isDesktop()) {
129
+ this.state.update(state => ({
130
+ ...state,
131
+ staticMenuDesktopInactive: !state.staticMenuDesktopInactive
132
+ }));
133
+ }
134
+ else {
135
+ this.state.update(state => ({
136
+ ...state,
137
+ staticMenuMobileActive: !state.staticMenuMobileActive
138
+ }));
139
+ if (this.state().staticMenuMobileActive) {
140
+ this.overlayOpen.next(null);
141
+ }
142
+ }
143
+ }
144
+ onOverlaySubmenuOpen() {
145
+ this.overlayOpen.next(null);
146
+ }
147
+ isDesktop() {
148
+ return window.innerWidth > 991;
149
+ }
150
+ isMobile() {
151
+ return !this.isDesktop();
152
+ }
153
+ initMenuMode() {
154
+ const lsMode = this.storageService.getItem(this.typeName, this.storageMenuModeKey);
155
+ if (lsMode && this.menuModes.includes(lsMode)) {
156
+ return lsMode;
157
+ }
158
+ return this.config?.menuMode ?? 'static';
159
+ }
160
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
161
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: LayoutService }); }
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: LayoutService, decorators: [{
164
+ type: Injectable
165
+ }], ctorParameters: () => [] });
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2xheW91dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFDLHdCQUF3QixFQUFFLHFCQUFxQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFHNUYsT0FBTyxFQUFDLGdDQUFnQyxFQUE4QixNQUFNLCtCQUErQixDQUFDOztBQUc1RyxNQUFNLE9BQU8sYUFBYTtJQWdDZCxrQkFBa0I7UUFDdEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQWMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RyxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksQ0FBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFtQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzdGLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFdBQXdCO1FBQ3JELElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxN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SSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25HLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDO0lBQzdDLENBQUM7OEdBbExRLGFBQWE7a0hBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0luamVjdGFibGUsIFBMQVRGT1JNX0lELCBhZnRlck5leHRSZW5kZXIsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtDT01NT05TX01PRFVMRV9DT05GSUdfSVQsIENvbW1vbnNTdG9yYWdlU2VydmljZX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcblxuaW1wb3J0IHtMYXlvdXRTdGF0ZX0gZnJvbSAnLi4vbW9kZWxzL2xheW91dC1zdGF0ZS5tb2RlbCc7XG5pbXBvcnQge0NPTU1PTlNfTEFZT1VUX0ZFQVRVUkVfQ09ORklHX0lULCBDb2xvclNjaGVtZSwgTGF5b3V0TWVudU1vZGV9IGZyb20gJy4vbGF5b3V0LWZlYXR1cmUtY29uZmlnLnRva2VuJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExheW91dFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZU5hbWUgPSAnTWFpbkxheW91dENvbXBvbmVudFNlcnZpY2UnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZU1lbnVNb2RlS2V5ID0gJ21lbnVNb2RlJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VDb2xvclNjaGVtZUtleSA9ICdjb2xvclNjaGVtZSc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbW9uc0NvbmZpZyA9IGluamVjdChDT01NT05TX01PRFVMRV9DT05GSUdfSVQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KENPTU1PTlNfTEFZT1VUX0ZFQVRVUkVfQ09ORklHX0lULCB7b3B0aW9uYWw6IHRydWV9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KENvbW1vbnNTdG9yYWdlU2VydmljZSk7XG5cbiAgICBwdWJsaWMgc3RhdGUgPSBzaWduYWw8TGF5b3V0U3RhdGU+KHtcbiAgICAgICAgc3RhdGljTWVudURlc2t0b3BJbmFjdGl2ZTogZmFsc2UsXG4gICAgICAgIG92ZXJsYXlNZW51QWN0aXZlOiBmYWxzZSxcbiAgICAgICAgcmlnaHRNZW51QWN0aXZlOiBmYWxzZSxcbiAgICAgICAgY29uZmlnU2lkZWJhclZpc2libGU6IGZhbHNlLFxuICAgICAgICBzdGF0aWNNZW51TW9iaWxlQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgbWVudUhvdmVyQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgc2lkZWJhckFjdGl2ZTogZmFsc2UsXG4gICAgICAgIGFuY2hvcmVkOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBvdmVybGF5T3BlbiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwdWJsaWMgb3ZlcmxheU9wZW4kID0gdGhpcy5vdmVybGF5T3Blbi5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIGNvbG9yIHNjaGVtZVxuICAgIHByaXZhdGUgX2NvbG9yU2NoZW1lU2V0dGluZyA9IHNpZ25hbCh0aGlzLmdldEluaXRDb2xvclNjaGVtZSgpKTtcbiAgICBwdWJsaWMgY29sb3JTY2hlbWVTZXR0aW5nID0gdGhpcy5fY29sb3JTY2hlbWVTZXR0aW5nLmFzUmVhZG9ubHkoKTtcbiAgICBwcml2YXRlIF9jb2xvclNjaGVtZSA9IHNpZ25hbDxFeGNsdWRlPENvbG9yU2NoZW1lLCAnc3lzdGVtJz4+KHRoaXMuZ2V0SW5pdEFjdHVhbENvbG9yU2NoZW1lKHRoaXMuY29sb3JTY2hlbWVTZXR0aW5nKCkpKTtcbiAgICBwdWJsaWMgY29sb3JTY2hlbWUgPSB0aGlzLl9jb2xvclNjaGVtZS5hc1JlYWRvbmx5KCk7XG4gICAgcHVibGljIGNvbG9yU2NoZW1lSXNMaWdodCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2NvbG9yU2NoZW1lKCkgPT09ICdsaWdodCcpO1xuXG4gICAgcHJpdmF0ZSBnZXRJbml0Q29sb3JTY2hlbWUoKTogQ29sb3JTY2hlbWUge1xuICAgICAgICBsZXQgY29sb3JTY2hlbWUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08Q29sb3JTY2hlbWU+KHRoaXMudHlwZU5hbWUsIHRoaXMuc3RvcmFnZUNvbG9yU2NoZW1lS2V5KTtcbiAgICAgICAgaWYgKGNvbG9yU2NoZW1lID09IG51bGwgfHwgIShbJ2RhcmsnLCAnbGlnaHQnLCAnYXV0byddIGFzIENvbG9yU2NoZW1lW10pLmluY2x1ZGVzKGNvbG9yU2NoZW1lKSkge1xuICAgICAgICAgICAgY29sb3JTY2hlbWUgPSB0aGlzLmdldERlZmF1bHRDb2xvclNjaGVtZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclNjaGVtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluaXRBY3R1YWxDb2xvclNjaGVtZShjb2xvclNjaGVtZTogQ29sb3JTY2hlbWUpOiBFeGNsdWRlPENvbG9yU2NoZW1lLCAnc3lzdGVtJz4ge1xuICAgICAgICBpZiAoY29sb3JTY2hlbWUgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29sb3JTY2hlbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRDb2xvclNjaGVtZSgpOiBDb2xvclNjaGVtZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZz8uY29sb3JTY2hlbWUgPz8gdGhpcy5jb21tb25zQ29uZmlnPy5hcHA/LmNvbG9yU2NoZW1lID8/ICdhdXRvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29sb3JTY2hlbWUoc2NoZW1lOiBDb2xvclNjaGVtZSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0Q29sb3JTY2hlbWUgPSB0aGlzLmdldERlZmF1bHRDb2xvclNjaGVtZSgpO1xuICAgICAgICBpZiAoc2NoZW1lID09PSBkZWZhdWx0Q29sb3JTY2hlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLnR5cGVOYW1lLCB0aGlzLnN0b3JhZ2VDb2xvclNjaGVtZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0odGhpcy50eXBlTmFtZSwgdGhpcy5zdG9yYWdlQ29sb3JTY2hlbWVLZXksIHNjaGVtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29sb3JTY2hlbWVTZXR0aW5nLnNldChzY2hlbWUpO1xuICAgICAgICB0aGlzLl9jb2xvclNjaGVtZS5zZXQodGhpcy5nZXRJbml0QWN0dWFsQ29sb3JTY2hlbWUoc2NoZW1lKSk7XG4gICAgfVxuXG4gICAgLy8gbWVudSBtb2RlXG4gICAgcHVibGljIHJlYWRvbmx5IG1lbnVNb2RlczogTGF5b3V0TWVudU1vZGVbXSA9IHRoaXMuY29uZmlnPy5tZW51TW9kZXMgPz8gWydzdGF0aWMnLCAnb3ZlcmxheScsICdyZXZlYWwnLCAnZHJhd2VyJywgJ3NsaW0nLCAnc2xpbS1wbHVzJ107XG4gICAgcHJpdmF0ZSBfbWVudU1vZGUgPSBzaWduYWwodGhpcy5pbml0TWVudU1vZGUoKSk7XG4gICAgcHVibGljIG1lbnVNb2RlID0gdGhpcy5fbWVudU1vZGUuYXNSZWFkb25seSgpO1xuXG4gICAgLy8gbG9nb3NcbiAgICBwcml2YXRlIGFwcExvZ29MaWdodCA9IHNpZ25hbChcbiAgICAgICAgdGhpcy5jb25maWc/LmxvZ29QYXRoTGlnaHQgPz8gdGhpcy5jb21tb25zQ29uZmlnPy5hcHA/LmxvZ29QYXRoTGlnaHQgPz8gdGhpcy5jb25maWc/LmxvZ29QYXRoID8/IHRoaXMuY29tbW9uc0NvbmZpZz8uYXBwPy5sb2dvUGF0aCA/PyAnYXNzZXRzL2xheW91dC9pbWFnZXMvbG9nby5wbmcnXG4gICAgKTtcbiAgICBwcml2YXRlIGFwcExvZ29EYXJrID0gc2lnbmFsKFxuICAgICAgICB0aGlzLmNvbmZpZz8ubG9nb1BhdGhMaWdodCA/PyB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb1BhdGhEYXJrID8/IHRoaXMuY29uZmlnPy5sb2dvUGF0aCA/PyB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb1BhdGggPz8gJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2xvZ28ucG5nJ1xuICAgICk7XG4gICAgcHVibGljIGFwcExvZ28gPSBjb21wdXRlZCgoKSA9PiAodGhpcy5jb2xvclNjaGVtZUlzTGlnaHQoKSA/IHRoaXMuYXBwTG9nb0xpZ2h0KCkgOiB0aGlzLmFwcExvZ29EYXJrKCkpKTtcblxuICAgIHByaXZhdGUgYXBwTG9nb05hbWVMaWdodCA9IHNpZ25hbChcbiAgICAgICAgdGhpcy5jb25maWc/LmxvZ29OYW1lUGF0aExpZ2h0ID8/XG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb05hbWVQYXRoTGlnaHQgPz9cbiAgICAgICAgICAgIHRoaXMuY29uZmlnPy5sb2dvTmFtZVBhdGggPz9cbiAgICAgICAgICAgIHRoaXMuY29tbW9uc0NvbmZpZz8uYXBwPy5sb2dvTmFtZVBhdGggPz9cbiAgICAgICAgICAgICdhc3NldHMvbGF5b3V0L2ltYWdlcy9sb2dvLWFwcG5hbWUucG5nJ1xuICAgICk7XG4gICAgcHJpdmF0ZSBhcHBMb2dvTmFtZURhcmsgPSBzaWduYWwoXG4gICAgICAgIHRoaXMuY29uZmlnPy5sb2dvTmFtZVBhdGhEYXJrID8/XG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb05hbWVQYXRoRGFyayA/P1xuICAgICAgICAgICAgdGhpcy5jb25maWc/LmxvZ29OYW1lUGF0aCA/P1xuICAgICAgICAgICAgdGhpcy5jb21tb25zQ29uZmlnPy5hcHA/LmxvZ29OYW1lUGF0aCA/P1xuICAgICAgICAgICAgJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2xvZ28tYXBwbmFtZS5wbmcnXG4gICAgKTtcbiAgICBwdWJsaWMgYXBwTG9nb05hbWUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5jb2xvclNjaGVtZUlzTGlnaHQoKSA/IHRoaXMuYXBwTG9nb05hbWVMaWdodCgpIDogdGhpcy5hcHBMb2dvTmFtZURhcmsoKSkpO1xuXG4gICAgLy8gb3ZlcmxheXNcbiAgICBwdWJsaWMgaXNPdmVybGF5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tZW51TW9kZSgpID09PSAnb3ZlcmxheScpO1xuICAgIHB1YmxpYyBpc1NsaW0gPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1lbnVNb2RlKCkgPT09ICdzbGltJyk7XG4gICAgcHVibGljIGlzU2xpbVBsdXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1lbnVNb2RlKCkgPT09ICdzbGltLXBsdXMnKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sb3JTY2hlbWVTZXR0aW5nKCkgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2xvclNjaGVtZSA9IGV2ZW50Lm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2xvclNjaGVtZS5zZXQobmV3Q29sb3JTY2hlbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sb3JTY2hlbWUgPSB0aGlzLl9jb2xvclNjaGVtZSgpO1xuICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtdGhlbWUnKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoY29sb3JTY2hlbWUgPT09ICdkYXJrJyAmJiBsaW5rRWxlbWVudC5ocmVmLmluY2x1ZGVzKCdsaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9ICd0aGVtZS1kYXJrLmNzcyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yU2NoZW1lID09PSAnbGlnaHQnICYmIGxpbmtFbGVtZW50LmhyZWYuaW5jbHVkZXMoJ2RhcmsnKSkge1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSAndGhlbWUtbGlnaHQuY3NzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25NZW51TW9kZUNoYW5nZShtb2RlOiBMYXlvdXRNZW51TW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMubWVudU1vZGVzLmluY2x1ZGVzKG1vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGUgPT09IHRoaXMuY29uZmlnPy5tZW51TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMudHlwZU5hbWUsIHRoaXMuc3RvcmFnZU1lbnVNb2RlS2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLnR5cGVOYW1lLCB0aGlzLnN0b3JhZ2VNZW51TW9kZUtleSwgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWVudU1vZGUuc2V0KG1vZGUpO1xuICAgIH1cblxuICAgIG9uTWVudVRvZ2dsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPdmVybGF5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgb3ZlcmxheU1lbnVBY3RpdmU6ICFzdGF0ZS5vdmVybGF5TWVudUFjdGl2ZVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpLm92ZXJsYXlNZW51QWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5T3Blbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEZXNrdG9wKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc3RhdGljTWVudURlc2t0b3BJbmFjdGl2ZTogIXN0YXRlLnN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc3RhdGljTWVudU1vYmlsZUFjdGl2ZTogIXN0YXRlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmVcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUoKS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5T3Blbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PdmVybGF5U3VibWVudU9wZW4oKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheU9wZW4ubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBpc0Rlc2t0b3AoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA+IDk5MTtcbiAgICB9XG5cbiAgICBpc01vYmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGVza3RvcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdE1lbnVNb2RlKCk6IExheW91dE1lbnVNb2RlIHtcbiAgICAgICAgY29uc3QgbHNNb2RlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRJdGVtPExheW91dE1lbnVNb2RlPih0aGlzLnR5cGVOYW1lLCB0aGlzLnN0b3JhZ2VNZW51TW9kZUtleSk7XG4gICAgICAgIGlmIChsc01vZGUgJiYgdGhpcy5tZW51TW9kZXMuaW5jbHVkZXMobHNNb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxzTW9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc/Lm1lbnVNb2RlID8/ICdzdGF0aWMnO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,9 +1,10 @@
1
- import { DestroyRef, Injectable, inject } from '@angular/core';
1
+ import { DestroyRef, Injectable, inject, signal } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { NavigationEnd, Router } from '@angular/router';
4
- import { ReplaySubject, Subject, take } from 'rxjs';
5
- import { filter } from 'rxjs/operators';
4
+ import { ReplaySubject, startWith, take } from 'rxjs';
5
+ import { filter, map } from 'rxjs/operators';
6
6
  import { CommonsRouterService, LoggerService, adjustRouteMenuLazyChildrenRouterLinks, doesUrlMatchRouterLink } from '@mediusinc/mng-commons/core';
7
+ import { prepareMenuItemsToInternal } from '../helpers/menu-items';
7
8
  import * as i0 from "@angular/core";
8
9
  export class MenuService {
9
10
  constructor() {
@@ -11,50 +12,45 @@ export class MenuService {
11
12
  this.logger = LoggerService.create('MenuService');
12
13
  this.router = inject(Router);
13
14
  this.commonsRouter = inject(CommonsRouterService);
14
- this.menuSource = new ReplaySubject(1);
15
- this.resetSource = new Subject();
16
- this.menuSource$ = this.menuSource.asObservable();
17
- this.resetSource$ = this.resetSource.asObservable();
18
- this.menuItems = [];
15
+ this._menuItems = signal([]);
16
+ this.menuItems = this._menuItems.asReadonly();
17
+ this.menuChangeSubject = new ReplaySubject(1);
18
+ this.menuChange$ = this.menuChangeSubject.asObservable();
19
19
  this.routeLoadedChildrenSubscriptions = [];
20
20
  }
21
- initialize(menuItems) {
22
- this.menuItems = menuItems;
21
+ setItems(menuItems) {
23
22
  this.routeLoadedChildrenSubscriptions.forEach(s => s.unsubscribe());
24
23
  this.routeLoadedChildrenSubscriptions = [];
25
- this.generateMenuItemKeys(menuItems);
24
+ this._menuItems.set(prepareMenuItemsToInternal(menuItems));
25
+ this.appendListenersToLazyChildren(this._menuItems());
26
+ this.router.events;
26
27
  this.router.events
27
- .pipe(filter(event => event instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
28
+ .pipe(startWith(new NavigationEnd(0, this.router.url, this.router.url)), filter(event => event instanceof NavigationEnd), map(e => e), takeUntilDestroyed(this.destroyRef))
28
29
  .subscribe(e => {
29
30
  this.findAndSetActiveMenuItem(e.urlAfterRedirects);
30
31
  });
31
- this.findAndSetActiveMenuItem(this.router.url);
32
32
  }
33
- generateMenuItemKeys(menuItems, parentKey = '') {
34
- menuItems.forEach((item, idx) => {
35
- if (!item.index) {
36
- item.index = idx;
37
- item.key = parentKey ? parentKey + '-' + idx : idx.toString();
38
- }
39
- if (item.items) {
40
- this.generateMenuItemKeys(item.items, item.key);
41
- }
42
- else if (item.lazyChildren) {
33
+ appendListenersToLazyChildren(menuItems) {
34
+ menuItems.forEach(item => {
35
+ if (item.lazyChildren()) {
43
36
  this.listenToMenuItemLazyChildrenLoad(item);
44
37
  }
38
+ else if (item.items()) {
39
+ this.appendListenersToLazyChildren(item.items());
40
+ }
45
41
  });
46
42
  }
47
43
  findAndSetActiveMenuItem(url) {
48
- const matches = this.findActiveRouteMatches(this.menuItems, url);
44
+ const matches = this.findActiveRouteMatches(this.menuItems(), url);
49
45
  if (matches.length === 0) {
50
46
  this.reset();
51
47
  }
52
48
  else {
53
49
  const matchKey = matches[0][matches[0].length - 1].key;
54
50
  if (matchKey) {
55
- this.menuSource.next({
51
+ this.menuChangeSubject.next({
56
52
  key: matchKey,
57
- routeEvent: true
53
+ eventType: 'routeChange'
58
54
  });
59
55
  }
60
56
  else {
@@ -72,13 +68,14 @@ export class MenuService {
72
68
  .pipe(take(1))
73
69
  .subscribe({
74
70
  next: routes => {
75
- let menuItems = routes
71
+ const menuItemsFromRoutes = routes
76
72
  .filter(r => Array.isArray(r.data?.menuItems))
77
73
  .flatMap(r => r.data.menuItems);
78
- menuItems = adjustRouteMenuLazyChildrenRouterLinks(menuItem, menuItems);
79
- menuItem.items = menuItems;
80
- menuItem.lazyChildren = false;
81
- this.generateMenuItemKeys(menuItem.items, menuItem.key);
74
+ const menuItems = adjustRouteMenuLazyChildrenRouterLinks(menuItem, menuItemsFromRoutes);
75
+ menuItem.items.set(prepareMenuItemsToInternal(menuItems, menuItem.key));
76
+ this.appendListenersToLazyChildren(menuItem.items());
77
+ menuItem.itemsVisibility.set(menuItem.items()?.map(i => signal(true)));
78
+ menuItem.lazyChildren.set(false);
82
79
  this.findAndSetActiveMenuItem(this.router.url);
83
80
  }
84
81
  }));
@@ -86,11 +83,12 @@ export class MenuService {
86
83
  findActiveRouteMatches(menuItems, url) {
87
84
  const matches = [];
88
85
  for (const menuItem of menuItems) {
86
+ const chidldren = menuItem.items();
89
87
  if (menuItem.routerLink) {
90
88
  const isActive = doesUrlMatchRouterLink(menuItem.routerLink, url);
91
89
  if (isActive) {
92
- if (Array.isArray(menuItem.items)) {
93
- const itemsMatches = this.findActiveRouteMatches(menuItem.items, url);
90
+ if (Array.isArray(chidldren)) {
91
+ const itemsMatches = this.findActiveRouteMatches(chidldren, url);
94
92
  if (itemsMatches.length > 0) {
95
93
  matches.push(...itemsMatches.map(c => [menuItem, ...c]));
96
94
  }
@@ -103,8 +101,8 @@ export class MenuService {
103
101
  }
104
102
  }
105
103
  }
106
- else if (Array.isArray(menuItem.items)) {
107
- const itemsMatches = this.findActiveRouteMatches(menuItem.items, url);
104
+ else if (Array.isArray(chidldren)) {
105
+ const itemsMatches = this.findActiveRouteMatches(chidldren, url);
108
106
  if (itemsMatches.length > 0) {
109
107
  matches.push(...itemsMatches.map(c => [menuItem, ...c]));
110
108
  }
@@ -113,7 +111,9 @@ export class MenuService {
113
111
  return matches;
114
112
  }
115
113
  reset() {
116
- this.resetSource.next(true);
114
+ this.menuChangeSubject.next({
115
+ eventType: 'reset'
116
+ });
117
117
  }
118
118
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
119
119
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: MenuService }); }
@@ -121,4 +121,4 @@ export class MenuService {
121
121
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: MenuService, decorators: [{
122
122
  type: Injectable
123
123
  }] });
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxPQUFPLEVBQWdCLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFvQyxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0NBQXNDLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQzs7QUFLbkwsTUFBTSxPQUFPLFdBQVc7SUFEeEI7UUFFcUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxXQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0MsZUFBVSxHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUNuRCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFN0MsZ0JBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV2QyxjQUFTLEdBQTJCLEVBQUUsQ0FBQztR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QUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDOzhHQTFIUSxXQUFXO2tIQUFYLFdBQVc7OzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIEluamVjdGFibGUsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtOYXZpZ2F0aW9uRW5kLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7UmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7Q29tbW9uc01lbnVJdGVtLCBDb21tb25zUm91dGVEYXRhLCBDb21tb25zUm91dGVyU2VydmljZSwgTG9nZ2VyU2VydmljZSwgYWRqdXN0Um91dGVNZW51TGF6eUNoaWxkcmVuUm91dGVyTGlua3MsIGRvZXNVcmxNYXRjaFJvdXRlckxpbmt9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbmltcG9ydCB7TWVudUNoYW5nZUV2ZW50fSBmcm9tICcuLi9tb2RlbHMvbWVudS5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2VyU2VydmljZS5jcmVhdGUoJ01lbnVTZXJ2aWNlJyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbnNSb3V0ZXIgPSBpbmplY3QoQ29tbW9uc1JvdXRlclNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVudVNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PE1lbnVDaGFuZ2VFdmVudD4oMSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNldFNvdXJjZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBtZW51U291cmNlJCA9IHRoaXMubWVudVNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICByZXNldFNvdXJjZSQgPSB0aGlzLnJlc2V0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBtZW51SXRlbXM6IEFycmF5PENvbW1vbnNNZW51SXRlbT4gPSBbXTtcbiAgICBwcml2YXRlIHJvdXRlTG9hZGVkQ2hpbGRyZW5TdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgaW5pdGlhbGl6ZShtZW51SXRlbXM6IEFycmF5PENvbW1vbnNNZW51SXRlbT4pIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBtZW51SXRlbXM7XG5cbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW1zKTtcblxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZEFuZFNldEFjdGl2ZU1lbnVJdGVtKChlIGFzIE5hdmlnYXRpb25FbmQpLnVybEFmdGVyUmVkaXJlY3RzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmluZEFuZFNldEFjdGl2ZU1lbnVJdGVtKHRoaXMucm91dGVyLnVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZU1lbnVJdGVtS2V5cyhtZW51SXRlbXM6IEFycmF5PENvbW1vbnNNZW51SXRlbT4sIHBhcmVudEtleSA9ICcnKSB7XG4gICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uaW5kZXggPSBpZHg7XG4gICAgICAgICAgICAgICAgaXRlbS5rZXkgPSBwYXJlbnRLZXkgPyBwYXJlbnRLZXkgKyAnLScgKyBpZHggOiBpZHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlTWVudUl0ZW1LZXlzKGl0ZW0uaXRlbXMsIGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5sYXp5Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRvTWVudUl0ZW1MYXp5Q2hpbGRyZW5Mb2FkKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh1cmw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKHRoaXMubWVudUl0ZW1zLCB1cmwpO1xuICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gbWF0Y2hlc1swXVttYXRjaGVzWzBdLmxlbmd0aCAtIDFdLmtleTtcbiAgICAgICAgICAgIGlmIChtYXRjaEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVudVNvdXJjZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBtYXRjaEtleSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGVFdmVudDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBGb3VuZCBhY3RpdmUgbWVudSBpdGVtIGZvciB1cmwgJHt1cmx9LCBidXQgaXRlbSBrZXkgaXMgbm90IHByZXNlbnRgLCBtYXRjaGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBNdWx0aXBsZSBhY3RpdmUgbWVudSBpdGVtcyBmb3VuZCBmb3IgdXJsICR7dXJsfWAsIG1hdGNoZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaXN0ZW5Ub01lbnVJdGVtTGF6eUNoaWxkcmVuTG9hZChtZW51SXRlbTogQ29tbW9uc01lbnVJdGVtKSB7XG4gICAgICAgIHRoaXMucm91dGVMb2FkZWRDaGlsZHJlblN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuY29tbW9uc1JvdXRlclxuICAgICAgICAgICAgICAgIC5nZXRSb3V0ZUxvYWRlZENoaWxkcmVuJChtZW51SXRlbS5yb3V0ZXJMaW5rID8/ICcvJylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiByb3V0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lbnVJdGVtcyA9IHJvdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIociA9PiBBcnJheS5pc0FycmF5KChyLmRhdGEgYXMgQ29tbW9uc1JvdXRlRGF0YSB8IHVuZGVmaW5lZCk/Lm1lbnVJdGVtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAociA9PiAoci5kYXRhIGFzIENvbW1vbnNSb3V0ZURhdGEpLm1lbnVJdGVtcyEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW1zID0gYWRqdXN0Um91dGVNZW51TGF6eUNoaWxkcmVuUm91dGVyTGlua3MobWVudUl0ZW0sIG1lbnVJdGVtcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtLml0ZW1zID0gbWVudUl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0ubGF6eUNoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW0uaXRlbXMsIG1lbnVJdGVtLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBY3RpdmVSb3V0ZU1hdGNoZXMobWVudUl0ZW1zOiBBcnJheTxDb21tb25zTWVudUl0ZW0+LCB1cmw6IHN0cmluZyk6IENvbW1vbnNNZW51SXRlbVtdW10ge1xuICAgICAgICBjb25zdCBtYXRjaGVzOiBDb21tb25zTWVudUl0ZW1bXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVudUl0ZW0gb2YgbWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWVudUl0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gZG9lc1VybE1hdGNoUm91dGVyTGluayhtZW51SXRlbS5yb3V0ZXJMaW5rLCB1cmwpO1xuICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZW51SXRlbS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zTWF0Y2hlcyA9IHRoaXMuZmluZEFjdGl2ZVJvdXRlTWF0Y2hlcyhtZW51SXRlbS5pdGVtcywgdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCguLi5pdGVtc01hdGNoZXMubWFwKGMgPT4gW21lbnVJdGVtLCAuLi5jXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWVudUl0ZW0uaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNNYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKG1lbnVJdGVtLml0ZW1zLCB1cmwpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goLi4uaXRlbXNNYXRjaGVzLm1hcChjID0+IFttZW51SXRlbSwgLi4uY10pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRTb3VyY2UubmV4dCh0cnVlKTtcbiAgICB9XG59XG4iXX0=
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFFLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRELE9BQU8sRUFBQyxhQUFhLEVBQWdCLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBR0gsb0JBQW9CLEVBRXBCLGFBQWEsRUFDYixzQ0FBc0MsRUFDdEMsc0JBQXNCLEVBQ3pCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBSWpFLE1BQU0sT0FBTyxXQUFXO0lBRHhCO1FBRXFCLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsV0FBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXRELGVBQVUsR0FBRyxNQUFNLENBQTRCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELGNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUMzRSxn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O2dCQUNqRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUN4QixTQUFTLEVBQUUsT0FBTztTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQXpIUSxXQUFXO2tIQUFYLFdBQVc7OzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIEluamVjdGFibGUsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge05hdmlnYXRpb25FbmQsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHN0YXJ0V2l0aCwgdGFrZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgQ29tbW9uc01lbnVJdGVtLFxuICAgIENvbW1vbnNSb3V0ZURhdGEsXG4gICAgQ29tbW9uc1JvdXRlclNlcnZpY2UsXG4gICAgSW50ZXJuYWxDb21tb25zTWVudUl0ZW0sXG4gICAgTG9nZ2VyU2VydmljZSxcbiAgICBhZGp1c3RSb3V0ZU1lbnVMYXp5Q2hpbGRyZW5Sb3V0ZXJMaW5rcyxcbiAgICBkb2VzVXJsTWF0Y2hSb3V0ZXJMaW5rXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbmltcG9ydCB7cHJlcGFyZU1lbnVJdGVtc1RvSW50ZXJuYWx9IGZyb20gJy4uL2hlbHBlcnMvbWVudS1pdGVtcyc7XG5pbXBvcnQge01lbnVDaGFuZ2VFdmVudH0gZnJvbSAnLi4vbW9kZWxzL21lbnUubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTWVudVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dlclNlcnZpY2UuY3JlYXRlKCdNZW51U2VydmljZScpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tb25zUm91dGVyID0gaW5qZWN0KENvbW1vbnNSb3V0ZXJTZXJ2aWNlKTtcblxuICAgIHByaXZhdGUgX21lbnVJdGVtcyA9IHNpZ25hbDxJbnRlcm5hbENvbW1vbnNNZW51SXRlbVtdPihbXSk7XG4gICAgcHVibGljIG1lbnVJdGVtcyA9IHRoaXMuX21lbnVJdGVtcy5hc1JlYWRvbmx5KCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbnVDaGFuZ2VTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8TWVudUNoYW5nZUV2ZW50PigxKTtcbiAgICBtZW51Q2hhbmdlJCA9IHRoaXMubWVudUNoYW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIHJvdXRlTG9hZGVkQ2hpbGRyZW5TdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgc2V0SXRlbXMobWVudUl0ZW1zOiBBcnJheTxDb21tb25zTWVudUl0ZW0+KSB7XG4gICAgICAgIHRoaXMucm91dGVMb2FkZWRDaGlsZHJlblN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMucm91dGVMb2FkZWRDaGlsZHJlblN1YnNjcmlwdGlvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLl9tZW51SXRlbXMuc2V0KHByZXBhcmVNZW51SXRlbXNUb0ludGVybmFsKG1lbnVJdGVtcykpO1xuICAgICAgICB0aGlzLmFwcGVuZExpc3RlbmVyc1RvTGF6eUNoaWxkcmVuKHRoaXMuX21lbnVJdGVtcygpKTtcblxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHM7XG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG5ldyBOYXZpZ2F0aW9uRW5kKDAsIHRoaXMucm91dGVyLnVybCwgdGhpcy5yb3V0ZXIudXJsKSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXG4gICAgICAgICAgICAgICAgbWFwKGUgPT4gZSBhcyBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSgoZSBhcyBOYXZpZ2F0aW9uRW5kKS51cmxBZnRlclJlZGlyZWN0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZExpc3RlbmVyc1RvTGF6eUNoaWxkcmVuKG1lbnVJdGVtczogSW50ZXJuYWxDb21tb25zTWVudUl0ZW1bXSkge1xuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhenlDaGlsZHJlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5Ub01lbnVJdGVtTGF6eUNoaWxkcmVuTG9hZChpdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5pdGVtcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRMaXN0ZW5lcnNUb0xhenlDaGlsZHJlbihpdGVtLml0ZW1zKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh1cmw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKHRoaXMubWVudUl0ZW1zKCksIHVybCk7XG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hLZXkgPSBtYXRjaGVzWzBdW21hdGNoZXNbMF0ubGVuZ3RoIC0gMV0ua2V5O1xuICAgICAgICAgICAgaWYgKG1hdGNoS2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51Q2hhbmdlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBtYXRjaEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncm91dGVDaGFuZ2UnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZvdW5kIGFjdGl2ZSBtZW51IGl0ZW0gZm9yIHVybCAke3VybH0sIGJ1dCBpdGVtIGtleSBpcyBub3QgcHJlc2VudGAsIG1hdGNoZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYE11bHRpcGxlIGFjdGl2ZSBtZW51IGl0ZW1zIGZvdW5kIGZvciB1cmwgJHt1cmx9YCwgbWF0Y2hlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxpc3RlblRvTWVudUl0ZW1MYXp5Q2hpbGRyZW5Mb2FkKG1lbnVJdGVtOiBJbnRlcm5hbENvbW1vbnNNZW51SXRlbSkge1xuICAgICAgICB0aGlzLnJvdXRlTG9hZGVkQ2hpbGRyZW5TdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNSb3V0ZXJcbiAgICAgICAgICAgICAgICAuZ2V0Um91dGVMb2FkZWRDaGlsZHJlbiQobWVudUl0ZW0ucm91dGVyTGluayA/PyAnLycpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogcm91dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtc0Zyb21Sb3V0ZXMgPSByb3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHIgPT4gQXJyYXkuaXNBcnJheSgoci5kYXRhIGFzIENvbW1vbnNSb3V0ZURhdGEgfCB1bmRlZmluZWQpPy5tZW51SXRlbXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKHIgPT4gKHIuZGF0YSBhcyBDb21tb25zUm91dGVEYXRhKS5tZW51SXRlbXMhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IGFkanVzdFJvdXRlTWVudUxhenlDaGlsZHJlblJvdXRlckxpbmtzKG1lbnVJdGVtLCBtZW51SXRlbXNGcm9tUm91dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0uaXRlbXMuc2V0KHByZXBhcmVNZW51SXRlbXNUb0ludGVybmFsKG1lbnVJdGVtcywgbWVudUl0ZW0ua2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZExpc3RlbmVyc1RvTGF6eUNoaWxkcmVuKG1lbnVJdGVtLml0ZW1zKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0uaXRlbXNWaXNpYmlsaXR5LnNldChtZW51SXRlbS5pdGVtcygpPy5tYXAoaSA9PiBzaWduYWwodHJ1ZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtLmxhenlDaGlsZHJlbi5zZXQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBY3RpdmVSb3V0ZU1hdGNoZXMobWVudUl0ZW1zOiBBcnJheTxJbnRlcm5hbENvbW1vbnNNZW51SXRlbT4sIHVybDogc3RyaW5nKTogSW50ZXJuYWxDb21tb25zTWVudUl0ZW1bXVtdIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlczogSW50ZXJuYWxDb21tb25zTWVudUl0ZW1bXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVudUl0ZW0gb2YgbWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlkbGRyZW4gPSBtZW51SXRlbS5pdGVtcygpO1xuICAgICAgICAgICAgaWYgKG1lbnVJdGVtLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGRvZXNVcmxNYXRjaFJvdXRlckxpbmsobWVudUl0ZW0ucm91dGVyTGluaywgdXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpZGxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXNNYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKGNoaWRsZHJlbiwgdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCguLi5pdGVtc01hdGNoZXMubWFwKGMgPT4gW21lbnVJdGVtLCAuLi5jXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpZGxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zTWF0Y2hlcyA9IHRoaXMuZmluZEFjdGl2ZVJvdXRlTWF0Y2hlcyhjaGlkbGRyZW4sIHVybCk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCguLi5pdGVtc01hdGNoZXMubWFwKGMgPT4gW21lbnVJdGVtLCAuLi5jXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5tZW51Q2hhbmdlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3Jlc2V0J1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=