@push.rocks/smartdb 2.0.0 → 2.3.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 (43) hide show
  1. package/.smartconfig.json +11 -0
  2. package/dist_rust/rustdb_linux_amd64 +0 -0
  3. package/dist_rust/rustdb_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/index.d.ts +2 -0
  6. package/dist_ts/index.js +3 -1
  7. package/dist_ts/ts_local/classes.localsmartdb.js +7 -4
  8. package/dist_ts/ts_migration/classes.storagemigrator.d.ts +24 -0
  9. package/dist_ts/ts_migration/classes.storagemigrator.js +75 -0
  10. package/dist_ts/ts_migration/index.d.ts +1 -0
  11. package/dist_ts/ts_migration/index.js +2 -0
  12. package/dist_ts/ts_migration/migrators/v0_to_v1.d.ts +9 -0
  13. package/dist_ts/ts_migration/migrators/v0_to_v1.js +225 -0
  14. package/dist_ts/ts_smartdb/index.d.ts +1 -0
  15. package/dist_ts/ts_smartdb/rust-db-bridge.d.ts +80 -1
  16. package/dist_ts/ts_smartdb/rust-db-bridge.js +17 -2
  17. package/dist_ts/ts_smartdb/server/SmartdbServer.d.ts +31 -0
  18. package/dist_ts/ts_smartdb/server/SmartdbServer.js +47 -5
  19. package/dist_ts_debugserver/bundled.d.ts +4 -0
  20. package/dist_ts_debugserver/bundled.js +12 -0
  21. package/dist_ts_debugserver/classes.debugserver.d.ts +36 -0
  22. package/dist_ts_debugserver/classes.debugserver.js +95 -0
  23. package/dist_ts_debugserver/index.d.ts +2 -0
  24. package/dist_ts_debugserver/index.js +2 -0
  25. package/dist_ts_debugserver/plugins.d.ts +2 -0
  26. package/dist_ts_debugserver/plugins.js +3 -0
  27. package/dist_ts_debugui/index.d.ts +2 -0
  28. package/dist_ts_debugui/index.js +2 -0
  29. package/dist_ts_debugui/plugins.d.ts +1 -0
  30. package/dist_ts_debugui/plugins.js +2 -0
  31. package/dist_ts_debugui/smartdb-debugui.d.ts +62 -0
  32. package/dist_ts_debugui/smartdb-debugui.js +1132 -0
  33. package/package.json +9 -4
  34. package/readme.md +161 -42
  35. package/ts/00_commitinfo_data.ts +1 -1
  36. package/ts/index.ts +14 -0
  37. package/ts/ts_local/classes.localsmartdb.ts +5 -0
  38. package/ts/ts_migration/classes.storagemigrator.ts +93 -0
  39. package/ts/ts_migration/index.ts +1 -0
  40. package/ts/ts_migration/migrators/v0_to_v1.ts +253 -0
  41. package/ts/ts_smartdb/index.ts +11 -0
  42. package/ts/ts_smartdb/rust-db-bridge.ts +127 -3
  43. package/ts/ts_smartdb/server/SmartdbServer.ts +71 -0
