@pstdio/workbench 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +39 -317
  2. package/dist/extensions.d.ts +1492 -698
  3. package/dist/extensions.js +1679 -1776
  4. package/dist/extensions.js.map +1 -1
  5. package/dist/file-renderer-view-kfJRY3yR.js +515 -0
  6. package/dist/file-renderer-view-kfJRY3yR.js.map +1 -0
  7. package/dist/index.d.ts +724 -599
  8. package/dist/index.js +5151 -2369
  9. package/dist/index.js.map +1 -1
  10. package/dist/react.d.ts +673 -550
  11. package/dist/react.js +3585 -3335
  12. package/dist/react.js.map +1 -1
  13. package/dist/storage.d.ts +120 -155
  14. package/dist/storage.js +135 -149
  15. package/dist/storage.js.map +1 -1
  16. package/dist/webview-runtime.d.ts +2 -5
  17. package/dist/webview-runtime.js +3 -3
  18. package/dist/webview-runtime.js.map +1 -1
  19. package/dist/workbench-menu-paths-B_QJzcNU.js +12 -0
  20. package/dist/workbench-menu-paths-B_QJzcNU.js.map +1 -0
  21. package/dist/workbench-renderers-DmsrBGC7.js +960 -0
  22. package/dist/workbench-renderers-DmsrBGC7.js.map +1 -0
  23. package/dist/workspaces-DJwFj8uq.js +1872 -0
  24. package/dist/workspaces-DJwFj8uq.js.map +1 -0
  25. package/package.json +6 -41
  26. package/dist/composition-resolver-types-CWykPyEK.js +0 -241
  27. package/dist/composition-resolver-types-CWykPyEK.js.map +0 -1
  28. package/dist/file-renderer-view-B6_iR4EN.js +0 -496
  29. package/dist/file-renderer-view-B6_iR4EN.js.map +0 -1
  30. package/dist/file-section-navigation-CfYqVObc.js +0 -30
  31. package/dist/file-section-navigation-CfYqVObc.js.map +0 -1
  32. package/dist/icon-B9XolQG8.js +0 -35
  33. package/dist/icon-B9XolQG8.js.map +0 -1
  34. package/dist/layout-types-DMoZz38-.js +0 -100
  35. package/dist/layout-types-DMoZz38-.js.map +0 -1
  36. package/dist/surface-map-C1pOTUmF.js +0 -52
  37. package/dist/surface-map-C1pOTUmF.js.map +0 -1
  38. package/dist/testing.d.ts +0 -2284
  39. package/dist/testing.js +0 -58
  40. package/dist/testing.js.map +0 -1
  41. package/dist/workbench-built-ins-BncLJfQA.js +0 -1175
  42. package/dist/workbench-built-ins-BncLJfQA.js.map +0 -1
  43. package/dist/workbench-menu-paths-Bb0ICxeG.js +0 -20
  44. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +0 -1
