@ogidor/dashboard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,218 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class DashboardStateService {
5
+ constructor() {
6
+ this.STORAGE_KEY = 'xtb_dashboard_layout';
7
+ this.initialPages = [
8
+ {
9
+ id: 'page-1',
10
+ name: 'Default Workspace',
11
+ widgets: [
12
+ {
13
+ id: 'w-1',
14
+ type: 'LINE',
15
+ x: 0,
16
+ y: 0,
17
+ cols: 4,
18
+ rows: 4,
19
+ title: 'Market Trend',
20
+ data: { series: [{ name: 'Price', data: [30, 40, 35, 50, 49, 60, 70, 91, 125] }] }
21
+ },
22
+ {
23
+ id: 'w-2',
24
+ type: 'DONUT',
25
+ x: 4,
26
+ y: 0,
27
+ cols: 2,
28
+ rows: 4,
29
+ title: 'Asset Allocation',
30
+ data: { series: [44, 55, 41, 17, 15] }
31
+ }
32
+ ]
33
+ }
34
+ ];
35
+ this.pagesSubject = new BehaviorSubject(this.initialPages);
36
+ this.activePageIdSubject = new BehaviorSubject(this.initialPages[0].id);
37
+ /**
38
+ * Emits whenever a widget's data is updated programmatically.
39
+ * Key = widget id, value = new data payload.
40
+ */
41
+ this.widgetDataSubject = new Subject();
42
+ this.widgetData$ = this.widgetDataSubject.asObservable();
43
+ this.pages$ = this.pagesSubject.asObservable();
44
+ this.activePageId$ = this.activePageIdSubject.asObservable();
45
+ const saved = localStorage.getItem(this.STORAGE_KEY);
46
+ if (saved) {
47
+ try {
48
+ this.loadLayout(JSON.parse(saved));
49
+ }
50
+ catch (e) {
51
+ console.error('Failed to load saved layout', e);
52
+ }
53
+ }
54
+ }
55
+ getActivePage() {
56
+ return this.pagesSubject.value.find(p => p.id === this.activePageIdSubject.value);
57
+ }
58
+ setActivePage(id) {
59
+ this.activePageIdSubject.next(id);
60
+ }
61
+ addPage(name) {
62
+ const newPage = {
63
+ id: `page-${Date.now()}`,
64
+ name,
65
+ widgets: []
66
+ };
67
+ const updatedPages = [...this.pagesSubject.value, newPage];
68
+ this.pagesSubject.next(updatedPages);
69
+ this.activePageIdSubject.next(newPage.id);
70
+ this.saveToLocalStorage();
71
+ }
72
+ removePage(id) {
73
+ const pages = this.pagesSubject.value;
74
+ if (pages.length <= 1)
75
+ return;
76
+ const updatedPages = pages.filter(p => p.id !== id);
77
+ this.pagesSubject.next(updatedPages);
78
+ if (this.activePageIdSubject.value === id) {
79
+ this.activePageIdSubject.next(updatedPages[0].id);
80
+ }
81
+ this.saveToLocalStorage();
82
+ }
83
+ addWidget(type) {
84
+ const activePage = this.getActivePage();
85
+ if (!activePage)
86
+ return;
87
+ const newWidget = {
88
+ id: `widget-${Date.now()}`,
89
+ type,
90
+ x: 0, y: 0,
91
+ cols: type === 'DONUT' ? 2 : 4,
92
+ rows: 4,
93
+ title: `${type.charAt(0) + type.slice(1).toLowerCase()} Chart`,
94
+ data: this.getDefaultDataForType(type)
95
+ };
96
+ activePage.widgets.push(newWidget);
97
+ this.updatePages(this.pagesSubject.value);
98
+ }
99
+ addWidgetWithData(type, title, data) {
100
+ const activePage = this.getActivePage();
101
+ if (!activePage)
102
+ return;
103
+ const newWidget = {
104
+ id: `widget-${Date.now()}`,
105
+ type,
106
+ x: 0, y: 0,
107
+ cols: type === 'DONUT' ? 3 : 6,
108
+ rows: 4,
109
+ title,
110
+ data
111
+ };
112
+ activePage.widgets.push(newWidget);
113
+ this.updatePages(this.pagesSubject.value);
114
+ }
115
+ getDefaultDataForType(type) {
116
+ if (type === 'DONUT') {
117
+ return { series: [30, 20, 50] };
118
+ }
119
+ return {
120
+ series: [{
121
+ name: 'Sample Data',
122
+ data: Array.from({ length: 10 }, () => Math.floor(Math.random() * 100))
123
+ }]
124
+ };
125
+ }
126
+ updateWidgetPosition(pageId, widgetId, x, y, cols, rows) {
127
+ const pages = this.pagesSubject.value;
128
+ const page = pages.find(p => p.id === pageId);
129
+ if (page) {
130
+ const widget = page.widgets.find(w => w.id === widgetId);
131
+ if (widget) {
132
+ widget.x = x;
133
+ widget.y = y;
134
+ widget.cols = cols;
135
+ widget.rows = rows;
136
+ this.updatePages(pages);
137
+ }
138
+ }
139
+ }
140
+ removeWidget(widgetId) {
141
+ const activePage = this.getActivePage();
142
+ if (activePage) {
143
+ activePage.widgets = activePage.widgets.filter(w => w.id !== widgetId);
144
+ this.updatePages(this.pagesSubject.value);
145
+ }
146
+ }
147
+ /**
148
+ * Push new data into a widget by its id.
149
+ * The widget's chart will re-render immediately.
150
+ *
151
+ * @param widgetId The `id` of the target widget.
152
+ * @param data New data — `LineBarData` for LINE/BAR, `DonutData` for DONUT.
153
+ */
154
+ updateWidgetData(widgetId, data) {
155
+ const pages = this.pagesSubject.value;
156
+ for (const page of pages) {
157
+ const widget = page.widgets.find(w => w.id === widgetId);
158
+ if (widget) {
159
+ widget.data = data;
160
+ this.widgetDataSubject.next({ widgetId, data });
161
+ this.updatePages(pages);
162
+ return;
163
+ }
164
+ }
165
+ console.warn(`[Dashboard] updateWidgetData: widget "${widgetId}" not found.`);
166
+ }
167
+ updateWidgetMeta(widgetId, meta) {
168
+ const pages = this.pagesSubject.value;
169
+ for (const page of pages) {
170
+ const widget = page.widgets.find(w => w.id === widgetId);
171
+ if (widget) {
172
+ if (meta.title !== undefined)
173
+ widget.title = meta.title;
174
+ if (meta.colors !== undefined)
175
+ widget.colors = meta.colors;
176
+ if (meta.cardColor !== undefined)
177
+ widget.cardColor = meta.cardColor;
178
+ if (meta.data !== undefined) {
179
+ widget.data = meta.data;
180
+ this.widgetDataSubject.next({ widgetId, data: meta.data });
181
+ }
182
+ this.updatePages(pages);
183
+ return;
184
+ }
185
+ }
186
+ }
187
+ updatePages(pages) {
188
+ this.pagesSubject.next([...pages]);
189
+ this.saveToLocalStorage();
190
+ }
191
+ serializeLayout() {
192
+ const config = {
193
+ pages: this.pagesSubject.value,
194
+ activePageId: this.activePageIdSubject.value
195
+ };
196
+ return JSON.stringify(config);
197
+ }
198
+ loadLayout(config) {
199
+ if (config && config.pages) {
200
+ this.pagesSubject.next(config.pages);
201
+ if (config.activePageId) {
202
+ this.activePageIdSubject.next(config.activePageId);
203
+ }
204
+ }
205
+ }
206
+ saveToLocalStorage() {
207
+ localStorage.setItem(this.STORAGE_KEY, this.serializeLayout());
208
+ }
209
+ }
210
+ DashboardStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
211
+ DashboardStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardStateService, providedIn: 'root' });
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DashboardStateService, decorators: [{
213
+ type: Injectable,
214
+ args: [{
215
+ providedIn: 'root'
216
+ }]
217
+ }], ctorParameters: function () { return []; } });
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLXN0YXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwL2Rhc2hib2FyZC1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBTWhELE1BQU0sT0FBTyxxQkFBcUI7SUE2Q2hDO1FBNUNpQixnQkFBVyxHQUFHLHNCQUFzQixDQUFDO1FBRTlDLGlCQUFZLEdBQVc7WUFDN0I7Z0JBQ0UsRUFBRSxFQUFFLFFBQVE7Z0JBQ1osSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLEVBQUUsRUFBRSxLQUFLO3dCQUNULElBQUksRUFBRSxNQUFNO3dCQUNaLENBQUMsRUFBRSxDQUFDO3dCQUNKLENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLEtBQUssRUFBRSxjQUFjO3dCQUNyQixJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7cUJBQ25GO29CQUNEO3dCQUNFLEVBQUUsRUFBRSxLQUFLO3dCQUNULElBQUksRUFBRSxPQUFPO3dCQUNiLENBQUMsRUFBRSxDQUFDO3dCQUNKLENBQUMsRUFBRSxDQUFDO3dCQUNKLElBQUksRUFBRSxDQUFDO3dCQUNQLElBQUksRUFBRSxDQUFDO3dCQUNQLEtBQUssRUFBRSxrQkFBa0I7d0JBQ3pCLElBQUksRUFBRSxFQUFF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RSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxNQUFNLEdBQW9CO1lBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDOUIsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO1NBQzdDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFXO1FBQ3BCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7O21IQS9OVSxxQkFBcUI7dUhBQXJCLHFCQUFxQixjQUZwQixNQUFNOzRGQUVQLHFCQUFxQjtrQkFIakMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBhZ2UsIFdpZGdldCwgRGFzaGJvYXJkQ29uZmlnLCBXaWRnZXRUeXBlLCBMaW5lQmFyRGF0YSwgRG9udXREYXRhIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRTdGF0ZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfS0VZID0gJ3h0Yl9kYXNoYm9hcmRfbGF5b3V0JztcbiAgXG4gIHByaXZhdGUgaW5pdGlhbFBhZ2VzOiBQYWdlW10gPSBbXG4gICAge1xuICAgICAgaWQ6ICdwYWdlLTEnLFxuICAgICAgbmFtZTogJ0RlZmF1bHQgV29ya3NwYWNlJyxcbiAgICAgIHdpZGdldHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAndy0xJyxcbiAgICAgICAgICB0eXBlOiAnTElORScsXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIGNvbHM6IDQsXG4gICAgICAgICAgcm93czogNCxcbiAgICAgICAgICB0aXRsZTogJ01hcmtldCBUcmVuZCcsXG4gICAgICAgICAgZGF0YTogeyBzZXJpZXM6IFt7IG5hbWU6ICdQcmljZScsIGRhdGE6IFszMCwgNDAsIDM1LCA1MCwgNDksIDYwLCA3MCwgOTEsIDEyNV0gfV0gfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICd3LTInLFxuICAgICAgICAgIHR5cGU6ICdET05VVCcsXG4gICAgICAgICAgeDogNCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIGNvbHM6IDIsXG4gICAgICAgICAgcm93czogNCxcbiAgICAgICAgICB0aXRsZTogJ0Fzc2V0IEFsbG9jYXRpb24nLFxuICAgICAgICAgIGRhdGE6IHsgc2VyaWVzOiBbNDQsIDU1LCA0MSwgMTcsIDE1XSB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gIF07XG5cbiAgcHJpdmF0ZSBwYWdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhZ2VbXT4odGhpcy5pbml0aWFsUGFnZXMpO1xuICBwcml2YXRlIGFjdGl2ZVBhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5pbml0aWFsUGFnZXNbMF0uaWQpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuZXZlciBhIHdpZGdldCdzIGRhdGEgaXMgdXBkYXRlZCBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKiBLZXkgPSB3aWRnZXQgaWQsIHZhbHVlID0gbmV3IGRhdGEgcGF5bG9hZC5cbiAgICovXG4gIHByaXZhdGUgd2lkZ2V0RGF0YVN1YmplY3QgPSBuZXcgU3ViamVjdDx7IHdpZGdldElkOiBzdHJpbmc7IGRhdGE6IExpbmVCYXJEYXRhIHwgRG9udXREYXRhIH0+KCk7XG4gIHdpZGdldERhdGEkID0gdGhpcy53aWRnZXREYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwYWdlcyQgPSB0aGlzLnBhZ2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgYWN0aXZlUGFnZUlkJCA9IHRoaXMuYWN0aXZlUGFnZUlkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVkpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5sb2FkTGF5b3V0KEpTT04ucGFyc2Uoc2F2ZWQpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2F2ZWQgbGF5b3V0JywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QWN0aXZlUGFnZSgpOiBQYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlc1N1YmplY3QudmFsdWUuZmluZChwID0+IHAuaWQgPT09IHRoaXMuYWN0aXZlUGFnZUlkU3ViamVjdC52YWx1ZSk7XG4gIH1cblxuICBzZXRBY3RpdmVQYWdlKGlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZVBhZ2VJZFN1YmplY3QubmV4dChpZCk7XG4gIH1cblxuICBhZGRQYWdlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IG5ld1BhZ2U6IFBhZ2UgPSB7XG4gICAgICBpZDogYHBhZ2UtJHtEYXRlLm5vdygpfWAsXG4gICAgICBuYW1lLFxuICAgICAgd2lkZ2V0czogW11cbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZWRQYWdlcyA9IFsuLi50aGlzLnBhZ2VzU3ViamVjdC52YWx1ZSwgbmV3UGFnZV07XG4gICAgdGhpcy5wYWdlc1N1YmplY3QubmV4dCh1cGRhdGVkUGFnZXMpO1xuICAgIHRoaXMuYWN0aXZlUGFnZUlkU3ViamVjdC5uZXh0KG5ld1BhZ2UuaWQpO1xuICAgIHRoaXMuc2F2ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICByZW1vdmVQYWdlKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYWdlcyA9IHRoaXMucGFnZXNTdWJqZWN0LnZhbHVlO1xuICAgIGlmIChwYWdlcy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdXBkYXRlZFBhZ2VzID0gcGFnZXMuZmlsdGVyKHAgPT4gcC5pZCAhPT0gaWQpO1xuICAgIHRoaXMucGFnZXNTdWJqZWN0Lm5leHQodXBkYXRlZFBhZ2VzKTtcbiAgICBcbiAgICBpZiAodGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0LnZhbHVlID09PSBpZCkge1xuICAgICAgdGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0Lm5leHQodXBkYXRlZFBhZ2VzWzBdLmlkKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlVG9Mb2NhbFN0b3JhZ2UoKTtcbiAgfVxuXG4gIGFkZFdpZGdldCh0eXBlOiBXaWRnZXRUeXBlKSB7XG4gICAgY29uc3QgYWN0aXZlUGFnZSA9IHRoaXMuZ2V0QWN0aXZlUGFnZSgpO1xuICAgIGlmICghYWN0aXZlUGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3V2lkZ2V0OiBXaWRnZXQgPSB7XG4gICAgICBpZDogYHdpZGdldC0ke0RhdGUubm93KCl9YCxcbiAgICAgIHR5cGUsXG4gICAgICB4OiAwLCB5OiAwLFxuICAgICAgY29sczogdHlwZSA9PT0gJ0RPTlVUJyA/IDIgOiA0LFxuICAgICAgcm93czogNCxcbiAgICAgIHRpdGxlOiBgJHt0eXBlLmNoYXJBdCgwKSArIHR5cGUuc2xpY2UoMSkudG9Mb3dlckNhc2UoKX0gQ2hhcnRgLFxuICAgICAgZGF0YTogdGhpcy5nZXREZWZhdWx0RGF0YUZvclR5cGUodHlwZSlcbiAgICB9O1xuXG4gICAgYWN0aXZlUGFnZS53aWRnZXRzLnB1c2gobmV3V2lkZ2V0KTtcbiAgICB0aGlzLnVwZGF0ZVBhZ2VzKHRoaXMucGFnZXNTdWJqZWN0LnZhbHVlKTtcbiAgfVxuXG4gIGFkZFdpZGdldFdpdGhEYXRhKHR5cGU6IFdpZGdldFR5cGUsIHRpdGxlOiBzdHJpbmcsIGRhdGE6IExpbmVCYXJEYXRhIHwgRG9udXREYXRhKSB7XG4gICAgY29uc3QgYWN0aXZlUGFnZSA9IHRoaXMuZ2V0QWN0aXZlUGFnZSgpO1xuICAgIGlmICghYWN0aXZlUGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3V2lkZ2V0OiBXaWRnZXQgPSB7XG4gICAgICBpZDogYHdpZGdldC0ke0RhdGUubm93KCl9YCxcbiAgICAgIHR5cGUsXG4gICAgICB4OiAwLCB5OiAwLFxuICAgICAgY29sczogdHlwZSA9PT0gJ0RPTlVUJyA/IDMgOiA2LFxuICAgICAgcm93czogNCxcbiAgICAgIHRpdGxlLFxuICAgICAgZGF0YVxuICAgIH07XG5cbiAgICBhY3RpdmVQYWdlLndpZGdldHMucHVzaChuZXdXaWRnZXQpO1xuICAgIHRoaXMudXBkYXRlUGFnZXModGhpcy5wYWdlc1N1YmplY3QudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RGF0YUZvclR5cGUodHlwZTogV2lkZ2V0VHlwZSkge1xuICAgIGlmICh0eXBlID09PSAnRE9OVVQnKSB7XG4gICAgICByZXR1cm4geyBzZXJpZXM6IFszMCwgMjAsIDUwXSB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2VyaWVzOiBbe1xuICAgICAgICBuYW1lOiAnU2FtcGxlIERhdGEnLFxuICAgICAgICBkYXRhOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoKSA9PiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApKVxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0UG9zaXRpb24ocGFnZUlkOiBzdHJpbmcsIHdpZGdldElkOiBzdHJpbmcsIHg6IG51bWJlciwgeTogbnVtYmVyLCBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlc1N1YmplY3QudmFsdWU7XG4gICAgY29uc3QgcGFnZSA9IHBhZ2VzLmZpbmQocCA9PiBwLmlkID09PSBwYWdlSWQpO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBjb25zdCB3aWRnZXQgPSBwYWdlLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHdpZGdldElkKTtcbiAgICAgIGlmICh3aWRnZXQpIHtcbiAgICAgICAgd2lkZ2V0LnggPSB4O1xuICAgICAgICB3aWRnZXQueSA9IHk7XG4gICAgICAgIHdpZGdldC5jb2xzID0gY29scztcbiAgICAgICAgd2lkZ2V0LnJvd3MgPSByb3dzO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VzKHBhZ2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVXaWRnZXQod2lkZ2V0SWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZVBhZ2UgPSB0aGlzLmdldEFjdGl2ZVBhZ2UoKTtcbiAgICBpZiAoYWN0aXZlUGFnZSkge1xuICAgICAgYWN0aXZlUGFnZS53aWRnZXRzID0gYWN0aXZlUGFnZS53aWRnZXRzLmZpbHRlcih3ID0+IHcuaWQgIT09IHdpZGdldElkKTtcbiAgICAgIHRoaXMudXBkYXRlUGFnZXModGhpcy5wYWdlc1N1YmplY3QudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoIG5ldyBkYXRhIGludG8gYSB3aWRnZXQgYnkgaXRzIGlkLlxuICAgKiBUaGUgd2lkZ2V0J3MgY2hhcnQgd2lsbCByZS1yZW5kZXIgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSB3aWRnZXRJZCAgVGhlIGBpZGAgb2YgdGhlIHRhcmdldCB3aWRnZXQuXG4gICAqIEBwYXJhbSBkYXRhICAgICAgTmV3IGRhdGEg4oCUIGBMaW5lQmFyRGF0YWAgZm9yIExJTkUvQkFSLCBgRG9udXREYXRhYCBmb3IgRE9OVVQuXG4gICAqL1xuICB1cGRhdGVXaWRnZXREYXRhKHdpZGdldElkOiBzdHJpbmcsIGRhdGE6IExpbmVCYXJEYXRhIHwgRG9udXREYXRhKSB7XG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzU3ViamVjdC52YWx1ZTtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcbiAgICAgIGNvbnN0IHdpZGdldCA9IHBhZ2Uud2lkZ2V0cy5maW5kKHcgPT4gdy5pZCA9PT0gd2lkZ2V0SWQpO1xuICAgICAgaWYgKHdpZGdldCkge1xuICAgICAgICB3aWRnZXQuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMud2lkZ2V0RGF0YVN1YmplY3QubmV4dCh7IHdpZGdldElkLCBkYXRhIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhZ2VzKHBhZ2VzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLndhcm4oYFtEYXNoYm9hcmRdIHVwZGF0ZVdpZGdldERhdGE6IHdpZGdldCBcIiR7d2lkZ2V0SWR9XCIgbm90IGZvdW5kLmApO1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0TWV0YSh3aWRnZXRJZDogc3RyaW5nLCBtZXRhOiB7IHRpdGxlPzogc3RyaW5nOyBjb2xvcnM/OiBzdHJpbmdbXTsgY2FyZENvbG9yPzogc3RyaW5nOyBkYXRhPzogTGluZUJhckRhdGEgfCBEb251dERhdGEgfSkge1xuICAgIGNvbnN0IHBhZ2VzID0gdGhpcy5wYWdlc1N1YmplY3QudmFsdWU7XG4gICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG4gICAgICBjb25zdCB3aWRnZXQgPSBwYWdlLndpZGdldHMuZmluZCh3ID0+IHcuaWQgPT09IHdpZGdldElkKTtcbiAgICAgIGlmICh3aWRnZXQpIHtcbiAgICAgICAgaWYgKG1ldGEudGl0bGUgICAgICE9PSB1bmRlZmluZWQpIHdpZGdldC50aXRsZSAgICAgPSBtZXRhLnRpdGxlO1xuICAgICAgICBpZiAobWV0YS5jb2xvcnMgICAgIT09IHVuZGVmaW5lZCkgd2lkZ2V0LmNvbG9ycyAgICA9IG1ldGEuY29sb3JzO1xuICAgICAgICBpZiAobWV0YS5jYXJkQ29sb3IgIT09IHVuZGVmaW5lZCkgd2lkZ2V0LmNhcmRDb2xvciA9IG1ldGEuY2FyZENvbG9yO1xuICAgICAgICBpZiAobWV0YS5kYXRhICAgICAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHdpZGdldC5kYXRhID0gbWV0YS5kYXRhO1xuICAgICAgICAgIHRoaXMud2lkZ2V0RGF0YVN1YmplY3QubmV4dCh7IHdpZGdldElkLCBkYXRhOiBtZXRhLmRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQYWdlcyhwYWdlcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2VzKHBhZ2VzOiBQYWdlW10pIHtcbiAgICB0aGlzLnBhZ2VzU3ViamVjdC5uZXh0KFsuLi5wYWdlc10pO1xuICAgIHRoaXMuc2F2ZVRvTG9jYWxTdG9yYWdlKCk7XG4gIH1cblxuICBzZXJpYWxpemVMYXlvdXQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb25maWc6IERhc2hib2FyZENvbmZpZyA9IHtcbiAgICAgIHBhZ2VzOiB0aGlzLnBhZ2VzU3ViamVjdC52YWx1ZSxcbiAgICAgIGFjdGl2ZVBhZ2VJZDogdGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0LnZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnKTtcbiAgfVxuXG4gIGxvYWRMYXlvdXQoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5wYWdlcykge1xuICAgICAgdGhpcy5wYWdlc1N1YmplY3QubmV4dChjb25maWcucGFnZXMpO1xuICAgICAgaWYgKGNvbmZpZy5hY3RpdmVQYWdlSWQpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVQYWdlSWRTdWJqZWN0Lm5leHQoY29uZmlnLmFjdGl2ZVBhZ2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlVG9Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSwgdGhpcy5zZXJpYWxpemVMYXlvdXQoKSk7XG4gIH1cbn1cbiJdfQ==