ocean-brain 0.6.2 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -175,6 +175,8 @@ const ANGLE_BRACKET_PLACEHOLDER_PREFIX = "\uE000OBANGLE";
|
|
|
175
175
|
const ANGLE_BRACKET_PLACEHOLDER_SUFFIX = "\uE001";
|
|
176
176
|
const NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = "\uE000OBTILDE";
|
|
177
177
|
const NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = "\uE001";
|
|
178
|
+
const HARD_BREAK_PLACEHOLDER_PREFIX = "\uE000OBHARDBREAK";
|
|
179
|
+
const HARD_BREAK_PLACEHOLDER_SUFFIX = "\uE001";
|
|
178
180
|
function isMarkdownAutolinkAngleBracketText(innerText) {
|
|
179
181
|
if (innerText !== innerText.trim()) {
|
|
180
182
|
return false;
|
|
@@ -253,6 +255,49 @@ function protectMarkdownNumericTildeRanges(markdown) {
|
|
|
253
255
|
placeholderToToken
|
|
254
256
|
};
|
|
255
257
|
}
|
|
258
|
+
function protectMarkdownLineEndHardBreakMarkers(markdown) {
|
|
259
|
+
const protectedLines = [];
|
|
260
|
+
const placeholderToToken = /* @__PURE__ */ new Map();
|
|
261
|
+
let activeFence = null;
|
|
262
|
+
const lines = markdown.split(/(?<=\n)/);
|
|
263
|
+
for (const [index, line] of lines.entries()) {
|
|
264
|
+
const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);
|
|
265
|
+
const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);
|
|
266
|
+
if (activeFence) {
|
|
267
|
+
protectedLines.push(line);
|
|
268
|
+
if (isClosingFenceLine(lineBody, activeFence)) {
|
|
269
|
+
activeFence = null;
|
|
270
|
+
}
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (fenceMatch?.[1]) {
|
|
274
|
+
const marker = fenceMatch[1][0];
|
|
275
|
+
activeFence = {
|
|
276
|
+
marker,
|
|
277
|
+
length: fenceMatch[1].length
|
|
278
|
+
};
|
|
279
|
+
protectedLines.push(line);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
if (/^(?: {4,}|\t)/.test(lineBody)) {
|
|
283
|
+
protectedLines.push(line);
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
const nextLineBody = splitMarkdownLineEnding(lines[index + 1] ?? "").body;
|
|
287
|
+
protectedLines.push(
|
|
288
|
+
`${protectMarkdownLineEndHardBreakMarker(
|
|
289
|
+
lineBody,
|
|
290
|
+
lineEnding,
|
|
291
|
+
isMarkdownHardBreakContinuationLine(nextLineBody),
|
|
292
|
+
placeholderToToken
|
|
293
|
+
)}${lineEnding}`
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
markdown: protectedLines.join(""),
|
|
298
|
+
placeholderToToken
|
|
299
|
+
};
|
|
300
|
+
}
|
|
256
301
|
function protectMarkdownTextAngleBrackets(markdown) {
|
|
257
302
|
const protectedLines = [];
|
|
258
303
|
const placeholderToToken = /* @__PURE__ */ new Map();
|
|
@@ -404,12 +449,61 @@ function replaceNumericTildeRangeMarkers(text, placeholderToToken) {
|
|
|
404
449
|
return `${leadingDigit}${placeholder}`;
|
|
405
450
|
});
|
|
406
451
|
}
|
|
452
|
+
function protectMarkdownLineEndHardBreakMarker(line, lineEnding, hasContinuationLine, placeholderToToken) {
|
|
453
|
+
if (!lineEnding || !line.endsWith("\\")) {
|
|
454
|
+
return line;
|
|
455
|
+
}
|
|
456
|
+
const placeholder = createHardBreakPlaceholder(placeholderToToken.size);
|
|
457
|
+
const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);
|
|
458
|
+
placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? "" : "\\");
|
|
459
|
+
return `${line.slice(0, -1)}${placeholder}`;
|
|
460
|
+
}
|
|
461
|
+
function isMarkdownHardBreakContinuationLine(line) {
|
|
462
|
+
if (!line.trim()) {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
const trimmedLine = line.trimStart();
|
|
466
|
+
if (trimmedLine.match(MARKDOWN_FENCED_CODE_PATTERN)) {
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
if (/^(?:#{1,6})(?:\s|$)/.test(trimmedLine)) {
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
if (/^>/.test(trimmedLine)) {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
if (/^(?:[-+*])(?:\s|$)/.test(trimmedLine) || /^\d{1,9}[.)](?:\s|$)/.test(trimmedLine)) {
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
if (/^(?:-{3,}|\*{3,}|_{3,})\s*$/.test(trimmedLine)) {
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
function hasUnclosedInlineCodeSpanAtLineEnd(line) {
|
|
484
|
+
let cursor = 0;
|
|
485
|
+
let openDelimiter = null;
|
|
486
|
+
while (cursor < line.length) {
|
|
487
|
+
const codeStart = line.indexOf("`", cursor);
|
|
488
|
+
if (codeStart === -1) {
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
const delimiterLength = countRepeatedCharacter(line, codeStart, "`");
|
|
492
|
+
const delimiter = "`".repeat(delimiterLength);
|
|
493
|
+
openDelimiter = openDelimiter === delimiter ? null : delimiter;
|
|
494
|
+
cursor = codeStart + delimiterLength;
|
|
495
|
+
}
|
|
496
|
+
return openDelimiter !== null;
|
|
497
|
+
}
|
|
407
498
|
function createAngleBracketPlaceholder(index) {
|
|
408
499
|
return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;
|
|
409
500
|
}
|
|
410
501
|
function createNumericTildeRangePlaceholder(index) {
|
|
411
502
|
return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;
|
|
412
503
|
}
|
|
504
|
+
function createHardBreakPlaceholder(index) {
|
|
505
|
+
return `${HARD_BREAK_PLACEHOLDER_PREFIX}${index}${HARD_BREAK_PLACEHOLDER_SUFFIX}`;
|
|
506
|
+
}
|
|
413
507
|
function countRepeatedCharacter(value, start, character) {
|
|
414
508
|
let cursor = start;
|
|
415
509
|
while (value[cursor] === character) {
|
|
@@ -614,12 +708,17 @@ async function markdownToBlocksJson(markdown, deps = defaultMarkdownImportDeps)
|
|
|
614
708
|
const editor = getEditor();
|
|
615
709
|
const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);
|
|
616
710
|
const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedMarkdown.markdown);
|
|
711
|
+
const hardBreakProtectedMarkdown = protectMarkdownLineEndHardBreakMarkers(tildeProtectedMarkdown.markdown);
|
|
712
|
+
const basePlaceholderToToken = new Map([
|
|
713
|
+
...tildeProtectedMarkdown.placeholderToToken,
|
|
714
|
+
...hardBreakProtectedMarkdown.placeholderToToken
|
|
715
|
+
]);
|
|
617
716
|
const contentJson = await parseMarkdownToContentJson(
|
|
618
717
|
editor,
|
|
619
|
-
|
|
718
|
+
hardBreakProtectedMarkdown.markdown,
|
|
620
719
|
deps,
|
|
621
720
|
preprocessedMarkdown.placeholderToTag,
|
|
622
|
-
|
|
721
|
+
basePlaceholderToToken
|
|
623
722
|
);
|
|
624
723
|
if (extractLiteralAngleBracketTextTokens(preprocessedMarkdown.markdown).length === 0) {
|
|
625
724
|
return contentJson;
|
|
@@ -627,11 +726,8 @@ async function markdownToBlocksJson(markdown, deps = defaultMarkdownImportDeps)
|
|
|
627
726
|
if (!hasLiteralAngleBracketTextTokenLoss(preprocessedMarkdown.markdown, await blocksToMarkdown(contentJson))) {
|
|
628
727
|
return contentJson;
|
|
629
728
|
}
|
|
630
|
-
const protectedMarkdown = protectMarkdownTextAngleBrackets(
|
|
631
|
-
const placeholderToToken = new Map([
|
|
632
|
-
...tildeProtectedMarkdown.placeholderToToken,
|
|
633
|
-
...protectedMarkdown.placeholderToToken
|
|
634
|
-
]);
|
|
729
|
+
const protectedMarkdown = protectMarkdownTextAngleBrackets(hardBreakProtectedMarkdown.markdown);
|
|
730
|
+
const placeholderToToken = new Map([...basePlaceholderToToken, ...protectedMarkdown.placeholderToToken]);
|
|
635
731
|
return parseMarkdownToContentJson(
|
|
636
732
|
editor,
|
|
637
733
|
protectedMarkdown.markdown,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/blocknote.ts"],"sourcesContent":["import { ServerBlockNoteEditor } from '@blocknote/server-util';\nimport { ensureTagByName } from '~/features/tag/services/organization.js';\nimport models from '~/models.js';\n\ninterface BlockNote {\n id?: string;\n type: string;\n props?: Record<string, unknown>;\n content?: BlockNoteContent;\n children?: BlockNote[];\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteInline {\n type: string;\n props?: Record<string, unknown>;\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteTableCell {\n type: 'tableCell';\n props?: Record<string, unknown>;\n content?: BlockNoteInline[];\n}\n\ninterface BlockNoteTableRow {\n cells?: BlockNoteTableCell[];\n}\n\ninterface BlockNoteTableContent {\n type: 'tableContent';\n columnWidths?: Array<number | null>;\n headerRows?: number;\n rows?: BlockNoteTableRow[];\n}\n\ntype BlockNoteContent = BlockNoteInline[] | BlockNoteTableContent;\n\ninterface MarkdownImportDeps {\n ensureTag: (name: string) => Promise<\n | {\n id: string;\n name: string;\n }\n | {\n tag: {\n id: string;\n name: string;\n };\n }\n >;\n findNotesByTitle: (title: string) => Promise<\n Array<{\n id: string;\n title: string;\n }>\n >;\n}\n\nconst UNSUPPORTED_MARKDOWN_BLOCK_TYPES = new Set(['tableOfContents']);\nconst TAG_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_TAG_';\nconst TAG_PLACEHOLDER_SUFFIX = '_TOKEN';\n\nconst defaultMarkdownImportDeps: MarkdownImportDeps = {\n ensureTag: async (name) => ensureTagByName(name),\n findNotesByTitle: async (title) => {\n const notes = await models.note.findMany({\n select: {\n id: true,\n title: true,\n },\n where: { title },\n orderBy: { createdAt: 'asc' },\n take: 2,\n });\n\n return notes.map((note) => ({\n id: String(note.id),\n title: note.title,\n }));\n },\n};\n\nfunction stripUnsupportedMarkdownBlocks(blocks: BlockNote[]): BlockNote[] {\n return blocks\n .filter((block) => !UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type))\n .map((block) => ({\n ...block,\n children: block.children?.length ? stripUnsupportedMarkdownBlocks(block.children) : [],\n }));\n}\n\nfunction parseBlockNoteContent(contentJson: string): BlockNote[] {\n const parsed = JSON.parse(contentJson);\n\n if (!Array.isArray(parsed)) {\n throw new Error('INVALID_BLOCKNOTE_CONTENT');\n }\n\n return parsed;\n}\n\nfunction visitBlocks(blocks: BlockNote[], visit: (block: BlockNote) => void) {\n for (const block of blocks) {\n visit(block);\n\n if (block.children?.length) {\n visitBlocks(block.children, visit);\n }\n }\n}\n\nfunction createTagPlaceholder(index: number) {\n return `${TAG_PLACEHOLDER_PREFIX}${index}${TAG_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction isTableContent(content: BlockNoteContent | undefined): content is BlockNoteTableContent {\n return !Array.isArray(content) && content?.type === 'tableContent';\n}\n\nfunction mapBlockContent(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => BlockNoteInline,\n): BlockNoteContent | undefined {\n if (Array.isArray(content)) {\n return content.map(mapInline);\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: content.rows?.map((row) => ({\n ...row,\n cells: row.cells?.map((cell) => ({\n ...cell,\n content: cell.content?.map(mapInline),\n })),\n })),\n };\n}\n\nasync function mapBlockContentAsync(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => Promise<BlockNoteInline[]>,\n): Promise<BlockNoteContent | undefined> {\n if (Array.isArray(content)) {\n return (await Promise.all(content.map(mapInline))).flat();\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: await Promise.all(\n (content.rows ?? []).map(async (row) => ({\n ...row,\n cells: await Promise.all(\n (row.cells ?? []).map(async (cell) => ({\n ...cell,\n content: cell.content ? (await Promise.all(cell.content.map(mapInline))).flat() : cell.content,\n })),\n ),\n })),\n ),\n };\n}\n\nfunction visitBlockContent(content: BlockNoteContent | undefined, visitInline: (inline: BlockNoteInline) => void) {\n if (Array.isArray(content)) {\n for (const inline of content) {\n visitInline(inline);\n }\n return;\n }\n\n if (!isTableContent(content)) {\n return;\n }\n\n for (const row of content.rows ?? []) {\n for (const cell of row.cells ?? []) {\n for (const inline of cell.content ?? []) {\n visitInline(inline);\n }\n }\n }\n}\n\nfunction mapBlocks(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => BlockNoteContent | undefined,\n): BlockNote[] {\n return blocks.map((block) => ({\n ...block,\n content: mapContent(block.content),\n children: block.children?.length ? mapBlocks(block.children, mapContent) : [],\n }));\n}\n\nasync function mapBlocksAsync(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => Promise<BlockNoteContent | undefined>,\n): Promise<BlockNote[]> {\n return Promise.all(\n blocks.map(async (block) => ({\n ...block,\n content: await mapContent(block.content),\n children: block.children?.length ? await mapBlocksAsync(block.children, mapContent) : [],\n })),\n );\n}\n\nfunction preprocessCustomInlineContent(\n blocks: BlockNote[],\n placeholderToTag: Map<string, string>,\n nextPlaceholderIndex: { value: number },\n): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type === 'reference') {\n return {\n type: 'text',\n text: `[[${inline.props?.title || inline.props?.id || ''}]]`,\n styles: {},\n };\n }\n if (inline.type === 'tag') {\n const tag = (inline.props?.tag as string) || '';\n const placeholder = createTagPlaceholder(nextPlaceholderIndex.value++);\n placeholderToTag.set(placeholder, tag);\n return {\n type: 'text',\n text: placeholder,\n styles: {},\n };\n }\n return inline;\n }),\n );\n}\n\nfunction restoreTagPlaceholdersInMarkdown(markdown: string, placeholderToTag: Map<string, string>) {\n let restoredMarkdown = markdown;\n\n for (const [placeholder, tag] of placeholderToTag.entries()) {\n restoredMarkdown = restoredMarkdown.split(placeholder).join(`[${tag}]`);\n }\n\n return restoredMarkdown;\n}\n\nfunction preprocessMarkdownExplicitTags(markdown: string) {\n const placeholderToTag = new Map<string, string>();\n let nextPlaceholderIndex = 0;\n const preprocessedMarkdown = markdown.replace(/\\[([@#][^\\s[\\]]+)\\]/g, (_match, tagToken: string) => {\n const placeholder = createTagPlaceholder(nextPlaceholderIndex++);\n placeholderToTag.set(placeholder, tagToken);\n return placeholder;\n });\n\n return {\n markdown: preprocessedMarkdown,\n placeholderToTag,\n };\n}\n\nconst MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\\n]+)>/g;\nconst MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\\d)~(?=\\d)/g;\nconst MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;\nconst ANGLE_BRACKET_PLACEHOLDER_PREFIX = '\\uE000OBANGLE';\nconst ANGLE_BRACKET_PLACEHOLDER_SUFFIX = '\\uE001';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = '\\uE000OBTILDE';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = '\\uE001';\n\nfunction isMarkdownAutolinkAngleBracketText(innerText: string) {\n if (innerText !== innerText.trim()) {\n return false;\n }\n\n return /^[a-z][a-z0-9.+-]{1,31}:[^\\s<>]*$/i.test(innerText) || /^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(innerText);\n}\n\nfunction countLiteralAngleBracketTextTokens(markdown: string) {\n const tokenCounts = new Map<string, number>();\n\n for (const match of markdown.matchAll(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN)) {\n const token = match[0];\n const innerText = match[1] ?? '';\n\n if (!token || isMarkdownAutolinkAngleBracketText(innerText)) {\n continue;\n }\n\n tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1);\n }\n\n return tokenCounts;\n}\n\nexport function extractLiteralAngleBracketTextTokens(markdown: string) {\n return [...countLiteralAngleBracketTextTokens(markdown).keys()];\n}\n\nexport function hasLiteralAngleBracketTextTokenLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCounts = countLiteralAngleBracketTextTokens(sourceMarkdown);\n\n if (sourceCounts.size === 0) {\n return false;\n }\n\n const renderedCounts = countLiteralAngleBracketTextTokens(renderedMarkdown);\n\n for (const [token, sourceCount] of sourceCounts) {\n if ((renderedCounts.get(token) ?? 0) < sourceCount) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction countNumericTildeRangeMarkers(markdown: string) {\n return [...markdown.matchAll(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN)].length;\n}\n\nexport function hasNumericTildeRangeMarkers(markdown: string) {\n return countNumericTildeRangeMarkers(markdown) > 0;\n}\n\nexport function hasNumericTildeRangeMarkerLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCount = countNumericTildeRangeMarkers(sourceMarkdown);\n\n return sourceCount > 0 && countNumericTildeRangeMarkers(renderedMarkdown) < sourceCount;\n}\n\nfunction protectMarkdownNumericTildeRanges(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownTextAngleBrackets(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction splitMarkdownLineEnding(line: string) {\n if (line.endsWith('\\r\\n')) {\n return {\n body: line.slice(0, -2),\n lineEnding: '\\r\\n',\n };\n }\n\n if (line.endsWith('\\n')) {\n return {\n body: line.slice(0, -1),\n lineEnding: '\\n',\n };\n }\n\n return {\n body: line,\n lineEnding: '',\n };\n}\n\nfunction isClosingFenceLine(line: string, fence: { marker: '`' | '~'; length: number }) {\n const escapedMarker = fence.marker === '`' ? '`' : '~';\n return new RegExp(`^ {0,3}${escapedMarker}{${fence.length},} *$`).test(line);\n}\n\nfunction protectMarkdownLineTextAngleBrackets(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor, codeStart), placeholderToToken);\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(codeStart), placeholderToToken);\n break;\n }\n\n const codeEndExclusive = codeEnd + delimiterLength;\n result += line.slice(codeStart, codeEndExclusive);\n cursor = codeEndExclusive;\n }\n\n return result;\n}\n\nfunction protectMarkdownLineNumericTildeRanges(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const protectedSpan = findNextMarkdownProtectedSpan(line, cursor);\n\n if (!protectedSpan) {\n result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceNumericTildeRangeMarkers(line.slice(cursor, protectedSpan.start), placeholderToToken);\n result += line.slice(protectedSpan.start, protectedSpan.end);\n cursor = protectedSpan.end;\n }\n\n return result;\n}\n\nfunction findNextMarkdownProtectedSpan(line: string, cursor: number) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n const linkDestinationSpan = findNextMarkdownLinkDestinationSpan(line, cursor);\n\n if (!codeSpan) {\n return linkDestinationSpan;\n }\n\n if (!linkDestinationSpan) {\n return codeSpan;\n }\n\n return codeSpan.start <= linkDestinationSpan.start ? codeSpan : linkDestinationSpan;\n}\n\nfunction findNextInlineCodeSpan(line: string, cursor: number) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n return null;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n return null;\n }\n\n return {\n start: codeStart,\n end: codeEnd + delimiterLength,\n };\n}\n\nfunction findNextMarkdownLinkDestinationSpan(line: string, cursor: number) {\n const linkDestinationPrefix = line.indexOf('](', cursor);\n\n if (linkDestinationPrefix === -1) {\n return null;\n }\n\n const destinationStart = linkDestinationPrefix + 2;\n const destinationEnd = line.indexOf(')', destinationStart);\n\n if (destinationEnd === -1) {\n return null;\n }\n\n return {\n start: destinationStart,\n end: destinationEnd,\n };\n}\n\nfunction replaceLiteralAngleBracketTextTokens(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN, (match, innerText: string) => {\n if (isMarkdownAutolinkAngleBracketText(innerText)) {\n return match;\n }\n\n const placeholder = createAngleBracketPlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, match);\n\n return placeholder;\n });\n}\n\nfunction replaceNumericTildeRangeMarkers(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN, (match, leadingDigit: string) => {\n const placeholder = createNumericTildeRangePlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, '~');\n\n return `${leadingDigit}${placeholder}`;\n });\n}\n\nfunction createAngleBracketPlaceholder(index: number) {\n return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createNumericTildeRangePlaceholder(index: number) {\n return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction countRepeatedCharacter(value: string, start: number, character: string) {\n let cursor = start;\n\n while (value[cursor] === character) {\n cursor += 1;\n }\n\n return cursor - start;\n}\n\nfunction findTagPlaceholderAtCursor(text: string, cursor: number, placeholderToTag: Map<string, string>) {\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n tagToken,\n };\n }\n }\n\n return null;\n}\n\nfunction restoreRemainingTagPlaceholders(blocks: BlockNote[], placeholderToTag: Map<string, string>): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type !== 'text' || typeof inline.text !== 'string') {\n return inline;\n }\n\n let text = inline.text;\n\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n text = text.split(placeholder).join(`[${tagToken}]`);\n }\n\n return {\n ...inline,\n text,\n };\n }),\n );\n}\n\nfunction restoreProtectedTextPlaceholders(blocks: BlockNote[], placeholderToToken: Map<string, string>): BlockNote[] {\n if (placeholderToToken.size === 0) {\n return blocks;\n }\n\n return mapBlocks(blocks, (content) =>\n mapBlockContent(\n content,\n (inline) => restoreProtectedTextInValue(inline, placeholderToToken) as BlockNoteInline,\n ),\n );\n}\n\nfunction restoreProtectedTextInValue(value: unknown, placeholderToToken: Map<string, string>): unknown {\n if (typeof value === 'string') {\n return restoreProtectedText(value, placeholderToToken);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => restoreProtectedTextInValue(item, placeholderToToken));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, restoreProtectedTextInValue(item, placeholderToToken)]),\n );\n }\n\n return value;\n}\n\nfunction restoreProtectedText(text: string, placeholderToToken: Map<string, string>) {\n let restoredText = text;\n\n for (const [placeholder, token] of placeholderToToken.entries()) {\n restoredText = restoredText.split(placeholder).join(token);\n }\n\n return restoredText;\n}\n\nfunction createTextInline(text: string, styles: Record<string, unknown> = {}): BlockNoteInline {\n return {\n type: 'text',\n text,\n styles,\n };\n}\n\nfunction appendInline(target: BlockNoteInline[], inline: BlockNoteInline) {\n const previous = target.at(-1);\n\n if (\n previous?.type === 'text' &&\n inline.type === 'text' &&\n previous.text !== undefined &&\n inline.text !== undefined &&\n JSON.stringify(previous.styles ?? {}) === JSON.stringify(inline.styles ?? {})\n ) {\n previous.text += inline.text;\n return;\n }\n\n target.push(inline);\n}\n\nasync function restoreCustomInlineContent(\n blocks: BlockNote[],\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n): Promise<BlockNote[]> {\n const tagCache = new Map<string, Promise<{ id: string; tag: string }>>();\n const noteCache = new Map<string, Promise<Array<{ id: string; title: string }>>>();\n\n const getTag = (token: string) => {\n const normalizedToken = token.startsWith('#') ? `@${token.slice(1)}` : token;\n let existing = tagCache.get(normalizedToken);\n\n if (!existing) {\n existing = deps.ensureTag(normalizedToken.slice(1)).then((result) => ({\n id: 'tag' in result ? result.tag.id : result.id,\n tag: 'tag' in result ? result.tag.name : result.name,\n }));\n tagCache.set(normalizedToken, existing);\n }\n\n return existing;\n };\n\n const getNotesByTitle = (title: string) => {\n let existing = noteCache.get(title);\n\n if (!existing) {\n existing = deps.findNotesByTitle(title);\n noteCache.set(title, existing);\n }\n\n return existing;\n };\n\n const restoreTextInline = async (inline: BlockNoteInline): Promise<BlockNoteInline[]> => {\n if (inline.type !== 'text' || typeof inline.text !== 'string' || !inline.text || inline.styles?.code === true) {\n return [inline];\n }\n\n const restored: BlockNoteInline[] = [];\n const styles = inline.styles ?? {};\n let cursor = 0;\n\n while (cursor < inline.text.length) {\n if (inline.text.startsWith('[[', cursor)) {\n const closeIndex = inline.text.indexOf(']]', cursor + 2);\n\n if (closeIndex !== -1) {\n const title = inline.text.slice(cursor + 2, closeIndex);\n const matchingNotes = await getNotesByTitle(title);\n\n if (matchingNotes.length === 1) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: matchingNotes[0].id,\n title: matchingNotes[0].title,\n },\n });\n cursor = closeIndex + 2;\n continue;\n }\n }\n }\n\n const tagPlaceholderMatch = findTagPlaceholderAtCursor(inline.text, cursor, placeholderToTag);\n\n if (tagPlaceholderMatch) {\n const tag = await getTag(tagPlaceholderMatch.tagToken);\n appendInline(restored, {\n type: 'tag',\n props: tag,\n });\n cursor += tagPlaceholderMatch.placeholder.length;\n continue;\n }\n\n let nextCursor = inline.text.length;\n\n const nextReferenceCursor = inline.text.indexOf('[[', cursor + 1);\n\n if (nextReferenceCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextReferenceCursor);\n }\n\n for (const placeholder of placeholderToTag.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n appendInline(restored, createTextInline(inline.text.slice(cursor, nextCursor), styles));\n cursor = nextCursor;\n }\n\n return restored;\n };\n\n return mapBlocksAsync(blocks, (content) => mapBlockContentAsync(content, restoreTextInline));\n}\n\nfunction collectTagIds(blocks: BlockNote[]): string[] {\n const tagIds = new Set<string>();\n\n const visit = (items: BlockNote[]) => {\n for (const block of items) {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'tag' && typeof inline.props?.id === 'string') {\n tagIds.add(inline.props.id);\n }\n });\n\n if (block.children?.length) {\n visit(block.children);\n }\n }\n };\n\n visit(blocks);\n return [...tagIds];\n}\n\nlet editorInstance: ServerBlockNoteEditor | null = null;\n\nfunction getEditor(): ServerBlockNoteEditor {\n if (!editorInstance) {\n editorInstance = ServerBlockNoteEditor.create();\n }\n return editorInstance;\n}\n\nexport async function blocksToMarkdown(contentJson: string): Promise<string> {\n try {\n const blocks = parseBlockNoteContent(contentJson);\n const supportedBlocks = stripUnsupportedMarkdownBlocks(blocks);\n const placeholderToTag = new Map<string, string>();\n const processed = preprocessCustomInlineContent(supportedBlocks, placeholderToTag, { value: 0 });\n const editor = getEditor();\n const markdown = await editor.blocksToMarkdownLossy(\n processed as Parameters<typeof editor.blocksToMarkdownLossy>[0],\n );\n return restoreTagPlaceholdersInMarkdown(markdown, placeholderToTag);\n } catch {\n return '';\n }\n}\n\nexport async function markdownToBlocksJson(\n markdown: string,\n deps: MarkdownImportDeps = defaultMarkdownImportDeps,\n): Promise<string> {\n const editor = getEditor();\n const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);\n const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedMarkdown.markdown);\n const contentJson = await parseMarkdownToContentJson(\n editor,\n tildeProtectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n tildeProtectedMarkdown.placeholderToToken,\n );\n\n if (extractLiteralAngleBracketTextTokens(preprocessedMarkdown.markdown).length === 0) {\n return contentJson;\n }\n\n if (!hasLiteralAngleBracketTextTokenLoss(preprocessedMarkdown.markdown, await blocksToMarkdown(contentJson))) {\n return contentJson;\n }\n\n const protectedMarkdown = protectMarkdownTextAngleBrackets(tildeProtectedMarkdown.markdown);\n const placeholderToToken = new Map([\n ...tildeProtectedMarkdown.placeholderToToken,\n ...protectedMarkdown.placeholderToToken,\n ]);\n\n return parseMarkdownToContentJson(\n editor,\n protectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n placeholderToToken,\n );\n}\n\nasync function parseMarkdownToContentJson(\n editor: ServerBlockNoteEditor,\n markdown: string,\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToProtectedTextToken: Map<string, string> = new Map(),\n) {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n const restoredBlocks = await restoreCustomInlineContent(blocks as BlockNote[], deps, placeholderToTag);\n const restoredTagBlocks = restoreRemainingTagPlaceholders(restoredBlocks, placeholderToTag);\n const restoredProtectedTextBlocks = restoreProtectedTextPlaceholders(\n restoredTagBlocks,\n placeholderToProtectedTextToken,\n );\n\n return JSON.stringify(restoredProtectedTextBlocks);\n}\n\nexport function extractTagIdsFromContentJson(contentJson: string): string[] {\n const blocks = parseBlockNoteContent(contentJson);\n return collectTagIds(blocks);\n}\n\nexport function hasUnsupportedMarkdownBlocks(contentJson: string): boolean {\n try {\n let hasUnsupportedBlock = false;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n if (UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type)) {\n hasUnsupportedBlock = true;\n }\n });\n\n return hasUnsupportedBlock;\n } catch {\n return false;\n }\n}\n\nexport function countReferenceInlinesFromContentJson(contentJson: string): number {\n try {\n let count = 0;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'reference') {\n count += 1;\n }\n });\n });\n\n return count;\n } catch {\n return 0;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/modules/blocknote.ts"],"sourcesContent":["import { ServerBlockNoteEditor } from '@blocknote/server-util';\nimport { ensureTagByName } from '~/features/tag/services/organization.js';\nimport models from '~/models.js';\n\ninterface BlockNote {\n id?: string;\n type: string;\n props?: Record<string, unknown>;\n content?: BlockNoteContent;\n children?: BlockNote[];\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteInline {\n type: string;\n props?: Record<string, unknown>;\n text?: string;\n styles?: Record<string, unknown>;\n}\n\ninterface BlockNoteTableCell {\n type: 'tableCell';\n props?: Record<string, unknown>;\n content?: BlockNoteInline[];\n}\n\ninterface BlockNoteTableRow {\n cells?: BlockNoteTableCell[];\n}\n\ninterface BlockNoteTableContent {\n type: 'tableContent';\n columnWidths?: Array<number | null>;\n headerRows?: number;\n rows?: BlockNoteTableRow[];\n}\n\ntype BlockNoteContent = BlockNoteInline[] | BlockNoteTableContent;\n\ninterface MarkdownImportDeps {\n ensureTag: (name: string) => Promise<\n | {\n id: string;\n name: string;\n }\n | {\n tag: {\n id: string;\n name: string;\n };\n }\n >;\n findNotesByTitle: (title: string) => Promise<\n Array<{\n id: string;\n title: string;\n }>\n >;\n}\n\nconst UNSUPPORTED_MARKDOWN_BLOCK_TYPES = new Set(['tableOfContents']);\nconst TAG_PLACEHOLDER_PREFIX = 'OCEAN_BRAIN_TAG_';\nconst TAG_PLACEHOLDER_SUFFIX = '_TOKEN';\n\nconst defaultMarkdownImportDeps: MarkdownImportDeps = {\n ensureTag: async (name) => ensureTagByName(name),\n findNotesByTitle: async (title) => {\n const notes = await models.note.findMany({\n select: {\n id: true,\n title: true,\n },\n where: { title },\n orderBy: { createdAt: 'asc' },\n take: 2,\n });\n\n return notes.map((note) => ({\n id: String(note.id),\n title: note.title,\n }));\n },\n};\n\nfunction stripUnsupportedMarkdownBlocks(blocks: BlockNote[]): BlockNote[] {\n return blocks\n .filter((block) => !UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type))\n .map((block) => ({\n ...block,\n children: block.children?.length ? stripUnsupportedMarkdownBlocks(block.children) : [],\n }));\n}\n\nfunction parseBlockNoteContent(contentJson: string): BlockNote[] {\n const parsed = JSON.parse(contentJson);\n\n if (!Array.isArray(parsed)) {\n throw new Error('INVALID_BLOCKNOTE_CONTENT');\n }\n\n return parsed;\n}\n\nfunction visitBlocks(blocks: BlockNote[], visit: (block: BlockNote) => void) {\n for (const block of blocks) {\n visit(block);\n\n if (block.children?.length) {\n visitBlocks(block.children, visit);\n }\n }\n}\n\nfunction createTagPlaceholder(index: number) {\n return `${TAG_PLACEHOLDER_PREFIX}${index}${TAG_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction isTableContent(content: BlockNoteContent | undefined): content is BlockNoteTableContent {\n return !Array.isArray(content) && content?.type === 'tableContent';\n}\n\nfunction mapBlockContent(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => BlockNoteInline,\n): BlockNoteContent | undefined {\n if (Array.isArray(content)) {\n return content.map(mapInline);\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: content.rows?.map((row) => ({\n ...row,\n cells: row.cells?.map((cell) => ({\n ...cell,\n content: cell.content?.map(mapInline),\n })),\n })),\n };\n}\n\nasync function mapBlockContentAsync(\n content: BlockNoteContent | undefined,\n mapInline: (inline: BlockNoteInline) => Promise<BlockNoteInline[]>,\n): Promise<BlockNoteContent | undefined> {\n if (Array.isArray(content)) {\n return (await Promise.all(content.map(mapInline))).flat();\n }\n\n if (!isTableContent(content)) {\n return content;\n }\n\n return {\n ...content,\n rows: await Promise.all(\n (content.rows ?? []).map(async (row) => ({\n ...row,\n cells: await Promise.all(\n (row.cells ?? []).map(async (cell) => ({\n ...cell,\n content: cell.content ? (await Promise.all(cell.content.map(mapInline))).flat() : cell.content,\n })),\n ),\n })),\n ),\n };\n}\n\nfunction visitBlockContent(content: BlockNoteContent | undefined, visitInline: (inline: BlockNoteInline) => void) {\n if (Array.isArray(content)) {\n for (const inline of content) {\n visitInline(inline);\n }\n return;\n }\n\n if (!isTableContent(content)) {\n return;\n }\n\n for (const row of content.rows ?? []) {\n for (const cell of row.cells ?? []) {\n for (const inline of cell.content ?? []) {\n visitInline(inline);\n }\n }\n }\n}\n\nfunction mapBlocks(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => BlockNoteContent | undefined,\n): BlockNote[] {\n return blocks.map((block) => ({\n ...block,\n content: mapContent(block.content),\n children: block.children?.length ? mapBlocks(block.children, mapContent) : [],\n }));\n}\n\nasync function mapBlocksAsync(\n blocks: BlockNote[],\n mapContent: (content: BlockNoteContent | undefined) => Promise<BlockNoteContent | undefined>,\n): Promise<BlockNote[]> {\n return Promise.all(\n blocks.map(async (block) => ({\n ...block,\n content: await mapContent(block.content),\n children: block.children?.length ? await mapBlocksAsync(block.children, mapContent) : [],\n })),\n );\n}\n\nfunction preprocessCustomInlineContent(\n blocks: BlockNote[],\n placeholderToTag: Map<string, string>,\n nextPlaceholderIndex: { value: number },\n): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type === 'reference') {\n return {\n type: 'text',\n text: `[[${inline.props?.title || inline.props?.id || ''}]]`,\n styles: {},\n };\n }\n if (inline.type === 'tag') {\n const tag = (inline.props?.tag as string) || '';\n const placeholder = createTagPlaceholder(nextPlaceholderIndex.value++);\n placeholderToTag.set(placeholder, tag);\n return {\n type: 'text',\n text: placeholder,\n styles: {},\n };\n }\n return inline;\n }),\n );\n}\n\nfunction restoreTagPlaceholdersInMarkdown(markdown: string, placeholderToTag: Map<string, string>) {\n let restoredMarkdown = markdown;\n\n for (const [placeholder, tag] of placeholderToTag.entries()) {\n restoredMarkdown = restoredMarkdown.split(placeholder).join(`[${tag}]`);\n }\n\n return restoredMarkdown;\n}\n\nfunction preprocessMarkdownExplicitTags(markdown: string) {\n const placeholderToTag = new Map<string, string>();\n let nextPlaceholderIndex = 0;\n const preprocessedMarkdown = markdown.replace(/\\[([@#][^\\s[\\]]+)\\]/g, (_match, tagToken: string) => {\n const placeholder = createTagPlaceholder(nextPlaceholderIndex++);\n placeholderToTag.set(placeholder, tagToken);\n return placeholder;\n });\n\n return {\n markdown: preprocessedMarkdown,\n placeholderToTag,\n };\n}\n\nconst MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN = /<([^<>\\n]+)>/g;\nconst MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN = /(\\d)~(?=\\d)/g;\nconst MARKDOWN_FENCED_CODE_PATTERN = /^ {0,3}(`{3,}|~{3,})/;\nconst ANGLE_BRACKET_PLACEHOLDER_PREFIX = '\\uE000OBANGLE';\nconst ANGLE_BRACKET_PLACEHOLDER_SUFFIX = '\\uE001';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX = '\\uE000OBTILDE';\nconst NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX = '\\uE001';\nconst HARD_BREAK_PLACEHOLDER_PREFIX = '\\uE000OBHARDBREAK';\nconst HARD_BREAK_PLACEHOLDER_SUFFIX = '\\uE001';\n\nfunction isMarkdownAutolinkAngleBracketText(innerText: string) {\n if (innerText !== innerText.trim()) {\n return false;\n }\n\n return /^[a-z][a-z0-9.+-]{1,31}:[^\\s<>]*$/i.test(innerText) || /^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$/.test(innerText);\n}\n\nfunction countLiteralAngleBracketTextTokens(markdown: string) {\n const tokenCounts = new Map<string, number>();\n\n for (const match of markdown.matchAll(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN)) {\n const token = match[0];\n const innerText = match[1] ?? '';\n\n if (!token || isMarkdownAutolinkAngleBracketText(innerText)) {\n continue;\n }\n\n tokenCounts.set(token, (tokenCounts.get(token) ?? 0) + 1);\n }\n\n return tokenCounts;\n}\n\nexport function extractLiteralAngleBracketTextTokens(markdown: string) {\n return [...countLiteralAngleBracketTextTokens(markdown).keys()];\n}\n\nexport function hasLiteralAngleBracketTextTokenLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCounts = countLiteralAngleBracketTextTokens(sourceMarkdown);\n\n if (sourceCounts.size === 0) {\n return false;\n }\n\n const renderedCounts = countLiteralAngleBracketTextTokens(renderedMarkdown);\n\n for (const [token, sourceCount] of sourceCounts) {\n if ((renderedCounts.get(token) ?? 0) < sourceCount) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction countNumericTildeRangeMarkers(markdown: string) {\n return [...markdown.matchAll(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN)].length;\n}\n\nexport function hasNumericTildeRangeMarkers(markdown: string) {\n return countNumericTildeRangeMarkers(markdown) > 0;\n}\n\nexport function hasNumericTildeRangeMarkerLoss(sourceMarkdown: string, renderedMarkdown: string) {\n const sourceCount = countNumericTildeRangeMarkers(sourceMarkdown);\n\n return sourceCount > 0 && countNumericTildeRangeMarkers(renderedMarkdown) < sourceCount;\n}\n\nfunction protectMarkdownNumericTildeRanges(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineNumericTildeRanges(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownLineEndHardBreakMarkers(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n const lines = markdown.split(/(?<=\\n)/);\n\n for (const [index, line] of lines.entries()) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n const nextLineBody = splitMarkdownLineEnding(lines[index + 1] ?? '').body;\n protectedLines.push(\n `${protectMarkdownLineEndHardBreakMarker(\n lineBody,\n lineEnding,\n isMarkdownHardBreakContinuationLine(nextLineBody),\n placeholderToToken,\n )}${lineEnding}`,\n );\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction protectMarkdownTextAngleBrackets(markdown: string) {\n const protectedLines: string[] = [];\n const placeholderToToken = new Map<string, string>();\n let activeFence: { marker: '`' | '~'; length: number } | null = null;\n\n for (const line of markdown.split(/(?<=\\n)/)) {\n const { body: lineBody, lineEnding } = splitMarkdownLineEnding(line);\n const fenceMatch = lineBody.match(MARKDOWN_FENCED_CODE_PATTERN);\n\n if (activeFence) {\n protectedLines.push(line);\n\n if (isClosingFenceLine(lineBody, activeFence)) {\n activeFence = null;\n }\n\n continue;\n }\n\n if (fenceMatch?.[1]) {\n const marker = fenceMatch[1][0] as '`' | '~';\n activeFence = {\n marker,\n length: fenceMatch[1].length,\n };\n protectedLines.push(line);\n continue;\n }\n\n if (/^(?: {4,}|\\t)/.test(lineBody)) {\n protectedLines.push(line);\n continue;\n }\n\n protectedLines.push(`${protectMarkdownLineTextAngleBrackets(lineBody, placeholderToToken)}${lineEnding}`);\n }\n\n return {\n markdown: protectedLines.join(''),\n placeholderToToken,\n };\n}\n\nfunction splitMarkdownLineEnding(line: string) {\n if (line.endsWith('\\r\\n')) {\n return {\n body: line.slice(0, -2),\n lineEnding: '\\r\\n',\n };\n }\n\n if (line.endsWith('\\n')) {\n return {\n body: line.slice(0, -1),\n lineEnding: '\\n',\n };\n }\n\n return {\n body: line,\n lineEnding: '',\n };\n}\n\nfunction isClosingFenceLine(line: string, fence: { marker: '`' | '~'; length: number }) {\n const escapedMarker = fence.marker === '`' ? '`' : '~';\n return new RegExp(`^ {0,3}${escapedMarker}{${fence.length},} *$`).test(line);\n}\n\nfunction protectMarkdownLineTextAngleBrackets(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceLiteralAngleBracketTextTokens(line.slice(cursor, codeStart), placeholderToToken);\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n result += replaceLiteralAngleBracketTextTokens(line.slice(codeStart), placeholderToToken);\n break;\n }\n\n const codeEndExclusive = codeEnd + delimiterLength;\n result += line.slice(codeStart, codeEndExclusive);\n cursor = codeEndExclusive;\n }\n\n return result;\n}\n\nfunction protectMarkdownLineNumericTildeRanges(line: string, placeholderToToken: Map<string, string>) {\n let result = '';\n let cursor = 0;\n\n while (cursor < line.length) {\n const protectedSpan = findNextMarkdownProtectedSpan(line, cursor);\n\n if (!protectedSpan) {\n result += replaceNumericTildeRangeMarkers(line.slice(cursor), placeholderToToken);\n break;\n }\n\n result += replaceNumericTildeRangeMarkers(line.slice(cursor, protectedSpan.start), placeholderToToken);\n result += line.slice(protectedSpan.start, protectedSpan.end);\n cursor = protectedSpan.end;\n }\n\n return result;\n}\n\nfunction findNextMarkdownProtectedSpan(line: string, cursor: number) {\n const codeSpan = findNextInlineCodeSpan(line, cursor);\n const linkDestinationSpan = findNextMarkdownLinkDestinationSpan(line, cursor);\n\n if (!codeSpan) {\n return linkDestinationSpan;\n }\n\n if (!linkDestinationSpan) {\n return codeSpan;\n }\n\n return codeSpan.start <= linkDestinationSpan.start ? codeSpan : linkDestinationSpan;\n}\n\nfunction findNextInlineCodeSpan(line: string, cursor: number) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n return null;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const codeEnd = line.indexOf('`'.repeat(delimiterLength), codeStart + delimiterLength);\n\n if (codeEnd === -1) {\n return null;\n }\n\n return {\n start: codeStart,\n end: codeEnd + delimiterLength,\n };\n}\n\nfunction findNextMarkdownLinkDestinationSpan(line: string, cursor: number) {\n const linkDestinationPrefix = line.indexOf('](', cursor);\n\n if (linkDestinationPrefix === -1) {\n return null;\n }\n\n const destinationStart = linkDestinationPrefix + 2;\n const destinationEnd = line.indexOf(')', destinationStart);\n\n if (destinationEnd === -1) {\n return null;\n }\n\n return {\n start: destinationStart,\n end: destinationEnd,\n };\n}\n\nfunction replaceLiteralAngleBracketTextTokens(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_ANGLE_BRACKET_TOKEN_PATTERN, (match, innerText: string) => {\n if (isMarkdownAutolinkAngleBracketText(innerText)) {\n return match;\n }\n\n const placeholder = createAngleBracketPlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, match);\n\n return placeholder;\n });\n}\n\nfunction replaceNumericTildeRangeMarkers(text: string, placeholderToToken: Map<string, string>) {\n return text.replace(MARKDOWN_NUMERIC_TILDE_RANGE_PATTERN, (match, leadingDigit: string) => {\n const placeholder = createNumericTildeRangePlaceholder(placeholderToToken.size);\n placeholderToToken.set(placeholder, '~');\n\n return `${leadingDigit}${placeholder}`;\n });\n}\n\nfunction protectMarkdownLineEndHardBreakMarker(\n line: string,\n lineEnding: string,\n hasContinuationLine: boolean,\n placeholderToToken: Map<string, string>,\n) {\n if (!lineEnding || !line.endsWith('\\\\')) {\n return line;\n }\n\n const placeholder = createHardBreakPlaceholder(placeholderToToken.size);\n const shouldPreserveAsHardBreak = hasContinuationLine && !hasUnclosedInlineCodeSpanAtLineEnd(line);\n placeholderToToken.set(placeholder, shouldPreserveAsHardBreak ? '' : '\\\\');\n\n return `${line.slice(0, -1)}${placeholder}`;\n}\n\nfunction isMarkdownHardBreakContinuationLine(line: string) {\n if (!line.trim()) {\n return false;\n }\n\n const trimmedLine = line.trimStart();\n\n if (trimmedLine.match(MARKDOWN_FENCED_CODE_PATTERN)) {\n return false;\n }\n\n if (/^(?:#{1,6})(?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^>/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:[-+*])(?:\\s|$)/.test(trimmedLine) || /^\\d{1,9}[.)](?:\\s|$)/.test(trimmedLine)) {\n return false;\n }\n\n if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/.test(trimmedLine)) {\n return false;\n }\n\n return true;\n}\n\nfunction hasUnclosedInlineCodeSpanAtLineEnd(line: string) {\n let cursor = 0;\n let openDelimiter: string | null = null;\n\n while (cursor < line.length) {\n const codeStart = line.indexOf('`', cursor);\n\n if (codeStart === -1) {\n break;\n }\n\n const delimiterLength = countRepeatedCharacter(line, codeStart, '`');\n const delimiter = '`'.repeat(delimiterLength);\n openDelimiter = openDelimiter === delimiter ? null : delimiter;\n cursor = codeStart + delimiterLength;\n }\n\n return openDelimiter !== null;\n}\n\nfunction createAngleBracketPlaceholder(index: number) {\n return `${ANGLE_BRACKET_PLACEHOLDER_PREFIX}${index}${ANGLE_BRACKET_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createNumericTildeRangePlaceholder(index: number) {\n return `${NUMERIC_TILDE_RANGE_PLACEHOLDER_PREFIX}${index}${NUMERIC_TILDE_RANGE_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction createHardBreakPlaceholder(index: number) {\n return `${HARD_BREAK_PLACEHOLDER_PREFIX}${index}${HARD_BREAK_PLACEHOLDER_SUFFIX}`;\n}\n\nfunction countRepeatedCharacter(value: string, start: number, character: string) {\n let cursor = start;\n\n while (value[cursor] === character) {\n cursor += 1;\n }\n\n return cursor - start;\n}\n\nfunction findTagPlaceholderAtCursor(text: string, cursor: number, placeholderToTag: Map<string, string>) {\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n if (text.startsWith(placeholder, cursor)) {\n return {\n placeholder,\n tagToken,\n };\n }\n }\n\n return null;\n}\n\nfunction restoreRemainingTagPlaceholders(blocks: BlockNote[], placeholderToTag: Map<string, string>): BlockNote[] {\n return mapBlocks(blocks, (content) =>\n mapBlockContent(content, (inline) => {\n if (inline.type !== 'text' || typeof inline.text !== 'string') {\n return inline;\n }\n\n let text = inline.text;\n\n for (const [placeholder, tagToken] of placeholderToTag.entries()) {\n text = text.split(placeholder).join(`[${tagToken}]`);\n }\n\n return {\n ...inline,\n text,\n };\n }),\n );\n}\n\nfunction restoreProtectedTextPlaceholders(blocks: BlockNote[], placeholderToToken: Map<string, string>): BlockNote[] {\n if (placeholderToToken.size === 0) {\n return blocks;\n }\n\n return mapBlocks(blocks, (content) =>\n mapBlockContent(\n content,\n (inline) => restoreProtectedTextInValue(inline, placeholderToToken) as BlockNoteInline,\n ),\n );\n}\n\nfunction restoreProtectedTextInValue(value: unknown, placeholderToToken: Map<string, string>): unknown {\n if (typeof value === 'string') {\n return restoreProtectedText(value, placeholderToToken);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => restoreProtectedTextInValue(item, placeholderToToken));\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, restoreProtectedTextInValue(item, placeholderToToken)]),\n );\n }\n\n return value;\n}\n\nfunction restoreProtectedText(text: string, placeholderToToken: Map<string, string>) {\n let restoredText = text;\n\n for (const [placeholder, token] of placeholderToToken.entries()) {\n restoredText = restoredText.split(placeholder).join(token);\n }\n\n return restoredText;\n}\n\nfunction createTextInline(text: string, styles: Record<string, unknown> = {}): BlockNoteInline {\n return {\n type: 'text',\n text,\n styles,\n };\n}\n\nfunction appendInline(target: BlockNoteInline[], inline: BlockNoteInline) {\n const previous = target.at(-1);\n\n if (\n previous?.type === 'text' &&\n inline.type === 'text' &&\n previous.text !== undefined &&\n inline.text !== undefined &&\n JSON.stringify(previous.styles ?? {}) === JSON.stringify(inline.styles ?? {})\n ) {\n previous.text += inline.text;\n return;\n }\n\n target.push(inline);\n}\n\nasync function restoreCustomInlineContent(\n blocks: BlockNote[],\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n): Promise<BlockNote[]> {\n const tagCache = new Map<string, Promise<{ id: string; tag: string }>>();\n const noteCache = new Map<string, Promise<Array<{ id: string; title: string }>>>();\n\n const getTag = (token: string) => {\n const normalizedToken = token.startsWith('#') ? `@${token.slice(1)}` : token;\n let existing = tagCache.get(normalizedToken);\n\n if (!existing) {\n existing = deps.ensureTag(normalizedToken.slice(1)).then((result) => ({\n id: 'tag' in result ? result.tag.id : result.id,\n tag: 'tag' in result ? result.tag.name : result.name,\n }));\n tagCache.set(normalizedToken, existing);\n }\n\n return existing;\n };\n\n const getNotesByTitle = (title: string) => {\n let existing = noteCache.get(title);\n\n if (!existing) {\n existing = deps.findNotesByTitle(title);\n noteCache.set(title, existing);\n }\n\n return existing;\n };\n\n const restoreTextInline = async (inline: BlockNoteInline): Promise<BlockNoteInline[]> => {\n if (inline.type !== 'text' || typeof inline.text !== 'string' || !inline.text || inline.styles?.code === true) {\n return [inline];\n }\n\n const restored: BlockNoteInline[] = [];\n const styles = inline.styles ?? {};\n let cursor = 0;\n\n while (cursor < inline.text.length) {\n if (inline.text.startsWith('[[', cursor)) {\n const closeIndex = inline.text.indexOf(']]', cursor + 2);\n\n if (closeIndex !== -1) {\n const title = inline.text.slice(cursor + 2, closeIndex);\n const matchingNotes = await getNotesByTitle(title);\n\n if (matchingNotes.length === 1) {\n appendInline(restored, {\n type: 'reference',\n props: {\n id: matchingNotes[0].id,\n title: matchingNotes[0].title,\n },\n });\n cursor = closeIndex + 2;\n continue;\n }\n }\n }\n\n const tagPlaceholderMatch = findTagPlaceholderAtCursor(inline.text, cursor, placeholderToTag);\n\n if (tagPlaceholderMatch) {\n const tag = await getTag(tagPlaceholderMatch.tagToken);\n appendInline(restored, {\n type: 'tag',\n props: tag,\n });\n cursor += tagPlaceholderMatch.placeholder.length;\n continue;\n }\n\n let nextCursor = inline.text.length;\n\n const nextReferenceCursor = inline.text.indexOf('[[', cursor + 1);\n\n if (nextReferenceCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextReferenceCursor);\n }\n\n for (const placeholder of placeholderToTag.keys()) {\n const nextPlaceholderCursor = inline.text.indexOf(placeholder, cursor + 1);\n\n if (nextPlaceholderCursor !== -1) {\n nextCursor = Math.min(nextCursor, nextPlaceholderCursor);\n }\n }\n\n appendInline(restored, createTextInline(inline.text.slice(cursor, nextCursor), styles));\n cursor = nextCursor;\n }\n\n return restored;\n };\n\n return mapBlocksAsync(blocks, (content) => mapBlockContentAsync(content, restoreTextInline));\n}\n\nfunction collectTagIds(blocks: BlockNote[]): string[] {\n const tagIds = new Set<string>();\n\n const visit = (items: BlockNote[]) => {\n for (const block of items) {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'tag' && typeof inline.props?.id === 'string') {\n tagIds.add(inline.props.id);\n }\n });\n\n if (block.children?.length) {\n visit(block.children);\n }\n }\n };\n\n visit(blocks);\n return [...tagIds];\n}\n\nlet editorInstance: ServerBlockNoteEditor | null = null;\n\nfunction getEditor(): ServerBlockNoteEditor {\n if (!editorInstance) {\n editorInstance = ServerBlockNoteEditor.create();\n }\n return editorInstance;\n}\n\nexport async function blocksToMarkdown(contentJson: string): Promise<string> {\n try {\n const blocks = parseBlockNoteContent(contentJson);\n const supportedBlocks = stripUnsupportedMarkdownBlocks(blocks);\n const placeholderToTag = new Map<string, string>();\n const processed = preprocessCustomInlineContent(supportedBlocks, placeholderToTag, { value: 0 });\n const editor = getEditor();\n const markdown = await editor.blocksToMarkdownLossy(\n processed as Parameters<typeof editor.blocksToMarkdownLossy>[0],\n );\n return restoreTagPlaceholdersInMarkdown(markdown, placeholderToTag);\n } catch {\n return '';\n }\n}\n\nexport async function markdownToBlocksJson(\n markdown: string,\n deps: MarkdownImportDeps = defaultMarkdownImportDeps,\n): Promise<string> {\n const editor = getEditor();\n const preprocessedMarkdown = preprocessMarkdownExplicitTags(markdown);\n const tildeProtectedMarkdown = protectMarkdownNumericTildeRanges(preprocessedMarkdown.markdown);\n const hardBreakProtectedMarkdown = protectMarkdownLineEndHardBreakMarkers(tildeProtectedMarkdown.markdown);\n const basePlaceholderToToken = new Map([\n ...tildeProtectedMarkdown.placeholderToToken,\n ...hardBreakProtectedMarkdown.placeholderToToken,\n ]);\n const contentJson = await parseMarkdownToContentJson(\n editor,\n hardBreakProtectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n basePlaceholderToToken,\n );\n\n if (extractLiteralAngleBracketTextTokens(preprocessedMarkdown.markdown).length === 0) {\n return contentJson;\n }\n\n if (!hasLiteralAngleBracketTextTokenLoss(preprocessedMarkdown.markdown, await blocksToMarkdown(contentJson))) {\n return contentJson;\n }\n\n const protectedMarkdown = protectMarkdownTextAngleBrackets(hardBreakProtectedMarkdown.markdown);\n const placeholderToToken = new Map([...basePlaceholderToToken, ...protectedMarkdown.placeholderToToken]);\n\n return parseMarkdownToContentJson(\n editor,\n protectedMarkdown.markdown,\n deps,\n preprocessedMarkdown.placeholderToTag,\n placeholderToToken,\n );\n}\n\nasync function parseMarkdownToContentJson(\n editor: ServerBlockNoteEditor,\n markdown: string,\n deps: MarkdownImportDeps,\n placeholderToTag: Map<string, string>,\n placeholderToProtectedTextToken: Map<string, string> = new Map(),\n) {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n const restoredBlocks = await restoreCustomInlineContent(blocks as BlockNote[], deps, placeholderToTag);\n const restoredTagBlocks = restoreRemainingTagPlaceholders(restoredBlocks, placeholderToTag);\n const restoredProtectedTextBlocks = restoreProtectedTextPlaceholders(\n restoredTagBlocks,\n placeholderToProtectedTextToken,\n );\n\n return JSON.stringify(restoredProtectedTextBlocks);\n}\n\nexport function extractTagIdsFromContentJson(contentJson: string): string[] {\n const blocks = parseBlockNoteContent(contentJson);\n return collectTagIds(blocks);\n}\n\nexport function hasUnsupportedMarkdownBlocks(contentJson: string): boolean {\n try {\n let hasUnsupportedBlock = false;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n if (UNSUPPORTED_MARKDOWN_BLOCK_TYPES.has(block.type)) {\n hasUnsupportedBlock = true;\n }\n });\n\n return hasUnsupportedBlock;\n } catch {\n return false;\n }\n}\n\nexport function countReferenceInlinesFromContentJson(contentJson: string): number {\n try {\n let count = 0;\n visitBlocks(parseBlockNoteContent(contentJson), (block) => {\n visitBlockContent(block.content, (inline) => {\n if (inline.type === 'reference') {\n count += 1;\n }\n });\n });\n\n return count;\n } catch {\n return 0;\n }\n}\n"],"mappings":"AAAA,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAChC,OAAO,YAAY;AA2DnB,MAAM,mCAAmC,oBAAI,IAAI,CAAC,iBAAiB,CAAC;AACpE,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAE/B,MAAM,4BAAgD;AAAA,EAClD,WAAW,OAAO,SAAS,gBAAgB,IAAI;AAAA,EAC/C,kBAAkB,OAAO,UAAU;AAC/B,UAAM,QAAQ,MAAM,OAAO,KAAK,SAAS;AAAA,MACrC,QAAQ;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,MACX;AAAA,MACA,OAAO,EAAE,MAAM;AAAA,MACf,SAAS,EAAE,WAAW,MAAM;AAAA,MAC5B,MAAM;AAAA,IACV,CAAC;AAED,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MACxB,IAAI,OAAO,KAAK,EAAE;AAAA,MAClB,OAAO,KAAK;AAAA,IAChB,EAAE;AAAA,EACN;AACJ;AAEA,SAAS,+BAA+B,QAAkC;AACtE,SAAO,OACF,OAAO,CAAC,UAAU,CAAC,iCAAiC,IAAI,MAAM,IAAI,CAAC,EACnE,IAAI,CAAC,WAAW;AAAA,IACb,GAAG;AAAA,IACH,UAAU,MAAM,UAAU,SAAS,+BAA+B,MAAM,QAAQ,IAAI,CAAC;AAAA,EACzF,EAAE;AACV;AAEA,SAAS,sBAAsB,aAAkC;AAC7D,QAAM,SAAS,KAAK,MAAM,WAAW;AAErC,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AACxB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC/C;AAEA,SAAO;AACX;AAEA,SAAS,YAAY,QAAqB,OAAmC;AACzE,aAAW,SAAS,QAAQ;AACxB,UAAM,KAAK;AAEX,QAAI,MAAM,UAAU,QAAQ;AACxB,kBAAY,MAAM,UAAU,KAAK;AAAA,IACrC;AAAA,EACJ;AACJ;AAEA,SAAS,qBAAqB,OAAe;AACzC,SAAO,GAAG,sBAAsB,GAAG,KAAK,GAAG,sBAAsB;AACrE;AAEA,SAAS,eAAe,SAAyE;AAC7F,SAAO,CAAC,MAAM,QAAQ,OAAO,KAAK,SAAS,SAAS;AACxD;AAEA,SAAS,gBACL,SACA,WAC4B;AAC5B,MAAI,MAAM,QAAQ,OAAO,GAAG;AACxB,WAAO,QAAQ,IAAI,SAAS;AAAA,EAChC;AAEA,MAAI,CAAC,eAAe,OAAO,GAAG;AAC1B,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,MAAM,QAAQ,MAAM,IAAI,CAAC,SAAS;AAAA,MAC9B,GAAG;AAAA,MACH,OAAO,IAAI,OAAO,IAAI,CAAC,UAAU;AAAA,QAC7B,GAAG;AAAA,QACH,SAAS,KAAK,SAAS,IAAI,SAAS;AAAA,MACxC,EAAE;AAAA,IACN,EAAE;AAAA,EACN;AACJ;AAEA,eAAe,qBACX,SACA,WACqC;AACrC,MAAI,MAAM,QAAQ,OAAO,GAAG;AACxB,YAAQ,MAAM,QAAQ,IAAI,QAAQ,IAAI,SAAS,CAAC,GAAG,KAAK;AAAA,EAC5D;AAEA,MAAI,CAAC,eAAe,OAAO,GAAG;AAC1B,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,MAAM,MAAM,QAAQ;AAAA,OACf,QAAQ,QAAQ,CAAC,GAAG,IAAI,OAAO,SAAS;AAAA,QACrC,GAAG;AAAA,QACH,OAAO,MAAM,QAAQ;AAAA,WAChB,IAAI,SAAS,CAAC,GAAG,IAAI,OAAO,UAAU;AAAA,YACnC,GAAG;AAAA,YACH,SAAS,KAAK,WAAW,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,KAAK,IAAI,KAAK;AAAA,UAC3F,EAAE;AAAA,QACN;AAAA,MACJ,EAAE;AAAA,IACN;AAAA,EACJ;AACJ;AAEA,SAAS,kBAAkB,SAAuC,aAAgD;AAC9G,MAAI,MAAM,QAAQ,OAAO,GAAG;AACxB,eAAW,UAAU,SAAS;AAC1B,kBAAY,MAAM;AAAA,IACtB;AACA;AAAA,EACJ;AAEA,MAAI,CAAC,eAAe,OAAO,GAAG;AAC1B;AAAA,EACJ;AAEA,aAAW,OAAO,QAAQ,QAAQ,CAAC,GAAG;AAClC,eAAW,QAAQ,IAAI,SAAS,CAAC,GAAG;AAChC,iBAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AACrC,oBAAY,MAAM;AAAA,MACtB;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,SAAS,UACL,QACA,YACW;AACX,SAAO,OAAO,IAAI,CAAC,WAAW;AAAA,IAC1B,GAAG;AAAA,IACH,SAAS,WAAW,MAAM,OAAO;AAAA,IACjC,UAAU,MAAM,UAAU,SAAS,UAAU,MAAM,UAAU,UAAU,IAAI,CAAC;AAAA,EAChF,EAAE;AACN;AAEA,eAAe,eACX,QACA,YACoB;AACpB,SAAO,QAAQ;AAAA,IACX,OAAO,IAAI,OAAO,WAAW;AAAA,MACzB,GAAG;AAAA,MACH,SAAS,MAAM,WAAW,MAAM,OAAO;AAAA,MACvC,UAAU,MAAM,UAAU,SAAS,MAAM,eAAe,MAAM,UAAU,UAAU,IAAI,CAAC;AAAA,IAC3F,EAAE;AAAA,EACN;AACJ;AAEA,SAAS,8BACL,QACA,kBACA,sBACW;AACX,SAAO;AAAA,IAAU;AAAA,IAAQ,CAAC,YACtB,gBAAgB,SAAS,CAAC,WAAW;AACjC,UAAI,OAAO,SAAS,aAAa;AAC7B,eAAO;AAAA,UACH,MAAM;AAAA,UACN,MAAM,KAAK,OAAO,OAAO,SAAS,OAAO,OAAO,MAAM,EAAE;AAAA,UACxD,QAAQ,CAAC;AAAA,QACb;AAAA,MACJ;AACA,UAAI,OAAO,SAAS,OAAO;AACvB,cAAM,MAAO,OAAO,OAAO,OAAkB;AAC7C,cAAM,cAAc,qBAAqB,qBAAqB,OAAO;AACrE,yBAAiB,IAAI,aAAa,GAAG;AACrC,eAAO;AAAA,UACH,MAAM;AAAA,UACN,MAAM;AAAA,UACN,QAAQ,CAAC;AAAA,QACb;AAAA,MACJ;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AACJ;AAEA,SAAS,iCAAiC,UAAkB,kBAAuC;AAC/F,MAAI,mBAAmB;AAEvB,aAAW,CAAC,aAAa,GAAG,KAAK,iBAAiB,QAAQ,GAAG;AACzD,uBAAmB,iBAAiB,MAAM,WAAW,EAAE,KAAK,IAAI,GAAG,GAAG;AAAA,EAC1E;AAEA,SAAO;AACX;AAEA,SAAS,+BAA+B,UAAkB;AACtD,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,MAAI,uBAAuB;AAC3B,QAAM,uBAAuB,SAAS,QAAQ,wBAAwB,CAAC,QAAQ,aAAqB;AAChG,UAAM,cAAc,qBAAqB,sBAAsB;AAC/D,qBAAiB,IAAI,aAAa,QAAQ;AAC1C,WAAO;AAAA,EACX,CAAC;AAED,SAAO;AAAA,IACH,UAAU;AAAA,IACV;AAAA,EACJ;AACJ;AAEA,MAAM,uCAAuC;AAC7C,MAAM,uCAAuC;AAC7C,MAAM,+BAA+B;AACrC,MAAM,mCAAmC;AACzC,MAAM,mCAAmC;AACzC,MAAM,yCAAyC;AAC/C,MAAM,yCAAyC;AAC/C,MAAM,gCAAgC;AACtC,MAAM,gCAAgC;AAEtC,SAAS,mCAAmC,WAAmB;AAC3D,MAAI,cAAc,UAAU,KAAK,GAAG;AAChC,WAAO;AAAA,EACX;AAEA,SAAO,qCAAqC,KAAK,SAAS,KAAK,mCAAmC,KAAK,SAAS;AACpH;AAEA,SAAS,mCAAmC,UAAkB;AAC1D,QAAM,cAAc,oBAAI,IAAoB;AAE5C,aAAW,SAAS,SAAS,SAAS,oCAAoC,GAAG;AACzE,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,YAAY,MAAM,CAAC,KAAK;AAE9B,QAAI,CAAC,SAAS,mCAAmC,SAAS,GAAG;AACzD;AAAA,IACJ;AAEA,gBAAY,IAAI,QAAQ,YAAY,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EAC5D;AAEA,SAAO;AACX;AAEO,SAAS,qCAAqC,UAAkB;AACnE,SAAO,CAAC,GAAG,mCAAmC,QAAQ,EAAE,KAAK,CAAC;AAClE;AAEO,SAAS,oCAAoC,gBAAwB,kBAA0B;AAClG,QAAM,eAAe,mCAAmC,cAAc;AAEtE,MAAI,aAAa,SAAS,GAAG;AACzB,WAAO;AAAA,EACX;AAEA,QAAM,iBAAiB,mCAAmC,gBAAgB;AAE1E,aAAW,CAAC,OAAO,WAAW,KAAK,cAAc;AAC7C,SAAK,eAAe,IAAI,KAAK,KAAK,KAAK,aAAa;AAChD,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,8BAA8B,UAAkB;AACrD,SAAO,CAAC,GAAG,SAAS,SAAS,oCAAoC,CAAC,EAAE;AACxE;AAEO,SAAS,4BAA4B,UAAkB;AAC1D,SAAO,8BAA8B,QAAQ,IAAI;AACrD;AAEO,SAAS,+BAA+B,gBAAwB,kBAA0B;AAC7F,QAAM,cAAc,8BAA8B,cAAc;AAEhE,SAAO,cAAc,KAAK,8BAA8B,gBAAgB,IAAI;AAChF;AAEA,SAAS,kCAAkC,UAAkB;AACzD,QAAM,iBAA2B,CAAC;AAClC,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,MAAI,cAA4D;AAEhE,aAAW,QAAQ,SAAS,MAAM,SAAS,GAAG;AAC1C,UAAM,EAAE,MAAM,UAAU,WAAW,IAAI,wBAAwB,IAAI;AACnE,UAAM,aAAa,SAAS,MAAM,4BAA4B;AAE9D,QAAI,aAAa;AACb,qBAAe,KAAK,IAAI;AAExB,UAAI,mBAAmB,UAAU,WAAW,GAAG;AAC3C,sBAAc;AAAA,MAClB;AAEA;AAAA,IACJ;AAEA,QAAI,aAAa,CAAC,GAAG;AACjB,YAAM,SAAS,WAAW,CAAC,EAAE,CAAC;AAC9B,oBAAc;AAAA,QACV;AAAA,QACA,QAAQ,WAAW,CAAC,EAAE;AAAA,MAC1B;AACA,qBAAe,KAAK,IAAI;AACxB;AAAA,IACJ;AAEA,QAAI,gBAAgB,KAAK,QAAQ,GAAG;AAChC,qBAAe,KAAK,IAAI;AACxB;AAAA,IACJ;AAEA,mBAAe,KAAK,GAAG,sCAAsC,UAAU,kBAAkB,CAAC,GAAG,UAAU,EAAE;AAAA,EAC7G;AAEA,SAAO;AAAA,IACH,UAAU,eAAe,KAAK,EAAE;AAAA,IAChC;AAAA,EACJ;AACJ;AAEA,SAAS,uCAAuC,UAAkB;AAC9D,QAAM,iBAA2B,CAAC;AAClC,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,MAAI,cAA4D;AAChE,QAAM,QAAQ,SAAS,MAAM,SAAS;AAEtC,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AACzC,UAAM,EAAE,MAAM,UAAU,WAAW,IAAI,wBAAwB,IAAI;AACnE,UAAM,aAAa,SAAS,MAAM,4BAA4B;AAE9D,QAAI,aAAa;AACb,qBAAe,KAAK,IAAI;AAExB,UAAI,mBAAmB,UAAU,WAAW,GAAG;AAC3C,sBAAc;AAAA,MAClB;AAEA;AAAA,IACJ;AAEA,QAAI,aAAa,CAAC,GAAG;AACjB,YAAM,SAAS,WAAW,CAAC,EAAE,CAAC;AAC9B,oBAAc;AAAA,QACV;AAAA,QACA,QAAQ,WAAW,CAAC,EAAE;AAAA,MAC1B;AACA,qBAAe,KAAK,IAAI;AACxB;AAAA,IACJ;AAEA,QAAI,gBAAgB,KAAK,QAAQ,GAAG;AAChC,qBAAe,KAAK,IAAI;AACxB;AAAA,IACJ;AAEA,UAAM,eAAe,wBAAwB,MAAM,QAAQ,CAAC,KAAK,EAAE,EAAE;AACrE,mBAAe;AAAA,MACX,GAAG;AAAA,QACC;AAAA,QACA;AAAA,QACA,oCAAoC,YAAY;AAAA,QAChD;AAAA,MACJ,CAAC,GAAG,UAAU;AAAA,IAClB;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,UAAU,eAAe,KAAK,EAAE;AAAA,IAChC;AAAA,EACJ;AACJ;AAEA,SAAS,iCAAiC,UAAkB;AACxD,QAAM,iBAA2B,CAAC;AAClC,QAAM,qBAAqB,oBAAI,IAAoB;AACnD,MAAI,cAA4D;AAEhE,aAAW,QAAQ,SAAS,MAAM,SAAS,GAAG;AAC1C,UAAM,EAAE,MAAM,UAAU,WAAW,IAAI,wBAAwB,IAAI;AACnE,UAAM,aAAa,SAAS,MAAM,4BAA4B;AAE9D,QAAI,aAAa;AACb,qBAAe,KAAK,IAAI;AAExB,UAAI,mBAAmB,UAAU,WAAW,GAAG;AAC3C,sBAAc;AAAA,MAClB;AAEA;AAAA,IACJ;AAEA,QAAI,aAAa,CAAC,GAAG;AACjB,YAAM,SAAS,WAAW,CAAC,EAAE,CAAC;AAC9B,oBAAc;AAAA,QACV;AAAA,QACA,QAAQ,WAAW,CAAC,EAAE;AAAA,MAC1B;AACA,qBAAe,KAAK,IAAI;AACxB;AAAA,IACJ;AAEA,QAAI,gBAAgB,KAAK,QAAQ,GAAG;AAChC,qBAAe,KAAK,IAAI;AACxB;AAAA,IACJ;AAEA,mBAAe,KAAK,GAAG,qCAAqC,UAAU,kBAAkB,CAAC,GAAG,UAAU,EAAE;AAAA,EAC5G;AAEA,SAAO;AAAA,IACH,UAAU,eAAe,KAAK,EAAE;AAAA,IAChC;AAAA,EACJ;AACJ;AAEA,SAAS,wBAAwB,MAAc;AAC3C,MAAI,KAAK,SAAS,MAAM,GAAG;AACvB,WAAO;AAAA,MACH,MAAM,KAAK,MAAM,GAAG,EAAE;AAAA,MACtB,YAAY;AAAA,IAChB;AAAA,EACJ;AAEA,MAAI,KAAK,SAAS,IAAI,GAAG;AACrB,WAAO;AAAA,MACH,MAAM,KAAK,MAAM,GAAG,EAAE;AAAA,MACtB,YAAY;AAAA,IAChB;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,MAAM;AAAA,IACN,YAAY;AAAA,EAChB;AACJ;AAEA,SAAS,mBAAmB,MAAc,OAA8C;AACpF,QAAM,gBAAgB,MAAM,WAAW,MAAM,MAAM;AACnD,SAAO,IAAI,OAAO,UAAU,aAAa,IAAI,MAAM,MAAM,OAAO,EAAE,KAAK,IAAI;AAC/E;AAEA,SAAS,qCAAqC,MAAc,oBAAyC;AACjG,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,SAAO,SAAS,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,QAAQ,KAAK,MAAM;AAE1C,QAAI,cAAc,IAAI;AAClB,gBAAU,qCAAqC,KAAK,MAAM,MAAM,GAAG,kBAAkB;AACrF;AAAA,IACJ;AAEA,cAAU,qCAAqC,KAAK,MAAM,QAAQ,SAAS,GAAG,kBAAkB;AAEhG,UAAM,kBAAkB,uBAAuB,MAAM,WAAW,GAAG;AACnE,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO,eAAe,GAAG,YAAY,eAAe;AAErF,QAAI,YAAY,IAAI;AAChB,gBAAU,qCAAqC,KAAK,MAAM,SAAS,GAAG,kBAAkB;AACxF;AAAA,IACJ;AAEA,UAAM,mBAAmB,UAAU;AACnC,cAAU,KAAK,MAAM,WAAW,gBAAgB;AAChD,aAAS;AAAA,EACb;AAEA,SAAO;AACX;AAEA,SAAS,sCAAsC,MAAc,oBAAyC;AAClG,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,SAAO,SAAS,KAAK,QAAQ;AACzB,UAAM,gBAAgB,8BAA8B,MAAM,MAAM;AAEhE,QAAI,CAAC,eAAe;AAChB,gBAAU,gCAAgC,KAAK,MAAM,MAAM,GAAG,kBAAkB;AAChF;AAAA,IACJ;AAEA,cAAU,gCAAgC,KAAK,MAAM,QAAQ,cAAc,KAAK,GAAG,kBAAkB;AACrG,cAAU,KAAK,MAAM,cAAc,OAAO,cAAc,GAAG;AAC3D,aAAS,cAAc;AAAA,EAC3B;AAEA,SAAO;AACX;AAEA,SAAS,8BAA8B,MAAc,QAAgB;AACjE,QAAM,WAAW,uBAAuB,MAAM,MAAM;AACpD,QAAM,sBAAsB,oCAAoC,MAAM,MAAM;AAE5E,MAAI,CAAC,UAAU;AACX,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,qBAAqB;AACtB,WAAO;AAAA,EACX;AAEA,SAAO,SAAS,SAAS,oBAAoB,QAAQ,WAAW;AACpE;AAEA,SAAS,uBAAuB,MAAc,QAAgB;AAC1D,QAAM,YAAY,KAAK,QAAQ,KAAK,MAAM;AAE1C,MAAI,cAAc,IAAI;AAClB,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,uBAAuB,MAAM,WAAW,GAAG;AACnE,QAAM,UAAU,KAAK,QAAQ,IAAI,OAAO,eAAe,GAAG,YAAY,eAAe;AAErF,MAAI,YAAY,IAAI;AAChB,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,OAAO;AAAA,IACP,KAAK,UAAU;AAAA,EACnB;AACJ;AAEA,SAAS,oCAAoC,MAAc,QAAgB;AACvE,QAAM,wBAAwB,KAAK,QAAQ,MAAM,MAAM;AAEvD,MAAI,0BAA0B,IAAI;AAC9B,WAAO;AAAA,EACX;AAEA,QAAM,mBAAmB,wBAAwB;AACjD,QAAM,iBAAiB,KAAK,QAAQ,KAAK,gBAAgB;AAEzD,MAAI,mBAAmB,IAAI;AACvB,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,OAAO;AAAA,IACP,KAAK;AAAA,EACT;AACJ;AAEA,SAAS,qCAAqC,MAAc,oBAAyC;AACjG,SAAO,KAAK,QAAQ,sCAAsC,CAAC,OAAO,cAAsB;AACpF,QAAI,mCAAmC,SAAS,GAAG;AAC/C,aAAO;AAAA,IACX;AAEA,UAAM,cAAc,8BAA8B,mBAAmB,IAAI;AACzE,uBAAmB,IAAI,aAAa,KAAK;AAEzC,WAAO;AAAA,EACX,CAAC;AACL;AAEA,SAAS,gCAAgC,MAAc,oBAAyC;AAC5F,SAAO,KAAK,QAAQ,sCAAsC,CAAC,OAAO,iBAAyB;AACvF,UAAM,cAAc,mCAAmC,mBAAmB,IAAI;AAC9E,uBAAmB,IAAI,aAAa,GAAG;AAEvC,WAAO,GAAG,YAAY,GAAG,WAAW;AAAA,EACxC,CAAC;AACL;AAEA,SAAS,sCACL,MACA,YACA,qBACA,oBACF;AACE,MAAI,CAAC,cAAc,CAAC,KAAK,SAAS,IAAI,GAAG;AACrC,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,2BAA2B,mBAAmB,IAAI;AACtE,QAAM,4BAA4B,uBAAuB,CAAC,mCAAmC,IAAI;AACjG,qBAAmB,IAAI,aAAa,4BAA4B,KAAK,IAAI;AAEzE,SAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,WAAW;AAC7C;AAEA,SAAS,oCAAoC,MAAc;AACvD,MAAI,CAAC,KAAK,KAAK,GAAG;AACd,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,KAAK,UAAU;AAEnC,MAAI,YAAY,MAAM,4BAA4B,GAAG;AACjD,WAAO;AAAA,EACX;AAEA,MAAI,sBAAsB,KAAK,WAAW,GAAG;AACzC,WAAO;AAAA,EACX;AAEA,MAAI,KAAK,KAAK,WAAW,GAAG;AACxB,WAAO;AAAA,EACX;AAEA,MAAI,qBAAqB,KAAK,WAAW,KAAK,uBAAuB,KAAK,WAAW,GAAG;AACpF,WAAO;AAAA,EACX;AAEA,MAAI,8BAA8B,KAAK,WAAW,GAAG;AACjD,WAAO;AAAA,EACX;AAEA,SAAO;AACX;AAEA,SAAS,mCAAmC,MAAc;AACtD,MAAI,SAAS;AACb,MAAI,gBAA+B;AAEnC,SAAO,SAAS,KAAK,QAAQ;AACzB,UAAM,YAAY,KAAK,QAAQ,KAAK,MAAM;AAE1C,QAAI,cAAc,IAAI;AAClB;AAAA,IACJ;AAEA,UAAM,kBAAkB,uBAAuB,MAAM,WAAW,GAAG;AACnE,UAAM,YAAY,IAAI,OAAO,eAAe;AAC5C,oBAAgB,kBAAkB,YAAY,OAAO;AACrD,aAAS,YAAY;AAAA,EACzB;AAEA,SAAO,kBAAkB;AAC7B;AAEA,SAAS,8BAA8B,OAAe;AAClD,SAAO,GAAG,gCAAgC,GAAG,KAAK,GAAG,gCAAgC;AACzF;AAEA,SAAS,mCAAmC,OAAe;AACvD,SAAO,GAAG,sCAAsC,GAAG,KAAK,GAAG,sCAAsC;AACrG;AAEA,SAAS,2BAA2B,OAAe;AAC/C,SAAO,GAAG,6BAA6B,GAAG,KAAK,GAAG,6BAA6B;AACnF;AAEA,SAAS,uBAAuB,OAAe,OAAe,WAAmB;AAC7E,MAAI,SAAS;AAEb,SAAO,MAAM,MAAM,MAAM,WAAW;AAChC,cAAU;AAAA,EACd;AAEA,SAAO,SAAS;AACpB;AAEA,SAAS,2BAA2B,MAAc,QAAgB,kBAAuC;AACrG,aAAW,CAAC,aAAa,QAAQ,KAAK,iBAAiB,QAAQ,GAAG;AAC9D,QAAI,KAAK,WAAW,aAAa,MAAM,GAAG;AACtC,aAAO;AAAA,QACH;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,gCAAgC,QAAqB,kBAAoD;AAC9G,SAAO;AAAA,IAAU;AAAA,IAAQ,CAAC,YACtB,gBAAgB,SAAS,CAAC,WAAW;AACjC,UAAI,OAAO,SAAS,UAAU,OAAO,OAAO,SAAS,UAAU;AAC3D,eAAO;AAAA,MACX;AAEA,UAAI,OAAO,OAAO;AAElB,iBAAW,CAAC,aAAa,QAAQ,KAAK,iBAAiB,QAAQ,GAAG;AAC9D,eAAO,KAAK,MAAM,WAAW,EAAE,KAAK,IAAI,QAAQ,GAAG;AAAA,MACvD;AAEA,aAAO;AAAA,QACH,GAAG;AAAA,QACH;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AAEA,SAAS,iCAAiC,QAAqB,oBAAsD;AACjH,MAAI,mBAAmB,SAAS,GAAG;AAC/B,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IAAU;AAAA,IAAQ,CAAC,YACtB;AAAA,MACI;AAAA,MACA,CAAC,WAAW,4BAA4B,QAAQ,kBAAkB;AAAA,IACtE;AAAA,EACJ;AACJ;AAEA,SAAS,4BAA4B,OAAgB,oBAAkD;AACnG,MAAI,OAAO,UAAU,UAAU;AAC3B,WAAO,qBAAqB,OAAO,kBAAkB;AAAA,EACzD;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,IAAI,CAAC,SAAS,4BAA4B,MAAM,kBAAkB,CAAC;AAAA,EACpF;AAEA,MAAI,SAAS,OAAO,UAAU,UAAU;AACpC,WAAO,OAAO;AAAA,MACV,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,4BAA4B,MAAM,kBAAkB,CAAC,CAAC;AAAA,IAC3G;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,qBAAqB,MAAc,oBAAyC;AACjF,MAAI,eAAe;AAEnB,aAAW,CAAC,aAAa,KAAK,KAAK,mBAAmB,QAAQ,GAAG;AAC7D,mBAAe,aAAa,MAAM,WAAW,EAAE,KAAK,KAAK;AAAA,EAC7D;AAEA,SAAO;AACX;AAEA,SAAS,iBAAiB,MAAc,SAAkC,CAAC,GAAoB;AAC3F,SAAO;AAAA,IACH,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,SAAS,aAAa,QAA2B,QAAyB;AACtE,QAAM,WAAW,OAAO,GAAG,EAAE;AAE7B,MACI,UAAU,SAAS,UACnB,OAAO,SAAS,UAChB,SAAS,SAAS,UAClB,OAAO,SAAS,UAChB,KAAK,UAAU,SAAS,UAAU,CAAC,CAAC,MAAM,KAAK,UAAU,OAAO,UAAU,CAAC,CAAC,GAC9E;AACE,aAAS,QAAQ,OAAO;AACxB;AAAA,EACJ;AAEA,SAAO,KAAK,MAAM;AACtB;AAEA,eAAe,2BACX,QACA,MACA,kBACoB;AACpB,QAAM,WAAW,oBAAI,IAAkD;AACvE,QAAM,YAAY,oBAAI,IAA2D;AAEjF,QAAM,SAAS,CAAC,UAAkB;AAC9B,UAAM,kBAAkB,MAAM,WAAW,GAAG,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC,KAAK;AACvE,QAAI,WAAW,SAAS,IAAI,eAAe;AAE3C,QAAI,CAAC,UAAU;AACX,iBAAW,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY;AAAA,QAClE,IAAI,SAAS,SAAS,OAAO,IAAI,KAAK,OAAO;AAAA,QAC7C,KAAK,SAAS,SAAS,OAAO,IAAI,OAAO,OAAO;AAAA,MACpD,EAAE;AACF,eAAS,IAAI,iBAAiB,QAAQ;AAAA,IAC1C;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,kBAAkB,CAAC,UAAkB;AACvC,QAAI,WAAW,UAAU,IAAI,KAAK;AAElC,QAAI,CAAC,UAAU;AACX,iBAAW,KAAK,iBAAiB,KAAK;AACtC,gBAAU,IAAI,OAAO,QAAQ;AAAA,IACjC;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,oBAAoB,OAAO,WAAwD;AACrF,QAAI,OAAO,SAAS,UAAU,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,QAAQ,OAAO,QAAQ,SAAS,MAAM;AAC3G,aAAO,CAAC,MAAM;AAAA,IAClB;AAEA,UAAM,WAA8B,CAAC;AACrC,UAAM,SAAS,OAAO,UAAU,CAAC;AACjC,QAAI,SAAS;AAEb,WAAO,SAAS,OAAO,KAAK,QAAQ;AAChC,UAAI,OAAO,KAAK,WAAW,MAAM,MAAM,GAAG;AACtC,cAAM,aAAa,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AAEvD,YAAI,eAAe,IAAI;AACnB,gBAAM,QAAQ,OAAO,KAAK,MAAM,SAAS,GAAG,UAAU;AACtD,gBAAM,gBAAgB,MAAM,gBAAgB,KAAK;AAEjD,cAAI,cAAc,WAAW,GAAG;AAC5B,yBAAa,UAAU;AAAA,cACnB,MAAM;AAAA,cACN,OAAO;AAAA,gBACH,IAAI,cAAc,CAAC,EAAE;AAAA,gBACrB,OAAO,cAAc,CAAC,EAAE;AAAA,cAC5B;AAAA,YACJ,CAAC;AACD,qBAAS,aAAa;AACtB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,sBAAsB,2BAA2B,OAAO,MAAM,QAAQ,gBAAgB;AAE5F,UAAI,qBAAqB;AACrB,cAAM,MAAM,MAAM,OAAO,oBAAoB,QAAQ;AACrD,qBAAa,UAAU;AAAA,UACnB,MAAM;AAAA,UACN,OAAO;AAAA,QACX,CAAC;AACD,kBAAU,oBAAoB,YAAY;AAC1C;AAAA,MACJ;AAEA,UAAI,aAAa,OAAO,KAAK;AAE7B,YAAM,sBAAsB,OAAO,KAAK,QAAQ,MAAM,SAAS,CAAC;AAEhE,UAAI,wBAAwB,IAAI;AAC5B,qBAAa,KAAK,IAAI,YAAY,mBAAmB;AAAA,MACzD;AAEA,iBAAW,eAAe,iBAAiB,KAAK,GAAG;AAC/C,cAAM,wBAAwB,OAAO,KAAK,QAAQ,aAAa,SAAS,CAAC;AAEzE,YAAI,0BAA0B,IAAI;AAC9B,uBAAa,KAAK,IAAI,YAAY,qBAAqB;AAAA,QAC3D;AAAA,MACJ;AAEA,mBAAa,UAAU,iBAAiB,OAAO,KAAK,MAAM,QAAQ,UAAU,GAAG,MAAM,CAAC;AACtF,eAAS;AAAA,IACb;AAEA,WAAO;AAAA,EACX;AAEA,SAAO,eAAe,QAAQ,CAAC,YAAY,qBAAqB,SAAS,iBAAiB,CAAC;AAC/F;AAEA,SAAS,cAAc,QAA+B;AAClD,QAAM,SAAS,oBAAI,IAAY;AAE/B,QAAM,QAAQ,CAAC,UAAuB;AAClC,eAAW,SAAS,OAAO;AACvB,wBAAkB,MAAM,SAAS,CAAC,WAAW;AACzC,YAAI,OAAO,SAAS,SAAS,OAAO,OAAO,OAAO,OAAO,UAAU;AAC/D,iBAAO,IAAI,OAAO,MAAM,EAAE;AAAA,QAC9B;AAAA,MACJ,CAAC;AAED,UAAI,MAAM,UAAU,QAAQ;AACxB,cAAM,MAAM,QAAQ;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,MAAM;AACZ,SAAO,CAAC,GAAG,MAAM;AACrB;AAEA,IAAI,iBAA+C;AAEnD,SAAS,YAAmC;AACxC,MAAI,CAAC,gBAAgB;AACjB,qBAAiB,sBAAsB,OAAO;AAAA,EAClD;AACA,SAAO;AACX;AAEA,eAAsB,iBAAiB,aAAsC;AACzE,MAAI;AACA,UAAM,SAAS,sBAAsB,WAAW;AAChD,UAAM,kBAAkB,+BAA+B,MAAM;AAC7D,UAAM,mBAAmB,oBAAI,IAAoB;AACjD,UAAM,YAAY,8BAA8B,iBAAiB,kBAAkB,EAAE,OAAO,EAAE,CAAC;AAC/F,UAAM,SAAS,UAAU;AACzB,UAAM,WAAW,MAAM,OAAO;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO,iCAAiC,UAAU,gBAAgB;AAAA,EACtE,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,eAAsB,qBAClB,UACA,OAA2B,2BACZ;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,uBAAuB,+BAA+B,QAAQ;AACpE,QAAM,yBAAyB,kCAAkC,qBAAqB,QAAQ;AAC9F,QAAM,6BAA6B,uCAAuC,uBAAuB,QAAQ;AACzG,QAAM,yBAAyB,IAAI,IAAI;AAAA,IACnC,GAAG,uBAAuB;AAAA,IAC1B,GAAG,2BAA2B;AAAA,EAClC,CAAC;AACD,QAAM,cAAc,MAAM;AAAA,IACtB;AAAA,IACA,2BAA2B;AAAA,IAC3B;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,EACJ;AAEA,MAAI,qCAAqC,qBAAqB,QAAQ,EAAE,WAAW,GAAG;AAClF,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,oCAAoC,qBAAqB,UAAU,MAAM,iBAAiB,WAAW,CAAC,GAAG;AAC1G,WAAO;AAAA,EACX;AAEA,QAAM,oBAAoB,iCAAiC,2BAA2B,QAAQ;AAC9F,QAAM,qBAAqB,IAAI,IAAI,CAAC,GAAG,wBAAwB,GAAG,kBAAkB,kBAAkB,CAAC;AAEvG,SAAO;AAAA,IACH;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,EACJ;AACJ;AAEA,eAAe,2BACX,QACA,UACA,MACA,kBACA,kCAAuD,oBAAI,IAAI,GACjE;AACE,QAAM,SAAS,MAAM,OAAO,yBAAyB,QAAQ;AAC7D,QAAM,iBAAiB,MAAM,2BAA2B,QAAuB,MAAM,gBAAgB;AACrG,QAAM,oBAAoB,gCAAgC,gBAAgB,gBAAgB;AAC1F,QAAM,8BAA8B;AAAA,IAChC;AAAA,IACA;AAAA,EACJ;AAEA,SAAO,KAAK,UAAU,2BAA2B;AACrD;AAEO,SAAS,6BAA6B,aAA+B;AACxE,QAAM,SAAS,sBAAsB,WAAW;AAChD,SAAO,cAAc,MAAM;AAC/B;AAEO,SAAS,6BAA6B,aAA8B;AACvE,MAAI;AACA,QAAI,sBAAsB;AAC1B,gBAAY,sBAAsB,WAAW,GAAG,CAAC,UAAU;AACvD,UAAI,iCAAiC,IAAI,MAAM,IAAI,GAAG;AAClD,8BAAsB;AAAA,MAC1B;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEO,SAAS,qCAAqC,aAA6B;AAC9E,MAAI;AACA,QAAI,QAAQ;AACZ,gBAAY,sBAAsB,WAAW,GAAG,CAAC,UAAU;AACvD,wBAAkB,MAAM,SAAS,CAAC,WAAW;AACzC,YAAI,OAAO,SAAS,aAAa;AAC7B,mBAAS;AAAA,QACb;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAED,WAAO;AAAA,EACX,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;","names":[]}
|