@@ -1,496 +0,0 @@
1
- import { jsx as g, jsxs as U } from "react/jsx-runtime";
2
- import { c as ie } from "react/compiler-runtime";
3
- import { Image as Ne, Box as me, Flex as B, Center as ne, Text as oe, Button as Ie, Spinner as _e } from "@chakra-ui/react";
4
- import { useState as ue, useRef as K, useEffect as re, useLayoutEffect as ke } from "react";
5
- import { g as Fe, r as je, s as Le } from "./file-section-navigation-CfYqVObc.js";
6
- import { EmptyState as Te, useFileIconThemePreference as Ue, resolveFileIconElement as He, Header as Oe } from "@pstdio/ui";
7
- import { CodeEditor as Pe } from "@pstdio/ui/diff";
8
- import { MarkdownEditor as $e } from "@pstdio/ui/rich-text";
9
- const Ae = /* @__PURE__ */ new Set(["png", "jpg", "jpeg", "gif", "webp", "svg", "avif", "bmp", "ico"]), Be = /* @__PURE__ */ new Set(["md", "markdown", "txt"]), Ee = {
10
- ts: "typescript",
11
- tsx: "typescript",
12
- js: "javascript",
13
- jsx: "javascript",
14
- mjs: "javascript",
15
- cjs: "javascript",
16
- json: "json",
17
- jsonc: "json",
18
- py: "python",
19
- rb: "ruby",
20
- rs: "rust",
21
- go: "go",
22
- java: "java",
23
- kt: "kotlin",
24
- c: "c",
25
- h: "c",
26
- cpp: "cpp",
27
- cc: "cpp",
28
- hpp: "cpp",
29
- cs: "csharp",
30
- php: "php",
31
- swift: "swift",
32
- sh: "shell",
33
- bash: "shell",
34
- zsh: "shell",
35
- sql: "sql",
36
- css: "css",
37
- scss: "scss",
38
- less: "less",
39
- html: "html",
40
- xml: "xml",
41
- yml: "yaml",
42
- yaml: "yaml",
43
- toml: "ini",
44
- ini: "ini",
45
- dockerfile: "dockerfile",
46
- graphql: "graphql",
47
- gql: "graphql",
48
- md: "markdown",
49
- markdown: "markdown",
50
- txt: "plaintext"
51
- }, ge = (t) => {
52
- if (!t) return "";
53
- const e = t.lastIndexOf(".");
54
- return e < 0 || e === t.length - 1 ? "" : t.slice(e + 1).toLowerCase();
55
- }, Ke = (t, e) => e?.startsWith("image/") ? !0 : Ae.has(ge(t)), qe = (t, e) => {
56
- if (Ke(t, e)) return "image";
57
- const r = ge(t);
58
- return !Be.has(r) && r in Ee ? "code" : "markdown";
59
- }, De = (t) => Ee[ge(t)] ?? "plaintext", Me = (t, e) => {
60
- if (t.emptyState) return {
61
- kind: "empty",
62
- isEditable: !1
63
- };
64
- const r = qe(t.fileName, t.mimeType);
65
- if (r === "image") return {
66
- kind: "image",
67
- isEditable: !1
68
- };
69
- const i = e && t.editable !== !1;
70
- return r === "code" || t.textRenderer === "monaco" ? {
71
- kind: "code",
72
- isEditable: i,
73
- language: De(t.fileName)
74
- } : {
75
- kind: "markdown",
76
- isEditable: i
77
- };
78
- }, Ve = (t) => {
79
- const e = ie(40), {
80
- content: r,
81
- editorKey: i,
82
- errorNotice: n,
83
- contributionCanSave: o,
84
- onActiveSectionChange: d,
85
- onChange: I,
86
- rendererRef: f,
87
- sectionNavigation: u,
88
- title: j
89
- } = t;
90
- let w;
91
- e[0] !== r || e[1] !== o ? (w = Me(r, o), e[0] = r, e[1] = o, e[2] = w) : w = e[2];
92
- const b = w;
93
- if (b.kind === "empty") {
94
- const E = r.emptyState?.title ?? "Select a file", p = r.emptyState?.description;
95
- let c;
96
- e[3] !== E || e[4] !== p ? (c = /* @__PURE__ */ g(Te, { flex: "1", minH: "0", title: E, description: p }), e[3] = E, e[4] = p, e[5] = c) : c = e[5];
97
- let h;
98
- return e[6] !== n || e[7] !== c ? (h = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
99
- n,
100
- c
101
- ] }), e[6] = n, e[7] = c, e[8] = h) : h = e[8], h;
102
- }
103
- if (b.kind === "image") {
104
- if (!r.dataUrl) {
105
- let x;
106
- return e[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (x = /* @__PURE__ */ g(ne, { h: "full", minH: "0", bg: "bg", p: "md", children: /* @__PURE__ */ g(oe, { color: "fg.muted", children: "This image preview is unavailable." }) }), e[9] = x) : x = e[9], x;
107
- }
108
- const E = r.fileName ?? j;
109
- let p;
110
- e[10] !== r.dataUrl || e[11] !== E ? (p = /* @__PURE__ */ g(Ne, { src: r.dataUrl, alt: E, maxW: "100%", maxH: "100%", objectFit: "contain" }), e[10] = r.dataUrl, e[11] = E, e[12] = p) : p = e[12];
111
- let c;
112
- e[13] !== f || e[14] !== p ? (c = /* @__PURE__ */ g(ne, { ref: f, flex: "1", minH: "0", p: "md", overflow: "auto", children: p }), e[13] = f, e[14] = p, e[15] = c) : c = e[15];
113
- let h;
114
- return e[16] !== n || e[17] !== c ? (h = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
115
- n,
116
- c
117
- ] }), e[16] = n, e[17] = c, e[18] = h) : h = e[18], h;
118
- }
119
- if (b.kind === "code") {
120
- const E = r.content ?? "", p = b.isEditable ? I : void 0;
121
- let c;
122
- e[19] !== i || e[20] !== b.isEditable || e[21] !== b.language || e[22] !== E || e[23] !== p ? (c = /* @__PURE__ */ g(me, { flex: "1", minH: "0", children: /* @__PURE__ */ g(Pe, { language: b.language, defaultCode: E, isEditable: b.isEditable, showLineNumbers: !0, onChange: p }, i) }), e[19] = i, e[20] = b.isEditable, e[21] = b.language, e[22] = E, e[23] = p, e[24] = c) : c = e[24];
123
- let h;
124
- return e[25] !== n || e[26] !== c ? (h = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
125
- n,
126
- c
127
- ] }), e[25] = n, e[26] = c, e[27] = h) : h = e[27], h;
128
- }
129
- const k = r.content ?? "", S = b.isEditable ? r.placeholder ?? "Write…" : void 0, C = b.isEditable ? I : void 0;
130
- let N;
131
- e[28] !== i || e[29] !== d || e[30] !== b.isEditable || e[31] !== u || e[32] !== k || e[33] !== S || e[34] !== C ? (N = /* @__PURE__ */ g(me, { flex: "1", minH: "0", overflowY: "auto", children: /* @__PURE__ */ g($e, { defaultState: k, isEditable: b.isEditable, sectionNavigation: u, placeholder: S, onActiveSectionChange: d, onChange: C }, i) }), e[28] = i, e[29] = d, e[30] = b.isEditable, e[31] = u, e[32] = k, e[33] = S, e[34] = C, e[35] = N) : N = e[35];
132
- let v;
133
- return e[36] !== n || e[37] !== f || e[38] !== N ? (v = /* @__PURE__ */ U(B, { ref: f, direction: "column", h: "full", minH: "0", overflow: "hidden", bg: "bg", children: [
134
- n,
135
- N
136
- ] }), e[36] = n, e[37] = f, e[38] = N, e[39] = v) : v = e[39], v;
137
- }, ze = (t) => {
138
- let e, r, i = null, n = null, o, d, I = !1, f = null, u = 0;
139
- const j = /* @__PURE__ */ new Set(), w = /* @__PURE__ */ new Set(), b = (l) => l instanceof Error ? l.message : "Failed to save file.", k = () => ({
140
- dirty: i !== null || n !== null && n.value !== e,
141
- saving: n !== null,
142
- ...o ? {
143
- saveError: o
144
- } : {}
145
- }), S = () => t.onStateChange?.(k()), C = () => {
146
- f !== null && (clearTimeout(f), f = null);
147
- }, N = () => t.createOperationId?.() ?? `file-save-${Date.now()}-${++u}`, v = () => i !== null || n !== null || f !== null || !!o, E = (l) => {
148
- l.revision && (!d || l.revision.localeCompare(d) > 0) && (d = l.revision), l.revision || (I = !0);
149
- }, p = (l) => {
150
- const a = l.origin?.operationId;
151
- return !a || l.origin?.rendererId !== t.binding.rendererId || l.origin.instanceId !== t.binding.instanceId ? !1 : n?.origin.operationId === a || w.has(a);
152
- }, c = (l) => {
153
- if (i !== null || n) return;
154
- const a = d, _ = I;
155
- if (d = void 0, I = !1, a && (!l || a.localeCompare(l) > 0)) {
156
- t.load({
157
- resourceUri: t.binding.resourceUri,
158
- revision: a
159
- });
160
- return;
161
- }
162
- _ && t.load({
163
- resourceUri: t.binding.resourceUri
164
- });
165
- }, h = () => {
166
- if (i === null || n || o) return;
167
- const l = i;
168
- i = null;
169
- const a = {
170
- rendererId: t.binding.rendererId,
171
- instanceId: t.binding.instanceId,
172
- operationId: N()
173
- };
174
- n = {
175
- value: l,
176
- origin: a
177
- }, S(), Promise.resolve(t.save(l, a)).then((_) => {
178
- if (n?.origin.operationId === a.operationId) {
179
- if (n = null, w.add(a.operationId), w.size > 20 && w.delete(w.values().next().value), e = l, r = _?.revision ?? r, i === e && (i = null, C()), S(), i !== null) {
180
- x();
181
- return;
182
- }
183
- c(_?.revision);
184
- }
185
- }).catch((_) => {
186
- n?.origin.operationId === a.operationId && (n = null, i === null && (i = l), o = b(_), S());
187
- });
188
- }, x = () => {
189
- C(), f = setTimeout(() => {
190
- f = null, h();
191
- }, t.debounceMs);
192
- };
193
- return {
194
- getBaseline() {
195
- return e;
196
- },
197
- getState: k,
198
- setBaseline(l, a) {
199
- e = l, r = a, S();
200
- },
201
- acceptLoaded(l, a) {
202
- return v() ? (E(a ? {
203
- revision: a
204
- } : {}), !1) : (e = l, r = a, S(), !0);
205
- },
206
- handleChange(l) {
207
- if (!(o && l === i)) {
208
- if (o = void 0, l === e && !n) {
209
- i = null, C(), S();
210
- return;
211
- }
212
- if (n?.value === l) {
213
- i = null, C(), S();
214
- return;
215
- }
216
- i = l, x(), S();
217
- }
218
- },
219
- handleRefreshEvent(l = {}) {
220
- if (!(l.resourceUri && l.resourceUri !== t.binding.resourceUri) && !p(l) && !(l.revision && j.has(l.revision))) {
221
- if (l.revision && j.add(l.revision), v()) {
222
- E(l);
223
- return;
224
- }
225
- l.revision && r && l.revision.localeCompare(r) <= 0 || t.load(l);
226
- }
227
- },
228
- retry() {
229
- !o || i === null || n || (o = void 0, S(), h());
230
- },
231
- retryLoad() {
232
- t.load({
233
- resourceUri: t.binding.resourceUri
234
- });
235
- },
236
- flush() {
237
- C(), h();
238
- }
239
- };
240
- }, We = (t, e, r, i) => !t || t.loadKey !== r ? 1 : (i ?? t.content) === e.content && t.dataUrl === e.dataUrl ? t.editorRevision : t.editorRevision + 1, Ye = 30, A = /* @__PURE__ */ new Map(), pe = (t) => A.get(t), Se = (t, e) => {
241
- if (A.delete(t), A.set(t, e), A.size <= Ye) return;
242
- const r = A.keys().next().value;
243
- r !== void 0 && A.delete(r);
244
- }, ye = (t) => {
245
- const e = ie(7), {
246
- message: r,
247
- onRetry: i
248
- } = t;
249
- let n;
250
- e[0] !== r ? (n = /* @__PURE__ */ g(oe, { color: "fg.muted", textStyle: "label/S/regular", children: r }), e[0] = r, e[1] = n) : n = e[1];
251
- let o;
252
- e[2] !== i ? (o = /* @__PURE__ */ g(Ie, { size: "2xs", variant: "subtle", onClick: i, children: "Retry" }), e[2] = i, e[3] = o) : o = e[3];
253
- let d;
254
- return e[4] !== n || e[5] !== o ? (d = /* @__PURE__ */ U(B, { flex: "none", alignItems: "center", justifyContent: "space-between", gap: "sm", borderBottomWidth: "1px", borderColor: "border.muted", bg: "bg.muted", px: "sm", py: "xs", children: [
255
- n,
256
- o
257
- ] }), e[4] = n, e[5] = o, e[6] = d) : d = e[6], d;
258
- }, he = (t) => Array.isArray(t) ? t.map(he) : !t || typeof t != "object" ? t : Object.fromEntries(Object.entries(t).sort(([e], [r]) => e.localeCompare(r)).map(([e, r]) => [e, he(r)])), Ge = (t) => {
259
- const {
260
- fileRendererId: e,
261
- resource: r
262
- } = t, i = r ? he({
263
- id: r.id,
264
- kind: r.kind,
265
- metadata: r.metadata,
266
- uri: r.uri
267
- }) : null;
268
- return `${e}:${JSON.stringify(i)}`;
269
- }, Xe = (t, e) => t?.loadKey === e, Je = (t) => {
270
- const e = ie(9), {
271
- fileName: r,
272
- filePath: i
273
- } = t, {
274
- activeFileIconTheme: n
275
- } = Ue();
276
- let o;
277
- e[0] !== n || e[1] !== r ? (o = He(r, {
278
- theme: n
279
- }), e[0] = n, e[1] = r, e[2] = o) : o = e[2];
280
- const d = `File path ${i}`;
281
- let I;
282
- e[3] !== i || e[4] !== d ? (I = /* @__PURE__ */ g(oe, { "aria-label": d, textStyle: "label/S/regular", color: "fg.muted", truncate: !0, children: i }), e[3] = i, e[4] = d, e[5] = I) : I = e[5];
283
- let f;
284
- return e[6] !== o || e[7] !== I ? (f = /* @__PURE__ */ U(Oe, { variant: "narrow", flexShrink: 0, gap: "2xs", bg: "bg", children: [
285
- o,
286
- I
287
- ] }), e[6] = o, e[7] = I, e[8] = f) : f = e[8], f;
288
- }, Qe = 600, Ze = (t) => t instanceof Error ? t.message : "Failed to load file.", et = (t) => {
289
- const {
290
- workbench: e,
291
- navigation: r,
292
- sectionId: i
293
- } = t;
294
- if (!r || !e.renderers.getTreeRenderer(r.treeId)) return;
295
- if (i && r.anchors.some((o) => o.id === i)) {
296
- e.renderers.setSelectedNode(r.treeId, i);
297
- return;
298
- }
299
- const n = e.renderers.getTreeState(r.treeId).selectedNodeId;
300
- n && r.anchors.some((o) => o.id === n) && e.renderers.setSelectedNode(r.treeId, void 0);
301
- }, tt = (t, e) => {
302
- if (!e) return;
303
- const r = t.renderers.getTreeRenderer(e.treeId) ? t.renderers.getTreeState(e.treeId).selectedNodeId : void 0;
304
- return {
305
- anchors: e.anchors,
306
- targetId: je(e, r)
307
- };
308
- }, ft = (t) => {
309
- const e = ie(69), {
310
- workbench: r,
311
- contribution: i
312
- } = t, n = t.placement?.resource;
313
- let o, d;
314
- e[0] !== n || e[1] !== r ? (o = Fe(n), d = tt(r, o), e[0] = n, e[1] = r, e[2] = o, e[3] = d) : (o = e[2], d = e[3]);
315
- const I = d;
316
- let f;
317
- e[4] !== i.id || e[5] !== n ? (f = Ge({
318
- fileRendererId: i.id,
319
- resource: n
320
- }), e[4] = i.id, e[5] = n, e[6] = f) : f = e[6];
321
- const u = f, [j, w] = ue(null), [b, k] = ue(null);
322
- let S;
323
- e[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (S = {
324
- dirty: !1,
325
- saving: !1
326
- }, e[7] = S) : S = e[7];
327
- const [C, N] = ue(S), v = K(null), E = K(null), p = K(null);
328
- let c;
329
- e[8] !== n?.uri || e[9] !== o || e[10] !== r.renderers ? (c = () => {
330
- const s = p.current, m = s && r.renderers.getTreeRenderer(s.treeId) ? r.renderers.getTreeState(s.treeId).selectedNodeId : void 0;
331
- Le({
332
- previous: s,
333
- current: o,
334
- currentResourceUri: n?.uri,
335
- selectedNodeId: m
336
- }) && s && r.renderers.setSelectedNode(s.treeId, void 0), p.current = o ? {
337
- resourceUri: n?.uri,
338
- treeId: o.treeId,
339
- anchorIds: o.anchors.map(rt)
340
- } : null;
341
- }, e[8] = n?.uri, e[9] = o, e[10] = r.renderers, e[11] = c) : c = e[11];
342
- const h = n?.uri;
343
- let x;
344
- e[12] !== o || e[13] !== h || e[14] !== r ? (x = [h, o, r], e[12] = o, e[13] = h, e[14] = r, e[15] = x) : x = e[15], re(c, x);
345
- const l = K(i), a = K(n);
346
- let _;
347
- e[16] !== i || e[17] !== n ? (_ = () => {
348
- l.current = i, a.current = n;
349
- }, e[16] = i, e[17] = n, e[18] = _) : _ = e[18], re(_);
350
- const L = i.id, H = !!i.save;
351
- let q;
352
- e[19] !== L || e[20] !== H || e[21] !== u || e[22] !== t.placement?.instanceId || e[23] !== r.renderers ? (q = () => {
353
- let s = !1;
354
- k(null);
355
- const m = pe(u);
356
- w(m ? {
357
- ...m,
358
- editorRevision: 1,
359
- loadKey: u
360
- } : null);
361
- const F = () => {
362
- Promise.resolve(l.current.load(a.current)).then((R) => {
363
- if (s || v.current && !v.current.acceptLoaded(R.content, R.revision))
364
- return;
365
- k(null), Se(u, R);
366
- const $ = v.current?.getBaseline();
367
- w((fe) => ({
368
- ...R,
369
- editorRevision: We(fe, R, u, $),
370
- loadKey: u
371
- }));
372
- }).catch((R) => {
373
- s || k({
374
- loadKey: u,
375
- message: Ze(R)
376
- });
377
- });
378
- };
379
- v.current = H ? ze({
380
- binding: {
381
- rendererId: L,
382
- instanceId: t.placement?.instanceId ?? L,
383
- resourceUri: a.current?.uri
384
- },
385
- debounceMs: Qe,
386
- load: F,
387
- onStateChange: (R) => {
388
- s || N(R);
389
- },
390
- save: (R, $) => Promise.resolve(l.current.save?.(a.current, R, $)).then((fe) => {
391
- const ve = pe(u);
392
- return ve && Se(u, {
393
- ...ve,
394
- content: R
395
- }), fe ?? void 0;
396
- })
397
- }) : null, m && v.current?.setBaseline(m.content, m.revision), N({
398
- dirty: !1,
399
- saving: !1
400
- }), F();
401
- const xe = r.renderers.onDidRefreshFileRenderer((R) => {
402
- if (R.fileRendererId !== L)
403
- return;
404
- const $ = v.current;
405
- $ ? $.handleRefreshEvent(R) : F();
406
- });
407
- return () => {
408
- s = !0, xe.dispose(), v.current?.flush(), v.current = null;
409
- };
410
- }, e[19] = L, e[20] = H, e[21] = u, e[22] = t.placement?.instanceId, e[23] = r.renderers, e[24] = q) : q = e[24];
411
- const le = t.placement?.instanceId;
412
- let D;
413
- e[25] !== L || e[26] !== H || e[27] !== u || e[28] !== le || e[29] !== r ? (D = [L, H, r, u, le], e[25] = L, e[26] = H, e[27] = u, e[28] = le, e[29] = r, e[30] = D) : D = e[30], re(q, D);
414
- let M, V;
415
- e[31] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (M = () => {
416
- const s = () => v.current?.flush(), m = () => {
417
- document.visibilityState === "hidden" && s();
418
- };
419
- return window.addEventListener("beforeunload", s), document.addEventListener("visibilitychange", m), () => {
420
- window.removeEventListener("beforeunload", s), document.removeEventListener("visibilitychange", m);
421
- };
422
- }, V = [], e[31] = M, e[32] = V) : (M = e[31], V = e[32]), re(M, V);
423
- let z;
424
- e[33] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (z = (s) => {
425
- v.current?.handleChange(s);
426
- }, e[33] = z) : z = e[33];
427
- const Re = z;
428
- let W;
429
- e[34] !== u || e[35] !== j ? (W = Xe(j, u) ? j : null, e[34] = u, e[35] = j, e[36] = W) : W = e[36];
430
- const y = W, Y = y ? `${y.loadKey}:${y.editorRevision}` : "";
431
- let G, X;
432
- e[37] !== Y || e[38] !== o ? (G = () => {
433
- if (!Y || o)
434
- return;
435
- const s = E.current;
436
- s && requestAnimationFrame(() => {
437
- let m = s.parentElement;
438
- for (; m; ) {
439
- const F = getComputedStyle(m).overflowY;
440
- ["auto", "scroll", "overlay"].includes(F) && m.scrollHeight > m.clientHeight && (m.scrollTop = 0), m = m.parentElement;
441
- }
442
- });
443
- }, X = [Y, o], e[37] = Y, e[38] = o, e[39] = G, e[40] = X) : (G = e[39], X = e[40]), ke(G, X);
444
- const T = b?.loadKey === u ? b.message : void 0;
445
- let J;
446
- e[41] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (J = () => v.current?.retryLoad(), e[41] = J) : J = e[41];
447
- const be = J;
448
- let Q;
449
- e[42] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (Q = () => v.current?.retry(), e[42] = Q) : Q = e[42];
450
- const Ce = Q;
451
- if (T && !y) {
452
- let s;
453
- e[43] !== T ? (s = /* @__PURE__ */ g(oe, { color: "fg.muted", children: T }), e[43] = T, e[44] = s) : s = e[44];
454
- let m;
455
- e[45] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (m = /* @__PURE__ */ g(Ie, { size: "xs", variant: "subtle", onClick: be, children: "Retry" }), e[45] = m) : m = e[45];
456
- let F;
457
- return e[46] !== s ? (F = /* @__PURE__ */ U(ne, { h: "full", minH: "0", bg: "bg", p: "md", flexDirection: "column", gap: "sm", children: [
458
- s,
459
- m
460
- ] }), e[46] = s, e[47] = F) : F = e[47], F;
461
- }
462
- if (!y) {
463
- let s;
464
- return e[48] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (s = /* @__PURE__ */ g(ne, { h: "full", minH: "0", bg: "bg", children: /* @__PURE__ */ g(_e, { size: "sm" }) }), e[48] = s) : s = e[48], s;
465
- }
466
- const se = `${y.loadKey}:${y.editorRevision}`;
467
- let Z;
468
- e[49] !== C || e[50] !== T ? (Z = T ? /* @__PURE__ */ g(ye, { message: T, onRetry: be }) : C.saveError ? /* @__PURE__ */ g(ye, { message: C.saveError, onRetry: Ce }) : null, e[49] = C, e[50] = T, e[51] = Z) : Z = e[51];
469
- const ce = Z;
470
- let ee;
471
- e[52] !== o || e[53] !== r ? (ee = (s) => {
472
- et({
473
- workbench: r,
474
- navigation: o,
475
- sectionId: s
476
- });
477
- }, e[52] = o, e[53] = r, e[54] = ee) : ee = e[54];
478
- const we = ee;
479
- let O;
480
- e[55] !== y.fileName || e[56] !== y.filePath ? (O = y.filePath ? /* @__PURE__ */ g(Je, { fileName: y.fileName ?? y.filePath, filePath: y.filePath }) : null, e[55] = y.fileName, e[56] = y.filePath, e[57] = O) : O = e[57];
481
- const ae = !!i.save, de = o ? we : void 0;
482
- let P;
483
- e[58] !== i.title || e[59] !== y || e[60] !== se || e[61] !== I || e[62] !== ce || e[63] !== ae || e[64] !== de ? (P = /* @__PURE__ */ g(me, { flex: "1", minH: "0", children: /* @__PURE__ */ g(Ve, { content: y, editorKey: se, errorNotice: ce, contributionCanSave: ae, onActiveSectionChange: de, onChange: Re, rendererRef: E, sectionNavigation: I, title: i.title }) }), e[58] = i.title, e[59] = y, e[60] = se, e[61] = I, e[62] = ce, e[63] = ae, e[64] = de, e[65] = P) : P = e[65];
484
- let te;
485
- return e[66] !== O || e[67] !== P ? (te = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
486
- O,
487
- P
488
- ] }), e[66] = O, e[67] = P, e[68] = te) : te = e[68], te;
489
- };
490
- function rt(t) {
491
- return t.id;
492
- }
493
- export {
494
- ft as WorkbenchFileRendererView
495
- };
496
- //# sourceMappingURL=file-renderer-view-B6_iR4EN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-renderer-view-B6_iR4EN.js","sources":["../src/react/renderers/file/file-kind.ts","../src/react/renderers/file/file-renderer-presentation.ts","../src/react/renderers/file/file-renderer-content.tsx","../src/react/renderers/file/file-renderer-edit-state.ts","../src/react/renderers/file/file-renderer-error-notice.tsx","../src/react/renderers/file/file-renderer-load-key.ts","../src/react/renderers/file/file-renderer-path-header.tsx","../src/react/renderers/file/file-renderer-view.tsx"],"sourcesContent":["// Generic file-type dispatch for the file renderer. Markdown is the default so\n// `.md` / `.txt` / extension-less files open in the prose editor; recognised code\n// extensions open in Monaco; images render read-only. This is deliberately\n// domain-agnostic — it knows about file types, not about tickets.\n\nexport type FileKind = \"markdown\" | \"code\" | \"image\";\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"bmp\", \"ico\"]);\nconst PROSE_EXTENSIONS = new Set([\"md\", \"markdown\", \"txt\"]);\n\n// Extension → Monaco language id. Markdown/plain text intentionally absent so\n// they fall through to the prose editor.\nconst CODE_LANGUAGE_BY_EXTENSION: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n kt: \"kotlin\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n php: \"php\",\n swift: \"swift\",\n sh: \"shell\",\n bash: \"shell\",\n zsh: \"shell\",\n sql: \"sql\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"ini\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n graphql: \"graphql\",\n gql: \"graphql\",\n md: \"markdown\",\n markdown: \"markdown\",\n txt: \"plaintext\",\n};\n\nconst extensionOf = (fileName: string | undefined) => {\n if (!fileName) return \"\";\n const dot = fileName.lastIndexOf(\".\");\n if (dot < 0 || dot === fileName.length - 1) return \"\";\n return fileName.slice(dot + 1).toLowerCase();\n};\n\nconst isImage = (fileName: string | undefined, mimeType: string | undefined) => {\n if (mimeType?.startsWith(\"image/\")) return true;\n return IMAGE_EXTENSIONS.has(extensionOf(fileName));\n};\n\nexport const pickFileKind = (fileName: string | undefined, mimeType: string | undefined): FileKind => {\n if (isImage(fileName, mimeType)) return \"image\";\n const extension = extensionOf(fileName);\n if (!PROSE_EXTENSIONS.has(extension) && extension in CODE_LANGUAGE_BY_EXTENSION) return \"code\";\n return \"markdown\";\n};\n\n// Monaco language for a code file; falls back to plaintext for unknown extensions.\nexport const codeLanguageFor = (fileName: string | undefined) =>\n CODE_LANGUAGE_BY_EXTENSION[extensionOf(fileName)] ?? \"plaintext\";\n","import type { FileRendererContent } from \"../../../core\";\nimport { codeLanguageFor, pickFileKind } from \"./file-kind\";\n\nexport type FileRendererPresentation =\n | { kind: \"empty\"; isEditable: false }\n | { kind: \"image\"; isEditable: false }\n | { kind: \"code\"; isEditable: boolean; language: string }\n | { kind: \"markdown\"; isEditable: boolean };\n\nexport const resolveFileRendererPresentation = (\n content: FileRendererContent,\n contributionCanSave: boolean,\n): FileRendererPresentation => {\n if (content.emptyState) return { kind: \"empty\", isEditable: false };\n\n const automaticKind = pickFileKind(content.fileName, content.mimeType);\n if (automaticKind === \"image\") return { kind: \"image\", isEditable: false };\n\n const isEditable = contributionCanSave && content.editable !== false;\n if (automaticKind === \"code\" || content.textRenderer === \"monaco\") {\n return { kind: \"code\", isEditable, language: codeLanguageFor(content.fileName) };\n }\n return { kind: \"markdown\", isEditable };\n};\n","import { Box, Center, Flex, Image, Text } from \"@chakra-ui/react\";\nimport { EmptyState } from \"@pstdio/ui\";\nimport { CodeEditor } from \"@pstdio/ui/diff\";\nimport { MarkdownEditor } from \"@pstdio/ui/rich-text\";\nimport type { ReactNode, RefObject } from \"react\";\nimport type { FileRendererContent } from \"../../../core\";\nimport { resolveFileRendererPresentation } from \"./file-renderer-presentation\";\n\ninterface FileRendererContentViewProps {\n content: FileRendererContent;\n editorKey: string;\n errorNotice: ReactNode;\n contributionCanSave: boolean;\n onActiveSectionChange?: (sectionId: string | null) => void;\n onChange: (value: string) => void;\n rendererRef: RefObject<HTMLDivElement | null>;\n sectionNavigation?: {\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n targetId: string;\n };\n title: string;\n}\n\nexport const FileRendererContentView = (props: FileRendererContentViewProps) => {\n const {\n content,\n editorKey,\n errorNotice,\n contributionCanSave,\n onActiveSectionChange,\n onChange,\n rendererRef,\n sectionNavigation,\n title,\n } = props;\n const presentation = resolveFileRendererPresentation(content, contributionCanSave);\n\n if (presentation.kind === \"empty\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <EmptyState\n flex=\"1\"\n minH=\"0\"\n title={content.emptyState?.title ?? \"Select a file\"}\n description={content.emptyState?.description}\n />\n </Flex>\n );\n }\n\n if (presentation.kind === \"image\") {\n if (!content.dataUrl) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">This image preview is unavailable.</Text>\n </Center>\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <Center ref={rendererRef} flex=\"1\" minH=\"0\" p=\"md\" overflow=\"auto\">\n <Image src={content.dataUrl} alt={content.fileName ?? title} maxW=\"100%\" maxH=\"100%\" objectFit=\"contain\" />\n </Center>\n </Flex>\n );\n }\n\n if (presentation.kind === \"code\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <Box flex=\"1\" minH=\"0\">\n <CodeEditor\n key={editorKey}\n language={presentation.language}\n defaultCode={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n showLineNumbers\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n }\n\n return (\n <Flex ref={rendererRef} direction=\"column\" h=\"full\" minH=\"0\" overflow=\"hidden\" bg=\"bg\">\n {errorNotice}\n <Box flex=\"1\" minH=\"0\" overflowY=\"auto\">\n <MarkdownEditor\n key={editorKey}\n defaultState={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n sectionNavigation={sectionNavigation}\n placeholder={presentation.isEditable ? (content.placeholder ?? \"Write…\") : undefined}\n onActiveSectionChange={onActiveSectionChange}\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n};\n","// Owns the editable file renderer's save lifecycle: the last loaded or saved\n// value (the baseline), the debounced draft, the one in-flight save, and\n// refresh events that arrive while a draft or save exists.\n//\n// Invariants (from the renderer edit/refresh lifecycle PRD):\n// - a change equal to the baseline never schedules a save\n// - at most one save runs at a time; the baseline advances when it succeeds\n// - a failed save keeps the draft so a later change or flush retries it\n// - refresh events are deferred while a draft or save exists and coalesce\n// into one reload after the last save settles\n\nimport type {\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n FileRendererSaveResult,\n} from \"../../../core/registries/renderers/file-renderer-registry\";\n\nexport interface FileEditControllerState {\n dirty: boolean;\n saving: boolean;\n saveError?: string;\n}\n\nexport interface FileEditControllerInput {\n binding: Omit<FileRendererRefreshOrigin, \"operationId\"> & { resourceUri?: string };\n debounceMs: number;\n load: (event?: FileRendererRefreshEnvelope) => void;\n save: (value: string, origin: FileRendererRefreshOrigin) => Promise<FileRendererSaveResult | undefined>;\n createOperationId?: () => string;\n onStateChange?: (state: FileEditControllerState) => void;\n}\n\nexport type FileEditController = ReturnType<typeof createFileEditController>;\n\nexport const createFileEditController = (input: FileEditControllerInput) => {\n let baseline: string | undefined;\n let baselineRevision: string | undefined;\n let draft: string | null = null;\n let activeSave: { value: string; origin: FileRendererRefreshOrigin } | null = null;\n let saveError: string | undefined;\n let deferredRevision: string | undefined;\n let genericRefreshDeferred = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let operationSequence = 0;\n const seenRefreshRevisions = new Set<string>();\n const completedOperationIds = new Set<string>();\n\n const describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to save file.\");\n const getState = (): FileEditControllerState => ({\n dirty: draft !== null || (activeSave !== null && activeSave.value !== baseline),\n saving: activeSave !== null,\n ...(saveError ? { saveError } : {}),\n });\n const notify = () => input.onStateChange?.(getState());\n\n const clearTimer = () => {\n if (timer === null) return;\n clearTimeout(timer);\n timer = null;\n };\n\n const nextOperationId = () => input.createOperationId?.() ?? `file-save-${Date.now()}-${++operationSequence}`;\n\n const hasPendingLocalState = () => draft !== null || activeSave !== null || timer !== null || Boolean(saveError);\n\n const deferRefresh = (event: FileRendererRefreshEnvelope) => {\n if (event.revision && (!deferredRevision || event.revision.localeCompare(deferredRevision) > 0)) {\n deferredRevision = event.revision;\n }\n if (!event.revision) genericRefreshDeferred = true;\n };\n\n const isSelfRefresh = (event: FileRendererRefreshEnvelope) => {\n const operationId = event.origin?.operationId;\n if (!operationId) return false;\n if (event.origin?.rendererId !== input.binding.rendererId) return false;\n if (event.origin.instanceId !== input.binding.instanceId) return false;\n return activeSave?.origin.operationId === operationId || completedOperationIds.has(operationId);\n };\n\n const takeDeferredRefresh = (savedRevision?: string) => {\n if (draft !== null || activeSave) return;\n const revision = deferredRevision;\n const generic = genericRefreshDeferred;\n deferredRevision = undefined;\n genericRefreshDeferred = false;\n if (revision && (!savedRevision || revision.localeCompare(savedRevision) > 0)) {\n input.load({ resourceUri: input.binding.resourceUri, revision });\n return;\n }\n if (generic) input.load({ resourceUri: input.binding.resourceUri });\n };\n\n const runSave = () => {\n if (draft === null || activeSave || saveError) return;\n const value = draft;\n draft = null;\n const origin = {\n rendererId: input.binding.rendererId,\n instanceId: input.binding.instanceId,\n operationId: nextOperationId(),\n };\n activeSave = { value, origin };\n notify();\n void Promise.resolve(input.save(value, origin))\n .then((result) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n completedOperationIds.add(origin.operationId);\n if (completedOperationIds.size > 20) completedOperationIds.delete(completedOperationIds.values().next().value!);\n baseline = value;\n baselineRevision = result?.revision ?? baselineRevision;\n if (draft === baseline) {\n draft = null;\n clearTimer();\n }\n notify();\n if (draft !== null) {\n schedule();\n return;\n }\n takeDeferredRefresh(result?.revision);\n })\n .catch((error) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n if (draft === null) draft = value;\n saveError = describeError(error);\n notify();\n });\n };\n\n const schedule = () => {\n clearTimer();\n timer = setTimeout(() => {\n timer = null;\n runSave();\n }, input.debounceMs);\n };\n\n return {\n getBaseline() {\n return baseline;\n },\n getState,\n setBaseline(value: string | undefined, revision?: string) {\n baseline = value;\n baselineRevision = revision;\n notify();\n },\n acceptLoaded(value: string | undefined, revision?: string) {\n if (hasPendingLocalState()) {\n deferRefresh(revision ? { revision } : {});\n return false;\n }\n baseline = value;\n baselineRevision = revision;\n notify();\n return true;\n },\n handleChange(value: string) {\n if (saveError && value === draft) return;\n saveError = undefined;\n if (value === baseline && !activeSave) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n if (activeSave?.value === value) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n draft = value;\n schedule();\n notify();\n },\n handleRefreshEvent(event: FileRendererRefreshEnvelope = {}) {\n if (event.resourceUri && event.resourceUri !== input.binding.resourceUri) return;\n if (isSelfRefresh(event)) return;\n if (event.revision && seenRefreshRevisions.has(event.revision)) return;\n if (event.revision) seenRefreshRevisions.add(event.revision);\n if (hasPendingLocalState()) {\n deferRefresh(event);\n return;\n }\n if (event.revision && baselineRevision && event.revision.localeCompare(baselineRevision) <= 0) return;\n input.load(event);\n },\n retry() {\n if (!saveError || draft === null || activeSave) return;\n saveError = undefined;\n notify();\n runSave();\n },\n retryLoad() {\n input.load({ resourceUri: input.binding.resourceUri });\n },\n flush() {\n clearTimer();\n runSave();\n },\n };\n};\n\n// A reload that returns what the editor already shows must not remount it: the\n// revision feeds the editor's React key, and a new key destroys focus and\n// selection. `editorValue` is the current baseline for an editable renderer —\n// after a save, a reload returns the saved value, which matches the baseline\n// even though it differs from the previously loaded state.\nexport const nextLoadedRevision = (\n previous: { content?: string; dataUrl?: string; loadKey: string; editorRevision: number } | null,\n next: { content?: string; dataUrl?: string },\n loadKey: string,\n editorValue?: string,\n) => {\n if (!previous || previous.loadKey !== loadKey) return 1;\n const shownContent = editorValue ?? previous.content;\n if (shownContent === next.content && previous.dataUrl === next.dataUrl) return previous.editorRevision;\n return previous.editorRevision + 1;\n};\n\n// Last loaded document per binding, so reopening a recently viewed file mounts\n// the editor immediately instead of a spinner. The follow-up load reconciles:\n// unchanged content keeps the revision (no remount), changed content remounts.\nconst FILE_CONTENT_CACHE_LIMIT = 30;\nconst fileContentCache = new Map<\n string,\n { content?: string; dataUrl?: string; fileName?: string; mimeType?: string; placeholder?: string; revision?: string }\n>();\n\nexport const readCachedFileContent = (loadKey: string) => fileContentCache.get(loadKey);\n\nexport const storeCachedFileContent = (\n loadKey: string,\n content: NonNullable<ReturnType<typeof readCachedFileContent>>,\n) => {\n fileContentCache.delete(loadKey);\n fileContentCache.set(loadKey, content);\n if (fileContentCache.size <= FILE_CONTENT_CACHE_LIMIT) return;\n const oldest = fileContentCache.keys().next().value;\n if (oldest !== undefined) fileContentCache.delete(oldest);\n};\n","import { Button, Flex, Text } from \"@chakra-ui/react\";\n\nexport const FileRendererErrorNotice = (props: { message: string; onRetry: () => void }) => {\n const { message, onRetry } = props;\n return (\n <Flex\n flex=\"none\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"sm\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.muted\"\n bg=\"bg.muted\"\n px=\"sm\"\n py=\"xs\"\n >\n <Text color=\"fg.muted\" textStyle=\"label/S/regular\">\n {message}\n </Text>\n <Button size=\"2xs\" variant=\"subtle\" onClick={onRetry}>\n Retry\n </Button>\n </Flex>\n );\n};\n","import type { ResourceRef } from \"../../../core\";\n\ninterface FileRendererLoadKeyInput {\n fileRendererId: string;\n resource: ResourceRef | undefined;\n}\n\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!value || typeof value !== \"object\") return value;\n\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n};\n\nexport const createFileRendererLoadKey = (input: FileRendererLoadKeyInput) => {\n const { fileRendererId, resource } = input;\n const resourceValue = resource\n ? stableValue({ id: resource.id, kind: resource.kind, metadata: resource.metadata, uri: resource.uri })\n : null;\n return `${fileRendererId}:${JSON.stringify(resourceValue)}`;\n};\n\nexport const isCurrentLoadedFile = (loaded: { loadKey: string } | null, loadKey: string) => loaded?.loadKey === loadKey;\n","import { Text } from \"@chakra-ui/react\";\nimport { Header, resolveFileIconElement, useFileIconThemePreference } from \"@pstdio/ui\";\n\nexport const FileRendererPathHeader = (props: { fileName: string; filePath: string }) => {\n const { fileName, filePath } = props;\n const { activeFileIconTheme } = useFileIconThemePreference();\n\n return (\n <Header variant=\"narrow\" flexShrink={0} gap=\"2xs\" bg=\"bg\">\n {resolveFileIconElement(fileName, { theme: activeFileIconTheme })}\n <Text aria-label={`File path ${filePath}`} textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {filePath}\n </Text>\n </Header>\n );\n};\n","import { Box, Button, Center, Flex, Spinner, Text } from \"@chakra-ui/react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type {\n FileRendererContent,\n RegisteredFileRendererContribution,\n WorkbenchCore,\n WorkbenchPanelInstance,\n} from \"../../../core\";\nimport {\n getFileSectionNavigation,\n resolveFileSectionTargetId,\n shouldClearFileSectionSelection,\n} from \"../../../core/registries/renderers/file-section-navigation\";\nimport { FileRendererContentView } from \"./file-renderer-content\";\nimport {\n createFileEditController,\n type FileEditController,\n type FileEditControllerState,\n nextLoadedRevision,\n readCachedFileContent,\n storeCachedFileContent,\n} from \"./file-renderer-edit-state\";\nimport { FileRendererErrorNotice } from \"./file-renderer-error-notice\";\nimport { createFileRendererLoadKey, isCurrentLoadedFile } from \"./file-renderer-load-key\";\nimport { FileRendererPathHeader } from \"./file-renderer-path-header\";\n\ninterface WorkbenchFileRendererViewProps {\n workbench: WorkbenchCore;\n contribution: RegisteredFileRendererContribution;\n // The bound resource (e.g. the open ticket / ticket-file) the load/save\n // commands operate on.\n placement?: WorkbenchPanelInstance;\n}\n\ninterface LoadedFile extends FileRendererContent {\n // Bumped on every (re)load so the uncontrolled editors remount with fresh\n // content on a refresh, but never mid-edit (load only runs on mount/refresh).\n editorRevision: number;\n loadKey: string;\n}\n\nconst SAVE_DEBOUNCE_MS = 600;\n\nconst describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to load file.\");\n\nconst syncActiveFileSection = (input: {\n workbench: WorkbenchCore;\n navigation: ReturnType<typeof getFileSectionNavigation>;\n sectionId: string | null;\n}) => {\n const { workbench, navigation, sectionId } = input;\n if (!navigation || !workbench.renderers.getTreeRenderer(navigation.treeId)) return;\n\n if (sectionId && navigation.anchors.some((anchor) => anchor.id === sectionId)) {\n workbench.renderers.setSelectedNode(navigation.treeId, sectionId);\n return;\n }\n\n const selectedNodeId = workbench.renderers.getTreeState(navigation.treeId).selectedNodeId;\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) {\n workbench.renderers.setSelectedNode(navigation.treeId, undefined);\n }\n};\n\nconst getEditorSectionNavigation = (\n workbench: WorkbenchCore,\n navigation: ReturnType<typeof getFileSectionNavigation>,\n) => {\n if (!navigation) return undefined;\n const selectedNodeId = workbench.renderers.getTreeRenderer(navigation.treeId)\n ? workbench.renderers.getTreeState(navigation.treeId).selectedNodeId\n : undefined;\n\n return {\n anchors: navigation.anchors,\n targetId: resolveFileSectionTargetId(navigation, selectedNodeId),\n };\n};\n\nexport const WorkbenchFileRendererView = (props: WorkbenchFileRendererViewProps) => {\n const { workbench, contribution } = props;\n const resource = props.placement?.resource;\n const sectionNavigation = getFileSectionNavigation(resource);\n const editorSectionNavigation = getEditorSectionNavigation(workbench, sectionNavigation);\n const loadKey = createFileRendererLoadKey({ fileRendererId: contribution.id, resource });\n const [loaded, setLoaded] = useState<LoadedFile | null>(null);\n const [error, setError] = useState<{ loadKey: string; message: string } | null>(null);\n const [editState, setEditState] = useState<FileEditControllerState>({ dirty: false, saving: false });\n const controllerRef = useRef<FileEditController | null>(null);\n const rendererRef = useRef<HTMLDivElement>(null);\n const previousSectionNavigationRef = useRef<{\n resourceUri?: string;\n treeId: string;\n anchorIds: string[];\n } | null>(null);\n\n useEffect(() => {\n const previous = previousSectionNavigationRef.current;\n const selectedNodeId =\n previous && workbench.renderers.getTreeRenderer(previous.treeId)\n ? workbench.renderers.getTreeState(previous.treeId).selectedNodeId\n : undefined;\n\n if (\n shouldClearFileSectionSelection({\n previous,\n current: sectionNavigation,\n currentResourceUri: resource?.uri,\n selectedNodeId,\n }) &&\n previous\n ) {\n workbench.renderers.setSelectedNode(previous.treeId, undefined);\n }\n\n previousSectionNavigationRef.current = sectionNavigation\n ? {\n resourceUri: resource?.uri,\n treeId: sectionNavigation.treeId,\n anchorIds: sectionNavigation.anchors.map((anchor) => anchor.id),\n }\n : null;\n }, [resource?.uri, sectionNavigation, workbench]);\n\n // Contribution refresh re-registers an identical contribution as a new\n // object, and a save that changes the document title produces a new resource\n // object with a fresh label. The load key uses resource values instead of\n // object identity, while callbacks read the latest objects through refs.\n const contributionRef = useRef(contribution);\n const resourceRef = useRef(resource);\n useEffect(() => {\n contributionRef.current = contribution;\n resourceRef.current = resource;\n });\n\n const contributionId = contribution.id;\n const hasSave = Boolean(contribution.save);\n\n // Re-binding a singleton widget to another resource changes `resource` and reloads.\n useEffect(() => {\n let cancelled = false;\n setError(null);\n // A recently viewed document mounts immediately from the cache; the load\n // below reconciles it (unchanged content keeps the editor mounted).\n const cached = readCachedFileContent(loadKey);\n setLoaded(cached ? { ...cached, editorRevision: 1, loadKey } : null);\n const load = () => {\n Promise.resolve(contributionRef.current.load(resourceRef.current))\n .then((next) => {\n if (cancelled) return;\n if (controllerRef.current && !controllerRef.current.acceptLoaded(next.content, next.revision)) return;\n setError(null);\n storeCachedFileContent(loadKey, next);\n // Compare against the editor's current value so a reload that returns\n // what is already shown (e.g. after a save) keeps the editor mounted.\n const editorValue = controllerRef.current?.getBaseline();\n setLoaded((previous) => ({\n ...next,\n editorRevision: nextLoadedRevision(previous, next, loadKey, editorValue),\n loadKey,\n }));\n })\n .catch((loadError) => {\n if (cancelled) return;\n setError({ loadKey, message: describeError(loadError) });\n });\n };\n controllerRef.current = hasSave\n ? createFileEditController({\n binding: {\n rendererId: contributionId,\n instanceId: props.placement?.instanceId ?? contributionId,\n resourceUri: resourceRef.current?.uri,\n },\n debounceMs: SAVE_DEBOUNCE_MS,\n load,\n onStateChange: (state) => {\n if (!cancelled) setEditState(state);\n },\n save: (value, origin) =>\n Promise.resolve(contributionRef.current.save?.(resourceRef.current, value, origin)).then((result) => {\n const current = readCachedFileContent(loadKey);\n if (current) storeCachedFileContent(loadKey, { ...current, content: value });\n return result ?? undefined;\n }),\n })\n : null;\n if (cached) controllerRef.current?.setBaseline(cached.content, cached.revision);\n setEditState({ dirty: false, saving: false });\n load();\n const refreshSubscription = workbench.renderers.onDidRefreshFileRenderer((event) => {\n if (event.fileRendererId !== contributionId) return;\n const controller = controllerRef.current;\n if (controller) controller.handleRefreshEvent(event);\n else load();\n });\n return () => {\n cancelled = true;\n refreshSubscription.dispose();\n // Flush the last keystrokes on unbind; the load callback above is\n // cancelled, so a deferred refresh cannot resurrect the old binding.\n controllerRef.current?.flush();\n controllerRef.current = null;\n };\n }, [contributionId, hasSave, workbench, loadKey, props.placement?.instanceId]);\n\n // The last keystrokes are also flushed when the tab is hidden or closed.\n useEffect(() => {\n const flush = () => controllerRef.current?.flush();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flush();\n };\n window.addEventListener(\"beforeunload\", flush);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"beforeunload\", flush);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, []);\n\n const handleChange = (value: string) => {\n controllerRef.current?.handleChange(value);\n };\n\n const currentLoaded = isCurrentLoadedFile(loaded, loadKey) ? loaded : null;\n const scrollResetKey = currentLoaded ? `${currentLoaded.loadKey}:${currentLoaded.editorRevision}` : \"\";\n\n useLayoutEffect(() => {\n if (!scrollResetKey || sectionNavigation) return;\n const node = rendererRef.current;\n if (!node) return;\n\n requestAnimationFrame(() => {\n let current = node.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY) && current.scrollHeight > current.clientHeight) {\n current.scrollTop = 0;\n }\n current = current.parentElement;\n }\n });\n }, [scrollResetKey, sectionNavigation]);\n\n const loadError = error?.loadKey === loadKey ? error.message : undefined;\n const retryLoad = () => controllerRef.current?.retryLoad();\n const retrySave = () => controllerRef.current?.retry();\n\n if (loadError && !currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\" flexDirection=\"column\" gap=\"sm\">\n <Text color=\"fg.muted\">{loadError}</Text>\n <Button size=\"xs\" variant=\"subtle\" onClick={retryLoad}>\n Retry\n </Button>\n </Center>\n );\n }\n\n if (!currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\">\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n\n // The key must carry the document identity, not just the contribution: two\n // documents from the same renderer both start at revision 1, so keying on the\n // contribution alone reuses the editor and keeps showing the previous file.\n const editorKey = `${currentLoaded.loadKey}:${currentLoaded.editorRevision}`;\n const errorNotice = loadError ? (\n <FileRendererErrorNotice message={loadError} onRetry={retryLoad} />\n ) : editState.saveError ? (\n <FileRendererErrorNotice message={editState.saveError} onRetry={retrySave} />\n ) : null;\n\n const handleActiveSectionChange = (sectionId: string | null) => {\n syncActiveFileSection({ workbench, navigation: sectionNavigation, sectionId });\n };\n\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {currentLoaded.filePath ? (\n <FileRendererPathHeader\n fileName={currentLoaded.fileName ?? currentLoaded.filePath}\n filePath={currentLoaded.filePath}\n />\n ) : null}\n <Box flex=\"1\" minH=\"0\">\n <FileRendererContentView\n content={currentLoaded}\n editorKey={editorKey}\n errorNotice={errorNotice}\n contributionCanSave={Boolean(contribution.save)}\n onActiveSectionChange={sectionNavigation ? handleActiveSectionChange : undefined}\n onChange={handleChange}\n rendererRef={rendererRef}\n sectionNavigation={editorSectionNavigation}\n title={contribution.title}\n />\n </Box>\n </Flex>\n );\n};\n"],"names":["IMAGE_EXTENSIONS","Set","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","ts","tsx","js","jsx","mjs","cjs","json","jsonc","py","rb","rs","go","java","kt","c","h","cpp","cc","hpp","cs","php","swift","sh","bash","zsh","sql","css","scss","less","html","xml","yml","yaml","toml","ini","dockerfile","graphql","gql","md","markdown","txt","extensionOf","fileName","dot","lastIndexOf","length","slice","toLowerCase","isImage","mimeType","startsWith","has","pickFileKind","extension","codeLanguageFor","resolveFileRendererPresentation","content","contributionCanSave","emptyState","kind","isEditable","automaticKind","editable","textRenderer","language","FileRendererContentView","props","$","_c","editorKey","errorNotice","onActiveSectionChange","onChange","rendererRef","sectionNavigation","title","t0","presentation","t1","t2","description","t3","EmptyState","t4","jsxs","Flex","dataUrl","Symbol","for","Center","Text","Image","undefined","Box","CodeEditor","placeholder","MarkdownEditor","t5","createFileEditController","input","baseline","baselineRevision","draft","activeSave","saveError","deferredRevision","genericRefreshDeferred","timer","operationSequence","seenRefreshRevisions","completedOperationIds","describeError","error","Error","message","getState","dirty","value","saving","notify","onStateChange","clearTimer","clearTimeout","nextOperationId","createOperationId","Date","now","hasPendingLocalState","Boolean","deferRefresh","event","revision","localeCompare","isSelfRefresh","operationId","origin","rendererId","binding","instanceId","takeDeferredRefresh","savedRevision","generic","load","resourceUri","runSave","Promise","resolve","save","then","result","add","size","delete","values","next","schedule","catch","setTimeout","debounceMs","getBaseline","setBaseline","acceptLoaded","handleChange","handleRefreshEvent","retry","retryLoad","flush","nextLoadedRevision","previous","loadKey","editorValue","editorRevision","FILE_CONTENT_CACHE_LIMIT","fileContentCache","Map","readCachedFileContent","get","storeCachedFileContent","set","oldest","keys","FileRendererErrorNotice","onRetry","Button","stableValue","Array","isArray","map","Object","fromEntries","entries","sort","left","right","key","entry","createFileRendererLoadKey","fileRendererId","resource","resourceValue","id","metadata","uri","JSON","stringify","isCurrentLoadedFile","loaded","FileRendererPathHeader","filePath","activeFileIconTheme","useFileIconThemePreference","resolveFileIconElement","theme","Header","SAVE_DEBOUNCE_MS","syncActiveFileSection","workbench","navigation","sectionId","renderers","getTreeRenderer","treeId","anchors","some","anchor","setSelectedNode","selectedNodeId","getTreeState","getEditorSectionNavigation","targetId","resolveFileSectionTargetId","WorkbenchFileRendererView","contribution","placement","getFileSectionNavigation","editorSectionNavigation","setLoaded","useState","setError","editState","setEditState","controllerRef","useRef","previousSectionNavigationRef","current","shouldClearFileSectionSelection","currentResourceUri","anchorIds","_temp","useEffect","contributionRef","resourceRef","t6","contributionId","hasSave","t7","cancelled","cached","previous_0","loadError","state","refreshSubscription","onDidRefreshFileRenderer","controller","dispose","t8","t9","t10","t11","onVisibility","document","visibilityState","window","addEventListener","removeEventListener","t12","value_0","t13","currentLoaded","scrollResetKey","t14","t15","node","requestAnimationFrame","current_0","parentElement","overflowY","getComputedStyle","includes","scrollHeight","clientHeight","scrollTop","useLayoutEffect","loadError_0","t16","t17","retrySave","t18","t19","t20","Spinner","handleActiveSectionChange","t21","t22","t23","t24"],"mappings":";;;;;;;;AAOA,MAAMA,KAAmB,oBAAIC,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,KAAK,CAAC,GAC7FC,KAAmB,oBAAID,IAAI,CAAC,MAAM,YAAY,KAAK,CAAC,GAIpDE,KAAqD;AAAA,EACzDC,IAAI;AAAA,EACJC,KAAK;AAAA,EACLC,IAAI;AAAA,EACJC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,OAAO;AAAA,EACPC,IAAI;AAAA,EACJC,IAAI;AAAA,EACJC,IAAI;AAAA,EACJC,IAAI;AAAA,EACJC,MAAM;AAAA,EACNC,IAAI;AAAA,EACJC,GAAG;AAAA,EACHC,GAAG;AAAA,EACHC,KAAK;AAAA,EACLC,IAAI;AAAA,EACJC,KAAK;AAAA,EACLC,IAAI;AAAA,EACJC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,IAAI;AAAA,EACJC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,YAAY;AAAA,EACZC,SAAS;AAAA,EACTC,KAAK;AAAA,EACLC,IAAI;AAAA,EACJC,UAAU;AAAA,EACVC,KAAK;AACP,GAEMC,KAAcA,CAACC,MAAiC;AACpD,MAAI,CAACA,EAAU,QAAO;AACtB,QAAMC,IAAMD,EAASE,YAAY,GAAG;AACpC,SAAID,IAAM,KAAKA,MAAQD,EAASG,SAAS,IAAU,KAC5CH,EAASI,MAAMH,IAAM,CAAC,EAAEI,YAAAA;AACjC,GAEMC,KAAUA,CAACN,GAA8BO,MACzCA,GAAUC,WAAW,QAAQ,IAAU,KACpCtD,GAAiBuD,IAAIV,GAAYC,CAAQ,CAAC,GAGtCU,KAAeA,CAACV,GAA8BO,MAA2C;AACpG,MAAID,GAAQN,GAAUO,CAAQ,EAAG,QAAO;AACxC,QAAMI,IAAYZ,GAAYC,CAAQ;AACtC,SAAI,CAAC5C,GAAiBqD,IAAIE,CAAS,KAAKA,KAAatD,KAAmC,SACjF;AACT,GAGauD,KAAkBA,CAACZ,MAC9B3C,GAA2B0C,GAAYC,CAAQ,CAAC,KAAK,aCpE1Ca,KAAkCA,CAC7CC,GACAC,MAC6B;AAC7B,MAAID,EAAQE,WAAY,QAAO;AAAA,IAAEC,MAAM;AAAA,IAASC,YAAY;AAAA,EAAA;AAE5D,QAAMC,IAAgBT,GAAaI,EAAQd,UAAUc,EAAQP,QAAQ;AACrE,MAAIY,MAAkB,QAAS,QAAO;AAAA,IAAEF,MAAM;AAAA,IAASC,YAAY;AAAA,EAAA;AAEnE,QAAMA,IAAaH,KAAuBD,EAAQM,aAAa;AAC/D,SAAID,MAAkB,UAAUL,EAAQO,iBAAiB,WAChD;AAAA,IAAEJ,MAAM;AAAA,IAAQC,YAAAA;AAAAA,IAAYI,UAAUV,GAAgBE,EAAQd,QAAQ;AAAA,EAAA,IAExE;AAAA,IAAEiB,MAAM;AAAA,IAAYC,YAAAA;AAAAA,EAAAA;AAC7B,GCAaK,KAA0BC,CAAAA,MAAA;AAAA,QAAAC,IAAAC,GAAA,EAAA,GACrC;AAAA,IAAAZ,SAAAA;AAAAA,IAAAa,WAAAA;AAAAA,IAAAC,aAAAA;AAAAA,IAAAb,qBAAAA;AAAAA,IAAAc,uBAAAA;AAAAA,IAAAC,UAAAA;AAAAA,IAAAC,aAAAA;AAAAA,IAAAC,mBAAAA;AAAAA,IAAAC,OAAAA;AAAAA,EAAAA,IAUIT;AAAM,MAAAU;AAAA,EAAAT,EAAA,CAAA,MAAAX,KAAAW,SAAAV,KACWmB,IAAArB,GAAgCC,GAASC,CAAmB,GAACU,OAAAX,GAAAW,OAAAV,GAAAU,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAlF,QAAAU,IAAqBD;AAErB,MAAIC,EAAYlB,SAAU,SAAO;AAOlB,UAAAmB,IAAAtB,EAAOE,YAAkBiB,SAAzB,iBACMI,IAAAvB,EAAOE,YAAwBsB;AAAA,QAAAC;AAAA,IAAAd,EAAA,CAAA,MAAAW,KAAAX,SAAAY,KAJ9CE,IAAA,gBAAA9E,EAAC+E,IAAA,EACM,MAAA,KACA,MAAA,KACE,OAAAJ,GACM,aAAAC,EAAAA,CAA+B,GAC5CZ,OAAAW,GAAAX,OAAAY,GAAAZ,OAAAc,KAAAA,IAAAd,EAAA,CAAA;AAAA,QAAAgB;AAAA,WAAAhB,EAAA,CAAA,MAAAG,KAAAH,SAAAc,KAPJE,IAAA,gBAAAC,EAACC,GAAA,EAAe,WAAA,UAAW,GAAA,QAAY,MAAA,KAAO,IAAA,MAC3Cf,UAAAA;AAAAA,MAAAA;AAAAA,MACDW;AAAAA,IAAAA,GAMF,GAAOd,OAAAG,GAAAH,OAAAc,GAAAd,OAAAgB,KAAAA,IAAAhB,EAAA,CAAA,GARPgB;AAAAA,EAQO;AAIX,MAAIN,EAAYlB,SAAU,SAAO;AAC/B,QAAI,CAACH,EAAO8B,SAAQ;AAAA,UAAAR;AAAA,aAAAX,EAAA,CAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KAEhBV,IAAA,gBAAA3E,EAACsF,IAAA,EAAS,GAAA,QAAY,MAAA,KAAO,IAAA,MAAO,GAAA,MAClC,UAAA,gBAAAtF,EAACuF,IAAA,EAAW,OAAA,YAAW,gDAAkC,GAC3D,GAASvB,OAAAW,KAAAA,IAAAX,EAAA,CAAA,GAFTW;AAAAA,IAES;AAO2B,UAAAA,IAAAtB,EAAOd,YAAPiC;AAAyB,QAAAI;AAAA,IAAAZ,UAAAX,EAAA8B,WAAAnB,UAAAW,KAA3DC,IAAA,gBAAA5E,EAACwF,IAAA,EAAW,KAAAnC,EAAO8B,SAAe,KAAAR,GAAgC,MAAA,QAAY,MAAA,QAAiB,WAAA,WAAS,GAAGX,EAAA,EAAA,IAAAX,EAAA8B,SAAAnB,QAAAW,GAAAX,QAAAY,KAAAA,IAAAZ,EAAA,EAAA;AAAA,QAAAc;AAAA,IAAAd,EAAA,EAAA,MAAAM,KAAAN,UAAAY,KAD7GE,IAAA,gBAAA9E,EAACsF,IAAA,EAAYhB,KAAAA,GAAkB,MAAA,KAAS,MAAA,KAAM,GAAA,MAAc,UAAA,QAC1DM,UAAAA,GACF,GAASZ,QAAAM,GAAAN,QAAAY,GAAAZ,QAAAc,KAAAA,IAAAd,EAAA,EAAA;AAAA,QAAAgB;AAAA,WAAAhB,EAAA,EAAA,MAAAG,KAAAH,UAAAc,KAJXE,IAAA,gBAAAC,EAACC,GAAA,EAAe,WAAA,UAAW,GAAA,QAAY,MAAA,KAAO,IAAA,MAC3Cf,UAAAA;AAAAA,MAAAA;AAAAA,MACDW;AAAAA,IAAAA,GAGF,GAAOd,QAAAG,GAAAH,QAAAc,GAAAd,QAAAgB,KAAAA,IAAAhB,EAAA,EAAA,GALPgB;AAAAA,EAKO;AAIX,MAAIN,EAAYlB,SAAU,QAAM;AAQT,UAAAmB,IAAAtB,EAAOA,WAAP,IAGHuB,IAAAF,EAAYjB,aAAZY,IAAAoB;AAA8C,QAAAX;AAAA,IAAAd,UAAAE,KAAAF,EAAA,EAAA,MAAAU,EAAAjB,cAAAO,UAAAU,EAAAb,YAAAG,UAAAW,KAAAX,EAAA,EAAA,MAAAY,KAP5DE,sBAACY,IAAA,EAAS,MAAA,KAAS,MAAA,KACjB,UAAA,gBAAA1F,EAAC2F,IAAA,EAEW,UAAAjB,EAAYb,UACT,aAAAc,GACD,YAAAD,EAAYjB,YACxB,iBAAA,IACU,UAAAmB,KALLV,CAKmD,EAAA,CAE5D,GAAMF,QAAAE,GAAAF,EAAA,EAAA,IAAAU,EAAAjB,YAAAO,EAAA,EAAA,IAAAU,EAAAb,UAAAG,QAAAW,GAAAX,QAAAY,GAAAZ,QAAAc,KAAAA,IAAAd,EAAA,EAAA;AAAA,QAAAgB;AAAA,WAAAhB,EAAA,EAAA,MAAAG,KAAAH,UAAAc,KAXRE,IAAA,gBAAAC,EAACC,GAAA,EAAe,WAAA,UAAW,GAAA,QAAY,MAAA,KAAO,IAAA,MAC3Cf,UAAAA;AAAAA,MAAAA;AAAAA,MACDW;AAAAA,IAAAA,GAUF,GAAOd,QAAAG,GAAAH,QAAAc,GAAAd,QAAAgB,KAAAA,IAAAhB,EAAA,EAAA,GAZPgB;AAAAA,EAYO;AAUW,QAAAL,IAAAtB,EAAOA,WAAP,IAGDuB,IAAAF,EAAYjB,aAAeJ,EAAOuC,eAAP,WAA3BH,QAEHX,IAAAJ,EAAYjB,aAAZY,IAAAoB;AAA8C,MAAAT;AAAA,EAAAhB,EAAA,EAAA,MAAAE,KAAAF,EAAA,EAAA,MAAAI,KAAAJ,EAAA,EAAA,MAAAU,EAAAjB,cAAAO,EAAA,EAAA,MAAAO,KAAAP,EAAA,EAAA,MAAAW,KAAAX,EAAA,EAAA,MAAAY,KAAAZ,EAAA,EAAA,MAAAc,KAR5DE,IAAA,gBAAAhF,EAAC0F,MAAS,MAAA,KAAS,MAAA,KAAc,WAAA,QAC/B,UAAA,gBAAA1F,EAAC6F,IAAA,EAEe,cAAAlB,GACF,YAAAD,EAAYjB,YACLc,mBAAAA,GACN,aAAAK,GACUR,uBAAAA,GACb,UAAAU,KANLZ,CAMmD,EAAA,CAE5D,GAAMF,QAAAE,GAAAF,QAAAI,GAAAJ,EAAA,EAAA,IAAAU,EAAAjB,YAAAO,QAAAO,GAAAP,QAAAW,GAAAX,QAAAY,GAAAZ,QAAAc,GAAAd,QAAAgB,KAAAA,IAAAhB,EAAA,EAAA;AAAA,MAAA8B;AAAA,SAAA9B,EAAA,EAAA,MAAAG,KAAAH,UAAAM,KAAAN,EAAA,EAAA,MAAAgB,KAZRc,IAAA,gBAAAb,EAACC,GAAA,EAAUZ,KAAAA,GAAuB,WAAA,UAAW,GAAA,QAAY,MAAA,KAAa,UAAA,UAAY,IAAA,MAC/EH,UAAAA;AAAAA,IAAAA;AAAAA,IACDa;AAAAA,EAAAA,GAWF,GAAOhB,QAAAG,GAAAH,QAAAM,GAAAN,QAAAgB,GAAAhB,QAAA8B,KAAAA,IAAA9B,EAAA,EAAA,GAbP8B;AAaO,GCnEEC,KAA2BA,CAACC,MAAmC;AAC1E,MAAIC,GACAC,GACAC,IAAuB,MACvBC,IAA0E,MAC1EC,GACAC,GACAC,IAAyB,IACzBC,IAA8C,MAC9CC,IAAoB;AACxB,QAAMC,wBAA2BhH,IAAAA,GAC3BiH,wBAA4BjH,IAAAA,GAE5BkH,IAAgBA,CAACC,MAAoBA,aAAiBC,QAAQD,EAAME,UAAU,wBAC9EC,IAAWA,OAAgC;AAAA,IAC/CC,OAAOd,MAAU,QAASC,MAAe,QAAQA,EAAWc,UAAUjB;AAAAA,IACtEkB,QAAQf,MAAe;AAAA,IACvB,GAAIC,IAAY;AAAA,MAAEA,WAAAA;AAAAA,IAAAA,IAAc,CAAA;AAAA,EAAC,IAE7Be,IAASA,MAAMpB,EAAMqB,gBAAgBL,GAAU,GAE/CM,IAAaA,MAAM;AACvB,IAAId,MAAU,SACde,aAAaf,CAAK,GAClBA,IAAQ;AAAA,EACV,GAEMgB,IAAkBA,MAAMxB,EAAMyB,oBAAAA,KAAyB,aAAaC,KAAKC,IAAAA,CAAK,IAAI,EAAElB,CAAiB,IAErGmB,IAAuBA,MAAMzB,MAAU,QAAQC,MAAe,QAAQI,MAAU,QAAQqB,EAAQxB,GAEhGyB,IAAeA,CAACC,MAAuC;AAC3D,IAAIA,EAAMC,aAAa,CAAC1B,KAAoByB,EAAMC,SAASC,cAAc3B,CAAgB,IAAI,OAC3FA,IAAmByB,EAAMC,WAEtBD,EAAMC,aAAUzB,IAAyB;AAAA,EAChD,GAEM2B,IAAgBA,CAACH,MAAuC;AAC5D,UAAMI,IAAcJ,EAAMK,QAAQD;AAGlC,WAFI,CAACA,KACDJ,EAAMK,QAAQC,eAAerC,EAAMsC,QAAQD,cAC3CN,EAAMK,OAAOG,eAAevC,EAAMsC,QAAQC,aAAmB,KAC1DnC,GAAYgC,OAAOD,gBAAgBA,KAAexB,EAAsB3D,IAAImF,CAAW;AAAA,EAChG,GAEMK,IAAsBA,CAACC,MAA2B;AACtD,QAAItC,MAAU,QAAQC,EAAY;AAClC,UAAM4B,IAAW1B,GACXoC,IAAUnC;AAGhB,QAFAD,IAAmBb,QACnBc,IAAyB,IACrByB,MAAa,CAACS,KAAiBT,EAASC,cAAcQ,CAAa,IAAI,IAAI;AAC7EzC,MAAAA,EAAM2C,KAAK;AAAA,QAAEC,aAAa5C,EAAMsC,QAAQM;AAAAA,QAAaZ,UAAAA;AAAAA,MAAAA,CAAU;AAC/D;AAAA,IACF;AACA,IAAIU,OAAeC,KAAK;AAAA,MAAEC,aAAa5C,EAAMsC,QAAQM;AAAAA,IAAAA,CAAa;AAAA,EACpE,GAEMC,IAAUA,MAAM;AACpB,QAAI1C,MAAU,QAAQC,KAAcC,EAAW;AAC/C,UAAMa,IAAQf;AACdA,IAAAA,IAAQ;AACR,UAAMiC,IAAS;AAAA,MACbC,YAAYrC,EAAMsC,QAAQD;AAAAA,MAC1BE,YAAYvC,EAAMsC,QAAQC;AAAAA,MAC1BJ,aAAaX,EAAAA;AAAAA,IAAgB;AAE/BpB,IAAAA,IAAa;AAAA,MAAEc,OAAAA;AAAAA,MAAOkB,QAAAA;AAAAA,IAAAA,GACtBhB,EAAAA,GACK0B,QAAQC,QAAQ/C,EAAMgD,KAAK9B,GAAOkB,CAAM,CAAC,EAC3Ca,KAAMC,CAAAA,MAAW;AAChB,UAAI9C,GAAYgC,OAAOD,gBAAgBC,EAAOD,aAW9C;AAAA,YAVA/B,IAAa,MACbO,EAAsBwC,IAAIf,EAAOD,WAAW,GACxCxB,EAAsByC,OAAO,MAAIzC,EAAsB0C,OAAO1C,EAAsB2C,OAAAA,EAASC,KAAAA,EAAOrC,KAAM,GAC9GjB,IAAWiB,GACXhB,IAAmBgD,GAAQlB,YAAY9B,GACnCC,MAAUF,MACZE,IAAQ,MACRmB,EAAAA,IAEFF,EAAAA,GACIjB,MAAU,MAAM;AAClBqD,UAAAA,EAAAA;AACA;AAAA,QACF;AACAhB,QAAAA,EAAoBU,GAAQlB,QAAQ;AAAA;AAAA,IACtC,CAAC,EACAyB,MAAO5C,CAAAA,MAAU;AAChB,MAAIT,GAAYgC,OAAOD,gBAAgBC,EAAOD,gBAC9C/B,IAAa,MACTD,MAAU,SAAMA,IAAQe,IAC5Bb,IAAYO,EAAcC,CAAK,GAC/BO,EAAAA;AAAAA,IACF,CAAC;AAAA,EACL,GAEMoC,IAAWA,MAAM;AACrBlC,IAAAA,EAAAA,GACAd,IAAQkD,WAAW,MAAM;AACvBlD,MAAAA,IAAQ,MACRqC,EAAAA;AAAAA,IACF,GAAG7C,EAAM2D,UAAU;AAAA,EACrB;AAEA,SAAO;AAAA,IACLC,cAAc;AACZ,aAAO3D;AAAAA,IACT;AAAA,IACAe,UAAAA;AAAAA,IACA6C,YAAY3C,GAA2Bc,GAAmB;AACxD/B,MAAAA,IAAWiB,GACXhB,IAAmB8B,GACnBZ,EAAAA;AAAAA,IACF;AAAA,IACA0C,aAAa5C,GAA2Bc,GAAmB;AACzD,aAAIJ,OACFE,EAAaE,IAAW;AAAA,QAAEA,UAAAA;AAAAA,MAAAA,IAAa,EAAE,GAClC,OAET/B,IAAWiB,GACXhB,IAAmB8B,GACnBZ,EAAAA,GACO;AAAA,IACT;AAAA,IACA2C,aAAa7C,GAAe;AAC1B,UAAIb,EAAAA,KAAaa,MAAUf,IAE3B;AAAA,YADAE,IAAYZ,QACRyB,MAAUjB,KAAY,CAACG,GAAY;AACrCD,UAAAA,IAAQ,MACRmB,EAAAA,GACAF,EAAAA;AACA;AAAA,QACF;AACA,YAAIhB,GAAYc,UAAUA,GAAO;AAC/Bf,UAAAA,IAAQ,MACRmB,EAAAA,GACAF,EAAAA;AACA;AAAA,QACF;AACAjB,QAAAA,IAAQe,GACRsC,EAAAA,GACApC,EAAAA;AAAAA;AAAAA,IACF;AAAA,IACA4C,mBAAmBjC,IAAqC,IAAI;AAC1D,UAAIA,EAAAA,EAAMa,eAAeb,EAAMa,gBAAgB5C,EAAMsC,QAAQM,gBACzDV,CAAAA,EAAcH,CAAK,KACnBA,EAAAA,EAAMC,YAAYtB,EAAqB1D,IAAI+E,EAAMC,QAAQ,IAE7D;AAAA,YADID,EAAMC,YAAUtB,EAAqByC,IAAIpB,EAAMC,QAAQ,GACvDJ,KAAwB;AAC1BE,UAAAA,EAAaC,CAAK;AAClB;AAAA,QACF;AACA,QAAIA,EAAMC,YAAY9B,KAAoB6B,EAAMC,SAASC,cAAc/B,CAAgB,KAAK,KAC5FF,EAAM2C,KAAKZ,CAAK;AAAA;AAAA,IAClB;AAAA,IACAkC,QAAQ;AACN,MAAI,CAAC5D,KAAaF,MAAU,QAAQC,MACpCC,IAAYZ,QACZ2B,EAAAA,GACAyB,EAAAA;AAAAA,IACF;AAAA,IACAqB,YAAY;AACVlE,MAAAA,EAAM2C,KAAK;AAAA,QAAEC,aAAa5C,EAAMsC,QAAQM;AAAAA,MAAAA,CAAa;AAAA,IACvD;AAAA,IACAuB,QAAQ;AACN7C,MAAAA,EAAAA,GACAuB,EAAAA;AAAAA,IACF;AAAA,EAAA;AAEJ,GAOauB,KAAqBA,CAChCC,GACAd,GACAe,GACAC,MAEI,CAACF,KAAYA,EAASC,YAAYA,IAAgB,KACjCC,KAAeF,EAAShH,aACxBkG,EAAKlG,WAAWgH,EAASlF,YAAYoE,EAAKpE,UAAgBkF,EAASG,iBACjFH,EAASG,iBAAiB,GAM7BC,KAA2B,IAC3BC,wBAAuBC,IAAAA,GAKhBC,KAAwBA,CAACN,MAAoBI,EAAiBG,IAAIP,CAAO,GAEzEQ,KAAyBA,CACpCR,GACAjH,MACG;AAGH,MAFAqH,EAAiBrB,OAAOiB,CAAO,GAC/BI,EAAiBK,IAAIT,GAASjH,CAAO,GACjCqH,EAAiBtB,QAAQqB,GAA0B;AACvD,QAAMO,IAASN,EAAiBO,KAAAA,EAAO1B,OAAOrC;AAC9C,EAAI8D,MAAWvF,UAAWiF,EAAiBrB,OAAO2B,CAAM;AAC1D,GClPaE,KAA0BnH,CAAAA,MAAA;AAAA,QAAAC,IAAAC,GAAA,CAAA,GACrC;AAAA,IAAA8C,SAAAA;AAAAA,IAAAoE,SAAAA;AAAAA,EAAAA,IAA6BpH;AAAM,MAAAU;AAAA,EAAAT,SAAA+C,KAa/BtC,sBAACc,IAAA,EAAW,OAAA,YAAqB,WAAA,mBAC9BwB,UAAAA,GACH,GAAO/C,OAAA+C,GAAA/C,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAAA,MAAAW;AAAA,EAAAX,SAAAmH,KACPxG,sBAACyG,MAAY,MAAA,OAAc,SAAA,UAAkBD,SAAAA,GAAS,UAAA,QAAA,CAEtD,GAASnH,OAAAmH,GAAAnH,OAAAW,KAAAA,IAAAX,EAAA,CAAA;AAAA,MAAAY;AAAA,SAAAZ,EAAA,CAAA,MAAAS,KAAAT,SAAAW,KAhBXC,sBAACM,GAAA,EACM,MAAA,QACM,YAAA,UACI,gBAAA,iBACX,KAAA,MACc,mBAAA,OACN,aAAA,gBACT,IAAA,YACA,IAAA,MACA,IAAA,MAEHT,UAAAA;AAAAA,IAAAA;AAAAA,IAGAE;AAAAA,EAAAA,GAGF,GAAOX,OAAAS,GAAAT,OAAAW,GAAAX,OAAAY,KAAAA,IAAAZ,EAAA,CAAA,GAjBPY;AAiBO,GCfLyG,KAAcA,CAACnE,MACfoE,MAAMC,QAAQrE,CAAK,IAAUA,EAAMsE,IAAIH,EAAW,IAClD,CAACnE,KAAS,OAAOA,KAAU,WAAiBA,IAEzCuE,OAAOC,YACZD,OAAOE,QAAQzE,CAAgC,EAC5C0E,KAAK,CAAC,CAACC,CAAI,GAAG,CAACC,CAAK,MAAMD,EAAK5D,cAAc6D,CAAK,CAAC,EACnDN,IAAI,CAAC,CAACO,GAAKC,CAAK,MAAM,CAACD,GAAKV,GAAYW,CAAK,CAAC,CAAC,CACpD,GAGWC,KAA4BA,CAACjG,MAAoC;AAC5E,QAAM;AAAA,IAAEkG,gBAAAA;AAAAA,IAAgBC,UAAAA;AAAAA,EAAAA,IAAanG,GAC/BoG,IAAgBD,IAClBd,GAAY;AAAA,IAAEgB,IAAIF,EAASE;AAAAA,IAAI7I,MAAM2I,EAAS3I;AAAAA,IAAM8I,UAAUH,EAASG;AAAAA,IAAUC,KAAKJ,EAASI;AAAAA,EAAAA,CAAK,IACpG;AACJ,SAAO,GAAGL,CAAc,IAAIM,KAAKC,UAAUL,CAAa,CAAC;AAC3D,GAEaM,KAAsBA,CAACC,GAAoCrC,MAAoBqC,GAAQrC,YAAYA,GCvBnGsC,KAAyB7I,CAAAA,MAAA;AAAA,QAAAC,IAAAC,GAAA,CAAA,GACpC;AAAA,IAAA1B,UAAAA;AAAAA,IAAAsK,UAAAA;AAAAA,EAAAA,IAA+B9I,GAC/B;AAAA,IAAA+I,qBAAAA;AAAAA,EAAAA,IAAgCC,GAAAA;AAA6B,MAAAtI;AAAA,EAAAT,EAAA,CAAA,MAAA8I,KAAA9I,SAAAzB,KAIxDkC,IAAAuI,GAAuBzK,GAAU;AAAA,IAAA0K,OAASH;AAAAA,EAAAA,CAAqB,GAAC9I,OAAA8I,GAAA9I,OAAAzB,GAAAyB,OAAAS,KAAAA,IAAAT,EAAA,CAAA;AAC/C,QAAAW,IAAA,aAAakI,CAAQ;AAAE,MAAAjI;AAAA,EAAAZ,EAAA,CAAA,MAAA6I,KAAA7I,SAAAW,KAAzCC,IAAA,gBAAA5E,EAACuF,IAAA,EAAiB,cAAAZ,GAAmC,WAAA,mBAAwB,OAAA,YAAW,UAAA,IACrFkI,UAAAA,EAAAA,CACH,GAAO7I,OAAA6I,GAAA7I,OAAAW,GAAAX,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AAAA,MAAAc;AAAA,SAAAd,EAAA,CAAA,MAAAS,KAAAT,SAAAY,KAJTE,IAAA,gBAAAG,EAACiI,MAAe,SAAA,UAAqB,YAAA,GAAO,KAAA,OAAS,IAAA,MAClDzI,UAAAA;AAAAA,IAAAA;AAAAA,IACDG;AAAAA,EAAAA,GAGF,GAASZ,OAAAS,GAAAT,OAAAY,GAAAZ,OAAAc,KAAAA,IAAAd,EAAA,CAAA,GALTc;AAKS,GC4BPqI,KAAmB,KAEnBvG,KAAgBA,CAACC,MAAoBA,aAAiBC,QAAQD,EAAME,UAAU,wBAE9EqG,KAAwBA,CAACpH,MAIzB;AACJ,QAAM;AAAA,IAAEqH,WAAAA;AAAAA,IAAWC,YAAAA;AAAAA,IAAYC,WAAAA;AAAAA,EAAAA,IAAcvH;AAC7C,MAAI,CAACsH,KAAc,CAACD,EAAUG,UAAUC,gBAAgBH,EAAWI,MAAM,EAAG;AAE5E,MAAIH,KAAaD,EAAWK,QAAQC,KAAMC,OAAWA,EAAOxB,OAAOkB,CAAS,GAAG;AAC7EF,IAAAA,EAAUG,UAAUM,gBAAgBR,EAAWI,QAAQH,CAAS;AAChE;AAAA,EACF;AAEA,QAAMQ,IAAiBV,EAAUG,UAAUQ,aAAaV,EAAWI,MAAM,EAAEK;AAC3E,EAAIA,KAAkBT,EAAWK,QAAQC,KAAMC,OAAWA,EAAOxB,OAAO0B,CAAc,KACpFV,EAAUG,UAAUM,gBAAgBR,EAAWI,QAAQjI,MAAS;AAEpE,GAEMwI,KAA6BA,CACjCZ,GACAC,MACG;AACH,MAAI,CAACA,EAAY;AACjB,QAAMS,IAAiBV,EAAUG,UAAUC,gBAAgBH,EAAWI,MAAM,IACxEL,EAAUG,UAAUQ,aAAaV,EAAWI,MAAM,EAAEK,iBACpDtI;AAEJ,SAAO;AAAA,IACLkI,SAASL,EAAWK;AAAAA,IACpBO,UAAUC,GAA2Bb,GAAYS,CAAc;AAAA,EAAA;AAEnE,GAEaK,KAA4BrK,CAAAA,MAAA;AAAA,QAAAC,IAAAC,GAAA,EAAA,GACvC;AAAA,IAAAoJ,WAAAA;AAAAA,IAAAgB,cAAAA;AAAAA,EAAAA,IAAoCtK,GACpCoI,IAAiBpI,EAAKuK,WAAoBnC;AAAC,MAAA5H,GAAAE;AAAA,EAAAT,EAAA,CAAA,MAAAmI,KAAAnI,SAAAqJ,KAC3C9I,IAA0BgK,GAAyBpC,CAAQ,GAC3B1H,IAAAwJ,GAA2BZ,GAAW9I,CAAiB,GAACP,OAAAmI,GAAAnI,OAAAqJ,GAAArJ,OAAAO,GAAAP,OAAAS,MAAAF,IAAAP,EAAA,CAAA,GAAAS,IAAAT,EAAA,CAAA;AAAxF,QAAAwK,IAAgC/J;AAAyD,MAAAE;AAAA,EAAAX,SAAAqK,EAAAhC,MAAArI,SAAAmI,KACzExH,IAAAsH,GAA0B;AAAA,IAAAC,gBAAkBmC,EAAYhC;AAAAA,IAAGF,UAAAA;AAAAA,EAAAA,CAAY,GAACnI,EAAA,CAAA,IAAAqK,EAAAhC,IAAArI,OAAAmI,GAAAnI,OAAAW,KAAAA,IAAAX,EAAA,CAAA;AAAxF,QAAAsG,IAAgB3F,GAChB,CAAAgI,GAAA8B,CAAA,IAA4BC,GAA4B,IAAI,GAC5D,CAAA7H,GAAA8H,CAAA,IAA0BD,GAAsD,IAAI;AAAE,MAAA9J;AAAA,EAAAZ,EAAA,CAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KAClBT,IAAA;AAAA,IAAAqC,OAAS;AAAA,IAAKE,QAAU;AAAA,EAAA,GAAOnD,OAAAY,KAAAA,IAAAZ,EAAA,CAAA;AAAnG,QAAA,CAAA4K,GAAAC,CAAA,IAAkCH,GAAkC9J,CAA+B,GACnGkK,IAAsBC,EAAkC,IAAI,GAC5DzK,IAAoByK,EAAuB,IAAI,GAC/CC,IAAqCD,EAI3B,IAAI;AAAE,MAAAjK;AAAA,EAAAd,EAAA,CAAA,MAAAmI,GAAAI,OAAAvI,EAAA,CAAA,MAAAO,KAAAP,EAAA,EAAA,MAAAqJ,EAAAG,aAEN1I,IAAAA,MAAA;AACR,UAAAuF,IAAiB2E,EAA4BC,SAC7ClB,IACE1D,KAAYgD,EAASG,UAAUC,gBAAiBpD,EAAQqD,MAAO,IAC3DL,EAASG,UAAUQ,aAAc3D,EAAQqD,MAAO,EAACK,iBADrDtI;AAIF,IACEyJ,GAAgC;AAAA,MAAA7E,UAAAA;AAAAA,MAAA4E,SAErB1K;AAAAA,MAAiB4K,oBACNhD,GAAQI;AAAAA,MAAKwB,gBAAAA;AAAAA,IAAAA,CAG5B,KANP1D,KAQAgD,EAASG,UAAUM,gBAAiBzD,EAAQqD,QAASjI,MAAS,GAGhEuJ,EAA4BC,UAAW1K,IAAA;AAAA,MAAAqE,aAEpBuD,GAAQI;AAAAA,MAAKmB,QAClBnJ,EAAiBmJ;AAAAA,MAAO0B,WACrB7K,EAAiBoJ,QAAQnC,IAAK6D,EAAqB;AAAA,IAAA,IAJ7B;AAAA,EAAH,GAOrCrL,EAAA,CAAA,IAAAmI,GAAAI,KAAAvI,OAAAO,GAAAP,EAAA,EAAA,IAAAqJ,EAAAG,WAAAxJ,QAAAc,KAAAA,IAAAd,EAAA,EAAA;AAAG,QAAAgB,IAAAmH,GAAQI;AAAK,MAAAzG;AAAA,EAAA9B,EAAA,EAAA,MAAAO,KAAAP,UAAAgB,KAAAhB,EAAA,EAAA,MAAAqJ,KAAdvH,KAACd,GAAeT,GAAmB8I,CAAS,GAACrJ,QAAAO,GAAAP,QAAAgB,GAAAhB,QAAAqJ,GAAArJ,QAAA8B,KAAAA,IAAA9B,EAAA,EAAA,GA1BhDsL,GAAUxK,GA0BPgB,CAA6C;AAMhD,QAAAyJ,IAAwBR,EAAOV,CAAY,GAC3CmB,IAAoBT,EAAO5C,CAAQ;AAAE,MAAAsD;AAAA,EAAAzL,EAAA,EAAA,MAAAqK,KAAArK,UAAAmI,KAC3BsD,IAAAA,MAAA;AACRF,IAAAA,EAAeN,UAAWZ,GAC1BmB,EAAWP,UAAW9C;AAAAA,EAAH,GACpBnI,QAAAqK,GAAArK,QAAAmI,GAAAnI,QAAAyL,KAAAA,IAAAzL,EAAA,EAAA,GAHDsL,GAAUG,CAGT;AAED,QAAAC,IAAuBrB,EAAYhC,IACnCsD,IAAgB9H,EAAQwG,EAAYrF;AAAO,MAAA4G;AAAA,EAAA5L,EAAA,EAAA,MAAA0L,KAAA1L,UAAA2L,KAAA3L,EAAA,EAAA,MAAAsG,KAAAtG,EAAA,EAAA,MAAAD,EAAAuK,WAAA/F,cAAAvE,EAAA,EAAA,MAAAqJ,EAAAG,aAGjCoC,IAAAA,MAAA;AACR,QAAAC,IAAgB;AAChBlB,IAAAA,EAAS,IAAI;AAGb,UAAAmB,IAAelF,GAAsBN,CAAO;AAC5CmE,IAAAA,EAAUqB,IAAA;AAAA,MAAA,GAAcA;AAAAA,MAAMtF,gBAAkB;AAAA,MAACF,SAAAA;AAAAA,IAAAA,IAAvC,IAAyD;AACnE,UAAA3B,IAAaA,MAAA;AACXG,cAAOC,QAASwG,EAAeN,QAAQtG,KAAM6G,EAAWP,OAAQ,CAAC,EAAChG,KAC1DM,CAAAA,MAAA;AAEJ,YADIsG,KACAf,EAAaG,WAAb,CAA0BH,EAAaG,QAAQnF,aAAcP,EAAIlG,SAAUkG,EAAIvB,QAAS;AAAC;AAC7F2G,QAAAA,EAAS,IAAI,GACb7D,GAAuBR,GAASf,CAAI;AAGpC,cAAAgB,IAAoBuE,EAAaG,SAAqBrF,YAAAA;AACtD6E,QAAAA,EAAUsB,CAAAA,QAAe;AAAA,UAAA,GACpBxG;AAAAA,UAAIiB,gBACSJ,GAAmBC,IAAUd,GAAMe,GAASC,CAAW;AAAA,UAACD,SAAAA;AAAAA,QAAAA,EAExE;AAAA,MAAC,CACJ,EAACb,MACKuG,CAAAA,MAAA;AACL,QAAIH,KACJlB,EAAS;AAAA,UAAArE,SAAAA;AAAAA,UAAAvD,SAAoBH,GAAcoJ,CAAS;AAAA,QAAA,CAAG;AAAA,MAAC,CACzD;AAAA,IAAC;AAENlB,IAAAA,EAAaG,UAAWU,IACpB5J,GAAyB;AAAA,MAAAuC,SACd;AAAA,QAAAD,YACKqH;AAAAA,QAAcnH,YACdxE,EAAKuK,WAAsB/F,cAA3BmH;AAAAA,QAA6C9G,aAC5C4G,EAAWP,SAAa1C;AAAAA,MAAAA;AAAAA,MACtC5C,YACWwD;AAAAA,MAAgBxE,MAAAA;AAAAA,MAAAtB,eAEb4I,CAAAA,MAAA;AACb,QAAKJ,KAAWhB,EAAaoB,CAAK;AAAA,MAAE;AAAA,MACrCjH,MACKA,CAAA9B,GAAAkB,MACJU,QAAOC,QAASwG,EAAeN,QAAQjG,OAAQwG,EAAWP,SAAU/H,GAAOkB,CAAM,CAAC,EAACa,KAAMC,CAAAA,OAAA;AACvF,cAAA+F,KAAgBrE,GAAsBN,CAAO;AAC7C,eAAI2E,MAASnE,GAAuBR,GAAS;AAAA,UAAA,GAAK2E;AAAAA,UAAO5L,SAAW6D;AAAAA,QAAAA,CAAO,GACpEgC,MAAAzD;AAAAA,MAAmB,CAC3B;AAAA,IAAA,CAEF,IAnBiB,MAoBpBqK,KAAQhB,EAAaG,SAAqBpF,YAACiG,EAAMzM,SAAUyM,EAAM9H,QAAS,GAC9E6G,EAAa;AAAA,MAAA5H,OAAS;AAAA,MAAKE,QAAU;AAAA,IAAA,CAAO,GAC5CwB,EAAAA;AACA,UAAAuH,KAA4B7C,EAASG,UAAU2C,yBAA0BpI,CAAAA,MAAA;AACvE,UAAIA,EAAKmE,mBAAoBwD;AAAc;AAC3C,YAAAU,IAAmBtB,EAAaG;AAChC,MAAImB,IAAYA,EAAUpG,mBAAoBjC,CAAK,IAC9CY,EAAAA;AAAAA,IAAO,CACb;AAAE,WACI,MAAA;AACLkH,MAAAA,IAAYA,IACZK,GAAmBG,QAAAA,GAGnBvB,EAAaG,SAAe9E,MAAAA,GAC5B2E,EAAaG,UAAW;AAAA,IAAH;AAAA,EACtB,GACFjL,QAAA0L,GAAA1L,QAAA2L,GAAA3L,QAAAsG,GAAAtG,EAAA,EAAA,IAAAD,EAAAuK,WAAA/F,YAAAvE,EAAA,EAAA,IAAAqJ,EAAAG,WAAAxJ,QAAA4L,KAAAA,IAAA5L,EAAA,EAAA;AAAgD,QAAAsM,KAAAvM,EAAKuK,WAAsB/F;AAAA,MAAAgI;AAAA,EAAAvM,EAAA,EAAA,MAAA0L,KAAA1L,EAAA,EAAA,MAAA2L,KAAA3L,EAAA,EAAA,MAAAsG,KAAAtG,EAAA,EAAA,MAAAsM,MAAAtM,UAAAqJ,KAAzEkD,IAAA,CAACb,GAAgBC,GAAStC,GAAW/C,GAASgG,EAA2B,GAACtM,QAAA0L,GAAA1L,QAAA2L,GAAA3L,QAAAsG,GAAAtG,QAAAsM,IAAAtM,QAAAqJ,GAAArJ,QAAAuM,KAAAA,IAAAvM,EAAA,EAAA,GAjE7EsL,GAAUM,GAiEPW,CAA0E;AAAC,MAAAC,GAAAC;AAAA,EAAAzM,EAAA,EAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KAGpEmL,IAAAA,MAAA;AACR,UAAArG,IAAcA,MAAM2E,EAAaG,SAAe9E,MAAAA,GAChDuG,IAAqBA,MAAA;AACnB,MAAIC,SAAQC,oBAAqB,YAAUzG,EAAAA;AAAAA,IAAQ;AAErD0G,kBAAMC,iBAAkB,gBAAgB3G,CAAK,GAC7CwG,SAAQG,iBAAkB,oBAAoBJ,CAAY,GACnD,MAAA;AACLG,aAAME,oBAAqB,gBAAgB5G,CAAK,GAChDwG,SAAQI,oBAAqB,oBAAoBL,CAAY;AAAA,IAAC;AAAA,EAC/D,GACAD,IAAA,CAAA,GAAEzM,QAAAwM,GAAAxM,QAAAyM,MAAAD,IAAAxM,EAAA,EAAA,GAAAyM,IAAAzM,EAAA,EAAA,IAXLsL,GAAUkB,GAWPC,CAAE;AAAC,MAAAO;AAAA,EAAAhN,EAAA,EAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KAEe2L,IAAAC,CAAAA,MAAA;AACnBnC,IAAAA,EAAaG,SAAsBlF,aAAC7C,CAAK;AAAA,EAAC,GAC3ClD,QAAAgN,KAAAA,IAAAhN,EAAA,EAAA;AAFD,QAAA+F,KAAqBiH;AAEnB,MAAAE;AAAA,EAAAlN,EAAA,EAAA,MAAAsG,KAAAtG,UAAA2I,KAEoBuE,IAAAxE,GAAoBC,GAAQrC,CAAuB,IAAnDqC,IAAA,MAAoD3I,QAAAsG,GAAAtG,QAAA2I,GAAA3I,QAAAkN,KAAAA,IAAAlN,EAAA,EAAA;AAA1E,QAAAmN,IAAsBD,GACtBE,IAAuBD,IAAA,GAAmBA,EAAa7G,OAAQ,IAAI6G,EAAa3G,cAAe,KAAxE;AAAgF,MAAA6G,GAAAC;AAAA,EAAAtN,EAAA,EAAA,MAAAoN,KAAApN,UAAAO,KAEvF8M,IAAAA,MAAA;AACd,QAAI,CAACD,KAAD7M;AAAoC;AACxC,UAAAgN,IAAajN,EAAW2K;AACxB,IAAKsC,KAELC,sBAAsB,MAAA;AACpB,UAAAC,IAAcF,EAAIG;AAClB,aAAOzC,KAAO;AACZ,cAAA0C,IAAkBC,iBAAiB3C,CAAO,EAAC0C;AAC3C,QAAI,CAAC,QAAQ,UAAU,SAAS,EAACE,SAAUF,CAAwD,KAA1C1C,EAAO6C,eAAgB7C,EAAO8C,iBACrF9C,EAAO+C,YAAa,IAEtB/C,IAAUA,EAAOyC;AAAAA,MAAV;AAAA,IACR,CACF;AAAA,EAAC,GACDJ,IAAA,CAACF,GAAgB7M,CAAiB,GAACP,QAAAoN,GAAApN,QAAAO,GAAAP,QAAAqN,GAAArN,QAAAsN,MAAAD,IAAArN,EAAA,EAAA,GAAAsN,IAAAtN,EAAA,EAAA,IAftCiO,GAAgBZ,GAebC,CAAmC;AAEtC,QAAAY,IAAkBrL,GAAKyD,YAAcA,IAAUzD,EAAKE,UAAlCtB;AAAuD,MAAA0M;AAAA,EAAAnO,EAAA,EAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KACvD8M,IAAAA,MAAMrD,EAAaG,SAAmB/E,UAAAA,GAAElG,QAAAmO,KAAAA,IAAAnO,EAAA,EAAA;AAA1D,QAAAkG,KAAkBiI;AAAyC,MAAAC;AAAA,EAAApO,EAAA,EAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KACzC+M,IAAAA,MAAMtD,EAAaG,SAAehF,MAAAA,GAAEjG,QAAAoO,KAAAA,IAAApO,EAAA,EAAA;AAAtD,QAAAqO,KAAkBD;AAElB,MAAIF,KAAA,CAAcf,GAAa;AAAA,QAAAmB;AAAA,IAAAtO,UAAAkO,KAGzBI,IAAA,gBAAAtS,EAACuF,IAAA,EAAW,OAAA,YAAYyK,UAAAA,GAAU,GAAOhM,QAAAkO,GAAAlO,QAAAsO,KAAAA,IAAAtO,EAAA,EAAA;AAAA,QAAAuO;AAAA,IAAAvO,EAAA,EAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KACzCkN,sBAACnH,IAAA,EAAY,MAAA,MAAa,SAAA,UAAkBlB,SAAAA,IAAW,UAAA,QAAA,CAEvD,GAASlG,QAAAuO,KAAAA,IAAAvO,EAAA,EAAA;AAAA,QAAAwO;AAAA,WAAAxO,UAAAsO,KAJXE,IAAA,gBAAAvN,EAACK,IAAA,EAAS,GAAA,QAAY,MAAA,KAAO,IAAA,MAAO,GAAA,MAAmB,eAAA,UAAa,KAAA,MAClEgN,UAAAA;AAAAA,MAAAA;AAAAA,MACAC;AAAAA,IAAAA,GAGF,GAASvO,QAAAsO,GAAAtO,QAAAwO,KAAAA,IAAAxO,EAAA,EAAA,GALTwO;AAAAA,EAKS;AAIb,MAAI,CAACrB,GAAa;AAAA,QAAAmB;AAAA,WAAAtO,EAAA,EAAA,MAAAoB,uBAAAC,IAAA,2BAAA,KAEdiN,IAAA,gBAAAtS,EAACsF,IAAA,EAAS,GAAA,QAAY,MAAA,KAAO,IAAA,MAC3B,UAAA,gBAAAtF,EAACyS,IAAA,EAAa,MAAA,MAAI,GACpB,GAASzO,QAAAsO,KAAAA,IAAAtO,EAAA,EAAA,GAFTsO;AAAAA,EAES;AAOb,QAAApO,KAAkB,GAAGiN,EAAa7G,OAAQ,IAAI6G,EAAa3G,cAAe;AAAG,MAAA8H;AAAA,EAAAtO,EAAA,EAAA,MAAA4K,KAAA5K,UAAAkO,KACzDI,IAAAtC,IAClB,gBAAAhQ,EAACkL,IAAA,EAAiC8E,SAAAA,GAAoB9F,aAAS,IAC7D0E,EAASvI,8BACV6E,IAAA,EAAiC,SAAA0D,EAASvI,WAAqBgM,aAAS,IADvE,MAEIrO,QAAA4K,GAAA5K,QAAAkO,GAAAlO,QAAAsO,KAAAA,IAAAtO,EAAA,EAAA;AAJR,QAAAG,KAAoBmO;AAIX,MAAAC;AAAA,EAAAvO,EAAA,EAAA,MAAAO,KAAAP,UAAAqJ,KAEyBkF,KAAAhF,CAAAA,MAAA;AAChCH,IAAAA,GAAsB;AAAA,MAAAC,WAAAA;AAAAA,MAAAC,YAAyB/I;AAAAA,MAAiBgJ,WAAAA;AAAAA,IAAAA,CAAa;AAAA,EAAC,GAC/EvJ,QAAAO,GAAAP,QAAAqJ,GAAArJ,QAAAuO,MAAAA,KAAAvO,EAAA,EAAA;AAFD,QAAA0O,KAAkCH;AAEhC,MAAAC;AAAA,EAAAxO,EAAA,EAAA,MAAAmN,EAAA5O,YAAAyB,EAAA,EAAA,MAAAmN,EAAAtE,YAIG2F,IAAArB,EAAatE,WACZ,gBAAA7M,EAAC4M,IAAA,EACW,UAAAuE,EAAa5O,YAAa4O,EAAatE,UACvC,UAAAsE,EAAatE,SAAAA,CAAS,IAHnC,MAKO7I,EAAA,EAAA,IAAAmN,EAAA5O,UAAAyB,EAAA,EAAA,IAAAmN,EAAAtE,UAAA7I,QAAAwO,KAAAA,IAAAxO,EAAA,EAAA;AAMiB,QAAA2O,KAAA9K,EAAQwG,EAAYrF,MAClB4J,KAAArO,IAAAmO,KAAAjN;AAAyD,MAAAoN;AAAA,EAAA7O,EAAA,EAAA,MAAAqK,EAAA7J,SAAAR,EAAA,EAAA,MAAAmN,KAAAnN,EAAA,EAAA,MAAAE,MAAAF,EAAA,EAAA,MAAAwK,KAAAxK,EAAA,EAAA,MAAAG,MAAAH,EAAA,EAAA,MAAA2O,MAAA3O,EAAA,EAAA,MAAA4O,MANpFC,IAAA,gBAAA7S,EAAC0F,IAAA,EAAS,MAAA,KAAS,MAAA,KACjB,UAAA,gBAAA1F,EAAC8D,IAAA,EACUqN,SAAAA,GACEjN,WAAAA,IACEC,aAAAA,IACQ,qBAAAwO,IACE,uBAAAC,IACb7I,UAAAA,IACGzF,aAAAA,GACMkK,mBAAAA,GACZ,OAAAH,EAAY7J,MAAAA,CAAM,EAAA,CAE7B,GAAMR,EAAA,EAAA,IAAAqK,EAAA7J,OAAAR,QAAAmN,GAAAnN,QAAAE,IAAAF,QAAAwK,GAAAxK,QAAAG,IAAAH,QAAA2O,IAAA3O,QAAA4O,IAAA5O,QAAA6O,KAAAA,IAAA7O,EAAA,EAAA;AAAA,MAAA8O;AAAA,SAAA9O,EAAA,EAAA,MAAAwO,KAAAxO,UAAA6O,KAnBRC,KAAA,gBAAA7N,EAACC,KAAe,WAAA,UAAW,GAAA,QAAY,MAAA,KAAO,IAAA,MAC3CsN,UAAAA;AAAAA,IAAAA;AAAAA,IAMDK;AAAAA,EAAAA,GAaF,GAAO7O,QAAAwO,GAAAxO,QAAA6O,GAAA7O,QAAA8O,MAAAA,KAAA9O,EAAA,EAAA,GApBP8O;AAoBO;AA/N8B,SAAAzD,GAAAxB,GAAA;AAAA,SAwCsBA,EAAMxB;AAAG;"}