aurochs 0.6.1 → 0.6.2
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/dist/cli.js
CHANGED
|
@@ -122645,62 +122645,17 @@ function isJpeg(data) {
|
|
|
122645
122645
|
}
|
|
122646
122646
|
return data[0] === 255 && data[1] === 216 && data[2] === 255;
|
|
122647
122647
|
}
|
|
122648
|
-
// ../../@aurochs/png/src/encoder.ts
|
|
122648
|
+
// ../../@aurochs/png/src/encoder.node.ts
|
|
122649
|
+
var import_pngjs = __toESM(require_png(), 1);
|
|
122649
122650
|
function encodeRgbaToPngDataUrl(rgbaData, width, height) {
|
|
122650
122651
|
const normalized = normalizeRgbaData(rgbaData, width, height);
|
|
122651
|
-
|
|
122652
|
-
return encodeWithCanvas(normalized, width, height);
|
|
122653
|
-
}
|
|
122654
|
-
if (!canUsePngjsFallback()) {
|
|
122655
|
-
throw new Error("No PNG encoder backend is available (Canvas 2D context or pngjs runtime).");
|
|
122656
|
-
}
|
|
122657
|
-
return encodeWithPngjs(normalized, width, height);
|
|
122658
|
-
}
|
|
122659
|
-
function canUseCanvasEncoding() {
|
|
122660
|
-
if (typeof document === "undefined") {
|
|
122661
|
-
return false;
|
|
122662
|
-
}
|
|
122663
|
-
if (typeof navigator !== "undefined" && /\bjsdom\b/i.test(navigator.userAgent)) {
|
|
122664
|
-
return false;
|
|
122665
|
-
}
|
|
122666
|
-
try {
|
|
122667
|
-
const canvas = document.createElement("canvas");
|
|
122668
|
-
return canvas.getContext("2d") !== null;
|
|
122669
|
-
} catch (error2) {
|
|
122670
|
-
if (error2 instanceof Error) {
|
|
122671
|
-
return false;
|
|
122672
|
-
}
|
|
122673
|
-
return false;
|
|
122674
|
-
}
|
|
122675
|
-
}
|
|
122676
|
-
function canUsePngjsFallback() {
|
|
122677
|
-
return typeof process !== "undefined" && !!process.versions?.node;
|
|
122678
|
-
}
|
|
122679
|
-
function encodeWithCanvas(rgbaData, width, height) {
|
|
122680
|
-
const canvas = document.createElement("canvas");
|
|
122681
|
-
canvas.width = width;
|
|
122682
|
-
canvas.height = height;
|
|
122683
|
-
const ctx = canvas.getContext("2d");
|
|
122684
|
-
if (!ctx) {
|
|
122685
|
-
throw new Error("Failed to get 2D context from canvas");
|
|
122686
|
-
}
|
|
122687
|
-
const buffer = new ArrayBuffer(rgbaData.byteLength);
|
|
122688
|
-
const copied = new Uint8ClampedArray(buffer);
|
|
122689
|
-
copied.set(rgbaData);
|
|
122690
|
-
const imageData = new ImageData(copied, width, height);
|
|
122691
|
-
ctx.putImageData(imageData, 0, 0);
|
|
122692
|
-
return canvas.toDataURL("image/png");
|
|
122693
|
-
}
|
|
122694
|
-
function encodeWithPngjs(rgbaData, width, height) {
|
|
122695
|
-
const pngBytes = encodeWithPngjsToBytes(rgbaData, width, height);
|
|
122652
|
+
const pngBytes = encodeWithPngjs(normalized, width, height);
|
|
122696
122653
|
return toDataUrl(pngBytes.buffer, "image/png");
|
|
122697
122654
|
}
|
|
122698
|
-
function
|
|
122699
|
-
const
|
|
122700
|
-
const { PNG } = pngjs;
|
|
122701
|
-
const png = new PNG({ width, height });
|
|
122655
|
+
function encodeWithPngjs(rgbaData, width, height) {
|
|
122656
|
+
const png = new import_pngjs.PNG({ width, height });
|
|
122702
122657
|
png.data = Buffer.from(rgbaData);
|
|
122703
|
-
const buffer = PNG.sync.write(png);
|
|
122658
|
+
const buffer = import_pngjs.PNG.sync.write(png);
|
|
122704
122659
|
return new Uint8Array(buffer);
|
|
122705
122660
|
}
|
|
122706
122661
|
function normalizeRgbaData(rgbaData, width, height) {
|
|
@@ -123468,7 +123423,7 @@ function createProgram4() {
|
|
|
123468
123423
|
// ../../@aurochs-cli/cli/package.json
|
|
123469
123424
|
var package_default = {
|
|
123470
123425
|
name: "@aurochs-cli/cli",
|
|
123471
|
-
version: "0.6.
|
|
123426
|
+
version: "0.6.2",
|
|
123472
123427
|
type: "module",
|
|
123473
123428
|
bin: {
|
|
123474
123429
|
aurochs: "./dist/cli.js"
|
|
@@ -52,33 +52,7 @@ function isJpeg(data) {
|
|
|
52
52
|
}
|
|
53
53
|
function encodeRgbaToPngDataUrl(rgbaData, width, height) {
|
|
54
54
|
const normalized = normalizeRgbaData(rgbaData, width, height);
|
|
55
|
-
|
|
56
|
-
return encodeWithCanvas(normalized, width, height);
|
|
57
|
-
}
|
|
58
|
-
if (!canUsePngjsFallback()) {
|
|
59
|
-
throw new Error("No PNG encoder backend is available (Canvas 2D context or pngjs runtime).");
|
|
60
|
-
}
|
|
61
|
-
return encodeWithPngjs(normalized, width, height);
|
|
62
|
-
}
|
|
63
|
-
function canUseCanvasEncoding() {
|
|
64
|
-
if (typeof document === "undefined") {
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
if (typeof navigator !== "undefined" && /\bjsdom\b/i.test(navigator.userAgent)) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
const canvas = document.createElement("canvas");
|
|
72
|
-
return canvas.getContext("2d") !== null;
|
|
73
|
-
} catch (error) {
|
|
74
|
-
if (error instanceof Error) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
function canUsePngjsFallback() {
|
|
81
|
-
return typeof process !== "undefined" && !!process.versions?.node;
|
|
55
|
+
return encodeWithCanvas(normalized, width, height);
|
|
82
56
|
}
|
|
83
57
|
function encodeWithCanvas(rgbaData, width, height) {
|
|
84
58
|
const canvas = document.createElement("canvas");
|
|
@@ -95,18 +69,6 @@ function encodeWithCanvas(rgbaData, width, height) {
|
|
|
95
69
|
ctx.putImageData(imageData, 0, 0);
|
|
96
70
|
return canvas.toDataURL("image/png");
|
|
97
71
|
}
|
|
98
|
-
function encodeWithPngjs(rgbaData, width, height) {
|
|
99
|
-
const pngBytes = encodeWithPngjsToBytes(rgbaData, width, height);
|
|
100
|
-
return toDataUrl(pngBytes.buffer, "image/png");
|
|
101
|
-
}
|
|
102
|
-
function encodeWithPngjsToBytes(rgbaData, width, height) {
|
|
103
|
-
const pngjs = require("pngjs");
|
|
104
|
-
const { PNG } = pngjs;
|
|
105
|
-
const png = new PNG({ width, height });
|
|
106
|
-
png.data = Buffer.from(rgbaData);
|
|
107
|
-
const buffer = PNG.sync.write(png);
|
|
108
|
-
return new Uint8Array(buffer);
|
|
109
|
-
}
|
|
110
72
|
function normalizeRgbaData(rgbaData, width, height) {
|
|
111
73
|
const expectedLength = width * height * 4;
|
|
112
74
|
if (rgbaData.length === expectedLength) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../packages/@aurochs-renderer/pdf/src/svg/color-to-svg.ts","../../../../../../packages/@aurochs/jpeg/src/detector.ts","../../../../../../packages/@aurochs/png/src/encoder.ts","../../../../../../packages/@aurochs/png/src/constants.ts","../../../../../../packages/@aurochs/png/src/detector.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/image-data-url.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/number-format.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/path-data.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/xml-escape.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/render-page-svg.ts"],"sourcesContent":["import type { PdfColor } from \"@aurochs/pdf/domain\";\nimport { clamp01, cmykToRgb, grayToRgb, rgbToHex, rgbToRgbBytes } from \"@aurochs/pdf/domain/color\";\n\nexport type SvgPaint = Readonly<{\n readonly color: string;\n readonly opacity: number;\n}>;\n\nfunction colorToHex(color: PdfColor): string {\n switch (color.colorSpace) {\n case \"DeviceGray\": {\n const [gray = 0] = color.components;\n const [r, g, b] = grayToRgb(gray);\n return `#${rgbToHex(r, g, b)}`;\n }\n case \"DeviceRGB\": {\n const [r = 0, g = 0, b = 0] = color.components;\n const rgb = rgbToRgbBytes(r, g, b);\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n case \"DeviceCMYK\": {\n const [c = 0, m = 0, y = 0, k = 0] = color.components;\n const rgb = cmykToRgb({ c, m, y, k });\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n case \"ICCBased\": {\n if (color.alternateColorSpace === \"DeviceGray\") {\n const [gray = 0] = color.components;\n const [r, g, b] = grayToRgb(gray);\n return `#${rgbToHex(r, g, b)}`;\n }\n if (color.alternateColorSpace === \"DeviceCMYK\") {\n const [c = 0, m = 0, y = 0, k = 0] = color.components;\n const rgb = cmykToRgb({ c, m, y, k });\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n const [r = 0, g = 0, b = 0] = color.components;\n const rgb = rgbToRgbBytes(r, g, b);\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n case \"Pattern\":\n return \"#000000\";\n default:\n return \"#000000\";\n }\n}\n\nexport function toSvgPaint(color: PdfColor, alpha: number): SvgPaint {\n return {\n color: colorToHex(color),\n opacity: clamp01(alpha),\n };\n}\n","/**\n * @file JPEG format detection\n *\n * Detects JPEG format by checking the SOI (Start of Image) marker.\n * JPEG files start with FF D8 FF (SOI + APP marker)\n */\n\n/**\n * JPEG SOI Marker (3 bytes minimum for detection)\n * FF D8 = Start of Image\n * FF = Start of next marker (typically APP0/APP1)\n */\nexport const JPEG_SOI_MARKER = new Uint8Array([0xff, 0xd8, 0xff]);\n\n/**\n * Check if data starts with JPEG SOI marker\n *\n * @param data - Binary data to check\n * @returns true if data is JPEG format\n */\nexport function isJpeg(data: Uint8Array): boolean {\n if (data.length < 3) {\n return false;\n }\n return data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff;\n}\n","/**\n * @file PNG Encoder\n *\n * Browser: Canvas API\n * Node.js: pngjs (dynamic require, excluded from browser bundle)\n */\n\nimport { toDataUrl } from \"@aurochs/buffer\";\n\ntype PngJsPngInstance = {\n data: Buffer;\n};\n\ntype PngJsConstructor = {\n new (options: { width: number; height: number }): PngJsPngInstance;\n sync: {\n write: (png: PngJsPngInstance) => Buffer;\n };\n};\n\ntype PngJsModule = {\n PNG: PngJsConstructor;\n};\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * RGBAデータをPNG Data URLにエンコード\n */\nexport function encodeRgbaToPngDataUrl(rgbaData: Uint8ClampedArray, width: number, height: number): string {\n const normalized = normalizeRgbaData(rgbaData, width, height);\n\n if (canUseCanvasEncoding()) {\n return encodeWithCanvas(normalized, width, height);\n }\n\n if (!canUsePngjsFallback()) {\n throw new Error(\"No PNG encoder backend is available (Canvas 2D context or pngjs runtime).\");\n }\n\n return encodeWithPngjs(normalized, width, height);\n}\n\n/**\n * RGBAデータをPNGバイト列にエンコード\n */\nexport function encodeRgbaToPng(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8Array {\n const normalized = normalizeRgbaData(rgbaData, width, height);\n\n if (canUseCanvasEncoding()) {\n return encodeWithCanvasToBytes(normalized, width, height);\n }\n\n if (!canUsePngjsFallback()) {\n throw new Error(\"No PNG encoder backend is available (Canvas 2D context or pngjs runtime).\");\n }\n\n return encodeWithPngjsToBytes(normalized, width, height);\n}\n\nfunction canUseCanvasEncoding(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n if (typeof navigator !== \"undefined\" && /\\bjsdom\\b/i.test(navigator.userAgent)) {\n return false;\n }\n try {\n const canvas = document.createElement(\"canvas\");\n return canvas.getContext(\"2d\") !== null;\n } catch (error) {\n if (error instanceof Error) {\n return false;\n }\n return false;\n }\n}\n\nfunction canUsePngjsFallback(): boolean {\n return (\n typeof process !== \"undefined\"\n && !!process.versions?.node\n );\n}\n\n// =============================================================================\n// Browser: Canvas API\n// =============================================================================\n\nfunction encodeWithCanvas(rgbaData: Uint8ClampedArray, width: number, height: number): string {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2D context from canvas\");\n }\n\n const buffer = new ArrayBuffer(rgbaData.byteLength);\n const copied = new Uint8ClampedArray(buffer);\n copied.set(rgbaData);\n\n const imageData = new ImageData(copied, width, height);\n ctx.putImageData(imageData, 0, 0);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nfunction encodeWithCanvasToBytes(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8Array {\n const dataUrl = encodeWithCanvas(rgbaData, width, height);\n return dataUrlToBytes(dataUrl);\n}\n\nfunction dataUrlToBytes(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1];\n if (!base64) {\n throw new Error(\"Invalid data URL format\");\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// Node.js: pngjs\n// =============================================================================\n\nfunction encodeWithPngjs(rgbaData: Uint8ClampedArray, width: number, height: number): string {\n const pngBytes = encodeWithPngjsToBytes(rgbaData, width, height);\n return toDataUrl(pngBytes.buffer as ArrayBuffer, \"image/png\");\n}\n\nfunction encodeWithPngjsToBytes(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8Array {\n // Dynamic require to exclude pngjs from browser bundle\n // eslint-disable-next-line @typescript-eslint/no-require-imports -- pngjs must be loaded dynamically to exclude from browser bundle\n const pngjs = require(\"pngjs\") as PngJsModule;\n const { PNG } = pngjs;\n\n const png = new PNG({ width, height });\n png.data = Buffer.from(rgbaData);\n\n const buffer = PNG.sync.write(png);\n return new Uint8Array(buffer);\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nfunction normalizeRgbaData(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8ClampedArray {\n const expectedLength = width * height * 4;\n if (rgbaData.length === expectedLength) {\n return rgbaData;\n }\n\n console.warn(\n `[PNG Encoder] Data length mismatch: expected ${expectedLength} bytes for ${width}x${height}, got ${rgbaData.length}`,\n );\n\n const normalized = new Uint8ClampedArray(expectedLength);\n normalized.set(rgbaData.subarray(0, Math.min(rgbaData.length, expectedLength)));\n return normalized;\n}\n","/**\n * @file PNG format constants\n *\n * RFC 2083 Section 3.1\n */\n\n/**\n * PNG Signature (8 bytes)\n */\nexport const PNG_SIGNATURE = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n","/**\n * @file PNG format detection\n *\n * Detects PNG format by checking the 8-byte signature.\n * RFC 2083: PNG file signature is 89 50 4E 47 0D 0A 1A 0A\n */\n\nimport { PNG_SIGNATURE } from \"./constants\";\n\nexport { PNG_SIGNATURE };\n\n/**\n * Check if data starts with PNG signature\n *\n * @param data - Binary data to check\n * @returns true if data is PNG format\n */\nexport function isPng(data: Uint8Array): boolean {\n if (data.length < PNG_SIGNATURE.length) {\n return false;\n }\n for (let i = 0; i < PNG_SIGNATURE.length; i++) {\n if (data[i] !== PNG_SIGNATURE[i]) {\n return false;\n }\n }\n return true;\n}\n","import { toDataUrl } from \"@aurochs/buffer\";\nimport { isJpeg } from \"@aurochs/jpeg\";\nimport { convertToRgba } from \"@aurochs/pdf/image/pixel-converter\";\nimport type { PdfImage } from \"@aurochs/pdf/domain\";\nimport { encodeRgbaToPngDataUrl, isPng } from \"@aurochs/png\";\n\nfunction toExactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction applyAlphaChannel(rgba: Uint8ClampedArray, alpha: Uint8Array | undefined): void {\n if (!alpha) {\n return;\n }\n\n const pixelCount = rgba.length / 4;\n if (alpha.length !== pixelCount) {\n return;\n }\n\n for (let i = 0; i < pixelCount; i += 1) {\n rgba[i * 4 + 3] = alpha[i] ?? 255;\n }\n}\n\nfunction encodeRawImageToDataUrl(image: PdfImage): string {\n const rgba = convertToRgba(\n image.data,\n image.width,\n image.height,\n image.colorSpace,\n image.bitsPerComponent,\n { decode: image.decode },\n );\n applyAlphaChannel(rgba, image.alpha);\n return encodeRgbaToPngDataUrl(rgba, image.width, image.height);\n}\n\n/** Convert PDF image data into a renderable SVG image href value. */\nexport function buildPdfImageDataUrl(image: PdfImage): string {\n if (isJpeg(image.data)) {\n return toDataUrl(toExactArrayBuffer(image.data), \"image/jpeg\");\n }\n\n if (isPng(image.data)) {\n return toDataUrl(toExactArrayBuffer(image.data), \"image/png\");\n }\n\n return encodeRawImageToDataUrl(image);\n}\n","export function formatSvgNumber(value: number): string {\n if (!Number.isFinite(value)) {\n throw new Error(`value must be finite: ${value}`);\n }\n\n const rounded = Math.round(value * 1000) / 1000;\n if (Object.is(rounded, -0)) {\n return \"0\";\n }\n\n return `${rounded}`;\n}\n\nexport function formatSvgMatrix(values: readonly number[]): string {\n return values.map((value) => formatSvgNumber(value)).join(\" \");\n}\n","import type { PdfPath, PdfPathOp, PdfPoint } from \"@aurochs/pdf/domain\";\nimport { formatSvgNumber } from \"./number-format\";\n\nfunction toSvgY(pdfY: number, pageHeight: number): number {\n return pageHeight - pdfY;\n}\n\nfunction pointToSvgText(point: PdfPoint, pageHeight: number): string {\n return `${formatSvgNumber(point.x)} ${formatSvgNumber(toSvgY(point.y, pageHeight))}`;\n}\n\nfunction rectToPath(rect: Extract<PdfPathOp, { type: \"rect\" }>, pageHeight: number): string {\n const p1 = { x: rect.x, y: rect.y };\n const p2 = { x: rect.x + rect.width, y: rect.y };\n const p3 = { x: rect.x + rect.width, y: rect.y + rect.height };\n const p4 = { x: rect.x, y: rect.y + rect.height };\n return `M ${pointToSvgText(p1, pageHeight)} L ${pointToSvgText(p2, pageHeight)} L ${pointToSvgText(p3, pageHeight)} L ${pointToSvgText(p4, pageHeight)} Z`;\n}\n\nexport function buildSvgPathData(path: PdfPath, pageHeight: number): string {\n const commands: string[] = [];\n const currentPointState: { value: PdfPoint | null } = { value: null };\n\n for (const operation of path.operations) {\n if (operation.type === \"moveTo\") {\n commands.push(`M ${pointToSvgText(operation.point, pageHeight)}`);\n currentPointState.value = operation.point;\n continue;\n }\n\n if (operation.type === \"lineTo\") {\n commands.push(`L ${pointToSvgText(operation.point, pageHeight)}`);\n currentPointState.value = operation.point;\n continue;\n }\n\n if (operation.type === \"curveTo\") {\n commands.push(\n `C ${pointToSvgText(operation.cp1, pageHeight)} ${pointToSvgText(operation.cp2, pageHeight)} ${pointToSvgText(operation.end, pageHeight)}`,\n );\n currentPointState.value = operation.end;\n continue;\n }\n\n if (operation.type === \"curveToV\") {\n const cp1 = currentPointState.value ?? operation.cp2;\n commands.push(\n `C ${pointToSvgText(cp1, pageHeight)} ${pointToSvgText(operation.cp2, pageHeight)} ${pointToSvgText(operation.end, pageHeight)}`,\n );\n currentPointState.value = operation.end;\n continue;\n }\n\n if (operation.type === \"curveToY\") {\n commands.push(\n `C ${pointToSvgText(operation.cp1, pageHeight)} ${pointToSvgText(operation.end, pageHeight)} ${pointToSvgText(operation.end, pageHeight)}`,\n );\n currentPointState.value = operation.end;\n continue;\n }\n\n if (operation.type === \"rect\") {\n commands.push(rectToPath(operation, pageHeight));\n currentPointState.value = { x: operation.x, y: operation.y };\n continue;\n }\n\n commands.push(\"Z\");\n }\n\n return commands.join(\" \");\n}\n","const XML_TEXT_PATTERNS = [\n { from: /&/g, to: \"&\" },\n { from: /</g, to: \"<\" },\n { from: />/g, to: \">\" },\n] as const;\n\nconst XML_ATTR_PATTERNS = [\n ...XML_TEXT_PATTERNS,\n { from: /\"/g, to: \""\" },\n { from: /'/g, to: \"'\" },\n] as const;\n\nexport function escapeXmlText(value: string): string {\n let escaped = value;\n for (const pattern of XML_TEXT_PATTERNS) {\n escaped = escaped.replace(pattern.from, pattern.to);\n }\n return escaped;\n}\n\nexport function escapeXmlAttr(value: string): string {\n let escaped = value;\n for (const pattern of XML_ATTR_PATTERNS) {\n escaped = escaped.replace(pattern.from, pattern.to);\n }\n return escaped;\n}\n","import type {\n PdfBBox,\n PdfDocument,\n PdfElement,\n PdfImage,\n PdfLineCap,\n PdfLineJoin,\n PdfMatrix,\n PdfPage,\n PdfPath,\n PdfText,\n} from \"@aurochs/pdf/domain\";\nimport { normalizeFontFamily } from \"@aurochs/pdf/domain/font\";\nimport type { PdfSvgRenderOptions } from \"../types\";\nimport { toSvgPaint } from \"./color-to-svg\";\nimport { buildPdfImageDataUrl } from \"./image-data-url\";\nimport { formatSvgMatrix, formatSvgNumber } from \"./number-format\";\nimport { buildSvgPathData } from \"./path-data\";\nimport { escapeXmlAttr, escapeXmlText } from \"./xml-escape\";\n\ntype ClipPathRegistry = {\n readonly idsByKey: Map<string, string>;\n readonly defs: string[];\n nextId: number;\n};\n\nfunction createClipPathRegistry(): ClipPathRegistry {\n return {\n idsByKey: new Map<string, string>(),\n defs: [],\n nextId: 1,\n };\n}\n\nfunction toSvgLineCap(cap: PdfLineCap): \"butt\" | \"round\" | \"square\" {\n if (cap === 1) {\n return \"round\";\n }\n if (cap === 2) {\n return \"square\";\n }\n return \"butt\";\n}\n\nfunction toSvgLineJoin(join: PdfLineJoin): \"miter\" | \"round\" | \"bevel\" {\n if (join === 1) {\n return \"round\";\n }\n if (join === 2) {\n return \"bevel\";\n }\n return \"miter\";\n}\n\nfunction toClipKey(bbox: PdfBBox): string {\n return bbox.map((value) => formatSvgNumber(value)).join(\":\");\n}\n\nfunction toSvgClipRect(bbox: PdfBBox, pageHeight: number): Readonly<{\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}> {\n const [x1, y1, x2, y2] = bbox;\n const minX = Math.min(x1, x2);\n const maxX = Math.max(x1, x2);\n const minY = Math.min(y1, y2);\n const maxY = Math.max(y1, y2);\n\n return {\n x: minX,\n y: pageHeight - maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\nfunction getClipPathReference(\n clipBBox: PdfBBox | undefined,\n pageHeight: number,\n registry: ClipPathRegistry,\n): string {\n if (!clipBBox) {\n return \"\";\n }\n\n const key = toClipKey(clipBBox);\n const existing = registry.idsByKey.get(key);\n if (existing) {\n return ` clip-path=\"url(#${existing})\"`;\n }\n\n const id = `pdf-clip-${registry.nextId}`;\n registry.nextId += 1;\n registry.idsByKey.set(key, id);\n\n const rect = toSvgClipRect(clipBBox, pageHeight);\n registry.defs.push(\n `<clipPath id=\"${id}\"><rect x=\"${formatSvgNumber(rect.x)}\" y=\"${formatSvgNumber(rect.y)}\" width=\"${formatSvgNumber(rect.width)}\" height=\"${formatSvgNumber(rect.height)}\" /></clipPath>`,\n );\n\n return ` clip-path=\"url(#${id})\"`;\n}\n\nfunction renderPath(path: PdfPath, pageHeight: number, registry: ClipPathRegistry): string {\n if (path.paintOp === \"clip\" || path.paintOp === \"none\") {\n return \"\";\n }\n\n const d = buildSvgPathData(path, pageHeight);\n if (d.length === 0) {\n return \"\";\n }\n\n const state = path.graphicsState;\n const clipPathRef = getClipPathReference(state.clipBBox, pageHeight, registry);\n\n const fillEnabled = path.paintOp === \"fill\" || path.paintOp === \"fillStroke\";\n const strokeEnabled = path.paintOp === \"stroke\" || path.paintOp === \"fillStroke\";\n\n const fillPaint = toSvgPaint(state.fillColor, state.fillAlpha * (state.softMaskAlpha ?? 1));\n const strokePaint = toSvgPaint(state.strokeColor, state.strokeAlpha * (state.softMaskAlpha ?? 1));\n\n const attrs: string[] = [`d=\"${escapeXmlAttr(d)}\"`];\n\n if (fillEnabled) {\n attrs.push(`fill=\"${fillPaint.color}\"`);\n if (fillPaint.opacity < 1) {\n attrs.push(`fill-opacity=\"${formatSvgNumber(fillPaint.opacity)}\"`);\n }\n } else {\n attrs.push('fill=\"none\"');\n }\n\n if (strokeEnabled) {\n attrs.push(`stroke=\"${strokePaint.color}\"`);\n attrs.push(`stroke-width=\"${formatSvgNumber(state.lineWidth)}\"`);\n attrs.push(`stroke-linecap=\"${toSvgLineCap(state.lineCap)}\"`);\n attrs.push(`stroke-linejoin=\"${toSvgLineJoin(state.lineJoin)}\"`);\n attrs.push(`stroke-miterlimit=\"${formatSvgNumber(state.miterLimit)}\"`);\n if (strokePaint.opacity < 1) {\n attrs.push(`stroke-opacity=\"${formatSvgNumber(strokePaint.opacity)}\"`);\n }\n if (state.dashArray.length > 0) {\n attrs.push(`stroke-dasharray=\"${state.dashArray.map((value) => formatSvgNumber(value)).join(\" \")}\"`);\n if (state.dashPhase !== 0) {\n attrs.push(`stroke-dashoffset=\"${formatSvgNumber(state.dashPhase)}\"`);\n }\n }\n } else {\n attrs.push('stroke=\"none\"');\n }\n\n return `<path ${attrs.join(\" \")}${clipPathRef} />`;\n}\n\nfunction resolveTextTopY(text: PdfText, pageHeight: number): number {\n return pageHeight - (text.y + text.height);\n}\n\ntype TextAnchor = Readonly<{\n readonly x: number;\n readonly y: number;\n readonly dominantBaseline: \"alphabetic\" | \"text-before-edge\";\n readonly angleDeg: number;\n readonly fromBaseline: boolean;\n}>;\n\nfunction resolveTextBaselineAnchor(\n text: PdfText,\n pageHeight: number,\n): Readonly<{\n readonly x: number;\n readonly y: number;\n readonly angleDeg: number;\n}> | null {\n const startX = text.baselineStartX;\n const startY = text.baselineStartY;\n const endX = text.baselineEndX;\n const endY = text.baselineEndY;\n\n if (\n startX === undefined ||\n startY === undefined ||\n endX === undefined ||\n endY === undefined ||\n !Number.isFinite(startX) ||\n !Number.isFinite(startY) ||\n !Number.isFinite(endX) ||\n !Number.isFinite(endY)\n ) {\n return null;\n }\n\n const dx = endX - startX;\n const dy = endY - startY;\n const baselineLength = Math.hypot(dx, dy);\n if (!Number.isFinite(baselineLength) || baselineLength <= 1e-6) {\n return null;\n }\n\n // PDF uses bottom-left origin, SVG uses top-left. Invert Y for SVG angle.\n const angleDeg = (Math.atan2(-dy, dx) * 180) / Math.PI;\n return {\n x: startX,\n y: pageHeight - startY,\n angleDeg,\n };\n}\n\nfunction resolveTextAnchor(text: PdfText, pageHeight: number): TextAnchor {\n const baselineAnchor = resolveTextBaselineAnchor(text, pageHeight);\n if (baselineAnchor) {\n return {\n x: baselineAnchor.x,\n y: baselineAnchor.y,\n dominantBaseline: \"alphabetic\",\n angleDeg: baselineAnchor.angleDeg,\n fromBaseline: true,\n };\n }\n\n return {\n x: text.x,\n y: resolveTextTopY(text, pageHeight),\n dominantBaseline: \"text-before-edge\",\n angleDeg: 0,\n fromBaseline: false,\n };\n}\n\nfunction isVerticalWritingText(text: PdfText): boolean {\n return text.writingMode === 1;\n}\n\nfunction normalizeTextAnchorForVerticalWriting(anchor: TextAnchor): TextAnchor {\n if (!anchor.fromBaseline) {\n return { ...anchor, dominantBaseline: \"text-before-edge\" };\n }\n return {\n ...anchor,\n dominantBaseline: \"text-before-edge\",\n // Vertical text in SVG naturally advances along +Y.\n // Align baseline-derived run direction to that axis.\n angleDeg: anchor.angleDeg - 90,\n };\n}\n\nfunction normalizeTextScale(text: PdfText): number {\n const scaling = text.horizontalScaling;\n if (scaling === undefined) {\n return 1;\n }\n\n if (!Number.isFinite(scaling) || scaling <= 0) {\n return 1;\n }\n\n return scaling / 100;\n}\n\nfunction buildTextTransform(anchor: TextAnchor, textScale: number): string | null {\n const hasRotation = Math.abs(anchor.angleDeg) > 1e-6;\n const hasScale = Math.abs(textScale - 1) > 1e-6;\n\n if (!hasRotation && !hasScale) {\n return null;\n }\n\n if (!hasRotation) {\n const translateX = formatSvgNumber(anchor.x);\n const reverseTranslateX = formatSvgNumber(-anchor.x);\n return `translate(${translateX} 0) scale(${formatSvgNumber(textScale)} 1) translate(${reverseTranslateX} 0)`;\n }\n\n if (!hasScale) {\n return `rotate(${formatSvgNumber(anchor.angleDeg)} ${formatSvgNumber(anchor.x)} ${formatSvgNumber(anchor.y)})`;\n }\n\n const anchorX = formatSvgNumber(anchor.x);\n const anchorY = formatSvgNumber(anchor.y);\n const inverseAnchorX = formatSvgNumber(-anchor.x);\n const inverseAnchorY = formatSvgNumber(-anchor.y);\n return (\n `translate(${anchorX} ${anchorY}) rotate(${formatSvgNumber(anchor.angleDeg)}) ` +\n `scale(${formatSvgNumber(textScale)} 1) translate(${inverseAnchorX} ${inverseAnchorY})`\n );\n}\n\nfunction renderText(text: PdfText, pageHeight: number, registry: ClipPathRegistry): string {\n if (text.text.length === 0) {\n return \"\";\n }\n\n const state = text.graphicsState;\n const clipPathRef = getClipPathReference(state.clipBBox, pageHeight, registry);\n\n const fillEnabled = state.textRenderingMode === 0 || state.textRenderingMode === 2 || state.textRenderingMode === 4 || state.textRenderingMode === 6;\n const strokeEnabled = state.textRenderingMode === 1 || state.textRenderingMode === 2 || state.textRenderingMode === 5 || state.textRenderingMode === 6;\n\n if (!fillEnabled && !strokeEnabled) {\n return \"\";\n }\n\n const fillPaint = toSvgPaint(state.fillColor, state.fillAlpha * (state.softMaskAlpha ?? 1));\n const strokePaint = toSvgPaint(state.strokeColor, state.strokeAlpha * (state.softMaskAlpha ?? 1));\n const baseAnchor = resolveTextAnchor(text, pageHeight);\n const verticalWriting = isVerticalWritingText(text);\n const anchor = verticalWriting ? normalizeTextAnchorForVerticalWriting(baseAnchor) : baseAnchor;\n const fontFamily = normalizeFontFamily(text.baseFont ?? text.fontName);\n const fontWeight = text.isBold ? \"700\" : \"400\";\n const fontStyle = text.isItalic ? \"italic\" : \"normal\";\n\n const attrs: string[] = [\n `x=\"${formatSvgNumber(anchor.x)}\"`,\n `y=\"${formatSvgNumber(anchor.y)}\"`,\n `font-size=\"${formatSvgNumber(text.fontSize)}\"`,\n `font-family=\"${escapeXmlAttr(fontFamily)}\"`,\n `font-weight=\"${fontWeight}\"`,\n `font-style=\"${fontStyle}\"`,\n `dominant-baseline=\"${anchor.dominantBaseline}\"`,\n 'xml:space=\"preserve\"',\n ];\n\n if (fillEnabled) {\n attrs.push(`fill=\"${fillPaint.color}\"`);\n if (fillPaint.opacity < 1) {\n attrs.push(`fill-opacity=\"${formatSvgNumber(fillPaint.opacity)}\"`);\n }\n } else {\n attrs.push('fill=\"none\"');\n }\n\n if (strokeEnabled) {\n attrs.push(`stroke=\"${strokePaint.color}\"`);\n attrs.push(`stroke-width=\"${formatSvgNumber(state.lineWidth)}\"`);\n attrs.push(`stroke-linejoin=\"${toSvgLineJoin(state.lineJoin)}\"`);\n if (strokePaint.opacity < 1) {\n attrs.push(`stroke-opacity=\"${formatSvgNumber(strokePaint.opacity)}\"`);\n }\n } else {\n attrs.push('stroke=\"none\"');\n }\n\n if (text.charSpacing !== undefined && text.charSpacing !== 0) {\n attrs.push(`letter-spacing=\"${formatSvgNumber(text.charSpacing)}\"`);\n }\n\n if (verticalWriting) {\n attrs.push('writing-mode=\"vertical-rl\"');\n attrs.push('text-orientation=\"upright\"');\n }\n\n const textScale = normalizeTextScale(text);\n const transform = buildTextTransform(anchor, textScale);\n if (transform) {\n attrs.push(`transform=\"${transform}\"`);\n }\n\n return `<text ${attrs.join(\" \")}${clipPathRef}>${escapeXmlText(text.text)}</text>`;\n}\n\nfunction buildImageTransform(ctm: PdfMatrix, pageHeight: number): readonly number[] {\n const [a, b, c, d, e, f] = ctm;\n\n const topLeft = {\n x: c + e,\n y: pageHeight - (d + f),\n };\n\n const topRight = {\n x: a + c + e,\n y: pageHeight - (b + d + f),\n };\n\n const bottomLeft = {\n x: e,\n y: pageHeight - f,\n };\n\n const xAxis = {\n x: topRight.x - topLeft.x,\n y: topRight.y - topLeft.y,\n };\n\n const yAxis = {\n x: bottomLeft.x - topLeft.x,\n y: bottomLeft.y - topLeft.y,\n };\n\n return [xAxis.x, xAxis.y, yAxis.x, yAxis.y, topLeft.x, topLeft.y] as const;\n}\n\nfunction renderImage(image: PdfImage, pageHeight: number, registry: ClipPathRegistry): string {\n const clipPathRef = getClipPathReference(image.graphicsState.clipBBox, pageHeight, registry);\n const dataUrl = buildPdfImageDataUrl(image);\n const escapedDataUrl = escapeXmlAttr(dataUrl);\n const matrix = buildImageTransform(image.graphicsState.ctm, pageHeight);\n\n const imageMarkup = (\n `<image href=\"${escapedDataUrl}\" xlink:href=\"${escapedDataUrl}\" ` +\n `width=\"1\" height=\"1\" preserveAspectRatio=\"none\" transform=\"matrix(${formatSvgMatrix(matrix)})\" />`\n );\n\n // Chromium-based engines may drop raster rendering when clip-path and transform\n // are both attached to the same <image>. Apply clipping on a wrapper group instead.\n if (clipPathRef.length > 0) {\n return `<g${clipPathRef}>${imageMarkup}</g>`;\n }\n\n return imageMarkup;\n}\n\nfunction renderElement(element: PdfElement, pageHeight: number, registry: ClipPathRegistry): string {\n if (element.type === \"path\") {\n return renderPath(element, pageHeight, registry);\n }\n\n if (element.type === \"text\") {\n return renderText(element, pageHeight, registry);\n }\n\n return renderImage(element, pageHeight, registry);\n}\n\nfunction normalizeDimension(value: number | string): string {\n if (typeof value === \"number\") {\n return formatSvgNumber(value);\n }\n return value;\n}\n\nfunction normalizeBackgroundColor(options: PdfSvgRenderOptions): string {\n if (options.backgroundColor === undefined) {\n return \"#FFFFFF\";\n }\n return options.backgroundColor;\n}\n\nfunction getPreserveAspectRatio(options: PdfSvgRenderOptions): string {\n if (options.preserveAspectRatio === undefined) {\n return \"xMidYMid meet\";\n }\n return options.preserveAspectRatio;\n}\n\n/** Render a single `PdfPage` into standalone SVG markup. */\nexport function renderPdfPageToSvg(page: PdfPage, options: PdfSvgRenderOptions = {}): string {\n if (!page) {\n throw new Error(\"page is required\");\n }\n\n const registry = createClipPathRegistry();\n const bodyParts: string[] = [];\n\n const backgroundColor = normalizeBackgroundColor(options);\n if (backgroundColor !== \"none\" && backgroundColor !== \"transparent\") {\n bodyParts.push(\n `<rect x=\"0\" y=\"0\" width=\"${formatSvgNumber(page.width)}\" height=\"${formatSvgNumber(page.height)}\" fill=\"${escapeXmlAttr(backgroundColor)}\" />`,\n );\n }\n\n for (const element of page.elements) {\n const rendered = renderElement(element, page.height, registry);\n if (rendered.length > 0) {\n bodyParts.push(rendered);\n }\n }\n\n const defs = registry.defs.length > 0 ? `<defs>${registry.defs.join(\"\")}</defs>` : \"\";\n const width = normalizeDimension(options.width ?? page.width);\n const height = normalizeDimension(options.height ?? page.height);\n\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"` +\n ` viewBox=\"0 0 ${formatSvgNumber(page.width)} ${formatSvgNumber(page.height)}\"` +\n ` width=\"${escapeXmlAttr(width)}\" height=\"${escapeXmlAttr(height)}\" preserveAspectRatio=\"${escapeXmlAttr(getPreserveAspectRatio(options))}\">` +\n `${defs}${bodyParts.join(\"\")}</svg>`;\n\n if (options.includeXmlDeclaration) {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${svg}`;\n }\n\n return svg;\n}\n\nexport function renderPdfDocumentToSvgs(document: PdfDocument, options: PdfSvgRenderOptions = {}): readonly string[] {\n if (!document) {\n throw new Error(\"document is required\");\n }\n\n return document.pages.map((page) => renderPdfPageToSvg(page, options));\n}\n\nexport function renderPdfDocumentPageToSvg(\n document: PdfDocument,\n pageNumber: number,\n options: PdfSvgRenderOptions = {},\n): string {\n if (!document) {\n throw new Error(\"document is required\");\n }\n if (!Number.isInteger(pageNumber) || pageNumber < 1) {\n throw new Error(`pageNumber must be a positive integer: ${pageNumber}`);\n }\n\n const page = document.pages[pageNumber - 1];\n if (!page) {\n throw new Error(`pageNumber ${pageNumber} is out of range`);\n }\n\n return renderPdfPageToSvg(page, options);\n}\n"],"names":["r","g","b","rgb","document"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../packages/@aurochs-renderer/pdf/src/svg/color-to-svg.ts","../../../../../../packages/@aurochs/jpeg/src/detector.ts","../../../../../../packages/@aurochs/png/src/encoder.browser.ts","../../../../../../packages/@aurochs/png/src/constants.ts","../../../../../../packages/@aurochs/png/src/detector.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/image-data-url.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/number-format.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/path-data.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/xml-escape.ts","../../../../../../packages/@aurochs-renderer/pdf/src/svg/render-page-svg.ts"],"sourcesContent":["import type { PdfColor } from \"@aurochs/pdf/domain\";\nimport { clamp01, cmykToRgb, grayToRgb, rgbToHex, rgbToRgbBytes } from \"@aurochs/pdf/domain/color\";\n\nexport type SvgPaint = Readonly<{\n readonly color: string;\n readonly opacity: number;\n}>;\n\nfunction colorToHex(color: PdfColor): string {\n switch (color.colorSpace) {\n case \"DeviceGray\": {\n const [gray = 0] = color.components;\n const [r, g, b] = grayToRgb(gray);\n return `#${rgbToHex(r, g, b)}`;\n }\n case \"DeviceRGB\": {\n const [r = 0, g = 0, b = 0] = color.components;\n const rgb = rgbToRgbBytes(r, g, b);\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n case \"DeviceCMYK\": {\n const [c = 0, m = 0, y = 0, k = 0] = color.components;\n const rgb = cmykToRgb({ c, m, y, k });\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n case \"ICCBased\": {\n if (color.alternateColorSpace === \"DeviceGray\") {\n const [gray = 0] = color.components;\n const [r, g, b] = grayToRgb(gray);\n return `#${rgbToHex(r, g, b)}`;\n }\n if (color.alternateColorSpace === \"DeviceCMYK\") {\n const [c = 0, m = 0, y = 0, k = 0] = color.components;\n const rgb = cmykToRgb({ c, m, y, k });\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n const [r = 0, g = 0, b = 0] = color.components;\n const rgb = rgbToRgbBytes(r, g, b);\n return `#${rgbToHex(rgb[0], rgb[1], rgb[2])}`;\n }\n case \"Pattern\":\n return \"#000000\";\n default:\n return \"#000000\";\n }\n}\n\nexport function toSvgPaint(color: PdfColor, alpha: number): SvgPaint {\n return {\n color: colorToHex(color),\n opacity: clamp01(alpha),\n };\n}\n","/**\n * @file JPEG format detection\n *\n * Detects JPEG format by checking the SOI (Start of Image) marker.\n * JPEG files start with FF D8 FF (SOI + APP marker)\n */\n\n/**\n * JPEG SOI Marker (3 bytes minimum for detection)\n * FF D8 = Start of Image\n * FF = Start of next marker (typically APP0/APP1)\n */\nexport const JPEG_SOI_MARKER = new Uint8Array([0xff, 0xd8, 0xff]);\n\n/**\n * Check if data starts with JPEG SOI marker\n *\n * @param data - Binary data to check\n * @returns true if data is JPEG format\n */\nexport function isJpeg(data: Uint8Array): boolean {\n if (data.length < 3) {\n return false;\n }\n return data[0] === 0xff && data[1] === 0xd8 && data[2] === 0xff;\n}\n","/**\n * @file PNG Encoder (Browser)\n *\n * Uses Canvas API for PNG encoding.\n */\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * RGBAデータをPNG Data URLにエンコード\n */\nexport function encodeRgbaToPngDataUrl(rgbaData: Uint8ClampedArray, width: number, height: number): string {\n const normalized = normalizeRgbaData(rgbaData, width, height);\n return encodeWithCanvas(normalized, width, height);\n}\n\n/**\n * RGBAデータをPNGバイト列にエンコード\n */\nexport function encodeRgbaToPng(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8Array {\n const normalized = normalizeRgbaData(rgbaData, width, height);\n return encodeWithCanvasToBytes(normalized, width, height);\n}\n\n// =============================================================================\n// Canvas API\n// =============================================================================\n\nfunction encodeWithCanvas(rgbaData: Uint8ClampedArray, width: number, height: number): string {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2D context from canvas\");\n }\n\n const buffer = new ArrayBuffer(rgbaData.byteLength);\n const copied = new Uint8ClampedArray(buffer);\n copied.set(rgbaData);\n\n const imageData = new ImageData(copied, width, height);\n ctx.putImageData(imageData, 0, 0);\n\n return canvas.toDataURL(\"image/png\");\n}\n\nfunction encodeWithCanvasToBytes(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8Array {\n const dataUrl = encodeWithCanvas(rgbaData, width, height);\n return dataUrlToBytes(dataUrl);\n}\n\nfunction dataUrlToBytes(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1];\n if (!base64) {\n throw new Error(\"Invalid data URL format\");\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nfunction normalizeRgbaData(rgbaData: Uint8ClampedArray, width: number, height: number): Uint8ClampedArray {\n const expectedLength = width * height * 4;\n if (rgbaData.length === expectedLength) {\n return rgbaData;\n }\n\n console.warn(\n `[PNG Encoder] Data length mismatch: expected ${expectedLength} bytes for ${width}x${height}, got ${rgbaData.length}`,\n );\n\n const normalized = new Uint8ClampedArray(expectedLength);\n normalized.set(rgbaData.subarray(0, Math.min(rgbaData.length, expectedLength)));\n return normalized;\n}\n","/**\n * @file PNG format constants\n *\n * RFC 2083 Section 3.1\n */\n\n/**\n * PNG Signature (8 bytes)\n */\nexport const PNG_SIGNATURE = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n","/**\n * @file PNG format detection\n *\n * Detects PNG format by checking the 8-byte signature.\n * RFC 2083: PNG file signature is 89 50 4E 47 0D 0A 1A 0A\n */\n\nimport { PNG_SIGNATURE } from \"./constants\";\n\nexport { PNG_SIGNATURE };\n\n/**\n * Check if data starts with PNG signature\n *\n * @param data - Binary data to check\n * @returns true if data is PNG format\n */\nexport function isPng(data: Uint8Array): boolean {\n if (data.length < PNG_SIGNATURE.length) {\n return false;\n }\n for (let i = 0; i < PNG_SIGNATURE.length; i++) {\n if (data[i] !== PNG_SIGNATURE[i]) {\n return false;\n }\n }\n return true;\n}\n","import { toDataUrl } from \"@aurochs/buffer\";\nimport { isJpeg } from \"@aurochs/jpeg\";\nimport { convertToRgba } from \"@aurochs/pdf/image/pixel-converter\";\nimport type { PdfImage } from \"@aurochs/pdf/domain\";\nimport { encodeRgbaToPngDataUrl, isPng } from \"@aurochs/png\";\n\nfunction toExactArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction applyAlphaChannel(rgba: Uint8ClampedArray, alpha: Uint8Array | undefined): void {\n if (!alpha) {\n return;\n }\n\n const pixelCount = rgba.length / 4;\n if (alpha.length !== pixelCount) {\n return;\n }\n\n for (let i = 0; i < pixelCount; i += 1) {\n rgba[i * 4 + 3] = alpha[i] ?? 255;\n }\n}\n\nfunction encodeRawImageToDataUrl(image: PdfImage): string {\n const rgba = convertToRgba(\n image.data,\n image.width,\n image.height,\n image.colorSpace,\n image.bitsPerComponent,\n { decode: image.decode },\n );\n applyAlphaChannel(rgba, image.alpha);\n return encodeRgbaToPngDataUrl(rgba, image.width, image.height);\n}\n\n/** Convert PDF image data into a renderable SVG image href value. */\nexport function buildPdfImageDataUrl(image: PdfImage): string {\n if (isJpeg(image.data)) {\n return toDataUrl(toExactArrayBuffer(image.data), \"image/jpeg\");\n }\n\n if (isPng(image.data)) {\n return toDataUrl(toExactArrayBuffer(image.data), \"image/png\");\n }\n\n return encodeRawImageToDataUrl(image);\n}\n","export function formatSvgNumber(value: number): string {\n if (!Number.isFinite(value)) {\n throw new Error(`value must be finite: ${value}`);\n }\n\n const rounded = Math.round(value * 1000) / 1000;\n if (Object.is(rounded, -0)) {\n return \"0\";\n }\n\n return `${rounded}`;\n}\n\nexport function formatSvgMatrix(values: readonly number[]): string {\n return values.map((value) => formatSvgNumber(value)).join(\" \");\n}\n","import type { PdfPath, PdfPathOp, PdfPoint } from \"@aurochs/pdf/domain\";\nimport { formatSvgNumber } from \"./number-format\";\n\nfunction toSvgY(pdfY: number, pageHeight: number): number {\n return pageHeight - pdfY;\n}\n\nfunction pointToSvgText(point: PdfPoint, pageHeight: number): string {\n return `${formatSvgNumber(point.x)} ${formatSvgNumber(toSvgY(point.y, pageHeight))}`;\n}\n\nfunction rectToPath(rect: Extract<PdfPathOp, { type: \"rect\" }>, pageHeight: number): string {\n const p1 = { x: rect.x, y: rect.y };\n const p2 = { x: rect.x + rect.width, y: rect.y };\n const p3 = { x: rect.x + rect.width, y: rect.y + rect.height };\n const p4 = { x: rect.x, y: rect.y + rect.height };\n return `M ${pointToSvgText(p1, pageHeight)} L ${pointToSvgText(p2, pageHeight)} L ${pointToSvgText(p3, pageHeight)} L ${pointToSvgText(p4, pageHeight)} Z`;\n}\n\nexport function buildSvgPathData(path: PdfPath, pageHeight: number): string {\n const commands: string[] = [];\n const currentPointState: { value: PdfPoint | null } = { value: null };\n\n for (const operation of path.operations) {\n if (operation.type === \"moveTo\") {\n commands.push(`M ${pointToSvgText(operation.point, pageHeight)}`);\n currentPointState.value = operation.point;\n continue;\n }\n\n if (operation.type === \"lineTo\") {\n commands.push(`L ${pointToSvgText(operation.point, pageHeight)}`);\n currentPointState.value = operation.point;\n continue;\n }\n\n if (operation.type === \"curveTo\") {\n commands.push(\n `C ${pointToSvgText(operation.cp1, pageHeight)} ${pointToSvgText(operation.cp2, pageHeight)} ${pointToSvgText(operation.end, pageHeight)}`,\n );\n currentPointState.value = operation.end;\n continue;\n }\n\n if (operation.type === \"curveToV\") {\n const cp1 = currentPointState.value ?? operation.cp2;\n commands.push(\n `C ${pointToSvgText(cp1, pageHeight)} ${pointToSvgText(operation.cp2, pageHeight)} ${pointToSvgText(operation.end, pageHeight)}`,\n );\n currentPointState.value = operation.end;\n continue;\n }\n\n if (operation.type === \"curveToY\") {\n commands.push(\n `C ${pointToSvgText(operation.cp1, pageHeight)} ${pointToSvgText(operation.end, pageHeight)} ${pointToSvgText(operation.end, pageHeight)}`,\n );\n currentPointState.value = operation.end;\n continue;\n }\n\n if (operation.type === \"rect\") {\n commands.push(rectToPath(operation, pageHeight));\n currentPointState.value = { x: operation.x, y: operation.y };\n continue;\n }\n\n commands.push(\"Z\");\n }\n\n return commands.join(\" \");\n}\n","const XML_TEXT_PATTERNS = [\n { from: /&/g, to: \"&\" },\n { from: /</g, to: \"<\" },\n { from: />/g, to: \">\" },\n] as const;\n\nconst XML_ATTR_PATTERNS = [\n ...XML_TEXT_PATTERNS,\n { from: /\"/g, to: \""\" },\n { from: /'/g, to: \"'\" },\n] as const;\n\nexport function escapeXmlText(value: string): string {\n let escaped = value;\n for (const pattern of XML_TEXT_PATTERNS) {\n escaped = escaped.replace(pattern.from, pattern.to);\n }\n return escaped;\n}\n\nexport function escapeXmlAttr(value: string): string {\n let escaped = value;\n for (const pattern of XML_ATTR_PATTERNS) {\n escaped = escaped.replace(pattern.from, pattern.to);\n }\n return escaped;\n}\n","import type {\n PdfBBox,\n PdfDocument,\n PdfElement,\n PdfImage,\n PdfLineCap,\n PdfLineJoin,\n PdfMatrix,\n PdfPage,\n PdfPath,\n PdfText,\n} from \"@aurochs/pdf/domain\";\nimport { normalizeFontFamily } from \"@aurochs/pdf/domain/font\";\nimport type { PdfSvgRenderOptions } from \"../types\";\nimport { toSvgPaint } from \"./color-to-svg\";\nimport { buildPdfImageDataUrl } from \"./image-data-url\";\nimport { formatSvgMatrix, formatSvgNumber } from \"./number-format\";\nimport { buildSvgPathData } from \"./path-data\";\nimport { escapeXmlAttr, escapeXmlText } from \"./xml-escape\";\n\ntype ClipPathRegistry = {\n readonly idsByKey: Map<string, string>;\n readonly defs: string[];\n nextId: number;\n};\n\nfunction createClipPathRegistry(): ClipPathRegistry {\n return {\n idsByKey: new Map<string, string>(),\n defs: [],\n nextId: 1,\n };\n}\n\nfunction toSvgLineCap(cap: PdfLineCap): \"butt\" | \"round\" | \"square\" {\n if (cap === 1) {\n return \"round\";\n }\n if (cap === 2) {\n return \"square\";\n }\n return \"butt\";\n}\n\nfunction toSvgLineJoin(join: PdfLineJoin): \"miter\" | \"round\" | \"bevel\" {\n if (join === 1) {\n return \"round\";\n }\n if (join === 2) {\n return \"bevel\";\n }\n return \"miter\";\n}\n\nfunction toClipKey(bbox: PdfBBox): string {\n return bbox.map((value) => formatSvgNumber(value)).join(\":\");\n}\n\nfunction toSvgClipRect(bbox: PdfBBox, pageHeight: number): Readonly<{\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}> {\n const [x1, y1, x2, y2] = bbox;\n const minX = Math.min(x1, x2);\n const maxX = Math.max(x1, x2);\n const minY = Math.min(y1, y2);\n const maxY = Math.max(y1, y2);\n\n return {\n x: minX,\n y: pageHeight - maxY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\nfunction getClipPathReference(\n clipBBox: PdfBBox | undefined,\n pageHeight: number,\n registry: ClipPathRegistry,\n): string {\n if (!clipBBox) {\n return \"\";\n }\n\n const key = toClipKey(clipBBox);\n const existing = registry.idsByKey.get(key);\n if (existing) {\n return ` clip-path=\"url(#${existing})\"`;\n }\n\n const id = `pdf-clip-${registry.nextId}`;\n registry.nextId += 1;\n registry.idsByKey.set(key, id);\n\n const rect = toSvgClipRect(clipBBox, pageHeight);\n registry.defs.push(\n `<clipPath id=\"${id}\"><rect x=\"${formatSvgNumber(rect.x)}\" y=\"${formatSvgNumber(rect.y)}\" width=\"${formatSvgNumber(rect.width)}\" height=\"${formatSvgNumber(rect.height)}\" /></clipPath>`,\n );\n\n return ` clip-path=\"url(#${id})\"`;\n}\n\nfunction renderPath(path: PdfPath, pageHeight: number, registry: ClipPathRegistry): string {\n if (path.paintOp === \"clip\" || path.paintOp === \"none\") {\n return \"\";\n }\n\n const d = buildSvgPathData(path, pageHeight);\n if (d.length === 0) {\n return \"\";\n }\n\n const state = path.graphicsState;\n const clipPathRef = getClipPathReference(state.clipBBox, pageHeight, registry);\n\n const fillEnabled = path.paintOp === \"fill\" || path.paintOp === \"fillStroke\";\n const strokeEnabled = path.paintOp === \"stroke\" || path.paintOp === \"fillStroke\";\n\n const fillPaint = toSvgPaint(state.fillColor, state.fillAlpha * (state.softMaskAlpha ?? 1));\n const strokePaint = toSvgPaint(state.strokeColor, state.strokeAlpha * (state.softMaskAlpha ?? 1));\n\n const attrs: string[] = [`d=\"${escapeXmlAttr(d)}\"`];\n\n if (fillEnabled) {\n attrs.push(`fill=\"${fillPaint.color}\"`);\n if (fillPaint.opacity < 1) {\n attrs.push(`fill-opacity=\"${formatSvgNumber(fillPaint.opacity)}\"`);\n }\n } else {\n attrs.push('fill=\"none\"');\n }\n\n if (strokeEnabled) {\n attrs.push(`stroke=\"${strokePaint.color}\"`);\n attrs.push(`stroke-width=\"${formatSvgNumber(state.lineWidth)}\"`);\n attrs.push(`stroke-linecap=\"${toSvgLineCap(state.lineCap)}\"`);\n attrs.push(`stroke-linejoin=\"${toSvgLineJoin(state.lineJoin)}\"`);\n attrs.push(`stroke-miterlimit=\"${formatSvgNumber(state.miterLimit)}\"`);\n if (strokePaint.opacity < 1) {\n attrs.push(`stroke-opacity=\"${formatSvgNumber(strokePaint.opacity)}\"`);\n }\n if (state.dashArray.length > 0) {\n attrs.push(`stroke-dasharray=\"${state.dashArray.map((value) => formatSvgNumber(value)).join(\" \")}\"`);\n if (state.dashPhase !== 0) {\n attrs.push(`stroke-dashoffset=\"${formatSvgNumber(state.dashPhase)}\"`);\n }\n }\n } else {\n attrs.push('stroke=\"none\"');\n }\n\n return `<path ${attrs.join(\" \")}${clipPathRef} />`;\n}\n\nfunction resolveTextTopY(text: PdfText, pageHeight: number): number {\n return pageHeight - (text.y + text.height);\n}\n\ntype TextAnchor = Readonly<{\n readonly x: number;\n readonly y: number;\n readonly dominantBaseline: \"alphabetic\" | \"text-before-edge\";\n readonly angleDeg: number;\n readonly fromBaseline: boolean;\n}>;\n\nfunction resolveTextBaselineAnchor(\n text: PdfText,\n pageHeight: number,\n): Readonly<{\n readonly x: number;\n readonly y: number;\n readonly angleDeg: number;\n}> | null {\n const startX = text.baselineStartX;\n const startY = text.baselineStartY;\n const endX = text.baselineEndX;\n const endY = text.baselineEndY;\n\n if (\n startX === undefined ||\n startY === undefined ||\n endX === undefined ||\n endY === undefined ||\n !Number.isFinite(startX) ||\n !Number.isFinite(startY) ||\n !Number.isFinite(endX) ||\n !Number.isFinite(endY)\n ) {\n return null;\n }\n\n const dx = endX - startX;\n const dy = endY - startY;\n const baselineLength = Math.hypot(dx, dy);\n if (!Number.isFinite(baselineLength) || baselineLength <= 1e-6) {\n return null;\n }\n\n // PDF uses bottom-left origin, SVG uses top-left. Invert Y for SVG angle.\n const angleDeg = (Math.atan2(-dy, dx) * 180) / Math.PI;\n return {\n x: startX,\n y: pageHeight - startY,\n angleDeg,\n };\n}\n\nfunction resolveTextAnchor(text: PdfText, pageHeight: number): TextAnchor {\n const baselineAnchor = resolveTextBaselineAnchor(text, pageHeight);\n if (baselineAnchor) {\n return {\n x: baselineAnchor.x,\n y: baselineAnchor.y,\n dominantBaseline: \"alphabetic\",\n angleDeg: baselineAnchor.angleDeg,\n fromBaseline: true,\n };\n }\n\n return {\n x: text.x,\n y: resolveTextTopY(text, pageHeight),\n dominantBaseline: \"text-before-edge\",\n angleDeg: 0,\n fromBaseline: false,\n };\n}\n\nfunction isVerticalWritingText(text: PdfText): boolean {\n return text.writingMode === 1;\n}\n\nfunction normalizeTextAnchorForVerticalWriting(anchor: TextAnchor): TextAnchor {\n if (!anchor.fromBaseline) {\n return { ...anchor, dominantBaseline: \"text-before-edge\" };\n }\n return {\n ...anchor,\n dominantBaseline: \"text-before-edge\",\n // Vertical text in SVG naturally advances along +Y.\n // Align baseline-derived run direction to that axis.\n angleDeg: anchor.angleDeg - 90,\n };\n}\n\nfunction normalizeTextScale(text: PdfText): number {\n const scaling = text.horizontalScaling;\n if (scaling === undefined) {\n return 1;\n }\n\n if (!Number.isFinite(scaling) || scaling <= 0) {\n return 1;\n }\n\n return scaling / 100;\n}\n\nfunction buildTextTransform(anchor: TextAnchor, textScale: number): string | null {\n const hasRotation = Math.abs(anchor.angleDeg) > 1e-6;\n const hasScale = Math.abs(textScale - 1) > 1e-6;\n\n if (!hasRotation && !hasScale) {\n return null;\n }\n\n if (!hasRotation) {\n const translateX = formatSvgNumber(anchor.x);\n const reverseTranslateX = formatSvgNumber(-anchor.x);\n return `translate(${translateX} 0) scale(${formatSvgNumber(textScale)} 1) translate(${reverseTranslateX} 0)`;\n }\n\n if (!hasScale) {\n return `rotate(${formatSvgNumber(anchor.angleDeg)} ${formatSvgNumber(anchor.x)} ${formatSvgNumber(anchor.y)})`;\n }\n\n const anchorX = formatSvgNumber(anchor.x);\n const anchorY = formatSvgNumber(anchor.y);\n const inverseAnchorX = formatSvgNumber(-anchor.x);\n const inverseAnchorY = formatSvgNumber(-anchor.y);\n return (\n `translate(${anchorX} ${anchorY}) rotate(${formatSvgNumber(anchor.angleDeg)}) ` +\n `scale(${formatSvgNumber(textScale)} 1) translate(${inverseAnchorX} ${inverseAnchorY})`\n );\n}\n\nfunction renderText(text: PdfText, pageHeight: number, registry: ClipPathRegistry): string {\n if (text.text.length === 0) {\n return \"\";\n }\n\n const state = text.graphicsState;\n const clipPathRef = getClipPathReference(state.clipBBox, pageHeight, registry);\n\n const fillEnabled = state.textRenderingMode === 0 || state.textRenderingMode === 2 || state.textRenderingMode === 4 || state.textRenderingMode === 6;\n const strokeEnabled = state.textRenderingMode === 1 || state.textRenderingMode === 2 || state.textRenderingMode === 5 || state.textRenderingMode === 6;\n\n if (!fillEnabled && !strokeEnabled) {\n return \"\";\n }\n\n const fillPaint = toSvgPaint(state.fillColor, state.fillAlpha * (state.softMaskAlpha ?? 1));\n const strokePaint = toSvgPaint(state.strokeColor, state.strokeAlpha * (state.softMaskAlpha ?? 1));\n const baseAnchor = resolveTextAnchor(text, pageHeight);\n const verticalWriting = isVerticalWritingText(text);\n const anchor = verticalWriting ? normalizeTextAnchorForVerticalWriting(baseAnchor) : baseAnchor;\n const fontFamily = normalizeFontFamily(text.baseFont ?? text.fontName);\n const fontWeight = text.isBold ? \"700\" : \"400\";\n const fontStyle = text.isItalic ? \"italic\" : \"normal\";\n\n const attrs: string[] = [\n `x=\"${formatSvgNumber(anchor.x)}\"`,\n `y=\"${formatSvgNumber(anchor.y)}\"`,\n `font-size=\"${formatSvgNumber(text.fontSize)}\"`,\n `font-family=\"${escapeXmlAttr(fontFamily)}\"`,\n `font-weight=\"${fontWeight}\"`,\n `font-style=\"${fontStyle}\"`,\n `dominant-baseline=\"${anchor.dominantBaseline}\"`,\n 'xml:space=\"preserve\"',\n ];\n\n if (fillEnabled) {\n attrs.push(`fill=\"${fillPaint.color}\"`);\n if (fillPaint.opacity < 1) {\n attrs.push(`fill-opacity=\"${formatSvgNumber(fillPaint.opacity)}\"`);\n }\n } else {\n attrs.push('fill=\"none\"');\n }\n\n if (strokeEnabled) {\n attrs.push(`stroke=\"${strokePaint.color}\"`);\n attrs.push(`stroke-width=\"${formatSvgNumber(state.lineWidth)}\"`);\n attrs.push(`stroke-linejoin=\"${toSvgLineJoin(state.lineJoin)}\"`);\n if (strokePaint.opacity < 1) {\n attrs.push(`stroke-opacity=\"${formatSvgNumber(strokePaint.opacity)}\"`);\n }\n } else {\n attrs.push('stroke=\"none\"');\n }\n\n if (text.charSpacing !== undefined && text.charSpacing !== 0) {\n attrs.push(`letter-spacing=\"${formatSvgNumber(text.charSpacing)}\"`);\n }\n\n if (verticalWriting) {\n attrs.push('writing-mode=\"vertical-rl\"');\n attrs.push('text-orientation=\"upright\"');\n }\n\n const textScale = normalizeTextScale(text);\n const transform = buildTextTransform(anchor, textScale);\n if (transform) {\n attrs.push(`transform=\"${transform}\"`);\n }\n\n return `<text ${attrs.join(\" \")}${clipPathRef}>${escapeXmlText(text.text)}</text>`;\n}\n\nfunction buildImageTransform(ctm: PdfMatrix, pageHeight: number): readonly number[] {\n const [a, b, c, d, e, f] = ctm;\n\n const topLeft = {\n x: c + e,\n y: pageHeight - (d + f),\n };\n\n const topRight = {\n x: a + c + e,\n y: pageHeight - (b + d + f),\n };\n\n const bottomLeft = {\n x: e,\n y: pageHeight - f,\n };\n\n const xAxis = {\n x: topRight.x - topLeft.x,\n y: topRight.y - topLeft.y,\n };\n\n const yAxis = {\n x: bottomLeft.x - topLeft.x,\n y: bottomLeft.y - topLeft.y,\n };\n\n return [xAxis.x, xAxis.y, yAxis.x, yAxis.y, topLeft.x, topLeft.y] as const;\n}\n\nfunction renderImage(image: PdfImage, pageHeight: number, registry: ClipPathRegistry): string {\n const clipPathRef = getClipPathReference(image.graphicsState.clipBBox, pageHeight, registry);\n const dataUrl = buildPdfImageDataUrl(image);\n const escapedDataUrl = escapeXmlAttr(dataUrl);\n const matrix = buildImageTransform(image.graphicsState.ctm, pageHeight);\n\n const imageMarkup = (\n `<image href=\"${escapedDataUrl}\" xlink:href=\"${escapedDataUrl}\" ` +\n `width=\"1\" height=\"1\" preserveAspectRatio=\"none\" transform=\"matrix(${formatSvgMatrix(matrix)})\" />`\n );\n\n // Chromium-based engines may drop raster rendering when clip-path and transform\n // are both attached to the same <image>. Apply clipping on a wrapper group instead.\n if (clipPathRef.length > 0) {\n return `<g${clipPathRef}>${imageMarkup}</g>`;\n }\n\n return imageMarkup;\n}\n\nfunction renderElement(element: PdfElement, pageHeight: number, registry: ClipPathRegistry): string {\n if (element.type === \"path\") {\n return renderPath(element, pageHeight, registry);\n }\n\n if (element.type === \"text\") {\n return renderText(element, pageHeight, registry);\n }\n\n return renderImage(element, pageHeight, registry);\n}\n\nfunction normalizeDimension(value: number | string): string {\n if (typeof value === \"number\") {\n return formatSvgNumber(value);\n }\n return value;\n}\n\nfunction normalizeBackgroundColor(options: PdfSvgRenderOptions): string {\n if (options.backgroundColor === undefined) {\n return \"#FFFFFF\";\n }\n return options.backgroundColor;\n}\n\nfunction getPreserveAspectRatio(options: PdfSvgRenderOptions): string {\n if (options.preserveAspectRatio === undefined) {\n return \"xMidYMid meet\";\n }\n return options.preserveAspectRatio;\n}\n\n/** Render a single `PdfPage` into standalone SVG markup. */\nexport function renderPdfPageToSvg(page: PdfPage, options: PdfSvgRenderOptions = {}): string {\n if (!page) {\n throw new Error(\"page is required\");\n }\n\n const registry = createClipPathRegistry();\n const bodyParts: string[] = [];\n\n const backgroundColor = normalizeBackgroundColor(options);\n if (backgroundColor !== \"none\" && backgroundColor !== \"transparent\") {\n bodyParts.push(\n `<rect x=\"0\" y=\"0\" width=\"${formatSvgNumber(page.width)}\" height=\"${formatSvgNumber(page.height)}\" fill=\"${escapeXmlAttr(backgroundColor)}\" />`,\n );\n }\n\n for (const element of page.elements) {\n const rendered = renderElement(element, page.height, registry);\n if (rendered.length > 0) {\n bodyParts.push(rendered);\n }\n }\n\n const defs = registry.defs.length > 0 ? `<defs>${registry.defs.join(\"\")}</defs>` : \"\";\n const width = normalizeDimension(options.width ?? page.width);\n const height = normalizeDimension(options.height ?? page.height);\n\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"` +\n ` viewBox=\"0 0 ${formatSvgNumber(page.width)} ${formatSvgNumber(page.height)}\"` +\n ` width=\"${escapeXmlAttr(width)}\" height=\"${escapeXmlAttr(height)}\" preserveAspectRatio=\"${escapeXmlAttr(getPreserveAspectRatio(options))}\">` +\n `${defs}${bodyParts.join(\"\")}</svg>`;\n\n if (options.includeXmlDeclaration) {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>${svg}`;\n }\n\n return svg;\n}\n\nexport function renderPdfDocumentToSvgs(document: PdfDocument, options: PdfSvgRenderOptions = {}): readonly string[] {\n if (!document) {\n throw new Error(\"document is required\");\n }\n\n return document.pages.map((page) => renderPdfPageToSvg(page, options));\n}\n\nexport function renderPdfDocumentPageToSvg(\n document: PdfDocument,\n pageNumber: number,\n options: PdfSvgRenderOptions = {},\n): string {\n if (!document) {\n throw new Error(\"document is required\");\n }\n if (!Number.isInteger(pageNumber) || pageNumber < 1) {\n throw new Error(`pageNumber must be a positive integer: ${pageNumber}`);\n }\n\n const page = document.pages[pageNumber - 1];\n if (!page) {\n throw new Error(`pageNumber ${pageNumber} is out of range`);\n }\n\n return renderPdfPageToSvg(page, options);\n}\n"],"names":["r","g","b","rgb","document"],"mappings":";;AAQA,SAAS,WAAW,OAAyB;AAC3C,UAAQ,MAAM,YAAA;AAAA,IACZ,KAAK,cAAc;AACjB,YAAM,CAAC,OAAO,CAAC,IAAI,MAAM;AACzB,YAAM,CAAC,GAAG,GAAG,CAAC,IAAI,UAAU,IAAI;AAChC,aAAO,IAAI,SAAS,GAAG,GAAG,CAAC,CAAC;AAAA,IAC9B;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,MAAM;AACpC,YAAM,MAAM,cAAc,GAAG,GAAG,CAAC;AACjC,aAAO,IAAI,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAAA,IAC7C;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,MAAM;AAC3C,YAAM,MAAM,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG;AACpC,aAAO,IAAI,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAAA,IAC7C;AAAA,IACA,KAAK,YAAY;AACf,UAAI,MAAM,wBAAwB,cAAc;AAC9C,cAAM,CAAC,OAAO,CAAC,IAAI,MAAM;AACzB,cAAM,CAACA,IAAGC,IAAGC,EAAC,IAAI,UAAU,IAAI;AAChC,eAAO,IAAI,SAASF,IAAGC,IAAGC,EAAC,CAAC;AAAA,MAC9B;AACA,UAAI,MAAM,wBAAwB,cAAc;AAC9C,cAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,MAAM;AAC3C,cAAMC,OAAM,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG;AACpC,eAAO,IAAI,SAASA,KAAI,CAAC,GAAGA,KAAI,CAAC,GAAGA,KAAI,CAAC,CAAC,CAAC;AAAA,MAC7C;AACA,YAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,MAAM;AACpC,YAAM,MAAM,cAAc,GAAG,GAAG,CAAC;AACjC,aAAO,IAAI,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAAA,IAC7C;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEO,SAAS,WAAW,OAAiB,OAAyB;AACnE,SAAO;AAAA,IACL,OAAO,WAAW,KAAK;AAAA,IACvB,SAAS,QAAQ,KAAK;AAAA,EAAA;AAE1B;AChCO,SAAS,OAAO,MAA2B;AAChD,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,CAAC,MAAM,OAAQ,KAAK,CAAC,MAAM,OAAQ,KAAK,CAAC,MAAM;AAC7D;ACZO,SAAS,uBAAuB,UAA6B,OAAe,QAAwB;AACzG,QAAM,aAAa,kBAAkB,UAAU,OAAO,MAAM;AAC5D,SAAO,iBAAiB,YAAY,OAAO,MAAM;AACnD;AAcA,SAAS,iBAAiB,UAA6B,OAAe,QAAwB;AAC5F,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAEhB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,QAAM,SAAS,IAAI,YAAY,SAAS,UAAU;AAClD,QAAM,SAAS,IAAI,kBAAkB,MAAM;AAC3C,SAAO,IAAI,QAAQ;AAEnB,QAAM,YAAY,IAAI,UAAU,QAAQ,OAAO,MAAM;AACrD,MAAI,aAAa,WAAW,GAAG,CAAC;AAEhC,SAAO,OAAO,UAAU,WAAW;AACrC;AAwBA,SAAS,kBAAkB,UAA6B,OAAe,QAAmC;AACxG,QAAM,iBAAiB,QAAQ,SAAS;AACxC,MAAI,SAAS,WAAW,gBAAgB;AACtC,WAAO;AAAA,EACT;AAEA,UAAQ;AAAA,IACN,gDAAgD,cAAc,cAAc,KAAK,IAAI,MAAM,SAAS,SAAS,MAAM;AAAA,EAAA;AAGrH,QAAM,aAAa,IAAI,kBAAkB,cAAc;AACvD,aAAW,IAAI,SAAS,SAAS,GAAG,KAAK,IAAI,SAAS,QAAQ,cAAc,CAAC,CAAC;AAC9E,SAAO;AACT;AC5EO,MAAM,gBAAgB,IAAI,WAAW,CAAC,KAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,EAAI,CAAC;ACQrF,SAAS,MAAM,MAA2B;AAC/C,MAAI,KAAK,SAAS,cAAc,QAAQ;AACtC,WAAO;AAAA,EACT;AACA,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,QAAI,KAAK,CAAC,MAAM,cAAc,CAAC,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;ACrBA,SAAS,mBAAmB,OAAgC;AAC1D,SAAO,MAAM,OAAO,MAAM,MAAM,YAAY,MAAM,aAAa,MAAM,UAAU;AACjF;AAEA,SAAS,kBAAkB,MAAyB,OAAqC;AACvF,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,SAAS;AACjC,MAAI,MAAM,WAAW,YAAY;AAC/B;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,GAAG;AACtC,SAAK,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK;AAAA,EAChC;AACF;AAEA,SAAS,wBAAwB,OAAyB;AACxD,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,EAAE,QAAQ,MAAM,OAAA;AAAA,EAAO;AAEzB,oBAAkB,MAAM,MAAM,KAAK;AACnC,SAAO,uBAAuB,MAAM,MAAM,OAAO,MAAM,MAAM;AAC/D;AAGO,SAAS,qBAAqB,OAAyB;AAC5D,MAAI,OAAO,MAAM,IAAI,GAAG;AACtB,WAAO,UAAU,mBAAmB,MAAM,IAAI,GAAG,YAAY;AAAA,EAC/D;AAEA,MAAI,MAAM,MAAM,IAAI,GAAG;AACrB,WAAO,UAAU,mBAAmB,MAAM,IAAI,GAAG,WAAW;AAAA,EAC9D;AAEA,SAAO,wBAAwB,KAAK;AACtC;ACjDO,SAAS,gBAAgB,OAAuB;AACrD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,UAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,EAClD;AAEA,QAAM,UAAU,KAAK,MAAM,QAAQ,GAAI,IAAI;AAC3C,MAAI,OAAO,GAAG,SAAS,EAAE,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,gBAAgB,QAAmC;AACjE,SAAO,OAAO,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,EAAE,KAAK,GAAG;AAC/D;ACZA,SAAS,OAAO,MAAc,YAA4B;AACxD,SAAO,aAAa;AACtB;AAEA,SAAS,eAAe,OAAiB,YAA4B;AACnE,SAAO,GAAG,gBAAgB,MAAM,CAAC,CAAC,IAAI,gBAAgB,OAAO,MAAM,GAAG,UAAU,CAAC,CAAC;AACpF;AAEA,SAAS,WAAW,MAA4C,YAA4B;AAC1F,QAAM,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAA;AAChC,QAAM,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,OAAO,GAAG,KAAK,EAAA;AAC7C,QAAM,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,OAAO,GAAG,KAAK,IAAI,KAAK,OAAA;AACtD,QAAM,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,OAAA;AACzC,SAAO,KAAK,eAAe,IAAI,UAAU,CAAC,MAAM,eAAe,IAAI,UAAU,CAAC,MAAM,eAAe,IAAI,UAAU,CAAC,MAAM,eAAe,IAAI,UAAU,CAAC;AACxJ;AAEO,SAAS,iBAAiB,MAAe,YAA4B;AAC1E,QAAM,WAAqB,CAAA;AAC3B,QAAM,oBAAgD,EAAE,OAAO,KAAA;AAE/D,aAAW,aAAa,KAAK,YAAY;AACvC,QAAI,UAAU,SAAS,UAAU;AAC/B,eAAS,KAAK,KAAK,eAAe,UAAU,OAAO,UAAU,CAAC,EAAE;AAChE,wBAAkB,QAAQ,UAAU;AACpC;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,UAAU;AAC/B,eAAS,KAAK,KAAK,eAAe,UAAU,OAAO,UAAU,CAAC,EAAE;AAChE,wBAAkB,QAAQ,UAAU;AACpC;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,WAAW;AAChC,eAAS;AAAA,QACP,KAAK,eAAe,UAAU,KAAK,UAAU,CAAC,IAAI,eAAe,UAAU,KAAK,UAAU,CAAC,IAAI,eAAe,UAAU,KAAK,UAAU,CAAC;AAAA,MAAA;AAE1I,wBAAkB,QAAQ,UAAU;AACpC;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,YAAY;AACjC,YAAM,MAAM,kBAAkB,SAAS,UAAU;AACjD,eAAS;AAAA,QACP,KAAK,eAAe,KAAK,UAAU,CAAC,IAAI,eAAe,UAAU,KAAK,UAAU,CAAC,IAAI,eAAe,UAAU,KAAK,UAAU,CAAC;AAAA,MAAA;AAEhI,wBAAkB,QAAQ,UAAU;AACpC;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,YAAY;AACjC,eAAS;AAAA,QACP,KAAK,eAAe,UAAU,KAAK,UAAU,CAAC,IAAI,eAAe,UAAU,KAAK,UAAU,CAAC,IAAI,eAAe,UAAU,KAAK,UAAU,CAAC;AAAA,MAAA;AAE1I,wBAAkB,QAAQ,UAAU;AACpC;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,QAAQ;AAC7B,eAAS,KAAK,WAAW,WAAW,UAAU,CAAC;AAC/C,wBAAkB,QAAQ,EAAE,GAAG,UAAU,GAAG,GAAG,UAAU,EAAA;AACzD;AAAA,IACF;AAEA,aAAS,KAAK,GAAG;AAAA,EACnB;AAEA,SAAO,SAAS,KAAK,GAAG;AAC1B;ACvEA,MAAM,oBAAoB;AAAA,EACxB,EAAE,MAAM,MAAM,IAAI,QAAA;AAAA,EAClB,EAAE,MAAM,MAAM,IAAI,OAAA;AAAA,EAClB,EAAE,MAAM,MAAM,IAAI,OAAA;AACpB;AAEA,MAAM,oBAAoB;AAAA,EACxB,GAAG;AAAA,EACH,EAAE,MAAM,MAAM,IAAI,SAAA;AAAA,EAClB,EAAE,MAAM,MAAM,IAAI,SAAA;AACpB;AAEO,SAAS,cAAc,OAAuB;AACnD,MAAI,UAAU;AACd,aAAW,WAAW,mBAAmB;AACvC,cAAU,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,EAAE;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAuB;AACnD,MAAI,UAAU;AACd,aAAW,WAAW,mBAAmB;AACvC,cAAU,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,EAAE;AAAA,EACpD;AACA,SAAO;AACT;ACAA,SAAS,yBAA2C;AAClD,SAAO;AAAA,IACL,8BAAc,IAAA;AAAA,IACd,MAAM,CAAA;AAAA,IACN,QAAQ;AAAA,EAAA;AAEZ;AAEA,SAAS,aAAa,KAA8C;AAClE,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAgD;AACrE,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AACA,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAuB;AACxC,SAAO,KAAK,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,EAAE,KAAK,GAAG;AAC7D;AAEA,SAAS,cAAc,MAAe,YAKnC;AACD,QAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AACzB,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAC5B,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAC5B,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAC5B,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE;AAE5B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,aAAa;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EAAA;AAEnB;AAEA,SAAS,qBACP,UACA,YACA,UACQ;AACR,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,UAAU,QAAQ;AAC9B,QAAM,WAAW,SAAS,SAAS,IAAI,GAAG;AAC1C,MAAI,UAAU;AACZ,WAAO,oBAAoB,QAAQ;AAAA,EACrC;AAEA,QAAM,KAAK,YAAY,SAAS,MAAM;AACtC,WAAS,UAAU;AACnB,WAAS,SAAS,IAAI,KAAK,EAAE;AAE7B,QAAM,OAAO,cAAc,UAAU,UAAU;AAC/C,WAAS,KAAK;AAAA,IACZ,iBAAiB,EAAE,cAAc,gBAAgB,KAAK,CAAC,CAAC,QAAQ,gBAAgB,KAAK,CAAC,CAAC,YAAY,gBAAgB,KAAK,KAAK,CAAC,aAAa,gBAAgB,KAAK,MAAM,CAAC;AAAA,EAAA;AAGzK,SAAO,oBAAoB,EAAE;AAC/B;AAEA,SAAS,WAAW,MAAe,YAAoB,UAAoC;AACzF,MAAI,KAAK,YAAY,UAAU,KAAK,YAAY,QAAQ;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,iBAAiB,MAAM,UAAU;AAC3C,MAAI,EAAE,WAAW,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK;AACnB,QAAM,cAAc,qBAAqB,MAAM,UAAU,YAAY,QAAQ;AAE7E,QAAM,cAAc,KAAK,YAAY,UAAU,KAAK,YAAY;AAChE,QAAM,gBAAgB,KAAK,YAAY,YAAY,KAAK,YAAY;AAEpE,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,aAAa,MAAM,iBAAiB,EAAE;AAC1F,QAAM,cAAc,WAAW,MAAM,aAAa,MAAM,eAAe,MAAM,iBAAiB,EAAE;AAEhG,QAAM,QAAkB,CAAC,MAAM,cAAc,CAAC,CAAC,GAAG;AAElD,MAAI,aAAa;AACf,UAAM,KAAK,SAAS,UAAU,KAAK,GAAG;AACtC,QAAI,UAAU,UAAU,GAAG;AACzB,YAAM,KAAK,iBAAiB,gBAAgB,UAAU,OAAO,CAAC,GAAG;AAAA,IACnE;AAAA,EACF,OAAO;AACL,UAAM,KAAK,aAAa;AAAA,EAC1B;AAEA,MAAI,eAAe;AACjB,UAAM,KAAK,WAAW,YAAY,KAAK,GAAG;AAC1C,UAAM,KAAK,iBAAiB,gBAAgB,MAAM,SAAS,CAAC,GAAG;AAC/D,UAAM,KAAK,mBAAmB,aAAa,MAAM,OAAO,CAAC,GAAG;AAC5D,UAAM,KAAK,oBAAoB,cAAc,MAAM,QAAQ,CAAC,GAAG;AAC/D,UAAM,KAAK,sBAAsB,gBAAgB,MAAM,UAAU,CAAC,GAAG;AACrE,QAAI,YAAY,UAAU,GAAG;AAC3B,YAAM,KAAK,mBAAmB,gBAAgB,YAAY,OAAO,CAAC,GAAG;AAAA,IACvE;AACA,QAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,YAAM,KAAK,qBAAqB,MAAM,UAAU,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG;AACnG,UAAI,MAAM,cAAc,GAAG;AACzB,cAAM,KAAK,sBAAsB,gBAAgB,MAAM,SAAS,CAAC,GAAG;AAAA,MACtE;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,KAAK,eAAe;AAAA,EAC5B;AAEA,SAAO,SAAS,MAAM,KAAK,GAAG,CAAC,GAAG,WAAW;AAC/C;AAEA,SAAS,gBAAgB,MAAe,YAA4B;AAClE,SAAO,cAAc,KAAK,IAAI,KAAK;AACrC;AAUA,SAAS,0BACP,MACA,YAKQ;AACR,QAAM,SAAS,KAAK;AACpB,QAAM,SAAS,KAAK;AACpB,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,KAAK;AAElB,MACE,WAAW,UACX,WAAW,UACX,SAAS,UACT,SAAS,UACT,CAAC,OAAO,SAAS,MAAM,KACvB,CAAC,OAAO,SAAS,MAAM,KACvB,CAAC,OAAO,SAAS,IAAI,KACrB,CAAC,OAAO,SAAS,IAAI,GACrB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,iBAAiB,KAAK,MAAM,IAAI,EAAE;AACxC,MAAI,CAAC,OAAO,SAAS,cAAc,KAAK,kBAAkB,MAAM;AAC9D,WAAO;AAAA,EACT;AAGA,QAAM,WAAY,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,MAAO,KAAK;AACpD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,aAAa;AAAA,IAChB;AAAA,EAAA;AAEJ;AAEA,SAAS,kBAAkB,MAAe,YAAgC;AACxE,QAAM,iBAAiB,0BAA0B,MAAM,UAAU;AACjE,MAAI,gBAAgB;AAClB,WAAO;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,GAAG,eAAe;AAAA,MAClB,kBAAkB;AAAA,MAClB,UAAU,eAAe;AAAA,MACzB,cAAc;AAAA,IAAA;AAAA,EAElB;AAEA,SAAO;AAAA,IACL,GAAG,KAAK;AAAA,IACR,GAAG,gBAAgB,MAAM,UAAU;AAAA,IACnC,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,cAAc;AAAA,EAAA;AAElB;AAEA,SAAS,sBAAsB,MAAwB;AACrD,SAAO,KAAK,gBAAgB;AAC9B;AAEA,SAAS,sCAAsC,QAAgC;AAC7E,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO,EAAE,GAAG,QAAQ,kBAAkB,mBAAA;AAAA,EACxC;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,kBAAkB;AAAA;AAAA;AAAA,IAGlB,UAAU,OAAO,WAAW;AAAA,EAAA;AAEhC;AAEA,SAAS,mBAAmB,MAAuB;AACjD,QAAM,UAAU,KAAK;AACrB,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,UAAU;AACnB;AAEA,SAAS,mBAAmB,QAAoB,WAAkC;AAChF,QAAM,cAAc,KAAK,IAAI,OAAO,QAAQ,IAAI;AAChD,QAAM,WAAW,KAAK,IAAI,YAAY,CAAC,IAAI;AAE3C,MAAI,CAAC,eAAe,CAAC,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa;AAChB,UAAM,aAAa,gBAAgB,OAAO,CAAC;AAC3C,UAAM,oBAAoB,gBAAgB,CAAC,OAAO,CAAC;AACnD,WAAO,aAAa,UAAU,aAAa,gBAAgB,SAAS,CAAC,iBAAiB,iBAAiB;AAAA,EACzG;AAEA,MAAI,CAAC,UAAU;AACb,WAAO,UAAU,gBAAgB,OAAO,QAAQ,CAAC,IAAI,gBAAgB,OAAO,CAAC,CAAC,IAAI,gBAAgB,OAAO,CAAC,CAAC;AAAA,EAC7G;AAEA,QAAM,UAAU,gBAAgB,OAAO,CAAC;AACxC,QAAM,UAAU,gBAAgB,OAAO,CAAC;AACxC,QAAM,iBAAiB,gBAAgB,CAAC,OAAO,CAAC;AAChD,QAAM,iBAAiB,gBAAgB,CAAC,OAAO,CAAC;AAChD,SACE,aAAa,OAAO,IAAI,OAAO,YAAY,gBAAgB,OAAO,QAAQ,CAAC,WAClE,gBAAgB,SAAS,CAAC,iBAAiB,cAAc,IAAI,cAAc;AAExF;AAEA,SAAS,WAAW,MAAe,YAAoB,UAAoC;AACzF,MAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK;AACnB,QAAM,cAAc,qBAAqB,MAAM,UAAU,YAAY,QAAQ;AAE7E,QAAM,cAAc,MAAM,sBAAsB,KAAK,MAAM,sBAAsB,KAAK,MAAM,sBAAsB,KAAK,MAAM,sBAAsB;AACnJ,QAAM,gBAAgB,MAAM,sBAAsB,KAAK,MAAM,sBAAsB,KAAK,MAAM,sBAAsB,KAAK,MAAM,sBAAsB;AAErJ,MAAI,CAAC,eAAe,CAAC,eAAe;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,aAAa,MAAM,iBAAiB,EAAE;AAC1F,QAAM,cAAc,WAAW,MAAM,aAAa,MAAM,eAAe,MAAM,iBAAiB,EAAE;AAChG,QAAM,aAAa,kBAAkB,MAAM,UAAU;AACrD,QAAM,kBAAkB,sBAAsB,IAAI;AAClD,QAAM,SAAS,kBAAkB,sCAAsC,UAAU,IAAI;AACrF,QAAM,aAAa,oBAAoB,KAAK,YAAY,KAAK,QAAQ;AACrE,QAAM,aAAa,KAAK,SAAS,QAAQ;AACzC,QAAM,YAAY,KAAK,WAAW,WAAW;AAE7C,QAAM,QAAkB;AAAA,IACtB,MAAM,gBAAgB,OAAO,CAAC,CAAC;AAAA,IAC/B,MAAM,gBAAgB,OAAO,CAAC,CAAC;AAAA,IAC/B,cAAc,gBAAgB,KAAK,QAAQ,CAAC;AAAA,IAC5C,gBAAgB,cAAc,UAAU,CAAC;AAAA,IACzC,gBAAgB,UAAU;AAAA,IAC1B,eAAe,SAAS;AAAA,IACxB,sBAAsB,OAAO,gBAAgB;AAAA,IAC7C;AAAA,EAAA;AAGF,MAAI,aAAa;AACf,UAAM,KAAK,SAAS,UAAU,KAAK,GAAG;AACtC,QAAI,UAAU,UAAU,GAAG;AACzB,YAAM,KAAK,iBAAiB,gBAAgB,UAAU,OAAO,CAAC,GAAG;AAAA,IACnE;AAAA,EACF,OAAO;AACL,UAAM,KAAK,aAAa;AAAA,EAC1B;AAEA,MAAI,eAAe;AACjB,UAAM,KAAK,WAAW,YAAY,KAAK,GAAG;AAC1C,UAAM,KAAK,iBAAiB,gBAAgB,MAAM,SAAS,CAAC,GAAG;AAC/D,UAAM,KAAK,oBAAoB,cAAc,MAAM,QAAQ,CAAC,GAAG;AAC/D,QAAI,YAAY,UAAU,GAAG;AAC3B,YAAM,KAAK,mBAAmB,gBAAgB,YAAY,OAAO,CAAC,GAAG;AAAA,IACvE;AAAA,EACF,OAAO;AACL,UAAM,KAAK,eAAe;AAAA,EAC5B;AAEA,MAAI,KAAK,gBAAgB,UAAa,KAAK,gBAAgB,GAAG;AAC5D,UAAM,KAAK,mBAAmB,gBAAgB,KAAK,WAAW,CAAC,GAAG;AAAA,EACpE;AAEA,MAAI,iBAAiB;AACnB,UAAM,KAAK,4BAA4B;AACvC,UAAM,KAAK,4BAA4B;AAAA,EACzC;AAEA,QAAM,YAAY,mBAAmB,IAAI;AACzC,QAAM,YAAY,mBAAmB,QAAQ,SAAS;AACtD,MAAI,WAAW;AACb,UAAM,KAAK,cAAc,SAAS,GAAG;AAAA,EACvC;AAEA,SAAO,SAAS,MAAM,KAAK,GAAG,CAAC,GAAG,WAAW,IAAI,cAAc,KAAK,IAAI,CAAC;AAC3E;AAEA,SAAS,oBAAoB,KAAgB,YAAuC;AAClF,QAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI;AAE3B,QAAM,UAAU;AAAA,IACd,GAAG,IAAI;AAAA,IACP,GAAG,cAAc,IAAI;AAAA,EAAA;AAGvB,QAAM,WAAW;AAAA,IACf,GAAG,IAAI,IAAI;AAAA,IACX,GAAG,cAAc,IAAI,IAAI;AAAA,EAAA;AAG3B,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,GAAG,aAAa;AAAA,EAAA;AAGlB,QAAM,QAAQ;AAAA,IACZ,GAAG,SAAS,IAAI,QAAQ;AAAA,IACxB,GAAG,SAAS,IAAI,QAAQ;AAAA,EAAA;AAG1B,QAAM,QAAQ;AAAA,IACZ,GAAG,WAAW,IAAI,QAAQ;AAAA,IAC1B,GAAG,WAAW,IAAI,QAAQ;AAAA,EAAA;AAG5B,SAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAClE;AAEA,SAAS,YAAY,OAAiB,YAAoB,UAAoC;AAC5F,QAAM,cAAc,qBAAqB,MAAM,cAAc,UAAU,YAAY,QAAQ;AAC3F,QAAM,UAAU,qBAAqB,KAAK;AAC1C,QAAM,iBAAiB,cAAc,OAAO;AAC5C,QAAM,SAAS,oBAAoB,MAAM,cAAc,KAAK,UAAU;AAEtE,QAAM,cACJ,gBAAgB,cAAc,iBAAiB,cAAc,uEACQ,gBAAgB,MAAM,CAAC;AAK9F,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO,KAAK,WAAW,IAAI,WAAW;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAqB,YAAoB,UAAoC;AAClG,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO,WAAW,SAAS,YAAY,QAAQ;AAAA,EACjD;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO,WAAW,SAAS,YAAY,QAAQ;AAAA,EACjD;AAEA,SAAO,YAAY,SAAS,YAAY,QAAQ;AAClD;AAEA,SAAS,mBAAmB,OAAgC;AAC1D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAsC;AACtE,MAAI,QAAQ,oBAAoB,QAAW;AACzC,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,uBAAuB,SAAsC;AACpE,MAAI,QAAQ,wBAAwB,QAAW;AAC7C,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;AAGO,SAAS,mBAAmB,MAAe,UAA+B,IAAY;AAC3F,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,QAAM,WAAW,uBAAA;AACjB,QAAM,YAAsB,CAAA;AAE5B,QAAM,kBAAkB,yBAAyB,OAAO;AACxD,MAAI,oBAAoB,UAAU,oBAAoB,eAAe;AACnE,cAAU;AAAA,MACR,4BAA4B,gBAAgB,KAAK,KAAK,CAAC,aAAa,gBAAgB,KAAK,MAAM,CAAC,WAAW,cAAc,eAAe,CAAC;AAAA,IAAA;AAAA,EAE7I;AAEA,aAAW,WAAW,KAAK,UAAU;AACnC,UAAM,WAAW,cAAc,SAAS,KAAK,QAAQ,QAAQ;AAC7D,QAAI,SAAS,SAAS,GAAG;AACvB,gBAAU,KAAK,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,SAAS,KAAK,KAAK,EAAE,CAAC,YAAY;AACnF,QAAM,QAAQ,mBAAmB,QAAQ,SAAS,KAAK,KAAK;AAC5D,QAAM,SAAS,mBAAmB,QAAQ,UAAU,KAAK,MAAM;AAE/D,QAAM,MACJ,mGACiB,gBAAgB,KAAK,KAAK,CAAC,IAAI,gBAAgB,KAAK,MAAM,CAAC,YACjE,cAAc,KAAK,CAAC,aAAa,cAAc,MAAM,CAAC,0BAA0B,cAAc,uBAAuB,OAAO,CAAC,CAAC,KACtI,IAAI,GAAG,UAAU,KAAK,EAAE,CAAC;AAE9B,MAAI,QAAQ,uBAAuB;AACjC,WAAO,yCAAyC,GAAG;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwBC,WAAuB,UAA+B,IAAuB;AACnH,MAAI,CAACA,WAAU;AACb,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,SAAOA,UAAS,MAAM,IAAI,CAAC,SAAS,mBAAmB,MAAM,OAAO,CAAC;AACvE;AAEO,SAAS,2BACdA,WACA,YACA,UAA+B,CAAA,GACvB;AACR,MAAI,CAACA,WAAU;AACb,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AACA,MAAI,CAAC,OAAO,UAAU,UAAU,KAAK,aAAa,GAAG;AACnD,UAAM,IAAI,MAAM,0CAA0C,UAAU,EAAE;AAAA,EACxE;AAEA,QAAM,OAAOA,UAAS,MAAM,aAAa,CAAC;AAC1C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,cAAc,UAAU,kBAAkB;AAAA,EAC5D;AAEA,SAAO,mBAAmB,MAAM,OAAO;AACzC;"}
|