@boxpdf/html-writer 0.1.21 → 0.1.22

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/semantic-caption.ts","../src/semantic-document.ts","../src/semantic-inline.ts","../src/vector-svg.ts","../src/visual-font.ts","../src/semantic-media.ts"],"sourcesContent":["import type {\n EmbeddedType3Font,\n ExtractedPage,\n RasterImage,\n TextSpan,\n Type3Glyph,\n} from \"@boxpdf/reader\";\nimport { type SemanticBlock, structurePage, tableToHtml } from \"@boxpdf/reader/structure\";\nimport { clearMediaCaptionAssociations } from \"./semantic-caption.js\";\nimport { type SemanticDocumentStats, writeSemanticDocument } from \"./semantic-document.js\";\nimport { dominantTextColor, semanticTextHtml } from \"./semantic-inline.js\";\nimport {\n type HtmlImageAsset,\n type HtmlImageOptions,\n prepareSemanticMedia,\n type SemanticMedia,\n withoutSemanticMediaSpans,\n} from \"./semantic-media.js\";\nimport {\n isSvgPath,\n vectorFillSvg,\n vectorPathClipDefinitions,\n vectorPathSvg,\n} from \"./vector-svg.js\";\nimport { base64, visualFontAliases, visualFontFace, visualFontStyles } from \"./visual-font.js\";\n\nexport type { SemanticDocumentStats } from \"./semantic-document.js\";\nexport type { HtmlImageAsset, HtmlImageOptions } from \"./semantic-media.js\";\n\nexport type HtmlLayout = \"positioned\" | \"flow\";\nexport type HtmlProfile = \"visual\" | \"semantic\";\nexport type HtmlWrite = (chunk: string) => void | Promise<void>;\n\nexport interface HtmlWriterOptions {\n /** Output intent. Visual preserves page presentation; semantic prioritizes reading order. */\n profile?: HtmlProfile;\n /** @deprecated Use `profile: \"visual\"` or `profile: \"semantic\"`. */\n layout?: HtmlLayout;\n title?: string;\n language?: string;\n includeDocument?: boolean;\n includeStyles?: boolean;\n /** Maximum extracted page models retained for document-level semantic decisions. */\n semanticLookaheadPages?: number;\n /** Receives bounded-buffer and document-inference statistics after semantic output completes. */\n onSemanticStats?: (stats: Readonly<SemanticDocumentStats>) => void;\n /** Semantic defaults to excluded; visual defaults to embedded. */\n imageOptions?: HtmlImageOptions;\n /** Receives each named asset when imageOptions is references. */\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>;\n}\n\nexport interface MarkdownWriterOptions {\n semanticLookaheadPages?: number;\n onSemanticStats?: (stats: Readonly<SemanticDocumentStats>) => void;\n /** Defaults to excluded. */\n imageOptions?: HtmlImageOptions;\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>;\n}\n\nconst styles = `.pdf-document{margin:0 auto}.pdf-page{box-sizing:border-box;margin:1rem auto;background:#fff;color:#000}.pdf-page--visual,.pdf-page--positioned{position:relative;overflow:hidden}.pdf-page-content{position:absolute;transform-origin:0 0}.pdf-span{position:absolute;white-space:pre;transform-origin:left bottom;unicode-bidi:isolate}.pdf-span[data-direction=ttb]{writing-mode:vertical-rl}.pdf-page--semantic,.pdf-page--flow{max-width:60rem;padding:1rem}.pdf-page--semantic p,.pdf-page--flow p{white-space:pre-wrap;unicode-bidi:plaintext}.pdf-semantic-document h1,.pdf-page--semantic h1{font-size:1.7em}.pdf-semantic-document h2,.pdf-page--semantic h2{font-size:1.5em}.pdf-semantic-document h3,.pdf-page--semantic h3{font-size:1.35em}.pdf-semantic-document h4,.pdf-page--semantic h4{font-size:1.1em}.pdf-page table{border-collapse:collapse}.pdf-page td{padding:.15rem .4rem;vertical-align:top}`;\n\nexport async function writeHtmlDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n const includeDocument = options.includeDocument ?? true;\n if (includeDocument) {\n await write(\"<!doctype html><html\");\n await write(\n ` lang=\"${escapeAttribute(options.language ?? \"en\")}\"><head><meta charset=\"utf-8\">`,\n );\n await write('<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">');\n await write(`<title>${escapeHtml(options.title ?? \"PDF document\")}</title>`);\n if (options.includeStyles ?? true) await write(`<style>${styles}</style>`);\n await write(\"</head><body>\");\n }\n await write('<main class=\"pdf-document\">');\n const profile = resolveProfile(options);\n const imageOptions = resolveImageOptions(profile, options);\n validateImageOptions(imageOptions, options);\n if (profile === \"semantic\") {\n const lookahead = semanticLookahead(options.semanticLookaheadPages);\n const stats = await writeSemanticDocument(\n pages,\n write,\n lookahead,\n imageOptions,\n options.onImage,\n );\n options.onSemanticStats?.(stats);\n } else {\n for await (const page of pages) await writePage(page, write, options);\n }\n await write(\"</main>\");\n if (includeDocument) await write(\"</body></html>\");\n}\n\n/** Streams reflowed Markdown from the same bounded semantic inference used by semantic HTML. */\nexport async function writeMarkdownDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: HtmlWrite,\n options: MarkdownWriterOptions = {},\n): Promise<void> {\n const imageOptions = options.imageOptions ?? \"excluded\";\n validateImageOptions(imageOptions, options);\n const lookahead = semanticLookahead(options.semanticLookaheadPages);\n const stats = await writeSemanticDocument(\n pages,\n write,\n lookahead,\n imageOptions,\n options.onImage,\n \"markdown\",\n );\n options.onSemanticStats?.(stats);\n}\n\nfunction semanticLookahead(value: number | undefined): number {\n const lookahead = value ?? 4;\n if (!Number.isSafeInteger(lookahead) || lookahead < 1 || lookahead > 16) {\n throw new RangeError(\"semanticLookaheadPages must be an integer between 1 and 16\");\n }\n return lookahead;\n}\n\nexport async function writePage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n const profile = resolveProfile(options);\n validateImageOptions(resolveImageOptions(profile, options), options);\n if (profile === \"semantic\") await writeFlowPage(page, write, options);\n else await writePositionedPage(page, write, options);\n}\n\nexport async function pageToHtml(\n page: ExtractedPage,\n options: HtmlWriterOptions = {},\n): Promise<string> {\n let output = \"\";\n await writePage(\n page,\n (chunk) => {\n output += chunk;\n },\n options,\n );\n return output;\n}\n\nasync function writePositionedPage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions,\n): Promise<void> {\n const imageOptions = resolveImageOptions(\"visual\", options);\n const visualImages = await prepareVisualImages(page, imageOptions, options.onImage);\n const visualSpans = coalesceVisualSpans(page.visualSpans ?? page.spans);\n const reflectedOverlay = usesReflectedVisualOverlay(page, visualSpans);\n const quarterTurn = page.rotate === 90 || page.rotate === 270;\n const displayWidth = quarterTurn ? page.height : page.width;\n const displayHeight = quarterTurn ? page.width : page.height;\n await write(\n `<section class=\"pdf-page pdf-page--visual pdf-page--positioned\" data-page=\"${page.number}\" data-rotate=\"${page.rotate}\" style=\"width:${number(displayWidth)}pt;height:${number(displayHeight)}pt\">`,\n );\n const fontAliases = visualFontAliases(page.number, page.fonts ?? []);\n const type3Fonts = new Map(\n (page.fonts ?? [])\n .filter((font): font is EmbeddedType3Font => font.format === \"type3\")\n .map((font) => [font.id, font]),\n );\n const textClasses =\n (options.includeStyles ?? true)\n ? visualTextClasses(page.number, visualSpans, fontAliases)\n : undefined;\n if ((options.includeStyles ?? true) && page.fonts?.length) {\n await write(\n `<style>${page.fonts.map((font) => visualFontFace(font, fontAliases)).join(\"\")}</style>`,\n );\n }\n if (textClasses?.css) await write(`<style>${textClasses.css}</style>`);\n await write(\n `<div class=\"pdf-page-content pdf-page-content--${page.rotate}\" style=\"width:${number(page.width)}pt;height:${number(page.height)}pt${rotationTransform(page)}\">`,\n );\n await write(\n `<svg class=\"pdf-visual-text\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${number(page.width)}pt\" height=\"${number(page.height)}pt\" viewBox=\"0 0 ${number(page.width)} ${number(page.height)}\">`,\n );\n const clipDefinitions =\n imageClipDefinitions(\n imageOptions === \"excluded\" ? [] : (page.images ?? []),\n page.number,\n page.height,\n ) +\n vectorPathClipDefinitions(\n (page.paths ?? []).map((path, index) => ({ path, index })),\n page.number,\n );\n if (clipDefinitions) await write(`<defs>${clipDefinitions}</defs>`);\n if (reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n const source = visualImages[index];\n if (source) await write(visualImage(image, page.height, page.number, index, source));\n }\n }\n if (page.fills?.length || page.paths?.length) {\n await write(`<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">`);\n for (const fill of page.fills ?? []) await write(vectorFillSvg(fill));\n for (const [pathIndex, path] of (page.paths ?? []).entries()) {\n await write(vectorPathSvg(path, page.number, pathIndex));\n }\n await write(\"</g>\");\n }\n if (!reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n const source = visualImages[index];\n if (source) await write(visualImage(image, page.height, page.number, index, source));\n }\n }\n for (let spanIndex = 0; spanIndex < visualSpans.length; spanIndex += 1) {\n const span = visualSpans[spanIndex];\n if (!span) continue;\n if (!usesPositionedSpan(span)) {\n const type3 = span.fontAssetId ? type3Fonts.get(span.fontAssetId) : undefined;\n const line =\n !type3 && textClasses\n ? visualTextLine(visualSpans, spanIndex, textClasses.names, page.height, fontAliases)\n : undefined;\n if (line) {\n await write(line.html);\n spanIndex = line.endIndex;\n continue;\n }\n await write(\n type3\n ? visualType3Text(span, type3, page.height)\n : visualText(\n span,\n page.height,\n fontAliases,\n reflectedOverlay && page.rotate === 180,\n textClasses?.names,\n ),\n );\n }\n }\n await write(\"</svg>\");\n for (const span of visualSpans) {\n if (usesPositionedSpan(span)) await write(positionedSpan(span, fontAliases));\n }\n await write(\"</div></section>\");\n}\n\n/**\n * PDF producers commonly show every word with a separate text operator. Keeping\n * those operators as separate SVG elements is needlessly expensive for browsers,\n * so join only the spans whose combined geometry can still be represented by one\n * SVG textLength. Anything unusual keeps the original lossless representation.\n */\nfunction coalesceVisualSpans(spans: TextSpan[]): TextSpan[] {\n const output: TextSpan[] = [];\n for (const span of spans) {\n const previous = output.at(-1);\n if (!previous || !canCoalesceVisualSpans(previous, span)) {\n output.push(span);\n continue;\n }\n output[output.length - 1] = {\n ...previous,\n text: previous.text + span.text,\n bounds: {\n ...previous.bounds,\n width: span.bounds.x + span.bounds.width - previous.bounds.x,\n height: Math.max(previous.bounds.height, span.bounds.height),\n },\n };\n }\n return output;\n}\n\nfunction canCoalesceVisualSpans(left: TextSpan, right: TextSpan): boolean {\n if (usesPositionedSpan(left) || usesPositionedSpan(right)) return false;\n if (left.direction !== \"ltr\" || right.direction !== \"ltr\") return false;\n // Guardian fallback text sits just outside the safe whole-span width model.\n if (/guardian/i.test(left.fontFamily ?? \"\")) return false;\n if (left.glyphCodes || right.glyphCodes) return false;\n if (!sameVisualTextState(left, right)) return false;\n const tolerance = Math.max(0.02, left.fontSize * 0.015);\n if (Math.abs(left.bounds.y - right.bounds.y) > tolerance) return false;\n const gap = right.bounds.x - (left.bounds.x + left.bounds.width);\n return !right.hasLeadingSpace && gap >= -tolerance && gap <= tolerance;\n}\n\nfunction sameVisualTextState(left: TextSpan, right: TextSpan): boolean {\n return (\n Math.abs(left.fontSize - right.fontSize) <= 0.001 &&\n left.fontName === right.fontName &&\n left.fontFamily === right.fontFamily &&\n left.fontAssetId === right.fontAssetId &&\n left.color === right.color &&\n left.fillOpacity === right.fillOpacity &&\n left.strokeColor === right.strokeColor &&\n left.strokeWidth === right.strokeWidth &&\n left.strokeOpacity === right.strokeOpacity &&\n left.renderingMode === right.renderingMode &&\n sameTransform(left.transform, right.transform)\n );\n}\n\nfunction sameTransform(left: TextSpan[\"transform\"], right: TextSpan[\"transform\"]): boolean {\n if (!left || !right) return left === right;\n return left.every((value, index) => Math.abs(value - (right[index] ?? 0)) <= 0.000_001);\n}\n\nfunction visualTextClasses(\n pageNumber: number,\n spans: TextSpan[],\n fontAliases: Map<string, string>,\n): { css: string; names: Map<string, string> } {\n const names = new Map<string, string>();\n let css = \"\";\n for (const span of spans) {\n if (usesPositionedSpan(span) || span.glyphCodes) {\n continue;\n }\n const style = visualTextClassStyle(span, fontAliases);\n if (!style || names.has(style)) continue;\n const name = `boxpdf-p${number(pageNumber)}-t${names.size + 1}`;\n names.set(style, name);\n css += `.${name}{${style}}`;\n }\n return { css, names };\n}\n\nfunction visualTextLine(\n spans: TextSpan[],\n startIndex: number,\n styleClasses: Map<string, string>,\n pageHeight: number,\n fontAliases: Map<string, string>,\n): { html: string; endIndex: number } | undefined {\n const first = spans[startIndex];\n if (!first || !canGroupVisualTextLine(first)) return undefined;\n const style = visualTextClassStyle(first, fontAliases);\n const className = styleClasses.get(style);\n if (!className) return undefined;\n let endIndex = startIndex;\n while (endIndex + 1 < spans.length) {\n const next = spans[endIndex + 1];\n if (\n !next ||\n !canGroupVisualTextLine(next) ||\n Math.abs(next.bounds.y - first.bounds.y) > 0.001 ||\n visualTextClassStyle(next, fontAliases) !== style\n ) {\n break;\n }\n endIndex += 1;\n }\n if (endIndex === startIndex) return undefined;\n const baseline = pageHeight - first.bounds.y;\n const lineSpans = spans.slice(startIndex, endIndex + 1);\n const content = lineSpans\n .map((span, index) =>\n visualTextTspan(span, index > 0 ? textSpanGap(lineSpans[index - 1], span) : undefined),\n )\n .join(\"\");\n return {\n html: `<text class=\"${className}\" x=\"${number(first.bounds.x)}\" y=\"${number(baseline)}\">${content}</text>`,\n endIndex,\n };\n}\n\nfunction visualTextTspan(span: TextSpan, dx: number | undefined): string {\n const extent = span.bounds.width;\n const offset = dx === undefined || number(dx) === \"0\" ? \"\" : ` dx=\"${number(dx)}\"`;\n const length =\n extent > 0\n ? ` textLength=\"${number(extent)}\" lengthAdjust=\"${usesSpacingAdjustment(span) ? \"spacing\" : \"spacingAndGlyphs\"}\"`\n : \"\";\n return `<tspan${offset}${length}>${escapeHtml(span.text)}</tspan>`;\n}\n\nfunction textSpanGap(previous: TextSpan | undefined, current: TextSpan): number {\n if (!previous) return 0;\n const gap = current.bounds.x - (previous.bounds.x + previous.bounds.width);\n const adjustment = current.textAdjustmentBefore;\n return adjustment !== undefined && Math.abs(adjustment - gap) <= 0.001 ? adjustment : gap;\n}\n\nfunction canGroupVisualTextLine(span: TextSpan): boolean {\n return (\n !usesPositionedSpan(span) &&\n !span.glyphCodes &&\n span.direction === \"ltr\" &&\n !isHebrewPaintOrder(span) &&\n !hasNonIdentityTransform(span.transform) &&\n span.renderingMode !== 3 &&\n span.renderingMode !== 7 &&\n (span.fontAssetId !== undefined || !isAdobeCjkFont(span.fontFamily))\n );\n}\n\nfunction usesReflectedVisualOverlay(page: ExtractedPage, spans: TextSpan[]): boolean {\n return (\n Boolean(page.images?.length) &&\n Boolean(page.paths?.length || page.fills?.length) &&\n spans.length > 0 &&\n spans.every(\n (span) =>\n span.transform !== undefined &&\n Math.abs(span.transform[0] + 1) < 0.000_001 &&\n Math.abs(span.transform[1]) < 0.000_001 &&\n Math.abs(span.transform[2]) < 0.000_001 &&\n Math.abs(span.transform[3] - 1) < 0.000_001,\n )\n );\n}\n\nfunction visualImage(\n image: RasterImage,\n pageHeight: number,\n pageNumber: number,\n imageIndex: number,\n source: string,\n): string {\n const [a, b, c, d, e, f] = image.transform;\n const transform = [a, -b, -c, d, c + e, pageHeight - d - f].map(number).join(\" \");\n const opacity = isUnitInterval(image.opacity) ? ` opacity=\"${number(image.opacity)}\"` : \"\";\n let output = `<image width=\"1\" height=\"1\" preserveAspectRatio=\"none\" transform=\"matrix(${transform})\" href=\"${source}\"${opacity}/>`;\n for (let index = (image.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${imageClipId(pageNumber, imageIndex, index)})\">${output}</g>`;\n }\n return output;\n}\n\nasync function prepareVisualImages(\n page: ExtractedPage,\n imageOptions: HtmlImageOptions,\n onImage: HtmlWriterOptions[\"onImage\"],\n): Promise<string[]> {\n if (imageOptions === \"excluded\") return [];\n const sources: string[] = [];\n for (const [index, image] of (page.images ?? []).entries()) {\n const mimeType = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n if (imageOptions === \"embedded\") {\n sources.push(`data:${mimeType};base64,${base64(data)}`);\n continue;\n }\n const extension = image.format === \"jpeg\" ? \"jpg\" : \"bmp\";\n const name = `page-${page.number}-image-${index + 1}.${extension}`;\n await onImage?.({ name, mimeType, data });\n sources.push(name);\n }\n return sources;\n}\n\nfunction imageClipDefinitions(\n images: RasterImage[],\n pageNumber: number,\n pageHeight: number,\n): string {\n return images\n .flatMap((image, imageIndex) =>\n (image.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const fillRule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${imageClipId(pageNumber, imageIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\" transform=\"translate(0 ${number(pageHeight)}) scale(1 -1)\"${fillRule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nfunction imageClipId(pageNumber: number, imageIndex: number, clipIndex: number): string {\n return `boxpdf-clip-${pageNumber}-${imageIndex}-${clipIndex}`;\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output[0] = 0x42;\n output[1] = 0x4d;\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n view.setUint32(34, stride * image.height, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction rotationTransform(page: ExtractedPage): string {\n switch (page.rotate) {\n case 90:\n return `;transform:translate(${number(page.height)}pt,0) rotate(90deg)`;\n case 180:\n return `;transform:translate(${number(page.width)}pt,${number(page.height)}pt) rotate(180deg)`;\n case 270:\n return `;transform:translate(0,${number(page.width)}pt) rotate(270deg)`;\n default:\n return \"\";\n }\n}\n\nfunction positionedSpan(span: TextSpan, fontAliases: Map<string, string>): string {\n const direction = directionAttribute([span]);\n const style = [\n `left:${number(span.bounds.x)}pt`,\n `bottom:${number(span.bounds.y)}pt`,\n `width:${number(span.bounds.width)}pt`,\n `height:${number(span.bounds.height)}pt`,\n `font-size:${number(span.fontSize)}pt`,\n ...(isCssHexColor(span.color) ? [`color:${span.color}`] : []),\n ...(isUnitInterval(span.fillOpacity) ? [`opacity:${number(span.fillOpacity)}`] : []),\n ...visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ),\n ].join(\";\");\n return `<span class=\"pdf-span\"${direction} style=\"${style}\">${escapeHtml(span.text)}</span>`;\n}\n\nasync function writeFlowPage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions,\n): Promise<void> {\n const imageOptions = resolveImageOptions(\"semantic\", options);\n const media = await prepareSemanticMedia(page, imageOptions, options.onImage);\n const structured = structurePage(withoutSemanticMediaSpans(page, media));\n const defaultColor = dominantTextColor(structured.lines);\n let mediaIndex = 0;\n const captions = clearMediaCaptionAssociations(\n media,\n structured.blocks,\n page.width,\n page.height,\n structured.lines,\n );\n const captionedMedia = new Set(captions.values());\n const emittedMedia = new Set<SemanticMedia>();\n await write(\n `<section class=\"pdf-page pdf-page--semantic pdf-page--flow\" data-page=\"${page.number}\">`,\n );\n for (const block of structured.blocks) {\n const blockY = semanticBlockY(block);\n let emittedAsCaption = false;\n while (media[mediaIndex] && emittedMedia.has(media[mediaIndex] as SemanticMedia))\n mediaIndex += 1;\n while ((media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n const item = media[mediaIndex];\n if (item && captions.get(block) === item && block.type === \"paragraph\") {\n await write(\n `<figure class=\"pdf-semantic-figure\">${item.html}<figcaption>${semanticTextHtml(block.text, block.lines, defaultColor)}</figcaption></figure>`,\n );\n emittedMedia.add(item);\n mediaIndex += 1;\n emittedAsCaption = true;\n break;\n }\n if (item && captionedMedia.has(item)) break;\n await write(`<div class=\"pdf-semantic-visual\">${item?.html}</div>`);\n mediaIndex += 1;\n }\n const associatedMedia = captions.get(block);\n if (!emittedAsCaption && associatedMedia && block.type === \"paragraph\") {\n await write(\n `<figure class=\"pdf-semantic-figure\">${associatedMedia.html}<figcaption>${semanticTextHtml(block.text, block.lines, defaultColor)}</figcaption></figure>`,\n );\n emittedMedia.add(associatedMedia);\n emittedAsCaption = true;\n }\n if (emittedAsCaption) continue;\n if (block.type === \"table\") await write(tableToHtml(block.table));\n else if (block.type === \"heading\") {\n await write(\n `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor, false)}</h${block.level}>`,\n );\n } else if (block.type === \"paragraph\") {\n await write(\n `<p${directionAttribute(block.lines.flatMap((line) => line.spans))}>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`,\n );\n } else if (block.type === \"preformatted\") {\n await write(`<pre>${escapeHtml(block.text)}</pre>`);\n } else if (block.type === \"definitionList\") {\n await write(\"<dl>\");\n for (const entry of block.entries) {\n await write(\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n );\n }\n await write(\"</dl>\");\n } else if (block.type === \"cardList\") {\n await write('<div class=\"pdf-semantic-cards\">');\n for (const item of block.items) {\n await write(`<article><h3>${escapeHtml(item.title)}</h3>`);\n for (const detail of item.details) await write(`<p>${escapeHtml(detail)}</p>`);\n await write(\"</article>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"sectionGroup\") {\n await write('<div class=\"pdf-semantic-sections\">');\n for (const item of block.items) {\n await write(`<section><h3>${escapeHtml(item.label)}</h3>`);\n for (const content of item.content) await write(`<p>${escapeHtml(content)}</p>`);\n await write(\"</section>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"employment\") {\n await write(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`,\n );\n } else if (block.type === \"insetGroup\") {\n await write(\n `<div class=\"pdf-semantic-inset\" style=\"margin-inline-start:${number(block.indentEm)}em\">${block.blocks.map((item) => nestedSemanticBlockHtml(item, defaultColor)).join(\"\")}</div>`,\n );\n } else {\n const tag = block.ordered ? \"ol\" : \"ul\";\n await write(`<${tag}>`);\n for (const item of block.items) {\n await write(`<li>${semanticTextHtml(item.text, item.lines, defaultColor)}</li>`);\n }\n await write(`</${tag}>`);\n }\n }\n while (mediaIndex < media.length) {\n const item = media[mediaIndex];\n if (item && !emittedMedia.has(item)) {\n await write(`<div class=\"pdf-semantic-visual\">${item.html}</div>`);\n }\n mediaIndex += 1;\n }\n await write(\"</section>\");\n}\n\nfunction nestedSemanticBlockHtml(block: SemanticBlock, defaultColor: string): string {\n if (block.type === \"insetGroup\") {\n return `<div class=\"pdf-semantic-inset\" style=\"margin-inline-start:${number(block.indentEm)}em\">${block.blocks.map((item) => nestedSemanticBlockHtml(item, defaultColor)).join(\"\")}</div>`;\n }\n if (block.type === \"table\") return tableToHtml(block.table);\n if (block.type === \"heading\") {\n return `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor, false)}</h${block.level}>`;\n }\n if (block.type === \"paragraph\") {\n return `<p>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`;\n }\n if (block.type === \"preformatted\") return `<pre>${escapeHtml(block.text)}</pre>`;\n if (block.type === \"definitionList\") {\n return `<dl>${block.entries.map((entry) => `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`).join(\"\")}</dl>`;\n }\n if (block.type === \"cardList\") {\n return `<div class=\"pdf-semantic-cards\">${block.items.map((item) => `<article><h3>${escapeHtml(item.title)}</h3>${item.details.map((detail) => `<p>${escapeHtml(detail)}</p>`).join(\"\")}</article>`).join(\"\")}</div>`;\n }\n if (block.type === \"sectionGroup\") {\n return `<div class=\"pdf-semantic-sections\">${block.items.map((item) => `<section><h3>${escapeHtml(item.label)}</h3>${item.content.map((content) => `<p>${escapeHtml(content)}</p>`).join(\"\")}</section>`).join(\"\")}</div>`;\n }\n if (block.type === \"employment\") {\n return `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`;\n }\n const tag = block.ordered ? \"ol\" : \"ul\";\n return `<${tag}>${block.items.map((item) => `<li>${semanticTextHtml(item.text, item.lines, defaultColor)}</li>`).join(\"\")}</${tag}>`;\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction visualText(\n span: TextSpan,\n pageHeight: number,\n fontAliases: Map<string, string>,\n counterRotateReflectedText = false,\n styleClasses?: Map<string, string>,\n): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n if (!span.fontAssetId && isAdobeCjkFont(span.fontFamily)) return \"\";\n const direction = directionAttribute([span]);\n const style = visualTextStyle(span, fontAliases);\n const styleClass = styleClasses?.get(visualTextClassStyle(span, fontAliases));\n const presentation = styleClass ? ` class=\"${styleClass}\"` : style ? ` style=\"${style}\"` : \"\";\n const fontSize = styleClass ? \"\" : ` font-size=\"${number(span.fontSize)}\"`;\n const textExtent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const textLength =\n textExtent > 0 && !isHebrewPaintOrder(span)\n ? ` textLength=\"${number(textExtent)}\" lengthAdjust=\"${span.direction === \"ttb\" || usesSpacingAdjustment(span) ? \"spacing\" : \"spacingAndGlyphs\"}\"`\n : \"\";\n const transform =\n counterRotateReflectedText && span.transform\n ? ([\n span.transform[0],\n span.transform[1],\n span.transform[2],\n -span.transform[3],\n ] as TextSpan[\"transform\"])\n : span.transform;\n const transformed = hasNonIdentityTransform(transform);\n const rtlOffset = span.direction === \"rtl\" ? span.bounds.width : 0;\n const basisX = transform?.[0] ?? 1;\n const basisY = transform?.[1] ?? 0;\n const anchorX = span.bounds.x + basisX * rtlOffset;\n const anchorY = pageHeight - span.bounds.y + basisY * rtlOffset;\n const position = transformed\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform?.map(number).join(\" \")} ${number(anchorX)} ${number(anchorY)})\"`\n : ` x=\"${number(anchorX)}\" y=\"${number(anchorY)}\"`;\n return `<text${direction}${position}${fontSize}${textLength}${presentation}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction visualTextClassStyle(span: TextSpan, fontAliases: Map<string, string>): string {\n const style = visualTextStyle(span, fontAliases);\n const fontSize = `font-size:${number(span.fontSize)}px`;\n return style ? `${style};${fontSize}` : fontSize;\n}\n\nfunction visualTextStyle(span: TextSpan, fontAliases: Map<string, string>): string {\n const font = visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ).join(\";\");\n const stroke = isCssHexColor(span.strokeColor) ? `stroke:${span.strokeColor}` : \"\";\n const strokeWidth =\n stroke && Number.isFinite(span.strokeWidth) && (span.strokeWidth ?? -1) >= 0\n ? `stroke-width:${number(span.strokeWidth ?? 0)}`\n : \"\";\n const strokeOnly = span.renderingMode === 1 || span.renderingMode === 5;\n const fillOpacity = isUnitInterval(span.fillOpacity)\n ? `fill-opacity:${number(span.fillOpacity)}`\n : \"\";\n const strokeOpacity = isUnitInterval(span.strokeOpacity)\n ? `stroke-opacity:${number(span.strokeOpacity)}`\n : \"\";\n return [\n isHebrewPaintOrder(span) ? \"unicode-bidi:bidi-override;direction:ltr\" : \"\",\n span.direction === \"ttb\" ? \"writing-mode:vertical-rl\" : \"\",\n strokeOnly ? \"fill:none\" : isCssHexColor(span.color) ? `fill:${span.color}` : \"\",\n stroke,\n strokeWidth,\n fillOpacity,\n strokeOpacity,\n font,\n ]\n .filter(Boolean)\n .join(\";\");\n}\n\nfunction isAdobeCjkFont(fontFamily: string | undefined): boolean {\n return /^Adobe(?:Heiti|Song|Kaiti|Ming|Gothic|Mincho)Std-/i.test(fontFamily ?? \"\");\n}\n\nfunction visualType3Text(span: TextSpan, font: EmbeddedType3Font, pageHeight: number): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const glyphs = new Map(font.glyphs.map((glyph) => [glyph.code, glyph]));\n const sequence = (span.glyphCodes ?? []).map((code) => glyphs.get(code));\n const totalAdvance = sequence.reduce((total, glyph) => total + (glyph?.advance ?? 0), 0);\n if (totalAdvance <= 0 || span.bounds.width <= 0 || span.fontSize <= 0) return \"\";\n const transform = span.transform ?? [1, 0, 0, 1];\n const outer = `matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(pageHeight - span.bounds.y)})`;\n const xScale = span.bounds.width / totalAdvance;\n let offset = 0;\n let content = \"\";\n for (const glyph of sequence) {\n if (!glyph) continue;\n content += `<g transform=\"translate(${number(offset)} 0)\">${type3Glyph(glyph, span.color)}</g>`;\n offset += glyph.advance;\n }\n return `<g transform=\"${outer}\"><g transform=\"scale(${number(xScale)} ${number(-span.fontSize)})\">${content}</g></g>`;\n}\n\nfunction isHebrewPaintOrder(span: TextSpan): boolean {\n return span.direction === \"ltr\" && /[\\u0590-\\u05ff]/u.test(span.text);\n}\n\nfunction usesSpacingAdjustment(span: TextSpan): boolean {\n return !span.fontAssetId && /arial/i.test(span.fontFamily ?? \"\");\n}\n\nfunction type3Glyph(glyph: Type3Glyph, textColor?: string): string {\n let output = \"\";\n for (const fill of glyph.fills ?? []) {\n const color = glyph.usesTextColor && isCssHexColor(textColor) ? textColor : fill.color;\n if (!isCssHexColor(color)) continue;\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n output += `<polygon points=\"${points}\" fill=\"${color}\"${opacity}/>`;\n }\n for (const path of glyph.paths ?? []) {\n if (!isSvgPath(path.d)) continue;\n const fill =\n glyph.usesTextColor && isCssHexColor(textColor)\n ? textColor\n : isCssHexColor(path.fill)\n ? path.fill\n : \"none\";\n const stroke =\n glyph.usesTextColor && isCssHexColor(textColor) && path.stroke\n ? textColor\n : isCssHexColor(path.stroke)\n ? path.stroke\n : \"none\";\n const width =\n path.strokeWidth !== undefined && Number.isFinite(path.strokeWidth) && path.strokeWidth >= 0\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n output += `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}/>`;\n }\n return (glyph.fills?.length ?? 0) > 64 && glyph.advance > 2\n ? `<g shape-rendering=\"crispEdges\">${output}</g>`\n : output;\n}\n\nfunction isCssHexColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction isUnitInterval(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0 && (value ?? 2) <= 1;\n}\n\nfunction isMonospace(fontFamily: string | undefined): boolean {\n return /courier|mono/i.test(fontFamily ?? \"\");\n}\n\nfunction usesPositionedSpan(span: TextSpan): boolean {\n return (\n !span.glyphCodes && isMonospace(span.fontFamily) && !hasNonIdentityTransform(span.transform)\n );\n}\n\nfunction hasNonIdentityTransform(transform: TextSpan[\"transform\"]): boolean {\n if (!transform) return false;\n const identity: [number, number, number, number] = [1, 0, 0, 1];\n return transform.some((value, index) => Math.abs(value - (identity[index] ?? 0)) > 0.000_001);\n}\n\nfunction directionAttribute(spans: TextSpan[]): string {\n const rtl = spans.filter((span) => span.direction === \"rtl\").length;\n const vertical = spans.filter((span) => span.direction === \"ttb\").length;\n if (vertical > rtl && vertical * 2 >= spans.length) return ' data-direction=\"ttb\"';\n return rtl * 2 >= spans.length && spans.length > 0 ? ' dir=\"rtl\"' : \"\";\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1000) / 1000) : \"0\";\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHtml(value).replaceAll(\"`\", \"&#96;\");\n}\n\nfunction escapeHtml(value: string): string {\n return [...value]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint === 13) return \"\\n\";\n return isForbiddenControl(codePoint) ? \"�\" : character;\n })\n .join(\"\")\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction isForbiddenControl(codePoint: number): boolean {\n return (\n codePoint <= 8 ||\n codePoint === 11 ||\n codePoint === 12 ||\n (codePoint >= 14 && codePoint <= 31) ||\n codePoint === 127\n );\n}\n\nfunction resolveProfile(options: HtmlWriterOptions): HtmlProfile {\n const legacyProfile = options.layout === \"flow\" ? \"semantic\" : \"visual\";\n if (options.profile && options.layout && options.profile !== legacyProfile) {\n throw new Error(\n `conflicting HTML output options: profile \"${options.profile}\" does not match layout \"${options.layout}\"`,\n );\n }\n return options.profile ?? legacyProfile;\n}\n\nfunction resolveImageOptions(profile: HtmlProfile, options: HtmlWriterOptions): HtmlImageOptions {\n return options.imageOptions ?? (profile === \"semantic\" ? \"excluded\" : \"embedded\");\n}\n\nfunction validateImageOptions(\n imageOptions: HtmlImageOptions,\n options: Pick<HtmlWriterOptions, \"onImage\">,\n): void {\n if (imageOptions === \"references\" && !options.onImage) {\n throw new Error('imageOptions \"references\" requires an onImage callback');\n }\n}\n","import type { Rect } from \"@boxpdf/reader\";\nimport type { SemanticBlock, TextLine } from \"@boxpdf/reader/structure\";\nimport type { SemanticMedia } from \"./semantic-media.js\";\n\nexport interface MediaCaptionEvidence {\n score: number;\n side: \"above\" | \"below\";\n gapRatio: number;\n horizontalOverlap: number;\n centerAlignment: number;\n relativeWidth: number;\n fontContrast: number;\n surroundingWhitespace: number;\n interveningContent: number;\n repeatedAlignment: number;\n}\n\ninterface CaptionCandidate {\n block: Extract<SemanticBlock, { type: \"paragraph\" }>;\n bounds: Rect;\n lineHeight: number;\n font: string;\n}\n\ninterface CaptionEdge {\n media: SemanticMedia;\n candidate: CaptionCandidate;\n evidence: MediaCaptionEvidence;\n}\n\nconst minimumCaptionScore = 0.72;\n\nexport function mediaCaptionEvidence(\n media: SemanticMedia,\n block: SemanticBlock,\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n): MediaCaptionEvidence | undefined {\n const candidate = captionCandidate(block);\n return candidate\n ? scoreCaption(media, candidate, pageWidth, pageHeight, pageLines, 0)\n : undefined;\n}\n\nexport function isClearMediaCaption(\n media: SemanticMedia,\n block: SemanticBlock,\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n): block is Extract<SemanticBlock, { type: \"paragraph\" }> {\n return (\n (mediaCaptionEvidence(media, block, pageWidth, pageHeight, pageLines)?.score ?? 0) >=\n minimumCaptionScore\n );\n}\n\nexport function clearMediaCaptionAssociations(\n media: SemanticMedia[],\n blocks: SemanticBlock[],\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n): Map<SemanticBlock, SemanticMedia> {\n const candidates = blocks.flatMap((block) => {\n const candidate = captionCandidate(block);\n return candidate ? [candidate] : [];\n });\n const preliminary = media.flatMap((item) =>\n candidates.flatMap((candidate) => {\n const evidence = scoreCaption(item, candidate, pageWidth, pageHeight, pageLines, 0);\n return evidence ? [{ media: item, candidate, evidence }] : [];\n }),\n );\n const patterns = repeatedPatterns(preliminary);\n const edges = preliminary\n .map((edge) => {\n const evidence = scoreCaption(\n edge.media,\n edge.candidate,\n pageWidth,\n pageHeight,\n pageLines,\n patterns.get(patternKey(edge)) ?? 0,\n );\n return evidence ? { ...edge, evidence } : undefined;\n })\n .filter((edge): edge is CaptionEdge => Boolean(edge))\n .filter((edge) => edge.evidence.score >= minimumCaptionScore);\n const bestForMedia = bestEdges(edges, (edge) => edge.media);\n const bestForCaption = bestEdges(edges, (edge) => edge.candidate.block);\n const associations = new Map<SemanticBlock, SemanticMedia>();\n for (const edge of edges) {\n if (\n bestForMedia.get(edge.media) === edge &&\n bestForCaption.get(edge.candidate.block) === edge\n ) {\n associations.set(edge.candidate.block, edge.media);\n }\n }\n return associations;\n}\n\nfunction scoreCaption(\n media: SemanticMedia,\n candidate: CaptionCandidate,\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n repeatedAlignment: number,\n): MediaCaptionEvidence | undefined {\n if (!insidePage(media.bounds, pageWidth, pageHeight)) return undefined;\n if (media.bounds.width < pageWidth * 0.06 || media.bounds.height < candidate.lineHeight * 1.5)\n return undefined;\n const relation = verticalRelation(media.bounds, candidate.bounds);\n if (!relation) return undefined;\n const maximumGap = Math.max(candidate.lineHeight * 3, pageHeight * 0.035);\n if (relation.gap > maximumGap) return undefined;\n const overlapWidth = overlap(\n media.bounds.x,\n media.bounds.width,\n candidate.bounds.x,\n candidate.bounds.width,\n );\n const horizontalOverlap =\n overlapWidth / Math.max(1, Math.min(media.bounds.width, candidate.bounds.width));\n const centerDistance = Math.abs(center(media.bounds) - center(candidate.bounds));\n const centerAlignment = clamp01(\n 1 - centerDistance / Math.max(media.bounds.width, candidate.bounds.width),\n );\n if (horizontalOverlap < 0.45 && centerAlignment < 0.82) return undefined;\n const relativeWidth =\n Math.min(media.bounds.width, candidate.bounds.width) /\n Math.max(media.bounds.width, candidate.bounds.width);\n const gapRatio = clamp01(1 - relation.gap / maximumGap);\n const interveningContent = interveningScore(media.bounds, candidate, relation.side, pageLines);\n if (interveningContent === 0) return undefined;\n if (relation.side === \"above\" && (gapRatio < 0.6 || interveningContent < 1)) return undefined;\n const fontContrast = captionFontContrast(candidate, pageLines);\n const surroundingWhitespace = whitespaceScore(candidate, relation.side, relation.gap, pageLines);\n const score =\n gapRatio * 0.22 +\n horizontalOverlap * 0.17 +\n centerAlignment * 0.13 +\n relativeWidth * 0.09 +\n fontContrast * 0.13 +\n surroundingWhitespace * 0.09 +\n interveningContent * 0.09 +\n repeatedAlignment * 0.08;\n return {\n score,\n side: relation.side,\n gapRatio,\n horizontalOverlap,\n centerAlignment,\n relativeWidth,\n fontContrast,\n surroundingWhitespace,\n interveningContent,\n repeatedAlignment,\n };\n}\n\nfunction captionCandidate(block: SemanticBlock): CaptionCandidate | undefined {\n if (block.type !== \"paragraph\" || block.lines.length === 0) return undefined;\n const first = block.lines.flatMap((line) => line.spans).find((span) => /\\S/u.test(span.text));\n if (!first) return undefined;\n return {\n block,\n bounds: unionLines(block.lines),\n lineHeight: median(block.lines.map((line) => line.bounds.height)),\n font: fontSignature(first),\n };\n}\n\nfunction verticalRelation(\n media: Rect,\n caption: Rect,\n): { side: \"above\" | \"below\"; gap: number } | undefined {\n const belowGap = media.y - (caption.y + caption.height);\n if (belowGap >= -caption.height * 0.15) return { side: \"below\", gap: Math.max(0, belowGap) };\n const aboveGap = caption.y - (media.y + media.height);\n if (aboveGap >= -caption.height * 0.15) return { side: \"above\", gap: Math.max(0, aboveGap) };\n return undefined;\n}\n\nfunction interveningScore(\n media: Rect,\n candidate: CaptionCandidate,\n side: \"above\" | \"below\",\n pageLines: TextLine[],\n): number {\n const lower =\n side === \"below\" ? candidate.bounds.y + candidate.bounds.height : media.y + media.height;\n const upper = side === \"below\" ? media.y : candidate.bounds.y;\n const blockers = pageLines.filter(\n (line) =>\n !candidate.block.lines.includes(line) &&\n line.bounds.y < upper &&\n line.bounds.y + line.bounds.height > lower &&\n overlap(line.bounds.x, line.bounds.width, media.x, media.width) /\n Math.max(1, Math.min(line.bounds.width, media.width)) >=\n 0.25,\n );\n return blockers.length === 0 ? 1 : blockers.length === 1 ? 0.35 : 0;\n}\n\nfunction captionFontContrast(candidate: CaptionCandidate, pageLines: TextLine[]): number {\n const otherLines = pageLines.filter((line) => !candidate.block.lines.includes(line));\n if (candidate.font !== dominantFontSignature(otherLines)) return 1;\n const candidateSize = median(\n candidate.block.lines.flatMap((line) => line.spans.map((span) => span.fontSize)),\n );\n const bodySize = median(otherLines.flatMap((line) => line.spans.map((span) => span.fontSize)));\n return Math.abs(candidateSize - bodySize) >= 0.75 ? 0.65 : 0.15;\n}\n\nfunction whitespaceScore(\n candidate: CaptionCandidate,\n side: \"above\" | \"below\",\n mediaGap: number,\n pageLines: TextLine[],\n): number {\n const awayGaps = pageLines\n .filter((line) => !candidate.block.lines.includes(line))\n .filter(\n (line) =>\n overlap(line.bounds.x, line.bounds.width, candidate.bounds.x, candidate.bounds.width) > 0,\n )\n .flatMap((line) => {\n if (side === \"below\" && line.bounds.y + line.bounds.height <= candidate.bounds.y)\n return [candidate.bounds.y - line.bounds.y - line.bounds.height];\n if (side === \"above\" && line.bounds.y >= candidate.bounds.y + candidate.bounds.height)\n return [line.bounds.y - candidate.bounds.y - candidate.bounds.height];\n return [];\n });\n const awayGap = Math.min(...awayGaps, Number.POSITIVE_INFINITY);\n return Number.isFinite(awayGap)\n ? clamp01((awayGap + candidate.lineHeight * 0.25) / (mediaGap + candidate.lineHeight))\n : 1;\n}\n\nfunction repeatedPatterns(edges: CaptionEdge[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const edge of edges.filter((item) => item.evidence.score >= minimumCaptionScore - 0.08)) {\n counts.set(patternKey(edge), (counts.get(patternKey(edge)) ?? 0) + 1);\n }\n return new Map([...counts].map(([key, count]) => [key, count >= 2 ? 1 : 0]));\n}\n\nfunction patternKey(edge: CaptionEdge): string {\n const widthRatio = edge.candidate.bounds.width / Math.max(1, edge.media.bounds.width);\n return `${edge.candidate.font}|${edge.evidence.side}|${Math.round(widthRatio * 4) / 4}`;\n}\n\nfunction bestEdges<K>(edges: CaptionEdge[], key: (edge: CaptionEdge) => K): Map<K, CaptionEdge> {\n const output = new Map<K, CaptionEdge>();\n for (const edge of edges) {\n const existing = output.get(key(edge));\n if (!existing || edge.evidence.score > existing.evidence.score) output.set(key(edge), edge);\n }\n return output;\n}\n\nfunction insidePage(bounds: Rect, pageWidth: number, pageHeight: number): boolean {\n return (\n bounds.x >= -2 &&\n bounds.y >= -2 &&\n bounds.x + bounds.width <= pageWidth + 2 &&\n bounds.y + bounds.height <= pageHeight + 2\n );\n}\n\nfunction unionLines(lines: TextLine[]): Rect {\n const x = Math.min(...lines.map((line) => line.bounds.x));\n const y = Math.min(...lines.map((line) => line.bounds.y));\n const right = Math.max(...lines.map((line) => line.bounds.x + line.bounds.width));\n const top = Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n return { x, y, width: right - x, height: top - y };\n}\n\nfunction dominantFontSignature(lines: TextLine[]): string {\n const counts = new Map<string, number>();\n for (const span of lines.flatMap((line) => line.spans)) {\n const signature = fontSignature(span);\n counts.set(signature, (counts.get(signature) ?? 0) + Math.max(1, [...span.text].length));\n }\n return [...counts].sort((left, right) => right[1] - left[1])[0]?.[0] ?? \"\";\n}\n\nfunction fontSignature(span: TextLine[\"spans\"][number]): string {\n return `${(span.fontFamily ?? span.fontName ?? \"\").toLocaleLowerCase(\"en\")}|${Math.round(span.fontSize * 2) / 2}|${span.color ?? \"\"}`;\n}\n\nfunction center(bounds: Rect): number {\n return bounds.x + bounds.width / 2;\n}\nfunction overlap(left: number, leftSize: number, right: number, rightSize: number): number {\n return Math.max(0, Math.min(left + leftSize, right + rightSize) - Math.max(left, right));\n}\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\nfunction median(values: number[]): number {\n const ordered = [...values].sort((left, right) => left - right);\n return ordered[Math.floor(ordered.length / 2)] ?? 1;\n}\n","import type { ExtractedPage } from \"@boxpdf/reader\";\nimport {\n type SemanticBlock,\n type StructuredPage,\n structurePage,\n type Table,\n tableToRows,\n} from \"@boxpdf/reader/structure\";\nimport { clearMediaCaptionAssociations } from \"./semantic-caption.js\";\nimport { dominantTextColor, semanticTextHtml, semanticTextMarkdown } from \"./semantic-inline.js\";\nimport {\n type HtmlImageAsset,\n type HtmlImageOptions,\n prepareSemanticMedia,\n type SemanticMedia,\n withoutSemanticMediaSpans,\n} from \"./semantic-media.js\";\n\nexport interface SemanticDocumentStats {\n pagesProcessed: number;\n peakBufferedPages: number;\n peakBufferedLines: number;\n mergedTables: number;\n suppressedFurniture: number;\n}\n\nexport type SemanticDocumentFormat = \"html\" | \"markdown\";\n\ninterface BufferedPage {\n width: number;\n height: number;\n structured: StructuredPage;\n media: SemanticMedia[];\n}\n\ninterface ActiveTable {\n table: Table;\n header: string[] | undefined;\n}\n\nexport async function writeSemanticDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: (chunk: string) => void | Promise<void>,\n lookaheadPages: number,\n imageOptions: HtmlImageOptions,\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>,\n format: SemanticDocumentFormat = \"html\",\n): Promise<SemanticDocumentStats> {\n const stats: SemanticDocumentStats = {\n pagesProcessed: 0,\n peakBufferedPages: 0,\n peakBufferedLines: 0,\n mergedTables: 0,\n suppressedFurniture: 0,\n };\n const buffer: BufferedPage[] = [];\n const seenFurniture = new Set<string>();\n const sectionLevels: number[] = [];\n let activeTable: ActiveTable | undefined;\n const pendingMedia: string[] = [];\n let headerOpen = false;\n let headerHasParagraph = false;\n let contentStarted = false;\n let employmentOpen = false;\n let pendingParagraph:\n | {\n block: Extract<SemanticBlock, { type: \"paragraph\" }>;\n height: number;\n defaultColor: string;\n }\n | undefined;\n const markdown = format === \"markdown\";\n const output = (html: string, markdownValue = \"\") => write(markdown ? markdownValue : html);\n const inlineText = (\n text: string,\n lines: Parameters<typeof semanticTextHtml>[1],\n defaultColor: string,\n preserveWeight = true,\n ) =>\n markdown\n ? semanticTextMarkdown(text, lines, defaultColor, preserveWeight)\n : semanticTextHtml(text, lines, defaultColor, preserveWeight);\n await output('<article class=\"pdf-semantic-document\">');\n\n const closeTable = async () => {\n if (!activeTable) return;\n await output(\"</table>\", \"\\n\");\n activeTable = undefined;\n while (pendingMedia.length > 0) await write(pendingMedia.shift() ?? \"\");\n };\n\n const closeSections = async (minimumLevel = 0) => {\n while ((sectionLevels.at(-1) ?? -1) >= minimumLevel && sectionLevels.length > 0) {\n await output(\"</section>\");\n sectionLevels.pop();\n }\n };\n\n const flushPendingParagraph = async () => {\n if (!pendingParagraph) return;\n await write(semanticBlockOutput(pendingParagraph.block, pendingParagraph.defaultColor, format));\n pendingParagraph = undefined;\n };\n\n const closeEmployment = async () => {\n if (!employmentOpen) return;\n await output(\"</section>\");\n employmentOpen = false;\n };\n\n const emitPage = async (page: BufferedPage, future: BufferedPage[]) => {\n const defaultColor = dominantTextColor(page.structured.lines);\n let mediaIndex = 0;\n const captions = clearMediaCaptionAssociations(\n page.media,\n page.structured.blocks,\n page.width,\n page.height,\n page.structured.lines,\n );\n const captionedMedia = new Set(captions.values());\n const emittedMedia = new Set<SemanticMedia>();\n const futureFurniture = new Set(future.flatMap((candidate) => marginSignatures(candidate)));\n const repeatedFurniture = new Set([...seenFurniture, ...futureFurniture]);\n for (const [blockIndex, block] of page.structured.blocks.entries()) {\n const nextBlock = page.structured.blocks[blockIndex + 1];\n const blockY = semanticBlockY(block);\n let emittedAsCaption = false;\n while (page.media[mediaIndex] && emittedMedia.has(page.media[mediaIndex] as SemanticMedia)) {\n mediaIndex += 1;\n }\n while ((page.media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n await flushPendingParagraph();\n const item = page.media[mediaIndex];\n if (item && captions.get(block) === item && block.type === \"paragraph\") {\n const html = markdown\n ? `${item.markdown}\\n\\n*${inlineText(block.text, block.lines, defaultColor)}*\\n\\n`\n : `<figure class=\"pdf-semantic-figure\">${item.html}<figcaption>${inlineText(block.text, block.lines, defaultColor)}</figcaption></figure>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n emittedMedia.add(item);\n mediaIndex += 1;\n emittedAsCaption = true;\n break;\n }\n if (item && captionedMedia.has(item)) break;\n const html = markdown\n ? `${item?.markdown ?? \"\"}\\n\\n`\n : `<div class=\"pdf-semantic-visual\">${item?.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n mediaIndex += 1;\n }\n const associatedMedia = captions.get(block);\n if (!emittedAsCaption && associatedMedia && block.type === \"paragraph\") {\n await flushPendingParagraph();\n const html = markdown\n ? `${associatedMedia.markdown}\\n\\n*${inlineText(block.text, block.lines, defaultColor)}*\\n\\n`\n : `<figure class=\"pdf-semantic-figure\">${associatedMedia.html}<figcaption>${inlineText(block.text, block.lines, defaultColor)}</figcaption></figure>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n emittedMedia.add(associatedMedia);\n emittedAsCaption = true;\n }\n if (emittedAsCaption) continue;\n if (isRepeatedFurniture(block, page, repeatedFurniture)) {\n stats.suppressedFurniture += 1;\n continue;\n }\n await flushPendingParagraph();\n if (employmentOpen && block.type !== \"list\") await closeEmployment();\n if (!contentStarted && !headerOpen && block.type === \"heading\" && block.level === 1) {\n await output(\n `<header><h1>${inlineText(block.text, block.lines, defaultColor, false)}</h1>`,\n `# ${inlineText(block.text, block.lines, defaultColor, false)}\\n\\n`,\n );\n headerOpen = true;\n continue;\n }\n if (headerOpen) {\n if (block.type === \"paragraph\") {\n const tag = isContactBlock(block) ? \"address\" : \"p\";\n await output(\n `<${tag}>${inlineText(block.text, block.lines, defaultColor)}</${tag}>`,\n `${inlineText(block.text, block.lines, defaultColor)}\\n\\n`,\n );\n headerHasParagraph = true;\n continue;\n }\n if (\n block.type === \"heading\" &&\n !headerHasParagraph &&\n (block.level === 1 ||\n block.text.trimStart().startsWith(\"#\") ||\n (block.level === 4 && nextBlock?.type === \"paragraph\" && isContactBlock(nextBlock)))\n ) {\n await output(\n `<h${block.level}>${inlineText(block.text, block.lines, defaultColor, false)}</h${block.level}>`,\n `${\"#\".repeat(block.level)} ${inlineText(block.text, block.lines, defaultColor, false)}\\n\\n`,\n );\n continue;\n }\n await output(\"</header>\");\n headerOpen = false;\n contentStarted = true;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n if (activeTable && tablesContinue(activeTable.table, block.table, page.width)) {\n const continuationRows = sameRow(activeTable.header, rows[0]) ? rows.slice(1) : rows;\n for (const row of continuationRows)\n await write(markdown ? markdownTableRow(row) : tableRow(row, false));\n activeTable.table = block.table;\n stats.mergedTables += 1;\n continue;\n }\n await closeTable();\n const header = tableHeader(rows);\n await output(\"<table>\", markdownTableStart(rows, header));\n const markdownRows = markdown ? (header ? rows.slice(1) : rows) : rows;\n for (const [index, row] of markdownRows.entries())\n await write(\n markdown ? markdownTableRow(row) : tableRow(row, Boolean(header && index === 0)),\n );\n activeTable = { table: block.table, header };\n continue;\n }\n if (activeTable && block.type === \"definitionList\" && isFinancialSummary(block)) {\n const columns = activeTable.table.columns.length;\n await output(\n `<tfoot>${block.entries.map((entry) => financialSummaryRow(entry, columns)).join(\"\")}</tfoot>`,\n block.entries\n .map((entry) =>\n markdownTableRow([\n entry.term,\n ...Array(Math.max(0, columns - 2)).fill(\"\"),\n entry.description,\n ]),\n )\n .join(\"\"),\n );\n await closeTable();\n continue;\n }\n await closeTable();\n if (block.type === \"heading\") {\n const level = contentStarted && block.level === 1 ? 2 : block.level;\n await closeSections(level);\n await output(\n `<section data-level=\"${level}\"><h${level}>${inlineText(block.text, block.lines, defaultColor, false)}</h${level}>`,\n `${\"#\".repeat(level)} ${inlineText(block.text, block.lines, defaultColor, false)}\\n\\n`,\n );\n sectionLevels.push(level);\n continue;\n }\n if (block.type === \"paragraph\") {\n if (isTitledRecord(block)) {\n const [institution, ...details] = block.lines;\n if (institution)\n await output(\n `<h3>${escapeHtml(institution.text)}</h3>`,\n `### ${escapeMarkdown(institution.text)}\\n\\n`,\n );\n for (const detail of details)\n await output(`<p>${escapeHtml(detail.text)}</p>`, `${escapeMarkdown(detail.text)}\\n\\n`);\n continue;\n }\n if (isUnmarkedList(block)) {\n await output(\n `<ul>${block.lines.map((line) => `<li>${escapeHtml(line.text)}</li>`).join(\"\")}</ul>`,\n `${block.lines.map((line) => `- ${escapeMarkdown(line.text)}`).join(\"\\n\")}\\n\\n`,\n );\n continue;\n }\n pendingParagraph = { block, height: page.height, defaultColor };\n continue;\n }\n if (block.type === \"employment\") {\n await output(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p>`,\n `### ${escapeMarkdown(block.role)}\\n\\n${escapeMarkdown(block.organization)}\\n\\n${escapeMarkdown(block.date)}\\n\\n`,\n );\n employmentOpen = true;\n continue;\n }\n await write(semanticBlockOutput(block, defaultColor, format));\n }\n while (mediaIndex < page.media.length) {\n const item = page.media[mediaIndex];\n if (item && !emittedMedia.has(item)) {\n await flushPendingParagraph();\n const html = markdown\n ? `${item.markdown}\\n\\n`\n : `<div class=\"pdf-semantic-visual\">${item.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n }\n mediaIndex += 1;\n }\n for (const signature of marginSignatures(page)) seenFurniture.add(signature);\n };\n\n for await (const page of pages) {\n const media = await prepareSemanticMedia(page, imageOptions, onImage);\n const structured = structurePage(withoutSemanticMediaSpans(page, media));\n buffer.push({ width: page.width, height: page.height, structured, media });\n restoreObservedHyphens(buffer);\n stats.pagesProcessed += 1;\n stats.peakBufferedPages = Math.max(stats.peakBufferedPages, buffer.length);\n stats.peakBufferedLines = Math.max(\n stats.peakBufferedLines,\n buffer.reduce((total, item) => total + item.structured.lines.length, 0),\n );\n if (buffer.length >= lookaheadPages) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n }\n while (buffer.length > 0) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n if (headerOpen) await output(\"</header>\");\n await closeTable();\n await closeEmployment();\n if (pendingParagraph && isFooterParagraph(pendingParagraph.block, pendingParagraph.height)) {\n await closeSections();\n await output(\n `<footer>${semanticBlockHtml(pendingParagraph.block, pendingParagraph.defaultColor)}</footer>`,\n `---\\n\\n${semanticBlockMarkdown(pendingParagraph.block, pendingParagraph.defaultColor)}`,\n );\n pendingParagraph = undefined;\n } else {\n await flushPendingParagraph();\n await closeSections();\n }\n await output(\"</article>\");\n return stats;\n}\n\nfunction restoreObservedHyphens(buffer: BufferedPage[]): void {\n const terms = new Set(\n buffer.flatMap((page) =>\n page.structured.lines.flatMap(\n (line) => line.text.match(/[\\p{L}\\p{N}]+(?:[-‐‑][\\p{L}\\p{N}]+)+/gu) ?? [],\n ),\n ),\n );\n for (const page of buffer) {\n for (const block of page.structured.blocks) restoreBlockHyphens(block, terms);\n }\n}\n\nfunction restoreBlockHyphens(block: SemanticBlock, terms: Set<string>): void {\n const restore = (value: string) => restoreTextHyphens(value, terms);\n if (block.type === \"insetGroup\") {\n for (const nested of block.blocks) restoreBlockHyphens(nested, terms);\n } else if (\n block.type === \"heading\" ||\n block.type === \"paragraph\" ||\n block.type === \"preformatted\"\n ) {\n block.text = restore(block.text);\n } else if (block.type === \"list\") {\n for (const item of block.items) item.text = restore(item.text);\n } else if (block.type === \"definitionList\") {\n for (const entry of block.entries) {\n entry.term = restore(entry.term);\n entry.description = restore(entry.description);\n }\n } else if (block.type === \"cardList\") {\n for (const item of block.items) {\n item.title = restore(item.title);\n item.details = item.details.map(restore);\n }\n } else if (block.type === \"sectionGroup\") {\n for (const item of block.items) {\n item.label = restore(item.label);\n item.content = item.content.map(restore);\n }\n } else if (block.type === \"employment\") {\n block.role = restore(block.role);\n block.organization = restore(block.organization);\n block.date = restore(block.date);\n }\n}\n\nfunction restoreTextHyphens(value: string, terms: Set<string>): string {\n let output = value;\n for (const term of terms) {\n const collapsed = term.replace(/[-‐‑]/gu, \"\");\n if (collapsed === term || !output.includes(collapsed)) continue;\n const pattern = new RegExp(\n `(?<![\\\\p{L}\\\\p{N}])${escapeRegularExpression(collapsed)}(?![\\\\p{L}\\\\p{N}])`,\n \"gu\",\n );\n output = output.replace(pattern, term);\n }\n return output;\n}\n\nfunction escapeRegularExpression(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction isContactBlock(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n const text = block.text;\n const signals = [\n /@/.test(text),\n /\\+?\\d[\\d().\\s-]{7,}/.test(text),\n /\\bhttps?:\\/\\//i.test(text),\n /\\b\\w+\\.\\w{2,}\\b/i.test(text),\n ];\n return signals.filter(Boolean).length >= 2;\n}\n\nfunction isTitledRecord(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 2) return false;\n const [first, ...rest] = block.lines;\n if (!first || rest.length === 0) return false;\n const firstSize = Math.max(...first.spans.map((span) => span.fontSize));\n const restSize = Math.max(...rest.flatMap((line) => line.spans.map((span) => span.fontSize)));\n const emphasized = first.spans.some((span) =>\n /(?:bold|semibold|demi)/i.test(span.fontFamily ?? \"\"),\n );\n return emphasized || firstSize >= restSize * 1.08;\n}\n\nfunction isUnmarkedList(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 3) return false;\n const first = block.lines[0];\n if (!first) return false;\n const aligned = block.lines.every(\n (line) => Math.abs(line.bounds.x - first.bounds.x) <= Math.max(8, first.bounds.height),\n );\n const separated = block.lines.slice(1).every((line, index) => {\n const previous = block.lines[index];\n if (!previous) return false;\n const gap = previous.bounds.y - (line.bounds.y + line.bounds.height);\n return gap >= Math.min(previous.bounds.height, line.bounds.height) * 0.55;\n });\n return aligned && separated;\n}\n\nfunction isFooterParagraph(\n block: Extract<SemanticBlock, { type: \"paragraph\" }>,\n pageHeight: number,\n): boolean {\n const inBottomMargin = block.lines.every(\n (line) => line.bounds.y + line.bounds.height <= pageHeight * 0.15,\n );\n return inBottomMargin || /^(?:thanks|thank you)\\b/i.test(block.text.trim());\n}\n\nfunction marginSignatures(page: BufferedPage): string[] {\n return page.structured.blocks.flatMap((block) =>\n blockLines(block)\n .filter((line) => isMarginLine(line.bounds.y, line.bounds.height, page.height))\n .map((line) => furnitureSignature(line.text)),\n );\n}\n\nfunction isRepeatedFurniture(\n block: SemanticBlock,\n page: BufferedPage,\n futureFurniture: Set<string>,\n): boolean {\n const lines = blockLines(block);\n return (\n lines.length > 0 &&\n lines.every(\n (line) =>\n isMarginLine(line.bounds.y, line.bounds.height, page.height) &&\n futureFurniture.has(furnitureSignature(line.text)),\n )\n );\n}\n\nfunction blockLines(block: SemanticBlock) {\n return block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n}\n\nfunction isMarginLine(y: number, height: number, pageHeight: number): boolean {\n return y + height <= pageHeight * 0.12 || y >= pageHeight * 0.88;\n}\n\nfunction furnitureSignature(value: string): string {\n return value.toLocaleLowerCase(\"en\").replace(/\\d+/g, \"#\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction tablesContinue(previous: Table, next: Table, pageWidth: number): boolean {\n if (previous.columns.length !== next.columns.length || previous.columns.length < 2) return false;\n return previous.columns.every(\n (column, index) =>\n Math.abs(column - (next.columns[index] ?? Number.POSITIVE_INFINITY)) / pageWidth <= 0.04,\n );\n}\n\nfunction tableHeader(rows: string[][]): string[] | undefined {\n const first = rows[0];\n if (!first) return undefined;\n const later = rows.slice(1).flat();\n return first.every((value) => /\\p{L}/u.test(value) && !isNumericValue(value)) &&\n later.some(isNumericValue)\n ? first\n : undefined;\n}\n\nfunction sameRow(left: string[] | undefined, right: string[] | undefined): boolean {\n return Boolean(\n left &&\n right &&\n left.length === right.length &&\n left.every((value, index) => value === right[index]),\n );\n}\n\nfunction tableRow(row: string[], header: boolean): string {\n const cell = header ? \"th\" : \"td\";\n return `<tr>${row.map((value) => `<${cell}>${escapeHtml(value)}</${cell}>`).join(\"\")}</tr>`;\n}\n\nfunction markdownTableStart(rows: string[][], header: string[] | undefined): string {\n const columns = rows[0]?.length ?? 0;\n if (columns === 0) return \"\";\n const heading = header ?? Array(columns).fill(\"\");\n return `${markdownTableRow(heading)}${markdownTableRow(Array(columns).fill(\"---\"), false)}`;\n}\n\nfunction markdownTableRow(row: string[], shouldEscape = true): string {\n const cells = row.map((value) => (shouldEscape ? escapeMarkdownTableCell(value) : value));\n return `| ${cells.join(\" | \")} |\\n`;\n}\n\nfunction escapeMarkdownTableCell(value: string): string {\n return escapeMarkdown(value)\n .replaceAll(\"|\", \"\\\\|\")\n .replace(/\\s*\\n\\s*/g, \"<br>\");\n}\n\nfunction isFinancialSummary(block: Extract<SemanticBlock, { type: \"definitionList\" }>): boolean {\n return (\n block.entries.length > 0 &&\n block.entries.every((entry) => isNumericValue(entry.description)) &&\n block.entries.some((entry) => /\\p{Sc}|%/u.test(entry.description))\n );\n}\n\nfunction isNumericValue(value: string): boolean {\n return /^(?:\\p{Sc}\\s*)?[\\d.,'’\\s]+(?:\\s*%)?$/u.test(value.trim());\n}\n\nfunction financialSummaryRow(\n entry: Extract<SemanticBlock, { type: \"definitionList\" }>[\"entries\"][number],\n columns: number,\n): string {\n const colspan = columns > 2 ? ` colspan=\"${columns - 1}\"` : \"\";\n return `<tr><th scope=\"row\"${colspan}>${escapeHtml(entry.term)}</th><td>${escapeHtml(entry.description)}</td></tr>`;\n}\n\nfunction semanticBlockHtml(block: SemanticBlock, defaultColor = \"#000000\"): string {\n if (block.type === \"insetGroup\") {\n return `<div class=\"pdf-semantic-inset\" style=\"margin-inline-start:${block.indentEm}em\">${block.blocks.map((item) => semanticBlockHtml(item, defaultColor)).join(\"\")}</div>`;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n const header = tableHeader(rows);\n return `<table>${rows.map((row, index) => tableRow(row, Boolean(header && index === 0))).join(\"\")}</table>`;\n }\n if (block.type === \"heading\")\n return `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor, false)}</h${block.level}>`;\n if (block.type === \"paragraph\")\n return `<p>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`;\n if (block.type === \"preformatted\") return `<pre>${escapeHtml(block.text)}</pre>`;\n if (block.type === \"definitionList\") {\n if (\n block.entries.length <= 3 &&\n block.entries.some((entry) => entry.description.trim().split(/\\s+/).length >= 5) &&\n block.entries.every((entry) => /^[A-Z][A-Z\\s/-]*$/.test(entry.term.trim()))\n ) {\n return block.entries\n .map(\n (entry) =>\n `<section><h2>${escapeHtml(titleCase(entry.term))}</h2><p>${escapeHtml(entry.description)}</p></section>`,\n )\n .join(\"\");\n }\n const list = `<dl>${block.entries\n .map(\n (entry) =>\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n )\n .join(\"\")}</dl>`;\n return isFinancialSummary(block) ? `<section>${list}</section>` : list;\n }\n if (block.type === \"cardList\") {\n return `<section><h2>Items ordered</h2><table><thead><tr><th scope=\"col\">Item</th><th scope=\"col\">Quantity</th><th scope=\"col\">Amount</th></tr></thead><tbody>${block.items.map(cardTableRow).join(\"\")}</tbody></table></section>`;\n }\n if (block.type === \"sectionGroup\") {\n return block.items.map(labeledSectionHtml).join(\"\");\n }\n if (block.type === \"employment\") {\n return `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`;\n }\n const tag = block.ordered ? \"ol\" : \"ul\";\n return `<${tag}>${block.items.map((item) => `<li>${semanticTextHtml(item.text, item.lines, defaultColor)}</li>`).join(\"\")}</${tag}>`;\n}\n\nfunction semanticBlockOutput(\n block: SemanticBlock,\n defaultColor: string,\n format: SemanticDocumentFormat,\n): string {\n return format === \"markdown\"\n ? semanticBlockMarkdown(block, defaultColor)\n : semanticBlockHtml(block, defaultColor);\n}\n\nfunction semanticBlockMarkdown(block: SemanticBlock, defaultColor = \"#000000\"): string {\n if (block.type === \"insetGroup\") {\n const content = block.blocks.map((item) => semanticBlockMarkdown(item, defaultColor)).join(\"\");\n return `${content\n .trimEnd()\n .split(\"\\n\")\n .map((line) => (line ? `> ${line}` : \">\"))\n .join(\"\\n\")}\\n\\n`;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n const header = tableHeader(rows);\n return `${markdownTableStart(rows, header)}${(header ? rows.slice(1) : rows)\n .map((row) => markdownTableRow(row))\n .join(\"\")}\\n`;\n }\n if (block.type === \"heading\") {\n return `${\"#\".repeat(block.level)} ${semanticTextMarkdown(block.text, block.lines, defaultColor, false)}\\n\\n`;\n }\n if (block.type === \"paragraph\") {\n return `${semanticTextMarkdown(block.text, block.lines, defaultColor)}\\n\\n`;\n }\n if (block.type === \"preformatted\") {\n const fence = block.text.includes(\"```\") ? \"````\" : \"```\";\n return `${fence}\\n${block.text}\\n${fence}\\n\\n`;\n }\n if (block.type === \"definitionList\") {\n return `${block.entries\n .map((entry) => `**${escapeMarkdown(entry.term)}:** ${escapeMarkdown(entry.description)}`)\n .join(\"\\n\\n\")}\\n\\n`;\n }\n if (block.type === \"cardList\") {\n const rows = [\n [\"Item\", \"Quantity\", \"Amount\"],\n ...block.items.map((item) => {\n const trailing = item.details.at(-1) ?? \"\";\n const match = /^\\s*[×x]\\s*(\\d+)\\s+(.+)$/u.exec(trailing);\n const detail = item.details.slice(0, -1).join(\" \");\n return [\n `${item.title}${detail ? ` — ${detail}` : \"\"}`,\n match?.[1] ?? \"\",\n match?.[2] ?? trailing,\n ];\n }),\n ];\n return `## Items ordered\\n\\n${markdownTableStart(rows, rows[0])}${rows\n .slice(1)\n .map((row) => markdownTableRow(row))\n .join(\"\")}\\n`;\n }\n if (block.type === \"sectionGroup\") {\n return block.items\n .map(\n (item) =>\n `## ${escapeMarkdown(titleCase(item.label))}\\n\\n${item.content\n .map((content, index) =>\n index === 0 ? `**${escapeMarkdown(content)}**` : escapeMarkdown(content),\n )\n .join(\"\\n\\n\")}\\n\\n`,\n )\n .join(\"\");\n }\n if (block.type === \"employment\") {\n return `### ${escapeMarkdown(block.role)}\\n\\n${escapeMarkdown(block.organization)}\\n\\n${escapeMarkdown(block.date)}\\n\\n`;\n }\n return `${block.items\n .map(\n (item, index) =>\n `${block.ordered ? `${index + 1}.` : \"-\"} ${semanticTextMarkdown(item.text, item.lines, defaultColor)}`,\n )\n .join(\"\\n\")}\\n\\n`;\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction cardTableRow(item: Extract<SemanticBlock, { type: \"cardList\" }>[\"items\"][number]): string {\n const trailing = item.details.at(-1) ?? \"\";\n const match = /^\\s*[×x]\\s*(\\d+)\\s+(.+)$/u.exec(trailing);\n const description = item.details.slice(0, -1).join(\" \");\n const detail = description ? `<br><span>${escapeHtml(description)}</span>` : \"\";\n const quantity = match?.[1] ?? \"\";\n const amount = match?.[2] ?? trailing;\n return `<tr><th scope=\"row\">${escapeHtml(item.title)}${detail}</th><td>${escapeHtml(quantity)}</td><td>${escapeHtml(amount)}</td></tr>`;\n}\n\nfunction labeledSectionHtml(\n item: Extract<SemanticBlock, { type: \"sectionGroup\" }>[\"items\"][number],\n): string {\n const heading = titleCase(item.label);\n const postal = /\\b(?:ship|deliver|mail)(?:ed)?\\b/i.test(item.label);\n if (postal) {\n const [name, ...address] = item.content;\n const content = [name ? `<strong>${escapeHtml(name)}</strong>` : \"\", ...address.map(escapeHtml)]\n .filter(Boolean)\n .join(\"<br>\");\n return `<section><h2>${escapeHtml(heading)}</h2><address>${content}</address></section>`;\n }\n return `<section><h2>${escapeHtml(heading)}</h2>${item.content\n .map(\n (content, index) =>\n `<p>${index === 0 ? `<strong>${escapeHtml(content)}</strong>` : escapeHtml(content)}</p>`,\n )\n .join(\"\")}</section>`;\n}\n\nfunction titleCase(value: string): string {\n const normalized = value.trim().toLocaleLowerCase(\"en\");\n return normalized.replace(/^\\p{L}/u, (letter) => letter.toLocaleUpperCase(\"en\"));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction escapeMarkdown(value: string): string {\n return value.replace(/([\\\\`*_[\\]<>])/g, \"\\\\$1\");\n}\n","import type { TextLine } from \"@boxpdf/reader/structure\";\n\ninterface StyledRange {\n start: number;\n end: number;\n color?: string;\n bold: boolean;\n italic: boolean;\n}\n\nexport function dominantTextColor(lines: TextLine[]): string {\n const counts = new Map<string, number>();\n for (const span of lines.flatMap((line) => line.spans)) {\n const color = normalizedColor(span.color) ?? \"#000000\";\n counts.set(color, (counts.get(color) ?? 0) + Math.max(1, [...span.text].length));\n }\n return [...counts].sort((left, right) => right[1] - left[1])[0]?.[0] ?? \"#000000\";\n}\n\nexport function semanticTextHtml(\n text: string,\n lines: TextLine[],\n defaultColor: string,\n preserveWeight = true,\n): string {\n return semanticText(text, lines, defaultColor, preserveWeight, \"html\");\n}\n\nexport function semanticTextMarkdown(\n text: string,\n lines: TextLine[],\n defaultColor: string,\n preserveWeight = true,\n): string {\n return semanticText(text, lines, defaultColor, preserveWeight, \"markdown\");\n}\n\nfunction semanticText(\n text: string,\n lines: TextLine[],\n defaultColor: string,\n preserveWeight: boolean,\n format: \"html\" | \"markdown\",\n): string {\n const ranges: StyledRange[] = [];\n let cursor = 0;\n for (const span of lines.flatMap((line) => line.spans)) {\n if (!span.text) continue;\n const start = text.indexOf(span.text, cursor);\n if (start < 0) continue;\n cursor = start + span.text.length;\n const color = normalizedColor(span.color);\n const bold =\n preserveWeight && /(?:bold|semibold|demi|medium|medi)/i.test(span.fontFamily ?? \"\");\n const italic = /(?:italic|oblique|slanted|slant|ital)/i.test(span.fontFamily ?? \"\");\n const nondefaultColor = color && color !== defaultColor ? color : undefined;\n if (nondefaultColor || bold || italic) {\n ranges.push({\n start,\n end: cursor,\n ...(nondefaultColor ? { color: nondefaultColor } : {}),\n bold,\n italic,\n });\n }\n }\n const merged = mergeRanges(ranges, text);\n let html = \"\";\n let offset = 0;\n for (const range of merged) {\n html += escapeText(text.slice(offset, range.start), format);\n html += styledText(text.slice(range.start, range.end), range, format);\n offset = range.end;\n }\n return html + escapeText(text.slice(offset), format);\n}\n\nfunction mergeRanges(ranges: StyledRange[], text: string): StyledRange[] {\n const merged: StyledRange[] = [];\n for (const range of ranges) {\n const previous = merged.at(-1);\n if (\n previous &&\n previous.color === range.color &&\n previous.bold === range.bold &&\n previous.italic === range.italic &&\n /^\\s*$/.test(text.slice(previous.end, range.start))\n ) {\n previous.end = range.end;\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nfunction styledText(value: string, range: StyledRange, format: \"html\" | \"markdown\"): string {\n let html = escapeText(value, format);\n if (range.color) html = `<span style=\"color:${range.color}\">${html}</span>`;\n if (range.italic) html = format === \"html\" ? `<em>${html}</em>` : `_${html}_`;\n if (range.bold) html = format === \"html\" ? `<strong>${html}</strong>` : `**${html}**`;\n return html;\n}\n\nfunction escapeText(value: string, format: \"html\" | \"markdown\"): string {\n return format === \"html\" ? escapeHtml(value) : escapeMarkdown(value);\n}\n\nfunction escapeMarkdown(value: string): string {\n return value.replace(/([\\\\`*_[\\]<>])/g, \"\\\\$1\");\n}\n\nfunction normalizedColor(value: string | undefined): string | undefined {\n if (!value || !/^#[\\da-f]{6}$/i.test(value)) return undefined;\n const color = value.toLowerCase();\n return color === \"#000000\" || color === \"#000\" ? \"#000000\" : color;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n","import type { Rect, VectorFill, VectorPath } from \"@boxpdf/reader\";\n\nexport function vectorFillSvg(fill: VectorFill): string {\n if (!isCssHexColor(fill.color)) return \"\";\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n return `<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>`;\n}\n\nexport function vectorPathSvg(path: VectorPath, pageNumber: number, pathIndex: number): string {\n if (!isSvgPath(path.d)) return \"\";\n const fill = isCssHexColor(path.fill) ? path.fill : \"none\";\n const stroke = isCssHexColor(path.stroke) ? path.stroke : \"none\";\n const width = finiteNonnegative(path.strokeWidth)\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n const fillOpacity = isUnitInterval(path.fillOpacity)\n ? ` fill-opacity=\"${number(path.fillOpacity)}\"`\n : \"\";\n const strokeOpacity = isUnitInterval(path.strokeOpacity)\n ? ` stroke-opacity=\"${number(path.strokeOpacity)}\"`\n : \"\";\n const dash = path.strokeDasharray?.every(finiteNonnegative)\n ? ` stroke-dasharray=\"${path.strokeDasharray.map(number).join(\" \")}\"`\n : \"\";\n const dashoffset = Number.isFinite(path.strokeDashoffset)\n ? ` stroke-dashoffset=\"${number(path.strokeDashoffset ?? 0)}\"`\n : \"\";\n const linecap = path.strokeLinecap ? ` stroke-linecap=\"${path.strokeLinecap}\"` : \"\";\n const linejoin = path.strokeLinejoin ? ` stroke-linejoin=\"${path.strokeLinejoin}\"` : \"\";\n const rule = path.fillRule ? ` fill-rule=\"${path.fillRule}\"` : \"\";\n let output = `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}${fillOpacity}${strokeOpacity}${dash}${dashoffset}${linecap}${linejoin}${rule}/>`;\n for (let index = (path.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${vectorPathClipId(pageNumber, pathIndex, index)})\">${output}</g>`;\n }\n return output;\n}\n\nexport function vectorPathClipDefinitions(\n paths: ReadonlyArray<{ path: VectorPath; index: number }>,\n pageNumber: number,\n): string {\n return paths\n .flatMap(({ path, index: pathIndex }) =>\n (path.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const rule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${vectorPathClipId(pageNumber, pathIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\"${rule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nexport function vectorPathBounds(path: VectorPath): Rect | undefined {\n if (!isSvgPath(path.d)) return undefined;\n const values = [...path.d.matchAll(/[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/gi)].map((match) =>\n Number(match[0]),\n );\n if (values.length < 2) return undefined;\n const xs: number[] = [];\n const ys: number[] = [];\n for (let index = 0; index + 1 < values.length; index += 2) {\n xs.push(values[index] ?? 0);\n ys.push(values[index + 1] ?? 0);\n }\n return bounds(xs, ys);\n}\n\nexport function vectorFillBounds(fill: VectorFill): Rect | undefined {\n if (fill.points.length === 0) return undefined;\n return bounds(\n fill.points.map(([x]) => x),\n fill.points.map(([, y]) => y),\n );\n}\n\nexport function isSvgPath(value: string): boolean {\n return value.length <= 1_000_000 && /^[\\d\\s.,+\\-eEMmLlCcZz]+$/.test(value);\n}\n\nfunction bounds(xs: number[], ys: number[]): Rect {\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n return { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };\n}\n\nfunction vectorPathClipId(pageNumber: number, pathIndex: number, clipIndex: number): string {\n return `boxpdf-path-clip-${pageNumber}-${pathIndex}-${clipIndex}`;\n}\n\nfunction isCssHexColor(value: string | undefined): value is string {\n return typeof value === \"string\" && /^#[0-9a-f]{6}$/i.test(value);\n}\n\nfunction finiteNonnegative(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value) && value >= 0;\n}\n\nfunction isUnitInterval(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value) && value >= 0 && value <= 1;\n}\n\nfunction number(value: number): string {\n return Number(value.toFixed(4)).toString();\n}\n","import type { EmbeddedFont } from \"@boxpdf/reader\";\n\nexport function visualFontAliases(pageNumber: number, fonts: EmbeddedFont[]): Map<string, string> {\n return new Map(\n fonts\n .filter((font) => font.format === \"truetype\" && !/(?:courier|^TTE)/i.test(font.family ?? \"\"))\n .map((font) => [font.id, `boxpdf-${pageNumber}-${font.id}`]),\n );\n}\n\nexport function visualFontFace(font: EmbeddedFont, aliases: Map<string, string>): string {\n if (font.format !== \"truetype\") return \"\";\n const alias = aliases.get(font.id);\n if (!alias) return \"\";\n const styles = visualFontStyles(font.family, alias).filter(\n (style) => !style.startsWith(\"font-family:\"),\n );\n return `@font-face{font-family:${alias};src:url(data:font/ttf;base64,${base64(font.data)}) format(\"truetype\");${styles.join(\";\")}}`;\n}\n\nexport function visualFontStyles(fontFamily: string | undefined, alias?: string): string[] {\n const normalized = fontFamily?.toLowerCase() ?? \"\";\n const styles: string[] = [];\n let fallback: string | undefined;\n if (/courier|mono|nimbusmono|^cmtt/.test(normalized)) {\n fallback = \"Courier New,Courier,monospace\";\n } else if (\n /times|minion|serif|baskerville|georgia|nimbusrom|guardian.*egyp|^cm[rs]y?\\d/.test(normalized)\n ) {\n fallback = \"Times New Roman,Times,serif\";\n } else if (/helvetica|arial|sans|nimbussan|calibre|myriad|panton|^tte|^mstt/.test(normalized)) {\n fallback = \"Arial,Helvetica,sans-serif\";\n }\n if (alias || fallback) styles.push(`font-family:${[alias, fallback].filter(Boolean).join(\",\")}`);\n if (/bold|black|semibold|demi|medi|^tte/.test(normalized)) styles.push(\"font-weight:700\");\n if (/italic|oblique|slant|ital(?:$|[_-])/.test(normalized)) styles.push(\"font-style:italic\");\n return styles;\n}\n\nexport function base64(bytes: Uint8Array): string {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n let output = \"\";\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1] ?? 0;\n const third = bytes[index + 2] ?? 0;\n output += alphabet[first >> 2];\n output += alphabet[((first & 3) << 4) | (second >> 4)];\n output += index + 1 < bytes.length ? alphabet[((second & 15) << 2) | (third >> 6)] : \"=\";\n output += index + 2 < bytes.length ? alphabet[third & 63] : \"=\";\n }\n return output;\n}\n","import type {\n ExtractedPage,\n RasterImage,\n Rect,\n TextSpan,\n VectorFill,\n VectorPath,\n} from \"@boxpdf/reader\";\nimport {\n vectorFillBounds,\n vectorFillSvg,\n vectorPathBounds,\n vectorPathClipDefinitions,\n vectorPathSvg,\n} from \"./vector-svg.js\";\nimport { base64, visualFontAliases, visualFontFace, visualFontStyles } from \"./visual-font.js\";\n\nexport interface SemanticMedia {\n bounds: Rect;\n html: string;\n markdown: string;\n consumedSpans?: TextSpan[];\n kind?: \"raster\" | \"vector\" | \"composite\";\n assets?: HtmlImageAsset[];\n}\n\nexport interface HtmlImageAsset {\n name: string;\n mimeType: \"image/bmp\" | \"image/jpeg\" | \"image/svg+xml\";\n data: Uint8Array;\n}\n\nexport type HtmlImageOptions = \"embedded\" | \"references\" | \"excluded\";\n\nexport function semanticMedia(\n page: ExtractedPage,\n imageOptions: HtmlImageOptions = \"embedded\",\n): SemanticMedia[] {\n if (imageOptions === \"excluded\") return [];\n const output = (page.images ?? []).map((image, index) =>\n rasterMedia(image, page.number, index, imageOptions),\n );\n output.push(...vectorMedia(page, imageOptions));\n return mediaComponents(output, page).sort((left, right) => right.bounds.y - left.bounds.y);\n}\n\nexport async function prepareSemanticMedia(\n page: ExtractedPage,\n imageOptions: HtmlImageOptions,\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>,\n): Promise<SemanticMedia[]> {\n const media = semanticMedia(page, imageOptions);\n for (const item of media) {\n for (const asset of item.assets ?? []) await onImage?.(asset);\n delete item.assets;\n }\n return media;\n}\n\nfunction rasterMedia(\n image: RasterImage,\n pageNumber: number,\n index: number,\n imageOptions: HtmlImageOptions,\n): SemanticMedia {\n const bounds = transformedUnitBounds(image.transform);\n const mime = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n const extension = image.format === \"jpeg\" ? \"jpg\" : \"bmp\";\n const name = `page-${pageNumber}-image-${index + 1}.${extension}`;\n const source = imageOptions === \"references\" ? name : `data:${mime};base64,${base64(data)}`;\n const opacity = unitInterval(image.opacity) ? `;opacity:${number(image.opacity)}` : \"\";\n return {\n bounds,\n kind: \"raster\",\n html: `<img class=\"pdf-semantic-media\" src=\"${source}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" alt=\"\" style=\"max-width:100%;height:auto${opacity}\">`,\n markdown: `![](${source})`,\n ...(imageOptions === \"references\" ? { assets: [{ name, mimeType: mime, data }] } : {}),\n };\n}\n\nfunction vectorMedia(page: ExtractedPage, imageOptions: HtmlImageOptions): SemanticMedia[] {\n const primitives: VectorPrimitive[] = [\n ...(page.paths ?? []).flatMap((path, index) => {\n const bounds = vectorPathBounds(path);\n return bounds ? [{ type: \"path\" as const, value: path, index, bounds }] : [];\n }),\n ...(page.fills ?? []).flatMap((fill) => {\n const bounds = vectorFillBounds(fill);\n return bounds && !isPageBackground(fill, bounds, page)\n ? [{ type: \"fill\" as const, value: fill, bounds }]\n : [];\n }),\n ];\n const components = vectorComponents(primitives, Math.min(36, page.width * 0.06)).filter(\n (component) =>\n component.primitives.length >= 2 ||\n component.bounds.width * component.bounds.height >= page.width * page.height * 0.002,\n );\n const aliases = visualFontAliases(page.number, page.fonts ?? []);\n const visualCodeFonts = new Set(\n (page.fonts ?? [])\n .filter((font) => font.format === \"truetype\" && font.visualCodeMapping)\n .map((font) => font.id),\n );\n return components.map((component, componentIndex) => {\n const bounds = component.bounds;\n const paths = component.primitives.flatMap((primitive) =>\n primitive.type === \"path\" ? [{ path: primitive.value, index: primitive.index }] : [],\n );\n const fills = component.primitives.flatMap((primitive) =>\n primitive.type === \"fill\" ? [primitive.value] : [],\n );\n const visualSpans = page.visualSpans ?? page.spans;\n const overlay = visualSpans.filter(\n (span) =>\n span.fontAssetId &&\n visualCodeFonts.has(span.fontAssetId) &&\n centerInside(span.bounds, bounds),\n );\n const consumedSpans = page.spans.filter(\n (span) =>\n span.fontAssetId &&\n visualCodeFonts.has(span.fontAssetId) &&\n centerInside(span.bounds, bounds),\n );\n const fontIds = new Set(overlay.map((span) => span.fontAssetId));\n const fontFaces = (page.fonts ?? [])\n .filter((font) => fontIds.has(font.id))\n .map((font) => visualFontFace(font, aliases))\n .join(\"\");\n const svg = `<svg class=\"pdf-semantic-media\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${number(bounds.x)} ${number(page.height - bounds.y - bounds.height)} ${number(bounds.width)} ${number(bounds.height)}\" style=\"display:block;max-width:100%;height:auto\" aria-hidden=\"true\">${fontFaces ? `<style>${fontFaces}</style>` : \"\"}${paths.length ? `<defs>${vectorPathClipDefinitions(paths, page.number)}</defs>` : \"\"}<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">${fills.map(vectorFillSvg).join(\"\") + paths.map(({ path, index }) => vectorPathSvg(path, page.number, index)).join(\"\")}</g>${overlay.map((span) => vectorText(span, page.height, aliases)).join(\"\")}</svg>`;\n const name = `page-${page.number}-vector-${componentIndex + 1}.svg`;\n return {\n bounds,\n kind: \"vector\" as const,\n html:\n imageOptions === \"references\"\n ? `<img class=\"pdf-semantic-media\" src=\"${name}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" alt=\"\">`\n : svg,\n markdown: imageOptions === \"references\" ? `![](${name})` : svg,\n ...(imageOptions === \"references\"\n ? {\n assets: [\n { name, mimeType: \"image/svg+xml\" as const, data: new TextEncoder().encode(svg) },\n ],\n }\n : {}),\n ...(consumedSpans.length > 0 ? { consumedSpans } : {}),\n };\n });\n}\n\nfunction mediaComponents(media: SemanticMedia[], page: ExtractedPage): SemanticMedia[] {\n const components: SemanticMedia[][] = [];\n for (const item of media) {\n if (isPageBackdrop(item.bounds, page)) {\n components.push([item]);\n continue;\n }\n const matches = components.filter(\n (component) =>\n !component.some((member) => isPageBackdrop(member.bounds, page)) &&\n component.some((member) => mediaPiecesTouch(member.bounds, item.bounds)),\n );\n if (matches.length === 0) {\n components.push([item]);\n continue;\n }\n const target = matches[0] as SemanticMedia[];\n target.push(item);\n for (const component of matches.slice(1)) {\n target.push(...component);\n components.splice(components.indexOf(component), 1);\n }\n }\n return components.map((component) => compositeMedia(component));\n}\n\nfunction compositeMedia(items: SemanticMedia[]): SemanticMedia {\n if (items.length === 1) return items[0] as SemanticMedia;\n const bounds = unionBounds(items.map((item) => item.bounds)) as Rect;\n const layers = items\n .map((item) => {\n const left = ((item.bounds.x - bounds.x) / bounds.width) * 100;\n const top =\n ((bounds.y + bounds.height - item.bounds.y - item.bounds.height) / bounds.height) * 100;\n const width = (item.bounds.width / bounds.width) * 100;\n const height = (item.bounds.height / bounds.height) * 100;\n return `<div style=\"position:absolute;left:${number(left)}%;top:${number(top)}%;width:${number(width)}%;height:${number(height)}%;overflow:hidden\">${item.html}</div>`;\n })\n .join(\"\");\n return {\n bounds,\n kind: \"composite\",\n html: `<div class=\"pdf-semantic-media pdf-semantic-media-composite\" style=\"position:relative;max-width:100%;width:${number(bounds.width)}px;aspect-ratio:${number(bounds.width)}/${number(bounds.height)}\">${layers}</div>`,\n markdown: items.map((item) => item.markdown).join(\"\\n\\n\"),\n consumedSpans: items.flatMap((item) => item.consumedSpans ?? []),\n assets: items.flatMap((item) => item.assets ?? []),\n };\n}\n\nfunction mediaPiecesTouch(left: Rect, right: Rect): boolean {\n const xOverlap = overlap(left.x, left.width, right.x, right.width);\n const yOverlap = overlap(left.y, left.height, right.y, right.height);\n if (xOverlap > 0 && yOverlap > 0) return true;\n const horizontalGap = axisGap(left.x, left.width, right.x, right.width);\n const verticalGap = axisGap(left.y, left.height, right.y, right.height);\n if (horizontalGap <= 2 && yOverlap / Math.min(left.height, right.height) >= 0.65) return true;\n return verticalGap <= 2 && xOverlap / Math.min(left.width, right.width) >= 0.65;\n}\n\nfunction isPageBackdrop(bounds: Rect, page: ExtractedPage): boolean {\n return bounds.width * bounds.height >= page.width * page.height * 0.7;\n}\n\nfunction overlap(left: number, leftSize: number, right: number, rightSize: number): number {\n return Math.max(0, Math.min(left + leftSize, right + rightSize) - Math.max(left, right));\n}\n\nfunction axisGap(left: number, leftSize: number, right: number, rightSize: number): number {\n return Math.max(0, right - left - leftSize, left - right - rightSize);\n}\n\ntype VectorPrimitive =\n | { type: \"path\"; value: VectorPath; index: number; bounds: Rect }\n | { type: \"fill\"; value: VectorFill; bounds: Rect };\n\ninterface VectorComponent {\n bounds: Rect;\n primitives: VectorPrimitive[];\n}\n\nfunction vectorComponents(primitives: VectorPrimitive[], padding: number): VectorComponent[] {\n const components: VectorComponent[] = [];\n for (const primitive of primitives) {\n const matches = components.filter((component) =>\n nearby(component.bounds, primitive.bounds, padding),\n );\n if (matches.length === 0) {\n components.push({ bounds: primitive.bounds, primitives: [primitive] });\n continue;\n }\n const target = matches[0] as VectorComponent;\n target.primitives.push(primitive);\n target.bounds = unionBounds([target.bounds, primitive.bounds]) as Rect;\n for (const component of matches.slice(1)) {\n target.primitives.push(...component.primitives);\n target.bounds = unionBounds([target.bounds, component.bounds]) as Rect;\n components.splice(components.indexOf(component), 1);\n }\n }\n return components;\n}\n\nfunction nearby(left: Rect, right: Rect, padding: number): boolean {\n return !(\n left.x + left.width + padding < right.x ||\n right.x + right.width + padding < left.x ||\n left.y + left.height + padding < right.y ||\n right.y + right.height + padding < left.y\n );\n}\n\nfunction isPageBackground(fill: VectorFill, bounds: Rect, page: ExtractedPage): boolean {\n if (!/^#f{6}$/i.test(fill.color)) return false;\n const outside =\n bounds.x < 0 ||\n bounds.y < 0 ||\n bounds.x + bounds.width > page.width ||\n bounds.y + bounds.height > page.height;\n const large = bounds.width * bounds.height > page.width * page.height * 0.2;\n return outside || large;\n}\n\nexport function withoutSemanticMediaSpans(\n page: ExtractedPage,\n media: SemanticMedia[],\n): ExtractedPage {\n const consumed = new Set(media.flatMap((item) => item.consumedSpans ?? []));\n return consumed.size > 0\n ? { ...page, spans: page.spans.filter((span) => !consumed.has(span)) }\n : page;\n}\n\nfunction vectorText(span: TextSpan, pageHeight: number, aliases: Map<string, string>): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const styles = [\n cssColor(span.color) ? `fill:${span.color}` : \"\",\n unitInterval(span.fillOpacity) ? `fill-opacity:${number(span.fillOpacity)}` : \"\",\n ...visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? aliases.get(span.fontAssetId) : undefined,\n ),\n ]\n .filter(Boolean)\n .join(\";\");\n const anchorY = pageHeight - span.bounds.y;\n const transform = span.transform;\n const position = transform\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(anchorY)})\"`\n : ` x=\"${number(span.bounds.x)}\" y=\"${number(anchorY)}\"`;\n const extent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const length =\n extent > 0 ? ` textLength=\"${number(extent)}\" lengthAdjust=\"spacingAndGlyphs\"` : \"\";\n return `<text${position} font-size=\"${number(span.fontSize)}\"${length}${styles ? ` style=\"${styles}\"` : \"\"}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction centerInside(inner: Rect, outer: Rect): boolean {\n const x = inner.x + inner.width / 2;\n const y = inner.y + inner.height / 2;\n return x >= outer.x && x <= outer.x + outer.width && y >= outer.y && y <= outer.y + outer.height;\n}\n\nfunction transformedUnitBounds([a, b, c, d, e, f]: RasterImage[\"transform\"]): Rect {\n const points = [\n [e, f],\n [a + e, b + f],\n [c + e, d + f],\n [a + c + e, b + d + f],\n ];\n const xs = points.map(([x]) => x ?? 0);\n const ys = points.map(([, y]) => y ?? 0);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction unionBounds(bounds: Array<Rect | undefined>): Rect | undefined {\n const values = bounds.filter((value): value is Rect => Boolean(value));\n if (values.length === 0) return undefined;\n const x = Math.min(...values.map((value) => value.x));\n const y = Math.min(...values.map((value) => value.y));\n const right = Math.max(...values.map((value) => value.x + value.width));\n const top = Math.max(...values.map((value) => value.y + value.height));\n return { x, y, width: right - x, height: top - y };\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output.set([0x42, 0x4d]);\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction cssColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction finiteNonnegative(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0;\n}\n\nfunction unitInterval(value: number | undefined): value is number {\n return finiteNonnegative(value) && value <= 1;\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1_000) / 1_000) : \"0\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAAA,oBAA+D;;;ACuB/D,IAAM,sBAAsB;AA4BrB,SAAS,8BACd,OACA,QACA,WACA,YACA,WACmC;AACnC,QAAM,aAAa,OAAO,QAAQ,CAAC,UAAU;AAC3C,UAAM,YAAY,iBAAiB,KAAK;AACxC,WAAO,YAAY,CAAC,SAAS,IAAI,CAAC;AAAA,EACpC,CAAC;AACD,QAAM,cAAc,MAAM;AAAA,IAAQ,CAAC,SACjC,WAAW,QAAQ,CAAC,cAAc;AAChC,YAAM,WAAW,aAAa,MAAM,WAAW,WAAW,YAAY,WAAW,CAAC;AAClF,aAAO,WAAW,CAAC,EAAE,OAAO,MAAM,WAAW,SAAS,CAAC,IAAI,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AACA,QAAM,WAAW,iBAAiB,WAAW;AAC7C,QAAM,QAAQ,YACX,IAAI,CAAC,SAAS;AACb,UAAM,WAAW;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,IAAI,WAAW,IAAI,CAAC,KAAK;AAAA,IACpC;AACA,WAAO,WAAW,EAAE,GAAG,MAAM,SAAS,IAAI;AAAA,EAC5C,CAAC,EACA,OAAO,CAAC,SAA8B,QAAQ,IAAI,CAAC,EACnD,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,mBAAmB;AAC9D,QAAM,eAAe,UAAU,OAAO,CAAC,SAAS,KAAK,KAAK;AAC1D,QAAM,iBAAiB,UAAU,OAAO,CAAC,SAAS,KAAK,UAAU,KAAK;AACtE,QAAM,eAAe,oBAAI,IAAkC;AAC3D,aAAW,QAAQ,OAAO;AACxB,QACE,aAAa,IAAI,KAAK,KAAK,MAAM,QACjC,eAAe,IAAI,KAAK,UAAU,KAAK,MAAM,MAC7C;AACA,mBAAa,IAAI,KAAK,UAAU,OAAO,KAAK,KAAK;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,OACA,WACA,WACA,YACA,WACA,mBACkC;AAClC,MAAI,CAAC,WAAW,MAAM,QAAQ,WAAW,UAAU,EAAG,QAAO;AAC7D,MAAI,MAAM,OAAO,QAAQ,YAAY,QAAQ,MAAM,OAAO,SAAS,UAAU,aAAa;AACxF,WAAO;AACT,QAAM,WAAW,iBAAiB,MAAM,QAAQ,UAAU,MAAM;AAChE,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,aAAa,KAAK,IAAI,UAAU,aAAa,GAAG,aAAa,KAAK;AACxE,MAAI,SAAS,MAAM,WAAY,QAAO;AACtC,QAAM,eAAe;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,EACnB;AACA,QAAM,oBACJ,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,OAAO,OAAO,UAAU,OAAO,KAAK,CAAC;AACjF,QAAM,iBAAiB,KAAK,IAAI,OAAO,MAAM,MAAM,IAAI,OAAO,UAAU,MAAM,CAAC;AAC/E,QAAM,kBAAkB;AAAA,IACtB,IAAI,iBAAiB,KAAK,IAAI,MAAM,OAAO,OAAO,UAAU,OAAO,KAAK;AAAA,EAC1E;AACA,MAAI,oBAAoB,QAAQ,kBAAkB,KAAM,QAAO;AAC/D,QAAM,gBACJ,KAAK,IAAI,MAAM,OAAO,OAAO,UAAU,OAAO,KAAK,IACnD,KAAK,IAAI,MAAM,OAAO,OAAO,UAAU,OAAO,KAAK;AACrD,QAAM,WAAW,QAAQ,IAAI,SAAS,MAAM,UAAU;AACtD,QAAM,qBAAqB,iBAAiB,MAAM,QAAQ,WAAW,SAAS,MAAM,SAAS;AAC7F,MAAI,uBAAuB,EAAG,QAAO;AACrC,MAAI,SAAS,SAAS,YAAY,WAAW,OAAO,qBAAqB,GAAI,QAAO;AACpF,QAAM,eAAe,oBAAoB,WAAW,SAAS;AAC7D,QAAM,wBAAwB,gBAAgB,WAAW,SAAS,MAAM,SAAS,KAAK,SAAS;AAC/F,QAAM,QACJ,WAAW,OACX,oBAAoB,OACpB,kBAAkB,OAClB,gBAAgB,OAChB,eAAe,OACf,wBAAwB,OACxB,qBAAqB,OACrB,oBAAoB;AACtB,SAAO;AAAA,IACL;AAAA,IACA,MAAM,SAAS;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAoD;AAC5E,MAAI,MAAM,SAAS,eAAe,MAAM,MAAM,WAAW,EAAG,QAAO;AACnE,QAAM,QAAQ,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,KAAK,CAAC,SAAS,MAAM,KAAK,KAAK,IAAI,CAAC;AAC5F,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,WAAW,MAAM,KAAK;AAAA,IAC9B,YAAY,OAAO,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,MAAM,CAAC;AAAA,IAChE,MAAM,cAAc,KAAK;AAAA,EAC3B;AACF;AAEA,SAAS,iBACP,OACA,SACsD;AACtD,QAAM,WAAW,MAAM,KAAK,QAAQ,IAAI,QAAQ;AAChD,MAAI,YAAY,CAAC,QAAQ,SAAS,KAAM,QAAO,EAAE,MAAM,SAAS,KAAK,KAAK,IAAI,GAAG,QAAQ,EAAE;AAC3F,QAAM,WAAW,QAAQ,KAAK,MAAM,IAAI,MAAM;AAC9C,MAAI,YAAY,CAAC,QAAQ,SAAS,KAAM,QAAO,EAAE,MAAM,SAAS,KAAK,KAAK,IAAI,GAAG,QAAQ,EAAE;AAC3F,SAAO;AACT;AAEA,SAAS,iBACP,OACA,WACA,MACA,WACQ;AACR,QAAM,QACJ,SAAS,UAAU,UAAU,OAAO,IAAI,UAAU,OAAO,SAAS,MAAM,IAAI,MAAM;AACpF,QAAM,QAAQ,SAAS,UAAU,MAAM,IAAI,UAAU,OAAO;AAC5D,QAAM,WAAW,UAAU;AAAA,IACzB,CAAC,SACC,CAAC,UAAU,MAAM,MAAM,SAAS,IAAI,KACpC,KAAK,OAAO,IAAI,SAChB,KAAK,OAAO,IAAI,KAAK,OAAO,SAAS,SACrC,QAAQ,KAAK,OAAO,GAAG,KAAK,OAAO,OAAO,MAAM,GAAG,MAAM,KAAK,IAC5D,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,OAAO,MAAM,KAAK,CAAC,KACpD;AAAA,EACN;AACA,SAAO,SAAS,WAAW,IAAI,IAAI,SAAS,WAAW,IAAI,OAAO;AACpE;AAEA,SAAS,oBAAoB,WAA6B,WAA+B;AACvF,QAAM,aAAa,UAAU,OAAO,CAAC,SAAS,CAAC,UAAU,MAAM,MAAM,SAAS,IAAI,CAAC;AACnF,MAAI,UAAU,SAAS,sBAAsB,UAAU,EAAG,QAAO;AACjE,QAAM,gBAAgB;AAAA,IACpB,UAAU,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC;AAAA,EACjF;AACA,QAAM,WAAW,OAAO,WAAW,QAAQ,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;AAC7F,SAAO,KAAK,IAAI,gBAAgB,QAAQ,KAAK,OAAO,OAAO;AAC7D;AAEA,SAAS,gBACP,WACA,MACA,UACA,WACQ;AACR,QAAM,WAAW,UACd,OAAO,CAAC,SAAS,CAAC,UAAU,MAAM,MAAM,SAAS,IAAI,CAAC,EACtD;AAAA,IACC,CAAC,SACC,QAAQ,KAAK,OAAO,GAAG,KAAK,OAAO,OAAO,UAAU,OAAO,GAAG,UAAU,OAAO,KAAK,IAAI;AAAA,EAC5F,EACC,QAAQ,CAAC,SAAS;AACjB,QAAI,SAAS,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU,UAAU,OAAO;AAC7E,aAAO,CAAC,UAAU,OAAO,IAAI,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM;AACjE,QAAI,SAAS,WAAW,KAAK,OAAO,KAAK,UAAU,OAAO,IAAI,UAAU,OAAO;AAC7E,aAAO,CAAC,KAAK,OAAO,IAAI,UAAU,OAAO,IAAI,UAAU,OAAO,MAAM;AACtE,WAAO,CAAC;AAAA,EACV,CAAC;AACH,QAAM,UAAU,KAAK,IAAI,GAAG,UAAU,OAAO,iBAAiB;AAC9D,SAAO,OAAO,SAAS,OAAO,IAC1B,SAAS,UAAU,UAAU,aAAa,SAAS,WAAW,UAAU,WAAW,IACnF;AACN;AAEA,SAAS,iBAAiB,OAA2C;AACnE,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,sBAAsB,IAAI,GAAG;AAC5F,WAAO,IAAI,WAAW,IAAI,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,EACtE;AACA,SAAO,IAAI,IAAI,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;AAC7E;AAEA,SAAS,WAAW,MAA2B;AAC7C,QAAM,aAAa,KAAK,UAAU,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,KAAK;AACpF,SAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,aAAa,CAAC,IAAI,CAAC;AACvF;AAEA,SAAS,UAAa,OAAsB,KAAoD;AAC9F,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,IAAI,IAAI,IAAI,CAAC;AACrC,QAAI,CAAC,YAAY,KAAK,SAAS,QAAQ,SAAS,SAAS,MAAO,QAAO,IAAI,IAAI,IAAI,GAAG,IAAI;AAAA,EAC5F;AACA,SAAO;AACT;AAEA,SAAS,WAAWC,SAAc,WAAmB,YAA6B;AAChF,SACEA,QAAO,KAAK,MACZA,QAAO,KAAK,MACZA,QAAO,IAAIA,QAAO,SAAS,YAAY,KACvCA,QAAO,IAAIA,QAAO,UAAU,aAAa;AAE7C;AAEA,SAAS,WAAW,OAAyB;AAC3C,QAAM,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;AACxD,QAAM,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;AACxD,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAChF,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,CAAC;AAC/E,SAAO,EAAE,GAAG,GAAG,OAAO,QAAQ,GAAG,QAAQ,MAAM,EAAE;AACnD;AAEA,SAAS,sBAAsB,OAA2B;AACxD,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,GAAG;AACtD,UAAM,YAAY,cAAc,IAAI;AACpC,WAAO,IAAI,YAAY,OAAO,IAAI,SAAS,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,MAAM,CAAC;AAAA,EACzF;AACA,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAC1E;AAEA,SAAS,cAAc,MAAyC;AAC9D,SAAO,IAAI,KAAK,cAAc,KAAK,YAAY,IAAI,kBAAkB,IAAI,CAAC,IAAI,KAAK,MAAM,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;AACrI;AAEA,SAAS,OAAOA,SAAsB;AACpC,SAAOA,QAAO,IAAIA,QAAO,QAAQ;AACnC;AACA,SAAS,QAAQ,MAAc,UAAkB,OAAe,WAA2B;AACzF,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,UAAU,QAAQ,SAAS,IAAI,KAAK,IAAI,MAAM,KAAK,CAAC;AACzF;AACA,SAAS,QAAQ,OAAuB;AACtC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AACA,SAAS,OAAO,QAA0B;AACxC,QAAM,UAAU,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAC9D,SAAO,QAAQ,KAAK,MAAM,QAAQ,SAAS,CAAC,CAAC,KAAK;AACpD;;;AClTA,uBAMO;;;ACGA,SAAS,kBAAkB,OAA2B;AAC3D,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,GAAG;AACtD,UAAM,QAAQ,gBAAgB,KAAK,KAAK,KAAK;AAC7C,WAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,MAAM,CAAC;AAAA,EACjF;AACA,SAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;AAC1E;AAEO,SAAS,iBACd,MACA,OACA,cACA,iBAAiB,MACT;AACR,SAAO,aAAa,MAAM,OAAO,cAAc,gBAAgB,MAAM;AACvE;AAEO,SAAS,qBACd,MACA,OACA,cACA,iBAAiB,MACT;AACR,SAAO,aAAa,MAAM,OAAO,cAAc,gBAAgB,UAAU;AAC3E;AAEA,SAAS,aACP,MACA,OACA,cACA,gBACA,QACQ;AACR,QAAM,SAAwB,CAAC;AAC/B,MAAI,SAAS;AACb,aAAW,QAAQ,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,GAAG;AACtD,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,QAAQ,KAAK,QAAQ,KAAK,MAAM,MAAM;AAC5C,QAAI,QAAQ,EAAG;AACf,aAAS,QAAQ,KAAK,KAAK;AAC3B,UAAM,QAAQ,gBAAgB,KAAK,KAAK;AACxC,UAAM,OACJ,kBAAkB,sCAAsC,KAAK,KAAK,cAAc,EAAE;AACpF,UAAM,SAAS,yCAAyC,KAAK,KAAK,cAAc,EAAE;AAClF,UAAM,kBAAkB,SAAS,UAAU,eAAe,QAAQ;AAClE,QAAI,mBAAmB,QAAQ,QAAQ;AACrC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,KAAK;AAAA,QACL,GAAI,kBAAkB,EAAE,OAAO,gBAAgB,IAAI,CAAC;AAAA,QACpD;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,SAAS,YAAY,QAAQ,IAAI;AACvC,MAAI,OAAO;AACX,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,YAAQ,WAAW,KAAK,MAAM,QAAQ,MAAM,KAAK,GAAG,MAAM;AAC1D,YAAQ,WAAW,KAAK,MAAM,MAAM,OAAO,MAAM,GAAG,GAAG,OAAO,MAAM;AACpE,aAAS,MAAM;AAAA,EACjB;AACA,SAAO,OAAO,WAAW,KAAK,MAAM,MAAM,GAAG,MAAM;AACrD;AAEA,SAAS,YAAY,QAAuB,MAA6B;AACvE,QAAM,SAAwB,CAAC;AAC/B,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAW,OAAO,GAAG,EAAE;AAC7B,QACE,YACA,SAAS,UAAU,MAAM,SACzB,SAAS,SAAS,MAAM,QACxB,SAAS,WAAW,MAAM,UAC1B,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,GAClD;AACA,eAAS,MAAM,MAAM;AAAA,IACvB,OAAO;AACL,aAAO,KAAK,EAAE,GAAG,MAAM,CAAC;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,OAAoB,QAAqC;AAC1F,MAAI,OAAO,WAAW,OAAO,MAAM;AACnC,MAAI,MAAM,MAAO,QAAO,sBAAsB,MAAM,KAAK,KAAK,IAAI;AAClE,MAAI,MAAM,OAAQ,QAAO,WAAW,SAAS,OAAO,IAAI,UAAU,IAAI,IAAI;AAC1E,MAAI,MAAM,KAAM,QAAO,WAAW,SAAS,WAAW,IAAI,cAAc,KAAK,IAAI;AACjF,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,QAAqC;AACtE,SAAO,WAAW,SAAS,WAAW,KAAK,IAAI,eAAe,KAAK;AACrE;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,mBAAmB,MAAM;AAChD;AAEA,SAAS,gBAAgB,OAA+C;AACtE,MAAI,CAAC,SAAS,CAAC,iBAAiB,KAAK,KAAK,EAAG,QAAO;AACpD,QAAM,QAAQ,MAAM,YAAY;AAChC,SAAO,UAAU,aAAa,UAAU,SAAS,YAAY;AAC/D;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,OAAO;AAC5B;;;AC3HO,SAAS,cAAc,MAA0B;AACtD,MAAI,CAAC,cAAc,KAAK,KAAK,EAAG,QAAO;AACvC,QAAM,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAChF,QAAM,UAAU,eAAe,KAAK,OAAO,IAAI,kBAAkB,OAAO,KAAK,OAAO,CAAC,MAAM;AAC3F,SAAO,oBAAoB,MAAM,WAAW,KAAK,KAAK,IAAI,OAAO;AACnE;AAEO,SAAS,cAAc,MAAkB,YAAoB,WAA2B;AAC7F,MAAI,CAAC,UAAU,KAAK,CAAC,EAAG,QAAO;AAC/B,QAAM,OAAO,cAAc,KAAK,IAAI,IAAI,KAAK,OAAO;AACpD,QAAM,SAAS,cAAc,KAAK,MAAM,IAAI,KAAK,SAAS;AAC1D,QAAM,QAAQ,kBAAkB,KAAK,WAAW,IAC5C,kBAAkB,OAAO,KAAK,WAAW,CAAC,MAC1C;AACJ,QAAM,cAAc,eAAe,KAAK,WAAW,IAC/C,kBAAkB,OAAO,KAAK,WAAW,CAAC,MAC1C;AACJ,QAAM,gBAAgB,eAAe,KAAK,aAAa,IACnD,oBAAoB,OAAO,KAAK,aAAa,CAAC,MAC9C;AACJ,QAAM,OAAO,KAAK,iBAAiB,MAAM,iBAAiB,IACtD,sBAAsB,KAAK,gBAAgB,IAAI,MAAM,EAAE,KAAK,GAAG,CAAC,MAChE;AACJ,QAAM,aAAa,OAAO,SAAS,KAAK,gBAAgB,IACpD,uBAAuB,OAAO,KAAK,oBAAoB,CAAC,CAAC,MACzD;AACJ,QAAM,UAAU,KAAK,gBAAgB,oBAAoB,KAAK,aAAa,MAAM;AACjF,QAAM,WAAW,KAAK,iBAAiB,qBAAqB,KAAK,cAAc,MAAM;AACrF,QAAM,OAAO,KAAK,WAAW,eAAe,KAAK,QAAQ,MAAM;AAC/D,MAAI,SAAS,YAAY,KAAK,CAAC,WAAW,IAAI,aAAa,MAAM,IAAI,KAAK,GAAG,WAAW,GAAG,aAAa,GAAG,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI;AACxJ,WAAS,SAAS,KAAK,OAAO,UAAU,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG;AACtE,aAAS,sBAAsB,iBAAiB,YAAY,WAAW,KAAK,CAAC,MAAM,MAAM;AAAA,EAC3F;AACA,SAAO;AACT;AAEO,SAAS,0BACd,OACA,YACQ;AACR,SAAO,MACJ;AAAA,IAAQ,CAAC,EAAE,MAAM,OAAO,UAAU,OAChC,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,cAAc;AAC1C,UAAI,CAAC,UAAU,KAAK,CAAC,EAAG,QAAO;AAC/B,YAAM,OAAO,KAAK,WAAW,eAAe,KAAK,QAAQ,MAAM;AAC/D,aAAO,iBAAiB,iBAAiB,YAAY,WAAW,SAAS,CAAC,6CAA6C,KAAK,CAAC,IAAI,IAAI;AAAA,IACvI,CAAC;AAAA,EACH,EACC,KAAK,EAAE;AACZ;AAEO,SAAS,iBAAiB,MAAoC;AACnE,MAAI,CAAC,UAAU,KAAK,CAAC,EAAG,QAAO;AAC/B,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,SAAS,0CAA0C,CAAC,EAAE;AAAA,IAAI,CAAC,UACnF,OAAO,MAAM,CAAC,CAAC;AAAA,EACjB;AACA,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,QAAM,KAAe,CAAC;AACtB,QAAM,KAAe,CAAC;AACtB,WAAS,QAAQ,GAAG,QAAQ,IAAI,OAAO,QAAQ,SAAS,GAAG;AACzD,OAAG,KAAK,OAAO,KAAK,KAAK,CAAC;AAC1B,OAAG,KAAK,OAAO,QAAQ,CAAC,KAAK,CAAC;AAAA,EAChC;AACA,SAAO,OAAO,IAAI,EAAE;AACtB;AAEO,SAAS,iBAAiB,MAAoC;AACnE,MAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AACrC,SAAO;AAAA,IACL,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,IAC1B,KAAK,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,UAAU,OAAwB;AAChD,SAAO,MAAM,UAAU,OAAa,2BAA2B,KAAK,KAAK;AAC3E;AAEA,SAAS,OAAO,IAAc,IAAoB;AAChD,QAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,QAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACxB,SAAO,EAAE,GAAG,GAAG,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,GAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE;AACzE;AAEA,SAAS,iBAAiB,YAAoB,WAAmB,WAA2B;AAC1F,SAAO,oBAAoB,UAAU,IAAI,SAAS,IAAI,SAAS;AACjE;AAEA,SAAS,cAAc,OAA4C;AACjE,SAAO,OAAO,UAAU,YAAY,kBAAkB,KAAK,KAAK;AAClE;AAEA,SAAS,kBAAkB,OAA4C;AACrE,SAAO,UAAU,UAAa,OAAO,SAAS,KAAK,KAAK,SAAS;AACnE;AAEA,SAAS,eAAe,OAA4C;AAClE,SAAO,UAAU,UAAa,OAAO,SAAS,KAAK,KAAK,SAAS,KAAK,SAAS;AACjF;AAEA,SAAS,OAAO,OAAuB;AACrC,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC,EAAE,SAAS;AAC3C;;;ACtGO,SAAS,kBAAkB,YAAoB,OAA4C;AAChG,SAAO,IAAI;AAAA,IACT,MACG,OAAO,CAAC,SAAS,KAAK,WAAW,cAAc,CAAC,oBAAoB,KAAK,KAAK,UAAU,EAAE,CAAC,EAC3F,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,UAAU,UAAU,IAAI,KAAK,EAAE,EAAE,CAAC;AAAA,EAC/D;AACF;AAEO,SAAS,eAAe,MAAoB,SAAsC;AACvF,MAAI,KAAK,WAAW,WAAY,QAAO;AACvC,QAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE;AACjC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAMC,UAAS,iBAAiB,KAAK,QAAQ,KAAK,EAAE;AAAA,IAClD,CAAC,UAAU,CAAC,MAAM,WAAW,cAAc;AAAA,EAC7C;AACA,SAAO,0BAA0B,KAAK,iCAAiC,OAAO,KAAK,IAAI,CAAC,wBAAwBA,QAAO,KAAK,GAAG,CAAC;AAClI;AAEO,SAAS,iBAAiB,YAAgC,OAA0B;AACzF,QAAM,aAAa,YAAY,YAAY,KAAK;AAChD,QAAMA,UAAmB,CAAC;AAC1B,MAAI;AACJ,MAAI,gCAAgC,KAAK,UAAU,GAAG;AACpD,eAAW;AAAA,EACb,WACE,8EAA8E,KAAK,UAAU,GAC7F;AACA,eAAW;AAAA,EACb,WAAW,kEAAkE,KAAK,UAAU,GAAG;AAC7F,eAAW;AAAA,EACb;AACA,MAAI,SAAS,SAAU,CAAAA,QAAO,KAAK,eAAe,CAAC,OAAO,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,EAAE;AAC/F,MAAI,qCAAqC,KAAK,UAAU,EAAG,CAAAA,QAAO,KAAK,iBAAiB;AACxF,MAAI,sCAAsC,KAAK,UAAU,EAAG,CAAAA,QAAO,KAAK,mBAAmB;AAC3F,SAAOA;AACT;AAEO,SAAS,OAAO,OAA2B;AAChD,QAAM,WAAW;AACjB,MAAI,SAAS;AACb,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,UAAM,SAAS,MAAM,QAAQ,CAAC,KAAK;AACnC,UAAM,QAAQ,MAAM,QAAQ,CAAC,KAAK;AAClC,cAAU,SAAS,SAAS,CAAC;AAC7B,cAAU,UAAW,QAAQ,MAAM,IAAM,UAAU,CAAE;AACrD,cAAU,QAAQ,IAAI,MAAM,SAAS,UAAW,SAAS,OAAO,IAAM,SAAS,CAAE,IAAI;AACrF,cAAU,QAAQ,IAAI,MAAM,SAAS,SAAS,QAAQ,EAAE,IAAI;AAAA,EAC9D;AACA,SAAO;AACT;;;AClBO,SAAS,cACd,MACA,eAAiC,YAChB;AACjB,MAAI,iBAAiB,WAAY,QAAO,CAAC;AACzC,QAAM,UAAU,KAAK,UAAU,CAAC,GAAG;AAAA,IAAI,CAAC,OAAO,UAC7C,YAAY,OAAO,KAAK,QAAQ,OAAO,YAAY;AAAA,EACrD;AACA,SAAO,KAAK,GAAG,YAAY,MAAM,YAAY,CAAC;AAC9C,SAAO,gBAAgB,QAAQ,IAAI,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,OAAO,IAAI,KAAK,OAAO,CAAC;AAC3F;AAEA,eAAsB,qBACpB,MACA,cACA,SAC0B;AAC1B,QAAM,QAAQ,cAAc,MAAM,YAAY;AAC9C,aAAW,QAAQ,OAAO;AACxB,eAAW,SAAS,KAAK,UAAU,CAAC,EAAG,OAAM,UAAU,KAAK;AAC5D,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,YACP,OACA,YACA,OACA,cACe;AACf,QAAMC,UAAS,sBAAsB,MAAM,SAAS;AACpD,QAAM,OAAO,MAAM,WAAW,SAAS,eAAe;AACtD,QAAM,OAAO,MAAM,WAAW,SAAS,MAAM,OAAO,OAAO,KAAK;AAChE,QAAM,YAAY,MAAM,WAAW,SAAS,QAAQ;AACpD,QAAM,OAAO,QAAQ,UAAU,UAAU,QAAQ,CAAC,IAAI,SAAS;AAC/D,QAAM,SAAS,iBAAiB,eAAe,OAAO,QAAQ,IAAI,WAAW,OAAO,IAAI,CAAC;AACzF,QAAM,UAAU,aAAa,MAAM,OAAO,IAAI,YAAYC,QAAO,MAAM,OAAO,CAAC,KAAK;AACpF,SAAO;AAAA,IACL,QAAAD;AAAA,IACA,MAAM;AAAA,IACN,MAAM,wCAAwC,MAAM,YAAYC,QAAOD,QAAO,KAAK,CAAC,aAAaC,QAAOD,QAAO,MAAM,CAAC,6CAA6C,OAAO;AAAA,IAC1K,UAAU,OAAO,MAAM;AAAA,IACvB,GAAI,iBAAiB,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,EACtF;AACF;AAEA,SAAS,YAAY,MAAqB,cAAiD;AACzF,QAAM,aAAgC;AAAA,IACpC,IAAI,KAAK,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,UAAU;AAC7C,YAAMA,UAAS,iBAAiB,IAAI;AACpC,aAAOA,UAAS,CAAC,EAAE,MAAM,QAAiB,OAAO,MAAM,OAAO,QAAAA,QAAO,CAAC,IAAI,CAAC;AAAA,IAC7E,CAAC;AAAA,IACD,IAAI,KAAK,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS;AACtC,YAAMA,UAAS,iBAAiB,IAAI;AACpC,aAAOA,WAAU,CAAC,iBAAiB,MAAMA,SAAQ,IAAI,IACjD,CAAC,EAAE,MAAM,QAAiB,OAAO,MAAM,QAAAA,QAAO,CAAC,IAC/C,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AACA,QAAM,aAAa,iBAAiB,YAAY,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,EAAE;AAAA,IAC/E,CAAC,cACC,UAAU,WAAW,UAAU,KAC/B,UAAU,OAAO,QAAQ,UAAU,OAAO,UAAU,KAAK,QAAQ,KAAK,SAAS;AAAA,EACnF;AACA,QAAM,UAAU,kBAAkB,KAAK,QAAQ,KAAK,SAAS,CAAC,CAAC;AAC/D,QAAM,kBAAkB,IAAI;AAAA,KACzB,KAAK,SAAS,CAAC,GACb,OAAO,CAAC,SAAS,KAAK,WAAW,cAAc,KAAK,iBAAiB,EACrE,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,EAC1B;AACA,SAAO,WAAW,IAAI,CAAC,WAAW,mBAAmB;AACnD,UAAMA,UAAS,UAAU;AACzB,UAAM,QAAQ,UAAU,WAAW;AAAA,MAAQ,CAAC,cAC1C,UAAU,SAAS,SAAS,CAAC,EAAE,MAAM,UAAU,OAAO,OAAO,UAAU,MAAM,CAAC,IAAI,CAAC;AAAA,IACrF;AACA,UAAM,QAAQ,UAAU,WAAW;AAAA,MAAQ,CAAC,cAC1C,UAAU,SAAS,SAAS,CAAC,UAAU,KAAK,IAAI,CAAC;AAAA,IACnD;AACA,UAAM,cAAc,KAAK,eAAe,KAAK;AAC7C,UAAM,UAAU,YAAY;AAAA,MAC1B,CAAC,SACC,KAAK,eACL,gBAAgB,IAAI,KAAK,WAAW,KACpC,aAAa,KAAK,QAAQA,OAAM;AAAA,IACpC;AACA,UAAM,gBAAgB,KAAK,MAAM;AAAA,MAC/B,CAAC,SACC,KAAK,eACL,gBAAgB,IAAI,KAAK,WAAW,KACpC,aAAa,KAAK,QAAQA,OAAM;AAAA,IACpC;AACA,UAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC;AAC/D,UAAM,aAAa,KAAK,SAAS,CAAC,GAC/B,OAAO,CAAC,SAAS,QAAQ,IAAI,KAAK,EAAE,CAAC,EACrC,IAAI,CAAC,SAAS,eAAe,MAAM,OAAO,CAAC,EAC3C,KAAK,EAAE;AACV,UAAM,MAAM,+EAA+EC,QAAOD,QAAO,CAAC,CAAC,IAAIC,QAAO,KAAK,SAASD,QAAO,IAAIA,QAAO,MAAM,CAAC,IAAIC,QAAOD,QAAO,KAAK,CAAC,IAAIC,QAAOD,QAAO,MAAM,CAAC,yEAAyE,YAAY,UAAU,SAAS,aAAa,EAAE,GAAG,MAAM,SAAS,SAAS,0BAA0B,OAAO,KAAK,MAAM,CAAC,YAAY,EAAE,6BAA6BC,QAAO,KAAK,MAAM,CAAC,kBAAkB,MAAM,IAAI,aAAa,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,cAAc,MAAM,KAAK,QAAQ,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,QAAQ,IAAI,CAAC,SAAS,WAAW,MAAM,KAAK,QAAQ,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;AAC9pB,UAAM,OAAO,QAAQ,KAAK,MAAM,WAAW,iBAAiB,CAAC;AAC7D,WAAO;AAAA,MACL,QAAAD;AAAA,MACA,MAAM;AAAA,MACN,MACE,iBAAiB,eACb,wCAAwC,IAAI,YAAYC,QAAOD,QAAO,KAAK,CAAC,aAAaC,QAAOD,QAAO,MAAM,CAAC,cAC9G;AAAA,MACN,UAAU,iBAAiB,eAAe,OAAO,IAAI,MAAM;AAAA,MAC3D,GAAI,iBAAiB,eACjB;AAAA,QACE,QAAQ;AAAA,UACN,EAAE,MAAM,UAAU,iBAA0B,MAAM,IAAI,YAAY,EAAE,OAAO,GAAG,EAAE;AAAA,QAClF;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,CAAC;AAAA,IACtD;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBAAgB,OAAwB,MAAsC;AACrF,QAAM,aAAgC,CAAC;AACvC,aAAW,QAAQ,OAAO;AACxB,QAAI,eAAe,KAAK,QAAQ,IAAI,GAAG;AACrC,iBAAW,KAAK,CAAC,IAAI,CAAC;AACtB;AAAA,IACF;AACA,UAAM,UAAU,WAAW;AAAA,MACzB,CAAC,cACC,CAAC,UAAU,KAAK,CAAC,WAAW,eAAe,OAAO,QAAQ,IAAI,CAAC,KAC/D,UAAU,KAAK,CAAC,WAAW,iBAAiB,OAAO,QAAQ,KAAK,MAAM,CAAC;AAAA,IAC3E;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,iBAAW,KAAK,CAAC,IAAI,CAAC;AACtB;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,CAAC;AACxB,WAAO,KAAK,IAAI;AAChB,eAAW,aAAa,QAAQ,MAAM,CAAC,GAAG;AACxC,aAAO,KAAK,GAAG,SAAS;AACxB,iBAAW,OAAO,WAAW,QAAQ,SAAS,GAAG,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO,WAAW,IAAI,CAAC,cAAc,eAAe,SAAS,CAAC;AAChE;AAEA,SAAS,eAAe,OAAuC;AAC7D,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,QAAMA,UAAS,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC3D,QAAM,SAAS,MACZ,IAAI,CAAC,SAAS;AACb,UAAM,QAAS,KAAK,OAAO,IAAIA,QAAO,KAAKA,QAAO,QAAS;AAC3D,UAAM,OACFA,QAAO,IAAIA,QAAO,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,UAAUA,QAAO,SAAU;AACtF,UAAM,QAAS,KAAK,OAAO,QAAQA,QAAO,QAAS;AACnD,UAAM,SAAU,KAAK,OAAO,SAASA,QAAO,SAAU;AACtD,WAAO,sCAAsCC,QAAO,IAAI,CAAC,SAASA,QAAO,GAAG,CAAC,WAAWA,QAAO,KAAK,CAAC,YAAYA,QAAO,MAAM,CAAC,sBAAsB,KAAK,IAAI;AAAA,EAChK,CAAC,EACA,KAAK,EAAE;AACV,SAAO;AAAA,IACL,QAAAD;AAAA,IACA,MAAM;AAAA,IACN,MAAM,8GAA8GC,QAAOD,QAAO,KAAK,CAAC,mBAAmBC,QAAOD,QAAO,KAAK,CAAC,IAAIC,QAAOD,QAAO,MAAM,CAAC,KAAK,MAAM;AAAA,IACnN,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,KAAK,MAAM;AAAA,IACxD,eAAe,MAAM,QAAQ,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC;AAAA,IAC/D,QAAQ,MAAM,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;AAAA,EACnD;AACF;AAEA,SAAS,iBAAiB,MAAY,OAAsB;AAC1D,QAAM,WAAWE,SAAQ,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,MAAM,KAAK;AACjE,QAAM,WAAWA,SAAQ,KAAK,GAAG,KAAK,QAAQ,MAAM,GAAG,MAAM,MAAM;AACnE,MAAI,WAAW,KAAK,WAAW,EAAG,QAAO;AACzC,QAAM,gBAAgB,QAAQ,KAAK,GAAG,KAAK,OAAO,MAAM,GAAG,MAAM,KAAK;AACtE,QAAM,cAAc,QAAQ,KAAK,GAAG,KAAK,QAAQ,MAAM,GAAG,MAAM,MAAM;AACtE,MAAI,iBAAiB,KAAK,WAAW,KAAK,IAAI,KAAK,QAAQ,MAAM,MAAM,KAAK,KAAM,QAAO;AACzF,SAAO,eAAe,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK,KAAK;AAC7E;AAEA,SAAS,eAAeF,SAAc,MAA8B;AAClE,SAAOA,QAAO,QAAQA,QAAO,UAAU,KAAK,QAAQ,KAAK,SAAS;AACpE;AAEA,SAASE,SAAQ,MAAc,UAAkB,OAAe,WAA2B;AACzF,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,UAAU,QAAQ,SAAS,IAAI,KAAK,IAAI,MAAM,KAAK,CAAC;AACzF;AAEA,SAAS,QAAQ,MAAc,UAAkB,OAAe,WAA2B;AACzF,SAAO,KAAK,IAAI,GAAG,QAAQ,OAAO,UAAU,OAAO,QAAQ,SAAS;AACtE;AAWA,SAAS,iBAAiB,YAA+B,SAAoC;AAC3F,QAAM,aAAgC,CAAC;AACvC,aAAW,aAAa,YAAY;AAClC,UAAM,UAAU,WAAW;AAAA,MAAO,CAAC,cACjC,OAAO,UAAU,QAAQ,UAAU,QAAQ,OAAO;AAAA,IACpD;AACA,QAAI,QAAQ,WAAW,GAAG;AACxB,iBAAW,KAAK,EAAE,QAAQ,UAAU,QAAQ,YAAY,CAAC,SAAS,EAAE,CAAC;AACrE;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,CAAC;AACxB,WAAO,WAAW,KAAK,SAAS;AAChC,WAAO,SAAS,YAAY,CAAC,OAAO,QAAQ,UAAU,MAAM,CAAC;AAC7D,eAAW,aAAa,QAAQ,MAAM,CAAC,GAAG;AACxC,aAAO,WAAW,KAAK,GAAG,UAAU,UAAU;AAC9C,aAAO,SAAS,YAAY,CAAC,OAAO,QAAQ,UAAU,MAAM,CAAC;AAC7D,iBAAW,OAAO,WAAW,QAAQ,SAAS,GAAG,CAAC;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,OAAO,MAAY,OAAa,SAA0B;AACjE,SAAO,EACL,KAAK,IAAI,KAAK,QAAQ,UAAU,MAAM,KACtC,MAAM,IAAI,MAAM,QAAQ,UAAU,KAAK,KACvC,KAAK,IAAI,KAAK,SAAS,UAAU,MAAM,KACvC,MAAM,IAAI,MAAM,SAAS,UAAU,KAAK;AAE5C;AAEA,SAAS,iBAAiB,MAAkBF,SAAc,MAA8B;AACtF,MAAI,CAAC,WAAW,KAAK,KAAK,KAAK,EAAG,QAAO;AACzC,QAAM,UACJA,QAAO,IAAI,KACXA,QAAO,IAAI,KACXA,QAAO,IAAIA,QAAO,QAAQ,KAAK,SAC/BA,QAAO,IAAIA,QAAO,SAAS,KAAK;AAClC,QAAM,QAAQA,QAAO,QAAQA,QAAO,SAAS,KAAK,QAAQ,KAAK,SAAS;AACxE,SAAO,WAAW;AACpB;AAEO,SAAS,0BACd,MACA,OACe;AACf,QAAM,WAAW,IAAI,IAAI,MAAM,QAAQ,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC;AAC1E,SAAO,SAAS,OAAO,IACnB,EAAE,GAAG,MAAM,OAAO,KAAK,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,IACnE;AACN;AAEA,SAAS,WAAW,MAAgB,YAAoB,SAAsC;AAC5F,MAAI,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,EAAG,QAAO;AACjE,QAAMG,UAAS;AAAA,IACb,SAAS,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK;AAAA,IAC9C,aAAa,KAAK,WAAW,IAAI,gBAAgBF,QAAO,KAAK,WAAW,CAAC,KAAK;AAAA,IAC9E,GAAG;AAAA,MACD,KAAK;AAAA,MACL,KAAK,cAAc,QAAQ,IAAI,KAAK,WAAW,IAAI;AAAA,IACrD;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACX,QAAM,UAAU,aAAa,KAAK,OAAO;AACzC,QAAM,YAAY,KAAK;AACvB,QAAM,WAAW,YACb,kCAAkC,UAAU,IAAIA,OAAM,EAAE,KAAK,GAAG,CAAC,IAAIA,QAAO,KAAK,OAAO,CAAC,CAAC,IAAIA,QAAO,OAAO,CAAC,OAC7G,OAAOA,QAAO,KAAK,OAAO,CAAC,CAAC,QAAQA,QAAO,OAAO,CAAC;AACvD,QAAM,SAAS,KAAK,cAAc,QAAQ,KAAK,OAAO,SAAS,KAAK,OAAO;AAC3E,QAAM,SACJ,SAAS,IAAI,gBAAgBA,QAAO,MAAM,CAAC,sCAAsC;AACnF,SAAO,QAAQ,QAAQ,eAAeA,QAAO,KAAK,QAAQ,CAAC,IAAI,MAAM,GAAGE,UAAS,WAAWA,OAAM,MAAM,EAAE,IAAIC,YAAW,KAAK,IAAI,CAAC;AACrI;AAEA,SAAS,aAAa,OAAa,OAAsB;AACvD,QAAM,IAAI,MAAM,IAAI,MAAM,QAAQ;AAClC,QAAM,IAAI,MAAM,IAAI,MAAM,SAAS;AACnC,SAAO,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,MAAM,SAAS,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,MAAM;AAC5F;AAEA,SAAS,sBAAsB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAmC;AACjF,QAAM,SAAS;AAAA,IACb,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,IACb,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,IACb,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,EACvB;AACA,QAAM,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;AACrC,QAAM,KAAK,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;AACvC,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE;AAC3B,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,EAAE,IAAI,KAAK;AAC3F;AAEA,SAAS,YAAYJ,SAAmD;AACtE,QAAM,SAASA,QAAO,OAAO,CAAC,UAAyB,QAAQ,KAAK,CAAC;AACrE,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACpD,QAAM,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACpD,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,KAAK,CAAC;AACtE,QAAM,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,MAAM,CAAC;AACrE,SAAO,EAAE,GAAG,GAAG,OAAO,QAAQ,GAAG,QAAQ,MAAM,EAAE;AACnD;AAEA,SAAS,OAAO,OAAgC;AAC9C,QAAM,SAAS,KAAK,KAAM,MAAM,QAAQ,IAAK,CAAC,IAAI;AAClD,QAAM,SAAS,IAAI,WAAW,KAAK,SAAS,MAAM,MAAM;AACxD,QAAM,OAAO,IAAI,SAAS,OAAO,MAAM;AACvC,SAAO,IAAI,CAAC,IAAM,EAAI,CAAC;AACvB,OAAK,UAAU,GAAG,OAAO,QAAQ,IAAI;AACrC,OAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,OAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,OAAK,SAAS,IAAI,MAAM,OAAO,IAAI;AACnC,OAAK,SAAS,IAAI,CAAC,MAAM,QAAQ,IAAI;AACrC,OAAK,UAAU,IAAI,GAAG,IAAI;AAC1B,OAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,WAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,aAAS,SAAS,GAAG,SAAS,MAAM,OAAO,UAAU,GAAG;AACtD,YAAM,UAAU,MAAM,MAAM,QAAQ,UAAU;AAC9C,YAAM,SAAS,KAAK,MAAM,SAAS,SAAS;AAC5C,aAAO,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK;AAC3C,aAAO,SAAS,CAAC,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK;AAC/C,aAAO,SAAS,CAAC,IAAI,MAAM,KAAK,MAAM,KAAK;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAA4C;AAC5D,SAAO,iBAAiB,KAAK,SAAS,EAAE;AAC1C;AAEA,SAASK,mBAAkB,OAA4C;AACrE,SAAO,OAAO,SAAS,KAAK,MAAM,SAAS,OAAO;AACpD;AAEA,SAAS,aAAa,OAA4C;AAChE,SAAOA,mBAAkB,KAAK,KAAK,SAAS;AAC9C;AAEA,SAASJ,QAAO,OAAuB;AACrC,SAAO,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,GAAK,IAAI,GAAK,IAAI;AAC9E;AAEA,SAASG,YAAW,OAAuB;AACzC,SAAO,MACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,OAAO;AAC5B;;;AJzVA,eAAsB,sBACpB,OACA,OACA,gBACA,cACA,SACA,SAAiC,QACD;AAChC,QAAM,QAA+B;AAAA,IACnC,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,qBAAqB;AAAA,EACvB;AACA,QAAM,SAAyB,CAAC;AAChC,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,gBAA0B,CAAC;AACjC,MAAI;AACJ,QAAM,eAAyB,CAAC;AAChC,MAAI,aAAa;AACjB,MAAI,qBAAqB;AACzB,MAAI,iBAAiB;AACrB,MAAI,iBAAiB;AACrB,MAAI;AAOJ,QAAM,WAAW,WAAW;AAC5B,QAAM,SAAS,CAAC,MAAc,gBAAgB,OAAO,MAAM,WAAW,gBAAgB,IAAI;AAC1F,QAAM,aAAa,CACjB,MACA,OACA,cACA,iBAAiB,SAEjB,WACI,qBAAqB,MAAM,OAAO,cAAc,cAAc,IAC9D,iBAAiB,MAAM,OAAO,cAAc,cAAc;AAChE,QAAM,OAAO,yCAAyC;AAEtD,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,YAAa;AAClB,UAAM,OAAO,YAAY,IAAI;AAC7B,kBAAc;AACd,WAAO,aAAa,SAAS,EAAG,OAAM,MAAM,aAAa,MAAM,KAAK,EAAE;AAAA,EACxE;AAEA,QAAM,gBAAgB,OAAO,eAAe,MAAM;AAChD,YAAQ,cAAc,GAAG,EAAE,KAAK,OAAO,gBAAgB,cAAc,SAAS,GAAG;AAC/E,YAAM,OAAO,YAAY;AACzB,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,wBAAwB,YAAY;AACxC,QAAI,CAAC,iBAAkB;AACvB,UAAM,MAAM,oBAAoB,iBAAiB,OAAO,iBAAiB,cAAc,MAAM,CAAC;AAC9F,uBAAmB;AAAA,EACrB;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,CAAC,eAAgB;AACrB,UAAM,OAAO,YAAY;AACzB,qBAAiB;AAAA,EACnB;AAEA,QAAM,WAAW,OAAO,MAAoB,WAA2B;AACrE,UAAM,eAAe,kBAAkB,KAAK,WAAW,KAAK;AAC5D,QAAI,aAAa;AACjB,UAAM,WAAW;AAAA,MACf,KAAK;AAAA,MACL,KAAK,WAAW;AAAA,MAChB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,WAAW;AAAA,IAClB;AACA,UAAM,iBAAiB,IAAI,IAAI,SAAS,OAAO,CAAC;AAChD,UAAM,eAAe,oBAAI,IAAmB;AAC5C,UAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,CAAC,cAAc,iBAAiB,SAAS,CAAC,CAAC;AAC1F,UAAM,oBAAoB,oBAAI,IAAI,CAAC,GAAG,eAAe,GAAG,eAAe,CAAC;AACxE,eAAW,CAAC,YAAY,KAAK,KAAK,KAAK,WAAW,OAAO,QAAQ,GAAG;AAClE,YAAM,YAAY,KAAK,WAAW,OAAO,aAAa,CAAC;AACvD,YAAM,SAAS,eAAe,KAAK;AACnC,UAAI,mBAAmB;AACvB,aAAO,KAAK,MAAM,UAAU,KAAK,aAAa,IAAI,KAAK,MAAM,UAAU,CAAkB,GAAG;AAC1F,sBAAc;AAAA,MAChB;AACA,cAAQ,KAAK,MAAM,UAAU,GAAG,OAAO,KAAK,cAAc,QAAQ;AAChE,cAAM,sBAAsB;AAC5B,cAAM,OAAO,KAAK,MAAM,UAAU;AAClC,YAAI,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,MAAM,SAAS,aAAa;AACtE,gBAAME,QAAO,WACT,GAAG,KAAK,QAAQ;AAAA;AAAA,GAAQ,WAAW,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA;AAAA,IACzE,uCAAuC,KAAK,IAAI,eAAe,WAAW,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AACpH,cAAI,YAAa,cAAa,KAAKA,KAAI;AAAA,cAClC,OAAM,MAAMA,KAAI;AACrB,uBAAa,IAAI,IAAI;AACrB,wBAAc;AACd,6BAAmB;AACnB;AAAA,QACF;AACA,YAAI,QAAQ,eAAe,IAAI,IAAI,EAAG;AACtC,cAAM,OAAO,WACT,GAAG,MAAM,YAAY,EAAE;AAAA;AAAA,IACvB,oCAAoC,MAAM,IAAI;AAClD,YAAI,YAAa,cAAa,KAAK,IAAI;AAAA,YAClC,OAAM,MAAM,IAAI;AACrB,sBAAc;AAAA,MAChB;AACA,YAAM,kBAAkB,SAAS,IAAI,KAAK;AAC1C,UAAI,CAAC,oBAAoB,mBAAmB,MAAM,SAAS,aAAa;AACtE,cAAM,sBAAsB;AAC5B,cAAM,OAAO,WACT,GAAG,gBAAgB,QAAQ;AAAA;AAAA,GAAQ,WAAW,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA;AAAA,IACpF,uCAAuC,gBAAgB,IAAI,eAAe,WAAW,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAC/H,YAAI,YAAa,cAAa,KAAK,IAAI;AAAA,YAClC,OAAM,MAAM,IAAI;AACrB,qBAAa,IAAI,eAAe;AAChC,2BAAmB;AAAA,MACrB;AACA,UAAI,iBAAkB;AACtB,UAAI,oBAAoB,OAAO,MAAM,iBAAiB,GAAG;AACvD,cAAM,uBAAuB;AAC7B;AAAA,MACF;AACA,YAAM,sBAAsB;AAC5B,UAAI,kBAAkB,MAAM,SAAS,OAAQ,OAAM,gBAAgB;AACnE,UAAI,CAAC,kBAAkB,CAAC,cAAc,MAAM,SAAS,aAAa,MAAM,UAAU,GAAG;AACnF,cAAM;AAAA,UACJ,eAAe,WAAW,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC;AAAA,UACvE,KAAK,WAAW,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC;AAAA;AAAA;AAAA,QAC/D;AACA,qBAAa;AACb;AAAA,MACF;AACA,UAAI,YAAY;AACd,YAAI,MAAM,SAAS,aAAa;AAC9B,gBAAM,MAAM,eAAe,KAAK,IAAI,YAAY;AAChD,gBAAM;AAAA,YACJ,IAAI,GAAG,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC,KAAK,GAAG;AAAA,YACpE,GAAG,WAAW,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA;AAAA;AAAA,UACtD;AACA,+BAAqB;AACrB;AAAA,QACF;AACA,YACE,MAAM,SAAS,aACf,CAAC,uBACA,MAAM,UAAU,KACf,MAAM,KAAK,UAAU,EAAE,WAAW,GAAG,KACpC,MAAM,UAAU,KAAK,WAAW,SAAS,eAAe,eAAe,SAAS,IACnF;AACA,gBAAM;AAAA,YACJ,KAAK,MAAM,KAAK,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC,MAAM,MAAM,KAAK;AAAA,YAC7F,GAAG,IAAI,OAAO,MAAM,KAAK,CAAC,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC;AAAA;AAAA;AAAA,UACxF;AACA;AAAA,QACF;AACA,cAAM,OAAO,WAAW;AACxB,qBAAa;AACb,yBAAiB;AAAA,MACnB;AACA,UAAI,MAAM,SAAS,SAAS;AAC1B,cAAM,WAAO,8BAAY,MAAM,KAAK;AACpC,YAAI,eAAe,eAAe,YAAY,OAAO,MAAM,OAAO,KAAK,KAAK,GAAG;AAC7E,gBAAM,mBAAmB,QAAQ,YAAY,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;AAChF,qBAAW,OAAO;AAChB,kBAAM,MAAM,WAAW,iBAAiB,GAAG,IAAI,SAAS,KAAK,KAAK,CAAC;AACrE,sBAAY,QAAQ,MAAM;AAC1B,gBAAM,gBAAgB;AACtB;AAAA,QACF;AACA,cAAM,WAAW;AACjB,cAAM,SAAS,YAAY,IAAI;AAC/B,cAAM,OAAO,WAAW,mBAAmB,MAAM,MAAM,CAAC;AACxD,cAAM,eAAe,WAAY,SAAS,KAAK,MAAM,CAAC,IAAI,OAAQ;AAClE,mBAAW,CAAC,OAAO,GAAG,KAAK,aAAa,QAAQ;AAC9C,gBAAM;AAAA,YACJ,WAAW,iBAAiB,GAAG,IAAI,SAAS,KAAK,QAAQ,UAAU,UAAU,CAAC,CAAC;AAAA,UACjF;AACF,sBAAc,EAAE,OAAO,MAAM,OAAO,OAAO;AAC3C;AAAA,MACF;AACA,UAAI,eAAe,MAAM,SAAS,oBAAoB,mBAAmB,KAAK,GAAG;AAC/E,cAAM,UAAU,YAAY,MAAM,QAAQ;AAC1C,cAAM;AAAA,UACJ,UAAU,MAAM,QAAQ,IAAI,CAAC,UAAU,oBAAoB,OAAO,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,UACpF,MAAM,QACH;AAAA,YAAI,CAAC,UACJ,iBAAiB;AAAA,cACf,MAAM;AAAA,cACN,GAAG,MAAM,KAAK,IAAI,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,cAC1C,MAAM;AAAA,YACR,CAAC;AAAA,UACH,EACC,KAAK,EAAE;AAAA,QACZ;AACA,cAAM,WAAW;AACjB;AAAA,MACF;AACA,YAAM,WAAW;AACjB,UAAI,MAAM,SAAS,WAAW;AAC5B,cAAM,QAAQ,kBAAkB,MAAM,UAAU,IAAI,IAAI,MAAM;AAC9D,cAAM,cAAc,KAAK;AACzB,cAAM;AAAA,UACJ,wBAAwB,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC,MAAM,KAAK;AAAA,UAChH,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,WAAW,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC;AAAA;AAAA;AAAA,QAClF;AACA,sBAAc,KAAK,KAAK;AACxB;AAAA,MACF;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,YAAI,eAAe,KAAK,GAAG;AACzB,gBAAM,CAAC,aAAa,GAAG,OAAO,IAAI,MAAM;AACxC,cAAI;AACF,kBAAM;AAAA,cACJ,OAAOC,YAAW,YAAY,IAAI,CAAC;AAAA,cACnC,OAAOC,gBAAe,YAAY,IAAI,CAAC;AAAA;AAAA;AAAA,YACzC;AACF,qBAAW,UAAU;AACnB,kBAAM,OAAO,MAAMD,YAAW,OAAO,IAAI,CAAC,QAAQ,GAAGC,gBAAe,OAAO,IAAI,CAAC;AAAA;AAAA,CAAM;AACxF;AAAA,QACF;AACA,YAAI,eAAe,KAAK,GAAG;AACzB,gBAAM;AAAA,YACJ,OAAO,MAAM,MAAM,IAAI,CAAC,SAAS,OAAOD,YAAW,KAAK,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,YAC9E,GAAG,MAAM,MAAM,IAAI,CAAC,SAAS,KAAKC,gBAAe,KAAK,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAC3E;AACA;AAAA,QACF;AACA,2BAAmB,EAAE,OAAO,QAAQ,KAAK,QAAQ,aAAa;AAC9D;AAAA,MACF;AACA,UAAI,MAAM,SAAS,cAAc;AAC/B,cAAM;AAAA,UACJ,gBAAgBD,YAAW,MAAM,IAAI,CAAC,WAAWA,YAAW,MAAM,YAAY,CAAC,UAAUA,YAAW,MAAM,IAAI,CAAC;AAAA,UAC/G,OAAOC,gBAAe,MAAM,IAAI,CAAC;AAAA;AAAA,EAAOA,gBAAe,MAAM,YAAY,CAAC;AAAA;AAAA,EAAOA,gBAAe,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA,QAC7G;AACA,yBAAiB;AACjB;AAAA,MACF;AACA,YAAM,MAAM,oBAAoB,OAAO,cAAc,MAAM,CAAC;AAAA,IAC9D;AACA,WAAO,aAAa,KAAK,MAAM,QAAQ;AACrC,YAAM,OAAO,KAAK,MAAM,UAAU;AAClC,UAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,GAAG;AACnC,cAAM,sBAAsB;AAC5B,cAAM,OAAO,WACT,GAAG,KAAK,QAAQ;AAAA;AAAA,IAChB,oCAAoC,KAAK,IAAI;AACjD,YAAI,YAAa,cAAa,KAAK,IAAI;AAAA,YAClC,OAAM,MAAM,IAAI;AAAA,MACvB;AACA,oBAAc;AAAA,IAChB;AACA,eAAW,aAAa,iBAAiB,IAAI,EAAG,eAAc,IAAI,SAAS;AAAA,EAC7E;AAEA,mBAAiB,QAAQ,OAAO;AAC9B,UAAM,QAAQ,MAAM,qBAAqB,MAAM,cAAc,OAAO;AACpE,UAAM,iBAAa,gCAAc,0BAA0B,MAAM,KAAK,CAAC;AACvE,WAAO,KAAK,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,YAAY,MAAM,CAAC;AACzE,2BAAuB,MAAM;AAC7B,UAAM,kBAAkB;AACxB,UAAM,oBAAoB,KAAK,IAAI,MAAM,mBAAmB,OAAO,MAAM;AACzE,UAAM,oBAAoB,KAAK;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,OAAO,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,MAAM,QAAQ,CAAC;AAAA,IACxE;AACA,QAAI,OAAO,UAAU,gBAAgB;AACnC,YAAM,QAAQ,OAAO,MAAM;AAC3B,UAAI,MAAO,OAAM,SAAS,OAAO,MAAM;AAAA,IACzC;AAAA,EACF;AACA,SAAO,OAAO,SAAS,GAAG;AACxB,UAAM,QAAQ,OAAO,MAAM;AAC3B,QAAI,MAAO,OAAM,SAAS,OAAO,MAAM;AAAA,EACzC;AACA,MAAI,WAAY,OAAM,OAAO,WAAW;AACxC,QAAM,WAAW;AACjB,QAAM,gBAAgB;AACtB,MAAI,oBAAoB,kBAAkB,iBAAiB,OAAO,iBAAiB,MAAM,GAAG;AAC1F,UAAM,cAAc;AACpB,UAAM;AAAA,MACJ,WAAW,kBAAkB,iBAAiB,OAAO,iBAAiB,YAAY,CAAC;AAAA,MACnF;AAAA;AAAA,EAAU,sBAAsB,iBAAiB,OAAO,iBAAiB,YAAY,CAAC;AAAA,IACxF;AACA,uBAAmB;AAAA,EACrB,OAAO;AACL,UAAM,sBAAsB;AAC5B,UAAM,cAAc;AAAA,EACtB;AACA,QAAM,OAAO,YAAY;AACzB,SAAO;AACT;AAEA,SAAS,uBAAuB,QAA8B;AAC5D,QAAM,QAAQ,IAAI;AAAA,IAChB,OAAO;AAAA,MAAQ,CAAC,SACd,KAAK,WAAW,MAAM;AAAA,QACpB,CAAC,SAAS,KAAK,KAAK,MAAM,wCAAwC,KAAK,CAAC;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AACA,aAAW,QAAQ,QAAQ;AACzB,eAAW,SAAS,KAAK,WAAW,OAAQ,qBAAoB,OAAO,KAAK;AAAA,EAC9E;AACF;AAEA,SAAS,oBAAoB,OAAsB,OAA0B;AAC3E,QAAM,UAAU,CAAC,UAAkB,mBAAmB,OAAO,KAAK;AAClE,MAAI,MAAM,SAAS,cAAc;AAC/B,eAAW,UAAU,MAAM,OAAQ,qBAAoB,QAAQ,KAAK;AAAA,EACtE,WACE,MAAM,SAAS,aACf,MAAM,SAAS,eACf,MAAM,SAAS,gBACf;AACA,UAAM,OAAO,QAAQ,MAAM,IAAI;AAAA,EACjC,WAAW,MAAM,SAAS,QAAQ;AAChC,eAAW,QAAQ,MAAM,MAAO,MAAK,OAAO,QAAQ,KAAK,IAAI;AAAA,EAC/D,WAAW,MAAM,SAAS,kBAAkB;AAC1C,eAAW,SAAS,MAAM,SAAS;AACjC,YAAM,OAAO,QAAQ,MAAM,IAAI;AAC/B,YAAM,cAAc,QAAQ,MAAM,WAAW;AAAA,IAC/C;AAAA,EACF,WAAW,MAAM,SAAS,YAAY;AACpC,eAAW,QAAQ,MAAM,OAAO;AAC9B,WAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B,WAAK,UAAU,KAAK,QAAQ,IAAI,OAAO;AAAA,IACzC;AAAA,EACF,WAAW,MAAM,SAAS,gBAAgB;AACxC,eAAW,QAAQ,MAAM,OAAO;AAC9B,WAAK,QAAQ,QAAQ,KAAK,KAAK;AAC/B,WAAK,UAAU,KAAK,QAAQ,IAAI,OAAO;AAAA,IACzC;AAAA,EACF,WAAW,MAAM,SAAS,cAAc;AACtC,UAAM,OAAO,QAAQ,MAAM,IAAI;AAC/B,UAAM,eAAe,QAAQ,MAAM,YAAY;AAC/C,UAAM,OAAO,QAAQ,MAAM,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,mBAAmB,OAAe,OAA4B;AACrE,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,KAAK,QAAQ,WAAW,EAAE;AAC5C,QAAI,cAAc,QAAQ,CAAC,OAAO,SAAS,SAAS,EAAG;AACvD,UAAM,UAAU,IAAI;AAAA,MAClB,sBAAsB,wBAAwB,SAAS,CAAC;AAAA,MACxD;AAAA,IACF;AACA,aAAS,OAAO,QAAQ,SAAS,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,eAAe,OAA+D;AACrF,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU;AAAA,IACd,IAAI,KAAK,IAAI;AAAA,IACb,sBAAsB,KAAK,IAAI;AAAA,IAC/B,iBAAiB,KAAK,IAAI;AAAA,IAC1B,mBAAmB,KAAK,IAAI;AAAA,EAC9B;AACA,SAAO,QAAQ,OAAO,OAAO,EAAE,UAAU;AAC3C;AAEA,SAAS,eAAe,OAA+D;AACrF,MAAI,MAAM,MAAM,SAAS,EAAG,QAAO;AACnC,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI,MAAM;AAC/B,MAAI,CAAC,SAAS,KAAK,WAAW,EAAG,QAAO;AACxC,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC;AACtE,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;AAC5F,QAAM,aAAa,MAAM,MAAM;AAAA,IAAK,CAAC,SACnC,0BAA0B,KAAK,KAAK,cAAc,EAAE;AAAA,EACtD;AACA,SAAO,cAAc,aAAa,WAAW;AAC/C;AAEA,SAAS,eAAe,OAA+D;AACrF,MAAI,MAAM,MAAM,SAAS,EAAG,QAAO;AACnC,QAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,UAAU,MAAM,MAAM;AAAA,IAC1B,CAAC,SAAS,KAAK,IAAI,KAAK,OAAO,IAAI,MAAM,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AAAA,EACvF;AACA,QAAM,YAAY,MAAM,MAAM,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,UAAU;AAC5D,UAAM,WAAW,MAAM,MAAM,KAAK;AAClC,QAAI,CAAC,SAAU,QAAO;AACtB,UAAM,MAAM,SAAS,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,OAAO;AAC7D,WAAO,OAAO,KAAK,IAAI,SAAS,OAAO,QAAQ,KAAK,OAAO,MAAM,IAAI;AAAA,EACvE,CAAC;AACD,SAAO,WAAW;AACpB;AAEA,SAAS,kBACP,OACA,YACS;AACT,QAAM,iBAAiB,MAAM,MAAM;AAAA,IACjC,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU,aAAa;AAAA,EAC/D;AACA,SAAO,kBAAkB,2BAA2B,KAAK,MAAM,KAAK,KAAK,CAAC;AAC5E;AAEA,SAAS,iBAAiB,MAA8B;AACtD,SAAO,KAAK,WAAW,OAAO;AAAA,IAAQ,CAAC,UACrC,WAAW,KAAK,EACb,OAAO,CAAC,SAAS,aAAa,KAAK,OAAO,GAAG,KAAK,OAAO,QAAQ,KAAK,MAAM,CAAC,EAC7E,IAAI,CAAC,SAAS,mBAAmB,KAAK,IAAI,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,oBACP,OACA,MACA,iBACS;AACT,QAAM,QAAQ,WAAW,KAAK;AAC9B,SACE,MAAM,SAAS,KACf,MAAM;AAAA,IACJ,CAAC,SACC,aAAa,KAAK,OAAO,GAAG,KAAK,OAAO,QAAQ,KAAK,MAAM,KAC3D,gBAAgB,IAAI,mBAAmB,KAAK,IAAI,CAAC;AAAA,EACrD;AAEJ;AAEA,SAAS,WAAW,OAAsB;AACxC,SAAO,MAAM,SAAS,SAAS,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM;AACnF;AAEA,SAAS,aAAa,GAAW,QAAgB,YAA6B;AAC5E,SAAO,IAAI,UAAU,aAAa,QAAQ,KAAK,aAAa;AAC9D;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MAAM,kBAAkB,IAAI,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACtF;AAEA,SAAS,eAAe,UAAiB,MAAa,WAA4B;AAChF,MAAI,SAAS,QAAQ,WAAW,KAAK,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAG,QAAO;AAC3F,SAAO,SAAS,QAAQ;AAAA,IACtB,CAAC,QAAQ,UACP,KAAK,IAAI,UAAU,KAAK,QAAQ,KAAK,KAAK,OAAO,kBAAkB,IAAI,aAAa;AAAA,EACxF;AACF;AAEA,SAAS,YAAY,MAAwC;AAC3D,QAAM,QAAQ,KAAK,CAAC;AACpB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AACjC,SAAO,MAAM,MAAM,CAAC,UAAU,SAAS,KAAK,KAAK,KAAK,CAAC,eAAe,KAAK,CAAC,KAC1E,MAAM,KAAK,cAAc,IACvB,QACA;AACN;AAEA,SAAS,QAAQ,MAA4B,OAAsC;AACjF,SAAO;AAAA,IACL,QACE,SACA,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,SAAS,KAAe,QAAyB;AACxD,QAAM,OAAO,SAAS,OAAO;AAC7B,SAAO,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,IAAID,YAAW,KAAK,CAAC,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;AACtF;AAEA,SAAS,mBAAmB,MAAkB,QAAsC;AAClF,QAAM,UAAU,KAAK,CAAC,GAAG,UAAU;AACnC,MAAI,YAAY,EAAG,QAAO;AAC1B,QAAM,UAAU,UAAU,MAAM,OAAO,EAAE,KAAK,EAAE;AAChD,SAAO,GAAG,iBAAiB,OAAO,CAAC,GAAG,iBAAiB,MAAM,OAAO,EAAE,KAAK,KAAK,GAAG,KAAK,CAAC;AAC3F;AAEA,SAAS,iBAAiB,KAAe,eAAe,MAAc;AACpE,QAAM,QAAQ,IAAI,IAAI,CAAC,UAAW,eAAe,wBAAwB,KAAK,IAAI,KAAM;AACxF,SAAO,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA;AAC/B;AAEA,SAAS,wBAAwB,OAAuB;AACtD,SAAOC,gBAAe,KAAK,EACxB,WAAW,KAAK,KAAK,EACrB,QAAQ,aAAa,MAAM;AAChC;AAEA,SAAS,mBAAmB,OAAoE;AAC9F,SACE,MAAM,QAAQ,SAAS,KACvB,MAAM,QAAQ,MAAM,CAAC,UAAU,eAAe,MAAM,WAAW,CAAC,KAChE,MAAM,QAAQ,KAAK,CAAC,UAAU,YAAY,KAAK,MAAM,WAAW,CAAC;AAErE;AAEA,SAAS,eAAe,OAAwB;AAC9C,SAAO,wCAAwC,KAAK,MAAM,KAAK,CAAC;AAClE;AAEA,SAAS,oBACP,OACA,SACQ;AACR,QAAM,UAAU,UAAU,IAAI,aAAa,UAAU,CAAC,MAAM;AAC5D,SAAO,sBAAsB,OAAO,IAAID,YAAW,MAAM,IAAI,CAAC,YAAYA,YAAW,MAAM,WAAW,CAAC;AACzG;AAEA,SAAS,kBAAkB,OAAsB,eAAe,WAAmB;AACjF,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO,8DAA8D,MAAM,QAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,SAAS,kBAAkB,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,EACtK;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAM,WAAO,8BAAY,MAAM,KAAK;AACpC,UAAM,SAAS,YAAY,IAAI;AAC/B,WAAO,UAAU,KAAK,IAAI,CAAC,KAAK,UAAU,SAAS,KAAK,QAAQ,UAAU,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,EACnG;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,KAAK,MAAM,KAAK,IAAI,iBAAiB,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC,MAAM,MAAM,KAAK;AAC5G,MAAI,MAAM,SAAS;AACjB,WAAO,MAAM,iBAAiB,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AACtE,MAAI,MAAM,SAAS,eAAgB,QAAO,QAAQA,YAAW,MAAM,IAAI,CAAC;AACxE,MAAI,MAAM,SAAS,kBAAkB;AACnC,QACE,MAAM,QAAQ,UAAU,KACxB,MAAM,QAAQ,KAAK,CAAC,UAAU,MAAM,YAAY,KAAK,EAAE,MAAM,KAAK,EAAE,UAAU,CAAC,KAC/E,MAAM,QAAQ,MAAM,CAAC,UAAU,oBAAoB,KAAK,MAAM,KAAK,KAAK,CAAC,CAAC,GAC1E;AACA,aAAO,MAAM,QACV;AAAA,QACC,CAAC,UACC,gBAAgBA,YAAW,UAAU,MAAM,IAAI,CAAC,CAAC,WAAWA,YAAW,MAAM,WAAW,CAAC;AAAA,MAC7F,EACC,KAAK,EAAE;AAAA,IACZ;AACA,UAAM,OAAO,OAAO,MAAM,QACvB;AAAA,MACC,CAAC,UACC,YAAYA,YAAW,MAAM,IAAI,CAAC,YAAYA,YAAW,MAAM,WAAW,CAAC;AAAA,IAC/E,EACC,KAAK,EAAE,CAAC;AACX,WAAO,mBAAmB,KAAK,IAAI,YAAY,IAAI,eAAe;AAAA,EACpE;AACA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,yJAAyJ,MAAM,MAAM,IAAI,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA,EACxM;AACA,MAAI,MAAM,SAAS,gBAAgB;AACjC,WAAO,MAAM,MAAM,IAAI,kBAAkB,EAAE,KAAK,EAAE;AAAA,EACpD;AACA,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO,gBAAgBA,YAAW,MAAM,IAAI,CAAC,WAAWA,YAAW,MAAM,YAAY,CAAC,UAAUA,YAAW,MAAM,IAAI,CAAC;AAAA,EACxH;AACA,QAAM,MAAM,MAAM,UAAU,OAAO;AACnC,SAAO,IAAI,GAAG,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,OAAO,iBAAiB,KAAK,MAAM,KAAK,OAAO,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,GAAG;AACnI;AAEA,SAAS,oBACP,OACA,cACA,QACQ;AACR,SAAO,WAAW,aACd,sBAAsB,OAAO,YAAY,IACzC,kBAAkB,OAAO,YAAY;AAC3C;AAEA,SAAS,sBAAsB,OAAsB,eAAe,WAAmB;AACrF,MAAI,MAAM,SAAS,cAAc;AAC/B,UAAM,UAAU,MAAM,OAAO,IAAI,CAAC,SAAS,sBAAsB,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE;AAC7F,WAAO,GAAG,QACP,QAAQ,EACR,MAAM,IAAI,EACV,IAAI,CAAC,SAAU,OAAO,KAAK,IAAI,KAAK,GAAI,EACxC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EACf;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAM,WAAO,8BAAY,MAAM,KAAK;AACpC,UAAM,SAAS,YAAY,IAAI;AAC/B,WAAO,GAAG,mBAAmB,MAAM,MAAM,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC,IAAI,MACpE,IAAI,CAAC,QAAQ,iBAAiB,GAAG,CAAC,EAClC,KAAK,EAAE,CAAC;AAAA;AAAA,EACb;AACA,MAAI,MAAM,SAAS,WAAW;AAC5B,WAAO,GAAG,IAAI,OAAO,MAAM,KAAK,CAAC,IAAI,qBAAqB,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC;AAAA;AAAA;AAAA,EACzG;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO,GAAG,qBAAqB,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA;AAAA;AAAA,EACvE;AACA,MAAI,MAAM,SAAS,gBAAgB;AACjC,UAAM,QAAQ,MAAM,KAAK,SAAS,KAAK,IAAI,SAAS;AACpD,WAAO,GAAG,KAAK;AAAA,EAAK,MAAM,IAAI;AAAA,EAAK,KAAK;AAAA;AAAA;AAAA,EAC1C;AACA,MAAI,MAAM,SAAS,kBAAkB;AACnC,WAAO,GAAG,MAAM,QACb,IAAI,CAAC,UAAU,KAAKC,gBAAe,MAAM,IAAI,CAAC,OAAOA,gBAAe,MAAM,WAAW,CAAC,EAAE,EACxF,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA,EACjB;AACA,MAAI,MAAM,SAAS,YAAY;AAC7B,UAAM,OAAO;AAAA,MACX,CAAC,QAAQ,YAAY,QAAQ;AAAA,MAC7B,GAAG,MAAM,MAAM,IAAI,CAAC,SAAS;AAC3B,cAAM,WAAW,KAAK,QAAQ,GAAG,EAAE,KAAK;AACxC,cAAM,QAAQ,4BAA4B,KAAK,QAAQ;AACvD,cAAM,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACjD,eAAO;AAAA,UACL,GAAG,KAAK,KAAK,GAAG,SAAS,WAAM,MAAM,KAAK,EAAE;AAAA,UAC5C,QAAQ,CAAC,KAAK;AAAA,UACd,QAAQ,CAAC,KAAK;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA;AAAA,EAAuB,mBAAmB,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,KAC/D,MAAM,CAAC,EACP,IAAI,CAAC,QAAQ,iBAAiB,GAAG,CAAC,EAClC,KAAK,EAAE,CAAC;AAAA;AAAA,EACb;AACA,MAAI,MAAM,SAAS,gBAAgB;AACjC,WAAO,MAAM,MACV;AAAA,MACC,CAAC,SACC,MAAMA,gBAAe,UAAU,KAAK,KAAK,CAAC,CAAC;AAAA;AAAA,EAAO,KAAK,QACpD;AAAA,QAAI,CAAC,SAAS,UACb,UAAU,IAAI,KAAKA,gBAAe,OAAO,CAAC,OAAOA,gBAAe,OAAO;AAAA,MACzE,EACC,KAAK,MAAM,CAAC;AAAA;AAAA;AAAA,IACnB,EACC,KAAK,EAAE;AAAA,EACZ;AACA,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO,OAAOA,gBAAe,MAAM,IAAI,CAAC;AAAA;AAAA,EAAOA,gBAAe,MAAM,YAAY,CAAC;AAAA;AAAA,EAAOA,gBAAe,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA,EACpH;AACA,SAAO,GAAG,MAAM,MACb;AAAA,IACC,CAAC,MAAM,UACL,GAAG,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,qBAAqB,KAAK,MAAM,KAAK,OAAO,YAAY,CAAC;AAAA,EACzG,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AACf;AAEA,SAAS,eAAe,OAA8B;AACpD,QAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM;AACxF,SAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,CAAC;AAC5E;AAEA,SAAS,aAAa,MAA6E;AACjG,QAAM,WAAW,KAAK,QAAQ,GAAG,EAAE,KAAK;AACxC,QAAM,QAAQ,4BAA4B,KAAK,QAAQ;AACvD,QAAM,cAAc,KAAK,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AACtD,QAAM,SAAS,cAAc,aAAaD,YAAW,WAAW,CAAC,YAAY;AAC7E,QAAM,WAAW,QAAQ,CAAC,KAAK;AAC/B,QAAM,SAAS,QAAQ,CAAC,KAAK;AAC7B,SAAO,uBAAuBA,YAAW,KAAK,KAAK,CAAC,GAAG,MAAM,YAAYA,YAAW,QAAQ,CAAC,YAAYA,YAAW,MAAM,CAAC;AAC7H;AAEA,SAAS,mBACP,MACQ;AACR,QAAM,UAAU,UAAU,KAAK,KAAK;AACpC,QAAM,SAAS,oCAAoC,KAAK,KAAK,KAAK;AAClE,MAAI,QAAQ;AACV,UAAM,CAAC,MAAM,GAAG,OAAO,IAAI,KAAK;AAChC,UAAM,UAAU,CAAC,OAAO,WAAWA,YAAW,IAAI,CAAC,cAAc,IAAI,GAAG,QAAQ,IAAIA,WAAU,CAAC,EAC5F,OAAO,OAAO,EACd,KAAK,MAAM;AACd,WAAO,gBAAgBA,YAAW,OAAO,CAAC,iBAAiB,OAAO;AAAA,EACpE;AACA,SAAO,gBAAgBA,YAAW,OAAO,CAAC,QAAQ,KAAK,QACpD;AAAA,IACC,CAAC,SAAS,UACR,MAAM,UAAU,IAAI,WAAWA,YAAW,OAAO,CAAC,cAAcA,YAAW,OAAO,CAAC;AAAA,EACvF,EACC,KAAK,EAAE,CAAC;AACb;AAEA,SAAS,UAAU,OAAuB;AACxC,QAAM,aAAa,MAAM,KAAK,EAAE,kBAAkB,IAAI;AACtD,SAAO,WAAW,QAAQ,WAAW,CAAC,WAAW,OAAO,kBAAkB,IAAI,CAAC;AACjF;AAEA,SAASA,YAAW,OAAuB;AACzC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEA,SAASC,gBAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,mBAAmB,MAAM;AAChD;;;AF1qBA,IAAM,SAAS;AAEf,eAAsB,kBACpB,OACA,OACA,UAA6B,CAAC,GACf;AACf,QAAM,kBAAkB,QAAQ,mBAAmB;AACnD,MAAI,iBAAiB;AACnB,UAAM,MAAM,sBAAsB;AAClC,UAAM;AAAA,MACJ,UAAU,gBAAgB,QAAQ,YAAY,IAAI,CAAC;AAAA,IACrD;AACA,UAAM,MAAM,qEAAqE;AACjF,UAAM,MAAM,UAAUC,YAAW,QAAQ,SAAS,cAAc,CAAC,UAAU;AAC3E,QAAI,QAAQ,iBAAiB,KAAM,OAAM,MAAM,UAAU,MAAM,UAAU;AACzE,UAAM,MAAM,eAAe;AAAA,EAC7B;AACA,QAAM,MAAM,6BAA6B;AACzC,QAAM,UAAU,eAAe,OAAO;AACtC,QAAM,eAAe,oBAAoB,SAAS,OAAO;AACzD,uBAAqB,cAAc,OAAO;AAC1C,MAAI,YAAY,YAAY;AAC1B,UAAM,YAAY,kBAAkB,QAAQ,sBAAsB;AAClE,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AACA,YAAQ,kBAAkB,KAAK;AAAA,EACjC,OAAO;AACL,qBAAiB,QAAQ,MAAO,OAAM,UAAU,MAAM,OAAO,OAAO;AAAA,EACtE;AACA,QAAM,MAAM,SAAS;AACrB,MAAI,gBAAiB,OAAM,MAAM,gBAAgB;AACnD;AAGA,eAAsB,sBACpB,OACA,OACA,UAAiC,CAAC,GACnB;AACf,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,uBAAqB,cAAc,OAAO;AAC1C,QAAM,YAAY,kBAAkB,QAAQ,sBAAsB;AAClE,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACA,UAAQ,kBAAkB,KAAK;AACjC;AAEA,SAAS,kBAAkB,OAAmC;AAC5D,QAAM,YAAY,SAAS;AAC3B,MAAI,CAAC,OAAO,cAAc,SAAS,KAAK,YAAY,KAAK,YAAY,IAAI;AACvE,UAAM,IAAI,WAAW,4DAA4D;AAAA,EACnF;AACA,SAAO;AACT;AAEA,eAAsB,UACpB,MACA,OACA,UAA6B,CAAC,GACf;AACf,QAAM,UAAU,eAAe,OAAO;AACtC,uBAAqB,oBAAoB,SAAS,OAAO,GAAG,OAAO;AACnE,MAAI,YAAY,WAAY,OAAM,cAAc,MAAM,OAAO,OAAO;AAAA,MAC/D,OAAM,oBAAoB,MAAM,OAAO,OAAO;AACrD;AAEA,eAAsB,WACpB,MACA,UAA6B,CAAC,GACb;AACjB,MAAI,SAAS;AACb,QAAM;AAAA,IACJ;AAAA,IACA,CAAC,UAAU;AACT,gBAAU;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,oBACb,MACA,OACA,SACe;AACf,QAAM,eAAe,oBAAoB,UAAU,OAAO;AAC1D,QAAM,eAAe,MAAM,oBAAoB,MAAM,cAAc,QAAQ,OAAO;AAClF,QAAM,cAAc,oBAAoB,KAAK,eAAe,KAAK,KAAK;AACtE,QAAM,mBAAmB,2BAA2B,MAAM,WAAW;AACrE,QAAM,cAAc,KAAK,WAAW,MAAM,KAAK,WAAW;AAC1D,QAAM,eAAe,cAAc,KAAK,SAAS,KAAK;AACtD,QAAM,gBAAgB,cAAc,KAAK,QAAQ,KAAK;AACtD,QAAM;AAAA,IACJ,8EAA8E,KAAK,MAAM,kBAAkB,KAAK,MAAM,kBAAkBC,QAAO,YAAY,CAAC,aAAaA,QAAO,aAAa,CAAC;AAAA,EAChM;AACA,QAAM,cAAc,kBAAkB,KAAK,QAAQ,KAAK,SAAS,CAAC,CAAC;AACnE,QAAM,aAAa,IAAI;AAAA,KACpB,KAAK,SAAS,CAAC,GACb,OAAO,CAAC,SAAoC,KAAK,WAAW,OAAO,EACnE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,EAClC;AACA,QAAM,cACH,QAAQ,iBAAiB,OACtB,kBAAkB,KAAK,QAAQ,aAAa,WAAW,IACvD;AACN,OAAK,QAAQ,iBAAiB,SAAS,KAAK,OAAO,QAAQ;AACzD,UAAM;AAAA,MACJ,UAAU,KAAK,MAAM,IAAI,CAAC,SAAS,eAAe,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAChF;AAAA,EACF;AACA,MAAI,aAAa,IAAK,OAAM,MAAM,UAAU,YAAY,GAAG,UAAU;AACrE,QAAM;AAAA,IACJ,kDAAkD,KAAK,MAAM,kBAAkBA,QAAO,KAAK,KAAK,CAAC,aAAaA,QAAO,KAAK,MAAM,CAAC,KAAK,kBAAkB,IAAI,CAAC;AAAA,EAC/J;AACA,QAAM;AAAA,IACJ,0EAA0EA,QAAO,KAAK,KAAK,CAAC,eAAeA,QAAO,KAAK,MAAM,CAAC,oBAAoBA,QAAO,KAAK,KAAK,CAAC,IAAIA,QAAO,KAAK,MAAM,CAAC;AAAA,EAC7L;AACA,QAAM,kBACJ;AAAA,IACE,iBAAiB,aAAa,CAAC,IAAK,KAAK,UAAU,CAAC;AAAA,IACpD,KAAK;AAAA,IACL,KAAK;AAAA,EACP,IACA;AAAA,KACG,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,MAAM,EAAE;AAAA,IACzD,KAAK;AAAA,EACP;AACF,MAAI,gBAAiB,OAAM,MAAM,SAAS,eAAe,SAAS;AAClE,MAAI,kBAAkB;AACpB,eAAW,CAAC,OAAO,KAAK,MAAM,KAAK,UAAU,CAAC,GAAG,QAAQ,GAAG;AAC1D,YAAM,SAAS,aAAa,KAAK;AACjC,UAAI,OAAQ,OAAM,MAAM,YAAY,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,MAAM,CAAC;AAAA,IACrF;AAAA,EACF;AACA,MAAI,KAAK,OAAO,UAAU,KAAK,OAAO,QAAQ;AAC5C,UAAM,MAAM,6BAA6BA,QAAO,KAAK,MAAM,CAAC,iBAAiB;AAC7E,eAAW,QAAQ,KAAK,SAAS,CAAC,EAAG,OAAM,MAAM,cAAc,IAAI,CAAC;AACpE,eAAW,CAAC,WAAW,IAAI,MAAM,KAAK,SAAS,CAAC,GAAG,QAAQ,GAAG;AAC5D,YAAM,MAAM,cAAc,MAAM,KAAK,QAAQ,SAAS,CAAC;AAAA,IACzD;AACA,UAAM,MAAM,MAAM;AAAA,EACpB;AACA,MAAI,CAAC,kBAAkB;AACrB,eAAW,CAAC,OAAO,KAAK,MAAM,KAAK,UAAU,CAAC,GAAG,QAAQ,GAAG;AAC1D,YAAM,SAAS,aAAa,KAAK;AACjC,UAAI,OAAQ,OAAM,MAAM,YAAY,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,MAAM,CAAC;AAAA,IACrF;AAAA,EACF;AACA,WAAS,YAAY,GAAG,YAAY,YAAY,QAAQ,aAAa,GAAG;AACtE,UAAM,OAAO,YAAY,SAAS;AAClC,QAAI,CAAC,KAAM;AACX,QAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,YAAM,QAAQ,KAAK,cAAc,WAAW,IAAI,KAAK,WAAW,IAAI;AACpE,YAAM,OACJ,CAAC,SAAS,cACN,eAAe,aAAa,WAAW,YAAY,OAAO,KAAK,QAAQ,WAAW,IAClF;AACN,UAAI,MAAM;AACR,cAAM,MAAM,KAAK,IAAI;AACrB,oBAAY,KAAK;AACjB;AAAA,MACF;AACA,YAAM;AAAA,QACJ,QACI,gBAAgB,MAAM,OAAO,KAAK,MAAM,IACxC;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA,oBAAoB,KAAK,WAAW;AAAA,UACpC,aAAa;AAAA,QACf;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,QAAQ;AACpB,aAAW,QAAQ,aAAa;AAC9B,QAAI,mBAAmB,IAAI,EAAG,OAAM,MAAM,eAAe,MAAM,WAAW,CAAC;AAAA,EAC7E;AACA,QAAM,MAAM,kBAAkB;AAChC;AAQA,SAAS,oBAAoB,OAA+B;AAC1D,QAAM,SAAqB,CAAC;AAC5B,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,GAAG,EAAE;AAC7B,QAAI,CAAC,YAAY,CAAC,uBAAuB,UAAU,IAAI,GAAG;AACxD,aAAO,KAAK,IAAI;AAChB;AAAA,IACF;AACA,WAAO,OAAO,SAAS,CAAC,IAAI;AAAA,MAC1B,GAAG;AAAA,MACH,MAAM,SAAS,OAAO,KAAK;AAAA,MAC3B,QAAQ;AAAA,QACN,GAAG,SAAS;AAAA,QACZ,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,QAAQ,SAAS,OAAO;AAAA,QAC3D,QAAQ,KAAK,IAAI,SAAS,OAAO,QAAQ,KAAK,OAAO,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAgB,OAA0B;AACxE,MAAI,mBAAmB,IAAI,KAAK,mBAAmB,KAAK,EAAG,QAAO;AAClE,MAAI,KAAK,cAAc,SAAS,MAAM,cAAc,MAAO,QAAO;AAElE,MAAI,YAAY,KAAK,KAAK,cAAc,EAAE,EAAG,QAAO;AACpD,MAAI,KAAK,cAAc,MAAM,WAAY,QAAO;AAChD,MAAI,CAAC,oBAAoB,MAAM,KAAK,EAAG,QAAO;AAC9C,QAAM,YAAY,KAAK,IAAI,MAAM,KAAK,WAAW,KAAK;AACtD,MAAI,KAAK,IAAI,KAAK,OAAO,IAAI,MAAM,OAAO,CAAC,IAAI,UAAW,QAAO;AACjE,QAAM,MAAM,MAAM,OAAO,KAAK,KAAK,OAAO,IAAI,KAAK,OAAO;AAC1D,SAAO,CAAC,MAAM,mBAAmB,OAAO,CAAC,aAAa,OAAO;AAC/D;AAEA,SAAS,oBAAoB,MAAgB,OAA0B;AACrE,SACE,KAAK,IAAI,KAAK,WAAW,MAAM,QAAQ,KAAK,QAC5C,KAAK,aAAa,MAAM,YACxB,KAAK,eAAe,MAAM,cAC1B,KAAK,gBAAgB,MAAM,eAC3B,KAAK,UAAU,MAAM,SACrB,KAAK,gBAAgB,MAAM,eAC3B,KAAK,gBAAgB,MAAM,eAC3B,KAAK,gBAAgB,MAAM,eAC3B,KAAK,kBAAkB,MAAM,iBAC7B,KAAK,kBAAkB,MAAM,iBAC7B,cAAc,KAAK,WAAW,MAAM,SAAS;AAEjD;AAEA,SAAS,cAAc,MAA6B,OAAuC;AACzF,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,SAAS;AACrC,SAAO,KAAK,MAAM,CAAC,OAAO,UAAU,KAAK,IAAI,SAAS,MAAM,KAAK,KAAK,EAAE,KAAK,IAAS;AACxF;AAEA,SAAS,kBACP,YACA,OACA,aAC6C;AAC7C,QAAM,QAAQ,oBAAI,IAAoB;AACtC,MAAI,MAAM;AACV,aAAW,QAAQ,OAAO;AACxB,QAAI,mBAAmB,IAAI,KAAK,KAAK,YAAY;AAC/C;AAAA,IACF;AACA,UAAM,QAAQ,qBAAqB,MAAM,WAAW;AACpD,QAAI,CAAC,SAAS,MAAM,IAAI,KAAK,EAAG;AAChC,UAAM,OAAO,WAAWA,QAAO,UAAU,CAAC,KAAK,MAAM,OAAO,CAAC;AAC7D,UAAM,IAAI,OAAO,IAAI;AACrB,WAAO,IAAI,IAAI,IAAI,KAAK;AAAA,EAC1B;AACA,SAAO,EAAE,KAAK,MAAM;AACtB;AAEA,SAAS,eACP,OACA,YACA,cACA,YACA,aACgD;AAChD,QAAM,QAAQ,MAAM,UAAU;AAC9B,MAAI,CAAC,SAAS,CAAC,uBAAuB,KAAK,EAAG,QAAO;AACrD,QAAM,QAAQ,qBAAqB,OAAO,WAAW;AACrD,QAAM,YAAY,aAAa,IAAI,KAAK;AACxC,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,WAAW;AACf,SAAO,WAAW,IAAI,MAAM,QAAQ;AAClC,UAAM,OAAO,MAAM,WAAW,CAAC;AAC/B,QACE,CAAC,QACD,CAAC,uBAAuB,IAAI,KAC5B,KAAK,IAAI,KAAK,OAAO,IAAI,MAAM,OAAO,CAAC,IAAI,QAC3C,qBAAqB,MAAM,WAAW,MAAM,OAC5C;AACA;AAAA,IACF;AACA,gBAAY;AAAA,EACd;AACA,MAAI,aAAa,WAAY,QAAO;AACpC,QAAM,WAAW,aAAa,MAAM,OAAO;AAC3C,QAAM,YAAY,MAAM,MAAM,YAAY,WAAW,CAAC;AACtD,QAAM,UAAU,UACb;AAAA,IAAI,CAAC,MAAM,UACV,gBAAgB,MAAM,QAAQ,IAAI,YAAY,UAAU,QAAQ,CAAC,GAAG,IAAI,IAAI,MAAS;AAAA,EACvF,EACC,KAAK,EAAE;AACV,SAAO;AAAA,IACL,MAAM,gBAAgB,SAAS,QAAQA,QAAO,MAAM,OAAO,CAAC,CAAC,QAAQA,QAAO,QAAQ,CAAC,KAAK,OAAO;AAAA,IACjG;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAgB,IAAgC;AACvE,QAAM,SAAS,KAAK,OAAO;AAC3B,QAAM,SAAS,OAAO,UAAaA,QAAO,EAAE,MAAM,MAAM,KAAK,QAAQA,QAAO,EAAE,CAAC;AAC/E,QAAM,SACJ,SAAS,IACL,gBAAgBA,QAAO,MAAM,CAAC,mBAAmB,sBAAsB,IAAI,IAAI,YAAY,kBAAkB,MAC7G;AACN,SAAO,SAAS,MAAM,GAAG,MAAM,IAAID,YAAW,KAAK,IAAI,CAAC;AAC1D;AAEA,SAAS,YAAY,UAAgC,SAA2B;AAC9E,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,MAAM,QAAQ,OAAO,KAAK,SAAS,OAAO,IAAI,SAAS,OAAO;AACpE,QAAM,aAAa,QAAQ;AAC3B,SAAO,eAAe,UAAa,KAAK,IAAI,aAAa,GAAG,KAAK,OAAQ,aAAa;AACxF;AAEA,SAAS,uBAAuB,MAAyB;AACvD,SACE,CAAC,mBAAmB,IAAI,KACxB,CAAC,KAAK,cACN,KAAK,cAAc,SACnB,CAAC,mBAAmB,IAAI,KACxB,CAAC,wBAAwB,KAAK,SAAS,KACvC,KAAK,kBAAkB,KACvB,KAAK,kBAAkB,MACtB,KAAK,gBAAgB,UAAa,CAAC,eAAe,KAAK,UAAU;AAEtE;AAEA,SAAS,2BAA2B,MAAqB,OAA4B;AACnF,SACE,QAAQ,KAAK,QAAQ,MAAM,KAC3B,QAAQ,KAAK,OAAO,UAAU,KAAK,OAAO,MAAM,KAChD,MAAM,SAAS,KACf,MAAM;AAAA,IACJ,CAAC,SACC,KAAK,cAAc,UACnB,KAAK,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,QAClC,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC,IAAI,QAC9B,KAAK,IAAI,KAAK,UAAU,CAAC,CAAC,IAAI,QAC9B,KAAK,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI;AAAA,EACtC;AAEJ;AAEA,SAAS,YACP,OACA,YACA,YACA,YACA,QACQ;AACR,QAAM,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,MAAM;AACjC,QAAM,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,aAAa,IAAI,CAAC,EAAE,IAAIC,OAAM,EAAE,KAAK,GAAG;AAChF,QAAM,UAAUC,gBAAe,MAAM,OAAO,IAAI,aAAaD,QAAO,MAAM,OAAO,CAAC,MAAM;AACxF,MAAI,SAAS,4EAA4E,SAAS,YAAY,MAAM,IAAI,OAAO;AAC/H,WAAS,SAAS,MAAM,OAAO,UAAU,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG;AACvE,aAAS,sBAAsB,YAAY,YAAY,YAAY,KAAK,CAAC,MAAM,MAAM;AAAA,EACvF;AACA,SAAO;AACT;AAEA,eAAe,oBACb,MACA,cACA,SACmB;AACnB,MAAI,iBAAiB,WAAY,QAAO,CAAC;AACzC,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,OAAO,KAAK,MAAM,KAAK,UAAU,CAAC,GAAG,QAAQ,GAAG;AAC1D,UAAM,WAAW,MAAM,WAAW,SAAS,eAAe;AAC1D,UAAM,OAAO,MAAM,WAAW,SAAS,MAAM,OAAOE,QAAO,KAAK;AAChE,QAAI,iBAAiB,YAAY;AAC/B,cAAQ,KAAK,QAAQ,QAAQ,WAAW,OAAO,IAAI,CAAC,EAAE;AACtD;AAAA,IACF;AACA,UAAM,YAAY,MAAM,WAAW,SAAS,QAAQ;AACpD,UAAM,OAAO,QAAQ,KAAK,MAAM,UAAU,QAAQ,CAAC,IAAI,SAAS;AAChE,UAAM,UAAU,EAAE,MAAM,UAAU,KAAK,CAAC;AACxC,YAAQ,KAAK,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAEA,SAAS,qBACP,QACA,YACA,YACQ;AACR,SAAO,OACJ;AAAA,IAAQ,CAAC,OAAO,gBACd,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,cAAc;AAC3C,UAAI,CAAC,UAAU,KAAK,CAAC,EAAG,QAAO;AAC/B,YAAM,WAAW,KAAK,WAAW,eAAe,KAAK,QAAQ,MAAM;AACnE,aAAO,iBAAiB,YAAY,YAAY,YAAY,SAAS,CAAC,6CAA6C,KAAK,CAAC,4BAA4BF,QAAO,UAAU,CAAC,iBAAiB,QAAQ;AAAA,IAClM,CAAC;AAAA,EACH,EACC,KAAK,EAAE;AACZ;AAEA,SAAS,YAAY,YAAoB,YAAoB,WAA2B;AACtF,SAAO,eAAe,UAAU,IAAI,UAAU,IAAI,SAAS;AAC7D;AAEA,SAASE,QAAO,OAAgC;AAC9C,QAAM,SAAS,KAAK,KAAM,MAAM,QAAQ,IAAK,CAAC,IAAI;AAClD,QAAM,SAAS,IAAI,WAAW,KAAK,SAAS,MAAM,MAAM;AACxD,QAAM,OAAO,IAAI,SAAS,OAAO,MAAM;AACvC,SAAO,CAAC,IAAI;AACZ,SAAO,CAAC,IAAI;AACZ,OAAK,UAAU,GAAG,OAAO,QAAQ,IAAI;AACrC,OAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,OAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,OAAK,SAAS,IAAI,MAAM,OAAO,IAAI;AACnC,OAAK,SAAS,IAAI,CAAC,MAAM,QAAQ,IAAI;AACrC,OAAK,UAAU,IAAI,GAAG,IAAI;AAC1B,OAAK,UAAU,IAAI,IAAI,IAAI;AAC3B,OAAK,UAAU,IAAI,SAAS,MAAM,QAAQ,IAAI;AAC9C,WAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO,GAAG;AAC9C,aAAS,SAAS,GAAG,SAAS,MAAM,OAAO,UAAU,GAAG;AACtD,YAAM,UAAU,MAAM,MAAM,QAAQ,UAAU;AAC9C,YAAM,SAAS,KAAK,MAAM,SAAS,SAAS;AAC5C,aAAO,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK;AAC3C,aAAO,SAAS,CAAC,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK;AAC/C,aAAO,SAAS,CAAC,IAAI,MAAM,KAAK,MAAM,KAAK;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA6B;AACtD,UAAQ,KAAK,QAAQ;AAAA,IACnB,KAAK;AACH,aAAO,wBAAwBF,QAAO,KAAK,MAAM,CAAC;AAAA,IACpD,KAAK;AACH,aAAO,wBAAwBA,QAAO,KAAK,KAAK,CAAC,MAAMA,QAAO,KAAK,MAAM,CAAC;AAAA,IAC5E,KAAK;AACH,aAAO,0BAA0BA,QAAO,KAAK,KAAK,CAAC;AAAA,IACrD;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,MAAgB,aAA0C;AAChF,QAAM,YAAY,mBAAmB,CAAC,IAAI,CAAC;AAC3C,QAAM,QAAQ;AAAA,IACZ,QAAQA,QAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IAC7B,UAAUA,QAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IAC/B,SAASA,QAAO,KAAK,OAAO,KAAK,CAAC;AAAA,IAClC,UAAUA,QAAO,KAAK,OAAO,MAAM,CAAC;AAAA,IACpC,aAAaA,QAAO,KAAK,QAAQ,CAAC;AAAA,IAClC,GAAIG,eAAc,KAAK,KAAK,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,IAC3D,GAAIF,gBAAe,KAAK,WAAW,IAAI,CAAC,WAAWD,QAAO,KAAK,WAAW,CAAC,EAAE,IAAI,CAAC;AAAA,IAClF,GAAG;AAAA,MACD,KAAK;AAAA,MACL,KAAK,cAAc,YAAY,IAAI,KAAK,WAAW,IAAI;AAAA,IACzD;AAAA,EACF,EAAE,KAAK,GAAG;AACV,SAAO,yBAAyB,SAAS,WAAW,KAAK,KAAKD,YAAW,KAAK,IAAI,CAAC;AACrF;AAEA,eAAe,cACb,MACA,OACA,SACe;AACf,QAAM,eAAe,oBAAoB,YAAY,OAAO;AAC5D,QAAM,QAAQ,MAAM,qBAAqB,MAAM,cAAc,QAAQ,OAAO;AAC5E,QAAM,iBAAa,iCAAc,0BAA0B,MAAM,KAAK,CAAC;AACvE,QAAM,eAAe,kBAAkB,WAAW,KAAK;AACvD,MAAI,aAAa;AACjB,QAAM,WAAW;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,EACb;AACA,QAAM,iBAAiB,IAAI,IAAI,SAAS,OAAO,CAAC;AAChD,QAAM,eAAe,oBAAI,IAAmB;AAC5C,QAAM;AAAA,IACJ,0EAA0E,KAAK,MAAM;AAAA,EACvF;AACA,aAAW,SAAS,WAAW,QAAQ;AACrC,UAAM,SAASK,gBAAe,KAAK;AACnC,QAAI,mBAAmB;AACvB,WAAO,MAAM,UAAU,KAAK,aAAa,IAAI,MAAM,UAAU,CAAkB;AAC7E,oBAAc;AAChB,YAAQ,MAAM,UAAU,GAAG,OAAO,KAAK,cAAc,QAAQ;AAC3D,YAAM,OAAO,MAAM,UAAU;AAC7B,UAAI,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,MAAM,SAAS,aAAa;AACtE,cAAM;AAAA,UACJ,uCAAuC,KAAK,IAAI,eAAe,iBAAiB,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA,QACxH;AACA,qBAAa,IAAI,IAAI;AACrB,sBAAc;AACd,2BAAmB;AACnB;AAAA,MACF;AACA,UAAI,QAAQ,eAAe,IAAI,IAAI,EAAG;AACtC,YAAM,MAAM,oCAAoC,MAAM,IAAI,QAAQ;AAClE,oBAAc;AAAA,IAChB;AACA,UAAM,kBAAkB,SAAS,IAAI,KAAK;AAC1C,QAAI,CAAC,oBAAoB,mBAAmB,MAAM,SAAS,aAAa;AACtE,YAAM;AAAA,QACJ,uCAAuC,gBAAgB,IAAI,eAAe,iBAAiB,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA,MACnI;AACA,mBAAa,IAAI,eAAe;AAChC,yBAAmB;AAAA,IACrB;AACA,QAAI,iBAAkB;AACtB,QAAI,MAAM,SAAS,QAAS,OAAM,UAAM,+BAAY,MAAM,KAAK,CAAC;AAAA,aACvD,MAAM,SAAS,WAAW;AACjC,YAAM;AAAA,QACJ,KAAK,MAAM,KAAK,IAAI,iBAAiB,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC,MAAM,MAAM,KAAK;AAAA,MACrG;AAAA,IACF,WAAW,MAAM,SAAS,aAAa;AACrC,YAAM;AAAA,QACJ,KAAK,mBAAmB,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,IAAI,iBAAiB,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA,MAC/H;AAAA,IACF,WAAW,MAAM,SAAS,gBAAgB;AACxC,YAAM,MAAM,QAAQL,YAAW,MAAM,IAAI,CAAC,QAAQ;AAAA,IACpD,WAAW,MAAM,SAAS,kBAAkB;AAC1C,YAAM,MAAM,MAAM;AAClB,iBAAW,SAAS,MAAM,SAAS;AACjC,cAAM;AAAA,UACJ,YAAYA,YAAW,MAAM,IAAI,CAAC,YAAYA,YAAW,MAAM,WAAW,CAAC;AAAA,QAC7E;AAAA,MACF;AACA,YAAM,MAAM,OAAO;AAAA,IACrB,WAAW,MAAM,SAAS,YAAY;AACpC,YAAM,MAAM,kCAAkC;AAC9C,iBAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,MAAM,gBAAgBA,YAAW,KAAK,KAAK,CAAC,OAAO;AACzD,mBAAW,UAAU,KAAK,QAAS,OAAM,MAAM,MAAMA,YAAW,MAAM,CAAC,MAAM;AAC7E,cAAM,MAAM,YAAY;AAAA,MAC1B;AACA,YAAM,MAAM,QAAQ;AAAA,IACtB,WAAW,MAAM,SAAS,gBAAgB;AACxC,YAAM,MAAM,qCAAqC;AACjD,iBAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,MAAM,gBAAgBA,YAAW,KAAK,KAAK,CAAC,OAAO;AACzD,mBAAW,WAAW,KAAK,QAAS,OAAM,MAAM,MAAMA,YAAW,OAAO,CAAC,MAAM;AAC/E,cAAM,MAAM,YAAY;AAAA,MAC1B;AACA,YAAM,MAAM,QAAQ;AAAA,IACtB,WAAW,MAAM,SAAS,cAAc;AACtC,YAAM;AAAA,QACJ,gBAAgBA,YAAW,MAAM,IAAI,CAAC,WAAWA,YAAW,MAAM,YAAY,CAAC,UAAUA,YAAW,MAAM,IAAI,CAAC;AAAA,MACjH;AAAA,IACF,WAAW,MAAM,SAAS,cAAc;AACtC,YAAM;AAAA,QACJ,8DAA8DC,QAAO,MAAM,QAAQ,CAAC,OAAO,MAAM,OAAO,IAAI,CAAC,SAAS,wBAAwB,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,MAC7K;AAAA,IACF,OAAO;AACL,YAAM,MAAM,MAAM,UAAU,OAAO;AACnC,YAAM,MAAM,IAAI,GAAG,GAAG;AACtB,iBAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,MAAM,OAAO,iBAAiB,KAAK,MAAM,KAAK,OAAO,YAAY,CAAC,OAAO;AAAA,MACjF;AACA,YAAM,MAAM,KAAK,GAAG,GAAG;AAAA,IACzB;AAAA,EACF;AACA,SAAO,aAAa,MAAM,QAAQ;AAChC,UAAM,OAAO,MAAM,UAAU;AAC7B,QAAI,QAAQ,CAAC,aAAa,IAAI,IAAI,GAAG;AACnC,YAAM,MAAM,oCAAoC,KAAK,IAAI,QAAQ;AAAA,IACnE;AACA,kBAAc;AAAA,EAChB;AACA,QAAM,MAAM,YAAY;AAC1B;AAEA,SAAS,wBAAwB,OAAsB,cAA8B;AACnF,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO,8DAA8DA,QAAO,MAAM,QAAQ,CAAC,OAAO,MAAM,OAAO,IAAI,CAAC,SAAS,wBAAwB,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,EACpL;AACA,MAAI,MAAM,SAAS,QAAS,YAAO,+BAAY,MAAM,KAAK;AAC1D,MAAI,MAAM,SAAS,WAAW;AAC5B,WAAO,KAAK,MAAM,KAAK,IAAI,iBAAiB,MAAM,MAAM,MAAM,OAAO,cAAc,KAAK,CAAC,MAAM,MAAM,KAAK;AAAA,EAC5G;AACA,MAAI,MAAM,SAAS,aAAa;AAC9B,WAAO,MAAM,iBAAiB,MAAM,MAAM,MAAM,OAAO,YAAY,CAAC;AAAA,EACtE;AACA,MAAI,MAAM,SAAS,eAAgB,QAAO,QAAQD,YAAW,MAAM,IAAI,CAAC;AACxE,MAAI,MAAM,SAAS,kBAAkB;AACnC,WAAO,OAAO,MAAM,QAAQ,IAAI,CAAC,UAAU,YAAYA,YAAW,MAAM,IAAI,CAAC,YAAYA,YAAW,MAAM,WAAW,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC;AAAA,EAC/I;AACA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,mCAAmC,MAAM,MAAM,IAAI,CAAC,SAAS,gBAAgBA,YAAW,KAAK,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,MAAMA,YAAW,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA,EAC/M;AACA,MAAI,MAAM,SAAS,gBAAgB;AACjC,WAAO,sCAAsC,MAAM,MAAM,IAAI,CAAC,SAAS,gBAAgBA,YAAW,KAAK,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,YAAY,MAAMA,YAAW,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA,EACpN;AACA,MAAI,MAAM,SAAS,cAAc;AAC/B,WAAO,gBAAgBA,YAAW,MAAM,IAAI,CAAC,WAAWA,YAAW,MAAM,YAAY,CAAC,UAAUA,YAAW,MAAM,IAAI,CAAC;AAAA,EACxH;AACA,QAAM,MAAM,MAAM,UAAU,OAAO;AACnC,SAAO,IAAI,GAAG,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,OAAO,iBAAiB,KAAK,MAAM,KAAK,OAAO,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,GAAG;AACnI;AAEA,SAASK,gBAAe,OAA8B;AACpD,QAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,MAAM,QAAQ,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM;AACxF,SAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,CAAC;AAC5E;AAEA,SAAS,WACP,MACA,YACA,aACA,6BAA6B,OAC7B,cACQ;AACR,MAAI,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,EAAG,QAAO;AACjE,MAAI,CAAC,KAAK,eAAe,eAAe,KAAK,UAAU,EAAG,QAAO;AACjE,QAAM,YAAY,mBAAmB,CAAC,IAAI,CAAC;AAC3C,QAAM,QAAQ,gBAAgB,MAAM,WAAW;AAC/C,QAAM,aAAa,cAAc,IAAI,qBAAqB,MAAM,WAAW,CAAC;AAC5E,QAAM,eAAe,aAAa,WAAW,UAAU,MAAM,QAAQ,WAAW,KAAK,MAAM;AAC3F,QAAM,WAAW,aAAa,KAAK,eAAeJ,QAAO,KAAK,QAAQ,CAAC;AACvE,QAAM,aAAa,KAAK,cAAc,QAAQ,KAAK,OAAO,SAAS,KAAK,OAAO;AAC/E,QAAM,aACJ,aAAa,KAAK,CAAC,mBAAmB,IAAI,IACtC,gBAAgBA,QAAO,UAAU,CAAC,mBAAmB,KAAK,cAAc,SAAS,sBAAsB,IAAI,IAAI,YAAY,kBAAkB,MAC7I;AACN,QAAM,YACJ,8BAA8B,KAAK,YAC9B;AAAA,IACC,KAAK,UAAU,CAAC;AAAA,IAChB,KAAK,UAAU,CAAC;AAAA,IAChB,KAAK,UAAU,CAAC;AAAA,IAChB,CAAC,KAAK,UAAU,CAAC;AAAA,EACnB,IACA,KAAK;AACX,QAAM,cAAc,wBAAwB,SAAS;AACrD,QAAM,YAAY,KAAK,cAAc,QAAQ,KAAK,OAAO,QAAQ;AACjE,QAAM,SAAS,YAAY,CAAC,KAAK;AACjC,QAAM,SAAS,YAAY,CAAC,KAAK;AACjC,QAAM,UAAU,KAAK,OAAO,IAAI,SAAS;AACzC,QAAM,UAAU,aAAa,KAAK,OAAO,IAAI,SAAS;AACtD,QAAM,WAAW,cACb,kCAAkC,WAAW,IAAIA,OAAM,EAAE,KAAK,GAAG,CAAC,IAAIA,QAAO,OAAO,CAAC,IAAIA,QAAO,OAAO,CAAC,OACxG,OAAOA,QAAO,OAAO,CAAC,QAAQA,QAAO,OAAO,CAAC;AACjD,SAAO,QAAQ,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,YAAY,IAAID,YAAW,KAAK,IAAI,CAAC;AACrG;AAEA,SAAS,qBAAqB,MAAgB,aAA0C;AACtF,QAAM,QAAQ,gBAAgB,MAAM,WAAW;AAC/C,QAAM,WAAW,aAAaC,QAAO,KAAK,QAAQ,CAAC;AACnD,SAAO,QAAQ,GAAG,KAAK,IAAI,QAAQ,KAAK;AAC1C;AAEA,SAAS,gBAAgB,MAAgB,aAA0C;AACjF,QAAM,OAAO;AAAA,IACX,KAAK;AAAA,IACL,KAAK,cAAc,YAAY,IAAI,KAAK,WAAW,IAAI;AAAA,EACzD,EAAE,KAAK,GAAG;AACV,QAAM,SAASG,eAAc,KAAK,WAAW,IAAI,UAAU,KAAK,WAAW,KAAK;AAChF,QAAM,cACJ,UAAU,OAAO,SAAS,KAAK,WAAW,MAAM,KAAK,eAAe,OAAO,IACvE,gBAAgBH,QAAO,KAAK,eAAe,CAAC,CAAC,KAC7C;AACN,QAAM,aAAa,KAAK,kBAAkB,KAAK,KAAK,kBAAkB;AACtE,QAAM,cAAcC,gBAAe,KAAK,WAAW,IAC/C,gBAAgBD,QAAO,KAAK,WAAW,CAAC,KACxC;AACJ,QAAM,gBAAgBC,gBAAe,KAAK,aAAa,IACnD,kBAAkBD,QAAO,KAAK,aAAa,CAAC,KAC5C;AACJ,SAAO;AAAA,IACL,mBAAmB,IAAI,IAAI,6CAA6C;AAAA,IACxE,KAAK,cAAc,QAAQ,6BAA6B;AAAA,IACxD,aAAa,cAAcG,eAAc,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK;AAAA,IAC9E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,YAAyC;AAC/D,SAAO,qDAAqD,KAAK,cAAc,EAAE;AACnF;AAEA,SAAS,gBAAgB,MAAgB,MAAyB,YAA4B;AAC5F,MAAI,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,EAAG,QAAO;AACjE,QAAM,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AACtE,QAAM,YAAY,KAAK,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,OAAO,IAAI,IAAI,CAAC;AACvE,QAAM,eAAe,SAAS,OAAO,CAAC,OAAO,UAAU,SAAS,OAAO,WAAW,IAAI,CAAC;AACvF,MAAI,gBAAgB,KAAK,KAAK,OAAO,SAAS,KAAK,KAAK,YAAY,EAAG,QAAO;AAC9E,QAAM,YAAY,KAAK,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;AAC/C,QAAM,QAAQ,UAAU,UAAU,IAAIH,OAAM,EAAE,KAAK,GAAG,CAAC,IAAIA,QAAO,KAAK,OAAO,CAAC,CAAC,IAAIA,QAAO,aAAa,KAAK,OAAO,CAAC,CAAC;AACtH,QAAM,SAAS,KAAK,OAAO,QAAQ;AACnC,MAAI,SAAS;AACb,MAAI,UAAU;AACd,aAAW,SAAS,UAAU;AAC5B,QAAI,CAAC,MAAO;AACZ,eAAW,2BAA2BA,QAAO,MAAM,CAAC,QAAQ,WAAW,OAAO,KAAK,KAAK,CAAC;AACzF,cAAU,MAAM;AAAA,EAClB;AACA,SAAO,iBAAiB,KAAK,yBAAyBA,QAAO,MAAM,CAAC,IAAIA,QAAO,CAAC,KAAK,QAAQ,CAAC,MAAM,OAAO;AAC7G;AAEA,SAAS,mBAAmB,MAAyB;AACnD,SAAO,KAAK,cAAc,SAAS,mBAAmB,KAAK,KAAK,IAAI;AACtE;AAEA,SAAS,sBAAsB,MAAyB;AACtD,SAAO,CAAC,KAAK,eAAe,SAAS,KAAK,KAAK,cAAc,EAAE;AACjE;AAEA,SAAS,WAAW,OAAmB,WAA4B;AACjE,MAAI,SAAS;AACb,aAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,UAAM,QAAQ,MAAM,iBAAiBG,eAAc,SAAS,IAAI,YAAY,KAAK;AACjF,QAAI,CAACA,eAAc,KAAK,EAAG;AAC3B,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAGH,QAAO,CAAC,CAAC,IAAIA,QAAO,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAChF,UAAM,UAAUC,gBAAe,KAAK,OAAO,IAAI,kBAAkBD,QAAO,KAAK,OAAO,CAAC,MAAM;AAC3F,cAAU,oBAAoB,MAAM,WAAW,KAAK,IAAI,OAAO;AAAA,EACjE;AACA,aAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,QAAI,CAAC,UAAU,KAAK,CAAC,EAAG;AACxB,UAAM,OACJ,MAAM,iBAAiBG,eAAc,SAAS,IAC1C,YACAA,eAAc,KAAK,IAAI,IACrB,KAAK,OACL;AACR,UAAM,SACJ,MAAM,iBAAiBA,eAAc,SAAS,KAAK,KAAK,SACpD,YACAA,eAAc,KAAK,MAAM,IACvB,KAAK,SACL;AACR,UAAM,QACJ,KAAK,gBAAgB,UAAa,OAAO,SAAS,KAAK,WAAW,KAAK,KAAK,eAAe,IACvF,kBAAkBH,QAAO,KAAK,WAAW,CAAC,MAC1C;AACN,cAAU,YAAY,KAAK,CAAC,WAAW,IAAI,aAAa,MAAM,IAAI,KAAK;AAAA,EACzE;AACA,UAAQ,MAAM,OAAO,UAAU,KAAK,MAAM,MAAM,UAAU,IACtD,mCAAmC,MAAM,SACzC;AACN;AAEA,SAASG,eAAc,OAA4C;AACjE,SAAO,iBAAiB,KAAK,SAAS,EAAE;AAC1C;AAEA,SAASF,gBAAe,OAA4C;AAClE,SAAO,OAAO,SAAS,KAAK,MAAM,SAAS,OAAO,MAAM,SAAS,MAAM;AACzE;AAEA,SAAS,YAAY,YAAyC;AAC5D,SAAO,gBAAgB,KAAK,cAAc,EAAE;AAC9C;AAEA,SAAS,mBAAmB,MAAyB;AACnD,SACE,CAAC,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,CAAC,wBAAwB,KAAK,SAAS;AAE/F;AAEA,SAAS,wBAAwB,WAA2C;AAC1E,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,WAA6C,CAAC,GAAG,GAAG,GAAG,CAAC;AAC9D,SAAO,UAAU,KAAK,CAAC,OAAO,UAAU,KAAK,IAAI,SAAS,SAAS,KAAK,KAAK,EAAE,IAAI,IAAS;AAC9F;AAEA,SAAS,mBAAmB,OAA2B;AACrD,QAAM,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,KAAK,EAAE;AAC7D,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,cAAc,KAAK,EAAE;AAClE,MAAI,WAAW,OAAO,WAAW,KAAK,MAAM,OAAQ,QAAO;AAC3D,SAAO,MAAM,KAAK,MAAM,UAAU,MAAM,SAAS,IAAI,eAAe;AACtE;AAEA,SAASD,QAAO,OAAuB;AACrC,SAAO,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,GAAI,IAAI,GAAI,IAAI;AAC5E;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,SAAOD,YAAW,KAAK,EAAE,WAAW,KAAK,OAAO;AAClD;AAEA,SAASA,YAAW,OAAuB;AACzC,SAAO,CAAC,GAAG,KAAK,EACb,IAAI,CAAC,cAAc;AAClB,UAAM,YAAY,UAAU,YAAY,CAAC,KAAK;AAC9C,QAAI,cAAc,GAAI,QAAO;AAC7B,WAAO,mBAAmB,SAAS,IAAI,WAAM;AAAA,EAC/C,CAAC,EACA,KAAK,EAAE,EACP,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,OAAO;AAC5B;AAEA,SAAS,mBAAmB,WAA4B;AACtD,SACE,aAAa,KACb,cAAc,MACd,cAAc,MACb,aAAa,MAAM,aAAa,MACjC,cAAc;AAElB;AAEA,SAAS,eAAe,SAAyC;AAC/D,QAAM,gBAAgB,QAAQ,WAAW,SAAS,aAAa;AAC/D,MAAI,QAAQ,WAAW,QAAQ,UAAU,QAAQ,YAAY,eAAe;AAC1E,UAAM,IAAI;AAAA,MACR,6CAA6C,QAAQ,OAAO,4BAA4B,QAAQ,MAAM;AAAA,IACxG;AAAA,EACF;AACA,SAAO,QAAQ,WAAW;AAC5B;AAEA,SAAS,oBAAoB,SAAsB,SAA8C;AAC/F,SAAO,QAAQ,iBAAiB,YAAY,aAAa,aAAa;AACxE;AAEA,SAAS,qBACP,cACA,SACM;AACN,MAAI,iBAAiB,gBAAgB,CAAC,QAAQ,SAAS;AACrD,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACF;","names":["import_structure","bounds","styles","bounds","number","overlap","styles","escapeHtml","finiteNonnegative","html","escapeHtml","escapeMarkdown","escapeHtml","number","isUnitInterval","rgbBmp","isCssHexColor","semanticBlockY"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/semantic-caption.ts","../src/semantic-document.ts","../src/semantic-inline.ts","../src/vector-svg.ts","../src/visual-font.ts","../src/semantic-media.ts"],"sourcesContent":["import type {\n EmbeddedFont,\n EmbeddedType3Font,\n ExtractedPage,\n RasterImage,\n TextSpan,\n Type3Glyph,\n} from \"@boxpdf/reader\";\nimport { type SemanticBlock, structurePage, tableToHtml } from \"@boxpdf/reader/structure\";\nimport { clearMediaCaptionAssociations } from \"./semantic-caption.js\";\nimport { type SemanticDocumentStats, writeSemanticDocument } from \"./semantic-document.js\";\nimport { dominantTextColor, semanticTextHtml } from \"./semantic-inline.js\";\nimport {\n type HtmlImageAsset,\n type HtmlImageOptions,\n prepareSemanticMedia,\n type SemanticMedia,\n withoutSemanticMediaSpans,\n} from \"./semantic-media.js\";\nimport {\n isSvgPath,\n vectorFillSvg,\n vectorPathClipDefinitions,\n vectorPathSvg,\n} from \"./vector-svg.js\";\nimport { base64, visualFontAliases, visualFontFace, visualFontStyles } from \"./visual-font.js\";\n\nexport type { SemanticDocumentStats } from \"./semantic-document.js\";\nexport type { HtmlImageAsset, HtmlImageOptions } from \"./semantic-media.js\";\n\nexport type HtmlLayout = \"positioned\" | \"flow\";\nexport type HtmlProfile = \"visual\" | \"semantic\";\nexport type HtmlWrite = (chunk: string) => void | Promise<void>;\n\nexport interface HtmlWriterOptions {\n /** Output intent. Visual preserves page presentation; semantic prioritizes reading order. */\n profile?: HtmlProfile;\n /** @deprecated Use `profile: \"visual\"` or `profile: \"semantic\"`. */\n layout?: HtmlLayout;\n title?: string;\n language?: string;\n includeDocument?: boolean;\n includeStyles?: boolean;\n /** Maximum extracted page models retained for document-level semantic decisions. */\n semanticLookaheadPages?: number;\n /** Receives bounded-buffer and document-inference statistics after semantic output completes. */\n onSemanticStats?: (stats: Readonly<SemanticDocumentStats>) => void;\n /** Semantic defaults to excluded; visual defaults to embedded. */\n imageOptions?: HtmlImageOptions;\n /** Receives each named asset when imageOptions is references. */\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>;\n}\n\nexport interface MarkdownWriterOptions {\n semanticLookaheadPages?: number;\n onSemanticStats?: (stats: Readonly<SemanticDocumentStats>) => void;\n /** Defaults to excluded. */\n imageOptions?: HtmlImageOptions;\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>;\n}\n\nconst styles = `.pdf-document{margin:0 auto}.pdf-page{box-sizing:border-box;margin:1rem auto;background:#fff;color:#000}.pdf-page--visual,.pdf-page--positioned{position:relative;overflow:hidden}.pdf-page-content{position:absolute;transform-origin:0 0}.pdf-span{position:absolute;white-space:pre;transform-origin:left bottom;unicode-bidi:isolate}.pdf-span[data-direction=ttb]{writing-mode:vertical-rl}.pdf-page--semantic,.pdf-page--flow{max-width:60rem;padding:1rem}.pdf-page--semantic p,.pdf-page--flow p{white-space:pre-wrap;unicode-bidi:plaintext}.pdf-semantic-document h1,.pdf-page--semantic h1{font-size:1.7em}.pdf-semantic-document h2,.pdf-page--semantic h2{font-size:1.5em}.pdf-semantic-document h3,.pdf-page--semantic h3{font-size:1.35em}.pdf-semantic-document h4,.pdf-page--semantic h4{font-size:1.1em}.pdf-page table{border-collapse:collapse}.pdf-page td{padding:.15rem .4rem;vertical-align:top}`;\n\nexport async function writeHtmlDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n const includeDocument = options.includeDocument ?? true;\n if (includeDocument) {\n await write(\"<!doctype html><html\");\n await write(\n ` lang=\"${escapeAttribute(options.language ?? \"en\")}\"><head><meta charset=\"utf-8\">`,\n );\n await write('<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">');\n await write(`<title>${escapeHtml(options.title ?? \"PDF document\")}</title>`);\n if (options.includeStyles ?? true) await write(`<style>${styles}</style>`);\n await write(\"</head><body>\");\n }\n await write('<main class=\"pdf-document\">');\n const profile = resolveProfile(options);\n const imageOptions = resolveImageOptions(profile, options);\n validateImageOptions(imageOptions, options);\n if (profile === \"semantic\") {\n const lookahead = semanticLookahead(options.semanticLookaheadPages);\n const stats = await writeSemanticDocument(\n pages,\n write,\n lookahead,\n imageOptions,\n options.onImage,\n );\n options.onSemanticStats?.(stats);\n } else {\n const documentFonts: VisualDocumentFonts = { entries: [] };\n for await (const page of pages) await writePositionedPage(page, write, options, documentFonts);\n }\n await write(\"</main>\");\n if (includeDocument) await write(\"</body></html>\");\n}\n\n/** Streams reflowed Markdown from the same bounded semantic inference used by semantic HTML. */\nexport async function writeMarkdownDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: HtmlWrite,\n options: MarkdownWriterOptions = {},\n): Promise<void> {\n const imageOptions = options.imageOptions ?? \"excluded\";\n validateImageOptions(imageOptions, options);\n const lookahead = semanticLookahead(options.semanticLookaheadPages);\n const stats = await writeSemanticDocument(\n pages,\n write,\n lookahead,\n imageOptions,\n options.onImage,\n \"markdown\",\n );\n options.onSemanticStats?.(stats);\n}\n\nfunction semanticLookahead(value: number | undefined): number {\n const lookahead = value ?? 4;\n if (!Number.isSafeInteger(lookahead) || lookahead < 1 || lookahead > 16) {\n throw new RangeError(\"semanticLookaheadPages must be an integer between 1 and 16\");\n }\n return lookahead;\n}\n\nexport async function writePage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions = {},\n): Promise<void> {\n const profile = resolveProfile(options);\n validateImageOptions(resolveImageOptions(profile, options), options);\n if (profile === \"semantic\") await writeFlowPage(page, write, options);\n else await writePositionedPage(page, write, options);\n}\n\nexport async function pageToHtml(\n page: ExtractedPage,\n options: HtmlWriterOptions = {},\n): Promise<string> {\n let output = \"\";\n await writePage(\n page,\n (chunk) => {\n output += chunk;\n },\n options,\n );\n return output;\n}\n\nasync function writePositionedPage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions,\n documentFonts?: VisualDocumentFonts,\n): Promise<void> {\n const imageOptions = resolveImageOptions(\"visual\", options);\n const visualImages = await prepareVisualImages(page, imageOptions, options.onImage);\n const visualSpans = coalesceVisualSpans(page.visualSpans ?? page.spans);\n const reflectedOverlay = usesReflectedVisualOverlay(page, visualSpans);\n const quarterTurn = page.rotate === 90 || page.rotate === 270;\n const displayWidth = quarterTurn ? page.height : page.width;\n const displayHeight = quarterTurn ? page.width : page.height;\n await write(\n `<section class=\"pdf-page pdf-page--visual pdf-page--positioned\" data-page=\"${page.number}\" data-rotate=\"${page.rotate}\" style=\"width:${number(displayWidth)}pt;height:${number(displayHeight)}pt\">`,\n );\n const { aliases: fontAliases, fontsToEmit } = visualPageFonts(\n page.number,\n page.fonts ?? [],\n documentFonts,\n );\n const type3Fonts = new Map(\n (page.fonts ?? [])\n .filter((font): font is EmbeddedType3Font => font.format === \"type3\")\n .map((font) => [font.id, font]),\n );\n const textClasses =\n (options.includeStyles ?? true)\n ? visualTextClasses(page.number, visualSpans, fontAliases)\n : undefined;\n if ((options.includeStyles ?? true) && fontsToEmit.length) {\n await write(\n `<style>${fontsToEmit.map((font) => visualFontFace(font, fontAliases)).join(\"\")}</style>`,\n );\n }\n if (textClasses?.css) await write(`<style>${textClasses.css}</style>`);\n await write(\n `<div class=\"pdf-page-content pdf-page-content--${page.rotate}\" style=\"width:${number(page.width)}pt;height:${number(page.height)}pt${rotationTransform(page)}\">`,\n );\n await write(\n `<svg class=\"pdf-visual-text\" xmlns=\"http://www.w3.org/2000/svg\" width=\"${number(page.width)}pt\" height=\"${number(page.height)}pt\" viewBox=\"0 0 ${number(page.width)} ${number(page.height)}\">`,\n );\n const clipDefinitions =\n imageClipDefinitions(\n imageOptions === \"excluded\" ? [] : (page.images ?? []),\n page.number,\n page.height,\n ) +\n vectorPathClipDefinitions(\n (page.paths ?? []).map((path, index) => ({ path, index })),\n page.number,\n );\n if (clipDefinitions) await write(`<defs>${clipDefinitions}</defs>`);\n if (reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n const source = visualImages[index];\n if (source) await write(visualImage(image, page.height, page.number, index, source));\n }\n }\n if (page.fills?.length || page.paths?.length) {\n await write(`<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">`);\n for (const fill of page.fills ?? []) await write(vectorFillSvg(fill));\n for (const [pathIndex, path] of (page.paths ?? []).entries()) {\n await write(vectorPathSvg(path, page.number, pathIndex));\n }\n await write(\"</g>\");\n }\n if (!reflectedOverlay) {\n for (const [index, image] of (page.images ?? []).entries()) {\n const source = visualImages[index];\n if (source) await write(visualImage(image, page.height, page.number, index, source));\n }\n }\n for (let spanIndex = 0; spanIndex < visualSpans.length; spanIndex += 1) {\n const span = visualSpans[spanIndex];\n if (!span) continue;\n if (!usesPositionedSpan(span)) {\n const type3 = span.fontAssetId ? type3Fonts.get(span.fontAssetId) : undefined;\n const line =\n !type3 && textClasses\n ? visualTextLine(visualSpans, spanIndex, textClasses.names, page.height, fontAliases)\n : undefined;\n if (line) {\n await write(line.html);\n spanIndex = line.endIndex;\n continue;\n }\n await write(\n type3\n ? visualType3Text(span, type3, page.height)\n : visualText(\n span,\n page.height,\n fontAliases,\n reflectedOverlay && page.rotate === 180,\n textClasses?.names,\n ),\n );\n }\n }\n await write(\"</svg>\");\n for (const span of visualSpans) {\n if (usesPositionedSpan(span)) await write(positionedSpan(span, fontAliases));\n }\n await write(\"</div></section>\");\n}\n\ninterface VisualDocumentFont {\n alias: string;\n data: Uint8Array;\n format: EmbeddedFont[\"format\"];\n}\n\ninterface VisualDocumentFonts {\n entries: VisualDocumentFont[];\n}\n\nfunction visualPageFonts(\n pageNumber: number,\n fonts: EmbeddedFont[],\n documentFonts: VisualDocumentFonts | undefined,\n): { aliases: Map<string, string>; fontsToEmit: EmbeddedFont[] } {\n const aliases = visualFontAliases(pageNumber, fonts);\n if (!documentFonts) return { aliases, fontsToEmit: fonts };\n const fontsToEmit: EmbeddedFont[] = [];\n for (const font of fonts) {\n if (!aliases.has(font.id) || font.format === \"type3\") continue;\n const existing = documentFonts.entries.find(\n (entry) => entry.format === font.format && equalBytes(entry.data, font.data),\n );\n if (existing) {\n aliases.set(font.id, existing.alias);\n continue;\n }\n const alias = `boxpdf-document-font-${documentFonts.entries.length + 1}`;\n aliases.set(font.id, alias);\n documentFonts.entries.push({ alias, data: font.data, format: font.format });\n fontsToEmit.push(font);\n }\n return { aliases, fontsToEmit };\n}\n\nfunction equalBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.length !== right.length) return false;\n return left.every((value, index) => value === right[index]);\n}\n\n/**\n * PDF producers commonly show every word with a separate text operator. Keeping\n * those operators as separate SVG elements is needlessly expensive for browsers,\n * so join only the spans whose combined geometry can still be represented by one\n * SVG textLength. Anything unusual keeps the original lossless representation.\n */\nfunction coalesceVisualSpans(spans: TextSpan[]): TextSpan[] {\n const output: TextSpan[] = [];\n for (const span of spans) {\n const previous = output.at(-1);\n if (!previous || !canCoalesceVisualSpans(previous, span)) {\n output.push(span);\n continue;\n }\n output[output.length - 1] = {\n ...previous,\n text: previous.text + span.text,\n bounds: {\n ...previous.bounds,\n width: span.bounds.x + span.bounds.width - previous.bounds.x,\n height: Math.max(previous.bounds.height, span.bounds.height),\n },\n };\n }\n return output;\n}\n\nfunction canCoalesceVisualSpans(left: TextSpan, right: TextSpan): boolean {\n if (usesPositionedSpan(left) || usesPositionedSpan(right)) return false;\n if (left.direction !== \"ltr\" || right.direction !== \"ltr\") return false;\n // Guardian fallback text sits just outside the safe whole-span width model.\n if (/guardian/i.test(left.fontFamily ?? \"\")) return false;\n if (left.glyphCodes || right.glyphCodes) return false;\n if (left.fontAssetId || right.fontAssetId) return false;\n if (!sameVisualTextState(left, right)) return false;\n const tolerance = Math.max(0.02, left.fontSize * 0.015);\n if (Math.abs(left.bounds.y - right.bounds.y) > tolerance) return false;\n const gap = right.bounds.x - (left.bounds.x + left.bounds.width);\n if (right.hasLeadingSpace) return false;\n if (gap >= -tolerance && gap <= tolerance) return true;\n return (\n right.textAdjustmentBefore !== undefined &&\n right.textAdjustmentBefore < 0 &&\n Math.abs(right.textAdjustmentBefore - gap) <= 0.001\n );\n}\n\nfunction sameVisualTextState(left: TextSpan, right: TextSpan): boolean {\n return (\n Math.abs(left.fontSize - right.fontSize) <= 0.001 &&\n left.fontName === right.fontName &&\n left.fontFamily === right.fontFamily &&\n left.fontAssetId === right.fontAssetId &&\n left.color === right.color &&\n left.fillOpacity === right.fillOpacity &&\n left.strokeColor === right.strokeColor &&\n left.strokeWidth === right.strokeWidth &&\n left.strokeOpacity === right.strokeOpacity &&\n left.renderingMode === right.renderingMode &&\n sameTransform(left.transform, right.transform)\n );\n}\n\nfunction sameTransform(left: TextSpan[\"transform\"], right: TextSpan[\"transform\"]): boolean {\n if (!left || !right) return left === right;\n return left.every((value, index) => Math.abs(value - (right[index] ?? 0)) <= 0.000_001);\n}\n\nfunction visualTextClasses(\n pageNumber: number,\n spans: TextSpan[],\n fontAliases: Map<string, string>,\n): { css: string; names: Map<string, string> } {\n const names = new Map<string, string>();\n let css = \"\";\n for (const span of spans) {\n if (usesPositionedSpan(span) || span.glyphCodes) {\n continue;\n }\n const style = visualTextClassStyle(span, fontAliases);\n if (!style || names.has(style)) continue;\n const name = `boxpdf-p${number(pageNumber)}-t${names.size + 1}`;\n names.set(style, name);\n css += `.${name}{${style}}`;\n }\n return { css, names };\n}\n\nfunction visualTextLine(\n spans: TextSpan[],\n startIndex: number,\n styleClasses: Map<string, string>,\n pageHeight: number,\n fontAliases: Map<string, string>,\n): { html: string; endIndex: number } | undefined {\n const first = spans[startIndex];\n if (!first || !canGroupVisualTextLine(first)) return undefined;\n const style = visualTextClassStyle(first, fontAliases);\n const className = styleClasses.get(style);\n if (!className) return undefined;\n let endIndex = startIndex;\n while (endIndex + 1 < spans.length) {\n const next = spans[endIndex + 1];\n if (\n !next ||\n !canGroupVisualTextLine(next) ||\n Math.abs(next.bounds.y - first.bounds.y) > 0.001 ||\n visualTextClassStyle(next, fontAliases) !== style\n ) {\n break;\n }\n endIndex += 1;\n }\n if (endIndex === startIndex) return undefined;\n const baseline = pageHeight - first.bounds.y;\n const lineSpans = spans.slice(startIndex, endIndex + 1);\n const dxRun = visualDxTextRun(lineSpans, fontAliases);\n if (dxRun) {\n return {\n html: `<text class=\"${className}\" x=\"${number(first.bounds.x)}\" y=\"${number(baseline)}\" dx=\"${dxRun.offsets.map(number).join(\" \")}\">${escapeHtml(dxRun.text)}</text>`,\n endIndex,\n };\n }\n const content = lineSpans\n .map((span, index) =>\n visualTextTspan(span, index > 0 ? textSpanGap(lineSpans[index - 1], span) : undefined),\n )\n .join(\"\");\n return {\n html: `<text class=\"${className}\" x=\"${number(first.bounds.x)}\" y=\"${number(baseline)}\">${content}</text>`,\n endIndex,\n };\n}\n\nfunction visualDxTextRun(\n spans: TextSpan[],\n fontAliases: Map<string, string>,\n): { text: string; offsets: number[] } | undefined {\n const first = spans[0];\n if (!first?.fontAssetId || !fontAliases.has(first.fontAssetId) || spans.length < 2)\n return undefined;\n let text = first.text;\n const offsets = characterOffsets(first, 0);\n for (let index = 1; index < spans.length; index += 1) {\n const previous = spans[index - 1];\n const current = spans[index];\n if (!previous || !current || current.fontAssetId !== first.fontAssetId) return undefined;\n const characters = [...current.text];\n if (characters.length === 0 || previous.naturalWidth === undefined) return undefined;\n const gap = current.bounds.x - (previous.bounds.x + previous.bounds.width);\n const trailingSpacing =\n (previous.characterSpacing ?? 0) +\n (previous.text.endsWith(\" \") ? (previous.wordSpacing ?? 0) : 0);\n offsets.push(...characterOffsets(current, gap + trailingSpacing));\n text += current.text;\n }\n while (offsets.at(-1) === 0) offsets.pop();\n return offsets.length > 0 ? { text, offsets } : undefined;\n}\n\nfunction characterOffsets(span: TextSpan, first: number): number[] {\n const characters = [...span.text];\n return characters.map((_, index) =>\n index === 0\n ? first\n : (span.characterSpacing ?? 0) +\n (characters[index - 1] === \" \" ? (span.wordSpacing ?? 0) : 0),\n );\n}\n\nfunction visualTextTspan(span: TextSpan, dx: number | undefined): string {\n const extent = span.bounds.width;\n const offset = dx === undefined || number(dx) === \"0\" ? \"\" : ` dx=\"${number(dx)}\"`;\n const length =\n extent > 0\n ? ` textLength=\"${number(extent)}\" lengthAdjust=\"${usesSpacingAdjustment(span) ? \"spacing\" : \"spacingAndGlyphs\"}\"`\n : \"\";\n return `<tspan${offset}${length}>${escapeHtml(span.text)}</tspan>`;\n}\n\nfunction textSpanGap(previous: TextSpan | undefined, current: TextSpan): number {\n if (!previous) return 0;\n const gap = current.bounds.x - (previous.bounds.x + previous.bounds.width);\n const adjustment = current.textAdjustmentBefore;\n return adjustment !== undefined && Math.abs(adjustment - gap) <= 0.001 ? adjustment : gap;\n}\n\nfunction canGroupVisualTextLine(span: TextSpan): boolean {\n return (\n !usesPositionedSpan(span) &&\n !span.glyphCodes &&\n span.direction === \"ltr\" &&\n !isHebrewPaintOrder(span) &&\n !hasNonIdentityTransform(span.transform) &&\n span.renderingMode !== 3 &&\n span.renderingMode !== 7 &&\n (span.fontAssetId !== undefined || !isAdobeCjkFont(span.fontFamily))\n );\n}\n\nfunction usesReflectedVisualOverlay(page: ExtractedPage, spans: TextSpan[]): boolean {\n return (\n Boolean(page.images?.length) &&\n Boolean(page.paths?.length || page.fills?.length) &&\n spans.length > 0 &&\n spans.every(\n (span) =>\n span.transform !== undefined &&\n Math.abs(span.transform[0] + 1) < 0.000_001 &&\n Math.abs(span.transform[1]) < 0.000_001 &&\n Math.abs(span.transform[2]) < 0.000_001 &&\n Math.abs(span.transform[3] - 1) < 0.000_001,\n )\n );\n}\n\nfunction visualImage(\n image: RasterImage,\n pageHeight: number,\n pageNumber: number,\n imageIndex: number,\n source: string,\n): string {\n const [a, b, c, d, e, f] = image.transform;\n const transform = [a, -b, -c, d, c + e, pageHeight - d - f].map(number).join(\" \");\n const opacity = isUnitInterval(image.opacity) ? ` opacity=\"${number(image.opacity)}\"` : \"\";\n let output = `<image width=\"1\" height=\"1\" preserveAspectRatio=\"none\" transform=\"matrix(${transform})\" href=\"${source}\"${opacity}/>`;\n for (let index = (image.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${imageClipId(pageNumber, imageIndex, index)})\">${output}</g>`;\n }\n return output;\n}\n\nasync function prepareVisualImages(\n page: ExtractedPage,\n imageOptions: HtmlImageOptions,\n onImage: HtmlWriterOptions[\"onImage\"],\n): Promise<string[]> {\n if (imageOptions === \"excluded\") return [];\n const sources: string[] = [];\n for (const [index, image] of (page.images ?? []).entries()) {\n const mimeType = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n if (imageOptions === \"embedded\") {\n sources.push(`data:${mimeType};base64,${base64(data)}`);\n continue;\n }\n const extension = image.format === \"jpeg\" ? \"jpg\" : \"bmp\";\n const name = `page-${page.number}-image-${index + 1}.${extension}`;\n await onImage?.({ name, mimeType, data });\n sources.push(name);\n }\n return sources;\n}\n\nfunction imageClipDefinitions(\n images: RasterImage[],\n pageNumber: number,\n pageHeight: number,\n): string {\n return images\n .flatMap((image, imageIndex) =>\n (image.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const fillRule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${imageClipId(pageNumber, imageIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\" transform=\"translate(0 ${number(pageHeight)}) scale(1 -1)\"${fillRule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nfunction imageClipId(pageNumber: number, imageIndex: number, clipIndex: number): string {\n return `boxpdf-clip-${pageNumber}-${imageIndex}-${clipIndex}`;\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output[0] = 0x42;\n output[1] = 0x4d;\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n view.setUint32(34, stride * image.height, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction rotationTransform(page: ExtractedPage): string {\n switch (page.rotate) {\n case 90:\n return `;transform:translate(${number(page.height)}pt,0) rotate(90deg)`;\n case 180:\n return `;transform:translate(${number(page.width)}pt,${number(page.height)}pt) rotate(180deg)`;\n case 270:\n return `;transform:translate(0,${number(page.width)}pt) rotate(270deg)`;\n default:\n return \"\";\n }\n}\n\nfunction positionedSpan(span: TextSpan, fontAliases: Map<string, string>): string {\n const direction = directionAttribute([span]);\n const style = [\n `left:${number(span.bounds.x)}pt`,\n `bottom:${number(span.bounds.y)}pt`,\n `width:${number(span.bounds.width)}pt`,\n `height:${number(span.bounds.height)}pt`,\n `font-size:${number(span.fontSize)}pt`,\n ...(isCssHexColor(span.color) ? [`color:${span.color}`] : []),\n ...(isUnitInterval(span.fillOpacity) ? [`opacity:${number(span.fillOpacity)}`] : []),\n ...visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ),\n ].join(\";\");\n return `<span class=\"pdf-span\"${direction} style=\"${style}\">${escapeHtml(span.text)}</span>`;\n}\n\nasync function writeFlowPage(\n page: ExtractedPage,\n write: HtmlWrite,\n options: HtmlWriterOptions,\n): Promise<void> {\n const imageOptions = resolveImageOptions(\"semantic\", options);\n const media = await prepareSemanticMedia(page, imageOptions, options.onImage);\n const structured = structurePage(withoutSemanticMediaSpans(page, media));\n const defaultColor = dominantTextColor(structured.lines);\n let mediaIndex = 0;\n const captions = clearMediaCaptionAssociations(\n media,\n structured.blocks,\n page.width,\n page.height,\n structured.lines,\n );\n const captionedMedia = new Set(captions.values());\n const emittedMedia = new Set<SemanticMedia>();\n await write(\n `<section class=\"pdf-page pdf-page--semantic pdf-page--flow\" data-page=\"${page.number}\">`,\n );\n for (const block of structured.blocks) {\n const blockY = semanticBlockY(block);\n let emittedAsCaption = false;\n while (media[mediaIndex] && emittedMedia.has(media[mediaIndex] as SemanticMedia))\n mediaIndex += 1;\n while ((media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n const item = media[mediaIndex];\n if (item && captions.get(block) === item && block.type === \"paragraph\") {\n await write(\n `<figure class=\"pdf-semantic-figure\">${item.html}<figcaption>${semanticTextHtml(block.text, block.lines, defaultColor)}</figcaption></figure>`,\n );\n emittedMedia.add(item);\n mediaIndex += 1;\n emittedAsCaption = true;\n break;\n }\n if (item && captionedMedia.has(item)) break;\n await write(`<div class=\"pdf-semantic-visual\">${item?.html}</div>`);\n mediaIndex += 1;\n }\n const associatedMedia = captions.get(block);\n if (!emittedAsCaption && associatedMedia && block.type === \"paragraph\") {\n await write(\n `<figure class=\"pdf-semantic-figure\">${associatedMedia.html}<figcaption>${semanticTextHtml(block.text, block.lines, defaultColor)}</figcaption></figure>`,\n );\n emittedMedia.add(associatedMedia);\n emittedAsCaption = true;\n }\n if (emittedAsCaption) continue;\n if (block.type === \"table\") await write(tableToHtml(block.table));\n else if (block.type === \"heading\") {\n await write(\n `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor, false)}</h${block.level}>`,\n );\n } else if (block.type === \"paragraph\") {\n await write(\n `<p${directionAttribute(block.lines.flatMap((line) => line.spans))}>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`,\n );\n } else if (block.type === \"preformatted\") {\n await write(`<pre>${escapeHtml(block.text)}</pre>`);\n } else if (block.type === \"definitionList\") {\n await write(\"<dl>\");\n for (const entry of block.entries) {\n await write(\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n );\n }\n await write(\"</dl>\");\n } else if (block.type === \"cardList\") {\n await write('<div class=\"pdf-semantic-cards\">');\n for (const item of block.items) {\n await write(`<article><h3>${escapeHtml(item.title)}</h3>`);\n for (const detail of item.details) await write(`<p>${escapeHtml(detail)}</p>`);\n await write(\"</article>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"sectionGroup\") {\n await write('<div class=\"pdf-semantic-sections\">');\n for (const item of block.items) {\n await write(`<section><h3>${escapeHtml(item.label)}</h3>`);\n for (const content of item.content) await write(`<p>${escapeHtml(content)}</p>`);\n await write(\"</section>\");\n }\n await write(\"</div>\");\n } else if (block.type === \"employment\") {\n await write(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`,\n );\n } else if (block.type === \"insetGroup\") {\n await write(\n `<div class=\"pdf-semantic-inset\" style=\"margin-inline-start:${number(block.indentEm)}em\">${block.blocks.map((item) => nestedSemanticBlockHtml(item, defaultColor)).join(\"\")}</div>`,\n );\n } else {\n const tag = block.ordered ? \"ol\" : \"ul\";\n await write(`<${tag}>`);\n for (const item of block.items) {\n await write(`<li>${semanticTextHtml(item.text, item.lines, defaultColor)}</li>`);\n }\n await write(`</${tag}>`);\n }\n }\n while (mediaIndex < media.length) {\n const item = media[mediaIndex];\n if (item && !emittedMedia.has(item)) {\n await write(`<div class=\"pdf-semantic-visual\">${item.html}</div>`);\n }\n mediaIndex += 1;\n }\n await write(\"</section>\");\n}\n\nfunction nestedSemanticBlockHtml(block: SemanticBlock, defaultColor: string): string {\n if (block.type === \"insetGroup\") {\n return `<div class=\"pdf-semantic-inset\" style=\"margin-inline-start:${number(block.indentEm)}em\">${block.blocks.map((item) => nestedSemanticBlockHtml(item, defaultColor)).join(\"\")}</div>`;\n }\n if (block.type === \"table\") return tableToHtml(block.table);\n if (block.type === \"heading\") {\n return `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor, false)}</h${block.level}>`;\n }\n if (block.type === \"paragraph\") {\n return `<p>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`;\n }\n if (block.type === \"preformatted\") return `<pre>${escapeHtml(block.text)}</pre>`;\n if (block.type === \"definitionList\") {\n return `<dl>${block.entries.map((entry) => `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`).join(\"\")}</dl>`;\n }\n if (block.type === \"cardList\") {\n return `<div class=\"pdf-semantic-cards\">${block.items.map((item) => `<article><h3>${escapeHtml(item.title)}</h3>${item.details.map((detail) => `<p>${escapeHtml(detail)}</p>`).join(\"\")}</article>`).join(\"\")}</div>`;\n }\n if (block.type === \"sectionGroup\") {\n return `<div class=\"pdf-semantic-sections\">${block.items.map((item) => `<section><h3>${escapeHtml(item.label)}</h3>${item.content.map((content) => `<p>${escapeHtml(content)}</p>`).join(\"\")}</section>`).join(\"\")}</div>`;\n }\n if (block.type === \"employment\") {\n return `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`;\n }\n const tag = block.ordered ? \"ol\" : \"ul\";\n return `<${tag}>${block.items.map((item) => `<li>${semanticTextHtml(item.text, item.lines, defaultColor)}</li>`).join(\"\")}</${tag}>`;\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction visualText(\n span: TextSpan,\n pageHeight: number,\n fontAliases: Map<string, string>,\n counterRotateReflectedText = false,\n styleClasses?: Map<string, string>,\n): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n if (!span.fontAssetId && isAdobeCjkFont(span.fontFamily)) return \"\";\n const direction = directionAttribute([span]);\n const style = visualTextStyle(span, fontAliases);\n const styleClass = styleClasses?.get(visualTextClassStyle(span, fontAliases));\n const presentation = styleClass ? ` class=\"${styleClass}\"` : style ? ` style=\"${style}\"` : \"\";\n const fontSize = styleClass ? \"\" : ` font-size=\"${number(span.fontSize)}\"`;\n const textExtent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const textLength =\n textExtent > 0 && !isHebrewPaintOrder(span)\n ? ` textLength=\"${number(textExtent)}\" lengthAdjust=\"${span.direction === \"ttb\" || usesSpacingAdjustment(span) ? \"spacing\" : \"spacingAndGlyphs\"}\"`\n : \"\";\n const transform =\n counterRotateReflectedText && span.transform\n ? ([\n span.transform[0],\n span.transform[1],\n span.transform[2],\n -span.transform[3],\n ] as TextSpan[\"transform\"])\n : span.transform;\n const transformed = hasNonIdentityTransform(transform);\n const rtlOffset = span.direction === \"rtl\" ? span.bounds.width : 0;\n const basisX = transform?.[0] ?? 1;\n const basisY = transform?.[1] ?? 0;\n const anchorX = span.bounds.x + basisX * rtlOffset;\n const anchorY = pageHeight - span.bounds.y + basisY * rtlOffset;\n const position = transformed\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform?.map(number).join(\" \")} ${number(anchorX)} ${number(anchorY)})\"`\n : ` x=\"${number(anchorX)}\" y=\"${number(anchorY)}\"`;\n return `<text${direction}${position}${fontSize}${textLength}${presentation}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction visualTextClassStyle(span: TextSpan, fontAliases: Map<string, string>): string {\n const style = visualTextStyle(span, fontAliases);\n const fontSize = `font-size:${number(span.fontSize)}px`;\n return style ? `${style};${fontSize}` : fontSize;\n}\n\nfunction visualTextStyle(span: TextSpan, fontAliases: Map<string, string>): string {\n const font = visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? fontAliases.get(span.fontAssetId) : undefined,\n ).join(\";\");\n const stroke = isCssHexColor(span.strokeColor) ? `stroke:${span.strokeColor}` : \"\";\n const strokeWidth =\n stroke && Number.isFinite(span.strokeWidth) && (span.strokeWidth ?? -1) >= 0\n ? `stroke-width:${number(span.strokeWidth ?? 0)}`\n : \"\";\n const strokeOnly = span.renderingMode === 1 || span.renderingMode === 5;\n const fillOpacity = isUnitInterval(span.fillOpacity)\n ? `fill-opacity:${number(span.fillOpacity)}`\n : \"\";\n const strokeOpacity = isUnitInterval(span.strokeOpacity)\n ? `stroke-opacity:${number(span.strokeOpacity)}`\n : \"\";\n return [\n isHebrewPaintOrder(span) ? \"unicode-bidi:bidi-override;direction:ltr\" : \"\",\n span.direction === \"ttb\" ? \"writing-mode:vertical-rl\" : \"\",\n strokeOnly ? \"fill:none\" : isCssHexColor(span.color) ? `fill:${span.color}` : \"\",\n stroke,\n strokeWidth,\n fillOpacity,\n strokeOpacity,\n font,\n ]\n .filter(Boolean)\n .join(\";\");\n}\n\nfunction isAdobeCjkFont(fontFamily: string | undefined): boolean {\n return /^Adobe(?:Heiti|Song|Kaiti|Ming|Gothic|Mincho)Std-/i.test(fontFamily ?? \"\");\n}\n\nfunction visualType3Text(span: TextSpan, font: EmbeddedType3Font, pageHeight: number): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const glyphs = new Map(font.glyphs.map((glyph) => [glyph.code, glyph]));\n const sequence = (span.glyphCodes ?? []).map((code) => glyphs.get(code));\n const totalAdvance = sequence.reduce((total, glyph) => total + (glyph?.advance ?? 0), 0);\n if (totalAdvance <= 0 || span.bounds.width <= 0 || span.fontSize <= 0) return \"\";\n const transform = span.transform ?? [1, 0, 0, 1];\n const outer = `matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(pageHeight - span.bounds.y)})`;\n const xScale = span.bounds.width / totalAdvance;\n let offset = 0;\n let content = \"\";\n for (const glyph of sequence) {\n if (!glyph) continue;\n content += `<g transform=\"translate(${number(offset)} 0)\">${type3Glyph(glyph, span.color)}</g>`;\n offset += glyph.advance;\n }\n return `<g transform=\"${outer}\"><g transform=\"scale(${number(xScale)} ${number(-span.fontSize)})\">${content}</g></g>`;\n}\n\nfunction isHebrewPaintOrder(span: TextSpan): boolean {\n return span.direction === \"ltr\" && /[\\u0590-\\u05ff]/u.test(span.text);\n}\n\nfunction usesSpacingAdjustment(span: TextSpan): boolean {\n return !span.fontAssetId && /arial/i.test(span.fontFamily ?? \"\");\n}\n\nfunction type3Glyph(glyph: Type3Glyph, textColor?: string): string {\n let output = \"\";\n for (const fill of glyph.fills ?? []) {\n const color = glyph.usesTextColor && isCssHexColor(textColor) ? textColor : fill.color;\n if (!isCssHexColor(color)) continue;\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n output += `<polygon points=\"${points}\" fill=\"${color}\"${opacity}/>`;\n }\n for (const path of glyph.paths ?? []) {\n if (!isSvgPath(path.d)) continue;\n const fill =\n glyph.usesTextColor && isCssHexColor(textColor)\n ? textColor\n : isCssHexColor(path.fill)\n ? path.fill\n : \"none\";\n const stroke =\n glyph.usesTextColor && isCssHexColor(textColor) && path.stroke\n ? textColor\n : isCssHexColor(path.stroke)\n ? path.stroke\n : \"none\";\n const width =\n path.strokeWidth !== undefined && Number.isFinite(path.strokeWidth) && path.strokeWidth >= 0\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n output += `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}/>`;\n }\n return (glyph.fills?.length ?? 0) > 64 && glyph.advance > 2\n ? `<g shape-rendering=\"crispEdges\">${output}</g>`\n : output;\n}\n\nfunction isCssHexColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction isUnitInterval(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0 && (value ?? 2) <= 1;\n}\n\nfunction isMonospace(fontFamily: string | undefined): boolean {\n return /courier|mono/i.test(fontFamily ?? \"\");\n}\n\nfunction usesPositionedSpan(span: TextSpan): boolean {\n return (\n !span.glyphCodes && isMonospace(span.fontFamily) && !hasNonIdentityTransform(span.transform)\n );\n}\n\nfunction hasNonIdentityTransform(transform: TextSpan[\"transform\"]): boolean {\n if (!transform) return false;\n const identity: [number, number, number, number] = [1, 0, 0, 1];\n return transform.some((value, index) => Math.abs(value - (identity[index] ?? 0)) > 0.000_001);\n}\n\nfunction directionAttribute(spans: TextSpan[]): string {\n const rtl = spans.filter((span) => span.direction === \"rtl\").length;\n const vertical = spans.filter((span) => span.direction === \"ttb\").length;\n if (vertical > rtl && vertical * 2 >= spans.length) return ' data-direction=\"ttb\"';\n return rtl * 2 >= spans.length && spans.length > 0 ? ' dir=\"rtl\"' : \"\";\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1000) / 1000) : \"0\";\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHtml(value).replaceAll(\"`\", \"&#96;\");\n}\n\nfunction escapeHtml(value: string): string {\n return [...value]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint === 13) return \"\\n\";\n return isForbiddenControl(codePoint) ? \"�\" : character;\n })\n .join(\"\")\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction isForbiddenControl(codePoint: number): boolean {\n return (\n codePoint <= 8 ||\n codePoint === 11 ||\n codePoint === 12 ||\n (codePoint >= 14 && codePoint <= 31) ||\n codePoint === 127\n );\n}\n\nfunction resolveProfile(options: HtmlWriterOptions): HtmlProfile {\n const legacyProfile = options.layout === \"flow\" ? \"semantic\" : \"visual\";\n if (options.profile && options.layout && options.profile !== legacyProfile) {\n throw new Error(\n `conflicting HTML output options: profile \"${options.profile}\" does not match layout \"${options.layout}\"`,\n );\n }\n return options.profile ?? legacyProfile;\n}\n\nfunction resolveImageOptions(profile: HtmlProfile, options: HtmlWriterOptions): HtmlImageOptions {\n return options.imageOptions ?? (profile === \"semantic\" ? \"excluded\" : \"embedded\");\n}\n\nfunction validateImageOptions(\n imageOptions: HtmlImageOptions,\n options: Pick<HtmlWriterOptions, \"onImage\">,\n): void {\n if (imageOptions === \"references\" && !options.onImage) {\n throw new Error('imageOptions \"references\" requires an onImage callback');\n }\n}\n","import type { Rect } from \"@boxpdf/reader\";\nimport type { SemanticBlock, TextLine } from \"@boxpdf/reader/structure\";\nimport type { SemanticMedia } from \"./semantic-media.js\";\n\nexport interface MediaCaptionEvidence {\n score: number;\n side: \"above\" | \"below\";\n gapRatio: number;\n horizontalOverlap: number;\n centerAlignment: number;\n relativeWidth: number;\n fontContrast: number;\n surroundingWhitespace: number;\n interveningContent: number;\n repeatedAlignment: number;\n}\n\ninterface CaptionCandidate {\n block: Extract<SemanticBlock, { type: \"paragraph\" }>;\n bounds: Rect;\n lineHeight: number;\n font: string;\n}\n\ninterface CaptionEdge {\n media: SemanticMedia;\n candidate: CaptionCandidate;\n evidence: MediaCaptionEvidence;\n}\n\nconst minimumCaptionScore = 0.72;\n\nexport function mediaCaptionEvidence(\n media: SemanticMedia,\n block: SemanticBlock,\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n): MediaCaptionEvidence | undefined {\n const candidate = captionCandidate(block);\n return candidate\n ? scoreCaption(media, candidate, pageWidth, pageHeight, pageLines, 0)\n : undefined;\n}\n\nexport function isClearMediaCaption(\n media: SemanticMedia,\n block: SemanticBlock,\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n): block is Extract<SemanticBlock, { type: \"paragraph\" }> {\n return (\n (mediaCaptionEvidence(media, block, pageWidth, pageHeight, pageLines)?.score ?? 0) >=\n minimumCaptionScore\n );\n}\n\nexport function clearMediaCaptionAssociations(\n media: SemanticMedia[],\n blocks: SemanticBlock[],\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n): Map<SemanticBlock, SemanticMedia> {\n const candidates = blocks.flatMap((block) => {\n const candidate = captionCandidate(block);\n return candidate ? [candidate] : [];\n });\n const preliminary = media.flatMap((item) =>\n candidates.flatMap((candidate) => {\n const evidence = scoreCaption(item, candidate, pageWidth, pageHeight, pageLines, 0);\n return evidence ? [{ media: item, candidate, evidence }] : [];\n }),\n );\n const patterns = repeatedPatterns(preliminary);\n const edges = preliminary\n .map((edge) => {\n const evidence = scoreCaption(\n edge.media,\n edge.candidate,\n pageWidth,\n pageHeight,\n pageLines,\n patterns.get(patternKey(edge)) ?? 0,\n );\n return evidence ? { ...edge, evidence } : undefined;\n })\n .filter((edge): edge is CaptionEdge => Boolean(edge))\n .filter((edge) => edge.evidence.score >= minimumCaptionScore);\n const bestForMedia = bestEdges(edges, (edge) => edge.media);\n const bestForCaption = bestEdges(edges, (edge) => edge.candidate.block);\n const associations = new Map<SemanticBlock, SemanticMedia>();\n for (const edge of edges) {\n if (\n bestForMedia.get(edge.media) === edge &&\n bestForCaption.get(edge.candidate.block) === edge\n ) {\n associations.set(edge.candidate.block, edge.media);\n }\n }\n return associations;\n}\n\nfunction scoreCaption(\n media: SemanticMedia,\n candidate: CaptionCandidate,\n pageWidth: number,\n pageHeight: number,\n pageLines: TextLine[],\n repeatedAlignment: number,\n): MediaCaptionEvidence | undefined {\n if (!insidePage(media.bounds, pageWidth, pageHeight)) return undefined;\n if (media.bounds.width < pageWidth * 0.06 || media.bounds.height < candidate.lineHeight * 1.5)\n return undefined;\n const relation = verticalRelation(media.bounds, candidate.bounds);\n if (!relation) return undefined;\n const maximumGap = Math.max(candidate.lineHeight * 3, pageHeight * 0.035);\n if (relation.gap > maximumGap) return undefined;\n const overlapWidth = overlap(\n media.bounds.x,\n media.bounds.width,\n candidate.bounds.x,\n candidate.bounds.width,\n );\n const horizontalOverlap =\n overlapWidth / Math.max(1, Math.min(media.bounds.width, candidate.bounds.width));\n const centerDistance = Math.abs(center(media.bounds) - center(candidate.bounds));\n const centerAlignment = clamp01(\n 1 - centerDistance / Math.max(media.bounds.width, candidate.bounds.width),\n );\n if (horizontalOverlap < 0.45 && centerAlignment < 0.82) return undefined;\n const relativeWidth =\n Math.min(media.bounds.width, candidate.bounds.width) /\n Math.max(media.bounds.width, candidate.bounds.width);\n const gapRatio = clamp01(1 - relation.gap / maximumGap);\n const interveningContent = interveningScore(media.bounds, candidate, relation.side, pageLines);\n if (interveningContent === 0) return undefined;\n if (relation.side === \"above\" && (gapRatio < 0.6 || interveningContent < 1)) return undefined;\n const fontContrast = captionFontContrast(candidate, pageLines);\n const surroundingWhitespace = whitespaceScore(candidate, relation.side, relation.gap, pageLines);\n const score =\n gapRatio * 0.22 +\n horizontalOverlap * 0.17 +\n centerAlignment * 0.13 +\n relativeWidth * 0.09 +\n fontContrast * 0.13 +\n surroundingWhitespace * 0.09 +\n interveningContent * 0.09 +\n repeatedAlignment * 0.08;\n return {\n score,\n side: relation.side,\n gapRatio,\n horizontalOverlap,\n centerAlignment,\n relativeWidth,\n fontContrast,\n surroundingWhitespace,\n interveningContent,\n repeatedAlignment,\n };\n}\n\nfunction captionCandidate(block: SemanticBlock): CaptionCandidate | undefined {\n if (block.type !== \"paragraph\" || block.lines.length === 0) return undefined;\n const first = block.lines.flatMap((line) => line.spans).find((span) => /\\S/u.test(span.text));\n if (!first) return undefined;\n return {\n block,\n bounds: unionLines(block.lines),\n lineHeight: median(block.lines.map((line) => line.bounds.height)),\n font: fontSignature(first),\n };\n}\n\nfunction verticalRelation(\n media: Rect,\n caption: Rect,\n): { side: \"above\" | \"below\"; gap: number } | undefined {\n const belowGap = media.y - (caption.y + caption.height);\n if (belowGap >= -caption.height * 0.15) return { side: \"below\", gap: Math.max(0, belowGap) };\n const aboveGap = caption.y - (media.y + media.height);\n if (aboveGap >= -caption.height * 0.15) return { side: \"above\", gap: Math.max(0, aboveGap) };\n return undefined;\n}\n\nfunction interveningScore(\n media: Rect,\n candidate: CaptionCandidate,\n side: \"above\" | \"below\",\n pageLines: TextLine[],\n): number {\n const lower =\n side === \"below\" ? candidate.bounds.y + candidate.bounds.height : media.y + media.height;\n const upper = side === \"below\" ? media.y : candidate.bounds.y;\n const blockers = pageLines.filter(\n (line) =>\n !candidate.block.lines.includes(line) &&\n line.bounds.y < upper &&\n line.bounds.y + line.bounds.height > lower &&\n overlap(line.bounds.x, line.bounds.width, media.x, media.width) /\n Math.max(1, Math.min(line.bounds.width, media.width)) >=\n 0.25,\n );\n return blockers.length === 0 ? 1 : blockers.length === 1 ? 0.35 : 0;\n}\n\nfunction captionFontContrast(candidate: CaptionCandidate, pageLines: TextLine[]): number {\n const otherLines = pageLines.filter((line) => !candidate.block.lines.includes(line));\n if (candidate.font !== dominantFontSignature(otherLines)) return 1;\n const candidateSize = median(\n candidate.block.lines.flatMap((line) => line.spans.map((span) => span.fontSize)),\n );\n const bodySize = median(otherLines.flatMap((line) => line.spans.map((span) => span.fontSize)));\n return Math.abs(candidateSize - bodySize) >= 0.75 ? 0.65 : 0.15;\n}\n\nfunction whitespaceScore(\n candidate: CaptionCandidate,\n side: \"above\" | \"below\",\n mediaGap: number,\n pageLines: TextLine[],\n): number {\n const awayGaps = pageLines\n .filter((line) => !candidate.block.lines.includes(line))\n .filter(\n (line) =>\n overlap(line.bounds.x, line.bounds.width, candidate.bounds.x, candidate.bounds.width) > 0,\n )\n .flatMap((line) => {\n if (side === \"below\" && line.bounds.y + line.bounds.height <= candidate.bounds.y)\n return [candidate.bounds.y - line.bounds.y - line.bounds.height];\n if (side === \"above\" && line.bounds.y >= candidate.bounds.y + candidate.bounds.height)\n return [line.bounds.y - candidate.bounds.y - candidate.bounds.height];\n return [];\n });\n const awayGap = Math.min(...awayGaps, Number.POSITIVE_INFINITY);\n return Number.isFinite(awayGap)\n ? clamp01((awayGap + candidate.lineHeight * 0.25) / (mediaGap + candidate.lineHeight))\n : 1;\n}\n\nfunction repeatedPatterns(edges: CaptionEdge[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const edge of edges.filter((item) => item.evidence.score >= minimumCaptionScore - 0.08)) {\n counts.set(patternKey(edge), (counts.get(patternKey(edge)) ?? 0) + 1);\n }\n return new Map([...counts].map(([key, count]) => [key, count >= 2 ? 1 : 0]));\n}\n\nfunction patternKey(edge: CaptionEdge): string {\n const widthRatio = edge.candidate.bounds.width / Math.max(1, edge.media.bounds.width);\n return `${edge.candidate.font}|${edge.evidence.side}|${Math.round(widthRatio * 4) / 4}`;\n}\n\nfunction bestEdges<K>(edges: CaptionEdge[], key: (edge: CaptionEdge) => K): Map<K, CaptionEdge> {\n const output = new Map<K, CaptionEdge>();\n for (const edge of edges) {\n const existing = output.get(key(edge));\n if (!existing || edge.evidence.score > existing.evidence.score) output.set(key(edge), edge);\n }\n return output;\n}\n\nfunction insidePage(bounds: Rect, pageWidth: number, pageHeight: number): boolean {\n return (\n bounds.x >= -2 &&\n bounds.y >= -2 &&\n bounds.x + bounds.width <= pageWidth + 2 &&\n bounds.y + bounds.height <= pageHeight + 2\n );\n}\n\nfunction unionLines(lines: TextLine[]): Rect {\n const x = Math.min(...lines.map((line) => line.bounds.x));\n const y = Math.min(...lines.map((line) => line.bounds.y));\n const right = Math.max(...lines.map((line) => line.bounds.x + line.bounds.width));\n const top = Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n return { x, y, width: right - x, height: top - y };\n}\n\nfunction dominantFontSignature(lines: TextLine[]): string {\n const counts = new Map<string, number>();\n for (const span of lines.flatMap((line) => line.spans)) {\n const signature = fontSignature(span);\n counts.set(signature, (counts.get(signature) ?? 0) + Math.max(1, [...span.text].length));\n }\n return [...counts].sort((left, right) => right[1] - left[1])[0]?.[0] ?? \"\";\n}\n\nfunction fontSignature(span: TextLine[\"spans\"][number]): string {\n return `${(span.fontFamily ?? span.fontName ?? \"\").toLocaleLowerCase(\"en\")}|${Math.round(span.fontSize * 2) / 2}|${span.color ?? \"\"}`;\n}\n\nfunction center(bounds: Rect): number {\n return bounds.x + bounds.width / 2;\n}\nfunction overlap(left: number, leftSize: number, right: number, rightSize: number): number {\n return Math.max(0, Math.min(left + leftSize, right + rightSize) - Math.max(left, right));\n}\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\nfunction median(values: number[]): number {\n const ordered = [...values].sort((left, right) => left - right);\n return ordered[Math.floor(ordered.length / 2)] ?? 1;\n}\n","import type { ExtractedPage } from \"@boxpdf/reader\";\nimport {\n type SemanticBlock,\n type StructuredPage,\n structurePage,\n type Table,\n tableToRows,\n} from \"@boxpdf/reader/structure\";\nimport { clearMediaCaptionAssociations } from \"./semantic-caption.js\";\nimport { dominantTextColor, semanticTextHtml, semanticTextMarkdown } from \"./semantic-inline.js\";\nimport {\n type HtmlImageAsset,\n type HtmlImageOptions,\n prepareSemanticMedia,\n type SemanticMedia,\n withoutSemanticMediaSpans,\n} from \"./semantic-media.js\";\n\nexport interface SemanticDocumentStats {\n pagesProcessed: number;\n peakBufferedPages: number;\n peakBufferedLines: number;\n mergedTables: number;\n suppressedFurniture: number;\n}\n\nexport type SemanticDocumentFormat = \"html\" | \"markdown\";\n\ninterface BufferedPage {\n width: number;\n height: number;\n structured: StructuredPage;\n media: SemanticMedia[];\n}\n\ninterface ActiveTable {\n table: Table;\n header: string[] | undefined;\n}\n\nexport async function writeSemanticDocument(\n pages: AsyncIterable<ExtractedPage> | Iterable<ExtractedPage>,\n write: (chunk: string) => void | Promise<void>,\n lookaheadPages: number,\n imageOptions: HtmlImageOptions,\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>,\n format: SemanticDocumentFormat = \"html\",\n): Promise<SemanticDocumentStats> {\n const stats: SemanticDocumentStats = {\n pagesProcessed: 0,\n peakBufferedPages: 0,\n peakBufferedLines: 0,\n mergedTables: 0,\n suppressedFurniture: 0,\n };\n const buffer: BufferedPage[] = [];\n const seenFurniture = new Set<string>();\n const sectionLevels: number[] = [];\n let activeTable: ActiveTable | undefined;\n const pendingMedia: string[] = [];\n let headerOpen = false;\n let headerHasParagraph = false;\n let contentStarted = false;\n let employmentOpen = false;\n let pendingParagraph:\n | {\n block: Extract<SemanticBlock, { type: \"paragraph\" }>;\n height: number;\n defaultColor: string;\n }\n | undefined;\n const markdown = format === \"markdown\";\n const output = (html: string, markdownValue = \"\") => write(markdown ? markdownValue : html);\n const inlineText = (\n text: string,\n lines: Parameters<typeof semanticTextHtml>[1],\n defaultColor: string,\n preserveWeight = true,\n ) =>\n markdown\n ? semanticTextMarkdown(text, lines, defaultColor, preserveWeight)\n : semanticTextHtml(text, lines, defaultColor, preserveWeight);\n await output('<article class=\"pdf-semantic-document\">');\n\n const closeTable = async () => {\n if (!activeTable) return;\n await output(\"</table>\", \"\\n\");\n activeTable = undefined;\n while (pendingMedia.length > 0) await write(pendingMedia.shift() ?? \"\");\n };\n\n const closeSections = async (minimumLevel = 0) => {\n while ((sectionLevels.at(-1) ?? -1) >= minimumLevel && sectionLevels.length > 0) {\n await output(\"</section>\");\n sectionLevels.pop();\n }\n };\n\n const flushPendingParagraph = async () => {\n if (!pendingParagraph) return;\n await write(semanticBlockOutput(pendingParagraph.block, pendingParagraph.defaultColor, format));\n pendingParagraph = undefined;\n };\n\n const closeEmployment = async () => {\n if (!employmentOpen) return;\n await output(\"</section>\");\n employmentOpen = false;\n };\n\n const emitPage = async (page: BufferedPage, future: BufferedPage[]) => {\n const defaultColor = dominantTextColor(page.structured.lines);\n let mediaIndex = 0;\n const captions = clearMediaCaptionAssociations(\n page.media,\n page.structured.blocks,\n page.width,\n page.height,\n page.structured.lines,\n );\n const captionedMedia = new Set(captions.values());\n const emittedMedia = new Set<SemanticMedia>();\n const futureFurniture = new Set(future.flatMap((candidate) => marginSignatures(candidate)));\n const repeatedFurniture = new Set([...seenFurniture, ...futureFurniture]);\n for (const [blockIndex, block] of page.structured.blocks.entries()) {\n const nextBlock = page.structured.blocks[blockIndex + 1];\n const blockY = semanticBlockY(block);\n let emittedAsCaption = false;\n while (page.media[mediaIndex] && emittedMedia.has(page.media[mediaIndex] as SemanticMedia)) {\n mediaIndex += 1;\n }\n while ((page.media[mediaIndex]?.bounds.y ?? -Infinity) >= blockY) {\n await flushPendingParagraph();\n const item = page.media[mediaIndex];\n if (item && captions.get(block) === item && block.type === \"paragraph\") {\n const html = markdown\n ? `${item.markdown}\\n\\n*${inlineText(block.text, block.lines, defaultColor)}*\\n\\n`\n : `<figure class=\"pdf-semantic-figure\">${item.html}<figcaption>${inlineText(block.text, block.lines, defaultColor)}</figcaption></figure>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n emittedMedia.add(item);\n mediaIndex += 1;\n emittedAsCaption = true;\n break;\n }\n if (item && captionedMedia.has(item)) break;\n const html = markdown\n ? `${item?.markdown ?? \"\"}\\n\\n`\n : `<div class=\"pdf-semantic-visual\">${item?.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n mediaIndex += 1;\n }\n const associatedMedia = captions.get(block);\n if (!emittedAsCaption && associatedMedia && block.type === \"paragraph\") {\n await flushPendingParagraph();\n const html = markdown\n ? `${associatedMedia.markdown}\\n\\n*${inlineText(block.text, block.lines, defaultColor)}*\\n\\n`\n : `<figure class=\"pdf-semantic-figure\">${associatedMedia.html}<figcaption>${inlineText(block.text, block.lines, defaultColor)}</figcaption></figure>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n emittedMedia.add(associatedMedia);\n emittedAsCaption = true;\n }\n if (emittedAsCaption) continue;\n if (isRepeatedFurniture(block, page, repeatedFurniture)) {\n stats.suppressedFurniture += 1;\n continue;\n }\n await flushPendingParagraph();\n if (employmentOpen && block.type !== \"list\") await closeEmployment();\n if (!contentStarted && !headerOpen && block.type === \"heading\" && block.level === 1) {\n await output(\n `<header><h1>${inlineText(block.text, block.lines, defaultColor, false)}</h1>`,\n `# ${inlineText(block.text, block.lines, defaultColor, false)}\\n\\n`,\n );\n headerOpen = true;\n continue;\n }\n if (headerOpen) {\n if (block.type === \"paragraph\") {\n const tag = isContactBlock(block) ? \"address\" : \"p\";\n await output(\n `<${tag}>${inlineText(block.text, block.lines, defaultColor)}</${tag}>`,\n `${inlineText(block.text, block.lines, defaultColor)}\\n\\n`,\n );\n headerHasParagraph = true;\n continue;\n }\n if (\n block.type === \"heading\" &&\n !headerHasParagraph &&\n (block.level === 1 ||\n block.text.trimStart().startsWith(\"#\") ||\n (block.level === 4 && nextBlock?.type === \"paragraph\" && isContactBlock(nextBlock)))\n ) {\n await output(\n `<h${block.level}>${inlineText(block.text, block.lines, defaultColor, false)}</h${block.level}>`,\n `${\"#\".repeat(block.level)} ${inlineText(block.text, block.lines, defaultColor, false)}\\n\\n`,\n );\n continue;\n }\n await output(\"</header>\");\n headerOpen = false;\n contentStarted = true;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n if (activeTable && tablesContinue(activeTable.table, block.table, page.width)) {\n const continuationRows = sameRow(activeTable.header, rows[0]) ? rows.slice(1) : rows;\n for (const row of continuationRows)\n await write(markdown ? markdownTableRow(row) : tableRow(row, false));\n activeTable.table = block.table;\n stats.mergedTables += 1;\n continue;\n }\n await closeTable();\n const header = tableHeader(rows);\n await output(\"<table>\", markdownTableStart(rows, header));\n const markdownRows = markdown ? (header ? rows.slice(1) : rows) : rows;\n for (const [index, row] of markdownRows.entries())\n await write(\n markdown ? markdownTableRow(row) : tableRow(row, Boolean(header && index === 0)),\n );\n activeTable = { table: block.table, header };\n continue;\n }\n if (activeTable && block.type === \"definitionList\" && isFinancialSummary(block)) {\n const columns = activeTable.table.columns.length;\n await output(\n `<tfoot>${block.entries.map((entry) => financialSummaryRow(entry, columns)).join(\"\")}</tfoot>`,\n block.entries\n .map((entry) =>\n markdownTableRow([\n entry.term,\n ...Array(Math.max(0, columns - 2)).fill(\"\"),\n entry.description,\n ]),\n )\n .join(\"\"),\n );\n await closeTable();\n continue;\n }\n await closeTable();\n if (block.type === \"heading\") {\n const level = contentStarted && block.level === 1 ? 2 : block.level;\n await closeSections(level);\n await output(\n `<section data-level=\"${level}\"><h${level}>${inlineText(block.text, block.lines, defaultColor, false)}</h${level}>`,\n `${\"#\".repeat(level)} ${inlineText(block.text, block.lines, defaultColor, false)}\\n\\n`,\n );\n sectionLevels.push(level);\n continue;\n }\n if (block.type === \"paragraph\") {\n if (isTitledRecord(block)) {\n const [institution, ...details] = block.lines;\n if (institution)\n await output(\n `<h3>${escapeHtml(institution.text)}</h3>`,\n `### ${escapeMarkdown(institution.text)}\\n\\n`,\n );\n for (const detail of details)\n await output(`<p>${escapeHtml(detail.text)}</p>`, `${escapeMarkdown(detail.text)}\\n\\n`);\n continue;\n }\n if (isUnmarkedList(block)) {\n await output(\n `<ul>${block.lines.map((line) => `<li>${escapeHtml(line.text)}</li>`).join(\"\")}</ul>`,\n `${block.lines.map((line) => `- ${escapeMarkdown(line.text)}`).join(\"\\n\")}\\n\\n`,\n );\n continue;\n }\n pendingParagraph = { block, height: page.height, defaultColor };\n continue;\n }\n if (block.type === \"employment\") {\n await output(\n `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p>`,\n `### ${escapeMarkdown(block.role)}\\n\\n${escapeMarkdown(block.organization)}\\n\\n${escapeMarkdown(block.date)}\\n\\n`,\n );\n employmentOpen = true;\n continue;\n }\n await write(semanticBlockOutput(block, defaultColor, format));\n }\n while (mediaIndex < page.media.length) {\n const item = page.media[mediaIndex];\n if (item && !emittedMedia.has(item)) {\n await flushPendingParagraph();\n const html = markdown\n ? `${item.markdown}\\n\\n`\n : `<div class=\"pdf-semantic-visual\">${item.html}</div>`;\n if (activeTable) pendingMedia.push(html);\n else await write(html);\n }\n mediaIndex += 1;\n }\n for (const signature of marginSignatures(page)) seenFurniture.add(signature);\n };\n\n for await (const page of pages) {\n const media = await prepareSemanticMedia(page, imageOptions, onImage);\n const structured = structurePage(withoutSemanticMediaSpans(page, media));\n buffer.push({ width: page.width, height: page.height, structured, media });\n restoreObservedHyphens(buffer);\n stats.pagesProcessed += 1;\n stats.peakBufferedPages = Math.max(stats.peakBufferedPages, buffer.length);\n stats.peakBufferedLines = Math.max(\n stats.peakBufferedLines,\n buffer.reduce((total, item) => total + item.structured.lines.length, 0),\n );\n if (buffer.length >= lookaheadPages) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n }\n while (buffer.length > 0) {\n const ready = buffer.shift();\n if (ready) await emitPage(ready, buffer);\n }\n if (headerOpen) await output(\"</header>\");\n await closeTable();\n await closeEmployment();\n if (pendingParagraph && isFooterParagraph(pendingParagraph.block, pendingParagraph.height)) {\n await closeSections();\n await output(\n `<footer>${semanticBlockHtml(pendingParagraph.block, pendingParagraph.defaultColor)}</footer>`,\n `---\\n\\n${semanticBlockMarkdown(pendingParagraph.block, pendingParagraph.defaultColor)}`,\n );\n pendingParagraph = undefined;\n } else {\n await flushPendingParagraph();\n await closeSections();\n }\n await output(\"</article>\");\n return stats;\n}\n\nfunction restoreObservedHyphens(buffer: BufferedPage[]): void {\n const terms = new Set(\n buffer.flatMap((page) =>\n page.structured.lines.flatMap(\n (line) => line.text.match(/[\\p{L}\\p{N}]+(?:[-‐‑][\\p{L}\\p{N}]+)+/gu) ?? [],\n ),\n ),\n );\n for (const page of buffer) {\n for (const block of page.structured.blocks) restoreBlockHyphens(block, terms);\n }\n}\n\nfunction restoreBlockHyphens(block: SemanticBlock, terms: Set<string>): void {\n const restore = (value: string) => restoreTextHyphens(value, terms);\n if (block.type === \"insetGroup\") {\n for (const nested of block.blocks) restoreBlockHyphens(nested, terms);\n } else if (\n block.type === \"heading\" ||\n block.type === \"paragraph\" ||\n block.type === \"preformatted\"\n ) {\n block.text = restore(block.text);\n } else if (block.type === \"list\") {\n for (const item of block.items) item.text = restore(item.text);\n } else if (block.type === \"definitionList\") {\n for (const entry of block.entries) {\n entry.term = restore(entry.term);\n entry.description = restore(entry.description);\n }\n } else if (block.type === \"cardList\") {\n for (const item of block.items) {\n item.title = restore(item.title);\n item.details = item.details.map(restore);\n }\n } else if (block.type === \"sectionGroup\") {\n for (const item of block.items) {\n item.label = restore(item.label);\n item.content = item.content.map(restore);\n }\n } else if (block.type === \"employment\") {\n block.role = restore(block.role);\n block.organization = restore(block.organization);\n block.date = restore(block.date);\n }\n}\n\nfunction restoreTextHyphens(value: string, terms: Set<string>): string {\n let output = value;\n for (const term of terms) {\n const collapsed = term.replace(/[-‐‑]/gu, \"\");\n if (collapsed === term || !output.includes(collapsed)) continue;\n const pattern = new RegExp(\n `(?<![\\\\p{L}\\\\p{N}])${escapeRegularExpression(collapsed)}(?![\\\\p{L}\\\\p{N}])`,\n \"gu\",\n );\n output = output.replace(pattern, term);\n }\n return output;\n}\n\nfunction escapeRegularExpression(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction isContactBlock(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n const text = block.text;\n const signals = [\n /@/.test(text),\n /\\+?\\d[\\d().\\s-]{7,}/.test(text),\n /\\bhttps?:\\/\\//i.test(text),\n /\\b\\w+\\.\\w{2,}\\b/i.test(text),\n ];\n return signals.filter(Boolean).length >= 2;\n}\n\nfunction isTitledRecord(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 2) return false;\n const [first, ...rest] = block.lines;\n if (!first || rest.length === 0) return false;\n const firstSize = Math.max(...first.spans.map((span) => span.fontSize));\n const restSize = Math.max(...rest.flatMap((line) => line.spans.map((span) => span.fontSize)));\n const emphasized = first.spans.some((span) =>\n /(?:bold|semibold|demi)/i.test(span.fontFamily ?? \"\"),\n );\n return emphasized || firstSize >= restSize * 1.08;\n}\n\nfunction isUnmarkedList(block: Extract<SemanticBlock, { type: \"paragraph\" }>): boolean {\n if (block.lines.length < 3) return false;\n const first = block.lines[0];\n if (!first) return false;\n const aligned = block.lines.every(\n (line) => Math.abs(line.bounds.x - first.bounds.x) <= Math.max(8, first.bounds.height),\n );\n const separated = block.lines.slice(1).every((line, index) => {\n const previous = block.lines[index];\n if (!previous) return false;\n const gap = previous.bounds.y - (line.bounds.y + line.bounds.height);\n return gap >= Math.min(previous.bounds.height, line.bounds.height) * 0.55;\n });\n return aligned && separated;\n}\n\nfunction isFooterParagraph(\n block: Extract<SemanticBlock, { type: \"paragraph\" }>,\n pageHeight: number,\n): boolean {\n const inBottomMargin = block.lines.every(\n (line) => line.bounds.y + line.bounds.height <= pageHeight * 0.15,\n );\n return inBottomMargin || /^(?:thanks|thank you)\\b/i.test(block.text.trim());\n}\n\nfunction marginSignatures(page: BufferedPage): string[] {\n return page.structured.blocks.flatMap((block) =>\n blockLines(block)\n .filter((line) => isMarginLine(line.bounds.y, line.bounds.height, page.height))\n .map((line) => furnitureSignature(line.text)),\n );\n}\n\nfunction isRepeatedFurniture(\n block: SemanticBlock,\n page: BufferedPage,\n futureFurniture: Set<string>,\n): boolean {\n const lines = blockLines(block);\n return (\n lines.length > 0 &&\n lines.every(\n (line) =>\n isMarginLine(line.bounds.y, line.bounds.height, page.height) &&\n futureFurniture.has(furnitureSignature(line.text)),\n )\n );\n}\n\nfunction blockLines(block: SemanticBlock) {\n return block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n}\n\nfunction isMarginLine(y: number, height: number, pageHeight: number): boolean {\n return y + height <= pageHeight * 0.12 || y >= pageHeight * 0.88;\n}\n\nfunction furnitureSignature(value: string): string {\n return value.toLocaleLowerCase(\"en\").replace(/\\d+/g, \"#\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction tablesContinue(previous: Table, next: Table, pageWidth: number): boolean {\n if (previous.columns.length !== next.columns.length || previous.columns.length < 2) return false;\n return previous.columns.every(\n (column, index) =>\n Math.abs(column - (next.columns[index] ?? Number.POSITIVE_INFINITY)) / pageWidth <= 0.04,\n );\n}\n\nfunction tableHeader(rows: string[][]): string[] | undefined {\n const first = rows[0];\n if (!first) return undefined;\n const later = rows.slice(1).flat();\n return first.every((value) => /\\p{L}/u.test(value) && !isNumericValue(value)) &&\n later.some(isNumericValue)\n ? first\n : undefined;\n}\n\nfunction sameRow(left: string[] | undefined, right: string[] | undefined): boolean {\n return Boolean(\n left &&\n right &&\n left.length === right.length &&\n left.every((value, index) => value === right[index]),\n );\n}\n\nfunction tableRow(row: string[], header: boolean): string {\n const cell = header ? \"th\" : \"td\";\n return `<tr>${row.map((value) => `<${cell}>${escapeHtml(value)}</${cell}>`).join(\"\")}</tr>`;\n}\n\nfunction markdownTableStart(rows: string[][], header: string[] | undefined): string {\n const columns = rows[0]?.length ?? 0;\n if (columns === 0) return \"\";\n const heading = header ?? Array(columns).fill(\"\");\n return `${markdownTableRow(heading)}${markdownTableRow(Array(columns).fill(\"---\"), false)}`;\n}\n\nfunction markdownTableRow(row: string[], shouldEscape = true): string {\n const cells = row.map((value) => (shouldEscape ? escapeMarkdownTableCell(value) : value));\n return `| ${cells.join(\" | \")} |\\n`;\n}\n\nfunction escapeMarkdownTableCell(value: string): string {\n return escapeMarkdown(value)\n .replaceAll(\"|\", \"\\\\|\")\n .replace(/\\s*\\n\\s*/g, \"<br>\");\n}\n\nfunction isFinancialSummary(block: Extract<SemanticBlock, { type: \"definitionList\" }>): boolean {\n return (\n block.entries.length > 0 &&\n block.entries.every((entry) => isNumericValue(entry.description)) &&\n block.entries.some((entry) => /\\p{Sc}|%/u.test(entry.description))\n );\n}\n\nfunction isNumericValue(value: string): boolean {\n return /^(?:\\p{Sc}\\s*)?[\\d.,'’\\s]+(?:\\s*%)?$/u.test(value.trim());\n}\n\nfunction financialSummaryRow(\n entry: Extract<SemanticBlock, { type: \"definitionList\" }>[\"entries\"][number],\n columns: number,\n): string {\n const colspan = columns > 2 ? ` colspan=\"${columns - 1}\"` : \"\";\n return `<tr><th scope=\"row\"${colspan}>${escapeHtml(entry.term)}</th><td>${escapeHtml(entry.description)}</td></tr>`;\n}\n\nfunction semanticBlockHtml(block: SemanticBlock, defaultColor = \"#000000\"): string {\n if (block.type === \"insetGroup\") {\n return `<div class=\"pdf-semantic-inset\" style=\"margin-inline-start:${block.indentEm}em\">${block.blocks.map((item) => semanticBlockHtml(item, defaultColor)).join(\"\")}</div>`;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n const header = tableHeader(rows);\n return `<table>${rows.map((row, index) => tableRow(row, Boolean(header && index === 0))).join(\"\")}</table>`;\n }\n if (block.type === \"heading\")\n return `<h${block.level}>${semanticTextHtml(block.text, block.lines, defaultColor, false)}</h${block.level}>`;\n if (block.type === \"paragraph\")\n return `<p>${semanticTextHtml(block.text, block.lines, defaultColor)}</p>`;\n if (block.type === \"preformatted\") return `<pre>${escapeHtml(block.text)}</pre>`;\n if (block.type === \"definitionList\") {\n if (\n block.entries.length <= 3 &&\n block.entries.some((entry) => entry.description.trim().split(/\\s+/).length >= 5) &&\n block.entries.every((entry) => /^[A-Z][A-Z\\s/-]*$/.test(entry.term.trim()))\n ) {\n return block.entries\n .map(\n (entry) =>\n `<section><h2>${escapeHtml(titleCase(entry.term))}</h2><p>${escapeHtml(entry.description)}</p></section>`,\n )\n .join(\"\");\n }\n const list = `<dl>${block.entries\n .map(\n (entry) =>\n `<div><dt>${escapeHtml(entry.term)}</dt><dd>${escapeHtml(entry.description)}</dd></div>`,\n )\n .join(\"\")}</dl>`;\n return isFinancialSummary(block) ? `<section>${list}</section>` : list;\n }\n if (block.type === \"cardList\") {\n return `<section><h2>Items ordered</h2><table><thead><tr><th scope=\"col\">Item</th><th scope=\"col\">Quantity</th><th scope=\"col\">Amount</th></tr></thead><tbody>${block.items.map(cardTableRow).join(\"\")}</tbody></table></section>`;\n }\n if (block.type === \"sectionGroup\") {\n return block.items.map(labeledSectionHtml).join(\"\");\n }\n if (block.type === \"employment\") {\n return `<section><h3>${escapeHtml(block.role)}</h3><p>${escapeHtml(block.organization)}</p><p>${escapeHtml(block.date)}</p></section>`;\n }\n const tag = block.ordered ? \"ol\" : \"ul\";\n return `<${tag}>${block.items.map((item) => `<li>${semanticTextHtml(item.text, item.lines, defaultColor)}</li>`).join(\"\")}</${tag}>`;\n}\n\nfunction semanticBlockOutput(\n block: SemanticBlock,\n defaultColor: string,\n format: SemanticDocumentFormat,\n): string {\n return format === \"markdown\"\n ? semanticBlockMarkdown(block, defaultColor)\n : semanticBlockHtml(block, defaultColor);\n}\n\nfunction semanticBlockMarkdown(block: SemanticBlock, defaultColor = \"#000000\"): string {\n if (block.type === \"insetGroup\") {\n const content = block.blocks.map((item) => semanticBlockMarkdown(item, defaultColor)).join(\"\");\n return `${content\n .trimEnd()\n .split(\"\\n\")\n .map((line) => (line ? `> ${line}` : \">\"))\n .join(\"\\n\")}\\n\\n`;\n }\n if (block.type === \"table\") {\n const rows = tableToRows(block.table);\n const header = tableHeader(rows);\n return `${markdownTableStart(rows, header)}${(header ? rows.slice(1) : rows)\n .map((row) => markdownTableRow(row))\n .join(\"\")}\\n`;\n }\n if (block.type === \"heading\") {\n return `${\"#\".repeat(block.level)} ${semanticTextMarkdown(block.text, block.lines, defaultColor, false)}\\n\\n`;\n }\n if (block.type === \"paragraph\") {\n return `${semanticTextMarkdown(block.text, block.lines, defaultColor)}\\n\\n`;\n }\n if (block.type === \"preformatted\") {\n const fence = block.text.includes(\"```\") ? \"````\" : \"```\";\n return `${fence}\\n${block.text}\\n${fence}\\n\\n`;\n }\n if (block.type === \"definitionList\") {\n return `${block.entries\n .map((entry) => `**${escapeMarkdown(entry.term)}:** ${escapeMarkdown(entry.description)}`)\n .join(\"\\n\\n\")}\\n\\n`;\n }\n if (block.type === \"cardList\") {\n const rows = [\n [\"Item\", \"Quantity\", \"Amount\"],\n ...block.items.map((item) => {\n const trailing = item.details.at(-1) ?? \"\";\n const match = /^\\s*[×x]\\s*(\\d+)\\s+(.+)$/u.exec(trailing);\n const detail = item.details.slice(0, -1).join(\" \");\n return [\n `${item.title}${detail ? ` — ${detail}` : \"\"}`,\n match?.[1] ?? \"\",\n match?.[2] ?? trailing,\n ];\n }),\n ];\n return `## Items ordered\\n\\n${markdownTableStart(rows, rows[0])}${rows\n .slice(1)\n .map((row) => markdownTableRow(row))\n .join(\"\")}\\n`;\n }\n if (block.type === \"sectionGroup\") {\n return block.items\n .map(\n (item) =>\n `## ${escapeMarkdown(titleCase(item.label))}\\n\\n${item.content\n .map((content, index) =>\n index === 0 ? `**${escapeMarkdown(content)}**` : escapeMarkdown(content),\n )\n .join(\"\\n\\n\")}\\n\\n`,\n )\n .join(\"\");\n }\n if (block.type === \"employment\") {\n return `### ${escapeMarkdown(block.role)}\\n\\n${escapeMarkdown(block.organization)}\\n\\n${escapeMarkdown(block.date)}\\n\\n`;\n }\n return `${block.items\n .map(\n (item, index) =>\n `${block.ordered ? `${index + 1}.` : \"-\"} ${semanticTextMarkdown(item.text, item.lines, defaultColor)}`,\n )\n .join(\"\\n\")}\\n\\n`;\n}\n\nfunction semanticBlockY(block: SemanticBlock): number {\n const lines = block.type === \"list\" ? block.items.flatMap((item) => item.lines) : block.lines;\n return Math.max(...lines.map((line) => line.bounds.y + line.bounds.height));\n}\n\nfunction cardTableRow(item: Extract<SemanticBlock, { type: \"cardList\" }>[\"items\"][number]): string {\n const trailing = item.details.at(-1) ?? \"\";\n const match = /^\\s*[×x]\\s*(\\d+)\\s+(.+)$/u.exec(trailing);\n const description = item.details.slice(0, -1).join(\" \");\n const detail = description ? `<br><span>${escapeHtml(description)}</span>` : \"\";\n const quantity = match?.[1] ?? \"\";\n const amount = match?.[2] ?? trailing;\n return `<tr><th scope=\"row\">${escapeHtml(item.title)}${detail}</th><td>${escapeHtml(quantity)}</td><td>${escapeHtml(amount)}</td></tr>`;\n}\n\nfunction labeledSectionHtml(\n item: Extract<SemanticBlock, { type: \"sectionGroup\" }>[\"items\"][number],\n): string {\n const heading = titleCase(item.label);\n const postal = /\\b(?:ship|deliver|mail)(?:ed)?\\b/i.test(item.label);\n if (postal) {\n const [name, ...address] = item.content;\n const content = [name ? `<strong>${escapeHtml(name)}</strong>` : \"\", ...address.map(escapeHtml)]\n .filter(Boolean)\n .join(\"<br>\");\n return `<section><h2>${escapeHtml(heading)}</h2><address>${content}</address></section>`;\n }\n return `<section><h2>${escapeHtml(heading)}</h2>${item.content\n .map(\n (content, index) =>\n `<p>${index === 0 ? `<strong>${escapeHtml(content)}</strong>` : escapeHtml(content)}</p>`,\n )\n .join(\"\")}</section>`;\n}\n\nfunction titleCase(value: string): string {\n const normalized = value.trim().toLocaleLowerCase(\"en\");\n return normalized.replace(/^\\p{L}/u, (letter) => letter.toLocaleUpperCase(\"en\"));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction escapeMarkdown(value: string): string {\n return value.replace(/([\\\\`*_[\\]<>])/g, \"\\\\$1\");\n}\n","import type { TextLine } from \"@boxpdf/reader/structure\";\n\ninterface StyledRange {\n start: number;\n end: number;\n color?: string;\n bold: boolean;\n italic: boolean;\n}\n\nexport function dominantTextColor(lines: TextLine[]): string {\n const counts = new Map<string, number>();\n for (const span of lines.flatMap((line) => line.spans)) {\n const color = normalizedColor(span.color) ?? \"#000000\";\n counts.set(color, (counts.get(color) ?? 0) + Math.max(1, [...span.text].length));\n }\n return [...counts].sort((left, right) => right[1] - left[1])[0]?.[0] ?? \"#000000\";\n}\n\nexport function semanticTextHtml(\n text: string,\n lines: TextLine[],\n defaultColor: string,\n preserveWeight = true,\n): string {\n return semanticText(text, lines, defaultColor, preserveWeight, \"html\");\n}\n\nexport function semanticTextMarkdown(\n text: string,\n lines: TextLine[],\n defaultColor: string,\n preserveWeight = true,\n): string {\n return semanticText(text, lines, defaultColor, preserveWeight, \"markdown\");\n}\n\nfunction semanticText(\n text: string,\n lines: TextLine[],\n defaultColor: string,\n preserveWeight: boolean,\n format: \"html\" | \"markdown\",\n): string {\n const ranges: StyledRange[] = [];\n let cursor = 0;\n for (const span of lines.flatMap((line) => line.spans)) {\n if (!span.text) continue;\n const start = text.indexOf(span.text, cursor);\n if (start < 0) continue;\n cursor = start + span.text.length;\n const color = normalizedColor(span.color);\n const bold =\n preserveWeight && /(?:bold|semibold|demi|medium|medi)/i.test(span.fontFamily ?? \"\");\n const italic = /(?:italic|oblique|slanted|slant|ital)/i.test(span.fontFamily ?? \"\");\n const nondefaultColor = color && color !== defaultColor ? color : undefined;\n if (nondefaultColor || bold || italic) {\n ranges.push({\n start,\n end: cursor,\n ...(nondefaultColor ? { color: nondefaultColor } : {}),\n bold,\n italic,\n });\n }\n }\n const merged = mergeRanges(ranges, text);\n let html = \"\";\n let offset = 0;\n for (const range of merged) {\n html += escapeText(text.slice(offset, range.start), format);\n html += styledText(text.slice(range.start, range.end), range, format);\n offset = range.end;\n }\n return html + escapeText(text.slice(offset), format);\n}\n\nfunction mergeRanges(ranges: StyledRange[], text: string): StyledRange[] {\n const merged: StyledRange[] = [];\n for (const range of ranges) {\n const previous = merged.at(-1);\n if (\n previous &&\n previous.color === range.color &&\n previous.bold === range.bold &&\n previous.italic === range.italic &&\n /^\\s*$/.test(text.slice(previous.end, range.start))\n ) {\n previous.end = range.end;\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nfunction styledText(value: string, range: StyledRange, format: \"html\" | \"markdown\"): string {\n let html = escapeText(value, format);\n if (range.color) html = `<span style=\"color:${range.color}\">${html}</span>`;\n if (range.italic) html = format === \"html\" ? `<em>${html}</em>` : `_${html}_`;\n if (range.bold) html = format === \"html\" ? `<strong>${html}</strong>` : `**${html}**`;\n return html;\n}\n\nfunction escapeText(value: string, format: \"html\" | \"markdown\"): string {\n return format === \"html\" ? escapeHtml(value) : escapeMarkdown(value);\n}\n\nfunction escapeMarkdown(value: string): string {\n return value.replace(/([\\\\`*_[\\]<>])/g, \"\\\\$1\");\n}\n\nfunction normalizedColor(value: string | undefined): string | undefined {\n if (!value || !/^#[\\da-f]{6}$/i.test(value)) return undefined;\n const color = value.toLowerCase();\n return color === \"#000000\" || color === \"#000\" ? \"#000000\" : color;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n","import type { Rect, VectorFill, VectorPath } from \"@boxpdf/reader\";\n\nexport function vectorFillSvg(fill: VectorFill): string {\n if (!isCssHexColor(fill.color)) return \"\";\n const points = fill.points.map(([x, y]) => `${number(x)},${number(y)}`).join(\" \");\n const opacity = isUnitInterval(fill.opacity) ? ` fill-opacity=\"${number(fill.opacity)}\"` : \"\";\n return `<polygon points=\"${points}\" fill=\"${fill.color}\"${opacity}/>`;\n}\n\nexport function vectorPathSvg(path: VectorPath, pageNumber: number, pathIndex: number): string {\n if (!isSvgPath(path.d)) return \"\";\n const fill = isCssHexColor(path.fill) ? path.fill : \"none\";\n const stroke = isCssHexColor(path.stroke) ? path.stroke : \"none\";\n const width = finiteNonnegative(path.strokeWidth)\n ? ` stroke-width=\"${number(path.strokeWidth)}\"`\n : \"\";\n const fillOpacity = isUnitInterval(path.fillOpacity)\n ? ` fill-opacity=\"${number(path.fillOpacity)}\"`\n : \"\";\n const strokeOpacity = isUnitInterval(path.strokeOpacity)\n ? ` stroke-opacity=\"${number(path.strokeOpacity)}\"`\n : \"\";\n const dash = path.strokeDasharray?.every(finiteNonnegative)\n ? ` stroke-dasharray=\"${path.strokeDasharray.map(number).join(\" \")}\"`\n : \"\";\n const dashoffset = Number.isFinite(path.strokeDashoffset)\n ? ` stroke-dashoffset=\"${number(path.strokeDashoffset ?? 0)}\"`\n : \"\";\n const linecap = path.strokeLinecap ? ` stroke-linecap=\"${path.strokeLinecap}\"` : \"\";\n const linejoin = path.strokeLinejoin ? ` stroke-linejoin=\"${path.strokeLinejoin}\"` : \"\";\n const rule = path.fillRule ? ` fill-rule=\"${path.fillRule}\"` : \"\";\n let output = `<path d=\"${path.d}\" fill=\"${fill}\" stroke=\"${stroke}\"${width}${fillOpacity}${strokeOpacity}${dash}${dashoffset}${linecap}${linejoin}${rule}/>`;\n for (let index = (path.clips?.length ?? 0) - 1; index >= 0; index -= 1) {\n output = `<g clip-path=\"url(#${vectorPathClipId(pageNumber, pathIndex, index)})\">${output}</g>`;\n }\n return output;\n}\n\nexport function vectorPathClipDefinitions(\n paths: ReadonlyArray<{ path: VectorPath; index: number }>,\n pageNumber: number,\n): string {\n return paths\n .flatMap(({ path, index: pathIndex }) =>\n (path.clips ?? []).map((clip, clipIndex) => {\n if (!isSvgPath(clip.d)) return \"\";\n const rule = clip.fillRule ? ` clip-rule=\"${clip.fillRule}\"` : \"\";\n return `<clipPath id=\"${vectorPathClipId(pageNumber, pathIndex, clipIndex)}\" clipPathUnits=\"userSpaceOnUse\"><path d=\"${clip.d}\"${rule}/></clipPath>`;\n }),\n )\n .join(\"\");\n}\n\nexport function vectorPathBounds(path: VectorPath): Rect | undefined {\n if (!isSvgPath(path.d)) return undefined;\n const values = [...path.d.matchAll(/[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/gi)].map((match) =>\n Number(match[0]),\n );\n if (values.length < 2) return undefined;\n const xs: number[] = [];\n const ys: number[] = [];\n for (let index = 0; index + 1 < values.length; index += 2) {\n xs.push(values[index] ?? 0);\n ys.push(values[index + 1] ?? 0);\n }\n return bounds(xs, ys);\n}\n\nexport function vectorFillBounds(fill: VectorFill): Rect | undefined {\n if (fill.points.length === 0) return undefined;\n return bounds(\n fill.points.map(([x]) => x),\n fill.points.map(([, y]) => y),\n );\n}\n\nexport function isSvgPath(value: string): boolean {\n return value.length <= 1_000_000 && /^[\\d\\s.,+\\-eEMmLlCcZz]+$/.test(value);\n}\n\nfunction bounds(xs: number[], ys: number[]): Rect {\n const x = Math.min(...xs);\n const y = Math.min(...ys);\n return { x, y, width: Math.max(...xs) - x, height: Math.max(...ys) - y };\n}\n\nfunction vectorPathClipId(pageNumber: number, pathIndex: number, clipIndex: number): string {\n return `boxpdf-path-clip-${pageNumber}-${pathIndex}-${clipIndex}`;\n}\n\nfunction isCssHexColor(value: string | undefined): value is string {\n return typeof value === \"string\" && /^#[0-9a-f]{6}$/i.test(value);\n}\n\nfunction finiteNonnegative(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value) && value >= 0;\n}\n\nfunction isUnitInterval(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value) && value >= 0 && value <= 1;\n}\n\nfunction number(value: number): string {\n return Number(value.toFixed(4)).toString();\n}\n","import type { EmbeddedFont } from \"@boxpdf/reader\";\n\nexport function visualFontAliases(pageNumber: number, fonts: EmbeddedFont[]): Map<string, string> {\n return new Map(\n fonts\n .filter(\n (font) =>\n (font.format === \"truetype\" || font.format === \"opentype\") &&\n !/(?:courier|^TTE)/i.test(font.family ?? \"\"),\n )\n .map((font) => [font.id, `boxpdf-${pageNumber}-${font.id}`]),\n );\n}\n\nexport function visualFontFace(font: EmbeddedFont, aliases: Map<string, string>): string {\n if (font.format !== \"truetype\" && font.format !== \"opentype\") return \"\";\n const alias = aliases.get(font.id);\n if (!alias) return \"\";\n const styles = visualFontStyles(font.family, alias).filter(\n (style) => !style.startsWith(\"font-family:\"),\n );\n const mime = font.format === \"opentype\" ? \"font/otf\" : \"font/ttf\";\n return `@font-face{font-family:${alias};src:url(data:${mime};base64,${base64(font.data)}) format(\"${font.format}\");${styles.join(\";\")}}`;\n}\n\nexport function visualFontStyles(fontFamily: string | undefined, alias?: string): string[] {\n const normalized = fontFamily?.toLowerCase() ?? \"\";\n const styles: string[] = [];\n let fallback: string | undefined;\n if (/courier|mono|nimbusmono|^cmtt/.test(normalized)) {\n fallback = \"Courier New,Courier,monospace\";\n } else if (\n /times|minion|serif|baskerville|georgia|nimbusrom|guardian.*egyp|^cm[rs]y?\\d/.test(normalized)\n ) {\n fallback = \"Times New Roman,Times,serif\";\n } else if (/helvetica|arial|sans|nimbussan|calibre|myriad|panton|^tte|^mstt/.test(normalized)) {\n fallback = \"Arial,Helvetica,sans-serif\";\n }\n if (alias || fallback) styles.push(`font-family:${[alias, fallback].filter(Boolean).join(\",\")}`);\n if (/bold|black|semibold|demi|medi|^tte/.test(normalized)) styles.push(\"font-weight:700\");\n if (/italic|oblique|slant|ital(?:$|[_-])/.test(normalized)) styles.push(\"font-style:italic\");\n return styles;\n}\n\nexport function base64(bytes: Uint8Array): string {\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n let output = \"\";\n for (let index = 0; index < bytes.length; index += 3) {\n const first = bytes[index] ?? 0;\n const second = bytes[index + 1] ?? 0;\n const third = bytes[index + 2] ?? 0;\n output += alphabet[first >> 2];\n output += alphabet[((first & 3) << 4) | (second >> 4)];\n output += index + 1 < bytes.length ? alphabet[((second & 15) << 2) | (third >> 6)] : \"=\";\n output += index + 2 < bytes.length ? alphabet[third & 63] : \"=\";\n }\n return output;\n}\n","import type {\n ExtractedPage,\n RasterImage,\n Rect,\n TextSpan,\n VectorFill,\n VectorPath,\n} from \"@boxpdf/reader\";\nimport {\n vectorFillBounds,\n vectorFillSvg,\n vectorPathBounds,\n vectorPathClipDefinitions,\n vectorPathSvg,\n} from \"./vector-svg.js\";\nimport { base64, visualFontAliases, visualFontFace, visualFontStyles } from \"./visual-font.js\";\n\nexport interface SemanticMedia {\n bounds: Rect;\n html: string;\n markdown: string;\n consumedSpans?: TextSpan[];\n kind?: \"raster\" | \"vector\" | \"composite\";\n assets?: HtmlImageAsset[];\n}\n\nexport interface HtmlImageAsset {\n name: string;\n mimeType: \"image/bmp\" | \"image/jpeg\" | \"image/svg+xml\";\n data: Uint8Array;\n}\n\nexport type HtmlImageOptions = \"embedded\" | \"references\" | \"excluded\";\n\nexport function semanticMedia(\n page: ExtractedPage,\n imageOptions: HtmlImageOptions = \"embedded\",\n): SemanticMedia[] {\n if (imageOptions === \"excluded\") return [];\n const output = (page.images ?? []).map((image, index) =>\n rasterMedia(image, page.number, index, imageOptions),\n );\n output.push(...vectorMedia(page, imageOptions));\n return mediaComponents(output, page).sort((left, right) => right.bounds.y - left.bounds.y);\n}\n\nexport async function prepareSemanticMedia(\n page: ExtractedPage,\n imageOptions: HtmlImageOptions,\n onImage?: (image: Readonly<HtmlImageAsset>) => void | Promise<void>,\n): Promise<SemanticMedia[]> {\n const media = semanticMedia(page, imageOptions);\n for (const item of media) {\n for (const asset of item.assets ?? []) await onImage?.(asset);\n delete item.assets;\n }\n return media;\n}\n\nfunction rasterMedia(\n image: RasterImage,\n pageNumber: number,\n index: number,\n imageOptions: HtmlImageOptions,\n): SemanticMedia {\n const bounds = transformedUnitBounds(image.transform);\n const mime = image.format === \"jpeg\" ? \"image/jpeg\" : \"image/bmp\";\n const data = image.format === \"jpeg\" ? image.data : rgbBmp(image);\n const extension = image.format === \"jpeg\" ? \"jpg\" : \"bmp\";\n const name = `page-${pageNumber}-image-${index + 1}.${extension}`;\n const source = imageOptions === \"references\" ? name : `data:${mime};base64,${base64(data)}`;\n const opacity = unitInterval(image.opacity) ? `;opacity:${number(image.opacity)}` : \"\";\n return {\n bounds,\n kind: \"raster\",\n html: `<img class=\"pdf-semantic-media\" src=\"${source}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" alt=\"\" style=\"max-width:100%;height:auto${opacity}\">`,\n markdown: `![](${source})`,\n ...(imageOptions === \"references\" ? { assets: [{ name, mimeType: mime, data }] } : {}),\n };\n}\n\nfunction vectorMedia(page: ExtractedPage, imageOptions: HtmlImageOptions): SemanticMedia[] {\n const primitives: VectorPrimitive[] = [\n ...(page.paths ?? []).flatMap((path, index) => {\n const bounds = vectorPathBounds(path);\n return bounds ? [{ type: \"path\" as const, value: path, index, bounds }] : [];\n }),\n ...(page.fills ?? []).flatMap((fill) => {\n const bounds = vectorFillBounds(fill);\n return bounds && !isPageBackground(fill, bounds, page)\n ? [{ type: \"fill\" as const, value: fill, bounds }]\n : [];\n }),\n ];\n const components = vectorComponents(primitives, Math.min(36, page.width * 0.06)).filter(\n (component) =>\n component.primitives.length >= 2 ||\n component.bounds.width * component.bounds.height >= page.width * page.height * 0.002,\n );\n const aliases = visualFontAliases(page.number, page.fonts ?? []);\n const visualCodeFonts = new Set(\n (page.fonts ?? [])\n .filter(\n (font) =>\n (font.format === \"truetype\" || font.format === \"opentype\") && font.visualCodeMapping,\n )\n .map((font) => font.id),\n );\n return components.map((component, componentIndex) => {\n const bounds = component.bounds;\n const paths = component.primitives.flatMap((primitive) =>\n primitive.type === \"path\" ? [{ path: primitive.value, index: primitive.index }] : [],\n );\n const fills = component.primitives.flatMap((primitive) =>\n primitive.type === \"fill\" ? [primitive.value] : [],\n );\n const visualSpans = page.visualSpans ?? page.spans;\n const overlay = visualSpans.filter(\n (span) =>\n span.fontAssetId &&\n visualCodeFonts.has(span.fontAssetId) &&\n centerInside(span.bounds, bounds),\n );\n const consumedSpans = page.spans.filter(\n (span) =>\n span.fontAssetId &&\n visualCodeFonts.has(span.fontAssetId) &&\n centerInside(span.bounds, bounds),\n );\n const fontIds = new Set(overlay.map((span) => span.fontAssetId));\n const fontFaces = (page.fonts ?? [])\n .filter((font) => fontIds.has(font.id))\n .map((font) => visualFontFace(font, aliases))\n .join(\"\");\n const svg = `<svg class=\"pdf-semantic-media\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${number(bounds.x)} ${number(page.height - bounds.y - bounds.height)} ${number(bounds.width)} ${number(bounds.height)}\" style=\"display:block;max-width:100%;height:auto\" aria-hidden=\"true\">${fontFaces ? `<style>${fontFaces}</style>` : \"\"}${paths.length ? `<defs>${vectorPathClipDefinitions(paths, page.number)}</defs>` : \"\"}<g transform=\"translate(0 ${number(page.height)}) scale(1 -1)\">${fills.map(vectorFillSvg).join(\"\") + paths.map(({ path, index }) => vectorPathSvg(path, page.number, index)).join(\"\")}</g>${overlay.map((span) => vectorText(span, page.height, aliases)).join(\"\")}</svg>`;\n const name = `page-${page.number}-vector-${componentIndex + 1}.svg`;\n return {\n bounds,\n kind: \"vector\" as const,\n html:\n imageOptions === \"references\"\n ? `<img class=\"pdf-semantic-media\" src=\"${name}\" width=\"${number(bounds.width)}\" height=\"${number(bounds.height)}\" alt=\"\">`\n : svg,\n markdown: imageOptions === \"references\" ? `![](${name})` : svg,\n ...(imageOptions === \"references\"\n ? {\n assets: [\n { name, mimeType: \"image/svg+xml\" as const, data: new TextEncoder().encode(svg) },\n ],\n }\n : {}),\n ...(consumedSpans.length > 0 ? { consumedSpans } : {}),\n };\n });\n}\n\nfunction mediaComponents(media: SemanticMedia[], page: ExtractedPage): SemanticMedia[] {\n const components: SemanticMedia[][] = [];\n for (const item of media) {\n if (isPageBackdrop(item.bounds, page)) {\n components.push([item]);\n continue;\n }\n const matches = components.filter(\n (component) =>\n !component.some((member) => isPageBackdrop(member.bounds, page)) &&\n component.some((member) => mediaPiecesTouch(member.bounds, item.bounds)),\n );\n if (matches.length === 0) {\n components.push([item]);\n continue;\n }\n const target = matches[0] as SemanticMedia[];\n target.push(item);\n for (const component of matches.slice(1)) {\n target.push(...component);\n components.splice(components.indexOf(component), 1);\n }\n }\n return components.map((component) => compositeMedia(component));\n}\n\nfunction compositeMedia(items: SemanticMedia[]): SemanticMedia {\n if (items.length === 1) return items[0] as SemanticMedia;\n const bounds = unionBounds(items.map((item) => item.bounds)) as Rect;\n const layers = items\n .map((item) => {\n const left = ((item.bounds.x - bounds.x) / bounds.width) * 100;\n const top =\n ((bounds.y + bounds.height - item.bounds.y - item.bounds.height) / bounds.height) * 100;\n const width = (item.bounds.width / bounds.width) * 100;\n const height = (item.bounds.height / bounds.height) * 100;\n return `<div style=\"position:absolute;left:${number(left)}%;top:${number(top)}%;width:${number(width)}%;height:${number(height)}%;overflow:hidden\">${item.html}</div>`;\n })\n .join(\"\");\n return {\n bounds,\n kind: \"composite\",\n html: `<div class=\"pdf-semantic-media pdf-semantic-media-composite\" style=\"position:relative;max-width:100%;width:${number(bounds.width)}px;aspect-ratio:${number(bounds.width)}/${number(bounds.height)}\">${layers}</div>`,\n markdown: items.map((item) => item.markdown).join(\"\\n\\n\"),\n consumedSpans: items.flatMap((item) => item.consumedSpans ?? []),\n assets: items.flatMap((item) => item.assets ?? []),\n };\n}\n\nfunction mediaPiecesTouch(left: Rect, right: Rect): boolean {\n const xOverlap = overlap(left.x, left.width, right.x, right.width);\n const yOverlap = overlap(left.y, left.height, right.y, right.height);\n if (xOverlap > 0 && yOverlap > 0) return true;\n const horizontalGap = axisGap(left.x, left.width, right.x, right.width);\n const verticalGap = axisGap(left.y, left.height, right.y, right.height);\n if (horizontalGap <= 2 && yOverlap / Math.min(left.height, right.height) >= 0.65) return true;\n return verticalGap <= 2 && xOverlap / Math.min(left.width, right.width) >= 0.65;\n}\n\nfunction isPageBackdrop(bounds: Rect, page: ExtractedPage): boolean {\n return bounds.width * bounds.height >= page.width * page.height * 0.7;\n}\n\nfunction overlap(left: number, leftSize: number, right: number, rightSize: number): number {\n return Math.max(0, Math.min(left + leftSize, right + rightSize) - Math.max(left, right));\n}\n\nfunction axisGap(left: number, leftSize: number, right: number, rightSize: number): number {\n return Math.max(0, right - left - leftSize, left - right - rightSize);\n}\n\ntype VectorPrimitive =\n | { type: \"path\"; value: VectorPath; index: number; bounds: Rect }\n | { type: \"fill\"; value: VectorFill; bounds: Rect };\n\ninterface VectorComponent {\n bounds: Rect;\n primitives: VectorPrimitive[];\n}\n\nfunction vectorComponents(primitives: VectorPrimitive[], padding: number): VectorComponent[] {\n const components: VectorComponent[] = [];\n for (const primitive of primitives) {\n const matches = components.filter((component) =>\n nearby(component.bounds, primitive.bounds, padding),\n );\n if (matches.length === 0) {\n components.push({ bounds: primitive.bounds, primitives: [primitive] });\n continue;\n }\n const target = matches[0] as VectorComponent;\n target.primitives.push(primitive);\n target.bounds = unionBounds([target.bounds, primitive.bounds]) as Rect;\n for (const component of matches.slice(1)) {\n target.primitives.push(...component.primitives);\n target.bounds = unionBounds([target.bounds, component.bounds]) as Rect;\n components.splice(components.indexOf(component), 1);\n }\n }\n return components;\n}\n\nfunction nearby(left: Rect, right: Rect, padding: number): boolean {\n return !(\n left.x + left.width + padding < right.x ||\n right.x + right.width + padding < left.x ||\n left.y + left.height + padding < right.y ||\n right.y + right.height + padding < left.y\n );\n}\n\nfunction isPageBackground(fill: VectorFill, bounds: Rect, page: ExtractedPage): boolean {\n if (!/^#f{6}$/i.test(fill.color)) return false;\n const outside =\n bounds.x < 0 ||\n bounds.y < 0 ||\n bounds.x + bounds.width > page.width ||\n bounds.y + bounds.height > page.height;\n const large = bounds.width * bounds.height > page.width * page.height * 0.2;\n return outside || large;\n}\n\nexport function withoutSemanticMediaSpans(\n page: ExtractedPage,\n media: SemanticMedia[],\n): ExtractedPage {\n const consumed = new Set(media.flatMap((item) => item.consumedSpans ?? []));\n return consumed.size > 0\n ? { ...page, spans: page.spans.filter((span) => !consumed.has(span)) }\n : page;\n}\n\nfunction vectorText(span: TextSpan, pageHeight: number, aliases: Map<string, string>): string {\n if (span.renderingMode === 3 || span.renderingMode === 7) return \"\";\n const styles = [\n cssColor(span.color) ? `fill:${span.color}` : \"\",\n unitInterval(span.fillOpacity) ? `fill-opacity:${number(span.fillOpacity)}` : \"\",\n ...visualFontStyles(\n span.fontFamily,\n span.fontAssetId ? aliases.get(span.fontAssetId) : undefined,\n ),\n ]\n .filter(Boolean)\n .join(\";\");\n const anchorY = pageHeight - span.bounds.y;\n const transform = span.transform;\n const position = transform\n ? ` x=\"0\" y=\"0\" transform=\"matrix(${transform.map(number).join(\" \")} ${number(span.bounds.x)} ${number(anchorY)})\"`\n : ` x=\"${number(span.bounds.x)}\" y=\"${number(anchorY)}\"`;\n const extent = span.direction === \"ttb\" ? span.bounds.height : span.bounds.width;\n const length =\n extent > 0 ? ` textLength=\"${number(extent)}\" lengthAdjust=\"spacingAndGlyphs\"` : \"\";\n return `<text${position} font-size=\"${number(span.fontSize)}\"${length}${styles ? ` style=\"${styles}\"` : \"\"}>${escapeHtml(span.text)}</text>`;\n}\n\nfunction centerInside(inner: Rect, outer: Rect): boolean {\n const x = inner.x + inner.width / 2;\n const y = inner.y + inner.height / 2;\n return x >= outer.x && x <= outer.x + outer.width && y >= outer.y && y <= outer.y + outer.height;\n}\n\nfunction transformedUnitBounds([a, b, c, d, e, f]: RasterImage[\"transform\"]): Rect {\n const points = [\n [e, f],\n [a + e, b + f],\n [c + e, d + f],\n [a + c + e, b + d + f],\n ];\n const xs = points.map(([x]) => x ?? 0);\n const ys = points.map(([, y]) => y ?? 0);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n return { x: minX, y: minY, width: Math.max(...xs) - minX, height: Math.max(...ys) - minY };\n}\n\nfunction unionBounds(bounds: Array<Rect | undefined>): Rect | undefined {\n const values = bounds.filter((value): value is Rect => Boolean(value));\n if (values.length === 0) return undefined;\n const x = Math.min(...values.map((value) => value.x));\n const y = Math.min(...values.map((value) => value.y));\n const right = Math.max(...values.map((value) => value.x + value.width));\n const top = Math.max(...values.map((value) => value.y + value.height));\n return { x, y, width: right - x, height: top - y };\n}\n\nfunction rgbBmp(image: RasterImage): Uint8Array {\n const stride = Math.ceil((image.width * 3) / 4) * 4;\n const output = new Uint8Array(54 + stride * image.height);\n const view = new DataView(output.buffer);\n output.set([0x42, 0x4d]);\n view.setUint32(2, output.length, true);\n view.setUint32(10, 54, true);\n view.setUint32(14, 40, true);\n view.setInt32(18, image.width, true);\n view.setInt32(22, -image.height, true);\n view.setUint16(26, 1, true);\n view.setUint16(28, 24, true);\n for (let row = 0; row < image.height; row += 1) {\n for (let column = 0; column < image.width; column += 1) {\n const source = (row * image.width + column) * 3;\n const target = 54 + row * stride + column * 3;\n output[target] = image.data[source + 2] ?? 0;\n output[target + 1] = image.data[source + 1] ?? 0;\n output[target + 2] = image.data[source] ?? 0;\n }\n }\n return output;\n}\n\nfunction cssColor(value: string | undefined): value is string {\n return /^#[\\da-f]{6}$/i.test(value ?? \"\");\n}\n\nfunction finiteNonnegative(value: number | undefined): value is number {\n return Number.isFinite(value) && (value ?? -1) >= 0;\n}\n\nfunction unitInterval(value: number | undefined): value is number {\n return finiteNonnegative(value) && value <= 1;\n}\n\nfunction number(value: number): string {\n return Number.isFinite(value) ? String(Math.round(value * 1_000) / 1_000) : \"0\";\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n"],"mappings":"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","names":["import_structure","bounds","styles","bounds","number","overlap","styles","escapeHtml","finiteNonnegative","html","escapeHtml","escapeMarkdown","escapeHtml","number","isUnitInterval","rgbBmp","isCssHexColor","semanticBlockY"]}