@flyfish-dev/cad-viewer 0.6.3 → 0.6.4

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyfish-dev/cad-viewer",
3
- "version": "0.6.3",
3
+ "version": "0.6.4",
4
4
  "description": "A production-oriented lightweight frontend CAD viewer for DWG, DXF, DWF, DWFx and XPS, built with TypeScript, worker-backed DWG WebAssembly parsing, native dwf-viewer integration, WebGL 2D/3D rendering and Canvas overlays.",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -56,6 +56,7 @@
56
56
  "./style.css": "./dist/style.css",
57
57
  "./wasm/libredwg-web.wasm": "./dist/wasm/libredwg-web.wasm",
58
58
  "./wasm/libredwg-web.js": "./dist/wasm/libredwg-web.js",
59
+ "./wasm/dwg-worker.js": "./dist/wasm/dwg-worker.js",
59
60
  "./dist/index.js": "./dist/index.js",
60
61
  "./dist/index.d.ts": "./dist/index.d.ts",
61
62
  "./wasm/dwfv-render.wasm": "./dist/wasm/dwfv-render.wasm"
@@ -77,11 +78,13 @@
77
78
  "scripts": {
78
79
  "clean": "node ./scripts/clean.cjs",
79
80
  "copy:wasm": "node ./scripts/copy-libredwg-wasm.cjs",
80
- "dev": "npm run copy:wasm && vite --config vite.config.ts --host 0.0.0.0",
81
+ "copy:worker": "node ./scripts/copy-worker-asset.cjs",
82
+ "dev": "npm run copy:wasm && npm run build:worker && npm run copy:worker && vite --config vite.config.ts --host 0.0.0.0",
81
83
  "typecheck": "tsc -p tsconfig.json --noEmit",
82
84
  "build:types": "tsc -p tsconfig.build.json",
83
- "build:lib": "npm run copy:wasm && vite build --config vite.lib.config.ts && npm run build:types && npm run build:assets",
84
- "build:demo": "npm run copy:wasm && vite build --config vite.config.ts",
85
+ "build:worker": "vite build --config vite.worker.config.ts",
86
+ "build:lib": "npm run copy:wasm && vite build --config vite.lib.config.ts && npm run build:worker && npm run build:types && npm run build:assets",
87
+ "build:demo": "npm run copy:wasm && npm run build:worker && npm run copy:worker && vite build --config vite.config.ts",
85
88
  "build": "npm run clean && npm run typecheck && npm run build:lib && npm run build:demo",
86
89
  "preview": "npm run build:demo && vite preview --config vite.config.ts --host 0.0.0.0",
87
90
  "pack:dry": "npm pack --dry-run",
@@ -1,349 +0,0 @@
1
- function D(e) {
2
- return {
3
- format: e.format,
4
- sourceName: e.sourceName,
5
- units: e.units,
6
- header: e.header ?? {},
7
- layers: e.layers ?? {},
8
- blocks: e.blocks ?? {},
9
- entities: e.entities ?? [],
10
- pages: e.pages,
11
- metadata: e.metadata ?? {},
12
- warnings: e.warnings ?? [],
13
- raw: e.raw
14
- };
15
- }
16
- function L(e) {
17
- switch (String(e ?? "").toUpperCase()) {
18
- case "LINE":
19
- return "line";
20
- case "CIRCLE":
21
- return "circle";
22
- case "ARC":
23
- return "arc";
24
- case "LWPOLYLINE":
25
- case "POLYLINE":
26
- case "POLYLINE_2D":
27
- case "POLYLINE2D":
28
- case "POLYLINE_3D":
29
- case "POLYLINE3D":
30
- case "LEADER":
31
- case "MULTILEADER":
32
- return "polyline";
33
- case "ELLIPSE":
34
- return "ellipse";
35
- case "TEXT":
36
- case "MTEXT":
37
- case "ATTRIB":
38
- case "ATTDEF":
39
- case "DIMENSION":
40
- return "text";
41
- case "POINT":
42
- return "point";
43
- case "INSERT":
44
- return "insert";
45
- case "SOLID":
46
- case "TRACE":
47
- case "3DFACE":
48
- return "solid";
49
- case "HATCH":
50
- return "hatch";
51
- case "SPLINE":
52
- return "spline";
53
- case "PATH":
54
- case "XPS_PATH":
55
- case "DWF_PATH":
56
- return "path";
57
- case "IMAGE":
58
- case "RASTER_IMAGE":
59
- case "DWF_IMAGE":
60
- return "image";
61
- case "VIEWPORT":
62
- return "viewport";
63
- default:
64
- return "unsupported";
65
- }
66
- }
67
- function M(e, t, o = {}) {
68
- const i = t ?? String(e.type ?? e.entityType ?? e.objectName ?? "UNKNOWN").toUpperCase(), n = o.includeUnknownProperties === !1 ? { type: i, kind: L(i) } : { ...e, type: i, kind: L(i) };
69
- o.keepRaw && (n.raw = e), n.handle = g(e.handle ?? e.id), n.layer = g(e.layer ?? e.layerName), n.lineType = g(e.lineType ?? e.linetype);
70
- const c = o.numericColorMode ?? "auto", s = u(e.color), r = u(e.colorIndex ?? e.colorNumber ?? e.aci ?? e.aciColor ?? e.color_index);
71
- n.colorIndex = r ?? (c !== "rgb" && s !== void 0 && Math.abs(s) <= 257 ? s : void 0);
72
- const a = e.trueColor ?? e.true_color ?? e.truecolor ?? e.colorRGB ?? e.colorRgb ?? e.rgbColor ?? e.rgb, d = s !== void 0 && s >= 0 && s <= 16777215 && (c === "rgb" || c === "auto" && Math.abs(s) > 257);
73
- n.trueColor = a ?? (d ? s : void 0), (typeof e.color == "string" || typeof e.color == "number") && (n.color = e.color), n.colorNumber = u(e.colorNumber) ?? n.colorNumber, n.colorName = g(e.colorName ?? e.color_name) ?? n.colorName, n.fillColor = e.fillColor ?? e.fill_color, n.fillColorIndex = u(e.fillColorIndex ?? e.fill_color_index ?? e.fillColorNumber) ?? n.fillColorIndex, n.opacity = u(e.opacity ?? e.alpha) ?? n.opacity, n.lineweight = u(e.lineweight ?? e.lineWeight), n.isVisible = !(e.isVisible === !1 || e.visible === !1), n.startPoint = p(e.startPoint ?? e.start ?? e.p0 ?? e.from) ?? n.startPoint, n.endPoint = p(e.endPoint ?? e.end ?? e.p1 ?? e.to) ?? n.endPoint, n.center = p(e.center ?? e.centerPoint) ?? n.center, n.insertionPoint = p(e.insertionPoint ?? e.position ?? e.location ?? e.point ?? e.basePoint) ?? n.insertionPoint, n.radius = u(e.radius) ?? n.radius, n.startAngle = u(e.startAngle ?? e.start_angle) ?? n.startAngle, n.endAngle = u(e.endAngle ?? e.end_angle) ?? n.endAngle, n.majorAxisEndPoint = p(e.majorAxisEndPoint ?? e.majorAxis ?? e.major) ?? n.majorAxisEndPoint, n.axisRatio = u(e.axisRatio ?? e.ratio) ?? n.axisRatio, n.height = u(e.height ?? e.textHeight) ?? n.height, n.textHeight = u(e.textHeight ?? e.height) ?? n.textHeight, n.rotation = u(e.rotation ?? e.angle) ?? n.rotation, n.text = g(e.text ?? e.value ?? e.string ?? e.contents) ?? n.text, n.name = g(e.name ?? e.blockName) ?? n.name, n.blockName = g(e.blockName ?? e.name) ?? n.blockName;
74
- const f = N(e.vertices ?? e.points);
75
- f.length > 0 && (n.vertices = f);
76
- const l = N(e.controlPoints ?? e.control_points);
77
- l.length > 0 && (n.controlPoints = l);
78
- const m = N(e.fitPoints ?? e.fit_points);
79
- return m.length > 0 && (n.fitPoints = m), n;
80
- }
81
- function p(e) {
82
- if (!e || typeof e != "object") return;
83
- const t = e, o = Number(t.x ?? t.X ?? t[0]), i = Number(t.y ?? t.Y ?? t[1]), n = t.z ?? t.Z ?? t[2], c = n === void 0 ? void 0 : Number(n);
84
- if (!(!Number.isFinite(o) || !Number.isFinite(i)))
85
- return Number.isFinite(c) ? { x: o, y: i, z: c } : { x: o, y: i };
86
- }
87
- function N(e) {
88
- if (!Array.isArray(e)) return [];
89
- const t = [];
90
- for (const o of e) {
91
- const i = p(o);
92
- if (!i) continue;
93
- const n = o, c = i, s = u(n.bulge);
94
- s !== void 0 && (c.bulge = s);
95
- const r = u(n.startWidth ?? n.start_width);
96
- r !== void 0 && (c.startWidth = r);
97
- const a = u(n.endWidth ?? n.end_width);
98
- a !== void 0 && (c.endWidth = a), t.push(c);
99
- }
100
- return t;
101
- }
102
- function T(e, t) {
103
- t.name && (e[t.name] = t, e[t.name.toLowerCase()] = t);
104
- }
105
- function _(e, t) {
106
- t.name && (e[t.name] = t, e[t.name.toLowerCase()] = t);
107
- }
108
- function u(e) {
109
- const t = Number(e);
110
- return Number.isFinite(t) ? t : void 0;
111
- }
112
- function g(e) {
113
- if (typeof e != "string" && typeof e != "number") return;
114
- const t = String(e);
115
- return t.length > 0 ? t : void 0;
116
- }
117
- function O(e) {
118
- return e.byteOffset === 0 && e.byteLength === e.buffer.byteLength ? e.buffer : e.slice().buffer;
119
- }
120
- const S = {
121
- AC1009: "R12",
122
- AC1012: "R13",
123
- AC1014: "R14",
124
- AC1015: "R2000",
125
- AC1018: "R2004",
126
- AC1021: "R2007",
127
- AC1024: "R2010",
128
- AC1027: "R2013",
129
- AC1032: "R2018"
130
- };
131
- function U(e) {
132
- const t = Array.from(e.slice(0, 6), (i) => String.fromCharCode(i)).join(""), o = S[t] ?? "UNKNOWN";
133
- return {
134
- signature: t,
135
- release: o,
136
- supportedByOpenDesignSpec: o !== "UNKNOWN",
137
- notes: o === "UNKNOWN" ? "Unknown or unsupported DWG signature." : void 0
138
- };
139
- }
140
- const C = /* @__PURE__ */ new Map();
141
- async function B(e, t = {}) {
142
- var m, y, b, A, w, R;
143
- const o = performance.now(), i = t.sourceName;
144
- (m = t.onProgress) == null || m.call(t, { phase: "detect", format: "dwg", message: "Validating DWG header…", total: e.byteLength });
145
- const n = U(e);
146
- if (!n.signature.startsWith("AC"))
147
- throw new Error(`Invalid DWG header: ${JSON.stringify(n.signature)}.`);
148
- (y = t.onProgress) == null || y.call(t, { phase: "wasm-init", format: "dwg", message: "Initializing LibreDWG WebAssembly…", total: e.byteLength });
149
- const c = await k(t.wasmPath ?? "/wasm/");
150
- (b = t.onProgress) == null || b.call(t, { phase: "parse", format: "dwg", message: `Decoding ${n.signature} DWG…`, total: e.byteLength, percent: 35 });
151
- const s = O(e), r = ((A = c.Dwg_File_Type) == null ? void 0 : A.DWG) ?? 0, a = c.instance.dwg_read_data(s, r);
152
- if (!a) throw new Error("LibreDWG returned an empty DWG result.");
153
- if (typeof a.error == "number" && a.error !== 0) throw new Error(`LibreDWG parse error code: ${a.error}.`);
154
- (w = t.onProgress) == null || w.call(t, { phase: "normalize", format: "dwg", message: "Normalizing DWG database…", total: e.byteLength, percent: 72 });
155
- const d = typeof c.instance.convert == "function" ? c.instance.convert(a) : a;
156
- try {
157
- typeof c.instance.dwg_free == "function" && c.instance.dwg_free(a);
158
- } catch {
159
- }
160
- const f = z(d, i, n, { keepRaw: !!t.keepRaw }), l = performance.now() - o;
161
- return (R = t.onProgress) == null || R.call(t, { phase: "done", format: "dwg", message: "DWG loaded.", total: e.byteLength, percent: 100, elapsedMs: l }), {
162
- document: f,
163
- raw: t.keepRaw ? d : void 0,
164
- bytes: e.byteLength,
165
- elapsedMs: l,
166
- format: "dwg",
167
- warnings: f.warnings
168
- };
169
- }
170
- async function k(e = "/wasm/") {
171
- const t = H(e);
172
- let o = C.get(t);
173
- o || (o = import("./index-C365l3i9.js").then(async (c) => {
174
- const s = c, r = s.LibreDwg;
175
- if (!r || typeof r.create != "function")
176
- throw new Error("@mlightcad/libredwg-web did not expose LibreDwg.create().");
177
- try {
178
- if (typeof s.createModule == "function" && typeof r.createByWasmInstance == "function") {
179
- const a = E(t), d = await V(a), f = await s.createModule({
180
- wasmBinary: d,
181
- locateFile: (l) => new URL(l, x(t)).href
182
- });
183
- return r.createByWasmInstance(f);
184
- }
185
- return await r.create(t);
186
- } catch (a) {
187
- const d = a instanceof Error ? a.message : String(a);
188
- throw new Error(`Failed to initialize LibreDWG WebAssembly from ${t}. Ensure libredwg-web.wasm is deployed at ${E(t)} and wasmPath is resolved relative to the page, not the worker script. Run npm run copy:wasm before dev/build. Original error: ${d}`);
189
- }
190
- }), C.set(t, o));
191
- const i = await o, n = await import("./index-C365l3i9.js");
192
- return { module: n, instance: i, Dwg_File_Type: n.Dwg_File_Type };
193
- }
194
- function z(e, t, o, i = {}) {
195
- const n = e && typeof e == "object" ? e : {}, c = F(n, i), s = $(n, i), r = Array.isArray(n.entities) ? n.entities : [], a = { keepRaw: !!i.keepRaw, includeUnknownProperties: !!i.keepRaw }, d = r.filter((l) => !!l && typeof l == "object").map((l) => I(l, a)), f = D({
196
- format: "dwg",
197
- sourceName: t,
198
- header: j(n.header, o),
199
- layers: c,
200
- blocks: s,
201
- entities: d,
202
- metadata: {
203
- parser: "@mlightcad/libredwg-web",
204
- parserMode: "wasm",
205
- version: o
206
- },
207
- warnings: [],
208
- raw: i.keepRaw ? e : void 0
209
- });
210
- return d.length === 0 && f.warnings.push("DWG parsed successfully but no model-space entities were exposed by the converter. Check layout/paper-space content or unsupported proxy objects."), f;
211
- }
212
- function I(e, t) {
213
- const o = M(e, void 0, { ...t, numericColorMode: "rgb" }), i = u(e.color);
214
- return i !== void 0 && i >= 0 && i <= 16777215 && (o.color = i, o.trueColor = i), o.colorIndex = u(e.colorIndex ?? e.colorNumber ?? e.aci) ?? o.colorIndex, o.colorName = g(e.colorName ?? e.color_name) ?? o.colorName, o;
215
- }
216
- function G(e) {
217
- return typeof e == "number" && Number.isFinite(e) && Math.abs(Math.trunc(e)) >= 1 && Math.abs(Math.trunc(e)) <= 255;
218
- }
219
- function j(e, t) {
220
- const o = e && typeof e == "object" ? { ...e } : {};
221
- return t && (o.dwgVersion = t), o;
222
- }
223
- function F(e, t) {
224
- const o = {}, i = [], n = e.tables;
225
- for (const c of ["LAYER", "layer", "layers"]) {
226
- const s = e[c] ?? (n == null ? void 0 : n[c]);
227
- s && i.push(s);
228
- }
229
- for (const c of i)
230
- for (const s of W(c)) {
231
- const r = s, a = g(r.name ?? r.layerName ?? r.entryName);
232
- if (!a) continue;
233
- const d = u(r.colorIndex ?? r.colorNumber), f = u(r.trueColor ?? r.true_color ?? r.truecolor ?? r.colorRGB ?? r.colorRgb ?? r.rgbColor ?? r.rgb), l = u(r.color), m = G(d), y = f ?? (!m && l !== void 0 && l >= 0 && l <= 16777215 ? l : void 0), b = {
234
- name: a,
235
- color: m ? void 0 : r.color ?? r.colorName,
236
- colorIndex: d ?? (l !== void 0 && Math.abs(l) <= 257 ? l : void 0),
237
- trueColor: y,
238
- lineType: g(r.lineType ?? r.linetype),
239
- lineweight: u(r.lineweight ?? r.lineWeight),
240
- isVisible: !(r.isVisible === !1 || r.off === !0 || Number(d ?? r.color ?? 1) < 0),
241
- isFrozen: !!(r.isFrozen ?? r.frozen),
242
- isLocked: !!(r.isLocked ?? r.locked),
243
- raw: t.keepRaw ? r : void 0
244
- };
245
- T(o, b);
246
- }
247
- return o;
248
- }
249
- function $(e, t) {
250
- const o = {}, i = [e.blocks, e.blockHeaders, e.block_records, e.blockRecords], n = e.tables;
251
- i.push(n == null ? void 0 : n.BLOCK, n == null ? void 0 : n.BLOCK_RECORD, n == null ? void 0 : n.blocks);
252
- const c = { keepRaw: !!t.keepRaw, includeUnknownProperties: !!t.keepRaw };
253
- for (const s of i)
254
- for (const r of W(s)) {
255
- const a = r, d = g(a.name ?? a.blockName ?? a.name2);
256
- if (!d) continue;
257
- const l = (Array.isArray(a.entities) ? a.entities : Array.isArray(a.ownedObjects) ? a.ownedObjects : []).filter((m) => !!m && typeof m == "object").map((m) => I(m, c));
258
- _(o, {
259
- name: d,
260
- basePoint: p(a.basePoint ?? a.origin) ?? { x: 0, y: 0 },
261
- entities: l,
262
- raw: t.keepRaw ? a : void 0
263
- });
264
- }
265
- return o;
266
- }
267
- function W(e) {
268
- if (!e) return [];
269
- if (Array.isArray(e)) return e;
270
- if (typeof e != "object") return [];
271
- const t = e, o = Object.values(t).filter((n) => n && typeof n == "object"), i = ["entries", "records", "items", "values", "layers", "blocks"].flatMap((n) => Array.isArray(t[n]) ? t[n] : []);
272
- return i.length > 0 ? i : o;
273
- }
274
- function H(e) {
275
- const t = e.trim() || "/wasm";
276
- if (t === "/") return P();
277
- const o = t.replace(/\/+$/, "");
278
- return q(o) ? o : o.startsWith("/") ? `${P()}${o}` : new URL(o, v()).href.replace(/\/+$/, "");
279
- }
280
- function E(e) {
281
- return new URL("libredwg-web.wasm", x(e)).href;
282
- }
283
- function x(e) {
284
- return e.endsWith("/") ? e : `${e}/`;
285
- }
286
- function q(e) {
287
- return /^[a-z][a-z0-9+.-]*:/i.test(e);
288
- }
289
- function v() {
290
- return typeof document < "u" && document.baseURI ? document.baseURI : typeof location < "u" && location.href ? location.href : "http://localhost/";
291
- }
292
- function P() {
293
- return typeof location < "u" && location.origin ? location.origin : new URL(v()).origin;
294
- }
295
- async function V(e) {
296
- if (typeof fetch != "function")
297
- throw new Error("fetch() is not available, so the LibreDWG WASM binary cannot be loaded.");
298
- const t = await fetch(e, { credentials: "same-origin", cache: "force-cache" });
299
- if (!t.ok)
300
- throw new Error(`WASM asset request failed with HTTP ${t.status} for ${e}.`);
301
- const o = new Uint8Array(await t.arrayBuffer());
302
- if (!Y(o)) {
303
- const i = X(o), n = t.headers.get("content-type") ?? "unknown content-type";
304
- throw new Error(`Invalid WASM asset at ${e}. Expected bytes 00 61 73 6d, got ${K(o)} (${n}). The server probably returned an HTML fallback page instead of libredwg-web.wasm. Response preview: ${i}`);
305
- }
306
- return o;
307
- }
308
- function Y(e) {
309
- return e.length >= 4 && e[0] === 0 && e[1] === 97 && e[2] === 115 && e[3] === 109;
310
- }
311
- function K(e) {
312
- return Array.from(e.slice(0, 4)).map((t) => t.toString(16).padStart(2, "0")).join(" ");
313
- }
314
- function X(e) {
315
- const t = Array.from(e.slice(0, 32)).map((o) => o >= 32 && o <= 126 ? String.fromCharCode(o) : ".").join("");
316
- return JSON.stringify(t);
317
- }
318
- const h = self;
319
- h.postMessage({ type: "ready" });
320
- h.onmessage = async (e) => {
321
- var n, c;
322
- const t = e.data;
323
- if (!t) return;
324
- const o = performance.now(), i = (s) => {
325
- h.postMessage({ type: "progress", requestId: t.requestId, progress: s });
326
- };
327
- try {
328
- if (t.type === "warmup") {
329
- i({ phase: "wasm-init", format: "dwg", message: "Warming LibreDWG WebAssembly instance…" }), await k(((n = t.options) == null ? void 0 : n.wasmPath) ?? "/wasm/"), h.postMessage({ type: "warmup-result", requestId: t.requestId, elapsedMs: performance.now() - o });
330
- return;
331
- }
332
- if (t.type !== "load") return;
333
- i({ phase: "worker-ready", format: "dwg", message: "DWG worker received file bytes.", total: t.bytes.byteLength });
334
- const s = await B(new Uint8Array(t.bytes), {
335
- ...t.options,
336
- sourceName: t.fileName,
337
- keepRaw: !!((c = t.options) != null && c.keepRaw),
338
- onProgress: i
339
- });
340
- s.document.metadata.loaderMode = "worker", s.elapsedMs = performance.now() - o, h.postMessage({ type: "result", requestId: t.requestId, result: s });
341
- } catch (s) {
342
- const r = J(s);
343
- h.postMessage({ type: "error", requestId: t.requestId, error: r });
344
- }
345
- };
346
- function J(e) {
347
- return e instanceof Error ? { name: e.name, message: e.message, stack: e.stack } : { message: String(e) };
348
- }
349
- //# sourceMappingURL=DwgWorker-CuZJ5EUe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DwgWorker-CuZJ5EUe.js","sources":["../src/core/entity.ts","../src/core/format.ts","../src/loaders/dwg/dwgVersion.ts","../src/loaders/dwg/DwgParser.ts","../src/loaders/dwg/DwgWorker.ts"],"sourcesContent":["import type { CadBlock, CadDocument, CadEntity, CadEntityKind, CadLayer, CadPage, CadPoint3D } from './types';\n\nexport interface NormalizeCadEntityOptions {\n /** Preserve the parser-owned raw object on entity.raw. This can be very large and may not be structured-clone safe. */\n keepRaw?: boolean;\n /** Copy unknown parser properties onto the normalized entity. Disable inside workers for predictable cloneable payloads. */\n includeUnknownProperties?: boolean;\n /** How to interpret a numeric raw `color` property when the source parser is ambiguous. */\n numericColorMode?: 'auto' | 'aci' | 'rgb';\n}\n\nexport function createCadDocument(init: Partial<CadDocument> & Pick<CadDocument, 'format'>): CadDocument {\n return {\n format: init.format,\n sourceName: init.sourceName,\n units: init.units,\n header: init.header ?? {},\n layers: init.layers ?? {},\n blocks: init.blocks ?? {},\n entities: init.entities ?? [],\n pages: init.pages,\n metadata: init.metadata ?? {},\n warnings: init.warnings ?? [],\n raw: init.raw\n };\n}\n\nexport function inferEntityKind(type: unknown): CadEntityKind {\n const upper = String(type ?? '').toUpperCase();\n switch (upper) {\n case 'LINE': return 'line';\n case 'CIRCLE': return 'circle';\n case 'ARC': return 'arc';\n case 'LWPOLYLINE':\n case 'POLYLINE':\n case 'POLYLINE_2D':\n case 'POLYLINE2D':\n case 'POLYLINE_3D':\n case 'POLYLINE3D':\n case 'LEADER':\n case 'MULTILEADER': return 'polyline';\n case 'ELLIPSE': return 'ellipse';\n case 'TEXT':\n case 'MTEXT':\n case 'ATTRIB':\n case 'ATTDEF':\n case 'DIMENSION': return 'text';\n case 'POINT': return 'point';\n case 'INSERT': return 'insert';\n case 'SOLID':\n case 'TRACE':\n case '3DFACE': return 'solid';\n case 'HATCH': return 'hatch';\n case 'SPLINE': return 'spline';\n case 'PATH':\n case 'XPS_PATH':\n case 'DWF_PATH': return 'path';\n case 'IMAGE':\n case 'RASTER_IMAGE':\n case 'DWF_IMAGE': return 'image';\n case 'VIEWPORT': return 'viewport';\n default: return 'unsupported';\n }\n}\n\nexport function normalizeCadEntity(raw: Record<string, unknown>, forcedType?: string, options: NormalizeCadEntityOptions = {}): CadEntity {\n const type = forcedType ?? String(raw.type ?? raw.entityType ?? raw.objectName ?? 'UNKNOWN').toUpperCase();\n const entity: CadEntity = options.includeUnknownProperties === false\n ? { type, kind: inferEntityKind(type) }\n : { ...raw, type, kind: inferEntityKind(type) } as CadEntity;\n if (options.keepRaw) entity.raw = raw;\n entity.handle = stringOrUndefined(raw.handle ?? raw.id);\n entity.layer = stringOrUndefined(raw.layer ?? raw.layerName);\n entity.lineType = stringOrUndefined(raw.lineType ?? raw.linetype);\n\n const numericColorMode = options.numericColorMode ?? 'auto';\n const rawColorNumber = numberOrUndefined(raw.color);\n const explicitAci = numberOrUndefined(raw.colorIndex ?? raw.colorNumber ?? raw.aci ?? raw.aciColor ?? raw.color_index);\n entity.colorIndex = explicitAci ?? (numericColorMode !== 'rgb' && rawColorNumber !== undefined && Math.abs(rawColorNumber) <= 257 ? rawColorNumber : undefined);\n\n const explicitTrueColor = raw.trueColor ?? raw.true_color ?? raw.truecolor ?? raw.colorRGB ?? raw.colorRgb ?? raw.rgbColor ?? raw.rgb;\n const rawColorLooksRgb = rawColorNumber !== undefined && rawColorNumber >= 0 && rawColorNumber <= 0xffffff && (numericColorMode === 'rgb' || (numericColorMode === 'auto' && Math.abs(rawColorNumber) > 257));\n entity.trueColor = (explicitTrueColor ?? (rawColorLooksRgb ? rawColorNumber : undefined)) as CadEntity['trueColor'];\n if (typeof raw.color === 'string' || typeof raw.color === 'number') entity.color = raw.color as string | number;\n entity.colorNumber = numberOrUndefined(raw.colorNumber) ?? entity.colorNumber;\n entity.colorName = stringOrUndefined(raw.colorName ?? raw.color_name) ?? entity.colorName;\n entity.fillColor = (raw.fillColor ?? raw.fill_color) as CadEntity['fillColor'];\n entity.fillColorIndex = numberOrUndefined(raw.fillColorIndex ?? raw.fill_color_index ?? raw.fillColorNumber) ?? entity.fillColorIndex;\n entity.opacity = numberOrUndefined(raw.opacity ?? raw.alpha) ?? entity.opacity;\n entity.lineweight = numberOrUndefined(raw.lineweight ?? raw.lineWeight);\n entity.isVisible = raw.isVisible === false || raw.visible === false ? false : true;\n entity.startPoint = pointFromUnknown(raw.startPoint ?? raw.start ?? raw.p0 ?? raw.from) ?? entity.startPoint;\n entity.endPoint = pointFromUnknown(raw.endPoint ?? raw.end ?? raw.p1 ?? raw.to) ?? entity.endPoint;\n entity.center = pointFromUnknown(raw.center ?? raw.centerPoint) ?? entity.center;\n entity.insertionPoint = pointFromUnknown(raw.insertionPoint ?? raw.position ?? raw.location ?? raw.point ?? raw.basePoint) ?? entity.insertionPoint;\n entity.radius = numberOrUndefined(raw.radius) ?? entity.radius;\n entity.startAngle = numberOrUndefined(raw.startAngle ?? raw.start_angle) ?? entity.startAngle;\n entity.endAngle = numberOrUndefined(raw.endAngle ?? raw.end_angle) ?? entity.endAngle;\n entity.majorAxisEndPoint = pointFromUnknown(raw.majorAxisEndPoint ?? raw.majorAxis ?? raw.major) ?? entity.majorAxisEndPoint;\n entity.axisRatio = numberOrUndefined(raw.axisRatio ?? raw.ratio) ?? entity.axisRatio;\n entity.height = numberOrUndefined(raw.height ?? raw.textHeight) ?? entity.height;\n entity.textHeight = numberOrUndefined(raw.textHeight ?? raw.height) ?? entity.textHeight;\n entity.rotation = numberOrUndefined(raw.rotation ?? raw.angle) ?? entity.rotation;\n entity.text = stringOrUndefined(raw.text ?? raw.value ?? raw.string ?? raw.contents) ?? entity.text;\n entity.name = stringOrUndefined(raw.name ?? raw.blockName) ?? entity.name;\n entity.blockName = stringOrUndefined(raw.blockName ?? raw.name) ?? entity.blockName;\n\n const vertices = normalizePoints(raw.vertices ?? raw.points);\n if (vertices.length > 0) entity.vertices = vertices;\n const controlPoints = normalizePoints(raw.controlPoints ?? raw.control_points);\n if (controlPoints.length > 0) entity.controlPoints = controlPoints;\n const fitPoints = normalizePoints(raw.fitPoints ?? raw.fit_points);\n if (fitPoints.length > 0) entity.fitPoints = fitPoints;\n return entity;\n}\n\nexport function pointFromUnknown(value: unknown): CadPoint3D | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const record = value as Record<string, unknown>;\n const x = Number(record.x ?? record.X ?? record[0]);\n const y = Number(record.y ?? record.Y ?? record[1]);\n const zCandidate = record.z ?? record.Z ?? record[2];\n const z = zCandidate === undefined ? undefined : Number(zCandidate);\n if (!Number.isFinite(x) || !Number.isFinite(y)) return undefined;\n return Number.isFinite(z) ? { x, y, z } : { x, y };\n}\n\nexport function normalizePoints(value: unknown): Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }> {\n if (!Array.isArray(value)) return [];\n const out: Array<CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number }> = [];\n for (const item of value) {\n const p = pointFromUnknown(item);\n if (!p) continue;\n const rec = item as Record<string, unknown>;\n const vertex = p as CadPoint3D & { bulge?: number; startWidth?: number; endWidth?: number };\n const bulge = numberOrUndefined(rec.bulge);\n if (bulge !== undefined) vertex.bulge = bulge;\n const startWidth = numberOrUndefined(rec.startWidth ?? rec.start_width);\n if (startWidth !== undefined) vertex.startWidth = startWidth;\n const endWidth = numberOrUndefined(rec.endWidth ?? rec.end_width);\n if (endWidth !== undefined) vertex.endWidth = endWidth;\n out.push(vertex);\n }\n return out;\n}\n\nexport function summarizeCadDocument(document: CadDocument) {\n const byType: Record<string, number> = {};\n for (const entity of document.entities) {\n const type = String(entity.type ?? 'UNKNOWN').toUpperCase();\n byType[type] = (byType[type] ?? 0) + 1;\n }\n return {\n format: document.format,\n sourceName: document.sourceName,\n entityCount: document.entities.length,\n layerCount: Object.keys(document.layers).length,\n blockCount: Object.keys(document.blocks).length,\n pageCount: document.pages?.length ?? 0,\n byType,\n warnings: [...document.warnings]\n };\n}\n\nexport function addLayer(target: Record<string, CadLayer>, layer: CadLayer): void {\n if (!layer.name) return;\n target[layer.name] = layer;\n target[layer.name.toLowerCase()] = layer;\n}\n\nexport function addBlock(target: Record<string, CadBlock>, block: CadBlock): void {\n if (!block.name) return;\n target[block.name] = block;\n target[block.name.toLowerCase()] = block;\n}\n\nexport function flattenPages(pages: CadPage[] | undefined): CadEntity[] {\n if (!pages?.length) return [];\n return pages.flatMap((page) => page.entities.map((entity) => ({ ...entity, pageIndex: page.index })));\n}\n\nexport function numberOrUndefined(value: unknown): number | undefined {\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\nexport function stringOrUndefined(value: unknown): string | undefined {\n if (typeof value !== 'string' && typeof value !== 'number') return undefined;\n const out = String(value);\n return out.length > 0 ? out : undefined;\n}\n","import type { CadFormat, CadLoadInput } from './types';\n\nexport async function readInputBytes(input: CadLoadInput): Promise<Uint8Array> {\n if (input.buffer instanceof Uint8Array) return input.buffer;\n if (input.buffer instanceof ArrayBuffer) return new Uint8Array(input.buffer);\n if (input.file) return new Uint8Array(await input.file.arrayBuffer());\n throw new Error('CadLoadInput requires a File, ArrayBuffer, or Uint8Array.');\n}\n\nexport function exactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n if (bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength) return bytes.buffer as ArrayBuffer;\n return bytes.slice().buffer as ArrayBuffer;\n}\n\nexport function extensionOf(input: CadLoadInput): string {\n const name = input.fileName ?? input.file?.name ?? '';\n const index = name.lastIndexOf('.');\n return index >= 0 ? name.slice(index + 1).toLowerCase() : '';\n}\n\nexport function detectCadFormat(input: CadLoadInput, bytes?: Uint8Array): CadFormat {\n const ext = extensionOf(input);\n if (ext === 'dwg') return 'dwg';\n if (ext === 'dxf') return 'dxf';\n if (ext === 'dwfx') return 'dwfx';\n if (ext === 'xps') return 'xps';\n if (ext === 'dwf') return 'dwf';\n\n if (bytes && bytes.byteLength >= 6) {\n const sig = ascii(bytes.slice(0, 6));\n if (/^AC10/.test(sig)) return 'dwg';\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) return 'dwfx';\n const head = ascii(bytes.slice(0, Math.min(bytes.byteLength, 2048))).toUpperCase();\n if (head.includes('SECTION') && head.includes('ENTITIES')) return 'dxf';\n if (head.includes('DWF')) return 'dwf';\n }\n return 'unknown';\n}\n\nexport function ascii(bytes: Uint8Array): string {\n return Array.from(bytes, (b) => b >= 32 && b <= 126 ? String.fromCharCode(b) : ' ').join('');\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n return new TextDecoder('utf-8').decode(bytes);\n}\n","export type DwgRelease = 'R12' | 'R13' | 'R14' | 'R2000' | 'R2004' | 'R2007' | 'R2010' | 'R2013' | 'R2018' | 'UNKNOWN';\n\nexport interface DwgVersionInfo {\n signature: string;\n release: DwgRelease;\n supportedByOpenDesignSpec: boolean;\n notes?: string;\n}\n\nconst RELEASES: Record<string, DwgRelease> = {\n AC1009: 'R12',\n AC1012: 'R13',\n AC1014: 'R14',\n AC1015: 'R2000',\n AC1018: 'R2004',\n AC1021: 'R2007',\n AC1024: 'R2010',\n AC1027: 'R2013',\n AC1032: 'R2018'\n};\n\nexport function readDwgVersion(bytes: Uint8Array): DwgVersionInfo {\n const signature = Array.from(bytes.slice(0, 6), (b) => String.fromCharCode(b)).join('');\n const release = RELEASES[signature] ?? 'UNKNOWN';\n return {\n signature,\n release,\n supportedByOpenDesignSpec: release !== 'UNKNOWN',\n notes: release === 'UNKNOWN' ? 'Unknown or unsupported DWG signature.' : undefined\n };\n}\n","import { addBlock, addLayer, createCadDocument, normalizeCadEntity, numberOrUndefined, pointFromUnknown, stringOrUndefined } from '../../core/entity';\nimport { exactArrayBuffer } from '../../core/format';\nimport type { CadBlock, CadDocument, CadEntity, CadLayer, CadLoadOptions, CadLoadProgress, CadLoadResult } from '../../core/types';\nimport { readDwgVersion } from './dwgVersion';\n\ninterface LibreDwgModule {\n Dwg_File_Type?: Record<string, number>;\n LibreDwg?: {\n create(wasmPath?: string): Promise<any>;\n createByWasmInstance?(wasmInstance: any): any;\n };\n createModule?: (moduleArg?: Record<string, unknown>) => Promise<any>;\n}\n\nexport interface ParseDwgBytesOptions extends CadLoadOptions {\n sourceName?: string;\n onProgress?: (progress: CadLoadProgress) => void;\n}\n\nconst instances = new Map<string, Promise<any>>();\n\nexport async function parseDwgBytes(bytes: Uint8Array, options: ParseDwgBytesOptions = {}): Promise<CadLoadResult> {\n const started = performance.now();\n const sourceName = options.sourceName;\n options.onProgress?.({ phase: 'detect', format: 'dwg', message: 'Validating DWG header…', total: bytes.byteLength });\n\n const version = readDwgVersion(bytes);\n if (!version.signature.startsWith('AC')) {\n throw new Error(`Invalid DWG header: ${JSON.stringify(version.signature)}.`);\n }\n\n options.onProgress?.({ phase: 'wasm-init', format: 'dwg', message: 'Initializing LibreDWG WebAssembly…', total: bytes.byteLength });\n const lib = await createLibreDwg(options.wasmPath ?? '/wasm/');\n\n options.onProgress?.({ phase: 'parse', format: 'dwg', message: `Decoding ${version.signature} DWG…`, total: bytes.byteLength, percent: 35 });\n const fileContent = exactArrayBuffer(bytes);\n const fileType = lib.Dwg_File_Type?.DWG ?? 0;\n const dwg = lib.instance.dwg_read_data(fileContent, fileType);\n if (!dwg) throw new Error('LibreDWG returned an empty DWG result.');\n if (typeof dwg.error === 'number' && dwg.error !== 0) throw new Error(`LibreDWG parse error code: ${dwg.error}.`);\n\n options.onProgress?.({ phase: 'normalize', format: 'dwg', message: 'Normalizing DWG database…', total: bytes.byteLength, percent: 72 });\n const rawDb = typeof lib.instance.convert === 'function' ? lib.instance.convert(dwg) : dwg;\n try {\n if (typeof lib.instance.dwg_free === 'function') lib.instance.dwg_free(dwg);\n } catch {\n // Different wrapper versions manage native memory differently.\n }\n\n const document = normalizeDwgDatabase(rawDb, sourceName, version, { keepRaw: Boolean(options.keepRaw) });\n const elapsedMs = performance.now() - started;\n options.onProgress?.({ phase: 'done', format: 'dwg', message: 'DWG loaded.', total: bytes.byteLength, percent: 100, elapsedMs });\n return {\n document,\n raw: options.keepRaw ? rawDb : undefined,\n bytes: bytes.byteLength,\n elapsedMs,\n format: 'dwg',\n warnings: document.warnings\n };\n}\n\nexport async function createLibreDwg(wasmPath = '/wasm/'): Promise<{ module: LibreDwgModule; instance: any; Dwg_File_Type?: Record<string, number> }> {\n const normalizedPath = normalizeWasmPath(wasmPath);\n let promise = instances.get(normalizedPath);\n if (!promise) {\n promise = import('@mlightcad/libredwg-web').then(async (module) => {\n const typed = module as LibreDwgModule;\n const LibreDwg = typed.LibreDwg;\n if (!LibreDwg || typeof LibreDwg.create !== 'function') {\n throw new Error('@mlightcad/libredwg-web did not expose LibreDwg.create().');\n }\n\n try {\n // Load the WASM binary explicitly instead of relying on Emscripten's\n // streaming fetch. This makes deployments robust when a CDN returns\n // application/octet-stream, when the server lacks the application/wasm\n // MIME mapping, and, most importantly, lets us detect SPA fallback HTML\n // before the WebAssembly runtime aborts with a cryptic magic-word error.\n if (typeof typed.createModule === 'function' && typeof LibreDwg.createByWasmInstance === 'function') {\n const wasmUrl = getLibreDwgWasmUrl(normalizedPath);\n const wasmBinary = await fetchWasmBinary(wasmUrl);\n const wasmInstance = await typed.createModule({\n wasmBinary,\n locateFile: (filename: string) => new URL(filename, ensureTrailingSlash(normalizedPath)).href\n });\n return LibreDwg.createByWasmInstance(wasmInstance);\n }\n\n // Important: call the static method on the class object. The upstream\n // implementation uses `this.createByWasmInstance(...)`; extracting\n // `create` into a standalone function loses `this` and causes\n // \"Cannot read properties of undefined (reading 'createByWasmInstance')\".\n return await LibreDwg.create(normalizedPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to initialize LibreDWG WebAssembly from ${normalizedPath}. Ensure libredwg-web.wasm is deployed at ${getLibreDwgWasmUrl(normalizedPath)} and wasmPath is resolved relative to the page, not the worker script. Run npm run copy:wasm before dev/build. Original error: ${message}`);\n }\n });\n instances.set(normalizedPath, promise);\n }\n const instance = await promise;\n const module = await import('@mlightcad/libredwg-web') as LibreDwgModule;\n return { module, instance, Dwg_File_Type: module.Dwg_File_Type };\n}\n\nexport function normalizeDwgDatabase(rawDb: unknown, sourceName?: string, version?: unknown, options: { keepRaw?: boolean } = {}): CadDocument {\n const record = rawDb && typeof rawDb === 'object' ? rawDb as Record<string, unknown> : {};\n const layers = extractLayers(record, options);\n const blocks = extractBlocks(record, options);\n const rawEntities = Array.isArray(record.entities) ? record.entities : [];\n const normalizeOptions = { keepRaw: Boolean(options.keepRaw), includeUnknownProperties: Boolean(options.keepRaw) };\n const entities = rawEntities\n .filter((item): item is Record<string, unknown> => !!item && typeof item === 'object')\n .map((item) => normalizeDwgEntity(item, normalizeOptions));\n\n const document = createCadDocument({\n format: 'dwg',\n sourceName,\n header: normalizeHeader(record.header, version),\n layers,\n blocks,\n entities,\n metadata: {\n parser: '@mlightcad/libredwg-web',\n parserMode: 'wasm',\n version\n },\n warnings: [],\n raw: options.keepRaw ? rawDb : undefined\n });\n\n if (entities.length === 0) {\n document.warnings.push('DWG parsed successfully but no model-space entities were exposed by the converter. Check layout/paper-space content or unsupported proxy objects.');\n }\n return document;\n}\n\n\nfunction normalizeDwgEntity(record: Record<string, unknown>, options: { keepRaw?: boolean; includeUnknownProperties?: boolean }): CadEntity {\n const entity = normalizeCadEntity(record, undefined, { ...options, numericColorMode: 'rgb' });\n const rgb = numberOrUndefined(record.color);\n // @mlightcad/libredwg-web exposes DwgEntity.color as a 24-bit RGB value,\n // while DXF parsers commonly expose `color` as an ACI index. DWG normalization\n // must therefore preserve `color` as trueColor even for low RGB values such as\n // 0x0000ff; otherwise valid DWG colors are interpreted as ACI and many files\n // render as a single foreground color.\n if (rgb !== undefined && rgb >= 0 && rgb <= 0xffffff) {\n entity.color = rgb;\n entity.trueColor = rgb;\n }\n entity.colorIndex = numberOrUndefined(record.colorIndex ?? record.colorNumber ?? record.aci) ?? entity.colorIndex;\n entity.colorName = stringOrUndefined(record.colorName ?? record.color_name) ?? entity.colorName;\n return entity;\n}\n\nfunction isRenderableAci(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(Math.trunc(value)) >= 1 && Math.abs(Math.trunc(value)) <= 255;\n}\n\nfunction normalizeHeader(header: unknown, version: unknown): Record<string, unknown> {\n const result = header && typeof header === 'object' ? { ...(header as Record<string, unknown>) } : {};\n if (version) result.dwgVersion = version;\n return result;\n}\n\nfunction extractLayers(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadLayer> {\n const result: Record<string, CadLayer> = {};\n const candidates: unknown[] = [];\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n for (const key of ['LAYER', 'layer', 'layers']) {\n const value = rawDb[key] ?? tables?.[key];\n if (value) candidates.push(value);\n }\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.layerName ?? record.entryName);\n if (!name) continue;\n const colorIndex = numberOrUndefined(record.colorIndex ?? record.colorNumber);\n const rawRgb = numberOrUndefined(record.trueColor ?? record.true_color ?? record.truecolor ?? record.colorRGB ?? record.colorRgb ?? record.rgbColor ?? record.rgb);\n const convertedRgb = numberOrUndefined(record.color);\n const useIndexedColor = isRenderableAci(colorIndex);\n const trueColor = rawRgb ?? (!useIndexedColor && convertedRgb !== undefined && convertedRgb >= 0 && convertedRgb <= 0xffffff ? convertedRgb : undefined);\n const layer: CadLayer = {\n name,\n color: useIndexedColor ? undefined : (record.color ?? record.colorName) as CadLayer['color'],\n colorIndex: colorIndex ?? (convertedRgb !== undefined && Math.abs(convertedRgb) <= 257 ? convertedRgb : undefined),\n trueColor,\n lineType: stringOrUndefined(record.lineType ?? record.linetype),\n lineweight: numberOrUndefined(record.lineweight ?? record.lineWeight),\n isVisible: record.isVisible === false || record.off === true || Number(colorIndex ?? record.color ?? 1) < 0 ? false : true,\n isFrozen: Boolean(record.isFrozen ?? record.frozen),\n isLocked: Boolean(record.isLocked ?? record.locked),\n raw: options.keepRaw ? record : undefined\n };\n addLayer(result, layer);\n }\n }\n return result;\n}\n\nfunction extractBlocks(rawDb: Record<string, unknown>, options: { keepRaw?: boolean }): Record<string, CadBlock> {\n const result: Record<string, CadBlock> = {};\n const candidates: unknown[] = [rawDb.blocks, rawDb.blockHeaders, rawDb.block_records, rawDb.blockRecords];\n const tables = rawDb.tables as Record<string, unknown> | undefined;\n candidates.push(tables?.BLOCK, tables?.BLOCK_RECORD, tables?.blocks);\n const normalizeOptions = { keepRaw: Boolean(options.keepRaw), includeUnknownProperties: Boolean(options.keepRaw) };\n for (const candidate of candidates) {\n for (const item of expandCandidate(candidate)) {\n const record = item as Record<string, unknown>;\n const name = stringOrUndefined(record.name ?? record.blockName ?? record.name2);\n if (!name) continue;\n const rawEntities = Array.isArray(record.entities) ? record.entities : Array.isArray(record.ownedObjects) ? record.ownedObjects : [];\n const entities: CadEntity[] = rawEntities\n .filter((entry): entry is Record<string, unknown> => !!entry && typeof entry === 'object')\n .map((entry) => normalizeDwgEntity(entry, normalizeOptions));\n addBlock(result, {\n name,\n basePoint: pointFromUnknown(record.basePoint ?? record.origin) ?? { x: 0, y: 0 },\n entities,\n raw: options.keepRaw ? record : undefined\n });\n }\n }\n return result;\n}\n\nfunction expandCandidate(candidate: unknown): unknown[] {\n if (!candidate) return [];\n if (Array.isArray(candidate)) return candidate;\n if (typeof candidate !== 'object') return [];\n const record = candidate as Record<string, unknown>;\n const directValues = Object.values(record).filter((value) => value && typeof value === 'object');\n const arrays = ['entries', 'records', 'items', 'values', 'layers', 'blocks'].flatMap((key) => Array.isArray(record[key]) ? record[key] as unknown[] : []);\n if (arrays.length > 0) return arrays;\n return directValues;\n}\n\nfunction normalizeWasmPath(wasmPath: string): string {\n const trimmed = wasmPath.trim() || '/wasm';\n if (trimmed === '/') return getRuntimeOrigin();\n const withoutTrailingSlash = trimmed.replace(/\\/+$/, '');\n if (isAbsoluteUrl(withoutTrailingSlash)) return withoutTrailingSlash;\n if (withoutTrailingSlash.startsWith('/')) return `${getRuntimeOrigin()}${withoutTrailingSlash}`;\n return new URL(withoutTrailingSlash, getRuntimeBaseUrl()).href.replace(/\\/+$/, '');\n}\n\nfunction getLibreDwgWasmUrl(wasmPath: string): string {\n return new URL('libredwg-web.wasm', ensureTrailingSlash(wasmPath)).href;\n}\n\nfunction ensureTrailingSlash(value: string): string {\n return value.endsWith('/') ? value : `${value}/`;\n}\n\nfunction isAbsoluteUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:/i.test(value);\n}\n\nfunction getRuntimeBaseUrl(): string {\n if (typeof document !== 'undefined' && document.baseURI) return document.baseURI;\n if (typeof location !== 'undefined' && location.href) return location.href;\n return 'http://localhost/';\n}\n\nfunction getRuntimeOrigin(): string {\n if (typeof location !== 'undefined' && location.origin) return location.origin;\n return new URL(getRuntimeBaseUrl()).origin;\n}\n\nasync function fetchWasmBinary(url: string): Promise<Uint8Array> {\n if (typeof fetch !== 'function') {\n throw new Error('fetch() is not available, so the LibreDWG WASM binary cannot be loaded.');\n }\n\n const response = await fetch(url, { credentials: 'same-origin', cache: 'force-cache' });\n if (!response.ok) {\n throw new Error(`WASM asset request failed with HTTP ${response.status} for ${url}.`);\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (!hasWasmMagic(bytes)) {\n const preview = decodeAsciiPreview(bytes);\n const contentType = response.headers.get('content-type') ?? 'unknown content-type';\n throw new Error(`Invalid WASM asset at ${url}. Expected bytes 00 61 73 6d, got ${formatFirstBytes(bytes)} (${contentType}). The server probably returned an HTML fallback page instead of libredwg-web.wasm. Response preview: ${preview}`);\n }\n\n return bytes;\n}\n\nfunction hasWasmMagic(bytes: Uint8Array): boolean {\n return bytes.length >= 4 && bytes[0] === 0x00 && bytes[1] === 0x61 && bytes[2] === 0x73 && bytes[3] === 0x6d;\n}\n\nfunction formatFirstBytes(bytes: Uint8Array): string {\n return Array.from(bytes.slice(0, 4)).map((byte) => byte.toString(16).padStart(2, '0')).join(' ');\n}\n\nfunction decodeAsciiPreview(bytes: Uint8Array): string {\n const text = Array.from(bytes.slice(0, 32))\n .map((byte) => byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : '.')\n .join('');\n return JSON.stringify(text);\n}\n","/// <reference lib=\"webworker\" />\n\nimport { createLibreDwg, parseDwgBytes } from './DwgParser';\nimport type { CadLoadOptions, CadLoadProgress } from '../../core/types';\n\ntype DwgWorkerLoadRequest = {\n type: 'load';\n requestId: number;\n bytes: ArrayBuffer;\n fileName?: string;\n options?: CadLoadOptions;\n};\n\ntype DwgWorkerWarmupRequest = {\n type: 'warmup';\n requestId: number;\n options?: CadLoadOptions;\n};\n\ntype DwgWorkerRequest = DwgWorkerLoadRequest | DwgWorkerWarmupRequest;\n\nconst scope = self as DedicatedWorkerGlobalScope;\n\nscope.postMessage({ type: 'ready' });\n\nscope.onmessage = async (event: MessageEvent<DwgWorkerRequest>) => {\n const request = event.data;\n if (!request) return;\n const started = performance.now();\n const emit = (progress: CadLoadProgress) => {\n scope.postMessage({ type: 'progress', requestId: request.requestId, progress });\n };\n\n try {\n if (request.type === 'warmup') {\n emit({ phase: 'wasm-init', format: 'dwg', message: 'Warming LibreDWG WebAssembly instance…' });\n await createLibreDwg(request.options?.wasmPath ?? '/wasm/');\n scope.postMessage({ type: 'warmup-result', requestId: request.requestId, elapsedMs: performance.now() - started });\n return;\n }\n\n if (request.type !== 'load') return;\n emit({ phase: 'worker-ready', format: 'dwg', message: 'DWG worker received file bytes.', total: request.bytes.byteLength });\n const result = await parseDwgBytes(new Uint8Array(request.bytes), {\n ...request.options,\n sourceName: request.fileName,\n keepRaw: Boolean(request.options?.keepRaw),\n onProgress: emit\n });\n result.document.metadata.loaderMode = 'worker';\n result.elapsedMs = performance.now() - started;\n scope.postMessage({ type: 'result', requestId: request.requestId, result });\n } catch (error) {\n const normalized = normalizeWorkerError(error);\n scope.postMessage({ type: 'error', requestId: request.requestId, error: normalized });\n }\n};\n\nfunction normalizeWorkerError(error: unknown): { name?: string; message: string; stack?: string } {\n if (error instanceof Error) return { name: error.name, message: error.message, stack: error.stack };\n return { message: String(error) };\n}\n"],"names":["createCadDocument","init","inferEntityKind","type","normalizeCadEntity","raw","forcedType","options","entity","stringOrUndefined","numericColorMode","rawColorNumber","numberOrUndefined","explicitAci","explicitTrueColor","rawColorLooksRgb","pointFromUnknown","vertices","normalizePoints","controlPoints","fitPoints","value","record","x","y","zCandidate","z","out","item","p","rec","vertex","bulge","startWidth","endWidth","addLayer","target","layer","addBlock","block","n","exactArrayBuffer","bytes","RELEASES","readDwgVersion","signature","b","release","instances","parseDwgBytes","_a","_b","_c","_d","_e","_f","started","sourceName","version","lib","createLibreDwg","fileContent","fileType","dwg","rawDb","document","normalizeDwgDatabase","elapsedMs","wasmPath","normalizedPath","normalizeWasmPath","promise","module","typed","LibreDwg","wasmUrl","getLibreDwgWasmUrl","wasmBinary","fetchWasmBinary","wasmInstance","filename","ensureTrailingSlash","error","message","instance","layers","extractLayers","blocks","extractBlocks","rawEntities","normalizeOptions","entities","normalizeDwgEntity","normalizeHeader","rgb","isRenderableAci","header","result","candidates","tables","key","candidate","expandCandidate","name","colorIndex","rawRgb","convertedRgb","useIndexedColor","trueColor","entry","directValues","arrays","trimmed","getRuntimeOrigin","withoutTrailingSlash","isAbsoluteUrl","getRuntimeBaseUrl","url","response","hasWasmMagic","preview","decodeAsciiPreview","contentType","formatFirstBytes","byte","text","scope","event","request","emit","progress","normalized","normalizeWorkerError"],"mappings":"AAWO,SAASA,EAAkBC,GAAuE;AACvG,SAAO;AAAA,IACL,QAAQA,EAAK;AAAA,IACb,YAAYA,EAAK;AAAA,IACjB,OAAOA,EAAK;AAAA,IACZ,QAAQA,EAAK,UAAU,CAAA;AAAA,IACvB,QAAQA,EAAK,UAAU,CAAA;AAAA,IACvB,QAAQA,EAAK,UAAU,CAAA;AAAA,IACvB,UAAUA,EAAK,YAAY,CAAA;AAAA,IAC3B,OAAOA,EAAK;AAAA,IACZ,UAAUA,EAAK,YAAY,CAAA;AAAA,IAC3B,UAAUA,EAAK,YAAY,CAAA;AAAA,IAC3B,KAAKA,EAAK;AAAA,EAAA;AAEd;AAEO,SAASC,EAAgBC,GAA8B;AAE5D,UADc,OAAOA,KAAQ,EAAE,EAAE,YAAA,GACzB;AAAA,IACN,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAe,aAAO;AAAA,IAC3B,KAAK;AAAW,aAAO;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAa,aAAO;AAAA,IACzB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAa,aAAO;AAAA,IACzB,KAAK;AAAY,aAAO;AAAA,IACxB;AAAS,aAAO;AAAA,EAAA;AAEpB;AAEO,SAASC,EAAmBC,GAA8BC,GAAqBC,IAAqC,CAAA,GAAe;AACxI,QAAMJ,IAAOG,KAAc,OAAOD,EAAI,QAAQA,EAAI,cAAcA,EAAI,cAAc,SAAS,EAAE,YAAA,GACvFG,IAAoBD,EAAQ,6BAA6B,KAC3D,EAAE,MAAAJ,GAAM,MAAMD,EAAgBC,CAAI,EAAA,IAClC,EAAE,GAAGE,GAAK,MAAAF,GAAM,MAAMD,EAAgBC,CAAI,EAAA;AAC9C,EAAII,EAAQ,YAASC,EAAO,MAAMH,IAClCG,EAAO,SAASC,EAAkBJ,EAAI,UAAUA,EAAI,EAAE,GACtDG,EAAO,QAAQC,EAAkBJ,EAAI,SAASA,EAAI,SAAS,GAC3DG,EAAO,WAAWC,EAAkBJ,EAAI,YAAYA,EAAI,QAAQ;AAEhE,QAAMK,IAAmBH,EAAQ,oBAAoB,QAC/CI,IAAiBC,EAAkBP,EAAI,KAAK,GAC5CQ,IAAcD,EAAkBP,EAAI,cAAcA,EAAI,eAAeA,EAAI,OAAOA,EAAI,YAAYA,EAAI,WAAW;AACrH,EAAAG,EAAO,aAAaK,MAAgBH,MAAqB,SAASC,MAAmB,UAAa,KAAK,IAAIA,CAAc,KAAK,MAAMA,IAAiB;AAErJ,QAAMG,IAAoBT,EAAI,aAAaA,EAAI,cAAcA,EAAI,aAAaA,EAAI,YAAYA,EAAI,YAAYA,EAAI,YAAYA,EAAI,KAC5HU,IAAmBJ,MAAmB,UAAaA,KAAkB,KAAKA,KAAkB,aAAaD,MAAqB,SAAUA,MAAqB,UAAU,KAAK,IAAIC,CAAc,IAAI;AACxM,EAAAH,EAAO,YAAaM,MAAsBC,IAAmBJ,IAAiB,UAC1E,OAAON,EAAI,SAAU,YAAY,OAAOA,EAAI,SAAU,cAAUG,EAAO,QAAQH,EAAI,QACvFG,EAAO,cAAcI,EAAkBP,EAAI,WAAW,KAAKG,EAAO,aAClEA,EAAO,YAAYC,EAAkBJ,EAAI,aAAaA,EAAI,UAAU,KAAKG,EAAO,WAChFA,EAAO,YAAaH,EAAI,aAAaA,EAAI,YACzCG,EAAO,iBAAiBI,EAAkBP,EAAI,kBAAkBA,EAAI,oBAAoBA,EAAI,eAAe,KAAKG,EAAO,gBACvHA,EAAO,UAAUI,EAAkBP,EAAI,WAAWA,EAAI,KAAK,KAAKG,EAAO,SACvEA,EAAO,aAAaI,EAAkBP,EAAI,cAAcA,EAAI,UAAU,GACtEG,EAAO,YAAY,EAAAH,EAAI,cAAc,MAASA,EAAI,YAAY,KAC9DG,EAAO,aAAaQ,EAAiBX,EAAI,cAAcA,EAAI,SAASA,EAAI,MAAMA,EAAI,IAAI,KAAKG,EAAO,YAClGA,EAAO,WAAWQ,EAAiBX,EAAI,YAAYA,EAAI,OAAOA,EAAI,MAAMA,EAAI,EAAE,KAAKG,EAAO,UAC1FA,EAAO,SAASQ,EAAiBX,EAAI,UAAUA,EAAI,WAAW,KAAKG,EAAO,QAC1EA,EAAO,iBAAiBQ,EAAiBX,EAAI,kBAAkBA,EAAI,YAAYA,EAAI,YAAYA,EAAI,SAASA,EAAI,SAAS,KAAKG,EAAO,gBACrIA,EAAO,SAASI,EAAkBP,EAAI,MAAM,KAAKG,EAAO,QACxDA,EAAO,aAAaI,EAAkBP,EAAI,cAAcA,EAAI,WAAW,KAAKG,EAAO,YACnFA,EAAO,WAAWI,EAAkBP,EAAI,YAAYA,EAAI,SAAS,KAAKG,EAAO,UAC7EA,EAAO,oBAAoBQ,EAAiBX,EAAI,qBAAqBA,EAAI,aAAaA,EAAI,KAAK,KAAKG,EAAO,mBAC3GA,EAAO,YAAYI,EAAkBP,EAAI,aAAaA,EAAI,KAAK,KAAKG,EAAO,WAC3EA,EAAO,SAASI,EAAkBP,EAAI,UAAUA,EAAI,UAAU,KAAKG,EAAO,QAC1EA,EAAO,aAAaI,EAAkBP,EAAI,cAAcA,EAAI,MAAM,KAAKG,EAAO,YAC9EA,EAAO,WAAWI,EAAkBP,EAAI,YAAYA,EAAI,KAAK,KAAKG,EAAO,UACzEA,EAAO,OAAOC,EAAkBJ,EAAI,QAAQA,EAAI,SAASA,EAAI,UAAUA,EAAI,QAAQ,KAAKG,EAAO,MAC/FA,EAAO,OAAOC,EAAkBJ,EAAI,QAAQA,EAAI,SAAS,KAAKG,EAAO,MACrEA,EAAO,YAAYC,EAAkBJ,EAAI,aAAaA,EAAI,IAAI,KAAKG,EAAO;AAE1E,QAAMS,IAAWC,EAAgBb,EAAI,YAAYA,EAAI,MAAM;AAC3D,EAAIY,EAAS,SAAS,MAAGT,EAAO,WAAWS;AAC3C,QAAME,IAAgBD,EAAgBb,EAAI,iBAAiBA,EAAI,cAAc;AAC7E,EAAIc,EAAc,SAAS,MAAGX,EAAO,gBAAgBW;AACrD,QAAMC,IAAYF,EAAgBb,EAAI,aAAaA,EAAI,UAAU;AACjE,SAAIe,EAAU,SAAS,MAAGZ,EAAO,YAAYY,IACtCZ;AACT;AAEO,SAASQ,EAAiBK,GAAwC;AACvE,MAAI,CAACA,KAAS,OAAOA,KAAU,SAAU;AACzC,QAAMC,IAASD,GACTE,IAAI,OAAOD,EAAO,KAAKA,EAAO,KAAKA,EAAO,CAAC,CAAC,GAC5CE,IAAI,OAAOF,EAAO,KAAKA,EAAO,KAAKA,EAAO,CAAC,CAAC,GAC5CG,IAAaH,EAAO,KAAKA,EAAO,KAAKA,EAAO,CAAC,GAC7CI,IAAID,MAAe,SAAY,SAAY,OAAOA,CAAU;AAClE,MAAI,GAAC,OAAO,SAASF,CAAC,KAAK,CAAC,OAAO,SAASC,CAAC;AAC7C,WAAO,OAAO,SAASE,CAAC,IAAI,EAAE,GAAAH,GAAG,GAAAC,GAAG,GAAAE,EAAA,IAAM,EAAE,GAAAH,GAAG,GAAAC,EAAA;AACjD;AAEO,SAASN,EAAgBG,GAAgG;AAC9H,MAAI,CAAC,MAAM,QAAQA,CAAK,UAAU,CAAA;AAClC,QAAMM,IAAsF,CAAA;AAC5F,aAAWC,KAAQP,GAAO;AACxB,UAAMQ,IAAIb,EAAiBY,CAAI;AAC/B,QAAI,CAACC,EAAG;AACR,UAAMC,IAAMF,GACNG,IAASF,GACTG,IAAQpB,EAAkBkB,EAAI,KAAK;AACzC,IAAIE,MAAU,WAAWD,EAAO,QAAQC;AACxC,UAAMC,IAAarB,EAAkBkB,EAAI,cAAcA,EAAI,WAAW;AACtE,IAAIG,MAAe,WAAWF,EAAO,aAAaE;AAClD,UAAMC,IAAWtB,EAAkBkB,EAAI,YAAYA,EAAI,SAAS;AAChE,IAAII,MAAa,WAAWH,EAAO,WAAWG,IAC9CP,EAAI,KAAKI,CAAM;AAAA,EACjB;AACA,SAAOJ;AACT;AAoBO,SAASQ,EAASC,GAAkCC,GAAuB;AAChF,EAAKA,EAAM,SACXD,EAAOC,EAAM,IAAI,IAAIA,GACrBD,EAAOC,EAAM,KAAK,YAAA,CAAa,IAAIA;AACrC;AAEO,SAASC,EAASF,GAAkCG,GAAuB;AAChF,EAAKA,EAAM,SACXH,EAAOG,EAAM,IAAI,IAAIA,GACrBH,EAAOG,EAAM,KAAK,YAAA,CAAa,IAAIA;AACrC;AAOO,SAAS3B,EAAkBS,GAAoC;AACpE,QAAMmB,IAAI,OAAOnB,CAAK;AACtB,SAAO,OAAO,SAASmB,CAAC,IAAIA,IAAI;AAClC;AAEO,SAAS/B,EAAkBY,GAAoC;AACpE,MAAI,OAAOA,KAAU,YAAY,OAAOA,KAAU,SAAU;AAC5D,QAAMM,IAAM,OAAON,CAAK;AACxB,SAAOM,EAAI,SAAS,IAAIA,IAAM;AAChC;ACrLO,SAASc,EAAiBC,GAAgC;AAC/D,SAAIA,EAAM,eAAe,KAAKA,EAAM,eAAeA,EAAM,OAAO,aAAmBA,EAAM,SAClFA,EAAM,QAAQ;AACvB;ACHA,MAAMC,IAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAASC,EAAeF,GAAmC;AAChE,QAAMG,IAAY,MAAM,KAAKH,EAAM,MAAM,GAAG,CAAC,GAAG,CAACI,MAAM,OAAO,aAAaA,CAAC,CAAC,EAAE,KAAK,EAAE,GAChFC,IAAUJ,EAASE,CAAS,KAAK;AACvC,SAAO;AAAA,IACL,WAAAA;AAAA,IACA,SAAAE;AAAA,IACA,2BAA2BA,MAAY;AAAA,IACvC,OAAOA,MAAY,YAAY,0CAA0C;AAAA,EAAA;AAE7E;ACXA,MAAMC,wBAAgB,IAAA;AAEtB,eAAsBC,EAAcP,GAAmBnC,IAAgC,IAA4B;AHV5G,MAAA2C,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC;AGWL,QAAMC,IAAU,YAAY,IAAA,GACtBC,IAAalD,EAAQ;AAC3B,GAAA2C,IAAA3C,EAAQ,eAAR,QAAA2C,EAAA,KAAA3C,GAAqB,EAAE,OAAO,UAAU,QAAQ,OAAO,SAAS,0BAA0B,OAAOmC,EAAM,WAAA;AAEvG,QAAMgB,IAAUd,EAAeF,CAAK;AACpC,MAAI,CAACgB,EAAQ,UAAU,WAAW,IAAI;AACpC,UAAM,IAAI,MAAM,uBAAuB,KAAK,UAAUA,EAAQ,SAAS,CAAC,GAAG;AAG7E,GAAAP,IAAA5C,EAAQ,eAAR,QAAA4C,EAAA,KAAA5C,GAAqB,EAAE,OAAO,aAAa,QAAQ,OAAO,SAAS,sCAAsC,OAAOmC,EAAM,WAAA;AACtH,QAAMiB,IAAM,MAAMC,EAAerD,EAAQ,YAAY,QAAQ;AAE7D,GAAA6C,IAAA7C,EAAQ,eAAR,QAAA6C,EAAA,KAAA7C,GAAqB,EAAE,OAAO,SAAS,QAAQ,OAAO,SAAS,YAAYmD,EAAQ,SAAS,SAAS,OAAOhB,EAAM,YAAY,SAAS;AACvI,QAAMmB,IAAcpB,EAAiBC,CAAK,GACpCoB,MAAWT,IAAAM,EAAI,kBAAJ,gBAAAN,EAAmB,QAAO,GACrCU,IAAMJ,EAAI,SAAS,cAAcE,GAAaC,CAAQ;AAC5D,MAAI,CAACC,EAAK,OAAM,IAAI,MAAM,wCAAwC;AAClE,MAAI,OAAOA,EAAI,SAAU,YAAYA,EAAI,UAAU,EAAG,OAAM,IAAI,MAAM,8BAA8BA,EAAI,KAAK,GAAG;AAEhH,GAAAT,IAAA/C,EAAQ,eAAR,QAAA+C,EAAA,KAAA/C,GAAqB,EAAE,OAAO,aAAa,QAAQ,OAAO,SAAS,6BAA6B,OAAOmC,EAAM,YAAY,SAAS;AAClI,QAAMsB,IAAQ,OAAOL,EAAI,SAAS,WAAY,aAAaA,EAAI,SAAS,QAAQI,CAAG,IAAIA;AACvF,MAAI;AACF,IAAI,OAAOJ,EAAI,SAAS,YAAa,cAAYA,EAAI,SAAS,SAASI,CAAG;AAAA,EAC5E,QAAQ;AAAA,EAER;AAEA,QAAME,IAAWC,EAAqBF,GAAOP,GAAYC,GAAS,EAAE,SAAS,EAAQnD,EAAQ,QAAO,CAAG,GACjG4D,IAAY,YAAY,IAAA,IAAQX;AACtC,UAAAD,IAAAhD,EAAQ,eAAR,QAAAgD,EAAA,KAAAhD,GAAqB,EAAE,OAAO,QAAQ,QAAQ,OAAO,SAAS,eAAe,OAAOmC,EAAM,YAAY,SAAS,KAAK,WAAAyB,MAC7G;AAAA,IACL,UAAAF;AAAAA,IACA,KAAK1D,EAAQ,UAAUyD,IAAQ;AAAA,IAC/B,OAAOtB,EAAM;AAAA,IACb,WAAAyB;AAAA,IACA,QAAQ;AAAA,IACR,UAAUF,EAAS;AAAA,EAAA;AAEvB;AAEA,eAAsBL,EAAeQ,IAAW,UAAsG;AACpJ,QAAMC,IAAiBC,EAAkBF,CAAQ;AACjD,MAAIG,IAAUvB,EAAU,IAAIqB,CAAc;AAC1C,EAAKE,MACHA,IAAU,OAAO,qBAAyB,EAAE,KAAK,OAAOC,MAAW;AACjE,UAAMC,IAAQD,GACRE,IAAWD,EAAM;AACvB,QAAI,CAACC,KAAY,OAAOA,EAAS,UAAW;AAC1C,YAAM,IAAI,MAAM,2DAA2D;AAG7E,QAAI;AAMF,UAAI,OAAOD,EAAM,gBAAiB,cAAc,OAAOC,EAAS,wBAAyB,YAAY;AACnG,cAAMC,IAAUC,EAAmBP,CAAc,GAC3CQ,IAAa,MAAMC,EAAgBH,CAAO,GAC1CI,IAAe,MAAMN,EAAM,aAAa;AAAA,UAC5C,YAAAI;AAAA,UACA,YAAY,CAACG,MAAqB,IAAI,IAAIA,GAAUC,EAAoBZ,CAAc,CAAC,EAAE;AAAA,QAAA,CAC1F;AACD,eAAOK,EAAS,qBAAqBK,CAAY;AAAA,MACnD;AAMA,aAAO,MAAML,EAAS,OAAOL,CAAc;AAAA,IAC7C,SAASa,GAAO;AACd,YAAMC,IAAUD,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AACrE,YAAM,IAAI,MAAM,kDAAkDb,CAAc,6CAA6CO,EAAmBP,CAAc,CAAC,kIAAkIc,CAAO,EAAE;AAAA,IAC5S;AAAA,EACF,CAAC,GACDnC,EAAU,IAAIqB,GAAgBE,CAAO;AAEvC,QAAMa,IAAW,MAAMb,GACjBC,IAAS,MAAM,OAAO,qBAAyB;AACrD,SAAO,EAAE,QAAAA,GAAQ,UAAAY,GAAU,eAAeZ,EAAO,cAAA;AACnD;AAEO,SAASN,EAAqBF,GAAgBP,GAAqBC,GAAmBnD,IAAiC,CAAA,GAAiB;AAC7I,QAAMe,IAAS0C,KAAS,OAAOA,KAAU,WAAWA,IAAmC,CAAA,GACjFqB,IAASC,EAAchE,GAAQf,CAAO,GACtCgF,IAASC,EAAclE,GAAQf,CAAO,GACtCkF,IAAc,MAAM,QAAQnE,EAAO,QAAQ,IAAIA,EAAO,WAAW,CAAA,GACjEoE,IAAmB,EAAE,SAAS,EAAQnF,EAAQ,SAAU,0BAA0B,EAAQA,EAAQ,QAAO,GACzGoF,IAAWF,EACd,OAAO,CAAC7D,MAA0C,CAAC,CAACA,KAAQ,OAAOA,KAAS,QAAQ,EACpF,IAAI,CAACA,MAASgE,EAAmBhE,GAAM8D,CAAgB,CAAC,GAErDzB,IAAWjE,EAAkB;AAAA,IACjC,QAAQ;AAAA,IACR,YAAAyD;AAAA,IACA,QAAQoC,EAAgBvE,EAAO,QAAQoC,CAAO;AAAA,IAC9C,QAAA2B;AAAA,IACA,QAAAE;AAAA,IACA,UAAAI;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,SAAAjC;AAAA,IAAA;AAAA,IAEF,UAAU,CAAA;AAAA,IACV,KAAKnD,EAAQ,UAAUyD,IAAQ;AAAA,EAAA,CAChC;AAED,SAAI2B,EAAS,WAAW,KACtB1B,EAAS,SAAS,KAAK,mJAAmJ,GAErKA;AACT;AAGA,SAAS2B,EAAmBtE,GAAiCf,GAA+E;AAC1I,QAAMC,IAASJ,EAAmBkB,GAAQ,QAAW,EAAE,GAAGf,GAAS,kBAAkB,OAAO,GACtFuF,IAAMlF,EAAkBU,EAAO,KAAK;AAM1C,SAAIwE,MAAQ,UAAaA,KAAO,KAAKA,KAAO,aAC1CtF,EAAO,QAAQsF,GACftF,EAAO,YAAYsF,IAErBtF,EAAO,aAAaI,EAAkBU,EAAO,cAAcA,EAAO,eAAeA,EAAO,GAAG,KAAKd,EAAO,YACvGA,EAAO,YAAYC,EAAkBa,EAAO,aAAaA,EAAO,UAAU,KAAKd,EAAO,WAC/EA;AACT;AAEA,SAASuF,EAAgB1E,GAAiC;AACxD,SAAO,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,KAAK,KAAK,IAAI,KAAK,MAAMA,CAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,MAAMA,CAAK,CAAC,KAAK;AACnI;AAEA,SAASwE,EAAgBG,GAAiBtC,GAA2C;AACnF,QAAMuC,IAASD,KAAU,OAAOA,KAAW,WAAW,EAAE,GAAIA,EAAA,IAAuC,CAAA;AACnG,SAAItC,QAAgB,aAAaA,IAC1BuC;AACT;AAEA,SAASX,EAActB,GAAgCzD,GAA0D;AAC/G,QAAM0F,IAAmC,CAAA,GACnCC,IAAwB,CAAA,GACxBC,IAASnC,EAAM;AACrB,aAAWoC,KAAO,CAAC,SAAS,SAAS,QAAQ,GAAG;AAC9C,UAAM/E,IAAQ2C,EAAMoC,CAAG,MAAKD,KAAA,gBAAAA,EAASC;AACrC,IAAI/E,KAAO6E,EAAW,KAAK7E,CAAK;AAAA,EAClC;AACA,aAAWgF,KAAaH;AACtB,eAAWtE,KAAQ0E,EAAgBD,CAAS,GAAG;AAC7C,YAAM/E,IAASM,GACT2E,IAAO9F,EAAkBa,EAAO,QAAQA,EAAO,aAAaA,EAAO,SAAS;AAClF,UAAI,CAACiF,EAAM;AACX,YAAMC,IAAa5F,EAAkBU,EAAO,cAAcA,EAAO,WAAW,GACtEmF,IAAS7F,EAAkBU,EAAO,aAAaA,EAAO,cAAcA,EAAO,aAAaA,EAAO,YAAYA,EAAO,YAAYA,EAAO,YAAYA,EAAO,GAAG,GAC3JoF,IAAe9F,EAAkBU,EAAO,KAAK,GAC7CqF,IAAkBZ,EAAgBS,CAAU,GAC5CI,IAAYH,MAAW,CAACE,KAAmBD,MAAiB,UAAaA,KAAgB,KAAKA,KAAgB,WAAWA,IAAe,SACxIrE,IAAkB;AAAA,QACtB,MAAAkE;AAAA,QACA,OAAOI,IAAkB,SAAarF,EAAO,SAASA,EAAO;AAAA,QAC7D,YAAYkF,MAAeE,MAAiB,UAAa,KAAK,IAAIA,CAAY,KAAK,MAAMA,IAAe;AAAA,QACxG,WAAAE;AAAA,QACA,UAAUnG,EAAkBa,EAAO,YAAYA,EAAO,QAAQ;AAAA,QAC9D,YAAYV,EAAkBU,EAAO,cAAcA,EAAO,UAAU;AAAA,QACpE,WAAW,EAAAA,EAAO,cAAc,MAASA,EAAO,QAAQ,MAAQ,OAAOkF,KAAclF,EAAO,SAAS,CAAC,IAAI;AAAA,QAC1G,UAAU,GAAQA,EAAO,YAAYA,EAAO;AAAA,QAC5C,UAAU,GAAQA,EAAO,YAAYA,EAAO;AAAA,QAC5C,KAAKf,EAAQ,UAAUe,IAAS;AAAA,MAAA;AAElC,MAAAa,EAAS8D,GAAQ5D,CAAK;AAAA,IACxB;AAEF,SAAO4D;AACT;AAEA,SAAST,EAAcxB,GAAgCzD,GAA0D;AAC/G,QAAM0F,IAAmC,CAAA,GACnCC,IAAwB,CAAClC,EAAM,QAAQA,EAAM,cAAcA,EAAM,eAAeA,EAAM,YAAY,GAClGmC,IAASnC,EAAM;AACrB,EAAAkC,EAAW,KAAKC,KAAA,gBAAAA,EAAQ,OAAOA,KAAA,gBAAAA,EAAQ,cAAcA,KAAA,gBAAAA,EAAQ,MAAM;AACnE,QAAMT,IAAmB,EAAE,SAAS,EAAQnF,EAAQ,SAAU,0BAA0B,EAAQA,EAAQ,QAAO;AAC/G,aAAW8F,KAAaH;AACtB,eAAWtE,KAAQ0E,EAAgBD,CAAS,GAAG;AAC7C,YAAM/E,IAASM,GACT2E,IAAO9F,EAAkBa,EAAO,QAAQA,EAAO,aAAaA,EAAO,KAAK;AAC9E,UAAI,CAACiF,EAAM;AAEX,YAAMZ,KADc,MAAM,QAAQrE,EAAO,QAAQ,IAAIA,EAAO,WAAW,MAAM,QAAQA,EAAO,YAAY,IAAIA,EAAO,eAAe,CAAA,GAE/H,OAAO,CAACuF,MAA4C,CAAC,CAACA,KAAS,OAAOA,KAAU,QAAQ,EACxF,IAAI,CAACA,MAAUjB,EAAmBiB,GAAOnB,CAAgB,CAAC;AAC7D,MAAApD,EAAS2D,GAAQ;AAAA,QACf,MAAAM;AAAA,QACA,WAAWvF,EAAiBM,EAAO,aAAaA,EAAO,MAAM,KAAK,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,QAC7E,UAAAqE;AAAA,QACA,KAAKpF,EAAQ,UAAUe,IAAS;AAAA,MAAA,CACjC;AAAA,IACH;AAEF,SAAO2E;AACT;AAEA,SAASK,EAAgBD,GAA+B;AACtD,MAAI,CAACA,EAAW,QAAO,CAAA;AACvB,MAAI,MAAM,QAAQA,CAAS,EAAG,QAAOA;AACrC,MAAI,OAAOA,KAAc,SAAU,QAAO,CAAA;AAC1C,QAAM/E,IAAS+E,GACTS,IAAe,OAAO,OAAOxF,CAAM,EAAE,OAAO,CAACD,MAAUA,KAAS,OAAOA,KAAU,QAAQ,GACzF0F,IAAS,CAAC,WAAW,WAAW,SAAS,UAAU,UAAU,QAAQ,EAAE,QAAQ,CAACX,MAAQ,MAAM,QAAQ9E,EAAO8E,CAAG,CAAC,IAAI9E,EAAO8E,CAAG,IAAiB,EAAE;AACxJ,SAAIW,EAAO,SAAS,IAAUA,IACvBD;AACT;AAEA,SAASxC,EAAkBF,GAA0B;AACnD,QAAM4C,IAAU5C,EAAS,KAAA,KAAU;AACnC,MAAI4C,MAAY,IAAK,QAAOC,EAAA;AAC5B,QAAMC,IAAuBF,EAAQ,QAAQ,QAAQ,EAAE;AACvD,SAAIG,EAAcD,CAAoB,IAAUA,IAC5CA,EAAqB,WAAW,GAAG,IAAU,GAAGD,EAAA,CAAkB,GAAGC,CAAoB,KACtF,IAAI,IAAIA,GAAsBE,EAAA,CAAmB,EAAE,KAAK,QAAQ,QAAQ,EAAE;AACnF;AAEA,SAASxC,EAAmBR,GAA0B;AACpD,SAAO,IAAI,IAAI,qBAAqBa,EAAoBb,CAAQ,CAAC,EAAE;AACrE;AAEA,SAASa,EAAoB5D,GAAuB;AAClD,SAAOA,EAAM,SAAS,GAAG,IAAIA,IAAQ,GAAGA,CAAK;AAC/C;AAEA,SAAS8F,EAAc9F,GAAwB;AAC7C,SAAO,uBAAuB,KAAKA,CAAK;AAC1C;AAEA,SAAS+F,IAA4B;AACnC,SAAI,OAAO,WAAa,OAAe,SAAS,UAAgB,SAAS,UACrE,OAAO,WAAa,OAAe,SAAS,OAAa,SAAS,OAC/D;AACT;AAEA,SAASH,IAA2B;AAClC,SAAI,OAAO,WAAa,OAAe,SAAS,SAAe,SAAS,SACjE,IAAI,IAAIG,EAAA,CAAmB,EAAE;AACtC;AAEA,eAAetC,EAAgBuC,GAAkC;AAC/D,MAAI,OAAO,SAAU;AACnB,UAAM,IAAI,MAAM,yEAAyE;AAG3F,QAAMC,IAAW,MAAM,MAAMD,GAAK,EAAE,aAAa,eAAe,OAAO,eAAe;AACtF,MAAI,CAACC,EAAS;AACZ,UAAM,IAAI,MAAM,uCAAuCA,EAAS,MAAM,QAAQD,CAAG,GAAG;AAGtF,QAAM3E,IAAQ,IAAI,WAAW,MAAM4E,EAAS,aAAa;AACzD,MAAI,CAACC,EAAa7E,CAAK,GAAG;AACxB,UAAM8E,IAAUC,EAAmB/E,CAAK,GAClCgF,IAAcJ,EAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,UAAM,IAAI,MAAM,yBAAyBD,CAAG,qCAAqCM,EAAiBjF,CAAK,CAAC,KAAKgF,CAAW,yGAAyGF,CAAO,EAAE;AAAA,EAC5O;AAEA,SAAO9E;AACT;AAEA,SAAS6E,EAAa7E,GAA4B;AAChD,SAAOA,EAAM,UAAU,KAAKA,EAAM,CAAC,MAAM,KAAQA,EAAM,CAAC,MAAM,MAAQA,EAAM,CAAC,MAAM,OAAQA,EAAM,CAAC,MAAM;AAC1G;AAEA,SAASiF,EAAiBjF,GAA2B;AACnD,SAAO,MAAM,KAAKA,EAAM,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAACkF,MAASA,EAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG;AACjG;AAEA,SAASH,EAAmB/E,GAA2B;AACrD,QAAMmF,IAAO,MAAM,KAAKnF,EAAM,MAAM,GAAG,EAAE,CAAC,EACvC,IAAI,CAACkF,MAASA,KAAQ,MAAMA,KAAQ,MAAM,OAAO,aAAaA,CAAI,IAAI,GAAG,EACzE,KAAK,EAAE;AACV,SAAO,KAAK,UAAUC,CAAI;AAC5B;AC3RA,MAAMC,IAAQ;AAEdA,EAAM,YAAY,EAAE,MAAM,SAAS;AAEnCA,EAAM,YAAY,OAAOC,MAA0C;AJd5D,MAAA7E,GAAAC;AIeL,QAAM6E,IAAUD,EAAM;AACtB,MAAI,CAACC,EAAS;AACd,QAAMxE,IAAU,YAAY,IAAA,GACtByE,IAAO,CAACC,MAA8B;AAC1C,IAAAJ,EAAM,YAAY,EAAE,MAAM,YAAY,WAAWE,EAAQ,WAAW,UAAAE,GAAU;AAAA,EAChF;AAEA,MAAI;AACF,QAAIF,EAAQ,SAAS,UAAU;AAC7B,MAAAC,EAAK,EAAE,OAAO,aAAa,QAAQ,OAAO,SAAS,0CAA0C,GAC7F,MAAMrE,IAAeV,IAAA8E,EAAQ,YAAR,gBAAA9E,EAAiB,aAAY,QAAQ,GAC1D4E,EAAM,YAAY,EAAE,MAAM,iBAAiB,WAAWE,EAAQ,WAAW,WAAW,YAAY,IAAA,IAAQxE,EAAA,CAAS;AACjH;AAAA,IACF;AAEA,QAAIwE,EAAQ,SAAS,OAAQ;AAC7B,IAAAC,EAAK,EAAE,OAAO,gBAAgB,QAAQ,OAAO,SAAS,mCAAmC,OAAOD,EAAQ,MAAM,WAAA,CAAY;AAC1H,UAAM/B,IAAS,MAAMhD,EAAc,IAAI,WAAW+E,EAAQ,KAAK,GAAG;AAAA,MAChE,GAAGA,EAAQ;AAAA,MACX,YAAYA,EAAQ;AAAA,MACpB,SAAS,IAAQ7E,IAAA6E,EAAQ,YAAR,QAAA7E,EAAiB;AAAA,MAClC,YAAY8E;AAAA,IAAA,CACb;AACD,IAAAhC,EAAO,SAAS,SAAS,aAAa,UACtCA,EAAO,YAAY,YAAY,IAAA,IAAQzC,GACvCsE,EAAM,YAAY,EAAE,MAAM,UAAU,WAAWE,EAAQ,WAAW,QAAA/B,GAAQ;AAAA,EAC5E,SAASf,GAAO;AACd,UAAMiD,IAAaC,EAAqBlD,CAAK;AAC7C,IAAA4C,EAAM,YAAY,EAAE,MAAM,SAAS,WAAWE,EAAQ,WAAW,OAAOG,GAAY;AAAA,EACtF;AACF;AAEA,SAASC,EAAqBlD,GAAoE;AAChG,SAAIA,aAAiB,QAAc,EAAE,MAAMA,EAAM,MAAM,SAASA,EAAM,SAAS,OAAOA,EAAM,MAAA,IACrF,EAAE,SAAS,OAAOA,CAAK,EAAA;AAChC;"}