@@ -0,0 +1,1132 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { DeesElement, customElement, html, css, property, state, cssManager } from './plugins.js';
8
+ let SmartdbDebugUi = class SmartdbDebugUi extends DeesElement {
9
+ #server_accessor_storage = null;
10
+ /** Direct server reference (Node-side usage). */
11
+ get server() { return this.#server_accessor_storage; }
12
+ set server(value) { this.#server_accessor_storage = value; }
13
+ #apiBaseUrl_accessor_storage = null;
14
+ /** Base URL for HTTP API (browser usage, e.g. "" for same origin). When set, uses fetch instead of direct server calls. */
15
+ get apiBaseUrl() { return this.#apiBaseUrl_accessor_storage; }
16
+ set apiBaseUrl(value) { this.#apiBaseUrl_accessor_storage = value; }
17
+ #refreshInterval_accessor_storage = 2000;
18
+ get refreshInterval() { return this.#refreshInterval_accessor_storage; }
19
+ set refreshInterval(value) { this.#refreshInterval_accessor_storage = value; }
20
+ #activeTab_accessor_storage = 'dashboard';
21
+ get activeTab() { return this.#activeTab_accessor_storage; }
22
+ set activeTab(value) { this.#activeTab_accessor_storage = value; }
23
+ #metrics_accessor_storage = null;
24
+ get metrics() { return this.#metrics_accessor_storage; }
25
+ set metrics(value) { this.#metrics_accessor_storage = value; }
26
+ #oplogStats_accessor_storage = null;
27
+ get oplogStats() { return this.#oplogStats_accessor_storage; }
28
+ set oplogStats(value) { this.#oplogStats_accessor_storage = value; }
29
+ #oplogEntries_accessor_storage = [];
30
+ get oplogEntries() { return this.#oplogEntries_accessor_storage; }
31
+ set oplogEntries(value) { this.#oplogEntries_accessor_storage = value; }
32
+ #collections_accessor_storage = [];
33
+ get collections() { return this.#collections_accessor_storage; }
34
+ set collections(value) { this.#collections_accessor_storage = value; }
35
+ #selectedCollection_accessor_storage = null;
36
+ get selectedCollection() { return this.#selectedCollection_accessor_storage; }
37
+ set selectedCollection(value) { this.#selectedCollection_accessor_storage = value; }
38
+ #documents_accessor_storage = [];
39
+ get documents() { return this.#documents_accessor_storage; }
40
+ set documents(value) { this.#documents_accessor_storage = value; }
41
+ #documentsTotal_accessor_storage = 0;
42
+ get documentsTotal() { return this.#documentsTotal_accessor_storage; }
43
+ set documentsTotal(value) { this.#documentsTotal_accessor_storage = value; }
44
+ #expandedOplogSeqs_accessor_storage = new Set();
45
+ get expandedOplogSeqs() { return this.#expandedOplogSeqs_accessor_storage; }
46
+ set expandedOplogSeqs(value) { this.#expandedOplogSeqs_accessor_storage = value; }
47
+ #revertTargetSeq_accessor_storage = 0;
48
+ get revertTargetSeq() { return this.#revertTargetSeq_accessor_storage; }
49
+ set revertTargetSeq(value) { this.#revertTargetSeq_accessor_storage = value; }
50
+ #revertPreview_accessor_storage = null;
51
+ get revertPreview() { return this.#revertPreview_accessor_storage; }
52
+ set revertPreview(value) { this.#revertPreview_accessor_storage = value; }
53
+ #revertInProgress_accessor_storage = false;
54
+ get revertInProgress() { return this.#revertInProgress_accessor_storage; }
55
+ set revertInProgress(value) { this.#revertInProgress_accessor_storage = value; }
56
+ #oplogFilter_accessor_storage = {};
57
+ get oplogFilter() { return this.#oplogFilter_accessor_storage; }
58
+ set oplogFilter(value) { this.#oplogFilter_accessor_storage = value; }
59
+ static { this.styles = [
60
+ cssManager.defaultStyles,
61
+ css `
62
+ :host {
63
+ display: block;
64
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
65
+ }
66
+
67
+ .debugui {
68
+ padding: 24px;
69
+ background: ${cssManager.bdTheme('#f8fafc', '#09090b')};
70
+ min-height: 100vh;
71
+ color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
72
+ }
73
+
74
+ .header {
75
+ display: flex;
76
+ align-items: center;
77
+ justify-content: space-between;
78
+ margin-bottom: 24px;
79
+ }
80
+
81
+ .header-left {
82
+ display: flex;
83
+ align-items: center;
84
+ gap: 12px;
85
+ }
86
+
87
+ .title {
88
+ font-size: 24px;
89
+ font-weight: 700;
90
+ }
91
+
92
+ .status-dot {
93
+ width: 10px;
94
+ height: 10px;
95
+ border-radius: 50%;
96
+ background: ${cssManager.bdTheme('#22c55e', '#22c55e')};
97
+ }
98
+
99
+ .status-dot.offline {
100
+ background: ${cssManager.bdTheme('#ef4444', '#ef4444')};
101
+ }
102
+
103
+ /* Tabs */
104
+ .tabs {
105
+ display: flex;
106
+ gap: 2px;
107
+ background: ${cssManager.bdTheme('#e2e8f0', '#1e1e1e')};
108
+ border-radius: 10px;
109
+ padding: 3px;
110
+ margin-bottom: 24px;
111
+ }
112
+
113
+ .tab {
114
+ padding: 8px 20px;
115
+ border-radius: 8px;
116
+ font-size: 13px;
117
+ font-weight: 500;
118
+ cursor: pointer;
119
+ transition: all 0.15s ease;
120
+ color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
121
+ border: none;
122
+ background: none;
123
+ }
124
+
125
+ .tab:hover {
126
+ color: ${cssManager.bdTheme('#0f172a', '#e2e8f0')};
127
+ }
128
+
129
+ .tab.active {
130
+ background: ${cssManager.bdTheme('#ffffff', '#27272a')};
131
+ color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
132
+ box-shadow: 0 1px 3px ${cssManager.bdTheme('rgba(0,0,0,0.08)', 'rgba(0,0,0,0.3)')};
133
+ }
134
+
135
+ /* Cards */
136
+ .card {
137
+ background: ${cssManager.bdTheme('#ffffff', '#18181b')};
138
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
139
+ border-radius: 12px;
140
+ padding: 20px;
141
+ margin-bottom: 16px;
142
+ }
143
+
144
+ .card-title {
145
+ font-size: 14px;
146
+ font-weight: 600;
147
+ color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
148
+ text-transform: uppercase;
149
+ letter-spacing: 0.5px;
150
+ margin-bottom: 12px;
151
+ }
152
+
153
+ /* Stats grid */
154
+ .stats-grid {
155
+ display: grid;
156
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
157
+ gap: 16px;
158
+ margin-bottom: 24px;
159
+ }
160
+
161
+ .stat-card {
162
+ background: ${cssManager.bdTheme('#ffffff', '#18181b')};
163
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
164
+ border-radius: 12px;
165
+ padding: 20px;
166
+ }
167
+
168
+ .stat-label {
169
+ font-size: 12px;
170
+ font-weight: 500;
171
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
172
+ text-transform: uppercase;
173
+ letter-spacing: 0.5px;
174
+ margin-bottom: 8px;
175
+ }
176
+
177
+ .stat-value {
178
+ font-size: 28px;
179
+ font-weight: 700;
180
+ color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
181
+ }
182
+
183
+ /* Collections */
184
+ .collections-layout {
185
+ display: grid;
186
+ grid-template-columns: 280px 1fr;
187
+ gap: 16px;
188
+ min-height: 500px;
189
+ }
190
+
191
+ .coll-sidebar {
192
+ background: ${cssManager.bdTheme('#ffffff', '#18181b')};
193
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
194
+ border-radius: 12px;
195
+ overflow: hidden;
196
+ }
197
+
198
+ .coll-item {
199
+ padding: 12px 16px;
200
+ cursor: pointer;
201
+ border-bottom: 1px solid ${cssManager.bdTheme('#f1f5f9', '#27272a')};
202
+ transition: background 0.1s ease;
203
+ font-size: 13px;
204
+ }
205
+
206
+ .coll-item:hover {
207
+ background: ${cssManager.bdTheme('#f8fafc', '#1f1f23')};
208
+ }
209
+
210
+ .coll-item.selected {
211
+ background: ${cssManager.bdTheme('#eff6ff', '#1e3a5f')};
212
+ color: ${cssManager.bdTheme('#1d4ed8', '#93c5fd')};
213
+ }
214
+
215
+ .coll-name {
216
+ font-weight: 500;
217
+ }
218
+
219
+ .coll-count {
220
+ font-size: 11px;
221
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
222
+ margin-top: 2px;
223
+ }
224
+
225
+ .doc-viewer {
226
+ background: ${cssManager.bdTheme('#ffffff', '#18181b')};
227
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
228
+ border-radius: 12px;
229
+ padding: 20px;
230
+ overflow: auto;
231
+ }
232
+
233
+ .doc-item {
234
+ background: ${cssManager.bdTheme('#f8fafc', '#0f0f12')};
235
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
236
+ border-radius: 8px;
237
+ padding: 12px 16px;
238
+ margin-bottom: 8px;
239
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
240
+ font-size: 12px;
241
+ line-height: 1.5;
242
+ white-space: pre-wrap;
243
+ word-break: break-all;
244
+ }
245
+
246
+ /* OpLog */
247
+ .oplog-filters {
248
+ display: flex;
249
+ gap: 8px;
250
+ margin-bottom: 16px;
251
+ flex-wrap: wrap;
252
+ }
253
+
254
+ .filter-chip {
255
+ padding: 6px 12px;
256
+ border-radius: 6px;
257
+ font-size: 12px;
258
+ font-weight: 500;
259
+ cursor: pointer;
260
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
261
+ background: ${cssManager.bdTheme('#ffffff', '#18181b')};
262
+ color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
263
+ transition: all 0.15s ease;
264
+ }
265
+
266
+ .filter-chip:hover,
267
+ .filter-chip.active {
268
+ background: ${cssManager.bdTheme('#eff6ff', '#1e3a5f')};
269
+ border-color: ${cssManager.bdTheme('#93c5fd', '#3b82f6')};
270
+ color: ${cssManager.bdTheme('#1d4ed8', '#93c5fd')};
271
+ }
272
+
273
+ .oplog-entry {
274
+ background: ${cssManager.bdTheme('#ffffff', '#18181b')};
275
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
276
+ border-radius: 10px;
277
+ margin-bottom: 8px;
278
+ overflow: hidden;
279
+ transition: box-shadow 0.15s ease;
280
+ }
281
+
282
+ .oplog-entry:hover {
283
+ box-shadow: 0 2px 8px ${cssManager.bdTheme('rgba(0,0,0,0.06)', 'rgba(0,0,0,0.2)')};
284
+ }
285
+
286
+ .oplog-header {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 12px;
290
+ padding: 12px 16px;
291
+ cursor: pointer;
292
+ }
293
+
294
+ .oplog-seq {
295
+ font-family: monospace;
296
+ font-size: 11px;
297
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
298
+ min-width: 40px;
299
+ }
300
+
301
+ .op-badge {
302
+ padding: 3px 8px;
303
+ border-radius: 4px;
304
+ font-size: 11px;
305
+ font-weight: 600;
306
+ text-transform: uppercase;
307
+ letter-spacing: 0.3px;
308
+ }
309
+
310
+ .op-badge.insert {
311
+ background: ${cssManager.bdTheme('#dcfce7', '#14532d')};
312
+ color: ${cssManager.bdTheme('#15803d', '#86efac')};
313
+ }
314
+
315
+ .op-badge.update {
316
+ background: ${cssManager.bdTheme('#dbeafe', '#1e3a8a')};
317
+ color: ${cssManager.bdTheme('#1e40af', '#93c5fd')};
318
+ }
319
+
320
+ .op-badge.delete {
321
+ background: ${cssManager.bdTheme('#fee2e2', '#7f1d1d')};
322
+ color: ${cssManager.bdTheme('#dc2626', '#fca5a5')};
323
+ }
324
+
325
+ .oplog-ns {
326
+ font-size: 13px;
327
+ font-weight: 500;
328
+ flex: 1;
329
+ }
330
+
331
+ .oplog-time {
332
+ font-size: 11px;
333
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
334
+ }
335
+
336
+ .oplog-docid {
337
+ font-size: 11px;
338
+ font-family: monospace;
339
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
340
+ }
341
+
342
+ .oplog-expand {
343
+ font-size: 11px;
344
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
345
+ transition: transform 0.2s ease;
346
+ }
347
+
348
+ .oplog-expand.expanded {
349
+ transform: rotate(90deg);
350
+ }
351
+
352
+ .oplog-diff {
353
+ padding: 0 16px 16px;
354
+ border-top: 1px solid ${cssManager.bdTheme('#f1f5f9', '#27272a')};
355
+ }
356
+
357
+ .diff-row {
358
+ display: flex;
359
+ align-items: baseline;
360
+ gap: 8px;
361
+ padding: 4px 0;
362
+ font-family: monospace;
363
+ font-size: 12px;
364
+ line-height: 1.6;
365
+ }
366
+
367
+ .diff-path {
368
+ color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
369
+ min-width: 120px;
370
+ }
371
+
372
+ .diff-added {
373
+ color: ${cssManager.bdTheme('#15803d', '#86efac')};
374
+ background: ${cssManager.bdTheme('#f0fdf4', '#052e16')};
375
+ padding: 1px 4px;
376
+ border-radius: 3px;
377
+ }
378
+
379
+ .diff-removed {
380
+ color: ${cssManager.bdTheme('#dc2626', '#fca5a5')};
381
+ background: ${cssManager.bdTheme('#fef2f2', '#450a0a')};
382
+ padding: 1px 4px;
383
+ border-radius: 3px;
384
+ }
385
+
386
+ .diff-changed-old {
387
+ color: ${cssManager.bdTheme('#dc2626', '#fca5a5')};
388
+ background: ${cssManager.bdTheme('#fef2f2', '#450a0a')};
389
+ padding: 1px 4px;
390
+ border-radius: 3px;
391
+ text-decoration: line-through;
392
+ }
393
+
394
+ .diff-changed-new {
395
+ color: ${cssManager.bdTheme('#15803d', '#86efac')};
396
+ background: ${cssManager.bdTheme('#f0fdf4', '#052e16')};
397
+ padding: 1px 4px;
398
+ border-radius: 3px;
399
+ }
400
+
401
+ /* Revert */
402
+ .revert-controls {
403
+ display: flex;
404
+ gap: 12px;
405
+ align-items: center;
406
+ margin-bottom: 20px;
407
+ }
408
+
409
+ .revert-input {
410
+ padding: 8px 12px;
411
+ border-radius: 8px;
412
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
413
+ background: ${cssManager.bdTheme('#ffffff', '#0f0f12')};
414
+ color: ${cssManager.bdTheme('#0f172a', '#f1f5f9')};
415
+ font-size: 14px;
416
+ font-family: monospace;
417
+ width: 120px;
418
+ outline: none;
419
+ }
420
+
421
+ .revert-input:focus {
422
+ border-color: ${cssManager.bdTheme('#3b82f6', '#3b82f6')};
423
+ }
424
+
425
+ .btn {
426
+ padding: 8px 16px;
427
+ border-radius: 8px;
428
+ font-size: 13px;
429
+ font-weight: 500;
430
+ cursor: pointer;
431
+ border: none;
432
+ transition: all 0.15s ease;
433
+ }
434
+
435
+ .btn-primary {
436
+ background: ${cssManager.bdTheme('#3b82f6', '#2563eb')};
437
+ color: white;
438
+ }
439
+
440
+ .btn-primary:hover {
441
+ background: ${cssManager.bdTheme('#2563eb', '#1d4ed8')};
442
+ }
443
+
444
+ .btn-danger {
445
+ background: ${cssManager.bdTheme('#ef4444', '#dc2626')};
446
+ color: white;
447
+ }
448
+
449
+ .btn-danger:hover {
450
+ background: ${cssManager.bdTheme('#dc2626', '#b91c1c')};
451
+ }
452
+
453
+ .btn:disabled {
454
+ opacity: 0.5;
455
+ cursor: not-allowed;
456
+ }
457
+
458
+ .revert-preview {
459
+ background: ${cssManager.bdTheme('#fffbeb', '#1c1305')};
460
+ border: 1px solid ${cssManager.bdTheme('#fcd34d', '#854d0e')};
461
+ border-radius: 10px;
462
+ padding: 16px;
463
+ margin-bottom: 16px;
464
+ }
465
+
466
+ .revert-preview-title {
467
+ font-weight: 600;
468
+ margin-bottom: 8px;
469
+ color: ${cssManager.bdTheme('#92400e', '#fbbf24')};
470
+ }
471
+
472
+ .empty-state {
473
+ text-align: center;
474
+ padding: 48px 24px;
475
+ color: ${cssManager.bdTheme('#94a3b8', '#64748b')};
476
+ }
477
+
478
+ .empty-state-text {
479
+ font-size: 15px;
480
+ margin-bottom: 4px;
481
+ }
482
+
483
+ .empty-state-sub {
484
+ font-size: 13px;
485
+ }
486
+
487
+ .doc-json-block {
488
+ background: ${cssManager.bdTheme('#f8fafc', '#0f0f12')};
489
+ border: 1px solid ${cssManager.bdTheme('#e2e8f0', '#27272a')};
490
+ border-radius: 6px;
491
+ padding: 12px;
492
+ margin-top: 8px;
493
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
494
+ font-size: 11px;
495
+ line-height: 1.5;
496
+ white-space: pre-wrap;
497
+ word-break: break-all;
498
+ max-height: 300px;
499
+ overflow: auto;
500
+ }
501
+
502
+ .diff-label {
503
+ font-size: 11px;
504
+ font-weight: 600;
505
+ text-transform: uppercase;
506
+ letter-spacing: 0.5px;
507
+ margin-top: 12px;
508
+ margin-bottom: 4px;
509
+ color: ${cssManager.bdTheme('#64748b', '#94a3b8')};
510
+ }
511
+ `,
512
+ ]; }
513
+ async connectedCallback() {
514
+ await super.connectedCallback();
515
+ // Auto-detect: if no server and no explicit apiBaseUrl, default to same-origin HTTP.
516
+ if (!this.server && this.apiBaseUrl === null) {
517
+ this.apiBaseUrl = '';
518
+ }
519
+ this.startRefreshing();
520
+ }
521
+ async disconnectedCallback() {
522
+ await super.disconnectedCallback();
523
+ this.stopRefreshing();
524
+ }
525
+ startRefreshing() {
526
+ if (this.refreshTimer)
527
+ clearInterval(this.refreshTimer);
528
+ this.refresh();
529
+ this.refreshTimer = setInterval(() => this.refresh(), this.refreshInterval);
530
+ }
531
+ stopRefreshing() {
532
+ if (this.refreshTimer) {
533
+ clearInterval(this.refreshTimer);
534
+ this.refreshTimer = null;
535
+ }
536
+ }
537
+ // --- Data access layer (supports both direct server calls and HTTP fetch) ---
538
+ get useHttp() {
539
+ return this.apiBaseUrl !== null;
540
+ }
541
+ async apiFetch(path, params = {}) {
542
+ const base = this.apiBaseUrl ?? '';
543
+ const url = new URL(`${base}/api/smartdb${path}`, window.location.origin);
544
+ for (const [k, v] of Object.entries(params)) {
545
+ if (v !== undefined && v !== null)
546
+ url.searchParams.set(k, String(v));
547
+ }
548
+ const res = await fetch(url.toString());
549
+ if (!res.ok)
550
+ throw new Error(`HTTP ${res.status}`);
551
+ return res.json();
552
+ }
553
+ async refresh() {
554
+ if (!this.useHttp && !this.server?.running) {
555
+ this.metrics = null;
556
+ this.oplogStats = null;
557
+ return;
558
+ }
559
+ try {
560
+ if (this.useHttp) {
561
+ const [metrics, oplogStats] = await Promise.all([
562
+ this.apiFetch('/metrics'),
563
+ this.apiFetch('/oplog/stats'),
564
+ ]);
565
+ this.metrics = metrics;
566
+ this.oplogStats = oplogStats;
567
+ }
568
+ else {
569
+ const [metrics, oplogStats] = await Promise.all([
570
+ this.server.getMetrics(),
571
+ this.server.getOpLogStats(),
572
+ ]);
573
+ this.metrics = metrics;
574
+ this.oplogStats = oplogStats;
575
+ }
576
+ if (this.activeTab === 'collections' && this.collections.length === 0) {
577
+ await this.loadCollections();
578
+ }
579
+ if (this.activeTab === 'oplog' || this.activeTab === 'revert') {
580
+ await this.loadOplog();
581
+ }
582
+ }
583
+ catch {
584
+ // Server may not be running yet.
585
+ }
586
+ }
587
+ async loadOplog() {
588
+ if (!this.useHttp && !this.server?.running)
589
+ return;
590
+ if (this.useHttp) {
591
+ const result = await this.apiFetch('/oplog', { limit: 200 });
592
+ this.oplogEntries = result.entries;
593
+ }
594
+ else {
595
+ const result = await this.server.getOpLog({ limit: 200 });
596
+ this.oplogEntries = result.entries;
597
+ }
598
+ }
599
+ async loadCollections() {
600
+ if (!this.useHttp && !this.server?.running)
601
+ return;
602
+ if (this.useHttp) {
603
+ const result = await this.apiFetch('/collections');
604
+ this.collections = result.collections;
605
+ }
606
+ else {
607
+ this.collections = await this.server.getCollections();
608
+ }
609
+ }
610
+ async selectCollection(db, name) {
611
+ this.selectedCollection = { db, name };
612
+ if (this.useHttp) {
613
+ const result = await this.apiFetch('/documents', { db, collection: name, limit: 50, skip: 0 });
614
+ this.documents = result.documents;
615
+ this.documentsTotal = result.total;
616
+ }
617
+ else {
618
+ if (!this.server?.running)
619
+ return;
620
+ const result = await this.server.getDocuments(db, name, 50, 0);
621
+ this.documents = result.documents;
622
+ this.documentsTotal = result.total;
623
+ }
624
+ }
625
+ toggleOplogEntry(seq) {
626
+ const next = new Set(this.expandedOplogSeqs);
627
+ if (next.has(seq)) {
628
+ next.delete(seq);
629
+ }
630
+ else {
631
+ next.add(seq);
632
+ }
633
+ this.expandedOplogSeqs = next;
634
+ }
635
+ async handlePreviewRevert() {
636
+ if (this.revertTargetSeq <= 0)
637
+ return;
638
+ if (this.useHttp) {
639
+ this.revertPreview = await this.apiFetch('/revert', { seq: this.revertTargetSeq, dryRun: true });
640
+ }
641
+ else {
642
+ if (!this.server?.running)
643
+ return;
644
+ this.revertPreview = await this.server.revertToSeq(this.revertTargetSeq, true);
645
+ }
646
+ }
647
+ async handleExecuteRevert() {
648
+ if (this.revertTargetSeq <= 0)
649
+ return;
650
+ this.revertInProgress = true;
651
+ try {
652
+ if (this.useHttp) {
653
+ await this.apiFetch('/revert', { seq: this.revertTargetSeq, dryRun: false });
654
+ }
655
+ else {
656
+ if (!this.server?.running)
657
+ return;
658
+ await this.server.revertToSeq(this.revertTargetSeq, false);
659
+ }
660
+ this.revertPreview = null;
661
+ this.revertTargetSeq = 0;
662
+ await this.refresh();
663
+ }
664
+ finally {
665
+ this.revertInProgress = false;
666
+ }
667
+ }
668
+ async switchTab(tab) {
669
+ this.activeTab = tab;
670
+ if (tab === 'collections') {
671
+ await this.loadCollections();
672
+ }
673
+ if (tab === 'oplog' || tab === 'revert') {
674
+ await this.loadOplog();
675
+ }
676
+ }
677
+ // --- Diff computation ---
678
+ computeDiff(prev, next) {
679
+ const diffs = [];
680
+ this.diffRecursive(prev || {}, next || {}, '', diffs);
681
+ return diffs;
682
+ }
683
+ diffRecursive(a, b, path, diffs) {
684
+ const aKeys = new Set(a && typeof a === 'object' ? Object.keys(a) : []);
685
+ const bKeys = new Set(b && typeof b === 'object' ? Object.keys(b) : []);
686
+ const allKeys = new Set([...aKeys, ...bKeys]);
687
+ for (const key of allKeys) {
688
+ const fullPath = path ? `${path}.${key}` : key;
689
+ const inA = aKeys.has(key);
690
+ const inB = bKeys.has(key);
691
+ if (!inA && inB) {
692
+ diffs.push({ path: fullPath, type: 'added', newValue: b[key] });
693
+ }
694
+ else if (inA && !inB) {
695
+ diffs.push({ path: fullPath, type: 'removed', oldValue: a[key] });
696
+ }
697
+ else if (typeof a[key] === 'object' &&
698
+ a[key] !== null &&
699
+ typeof b[key] === 'object' &&
700
+ b[key] !== null &&
701
+ !Array.isArray(a[key]) &&
702
+ !Array.isArray(b[key])) {
703
+ this.diffRecursive(a[key], b[key], fullPath, diffs);
704
+ }
705
+ else if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) {
706
+ diffs.push({
707
+ path: fullPath,
708
+ type: 'changed',
709
+ oldValue: a[key],
710
+ newValue: b[key],
711
+ });
712
+ }
713
+ }
714
+ }
715
+ formatValue(val) {
716
+ if (val === null || val === undefined)
717
+ return 'null';
718
+ if (typeof val === 'string')
719
+ return `"${val}"`;
720
+ if (typeof val === 'object')
721
+ return JSON.stringify(val);
722
+ return String(val);
723
+ }
724
+ formatTime(timestampMs) {
725
+ return new Date(timestampMs).toLocaleTimeString(undefined, {
726
+ hour: '2-digit',
727
+ minute: '2-digit',
728
+ second: '2-digit',
729
+ fractionalSecondDigits: 3,
730
+ });
731
+ }
732
+ // --- Render ---
733
+ render() {
734
+ const isOnline = this.useHttp ? this.metrics !== null : (this.server?.running ?? false);
735
+ return html `
736
+ <div class="debugui">
737
+ <div class="header">
738
+ <div class="header-left">
739
+ <div class="title">SmartDB Debug</div>
740
+ <div class="status-dot ${isOnline ? '' : 'offline'}"></div>
741
+ </div>
742
+ </div>
743
+
744
+ <div class="tabs">
745
+ ${['dashboard', 'collections', 'oplog', 'revert'].map((tab) => html `
746
+ <button
747
+ class="tab ${this.activeTab === tab ? 'active' : ''}"
748
+ @click=${() => this.switchTab(tab)}
749
+ >
750
+ ${tab === 'dashboard'
751
+ ? 'Dashboard'
752
+ : tab === 'collections'
753
+ ? 'Collections'
754
+ : tab === 'oplog'
755
+ ? 'OpLog'
756
+ : 'Revert'}
757
+ </button>
758
+ `)}
759
+ </div>
760
+
761
+ ${this.activeTab === 'dashboard' ? this.renderDashboard() : ''}
762
+ ${this.activeTab === 'collections' ? this.renderCollections() : ''}
763
+ ${this.activeTab === 'oplog' ? this.renderOplog() : ''}
764
+ ${this.activeTab === 'revert' ? this.renderRevert() : ''}
765
+ </div>
766
+ `;
767
+ }
768
+ renderDashboard() {
769
+ return html `
770
+ <div class="stats-grid">
771
+ <div class="stat-card">
772
+ <div class="stat-label">Databases</div>
773
+ <div class="stat-value">${this.metrics?.databases ?? '-'}</div>
774
+ </div>
775
+ <div class="stat-card">
776
+ <div class="stat-label">Collections</div>
777
+ <div class="stat-value">${this.metrics?.collections ?? '-'}</div>
778
+ </div>
779
+ <div class="stat-card">
780
+ <div class="stat-label">OpLog Entries</div>
781
+ <div class="stat-value">${this.oplogStats?.totalEntries ?? '-'}</div>
782
+ </div>
783
+ <div class="stat-card">
784
+ <div class="stat-label">Current Seq</div>
785
+ <div class="stat-value">${this.oplogStats?.currentSeq ?? '-'}</div>
786
+ </div>
787
+ <div class="stat-card">
788
+ <div class="stat-label">Uptime</div>
789
+ <div class="stat-value">
790
+ ${this.metrics ? this.formatUptime(this.metrics.uptimeSeconds) : '-'}
791
+ </div>
792
+ </div>
793
+ </div>
794
+
795
+ ${this.oplogStats
796
+ ? html `
797
+ <div class="card">
798
+ <div class="card-title">Operations Breakdown</div>
799
+ <div class="stats-grid">
800
+ <div class="stat-card">
801
+ <div class="stat-label">Inserts</div>
802
+ <div class="stat-value" style="color: #22c55e">
803
+ ${this.oplogStats.entriesByOp.insert}
804
+ </div>
805
+ </div>
806
+ <div class="stat-card">
807
+ <div class="stat-label">Updates</div>
808
+ <div class="stat-value" style="color: #3b82f6">
809
+ ${this.oplogStats.entriesByOp.update}
810
+ </div>
811
+ </div>
812
+ <div class="stat-card">
813
+ <div class="stat-label">Deletes</div>
814
+ <div class="stat-value" style="color: #ef4444">
815
+ ${this.oplogStats.entriesByOp.delete}
816
+ </div>
817
+ </div>
818
+ </div>
819
+ </div>
820
+ `
821
+ : ''}
822
+ `;
823
+ }
824
+ formatUptime(secs) {
825
+ if (secs < 60)
826
+ return `${secs}s`;
827
+ if (secs < 3600)
828
+ return `${Math.floor(secs / 60)}m`;
829
+ return `${Math.floor(secs / 3600)}h ${Math.floor((secs % 3600) / 60)}m`;
830
+ }
831
+ renderCollections() {
832
+ return html `
833
+ <div class="collections-layout">
834
+ <div class="coll-sidebar">
835
+ ${this.collections.length === 0
836
+ ? html `<div class="empty-state">
837
+ <div class="empty-state-text">No collections</div>
838
+ </div>`
839
+ : this.collections.map((c) => html `
840
+ <div
841
+ class="coll-item ${this.selectedCollection?.db === c.db &&
842
+ this.selectedCollection?.name === c.name
843
+ ? 'selected'
844
+ : ''}"
845
+ @click=${() => this.selectCollection(c.db, c.name)}
846
+ >
847
+ <div class="coll-name">${c.db}.${c.name}</div>
848
+ <div class="coll-count">${c.count} documents</div>
849
+ </div>
850
+ `)}
851
+ </div>
852
+
853
+ <div class="doc-viewer">
854
+ ${this.selectedCollection
855
+ ? html `
856
+ <div class="card-title">
857
+ ${this.selectedCollection.db}.${this.selectedCollection.name}
858
+ (${this.documentsTotal} total)
859
+ </div>
860
+ ${this.documents.length === 0
861
+ ? html `<div class="empty-state">
862
+ <div class="empty-state-text">No documents</div>
863
+ </div>`
864
+ : this.documents.map((doc) => html `
865
+ <div class="doc-item">${JSON.stringify(doc, null, 2)}</div>
866
+ `)}
867
+ `
868
+ : html `<div class="empty-state">
869
+ <div class="empty-state-text">Select a collection</div>
870
+ <div class="empty-state-sub">
871
+ Choose a collection from the sidebar to browse its documents
872
+ </div>
873
+ </div>`}
874
+ </div>
875
+ </div>
876
+ `;
877
+ }
878
+ renderOplog() {
879
+ const filtered = this.getFilteredOplog();
880
+ return html `
881
+ <div class="oplog-filters">
882
+ <button
883
+ class="filter-chip ${!this.oplogFilter.op ? 'active' : ''}"
884
+ @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: undefined })}
885
+ >
886
+ All
887
+ </button>
888
+ <button
889
+ class="filter-chip ${this.oplogFilter.op === 'insert' ? 'active' : ''}"
890
+ @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: 'insert' })}
891
+ >
892
+ Inserts
893
+ </button>
894
+ <button
895
+ class="filter-chip ${this.oplogFilter.op === 'update' ? 'active' : ''}"
896
+ @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: 'update' })}
897
+ >
898
+ Updates
899
+ </button>
900
+ <button
901
+ class="filter-chip ${this.oplogFilter.op === 'delete' ? 'active' : ''}"
902
+ @click=${() => (this.oplogFilter = { ...this.oplogFilter, op: 'delete' })}
903
+ >
904
+ Deletes
905
+ </button>
906
+ </div>
907
+
908
+ ${filtered.length === 0
909
+ ? html `<div class="empty-state">
910
+ <div class="empty-state-text">No oplog entries</div>
911
+ <div class="empty-state-sub">Write operations will appear here as they occur</div>
912
+ </div>`
913
+ : [...filtered].reverse().map((entry) => this.renderOplogEntry(entry))}
914
+ `;
915
+ }
916
+ getFilteredOplog() {
917
+ let entries = this.oplogEntries;
918
+ if (this.oplogFilter.op) {
919
+ entries = entries.filter((e) => e.op === this.oplogFilter.op);
920
+ }
921
+ if (this.oplogFilter.collection) {
922
+ entries = entries.filter((e) => `${e.db}.${e.collection}` === this.oplogFilter.collection);
923
+ }
924
+ return entries;
925
+ }
926
+ renderOplogEntry(entry) {
927
+ const isExpanded = this.expandedOplogSeqs.has(entry.seq);
928
+ const diffs = isExpanded
929
+ ? this.computeDiff(entry.previousDocument, entry.document)
930
+ : [];
931
+ return html `
932
+ <div class="oplog-entry">
933
+ <div class="oplog-header" @click=${() => this.toggleOplogEntry(entry.seq)}>
934
+ <span class="oplog-seq">#${entry.seq}</span>
935
+ <span class="op-badge ${entry.op}">${entry.op}</span>
936
+ <span class="oplog-ns">${entry.db}.${entry.collection}</span>
937
+ <span class="oplog-docid">${entry.documentId.substring(0, 12)}...</span>
938
+ <span class="oplog-time">${this.formatTime(entry.timestampMs)}</span>
939
+ <span class="oplog-expand ${isExpanded ? 'expanded' : ''}">&#9654;</span>
940
+ </div>
941
+
942
+ ${isExpanded
943
+ ? html `
944
+ <div class="oplog-diff">
945
+ ${entry.op === 'insert'
946
+ ? html `
947
+ <div class="diff-label">Inserted Document</div>
948
+ <div class="doc-json-block">
949
+ ${JSON.stringify(entry.document, null, 2)}
950
+ </div>
951
+ `
952
+ : entry.op === 'delete'
953
+ ? html `
954
+ <div class="diff-label">Deleted Document</div>
955
+ <div class="doc-json-block">
956
+ ${JSON.stringify(entry.previousDocument, null, 2)}
957
+ </div>
958
+ `
959
+ : html `
960
+ <div class="diff-label">Changes</div>
961
+ ${diffs.length > 0
962
+ ? diffs.map((d) => this.renderDiffRow(d))
963
+ : html `<div style="font-size: 12px; color: #94a3b8; padding: 4px 0">
964
+ No field-level changes
965
+ </div>`}
966
+ <div class="diff-label">Before</div>
967
+ <div class="doc-json-block">
968
+ ${JSON.stringify(entry.previousDocument, null, 2)}
969
+ </div>
970
+ <div class="diff-label">After</div>
971
+ <div class="doc-json-block">
972
+ ${JSON.stringify(entry.document, null, 2)}
973
+ </div>
974
+ `}
975
+ </div>
976
+ `
977
+ : ''}
978
+ </div>
979
+ `;
980
+ }
981
+ renderDiffRow(diff) {
982
+ return html `
983
+ <div class="diff-row">
984
+ <span class="diff-path">${diff.path}</span>
985
+ ${diff.type === 'added'
986
+ ? html `<span class="diff-added">+ ${this.formatValue(diff.newValue)}</span>`
987
+ : diff.type === 'removed'
988
+ ? html `<span class="diff-removed">- ${this.formatValue(diff.oldValue)}</span>`
989
+ : html `
990
+ <span class="diff-changed-old">${this.formatValue(diff.oldValue)}</span>
991
+ <span style="color: #94a3b8">-></span>
992
+ <span class="diff-changed-new">${this.formatValue(diff.newValue)}</span>
993
+ `}
994
+ </div>
995
+ `;
996
+ }
997
+ renderRevert() {
998
+ const currentSeq = this.oplogStats?.currentSeq ?? 0;
999
+ return html `
1000
+ <div class="card">
1001
+ <div class="card-title">Point-in-Time Revert</div>
1002
+ <p style="font-size: 13px; color: ${cssManager.bdTheme('#64748b', '#94a3b8')}; margin-bottom: 16px">
1003
+ Revert the database to a specific oplog sequence number. All operations after that
1004
+ point will be undone in reverse order.
1005
+ Current sequence: <strong>${currentSeq}</strong>
1006
+ </p>
1007
+
1008
+ <div class="revert-controls">
1009
+ <label style="font-size: 13px; font-weight: 500">Target seq:</label>
1010
+ <input
1011
+ class="revert-input"
1012
+ type="number"
1013
+ min="0"
1014
+ max="${currentSeq}"
1015
+ .value=${String(this.revertTargetSeq)}
1016
+ @input=${(e) => {
1017
+ this.revertTargetSeq = parseInt(e.target.value) || 0;
1018
+ this.revertPreview = null;
1019
+ }}
1020
+ />
1021
+ <button
1022
+ class="btn btn-primary"
1023
+ ?disabled=${this.revertTargetSeq <= 0 || this.revertTargetSeq > currentSeq}
1024
+ @click=${this.handlePreviewRevert}
1025
+ >
1026
+ Preview
1027
+ </button>
1028
+ </div>
1029
+
1030
+ ${this.revertPreview
1031
+ ? html `
1032
+ <div class="revert-preview">
1033
+ <div class="revert-preview-title">
1034
+ Revert Preview: ${this.revertPreview.reverted} operations to undo
1035
+ </div>
1036
+ ${this.revertPreview.entries?.map((e) => html `
1037
+ <div style="font-size: 12px; padding: 2px 0; font-family: monospace">
1038
+ #${e.seq} ${e.op} ${e.db}.${e.collection} (${e.documentId})
1039
+ </div>
1040
+ `)}
1041
+ <div style="margin-top: 12px">
1042
+ <button
1043
+ class="btn btn-danger"
1044
+ ?disabled=${this.revertInProgress}
1045
+ @click=${this.handleExecuteRevert}
1046
+ >
1047
+ ${this.revertInProgress ? 'Reverting...' : 'Execute Revert'}
1048
+ </button>
1049
+ </div>
1050
+ </div>
1051
+ `
1052
+ : ''}
1053
+ </div>
1054
+
1055
+ <div class="card">
1056
+ <div class="card-title">Recent Operations (newest first)</div>
1057
+ ${this.oplogEntries.length === 0
1058
+ ? html `<div class="empty-state">
1059
+ <div class="empty-state-text">No operations recorded yet</div>
1060
+ </div>`
1061
+ : [...this.oplogEntries]
1062
+ .reverse()
1063
+ .slice(0, 20)
1064
+ .map((entry) => html `
1065
+ <div
1066
+ style="display: flex; gap: 8px; align-items: center; padding: 6px 0; font-size: 12px; border-bottom: 1px solid ${cssManager.bdTheme('#f1f5f9', '#27272a')}"
1067
+ >
1068
+ <span class="oplog-seq">#${entry.seq}</span>
1069
+ <span class="op-badge ${entry.op}">${entry.op}</span>
1070
+ <span style="flex: 1">${entry.db}.${entry.collection}</span>
1071
+ <span style="font-family: monospace; color: ${cssManager.bdTheme('#94a3b8', '#64748b')}"
1072
+ >${entry.documentId.substring(0, 12)}</span
1073
+ >
1074
+ </div>
1075
+ `)}
1076
+ </div>
1077
+ `;
1078
+ }
1079
+ };
1080
+ __decorate([
1081
+ property({ type: Object })
1082
+ ], SmartdbDebugUi.prototype, "server", null);
1083
+ __decorate([
1084
+ property({ type: String })
1085
+ ], SmartdbDebugUi.prototype, "apiBaseUrl", null);
1086
+ __decorate([
1087
+ property({ type: Number })
1088
+ ], SmartdbDebugUi.prototype, "refreshInterval", null);
1089
+ __decorate([
1090
+ state()
1091
+ ], SmartdbDebugUi.prototype, "activeTab", null);
1092
+ __decorate([
1093
+ state()
1094
+ ], SmartdbDebugUi.prototype, "metrics", null);
1095
+ __decorate([
1096
+ state()
1097
+ ], SmartdbDebugUi.prototype, "oplogStats", null);
1098
+ __decorate([
1099
+ state()
1100
+ ], SmartdbDebugUi.prototype, "oplogEntries", null);
1101
+ __decorate([
1102
+ state()
1103
+ ], SmartdbDebugUi.prototype, "collections", null);
1104
+ __decorate([
1105
+ state()
1106
+ ], SmartdbDebugUi.prototype, "selectedCollection", null);
1107
+ __decorate([
1108
+ state()
1109
+ ], SmartdbDebugUi.prototype, "documents", null);
1110
+ __decorate([
1111
+ state()
1112
+ ], SmartdbDebugUi.prototype, "documentsTotal", null);
1113
+ __decorate([
1114
+ state()
1115
+ ], SmartdbDebugUi.prototype, "expandedOplogSeqs", null);
1116
+ __decorate([
1117
+ state()
1118
+ ], SmartdbDebugUi.prototype, "revertTargetSeq", null);
1119
+ __decorate([
1120
+ state()
1121
+ ], SmartdbDebugUi.prototype, "revertPreview", null);
1122
+ __decorate([
1123
+ state()
1124
+ ], SmartdbDebugUi.prototype, "revertInProgress", null);
1125
+ __decorate([
1126
+ state()
1127
+ ], SmartdbDebugUi.prototype, "oplogFilter", null);
1128
+ SmartdbDebugUi = __decorate([
1129
+ customElement('smartdb-debugui')
1130
+ ], SmartdbDebugUi);
1131
+ export { SmartdbDebugUi };
1132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRkYi1kZWJ1Z3VpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfZGVidWd1aS9zbWFydGRiLWRlYnVndWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBdUMsTUFBTSxjQUFjLENBQUM7QUFtQmhJLElBQU0sY0FBYyxHQUFwQixNQUFNLGNBQWUsU0FBUSxXQUFXO0lBR3BDLDJCQUErQixJQUFJLENBQUM7SUFGN0MsaURBQWlEO0lBRXhDLElBQUEsTUFBTSw0Q0FBOEI7SUFBcEMsSUFBQSxNQUFNLGtEQUE4QjtJQUlwQywrQkFBNEIsSUFBSSxDQUFDO0lBRjFDLDJIQUEySDtJQUVsSCxJQUFBLFVBQVUsZ0RBQXVCO0lBQWpDLElBQUEsVUFBVSxzREFBdUI7SUFHakMsb0NBQTBCLElBQUksQ0FBQztJQUEvQixJQUFBLGVBQWUscURBQWdCO0lBQS9CLElBQUEsZUFBZSwyREFBZ0I7SUFHL0IsOEJBQWtCLFdBQVcsQ0FBQztJQUE5QixJQUFBLFNBQVMsK0NBQXFCO0lBQTlCLElBQUEsU0FBUyxxREFBcUI7SUFHOUIsNEJBQWtDLElBQUksQ0FBQztJQUF2QyxJQUFBLE9BQU8sNkNBQWdDO0lBQXZDLElBQUEsT0FBTyxtREFBZ0M7SUFHdkMsK0JBQWlDLElBQUksQ0FBQztJQUF0QyxJQUFBLFVBQVUsZ0RBQTRCO0lBQXRDLElBQUEsVUFBVSxzREFBNEI7SUFHdEMsaUNBQThCLEVBQUUsQ0FBQztJQUFqQyxJQUFBLFlBQVksa0RBQXFCO0lBQWpDLElBQUEsWUFBWSx3REFBcUI7SUFHakMsZ0NBQWlDLEVBQUUsQ0FBQztJQUFwQyxJQUFBLFdBQVcsaURBQXlCO0lBQXBDLElBQUEsV0FBVyx1REFBeUI7SUFHcEMsdUNBQTBELElBQUksQ0FBQztJQUEvRCxJQUFBLGtCQUFrQix3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