@coze-editor/extensions 0.1.0-alpha.0fd19e → 0.1.0-alpha.1bed7f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -1262,6 +1262,117 @@ var mergeableMarkers = Facet8.define({
1262
1262
  return EditorView7.decorations.compute([self], (state) => state.facet(self));
1263
1263
  }
1264
1264
  });
1265
+
1266
+ // src/frozen-ranges/extension.ts
1267
+ import { hasOverlap as hasOverlap3 } from "@coze-editor/utils";
1268
+ import { EditorSelection as EditorSelection4, EditorState as EditorState3, Facet as Facet9 } from "@codemirror/state";
1269
+ var extension4 = [
1270
+ // 禁止编辑
1271
+ EditorState3.changeFilter.of((tr) => {
1272
+ const providers = tr.startState.facet(frozenRanges);
1273
+ const specs = providers.reduce(
1274
+ (memo, provider) => [...memo, ...provider(tr.startState)],
1275
+ []
1276
+ );
1277
+ if (Array.isArray(specs)) {
1278
+ const flattened = specs.reduce(
1279
+ (memo, current) => [...memo, current.from, current.to],
1280
+ []
1281
+ );
1282
+ return flattened;
1283
+ }
1284
+ return true;
1285
+ }),
1286
+ // forbid cursor move into frozen ranges
1287
+ EditorState3.transactionFilter.of((tr) => {
1288
+ const len = tr.startState.doc.length;
1289
+ const providers = tr.startState.facet(frozenRanges);
1290
+ const specs = providers.reduce((memo, provider) => [...memo, ...provider(tr.state)], []).filter(
1291
+ (spec) => spec.from >= 0 && spec.from < len && spec.to >= 0 && spec.to < len
1292
+ );
1293
+ let { newSelection } = tr;
1294
+ newSelection.ranges.forEach((range2, index) => {
1295
+ for (const spec of specs) {
1296
+ if (range2.empty && range2.from > spec.from && range2.to < spec.to) {
1297
+ newSelection = newSelection.replaceRange(
1298
+ EditorSelection4.cursor(
1299
+ range2.assoc > 0 ? spec.from : spec.to,
1300
+ range2.assoc
1301
+ ),
1302
+ index
1303
+ );
1304
+ }
1305
+ if (!range2.empty && hasOverlap3(range2, spec)) {
1306
+ const isReversed = range2.head < range2.anchor;
1307
+ if (
1308
+ // anchor at left
1309
+ range2.anchor < spec.from
1310
+ ) {
1311
+ newSelection = newSelection.replaceRange(
1312
+ EditorSelection4.range(
1313
+ range2.anchor,
1314
+ spec.from,
1315
+ range2.goalColumn,
1316
+ range2.bidiLevel ?? void 0
1317
+ ),
1318
+ index
1319
+ );
1320
+ } else if (
1321
+ // anchor at right
1322
+ range2.anchor > spec.to
1323
+ ) {
1324
+ newSelection = newSelection.replaceRange(
1325
+ EditorSelection4.range(
1326
+ range2.anchor,
1327
+ spec.to,
1328
+ range2.goalColumn,
1329
+ range2.bidiLevel ?? void 0
1330
+ ),
1331
+ index
1332
+ );
1333
+ } else if (
1334
+ // anchor inside
1335
+ range2.anchor >= spec.from && range2.anchor <= spec.to
1336
+ ) {
1337
+ if (isReversed) {
1338
+ newSelection = newSelection.replaceRange(
1339
+ EditorSelection4.range(
1340
+ spec.from,
1341
+ Math.min(range2.head, spec.from),
1342
+ range2.goalColumn,
1343
+ range2.bidiLevel ?? void 0
1344
+ ),
1345
+ index
1346
+ );
1347
+ } else {
1348
+ newSelection = newSelection.replaceRange(
1349
+ EditorSelection4.range(
1350
+ spec.to,
1351
+ Math.max(range2.head, spec.to),
1352
+ range2.goalColumn,
1353
+ range2.bidiLevel ?? void 0
1354
+ ),
1355
+ index
1356
+ );
1357
+ }
1358
+ }
1359
+ }
1360
+ }
1361
+ });
1362
+ if (newSelection.eq(tr.newSelection)) {
1363
+ return tr;
1364
+ }
1365
+ return [
1366
+ tr,
1367
+ {
1368
+ selection: newSelection
1369
+ }
1370
+ ];
1371
+ })
1372
+ ];
1373
+ var frozenRanges = Facet9.define({
1374
+ enables: () => extension4
1375
+ });
1265
1376
  export {
1266
1377
  FocusableWidget,
1267
1378
  SelectionSide,
@@ -1274,6 +1385,7 @@ export {
1274
1385
  deletionEnlarger,
1275
1386
  elementAtPosition,
1276
1387
  focusableKeymap,
1388
+ frozenRanges,
1277
1389
  indentGuides,
1278
1390
  inputRules,
1279
1391
  matchingBrackets,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ast-decorator/whole.ts","../../src/background-decorations/index.ts","../../src/background-decorations/squash.ts","../../src/background-decorations/cut.ts","../../src/ast-decorator/cursor.ts","../../src/ast-decorator/index.ts","../../src/ast-debugger/index.ts","../../src/focusable/focusable.ts","../../src/auto-select-ranges/extension.ts","../../src/auto-select-ranges/utils.ts","../../src/selection-enlarger/extension.ts","../../src/deletion-enlarger/extension.ts","../../src/input-rules/index.ts","../../src/mix-languages/mix.ts","../../src/indent-guides/index.ts","../../src/indent-guides/utils.ts","../../src/scroll-beyond-last-line/index.ts","../../src/scroll-beyond-last-line/empty-block.ts","../../src/brackets/matching-brackets.ts","../../src/brackets/colorization.ts","../../src/position/index.ts","../../src/mergeable-markers/index.ts","../../src/mergeable-markers/squash.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { omit } from 'es-toolkit';\nimport type { Tree, TreeCursor } from '@lezer/common';\nimport { traverseAST } from '@coze-editor/utils';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type WidgetType,\n} from '@codemirror/view';\nimport {\n type EditorState,\n type Range,\n Facet,\n RangeSet,\n StateEffect,\n StateField,\n Prec,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n backgroundDecorations,\n backgroundDecoratorLayer,\n type BackgroundDecoration,\n} from '../background-decorations';\n\ntype Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n atomicRange?: boolean;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n prec?: Precedence;\n}\n\ninterface ReplaceDecorationSpec extends BaseDecorationSpec {\n type: 'replace';\n widget?: WidgetType;\n inclusive?: boolean;\n inclusiveStart?: boolean;\n inclusiveEnd?: boolean;\n block?: boolean;\n}\n\ninterface WidgetDecorationSpec extends BaseDecorationSpec {\n type: 'widget';\n widget: WidgetType;\n side?: number;\n inlineOrder?: boolean;\n block?: boolean;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\ntype DecorationSpec =\n | ClassNameDecorationSpec\n | ReplaceDecorationSpec\n | WidgetDecorationSpec\n | BackgroundDecorationSpec;\n\ntype WholeASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => DecorationSpec[] | DecorationSpec | undefined;\n\nconst updateWholeDecorationsEffect = StateEffect.define();\n\nfunction updateWholeDecorations(view: EditorView) {\n view.dispatch({\n effects: updateWholeDecorationsEffect.of(null),\n });\n}\n\nconst classNameDecorationCache: Map<string, Decoration> = new Map();\nfunction getClassDecoration(className: string): Decoration {\n if (!classNameDecorationCache.has(className)) {\n classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return classNameDecorationCache.get(className)!;\n}\n\ntype CategoriedDecorationSet = Record<Precedence, DecorationSet>;\n\nfunction buildDecorations(state: EditorState, tree: Tree) {\n const decorates = state.facet(wholeASTDecoratorFacet) ?? [];\n\n const treeCursor = tree.cursor();\n const decorations: CategoriedDecorationSet = {\n highest: Decoration.none,\n high: Decoration.none,\n default: Decoration.none,\n low: Decoration.none,\n lowest: Decoration.none,\n };\n let atomicRanges = RangeSet.empty;\n let backgroundDecorations: BackgroundDecoration[] = [];\n\n const from = 0;\n const to = state.doc.length;\n traverseAST(treeCursor, from, to, cursor => {\n decorates.forEach(decorate => {\n const decorationSpec = decorate(cursor, state);\n\n let specs: DecorationSpec[] = [];\n if (Array.isArray(decorationSpec)) {\n specs = decorationSpec;\n } else if (decorationSpec) {\n specs = [decorationSpec];\n }\n\n specs.forEach(spec => {\n const result = updateDecorationSpec(cursor, spec, {\n decorations,\n backgroundDecorations,\n atomicRanges,\n });\n\n if (!result) {\n return;\n }\n\n backgroundDecorations = result.backgroundDecorations;\n atomicRanges = result.atomicRanges;\n });\n });\n });\n\n return {\n decorations,\n atomicRanges,\n backgroundDecorations,\n };\n}\n\nfunction updateDecorationSpec(\n cursor: TreeCursor,\n decorationSpec: DecorationSpec | undefined,\n {\n decorations,\n backgroundDecorations,\n atomicRanges,\n }: {\n decorations: CategoriedDecorationSet;\n backgroundDecorations: BackgroundDecoration[];\n atomicRanges: RangeSet<any>;\n },\n) {\n if (!decorationSpec) {\n return;\n }\n\n const from = decorationSpec.from ?? cursor.from;\n const to = decorationSpec.to ?? cursor.to;\n\n const omitKeys = ['type', 'from', 'to', 'atomicRange'] as const;\n\n let decorationRange: Range<Decoration> | null = null;\n switch (decorationSpec.type) {\n case 'className':\n // from === to marker will cause delete issue\n // e.g. {{content}} renders as `replace-widget mark replace-widget`\n // delete from end of content to start of content\n // when delete to first letter of content, the delete behavior is strange\n decorationRange =\n from === to\n ? null\n : getClassDecoration(decorationSpec.className).range(from, to);\n break;\n case 'replace':\n decorationRange = Decoration.replace(\n omit(decorationSpec, omitKeys),\n ).range(from, to);\n break;\n case 'widget':\n decorationRange = Decoration.widget(omit(decorationSpec, omitKeys)).range(\n from,\n );\n break;\n case 'background':\n backgroundDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decorationRange) {\n const prec =\n decorationSpec.type === 'className'\n ? (decorationSpec.prec ?? 'default')\n : 'default';\n\n if (decorations[prec]) {\n decorations[prec] = decorations[prec].update({\n add: [decorationRange],\n sort: true,\n });\n }\n }\n\n if (\n decorationSpec.type !== 'background' &&\n decorationRange &&\n decorationSpec.atomicRange === true\n ) {\n atomicRanges = atomicRanges.update({\n add: [decorationRange],\n sort: true,\n });\n }\n\n return {\n decorations,\n backgroundDecorations,\n atomicRanges,\n };\n}\n\nconst decorateField = StateField.define<{\n decorations: CategoriedDecorationSet;\n atomicRanges: RangeSet<any>;\n backgroundDecorations: BackgroundDecoration[];\n}>({\n create(state) {\n return buildDecorations(state, syntaxTree(state));\n },\n update(value, tr) {\n const tree = syntaxTree(tr.state);\n\n const hasUpdateEffect = tr.effects.some(effect =>\n effect.is(updateWholeDecorationsEffect),\n );\n const syntaxTreeChanged = syntaxTree(tr.startState) !== tree;\n if (syntaxTreeChanged || hasUpdateEffect) {\n value = buildDecorations(tr.state, tree);\n }\n return value;\n },\n provide(field) {\n return [\n Prec.highest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.highest,\n ),\n ),\n Prec.high(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.high,\n ),\n ),\n Prec.default(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.default,\n ),\n ),\n Prec.low(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.low,\n ),\n ),\n Prec.lowest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.lowest,\n ),\n ),\n\n EditorView.atomicRanges.of(view => view.state.field(field).atomicRanges),\n backgroundDecorations.of(\n view => view.state.field(field).backgroundDecorations,\n ),\n ];\n },\n});\n\nconst wholeASTDecoratorFacet = Facet.define<\n WholeASTDecorator,\n WholeASTDecorator[]\n>({\n enables: [decorateField, backgroundDecoratorLayer],\n});\n\nexport { wholeASTDecoratorFacet, updateWholeDecorations };\n\nexport type { WholeASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n type EditorView,\n RectangleMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { EditorSelection, Facet } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\nimport { squash } from './squash';\nimport { cutAtLineBreak } from './cut';\n\ntype BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(backgroundDecorations) !==\n update.state.facet(backgroundDecorations)\n );\n}\n\n// 使用时需置于 drawSelection 下方(影响 zIndex)\nconst backgroundDecoratorLayer = layer({\n above: false,\n markers(view) {\n const decorations = view.state\n .facet(backgroundDecorations)\n .reduce<\n BackgroundDecoration[]\n >((memo, current) => [...memo, ...current(view)], []);\n\n return cutAtLineBreak(squash(decorations), view.state)\n .map(deco =>\n RectangleMarker.forRange(\n view,\n deco.className,\n EditorSelection.range(deco.from, deco.to),\n ),\n )\n .reduce((memo, current) => [...memo, ...current], []);\n },\n update(update) {\n return (\n update.focusChanged ||\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n class: 'cm-backgroundDecoratorLayer',\n});\n\nconst backgroundDecorations = Facet.define<\n BackgroundDecorationFn,\n BackgroundDecorationFn[]\n>({\n enables: [backgroundDecoratorLayer],\n});\n\nexport { backgroundDecoratorLayer, backgroundDecorations };\n\nexport type { BackgroundDecoration };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { BackgroundDecoration } from './types';\n\nfunction squash(decorations: BackgroundDecoration[]) {\n const result: BackgroundDecoration[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: BackgroundDecoration[]) {\n const map = new Map<string, BackgroundDecoration[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: BackgroundDecoration[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorState } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\n\n// 将跨行的 decoration 在换行符的位置再次切割\nfunction cutAtLineBreak(\n decorations: BackgroundDecoration[],\n state: EditorState,\n) {\n const cuts: BackgroundDecoration[] = [];\n\n decorations.forEach(deco => {\n const startLine = state.doc.lineAt(deco.from);\n const endLine = state.doc.lineAt(deco.to);\n if (startLine.number !== endLine.number) {\n const slices: BackgroundDecoration[] = [];\n let pos = deco.from;\n\n for (let i = startLine.number; i < endLine.number; i++) {\n const line = state.doc.line(i);\n\n slices.push({\n from: pos,\n to: line.to,\n className: deco.className,\n });\n\n pos = line.to + 1;\n }\n\n slices.push({\n from: pos,\n to: deco.to,\n className: deco.className,\n });\n\n cuts.push(...slices);\n } else {\n cuts.push(deco);\n }\n });\n\n return cuts;\n}\n\nexport { cutAtLineBreak };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { TreeCursor } from '@lezer/common';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { type EditorState, Facet, RangeSetBuilder } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n type BackgroundDecoration,\n backgroundDecorations,\n} from '../background-decorations';\n\ntype CursorASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\nclass CursorASTView implements PluginValue {\n private classNameDecorationCache: Map<string, Decoration> = new Map();\n\n decorations: DecorationSet = Decoration.none;\n backgroundDecorations: BackgroundDecoration[] = [];\n\n constructor(private view: EditorView) {}\n\n getClassDecoration(className: string) {\n if (!this.classNameDecorationCache.has(className)) {\n this.classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return this.classNameDecorationCache.get(className);\n }\n\n update(update: ViewUpdate) {\n // focus or selection changed\n if (\n (update.focusChanged && update.view.hasFocus) ||\n !update.startState.selection.eq(update.state.selection)\n ) {\n const tree = syntaxTree(update.state);\n const pos = update.state.selection.main.head;\n const decorators = update.state.facet(cursorASTDecoratorFacet);\n\n const cursor = tree.cursorAt(pos, 0);\n const builder = new RangeSetBuilder<Decoration>();\n const bgDecorations: BackgroundDecoration[] = [];\n\n do {\n decorators.forEach(decorator => {\n const decorationSpec = decorator(cursor, update.state);\n if (!decorationSpec) {\n return;\n }\n\n let decoration;\n switch (decorationSpec.type) {\n case 'className':\n decoration = this.getClassDecoration(decorationSpec.className);\n break;\n case 'background':\n bgDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decoration) {\n builder.add(\n decorationSpec.from ?? cursor.from,\n decorationSpec.to ?? cursor.to,\n decoration,\n );\n }\n });\n } while (cursor.parent());\n\n this.decorations = builder.finish();\n this.backgroundDecorations = bgDecorations;\n }\n\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n this.backgroundDecorations = [];\n }\n }\n}\n\nconst cursorASTDecoratorFacet = Facet.define<\n CursorASTDecorator,\n CursorASTDecorator[]\n>({\n enables: [\n ViewPlugin.fromClass(CursorASTView, {\n decorations: v => v.decorations,\n provide(plugin) {\n return [\n backgroundDecorations.of(\n view => view.plugin(plugin)?.backgroundDecorations ?? [],\n ),\n ];\n },\n }),\n ],\n});\n\nexport { cursorASTDecoratorFacet };\n\nexport type { CursorASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n wholeASTDecoratorFacet,\n updateWholeDecorations,\n type WholeASTDecorator,\n} from './whole';\nimport { cursorASTDecoratorFacet, type CursorASTDecorator } from './cursor';\n\nconst astDecorator = {\n whole: wholeASTDecoratorFacet,\n fromCursor: cursorASTDecoratorFacet,\n};\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { traverseAST } from '@coze-editor/utils';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nconst astDebugger = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n printTreeFromState(view.state);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n printTreeFromState(update.state);\n }\n }\n },\n);\n\nfunction printTreeFromState(state: EditorState) {\n const tree = syntaxTree(state);\n\n console.groupCollapsed('Syntax Tree');\n\n const cursor = tree.cursor();\n traverseAST(cursor, 0, tree.length, cursor => {\n console.group(\n `%c${cursor.name}(${cursor.from}:${cursor.to})`,\n 'color: purple;',\n );\n\n console.log(state.sliceDoc(cursor.from, cursor.to));\n console.groupEnd();\n });\n\n console.groupEnd();\n}\n\nexport { astDebugger };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorView, WidgetType, keymap } from '@codemirror/view';\n\n// function blockAt(view: EditorView, pos: number): BlockInfo {\n// const line = view.lineBlockAt(pos)\n// if (Array.isArray(line.type)) for (const l of line.type) {\n// if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text)) return l\n// }\n// return line\n// }\n\nconst focusableKeymap = keymap.of([\n {\n key: 'ArrowLeft',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n const pos = mainSelection.from;\n\n // WHY get widget view directly from view.docView\n // widget has eq method, if eq returns true, new widget will not be applied\n // widget.toDOM will not be called in this case, so widget.focus won't take effect\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtEnd === pos\n ) {\n child.widget.focus(1);\n handled = true;\n }\n }\n\n if (handled) {\n break;\n }\n }\n return handled;\n },\n },\n {\n key: 'ArrowRight',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n\n const pos = mainSelection.from;\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtStart === pos\n ) {\n child.widget.focus(-1);\n handled = true;\n break;\n }\n }\n\n if (handled) {\n break;\n }\n }\n\n return handled;\n },\n },\n]);\n\nabstract class FocusableWidget extends WidgetType {\n abstract focus(fromSide: -1 | 1): void;\n}\n\nexport { focusableKeymap, FocusableWidget };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy, flatten } from '@coze-editor/utils';\nimport { ViewPlugin, type EditorView, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState, Facet } from '@codemirror/state';\n\nimport { mergeIntervals, findContainingRange } from './utils';\n\ninterface Range {\n from: number;\n to: number;\n [key: string]: unknown;\n}\ntype RangesProvider = (state: EditorState) => Range[];\ntype SelectUserEvent = 'select' | 'select.pointer';\n\nconst extension = ViewPlugin.fromClass(\n class {\n lastFocus = false;\n\n constructor(view: EditorView) {\n this.lastFocus = view.hasFocus;\n }\n\n update(update: ViewUpdate) {\n const userEvent = update.state.facet(selectUserEvent) ?? 'select';\n\n const hasSelectUserEvent = update.transactions.some(tr =>\n tr.isUserEvent(userEvent),\n );\n\n if (hasSelectUserEvent) {\n const lastHasFocus = this.lastFocus;\n\n const startSelection = update.startState.selection;\n const { selection } = update.state;\n\n const rangesProviders = update.state.facet(rangesFacet);\n const ranges = mergeIntervals(\n flatten(\n rangesProviders.map(provider => provider(update.view.state)),\n ).filter(Boolean),\n );\n\n const currentRange = findContainingRange(ranges, selection.main.from);\n\n // 1. 从当前选区外进入当前选区\n // 2. 失焦状态进入当前选区(失焦前原本就在 a range 内,聚焦时再次进入 a range 内,需要再次触发选中)\n if (\n selection.main.empty &&\n currentRange &&\n (!lastHasFocus ||\n // 上一次的选区 from 或 to 在当前选区外(“首次进入”当前选区)\n findContainingRange(ranges, startSelection.main.from) !==\n currentRange ||\n findContainingRange(ranges, startSelection.main.to) !==\n currentRange)\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n selection: selection.replaceRange(\n EditorSelection.range(currentRange.from, currentRange.to),\n ),\n });\n });\n }\n }\n\n if (this.lastFocus !== update.view.hasFocus) {\n this.lastFocus = update.view.hasFocus;\n }\n }\n },\n);\n\nconst rangesFacet = Facet.define<RangesProvider>({\n enables: extension,\n});\n\nconst selectUserEvent = Facet.define<SelectUserEvent, SelectUserEvent>({\n combine: FacetCombineStrategy.Last,\n});\n\nexport { rangesFacet, selectUserEvent };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\ninterface RangeLike {\n from: number;\n to: number;\n [key: string]: unknown;\n}\n\nfunction mergeIntervals(ranges: RangeLike[]) {\n if (ranges.length === 0) {\n return [];\n }\n\n const merged: { from: number; to: number }[] = [];\n const cloned = ranges.map(range => ({\n from: range.from,\n to: range.to,\n }));\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n return merged;\n}\n\nfunction findContainingRange(\n ranges: RangeLike[],\n pos: number,\n): RangeLike | undefined {\n for (const range of ranges) {\n if (pos >= range.from && pos <= range.to) {\n return range;\n }\n }\n}\n\nexport { mergeIntervals, findContainingRange };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface SelectionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype SelectionEnlargerProvider = (\n state: EditorState,\n) => SelectionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n // 内容变化或者选区不变,跳过\n if (tr.docChanged || tr.newSelection.eq(tr.startState.selection)) {\n return tr;\n }\n\n const providers = tr.startState.facet(selectionEnlarger);\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n let { newSelection } = tr;\n\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (hasOverlap(range, spec.source)) {\n const isReversed = range.head < range.anchor;\n const from = Math.min(range.from, spec.target.from);\n const to = Math.max(range.to, spec.target.to);\n const newRange = isReversed\n ? EditorSelection.range(\n to,\n from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n )\n : EditorSelection.range(\n from,\n to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n );\n\n newSelection = newSelection.replaceRange(newRange, index);\n }\n }\n });\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n});\n\nconst selectionEnlarger = Facet.define<SelectionEnlargerProvider>({\n enables: extension,\n});\n\nexport { selectionEnlarger };\n\nexport type { SelectionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { ChangeSet, EditorState, Facet } from '@codemirror/state';\n\ninterface DeletionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n const providers = tr.startState.facet(deletionEnlarger);\n\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n const { length } = tr.startState.doc;\n let changes = ChangeSet.empty(length);\n\n tr.changes.iterChanges((fromA, toA, fromB, toB) => {\n const isDeletion = fromB === toB;\n\n if (!isDeletion) {\n return;\n }\n\n for (const spec of specs) {\n if (\n hasOverlap(\n {\n from: fromA,\n to: toA,\n },\n spec.source,\n )\n ) {\n const change = ChangeSet.of([{ ...spec.target, insert: '' }], length);\n\n changes = changes.compose(change.map(changes));\n }\n }\n });\n\n const nextChanges = changes.map(tr.changes);\n\n if (nextChanges.empty) {\n return tr;\n }\n\n return [\n tr,\n {\n changes: nextChanges,\n sequential: true,\n },\n ];\n});\n\nconst deletionEnlarger = Facet.define<DeletionEnlargerProvider>({\n enables: extension,\n});\n\nexport { deletionEnlarger };\n\nexport type { DeletionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// modified from closeBrackets extension (from @codemirror/autocomplete)\nimport { EditorView } from '@codemirror/view';\nimport { type EditorState, Prec, type Extension } from '@codemirror/state';\n\ninterface InputRule {\n type: 'character';\n triggerCharacter: string;\n handler: ({\n view,\n state,\n from,\n to,\n }: {\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n}\n\nconst android =\n typeof navigator === 'object' && /Android\\b/.test(navigator.userAgent);\n\nconst isExtension = (v: unknown): v is Extension => Boolean(v);\nconst inputRules = (rules?: InputRule[]) => {\n const ruleExtensions: Extension[] = (rules ?? [])\n .map(({ type, triggerCharacter, handler }) => {\n if (type === 'character') {\n return EditorView.inputHandler.of((view, from, to, insert) => {\n if (\n (android ? view.composing : view.compositionStarted) ||\n view.state.readOnly\n ) {\n return false;\n }\n const sel = view.state.selection.main;\n if (\n insert !== triggerCharacter ||\n from !== sel.from ||\n to !== sel.to\n ) {\n return false;\n }\n return handler({\n view,\n state: view.state,\n from,\n to,\n });\n });\n }\n })\n .filter(v => isExtension(v));\n\n // give it a higher precedence than default closebrackets extension\n return Prec.high(ruleExtensions);\n};\n\nexport { inputRules };\n\nexport type { InputRule };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as templateParser } from '@coze-editor/lezer-parser-template';\nimport { type Language, LRLanguage } from '@codemirror/language';\n\ninterface MixOptions {\n name?: string;\n outerLanguage?: Language;\n innerLanguage?: Language;\n}\n\nfunction mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions) {\n return LRLanguage.define({\n name,\n parser: templateParser.configure({\n wrap: parseMixed(node => {\n if (outerLanguage && node.type.isTop) {\n return {\n parser: outerLanguage.parser,\n overlay: n => n.type.name === 'Text',\n };\n }\n\n if (innerLanguage && node.name === 'InterpolationContent') {\n return {\n parser: innerLanguage.parser,\n };\n }\n\n return null;\n }),\n }),\n });\n}\n\nexport { mixLanguages };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/// Adapted from https://github.com/nota-lang/nota/blob/master/packages/nota-editor/lib/indentation-guides.ts 做了一些调整\nimport { range } from 'es-toolkit';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { RangeSetBuilder } from '@codemirror/state';\n\nimport { getCodeStart, fromPairs } from './utils';\n\nconst indentationMark = Decoration.mark({ class: 'cm-indentation-guide' });\nconst indentationLevelMarks = range(20).map(i =>\n Decoration.line({ class: `cm-indentation-level-${i}` }),\n);\n\nclass IndentationWidget extends WidgetType {\n constructor(readonly indents: number[]) {\n super();\n }\n\n static create(indents: number[]) {\n return Decoration.widget({\n widget: new IndentationWidget(indents),\n side: 1,\n });\n }\n\n toDOM() {\n const wrap = document.createElement('span');\n wrap.className = 'cm-indentation-widget';\n for (const indent of this.indents) {\n const marker = wrap.appendChild(document.createElement('span'));\n marker.className = 'cm-indentation-guide';\n marker.textContent = ' ';\n wrap.append(' '.repeat(indent - 1));\n }\n return wrap;\n }\n}\n\nfunction makeIndentationMark(\n from: number,\n to: number,\n indent: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n builder.add(from, from, indentationLevelMarks[indent / tabSize]);\n for (let i = from; i < Math.min(from + indent, to); i += tabSize) {\n builder.add(i, i + 1, indentationMark);\n }\n}\n\nfunction makeIndentationWidget(\n from: number,\n to: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n const length = to - from;\n if (length !== 0) {\n return;\n }\n\n if (tabSize > 2) {\n builder.add(to, to, IndentationWidget.create([tabSize]));\n } else {\n builder.add(to, to, IndentationWidget.create([2, tabSize * 2]));\n }\n}\n\nfunction makeIndentationDecorators(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const tabSize = Number(view.state.tabSize);\n const { doc } = view.state;\n const spaceOnlyLines: { from: number; to: number }[] = [];\n let currentIndent = 0;\n for (const { from: visibleFrom, to: visibleTo } of view.visibleRanges) {\n let to = visibleFrom - 1;\n let pos, from, length, text;\n\n while ((pos = to + 1) <= visibleTo) {\n ({ from, to, length, text } = doc.lineAt(pos));\n const codeStartsAt = getCodeStart(text);\n const isAllSpaces = codeStartsAt === length;\n // we don't have indentation guides for the zero indentation level\n const skipIndent = codeStartsAt === 0;\n const isComment = text[codeStartsAt] === '/';\n if (isAllSpaces) {\n spaceOnlyLines.push({ from, to });\n continue;\n } else if (skipIndent) {\n spaceOnlyLines.length = 0;\n continue;\n }\n\n const indent = Math.ceil(codeStartsAt / tabSize) * tabSize;\n\n if (!isComment) {\n currentIndent = indent;\n }\n\n for (const { from: spaceFrom, to: spaceTo } of spaceOnlyLines) {\n makeIndentationMark(\n spaceFrom,\n spaceTo,\n currentIndent,\n tabSize,\n builder,\n );\n makeIndentationWidget(spaceFrom, spaceTo, tabSize, builder);\n }\n spaceOnlyLines.length = 0;\n\n makeIndentationMark(from, to, indent, tabSize, builder);\n }\n }\n return builder.finish();\n}\n\nconst showIndentations = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = makeIndentationDecorators(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = makeIndentationDecorators(update.view);\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nconst indentationTheme = EditorView.baseTheme({\n '.cm-line': {\n paddingLeft: 0,\n marginLeft: '2px',\n },\n '.cm-indentation-guide': {\n position: 'relative',\n },\n '.cm-indentation-guide:after': {\n position: 'absolute',\n content: \"''\",\n right: '0.9ch',\n height: '1.4em',\n borderLeft: '1px solid rgba(28, 31, 35, .08)',\n },\n ...fromPairs(\n indentationLevelMarks.map((_decoration, i) => [\n `.cm-indentation-level-${i}`,\n { textIndent: `-${i * 2}ch`, paddingLeft: `${i * 2}ch` },\n ]),\n ),\n});\n\nexport const indentGuides = () => [showIndentations, indentationTheme];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nconst SPACES = /^\\s*/;\n\nexport const getCodeStart = (text: string) => text.match(SPACES)![0].length;\n\nexport const fromPairs = (pairs: [string, unknown][]) => {\n let index = -1;\n const length = pairs == null ? 0 : pairs.length;\n const result: Record<string, unknown> = {};\n\n while (++index < length) {\n const pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView, layer, type ViewUpdate } from '@codemirror/view';\n\nimport { EmptyBlock } from './empty-block';\n\nexport const scrollBeyondLastLine = (scrollHeight?: number) => [\n layer({\n above: false,\n updateOnDocViewUpdate: true,\n class: 'cm-empty-marker-layer',\n update(update: ViewUpdate): boolean {\n return update.state.doc.lines !== update.startState.doc.lines;\n },\n markers(view) {\n const maker = new EmptyBlock(\n view.state.doc.lines,\n view.contentHeight,\n scrollHeight,\n );\n return [maker];\n },\n }),\n EditorView.theme({\n '& .cm-empty-marker-layer': {\n height: '100%',\n },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { LayerMarker } from '@codemirror/view';\n\nexport class EmptyBlock implements LayerMarker {\n constructor(\n private lineNumber: number,\n readonly contentHeight: number,\n readonly scrollHeight?: number,\n ) {}\n\n draw() {\n const elt = document.createElement('div');\n elt.className = 'cm-empty-scroll-block-maker';\n this.adjust(elt);\n return elt;\n }\n\n update(_: HTMLElement, prev: EmptyBlock) {\n return (\n prev.lineNumber === this.lineNumber &&\n prev.contentHeight === this.contentHeight &&\n prev.scrollHeight === this.scrollHeight\n );\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.display = 'block';\n elt.style.width = '1px';\n\n if (this.lineNumber > 1) {\n elt.style.height = `calc(${typeof this.scrollHeight === 'number' ? `${this.scrollHeight}px` : '100%'} + ${this.contentHeight}px)`;\n } else {\n elt.style.height = '0';\n }\n }\n\n eq(p: EmptyBlock) {\n return (\n this.lineNumber === p.lineNumber &&\n this.contentHeight === p.contentHeight &&\n this.scrollHeight === p.scrollHeight\n );\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet, EditorView } from '@codemirror/view';\nimport { type EditorState, StateField, type Range } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n '(': ')',\n '{': '}',\n '[': ']',\n ')': '(',\n '}': '{',\n ']': '[',\n};\n\nconst findMatchingBracket = (state: EditorState, cursorPos: number) => {\n try {\n const doc = state.doc.toString();\n let stack: string[] = [];\n let leftIndex = -1;\n let rightIndex = -1;\n\n // 向前查找\n for (let i = cursorPos - 1; i >= 0; i--) {\n const char = doc[i];\n if (pairs[char]) {\n if ([')', '}', ']'].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n leftIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n stack = [];\n\n // 向后查找\n for (let i = cursorPos; i < doc.length; i++) {\n const char = doc[i];\n if (pairs[char]) {\n if (['(', '{', '['].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n rightIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n if (leftIndex !== -1 && rightIndex !== -1) {\n return [leftIndex, rightIndex];\n }\n\n return null;\n } catch (e) {\n console.error('findMatchingBracket failed', e);\n return null;\n }\n};\n\nconst renderMatch = (match: number) => {\n const decorations: Range<Decoration>[] = [];\n const mark = Decoration.mark({ class: 'cm-matchingBracket' });\n decorations.push(mark.range(match, match + 1));\n return decorations;\n};\n\nconst bracketMatchingState = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(deco, tr) {\n if (!tr.docChanged && !tr.selection) {\n return deco;\n }\n\n let decorations: Range<Decoration>[] = [];\n\n for (const range of tr.state.selection.ranges) {\n if (!range.empty) {\n continue;\n }\n const match = findMatchingBracket(tr.state, range.head);\n\n if (match) {\n decorations = decorations.concat(\n renderMatch(match[0]),\n renderMatch(match[1]),\n );\n }\n }\n\n return Decoration.set(decorations, true);\n },\n provide: f => EditorView.decorations.from(f),\n});\n\nexport const matchingBrackets = [bracketMatchingState];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n type ViewUpdate,\n type DecorationSet,\n} from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\n\nconst DEFAULT_COLORS = ['#ffd700', '#da70d6', '#179fff'];\n\nconst ColorizationBracketsPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.getBracketDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = this.getBracketDecorations(update.view);\n }\n }\n\n getBracketDecorations(view: EditorView) {\n const { doc } = view.state;\n const decorations: any[] = [];\n const stack: { type: string; from: number }[] = [];\n const limitNodeType = ['Comment', 'String'];\n\n const tree = syntaxTree(view.state);\n\n for (let pos = 0; pos < doc.length; pos += 1) {\n const char = doc.sliceString(pos, pos + 1);\n const node = tree.resolveInner(pos);\n\n if (limitNodeType.includes(node.type.name)) {\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n stack.push({ type: char, from: pos });\n } else if (char === ')' || char === ']' || char === '}') {\n const open = stack.pop();\n if (open && open.type === this.getMatchingBracket(char)) {\n const index = stack.length % 3;\n decorations.push(\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n open.from,\n open.from + 1,\n ),\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n pos,\n pos + 1,\n ),\n );\n }\n }\n }\n\n decorations.sort((a, b) => a.from - b.from || a.startSide - b.startSide);\n\n return Decoration.set(decorations);\n }\n\n getMatchingBracket(closingBracket: string) {\n switch (closingBracket) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n default:\n return null;\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nexport const colorizationBrackets = [\n ColorizationBracketsPlugin,\n EditorView.baseTheme({\n '.colorization-bracket-0': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-0 > span': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-1': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-1 > span': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-2': { color: DEFAULT_COLORS[2] },\n '.colorization-bracket-2 > span': { color: DEFAULT_COLORS[2] },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n Direction,\n type EditorView,\n type LayerMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { Facet } from '@codemirror/state';\n\nenum SelectionSide {\n Head = 'head',\n Anchor = 'anchor',\n}\n\ninterface PositionElement {\n dom: HTMLElement | null;\n pos: SelectionSide | number | ((view: EditorView) => number);\n}\nconst elementAtPosition = Facet.define<PositionElement, PositionElement[]>();\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(elementAtPosition) !==\n update.state.facet(elementAtPosition)\n );\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nclass PositionMarker implements LayerMarker {\n constructor(\n public readonly dom: HTMLElement,\n public readonly rect?: Rect,\n ) {}\n\n eq(marker: PositionMarker) {\n return Boolean(\n ((!this.rect && !marker.rect) ||\n (this.rect &&\n marker.rect &&\n this.rect.left === marker.rect.left &&\n this.rect.top === marker.rect.top &&\n this.rect.width === marker.rect.width &&\n this.rect.height === marker.rect.height)) &&\n this.dom === marker.dom,\n );\n }\n\n draw() {\n this.adjust(this.dom);\n return this.dom;\n }\n\n update() {\n this.adjust(this.dom);\n return true;\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.pointerEvents = 'none';\n\n if (!this.rect) {\n return;\n }\n elt.style.left = `${this.rect.left}px`;\n elt.style.top = `${this.rect.top}px`;\n elt.style.width = `${this.rect.width}px`;\n elt.style.height = `${this.rect.height}px`;\n }\n}\n\nfunction getBase(view: EditorView) {\n const rect = view.scrollDOM.getBoundingClientRect();\n const left =\n view.textDirection === Direction.LTR\n ? rect.left\n : rect.right - view.scrollDOM.clientWidth * view.scaleX;\n return {\n left: left - view.scrollDOM.scrollLeft * view.scaleX,\n top: rect.top - view.scrollDOM.scrollTop * view.scaleY,\n };\n}\n\nconst positionElementLayer = layer({\n above: true,\n\n markers(view: EditorView) {\n const elements = view.state.facet(elementAtPosition);\n\n if (!elements || elements.length === 0) {\n return [];\n }\n\n const base = getBase(view);\n\n const temp: any[] = [];\n\n const markers: PositionMarker[] = [];\n for (const { dom, pos } of elements) {\n if (!dom) {\n continue;\n }\n\n let finalPos = -1;\n\n if (typeof pos === 'function') {\n finalPos = pos(view);\n } else if (typeof pos === 'number') {\n finalPos = pos;\n } else if (pos === SelectionSide.Head) {\n finalPos = view.state.selection.main.head;\n } else if (pos === SelectionSide.Anchor) {\n finalPos = view.state.selection.main.anchor;\n }\n\n const coords = view.coordsAtPos(finalPos);\n\n // 由于 codemirror 实现了局部渲染,可能取不到 coords\n if (coords) {\n temp.push(coords);\n\n const width = 1;\n const left = coords.left - base.left - width / 2;\n const top = coords.top - base.top;\n const height = coords.bottom - coords.top;\n\n markers.push(new PositionMarker(dom, { left, top, width, height }));\n } else {\n markers.push(new PositionMarker(dom));\n }\n }\n\n return markers;\n },\n\n update(update) {\n return (\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n\n class: 'cm-positionReferenceLayer',\n});\n\nexport { elementAtPosition, positionElementLayer, SelectionSide };\n\nexport type { PositionElement };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, EditorView } from '@codemirror/view';\nimport { Facet, type RangeSet, RangeSetBuilder } from '@codemirror/state';\n\nimport { type MarkDecorationSpec, squash } from './squash';\n\nconst cache = new Map<string, Decoration>();\nfunction getClassNameDecoration(className: string) {\n const cacheKey = className;\n\n if (!cache.has(cacheKey)) {\n const mark = Decoration.mark({ class: className });\n cache.set(cacheKey, mark);\n }\n\n return cache.get(cacheKey)!;\n}\n\nconst mergeableMarkers = Facet.define<\n MarkDecorationSpec[],\n RangeSet<Decoration>\n>({\n combine(specs) {\n const builder = new RangeSetBuilder<Decoration>();\n\n const flattened = specs.reduce(\n (memo, current) => [...memo, ...current],\n [],\n );\n\n for (const spec of squash(flattened)) {\n const decoration = getClassNameDecoration(spec.className);\n builder.add(spec.from, spec.to, decoration);\n }\n\n return builder.finish();\n },\n enables(self) {\n return EditorView.decorations.compute([self], state => state.facet(self));\n },\n});\n\nexport { mergeableMarkers };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport interface MarkDecorationSpec {\n from: number;\n to: number;\n className: string;\n}\n\nfunction squash(decorations: MarkDecorationSpec[]) {\n const result: MarkDecorationSpec[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n result.sort((a, b) => a.from - b.from);\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: MarkDecorationSpec[]) {\n const map = new Map<string, MarkDecorationSpec[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: MarkDecorationSpec[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n"],"mappings":"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","names":["Facet","backgroundDecorations","Facet","Decoration","Facet","syntaxTree","Decoration","syntaxTree","Facet","traverseAST","ViewPlugin","syntaxTree","cursor","ViewPlugin","EditorSelection","Facet","mergeIntervals","range","ViewPlugin","mergeIntervals","EditorSelection","Facet","flatten","EditorSelection","Facet","extension","range","flatten","hasOverlap","EditorState","Facet","extension","EditorView","Prec","Decoration","EditorView","ViewPlugin","WidgetType","RangeSetBuilder","pairs","Decoration","WidgetType","RangeSetBuilder","ViewPlugin","EditorView","EditorView","layer","layer","EditorView","Decoration","EditorView","StateField","range","EditorView","Decoration","ViewPlugin","syntaxTree","layer","Facet","SelectionSide","configChanged","Decoration","EditorView","Facet","RangeSetBuilder","squash","groupDecorationsByClassName","mergeIntervals","Decoration","Facet","RangeSetBuilder","squash","EditorView"]}
1
+ {"version":3,"sources":["../../src/ast-decorator/whole.ts","../../src/background-decorations/index.ts","../../src/background-decorations/squash.ts","../../src/background-decorations/cut.ts","../../src/ast-decorator/cursor.ts","../../src/ast-decorator/index.ts","../../src/ast-debugger/index.ts","../../src/focusable/focusable.ts","../../src/auto-select-ranges/extension.ts","../../src/auto-select-ranges/utils.ts","../../src/selection-enlarger/extension.ts","../../src/deletion-enlarger/extension.ts","../../src/input-rules/index.ts","../../src/mix-languages/mix.ts","../../src/indent-guides/index.ts","../../src/indent-guides/utils.ts","../../src/scroll-beyond-last-line/index.ts","../../src/scroll-beyond-last-line/empty-block.ts","../../src/brackets/matching-brackets.ts","../../src/brackets/colorization.ts","../../src/position/index.ts","../../src/mergeable-markers/index.ts","../../src/mergeable-markers/squash.ts","../../src/frozen-ranges/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { omit } from 'es-toolkit';\nimport type { Tree, TreeCursor } from '@lezer/common';\nimport { traverseAST } from '@coze-editor/utils';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type WidgetType,\n} from '@codemirror/view';\nimport {\n type EditorState,\n type Range,\n Facet,\n RangeSet,\n StateEffect,\n StateField,\n Prec,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n backgroundDecorations,\n backgroundDecoratorLayer,\n type BackgroundDecoration,\n} from '../background-decorations';\n\ntype Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n atomicRange?: boolean;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n prec?: Precedence;\n}\n\ninterface ReplaceDecorationSpec extends BaseDecorationSpec {\n type: 'replace';\n widget?: WidgetType;\n inclusive?: boolean;\n inclusiveStart?: boolean;\n inclusiveEnd?: boolean;\n block?: boolean;\n}\n\ninterface WidgetDecorationSpec extends BaseDecorationSpec {\n type: 'widget';\n widget: WidgetType;\n side?: number;\n inlineOrder?: boolean;\n block?: boolean;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\ntype DecorationSpec =\n | ClassNameDecorationSpec\n | ReplaceDecorationSpec\n | WidgetDecorationSpec\n | BackgroundDecorationSpec;\n\ntype WholeASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => DecorationSpec[] | DecorationSpec | undefined;\n\nconst updateWholeDecorationsEffect = StateEffect.define();\n\nfunction updateWholeDecorations(view: EditorView) {\n view.dispatch({\n effects: updateWholeDecorationsEffect.of(null),\n });\n}\n\nconst classNameDecorationCache: Map<string, Decoration> = new Map();\nfunction getClassDecoration(className: string): Decoration {\n if (!classNameDecorationCache.has(className)) {\n classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return classNameDecorationCache.get(className)!;\n}\n\ntype CategoriedDecorationSet = Record<Precedence, DecorationSet>;\n\nfunction buildDecorations(state: EditorState, tree: Tree) {\n const decorates = state.facet(wholeASTDecoratorFacet) ?? [];\n\n const treeCursor = tree.cursor();\n const decorations: CategoriedDecorationSet = {\n highest: Decoration.none,\n high: Decoration.none,\n default: Decoration.none,\n low: Decoration.none,\n lowest: Decoration.none,\n };\n let atomicRanges = RangeSet.empty;\n let backgroundDecorations: BackgroundDecoration[] = [];\n\n const from = 0;\n const to = state.doc.length;\n traverseAST(treeCursor, from, to, cursor => {\n decorates.forEach(decorate => {\n const decorationSpec = decorate(cursor, state);\n\n let specs: DecorationSpec[] = [];\n if (Array.isArray(decorationSpec)) {\n specs = decorationSpec;\n } else if (decorationSpec) {\n specs = [decorationSpec];\n }\n\n specs.forEach(spec => {\n const result = updateDecorationSpec(cursor, spec, {\n decorations,\n backgroundDecorations,\n atomicRanges,\n });\n\n if (!result) {\n return;\n }\n\n backgroundDecorations = result.backgroundDecorations;\n atomicRanges = result.atomicRanges;\n });\n });\n });\n\n return {\n decorations,\n atomicRanges,\n backgroundDecorations,\n };\n}\n\nfunction updateDecorationSpec(\n cursor: TreeCursor,\n decorationSpec: DecorationSpec | undefined,\n {\n decorations,\n backgroundDecorations,\n atomicRanges,\n }: {\n decorations: CategoriedDecorationSet;\n backgroundDecorations: BackgroundDecoration[];\n atomicRanges: RangeSet<any>;\n },\n) {\n if (!decorationSpec) {\n return;\n }\n\n const from = decorationSpec.from ?? cursor.from;\n const to = decorationSpec.to ?? cursor.to;\n\n const omitKeys = ['type', 'from', 'to', 'atomicRange'] as const;\n\n let decorationRange: Range<Decoration> | null = null;\n switch (decorationSpec.type) {\n case 'className':\n // from === to marker will cause delete issue\n // e.g. {{content}} renders as `replace-widget mark replace-widget`\n // delete from end of content to start of content\n // when delete to first letter of content, the delete behavior is strange\n decorationRange =\n from === to\n ? null\n : getClassDecoration(decorationSpec.className).range(from, to);\n break;\n case 'replace':\n decorationRange = Decoration.replace(\n omit(decorationSpec, omitKeys),\n ).range(from, to);\n break;\n case 'widget':\n decorationRange = Decoration.widget(omit(decorationSpec, omitKeys)).range(\n from,\n );\n break;\n case 'background':\n backgroundDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decorationRange) {\n const prec =\n decorationSpec.type === 'className'\n ? (decorationSpec.prec ?? 'default')\n : 'default';\n\n if (decorations[prec]) {\n decorations[prec] = decorations[prec].update({\n add: [decorationRange],\n sort: true,\n });\n }\n }\n\n if (\n decorationSpec.type !== 'background' &&\n decorationRange &&\n decorationSpec.atomicRange === true\n ) {\n atomicRanges = atomicRanges.update({\n add: [decorationRange],\n sort: true,\n });\n }\n\n return {\n decorations,\n backgroundDecorations,\n atomicRanges,\n };\n}\n\nconst decorateField = StateField.define<{\n decorations: CategoriedDecorationSet;\n atomicRanges: RangeSet<any>;\n backgroundDecorations: BackgroundDecoration[];\n}>({\n create(state) {\n return buildDecorations(state, syntaxTree(state));\n },\n update(value, tr) {\n const tree = syntaxTree(tr.state);\n\n const hasUpdateEffect = tr.effects.some(effect =>\n effect.is(updateWholeDecorationsEffect),\n );\n const syntaxTreeChanged = syntaxTree(tr.startState) !== tree;\n if (syntaxTreeChanged || hasUpdateEffect) {\n value = buildDecorations(tr.state, tree);\n }\n return value;\n },\n provide(field) {\n return [\n Prec.highest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.highest,\n ),\n ),\n Prec.high(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.high,\n ),\n ),\n Prec.default(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.default,\n ),\n ),\n Prec.low(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.low,\n ),\n ),\n Prec.lowest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.lowest,\n ),\n ),\n\n EditorView.atomicRanges.of(view => view.state.field(field).atomicRanges),\n backgroundDecorations.of(\n view => view.state.field(field).backgroundDecorations,\n ),\n ];\n },\n});\n\nconst wholeASTDecoratorFacet = Facet.define<\n WholeASTDecorator,\n WholeASTDecorator[]\n>({\n enables: [decorateField, backgroundDecoratorLayer],\n});\n\nexport { wholeASTDecoratorFacet, updateWholeDecorations };\n\nexport type { WholeASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n type EditorView,\n RectangleMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { EditorSelection, Facet } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\nimport { squash } from './squash';\nimport { cutAtLineBreak } from './cut';\n\ntype BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(backgroundDecorations) !==\n update.state.facet(backgroundDecorations)\n );\n}\n\n// 使用时需置于 drawSelection 下方(影响 zIndex)\nconst backgroundDecoratorLayer = layer({\n above: false,\n markers(view) {\n const decorations = view.state\n .facet(backgroundDecorations)\n .reduce<\n BackgroundDecoration[]\n >((memo, current) => [...memo, ...current(view)], []);\n\n return cutAtLineBreak(squash(decorations), view.state)\n .map(deco =>\n RectangleMarker.forRange(\n view,\n deco.className,\n EditorSelection.range(deco.from, deco.to),\n ),\n )\n .reduce((memo, current) => [...memo, ...current], []);\n },\n update(update) {\n return (\n update.focusChanged ||\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n class: 'cm-backgroundDecoratorLayer',\n});\n\nconst backgroundDecorations = Facet.define<\n BackgroundDecorationFn,\n BackgroundDecorationFn[]\n>({\n enables: [backgroundDecoratorLayer],\n});\n\nexport { backgroundDecoratorLayer, backgroundDecorations };\n\nexport type { BackgroundDecoration };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { BackgroundDecoration } from './types';\n\nfunction squash(decorations: BackgroundDecoration[]) {\n const result: BackgroundDecoration[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: BackgroundDecoration[]) {\n const map = new Map<string, BackgroundDecoration[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: BackgroundDecoration[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorState } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\n\n// 将跨行的 decoration 在换行符的位置再次切割\nfunction cutAtLineBreak(\n decorations: BackgroundDecoration[],\n state: EditorState,\n) {\n const cuts: BackgroundDecoration[] = [];\n\n decorations.forEach(deco => {\n const startLine = state.doc.lineAt(deco.from);\n const endLine = state.doc.lineAt(deco.to);\n if (startLine.number !== endLine.number) {\n const slices: BackgroundDecoration[] = [];\n let pos = deco.from;\n\n for (let i = startLine.number; i < endLine.number; i++) {\n const line = state.doc.line(i);\n\n slices.push({\n from: pos,\n to: line.to,\n className: deco.className,\n });\n\n pos = line.to + 1;\n }\n\n slices.push({\n from: pos,\n to: deco.to,\n className: deco.className,\n });\n\n cuts.push(...slices);\n } else {\n cuts.push(deco);\n }\n });\n\n return cuts;\n}\n\nexport { cutAtLineBreak };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { TreeCursor } from '@lezer/common';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { type EditorState, Facet, RangeSetBuilder } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n type BackgroundDecoration,\n backgroundDecorations,\n} from '../background-decorations';\n\ntype CursorASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\nclass CursorASTView implements PluginValue {\n private classNameDecorationCache: Map<string, Decoration> = new Map();\n\n decorations: DecorationSet = Decoration.none;\n backgroundDecorations: BackgroundDecoration[] = [];\n\n constructor(private view: EditorView) {}\n\n getClassDecoration(className: string) {\n if (!this.classNameDecorationCache.has(className)) {\n this.classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return this.classNameDecorationCache.get(className);\n }\n\n update(update: ViewUpdate) {\n // focus or selection changed\n if (\n (update.focusChanged && update.view.hasFocus) ||\n !update.startState.selection.eq(update.state.selection)\n ) {\n const tree = syntaxTree(update.state);\n const pos = update.state.selection.main.head;\n const decorators = update.state.facet(cursorASTDecoratorFacet);\n\n const cursor = tree.cursorAt(pos, 0);\n const builder = new RangeSetBuilder<Decoration>();\n const bgDecorations: BackgroundDecoration[] = [];\n\n do {\n decorators.forEach(decorator => {\n const decorationSpec = decorator(cursor, update.state);\n if (!decorationSpec) {\n return;\n }\n\n let decoration;\n switch (decorationSpec.type) {\n case 'className':\n decoration = this.getClassDecoration(decorationSpec.className);\n break;\n case 'background':\n bgDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decoration) {\n builder.add(\n decorationSpec.from ?? cursor.from,\n decorationSpec.to ?? cursor.to,\n decoration,\n );\n }\n });\n } while (cursor.parent());\n\n this.decorations = builder.finish();\n this.backgroundDecorations = bgDecorations;\n }\n\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n this.backgroundDecorations = [];\n }\n }\n}\n\nconst cursorASTDecoratorFacet = Facet.define<\n CursorASTDecorator,\n CursorASTDecorator[]\n>({\n enables: [\n ViewPlugin.fromClass(CursorASTView, {\n decorations: v => v.decorations,\n provide(plugin) {\n return [\n backgroundDecorations.of(\n view => view.plugin(plugin)?.backgroundDecorations ?? [],\n ),\n ];\n },\n }),\n ],\n});\n\nexport { cursorASTDecoratorFacet };\n\nexport type { CursorASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n wholeASTDecoratorFacet,\n updateWholeDecorations,\n type WholeASTDecorator,\n} from './whole';\nimport { cursorASTDecoratorFacet, type CursorASTDecorator } from './cursor';\n\nconst astDecorator = {\n whole: wholeASTDecoratorFacet,\n fromCursor: cursorASTDecoratorFacet,\n};\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { traverseAST } from '@coze-editor/utils';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nconst astDebugger = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n printTreeFromState(view.state);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n printTreeFromState(update.state);\n }\n }\n },\n);\n\nfunction printTreeFromState(state: EditorState) {\n const tree = syntaxTree(state);\n\n console.groupCollapsed('Syntax Tree');\n\n const cursor = tree.cursor();\n traverseAST(cursor, 0, tree.length, cursor => {\n console.group(\n `%c${cursor.name}(${cursor.from}:${cursor.to})`,\n 'color: purple;',\n );\n\n console.log(state.sliceDoc(cursor.from, cursor.to));\n console.groupEnd();\n });\n\n console.groupEnd();\n}\n\nexport { astDebugger };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorView, WidgetType, keymap } from '@codemirror/view';\n\n// function blockAt(view: EditorView, pos: number): BlockInfo {\n// const line = view.lineBlockAt(pos)\n// if (Array.isArray(line.type)) for (const l of line.type) {\n// if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text)) return l\n// }\n// return line\n// }\n\nconst focusableKeymap = keymap.of([\n {\n key: 'ArrowLeft',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n const pos = mainSelection.from;\n\n // WHY get widget view directly from view.docView\n // widget has eq method, if eq returns true, new widget will not be applied\n // widget.toDOM will not be called in this case, so widget.focus won't take effect\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtEnd === pos\n ) {\n child.widget.focus(1);\n handled = true;\n }\n }\n\n if (handled) {\n break;\n }\n }\n return handled;\n },\n },\n {\n key: 'ArrowRight',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n\n const pos = mainSelection.from;\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtStart === pos\n ) {\n child.widget.focus(-1);\n handled = true;\n break;\n }\n }\n\n if (handled) {\n break;\n }\n }\n\n return handled;\n },\n },\n]);\n\nabstract class FocusableWidget extends WidgetType {\n abstract focus(fromSide: -1 | 1): void;\n}\n\nexport { focusableKeymap, FocusableWidget };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy, flatten } from '@coze-editor/utils';\nimport { ViewPlugin, type EditorView, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState, Facet } from '@codemirror/state';\n\nimport { mergeIntervals, findContainingRange } from './utils';\n\ninterface Range {\n from: number;\n to: number;\n}\ntype RangesProvider = (state: EditorState) => Range[];\ntype SelectUserEvent = 'select' | 'select.pointer';\n\nconst extension = ViewPlugin.fromClass(\n class {\n lastFocus = false;\n\n constructor(view: EditorView) {\n this.lastFocus = view.hasFocus;\n }\n\n update(update: ViewUpdate) {\n const userEvent = update.state.facet(selectUserEvent) ?? 'select';\n\n const hasSelectUserEvent = update.transactions.some(tr =>\n tr.isUserEvent(userEvent),\n );\n\n if (hasSelectUserEvent) {\n const lastHasFocus = this.lastFocus;\n\n const startSelection = update.startState.selection;\n const { selection } = update.state;\n\n const rangesProviders = update.state.facet(rangesFacet);\n const ranges = mergeIntervals(\n flatten(\n rangesProviders.map(provider => provider(update.view.state)),\n ).filter(Boolean),\n );\n\n const currentRange = findContainingRange(ranges, selection.main.from);\n\n // 1. 从当前选区外进入当前选区\n // 2. 失焦状态进入当前选区(失焦前原本就在 a range 内,聚焦时再次进入 a range 内,需要再次触发选中)\n if (\n selection.main.empty &&\n currentRange &&\n (!lastHasFocus ||\n // 上一次的选区 from 或 to 在当前选区外(“首次进入”当前选区)\n findContainingRange(ranges, startSelection.main.from) !==\n currentRange ||\n findContainingRange(ranges, startSelection.main.to) !==\n currentRange)\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n selection: selection.replaceRange(\n EditorSelection.range(currentRange.from, currentRange.to),\n ),\n });\n });\n }\n }\n\n if (this.lastFocus !== update.view.hasFocus) {\n this.lastFocus = update.view.hasFocus;\n }\n }\n },\n);\n\nconst rangesFacet = Facet.define<RangesProvider>({\n enables: extension,\n});\n\nconst selectUserEvent = Facet.define<SelectUserEvent, SelectUserEvent>({\n combine: FacetCombineStrategy.Last,\n});\n\nexport { rangesFacet, selectUserEvent };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\ninterface Range {\n from: number;\n to: number;\n}\n\nfunction mergeIntervals(ranges: Range[]) {\n if (ranges.length === 0) {\n return [];\n }\n\n const merged: { from: number; to: number }[] = [];\n const cloned = ranges.map(range => ({\n from: range.from,\n to: range.to,\n }));\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n return merged;\n}\n\nfunction findContainingRange(ranges: Range[], pos: number): Range | undefined {\n for (const range of ranges) {\n if (pos >= range.from && pos <= range.to) {\n return range;\n }\n }\n}\n\nexport { mergeIntervals, findContainingRange };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface SelectionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype SelectionEnlargerProvider = (\n state: EditorState,\n) => SelectionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n // 内容变化或者选区不变,跳过\n if (tr.docChanged || tr.newSelection.eq(tr.startState.selection)) {\n return tr;\n }\n\n const providers = tr.startState.facet(selectionEnlarger);\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n let { newSelection } = tr;\n\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (hasOverlap(range, spec.source)) {\n const isReversed = range.head < range.anchor;\n const from = Math.min(range.from, spec.target.from);\n const to = Math.max(range.to, spec.target.to);\n const newRange = isReversed\n ? EditorSelection.range(\n to,\n from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n )\n : EditorSelection.range(\n from,\n to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n );\n\n newSelection = newSelection.replaceRange(newRange, index);\n }\n }\n });\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n});\n\nconst selectionEnlarger = Facet.define<SelectionEnlargerProvider>({\n enables: extension,\n});\n\nexport { selectionEnlarger };\n\nexport type { SelectionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { ChangeSet, EditorState, Facet } from '@codemirror/state';\n\ninterface DeletionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n const providers = tr.startState.facet(deletionEnlarger);\n\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n const { length } = tr.startState.doc;\n let changes = ChangeSet.empty(length);\n\n tr.changes.iterChanges((fromA, toA, fromB, toB) => {\n const isDeletion = fromB === toB;\n\n if (!isDeletion) {\n return;\n }\n\n for (const spec of specs) {\n if (\n hasOverlap(\n {\n from: fromA,\n to: toA,\n },\n spec.source,\n )\n ) {\n const change = ChangeSet.of([{ ...spec.target, insert: '' }], length);\n\n changes = changes.compose(change.map(changes));\n }\n }\n });\n\n const nextChanges = changes.map(tr.changes);\n\n if (nextChanges.empty) {\n return tr;\n }\n\n return [\n tr,\n {\n changes: nextChanges,\n sequential: true,\n },\n ];\n});\n\nconst deletionEnlarger = Facet.define<DeletionEnlargerProvider>({\n enables: extension,\n});\n\nexport { deletionEnlarger };\n\nexport type { DeletionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// modified from closeBrackets extension (from @codemirror/autocomplete)\nimport { EditorView } from '@codemirror/view';\nimport { type EditorState, Prec, type Extension } from '@codemirror/state';\n\ninterface InputRule {\n type: 'character';\n triggerCharacter: string;\n handler: ({\n view,\n state,\n from,\n to,\n }: {\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n}\n\nconst android =\n typeof navigator === 'object' && /Android\\b/.test(navigator.userAgent);\n\nconst isExtension = (v: unknown): v is Extension => Boolean(v);\nconst inputRules = (rules?: InputRule[]) => {\n const ruleExtensions: Extension[] = (rules ?? [])\n .map(({ type, triggerCharacter, handler }) => {\n if (type === 'character') {\n return EditorView.inputHandler.of((view, from, to, insert) => {\n if (\n (android ? view.composing : view.compositionStarted) ||\n view.state.readOnly\n ) {\n return false;\n }\n const sel = view.state.selection.main;\n if (\n insert !== triggerCharacter ||\n from !== sel.from ||\n to !== sel.to\n ) {\n return false;\n }\n return handler({\n view,\n state: view.state,\n from,\n to,\n });\n });\n }\n })\n .filter(v => isExtension(v));\n\n // give it a higher precedence than default closebrackets extension\n return Prec.high(ruleExtensions);\n};\n\nexport { inputRules };\n\nexport type { InputRule };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as templateParser } from '@coze-editor/lezer-parser-template';\nimport { type Language, LRLanguage } from '@codemirror/language';\n\ninterface MixOptions {\n name?: string;\n outerLanguage?: Language;\n innerLanguage?: Language;\n}\n\nfunction mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions) {\n return LRLanguage.define({\n name,\n parser: templateParser.configure({\n wrap: parseMixed(node => {\n if (outerLanguage && node.type.isTop) {\n return {\n parser: outerLanguage.parser,\n overlay: n => n.type.name === 'Text',\n };\n }\n\n if (innerLanguage && node.name === 'InterpolationContent') {\n return {\n parser: innerLanguage.parser,\n };\n }\n\n return null;\n }),\n }),\n });\n}\n\nexport { mixLanguages };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/// Adapted from https://github.com/nota-lang/nota/blob/master/packages/nota-editor/lib/indentation-guides.ts 做了一些调整\nimport { range } from 'es-toolkit';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { RangeSetBuilder } from '@codemirror/state';\n\nimport { getCodeStart, fromPairs } from './utils';\n\nconst indentationMark = Decoration.mark({ class: 'cm-indentation-guide' });\nconst indentationLevelMarks = range(20).map(i =>\n Decoration.line({ class: `cm-indentation-level-${i}` }),\n);\n\nclass IndentationWidget extends WidgetType {\n constructor(readonly indents: number[]) {\n super();\n }\n\n static create(indents: number[]) {\n return Decoration.widget({\n widget: new IndentationWidget(indents),\n side: 1,\n });\n }\n\n toDOM() {\n const wrap = document.createElement('span');\n wrap.className = 'cm-indentation-widget';\n for (const indent of this.indents) {\n const marker = wrap.appendChild(document.createElement('span'));\n marker.className = 'cm-indentation-guide';\n marker.textContent = ' ';\n wrap.append(' '.repeat(indent - 1));\n }\n return wrap;\n }\n}\n\nfunction makeIndentationMark(\n from: number,\n to: number,\n indent: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n builder.add(from, from, indentationLevelMarks[indent / tabSize]);\n for (let i = from; i < Math.min(from + indent, to); i += tabSize) {\n builder.add(i, i + 1, indentationMark);\n }\n}\n\nfunction makeIndentationWidget(\n from: number,\n to: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n const length = to - from;\n if (length !== 0) {\n return;\n }\n\n if (tabSize > 2) {\n builder.add(to, to, IndentationWidget.create([tabSize]));\n } else {\n builder.add(to, to, IndentationWidget.create([2, tabSize * 2]));\n }\n}\n\nfunction makeIndentationDecorators(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const tabSize = Number(view.state.tabSize);\n const { doc } = view.state;\n const spaceOnlyLines: { from: number; to: number }[] = [];\n let currentIndent = 0;\n for (const { from: visibleFrom, to: visibleTo } of view.visibleRanges) {\n let to = visibleFrom - 1;\n let pos, from, length, text;\n\n while ((pos = to + 1) <= visibleTo) {\n ({ from, to, length, text } = doc.lineAt(pos));\n const codeStartsAt = getCodeStart(text);\n const isAllSpaces = codeStartsAt === length;\n // we don't have indentation guides for the zero indentation level\n const skipIndent = codeStartsAt === 0;\n const isComment = text[codeStartsAt] === '/';\n if (isAllSpaces) {\n spaceOnlyLines.push({ from, to });\n continue;\n } else if (skipIndent) {\n spaceOnlyLines.length = 0;\n continue;\n }\n\n const indent = Math.ceil(codeStartsAt / tabSize) * tabSize;\n\n if (!isComment) {\n currentIndent = indent;\n }\n\n for (const { from: spaceFrom, to: spaceTo } of spaceOnlyLines) {\n makeIndentationMark(\n spaceFrom,\n spaceTo,\n currentIndent,\n tabSize,\n builder,\n );\n makeIndentationWidget(spaceFrom, spaceTo, tabSize, builder);\n }\n spaceOnlyLines.length = 0;\n\n makeIndentationMark(from, to, indent, tabSize, builder);\n }\n }\n return builder.finish();\n}\n\nconst showIndentations = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = makeIndentationDecorators(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = makeIndentationDecorators(update.view);\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nconst indentationTheme = EditorView.baseTheme({\n '.cm-line': {\n paddingLeft: 0,\n marginLeft: '2px',\n },\n '.cm-indentation-guide': {\n position: 'relative',\n },\n '.cm-indentation-guide:after': {\n position: 'absolute',\n content: \"''\",\n right: '0.9ch',\n height: '1.4em',\n borderLeft: '1px solid rgba(28, 31, 35, .08)',\n },\n ...fromPairs(\n indentationLevelMarks.map((_decoration, i) => [\n `.cm-indentation-level-${i}`,\n { textIndent: `-${i * 2}ch`, paddingLeft: `${i * 2}ch` },\n ]),\n ),\n});\n\nexport const indentGuides = () => [showIndentations, indentationTheme];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nconst SPACES = /^\\s*/;\n\nexport const getCodeStart = (text: string) => text.match(SPACES)![0].length;\n\nexport const fromPairs = (pairs: [string, unknown][]) => {\n let index = -1;\n const length = pairs == null ? 0 : pairs.length;\n const result: Record<string, unknown> = {};\n\n while (++index < length) {\n const pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView, layer, type ViewUpdate } from '@codemirror/view';\n\nimport { EmptyBlock } from './empty-block';\n\nexport const scrollBeyondLastLine = (scrollHeight?: number) => [\n layer({\n above: false,\n updateOnDocViewUpdate: true,\n class: 'cm-empty-marker-layer',\n update(update: ViewUpdate): boolean {\n return update.state.doc.lines !== update.startState.doc.lines;\n },\n markers(view) {\n const maker = new EmptyBlock(\n view.state.doc.lines,\n view.contentHeight,\n scrollHeight,\n );\n return [maker];\n },\n }),\n EditorView.theme({\n '& .cm-empty-marker-layer': {\n height: '100%',\n },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { LayerMarker } from '@codemirror/view';\n\nexport class EmptyBlock implements LayerMarker {\n constructor(\n private lineNumber: number,\n readonly contentHeight: number,\n readonly scrollHeight?: number,\n ) {}\n\n draw() {\n const elt = document.createElement('div');\n elt.className = 'cm-empty-scroll-block-maker';\n this.adjust(elt);\n return elt;\n }\n\n update(_: HTMLElement, prev: EmptyBlock) {\n return (\n prev.lineNumber === this.lineNumber &&\n prev.contentHeight === this.contentHeight &&\n prev.scrollHeight === this.scrollHeight\n );\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.display = 'block';\n elt.style.width = '1px';\n\n if (this.lineNumber > 1) {\n elt.style.height = `calc(${typeof this.scrollHeight === 'number' ? `${this.scrollHeight}px` : '100%'} + ${this.contentHeight}px)`;\n } else {\n elt.style.height = '0';\n }\n }\n\n eq(p: EmptyBlock) {\n return (\n this.lineNumber === p.lineNumber &&\n this.contentHeight === p.contentHeight &&\n this.scrollHeight === p.scrollHeight\n );\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet, EditorView } from '@codemirror/view';\nimport { type EditorState, StateField, type Range } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n '(': ')',\n '{': '}',\n '[': ']',\n ')': '(',\n '}': '{',\n ']': '[',\n};\n\nconst findMatchingBracket = (state: EditorState, cursorPos: number) => {\n try {\n const doc = state.doc.toString();\n let stack: string[] = [];\n let leftIndex = -1;\n let rightIndex = -1;\n\n // 向前查找\n for (let i = cursorPos - 1; i >= 0; i--) {\n const char = doc[i];\n if (pairs[char]) {\n if ([')', '}', ']'].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n leftIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n stack = [];\n\n // 向后查找\n for (let i = cursorPos; i < doc.length; i++) {\n const char = doc[i];\n if (pairs[char]) {\n if (['(', '{', '['].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n rightIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n if (leftIndex !== -1 && rightIndex !== -1) {\n return [leftIndex, rightIndex];\n }\n\n return null;\n } catch (e) {\n console.error('findMatchingBracket failed', e);\n return null;\n }\n};\n\nconst renderMatch = (match: number) => {\n const decorations: Range<Decoration>[] = [];\n const mark = Decoration.mark({ class: 'cm-matchingBracket' });\n decorations.push(mark.range(match, match + 1));\n return decorations;\n};\n\nconst bracketMatchingState = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(deco, tr) {\n if (!tr.docChanged && !tr.selection) {\n return deco;\n }\n\n let decorations: Range<Decoration>[] = [];\n\n for (const range of tr.state.selection.ranges) {\n if (!range.empty) {\n continue;\n }\n const match = findMatchingBracket(tr.state, range.head);\n\n if (match) {\n decorations = decorations.concat(\n renderMatch(match[0]),\n renderMatch(match[1]),\n );\n }\n }\n\n return Decoration.set(decorations, true);\n },\n provide: f => EditorView.decorations.from(f),\n});\n\nexport const matchingBrackets = [bracketMatchingState];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n type ViewUpdate,\n type DecorationSet,\n} from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\n\nconst DEFAULT_COLORS = ['#ffd700', '#da70d6', '#179fff'];\n\nconst ColorizationBracketsPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.getBracketDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = this.getBracketDecorations(update.view);\n }\n }\n\n getBracketDecorations(view: EditorView) {\n const { doc } = view.state;\n const decorations: any[] = [];\n const stack: { type: string; from: number }[] = [];\n const limitNodeType = ['Comment', 'String'];\n\n const tree = syntaxTree(view.state);\n\n for (let pos = 0; pos < doc.length; pos += 1) {\n const char = doc.sliceString(pos, pos + 1);\n const node = tree.resolveInner(pos);\n\n if (limitNodeType.includes(node.type.name)) {\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n stack.push({ type: char, from: pos });\n } else if (char === ')' || char === ']' || char === '}') {\n const open = stack.pop();\n if (open && open.type === this.getMatchingBracket(char)) {\n const index = stack.length % 3;\n decorations.push(\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n open.from,\n open.from + 1,\n ),\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n pos,\n pos + 1,\n ),\n );\n }\n }\n }\n\n decorations.sort((a, b) => a.from - b.from || a.startSide - b.startSide);\n\n return Decoration.set(decorations);\n }\n\n getMatchingBracket(closingBracket: string) {\n switch (closingBracket) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n default:\n return null;\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nexport const colorizationBrackets = [\n ColorizationBracketsPlugin,\n EditorView.baseTheme({\n '.colorization-bracket-0': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-0 > span': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-1': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-1 > span': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-2': { color: DEFAULT_COLORS[2] },\n '.colorization-bracket-2 > span': { color: DEFAULT_COLORS[2] },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n Direction,\n type EditorView,\n type LayerMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { Facet } from '@codemirror/state';\n\nenum SelectionSide {\n Head = 'head',\n Anchor = 'anchor',\n}\n\ninterface PositionElement {\n dom: HTMLElement | null;\n pos: SelectionSide | number | ((view: EditorView) => number);\n}\nconst elementAtPosition = Facet.define<PositionElement, PositionElement[]>();\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(elementAtPosition) !==\n update.state.facet(elementAtPosition)\n );\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nclass PositionMarker implements LayerMarker {\n constructor(\n public readonly dom: HTMLElement,\n public readonly rect?: Rect,\n ) {}\n\n eq(marker: PositionMarker) {\n return Boolean(\n ((!this.rect && !marker.rect) ||\n (this.rect &&\n marker.rect &&\n this.rect.left === marker.rect.left &&\n this.rect.top === marker.rect.top &&\n this.rect.width === marker.rect.width &&\n this.rect.height === marker.rect.height)) &&\n this.dom === marker.dom,\n );\n }\n\n draw() {\n this.adjust(this.dom);\n return this.dom;\n }\n\n update() {\n this.adjust(this.dom);\n return true;\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.pointerEvents = 'none';\n\n if (!this.rect) {\n return;\n }\n elt.style.left = `${this.rect.left}px`;\n elt.style.top = `${this.rect.top}px`;\n elt.style.width = `${this.rect.width}px`;\n elt.style.height = `${this.rect.height}px`;\n }\n}\n\nfunction getBase(view: EditorView) {\n const rect = view.scrollDOM.getBoundingClientRect();\n const left =\n view.textDirection === Direction.LTR\n ? rect.left\n : rect.right - view.scrollDOM.clientWidth * view.scaleX;\n return {\n left: left - view.scrollDOM.scrollLeft * view.scaleX,\n top: rect.top - view.scrollDOM.scrollTop * view.scaleY,\n };\n}\n\nconst positionElementLayer = layer({\n above: true,\n\n markers(view: EditorView) {\n const elements = view.state.facet(elementAtPosition);\n\n if (!elements || elements.length === 0) {\n return [];\n }\n\n const base = getBase(view);\n\n const temp: any[] = [];\n\n const markers: PositionMarker[] = [];\n for (const { dom, pos } of elements) {\n if (!dom) {\n continue;\n }\n\n let finalPos = -1;\n\n if (typeof pos === 'function') {\n finalPos = pos(view);\n } else if (typeof pos === 'number') {\n finalPos = pos;\n } else if (pos === SelectionSide.Head) {\n finalPos = view.state.selection.main.head;\n } else if (pos === SelectionSide.Anchor) {\n finalPos = view.state.selection.main.anchor;\n }\n\n const coords = view.coordsAtPos(finalPos);\n\n // 由于 codemirror 实现了局部渲染,可能取不到 coords\n if (coords) {\n temp.push(coords);\n\n const width = 1;\n const left = coords.left - base.left - width / 2;\n const top = coords.top - base.top;\n const height = coords.bottom - coords.top;\n\n markers.push(new PositionMarker(dom, { left, top, width, height }));\n } else {\n markers.push(new PositionMarker(dom));\n }\n }\n\n return markers;\n },\n\n update(update) {\n return (\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n\n class: 'cm-positionReferenceLayer',\n});\n\nexport { elementAtPosition, positionElementLayer, SelectionSide };\n\nexport type { PositionElement };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, EditorView } from '@codemirror/view';\nimport { Facet, type RangeSet, RangeSetBuilder } from '@codemirror/state';\n\nimport { type MarkDecorationSpec, squash } from './squash';\n\nconst cache = new Map<string, Decoration>();\nfunction getClassNameDecoration(className: string) {\n const cacheKey = className;\n\n if (!cache.has(cacheKey)) {\n const mark = Decoration.mark({ class: className });\n cache.set(cacheKey, mark);\n }\n\n return cache.get(cacheKey)!;\n}\n\nconst mergeableMarkers = Facet.define<\n MarkDecorationSpec[],\n RangeSet<Decoration>\n>({\n combine(specs) {\n const builder = new RangeSetBuilder<Decoration>();\n\n const flattened = specs.reduce(\n (memo, current) => [...memo, ...current],\n [],\n );\n\n for (const spec of squash(flattened)) {\n const decoration = getClassNameDecoration(spec.className);\n builder.add(spec.from, spec.to, decoration);\n }\n\n return builder.finish();\n },\n enables(self) {\n return EditorView.decorations.compute([self], state => state.facet(self));\n },\n});\n\nexport { mergeableMarkers };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport interface MarkDecorationSpec {\n from: number;\n to: number;\n className: string;\n}\n\nfunction squash(decorations: MarkDecorationSpec[]) {\n const result: MarkDecorationSpec[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n result.sort((a, b) => a.from - b.from);\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: MarkDecorationSpec[]) {\n const map = new Map<string, MarkDecorationSpec[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: MarkDecorationSpec[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface Range {\n from: number;\n to: number;\n}\n\nconst extension = [\n // 禁止编辑\n EditorState.changeFilter.of(tr => {\n const providers = tr.startState.facet(frozenRanges);\n const specs: Range[] = providers.reduce<Range[]>(\n (memo, provider) => [...memo, ...provider(tr.startState)],\n [],\n );\n if (Array.isArray(specs)) {\n const flattened = specs.reduce<number[]>(\n (memo, current) => [...memo, current.from, current.to],\n [],\n );\n\n return flattened;\n }\n\n return true;\n }),\n // forbid cursor move into frozen ranges\n EditorState.transactionFilter.of(tr => {\n const len = tr.startState.doc.length;\n\n const providers = tr.startState.facet(frozenRanges);\n const specs: Range[] = providers\n .reduce<Range[]>((memo, provider) => [...memo, ...provider(tr.state)], [])\n .filter(\n spec =>\n spec.from >= 0 && spec.from < len && spec.to >= 0 && spec.to < len,\n );\n\n let { newSelection } = tr;\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (range.empty && range.from > spec.from && range.to < spec.to) {\n newSelection = newSelection.replaceRange(\n EditorSelection.cursor(\n range.assoc > 0 ? spec.from : spec.to,\n range.assoc,\n ),\n index,\n );\n }\n\n if (!range.empty && hasOverlap(range, spec)) {\n const isReversed = range.head < range.anchor;\n\n if (\n // anchor at left\n range.anchor < spec.from\n ) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n range.anchor,\n spec.from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else if (\n // anchor at right\n range.anchor > spec.to\n ) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n range.anchor,\n spec.to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else if (\n // anchor inside\n range.anchor >= spec.from &&\n range.anchor <= spec.to\n ) {\n // if both anchor and head are inside spec, we should remove this selection\n if (isReversed) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n spec.from,\n Math.min(range.head, spec.from),\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n spec.to,\n Math.max(range.head, spec.to),\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n }\n }\n }\n }\n });\n\n if (newSelection.eq(tr.newSelection)) {\n return tr;\n }\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n }),\n];\n\ntype FrozenRangesProvider = (state: EditorState) => Range[];\n\nconst frozenRanges = Facet.define<FrozenRangesProvider>({\n enables: () => extension,\n});\n\nexport { extension, frozenRanges };\n"],"mappings":";AAGA,SAAS,YAAY;AAErB,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EAEA;AAAA,OAEK;AACP;AAAA,EAGE,SAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;;;AClB3B;AAAA,EAEE;AAAA,EAEA;AAAA,OACK;AACP,SAAS,iBAAiB,aAAa;;;ACJvC,SAAS,OAAO,aAAqC;AACnD,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAU,4BAA4B,WAAW;AAEvD,UAAQ,QAAQ,CAAC,OAAO,cAAc;AACpC,UAAM,SAAS,eAAe,KAAK;AACnC,WAAO;AAAA,MACL,GAAG,OAAO,IAAI,QAAM;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,4BAA4B,aAAqC;AACxE,QAAM,MAAM,oBAAI,IAAoC;AAEpD,cAAY,QAAQ,UAAQ;AAC1B,QAAI,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG;AAC5B,UAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,QAAI,IAAI,KAAK,SAAS,EAAG,KAAK,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,aAAqC;AAC3D,QAAM,SAA2C,CAAC;AAClD,QAAM,SAAS,YAAY,IAAI,WAAS;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEvC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,SAAS,QAAQ,KAAK;AAC7B,cAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,KAAK,OAAO;AAEnB,SAAO;AACT;;;ACrDA,SAAS,eACP,aACA,OACA;AACA,QAAM,OAA+B,CAAC;AAEtC,cAAY,QAAQ,UAAQ;AAC1B,UAAM,YAAY,MAAM,IAAI,OAAO,KAAK,IAAI;AAC5C,UAAM,UAAU,MAAM,IAAI,OAAO,KAAK,EAAE;AACxC,QAAI,UAAU,WAAW,QAAQ,QAAQ;AACvC,YAAM,SAAiC,CAAC;AACxC,UAAI,MAAM,KAAK;AAEf,eAAS,IAAI,UAAU,QAAQ,IAAI,QAAQ,QAAQ,KAAK;AACtD,cAAM,OAAO,MAAM,IAAI,KAAK,CAAC;AAE7B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,WAAW,KAAK;AAAA,QAClB,CAAC;AAED,cAAM,KAAK,KAAK;AAAA,MAClB;AAEA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,KAAK;AAAA,QACT,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,WAAK,KAAK,GAAG,MAAM;AAAA,IACrB,OAAO;AACL,WAAK,KAAK,IAAI;AAAA,IAChB;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AF7BA,SAAS,cAAc,QAAoB;AACzC,SACE,OAAO,WAAW,MAAM,qBAAqB,MAC7C,OAAO,MAAM,MAAM,qBAAqB;AAE5C;AAGA,IAAM,2BAA2B,MAAM;AAAA,EACrC,OAAO;AAAA,EACP,QAAQ,MAAM;AACZ,UAAM,cAAc,KAAK,MACtB,MAAM,qBAAqB,EAC3B,OAEC,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtD,WAAO,eAAe,OAAO,WAAW,GAAG,KAAK,KAAK,EAClD;AAAA,MAAI,UACH,gBAAgB;AAAA,QACd;AAAA,QACA,KAAK;AAAA,QACL,gBAAgB,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA,MAC1C;AAAA,IACF,EACC,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;AAAA,EACxD;AAAA,EACA,OAAO,QAAQ;AACb,WACE,OAAO,gBACP,OAAO,cACP,OAAO,gBACP,OAAO,mBACP,cAAc,MAAM;AAAA,EAExB;AAAA,EACA,OAAO;AACT,CAAC;AAED,IAAM,wBAAwB,MAAM,OAGlC;AAAA,EACA,SAAS,CAAC,wBAAwB;AACpC,CAAC;;;ADiBD,IAAM,+BAA+B,YAAY,OAAO;AAExD,SAAS,uBAAuB,MAAkB;AAChD,OAAK,SAAS;AAAA,IACZ,SAAS,6BAA6B,GAAG,IAAI;AAAA,EAC/C,CAAC;AACH;AAEA,IAAM,2BAAoD,oBAAI,IAAI;AAClE,SAAS,mBAAmB,WAA+B;AACzD,MAAI,CAAC,yBAAyB,IAAI,SAAS,GAAG;AAC5C,6BAAyB;AAAA,MACvB;AAAA,MACA,WAAW,KAAK;AAAA,QACd,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,yBAAyB,IAAI,SAAS;AAC/C;AAIA,SAAS,iBAAiB,OAAoB,MAAY;AACxD,QAAM,YAAY,MAAM,MAAM,sBAAsB,KAAK,CAAC;AAE1D,QAAM,aAAa,KAAK,OAAO;AAC/B,QAAM,cAAuC;AAAA,IAC3C,SAAS,WAAW;AAAA,IACpB,MAAM,WAAW;AAAA,IACjB,SAAS,WAAW;AAAA,IACpB,KAAK,WAAW;AAAA,IAChB,QAAQ,WAAW;AAAA,EACrB;AACA,MAAI,eAAe,SAAS;AAC5B,MAAIC,yBAAgD,CAAC;AAErD,QAAM,OAAO;AACb,QAAM,KAAK,MAAM,IAAI;AACrB,cAAY,YAAY,MAAM,IAAI,YAAU;AAC1C,cAAU,QAAQ,cAAY;AAC5B,YAAM,iBAAiB,SAAS,QAAQ,KAAK;AAE7C,UAAI,QAA0B,CAAC;AAC/B,UAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,gBAAQ;AAAA,MACV,WAAW,gBAAgB;AACzB,gBAAQ,CAAC,cAAc;AAAA,MACzB;AAEA,YAAM,QAAQ,UAAQ;AACpB,cAAM,SAAS,qBAAqB,QAAQ,MAAM;AAAA,UAChD;AAAA,UACA,uBAAAA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,QAAAA,yBAAwB,OAAO;AAC/B,uBAAe,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,uBAAAA;AAAA,EACF;AACF;AAEA,SAAS,qBACP,QACA,gBACA;AAAA,EACE;AAAA,EACA,uBAAAA;AAAA,EACA;AACF,GAKA;AACA,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,eAAe,QAAQ,OAAO;AAC3C,QAAM,KAAK,eAAe,MAAM,OAAO;AAEvC,QAAM,WAAW,CAAC,QAAQ,QAAQ,MAAM,aAAa;AAErD,MAAI,kBAA4C;AAChD,UAAQ,eAAe,MAAM;AAAA,IAC3B,KAAK;AAKH,wBACE,SAAS,KACL,OACA,mBAAmB,eAAe,SAAS,EAAE,MAAM,MAAM,EAAE;AACjE;AAAA,IACF,KAAK;AACH,wBAAkB,WAAW;AAAA,QAC3B,KAAK,gBAAgB,QAAQ;AAAA,MAC/B,EAAE,MAAM,MAAM,EAAE;AAChB;AAAA,IACF,KAAK;AACH,wBAAkB,WAAW,OAAO,KAAK,gBAAgB,QAAQ,CAAC,EAAE;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,MAAAA,uBAAsB,KAAK;AAAA,QACzB,MAAM,eAAe,QAAQ,OAAO;AAAA,QACpC,IAAI,eAAe,MAAM,OAAO;AAAA,QAChC,WAAW,eAAe;AAAA,MAC5B,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,iBAAiB;AACnB,UAAM,OACJ,eAAe,SAAS,cACnB,eAAe,QAAQ,YACxB;AAEN,QAAI,YAAY,IAAI,GAAG;AACrB,kBAAY,IAAI,IAAI,YAAY,IAAI,EAAE,OAAO;AAAA,QAC3C,KAAK,CAAC,eAAe;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MACE,eAAe,SAAS,gBACxB,mBACA,eAAe,gBAAgB,MAC/B;AACA,mBAAe,aAAa,OAAO;AAAA,MACjC,KAAK,CAAC,eAAe;AAAA,MACrB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,uBAAAA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,WAAW,OAI9B;AAAA,EACD,OAAO,OAAO;AACZ,WAAO,iBAAiB,OAAO,WAAW,KAAK,CAAC;AAAA,EAClD;AAAA,EACA,OAAO,OAAO,IAAI;AAChB,UAAM,OAAO,WAAW,GAAG,KAAK;AAEhC,UAAM,kBAAkB,GAAG,QAAQ;AAAA,MAAK,YACtC,OAAO,GAAG,4BAA4B;AAAA,IACxC;AACA,UAAM,oBAAoB,WAAW,GAAG,UAAU,MAAM;AACxD,QAAI,qBAAqB,iBAAiB;AACxC,cAAQ,iBAAiB,GAAG,OAAO,IAAI;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,OAAO;AACb,WAAO;AAAA,MACL,KAAK;AAAA,QACH,WAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,WAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,WAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,WAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,WAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MAEA,WAAW,aAAa,GAAG,UAAQ,KAAK,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,MACvE,sBAAsB;AAAA,QACpB,UAAQ,KAAK,MAAM,MAAM,KAAK,EAAE;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAM,yBAAyBC,OAAM,OAGnC;AAAA,EACA,SAAS,CAAC,eAAe,wBAAwB;AACnD,CAAC;;;AI5SD;AAAA,EACE,cAAAC;AAAA,EAIA;AAAA,OAEK;AACP,SAA2B,SAAAC,QAAO,uBAAuB;AACzD,SAAS,cAAAC,mBAAkB;AA6B3B,IAAM,gBAAN,MAA2C;AAAA,EAMzC,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAL/B,2BAAoD,oBAAI,IAAI;AAAA,EAEpE,cAA6BC,YAAW;AAAA,EACxC,wBAAgD,CAAC;AAAA,EAIjD,mBAAmB,WAAmB;AACpC,QAAI,CAAC,KAAK,yBAAyB,IAAI,SAAS,GAAG;AACjD,WAAK,yBAAyB;AAAA,QAC5B;AAAA,QACAA,YAAW,KAAK;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,yBAAyB,IAAI,SAAS;AAAA,EACpD;AAAA,EAEA,OAAO,QAAoB;AAEzB,QACG,OAAO,gBAAgB,OAAO,KAAK,YACpC,CAAC,OAAO,WAAW,UAAU,GAAG,OAAO,MAAM,SAAS,GACtD;AACA,YAAM,OAAOC,YAAW,OAAO,KAAK;AACpC,YAAM,MAAM,OAAO,MAAM,UAAU,KAAK;AACxC,YAAM,aAAa,OAAO,MAAM,MAAM,uBAAuB;AAE7D,YAAM,SAAS,KAAK,SAAS,KAAK,CAAC;AACnC,YAAM,UAAU,IAAI,gBAA4B;AAChD,YAAM,gBAAwC,CAAC;AAE/C,SAAG;AACD,mBAAW,QAAQ,eAAa;AAC9B,gBAAM,iBAAiB,UAAU,QAAQ,OAAO,KAAK;AACrD,cAAI,CAAC,gBAAgB;AACnB;AAAA,UACF;AAEA,cAAI;AACJ,kBAAQ,eAAe,MAAM;AAAA,YAC3B,KAAK;AACH,2BAAa,KAAK,mBAAmB,eAAe,SAAS;AAC7D;AAAA,YACF,KAAK;AACH,4BAAc,KAAK;AAAA,gBACjB,MAAM,eAAe,QAAQ,OAAO;AAAA,gBACpC,IAAI,eAAe,MAAM,OAAO;AAAA,gBAChC,WAAW,eAAe;AAAA,cAC5B,CAAC;AACD;AAAA,UACJ;AAEA,cAAI,YAAY;AACd,oBAAQ;AAAA,cACN,eAAe,QAAQ,OAAO;AAAA,cAC9B,eAAe,MAAM,OAAO;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO,OAAO;AAEvB,WAAK,cAAc,QAAQ,OAAO;AAClC,WAAK,wBAAwB;AAAA,IAC/B;AAEA,QAAI,OAAO,gBAAgB,CAAC,OAAO,KAAK,UAAU;AAChD,WAAK,cAAcD,YAAW;AAC9B,WAAK,wBAAwB,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAEA,IAAM,0BAA0BE,OAAM,OAGpC;AAAA,EACA,SAAS;AAAA,IACP,WAAW,UAAU,eAAe;AAAA,MAClC,aAAa,OAAK,EAAE;AAAA,MACpB,QAAQ,QAAQ;AACd,eAAO;AAAA,UACL,sBAAsB;AAAA,YACpB,UAAK;AAjIjB;AAiIoB,iCAAK,OAAO,MAAM,MAAlB,mBAAqB,0BAAyB,CAAC;AAAA;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;;;AC7HD,IAAM,eAAe;AAAA,EACnB,OAAO;AAAA,EACP,YAAY;AACd;;;ACVA,SAAS,eAAAC,oBAAmB;AAC5B,SAA0B,cAAAC,mBAAmC;AAE7D,SAAS,cAAAC,mBAAkB;AAE3B,IAAM,cAAcD,YAAW;AAAA,EAC7B,MAAM;AAAA,IACJ,YAAY,MAAkB;AAC5B,yBAAmB,KAAK,KAAK;AAAA,IAC/B;AAAA,IAEA,OAAO,QAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAoB;AAC9C,QAAM,OAAOC,YAAW,KAAK;AAE7B,UAAQ,eAAe,aAAa;AAEpC,QAAM,SAAS,KAAK,OAAO;AAC3B,EAAAF,aAAY,QAAQ,GAAG,KAAK,QAAQ,CAAAG,YAAU;AAC5C,YAAQ;AAAA,MACN,KAAKA,QAAO,IAAI,IAAIA,QAAO,IAAI,IAAIA,QAAO,EAAE;AAAA,MAC5C;AAAA,IACF;AAEA,YAAQ,IAAI,MAAM,SAASA,QAAO,MAAMA,QAAO,EAAE,CAAC;AAClD,YAAQ,SAAS;AAAA,EACnB,CAAC;AAED,UAAQ,SAAS;AACnB;;;ACpCA,SAA0B,YAAY,cAAc;AAUpD,IAAM,kBAAkB,OAAO,GAAG;AAAA,EAChC;AAAA,IACE,KAAK;AAAA,IACL,IAAI,MAAkB;AACpB,YAAM,gBAAgB,KAAK,MAAM,UAAU;AAC3C,UAAI,CAAC,cAAc,OAAO;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU;AACd,YAAM,MAAM,cAAc;AAO1B,iBAAW,QAAQ,KAAK,QAAQ,UAAU;AACxC,mBAAW,SAAS,KAAK,UAAU;AACjC,cACE,MAAM,YACN,MAAM,kBAAkB,mBACxB,MAAM,aAAa,KACnB;AACA,kBAAM,OAAO,MAAM,CAAC;AACpB,sBAAU;AAAA,UACZ;AAAA,QACF;AAEA,YAAI,SAAS;AACX;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,IAAI,MAAkB;AACpB,YAAM,gBAAgB,KAAK,MAAM,UAAU;AAC3C,UAAI,CAAC,cAAc,OAAO;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU;AAEd,YAAM,MAAM,cAAc;AAG1B,iBAAW,QAAQ,KAAK,QAAQ,UAAU;AACxC,mBAAW,SAAS,KAAK,UAAU;AACjC,cACE,MAAM,YACN,MAAM,kBAAkB,mBACxB,MAAM,eAAe,KACrB;AACA,kBAAM,OAAO,MAAM,EAAE;AACrB,sBAAU;AACV;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS;AACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAED,IAAe,kBAAf,cAAuC,WAAW;AAElD;;;ACpFA,SAAS,sBAAsB,eAAe;AAC9C,SAAS,cAAAC,mBAAoD;AAC7D,SAAS,mBAAAC,kBAAmC,SAAAC,cAAa;;;ACGzD,SAASC,gBAAe,QAAiB;AACvC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,SAAS,OAAO,IAAI,CAAAC,YAAU;AAAA,IAClC,MAAMA,OAAM;AAAA,IACZ,IAAIA,OAAM;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,QAAQ,QAAQ,IAAI;AAC3B,cAAQ,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;AAAA,IAC3C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAAiB,KAAgC;AAC5E,aAAWA,UAAS,QAAQ;AAC1B,QAAI,OAAOA,OAAM,QAAQ,OAAOA,OAAM,IAAI;AACxC,aAAOA;AAAA,IACT;AAAA,EACF;AACF;;;AD9BA,IAAM,YAAYC,YAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,YAAY;AAAA,IAEZ,YAAY,MAAkB;AAC5B,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,IAEA,OAAO,QAAoB;AACzB,YAAM,YAAY,OAAO,MAAM,MAAM,eAAe,KAAK;AAEzD,YAAM,qBAAqB,OAAO,aAAa;AAAA,QAAK,QAClD,GAAG,YAAY,SAAS;AAAA,MAC1B;AAEA,UAAI,oBAAoB;AACtB,cAAM,eAAe,KAAK;AAE1B,cAAM,iBAAiB,OAAO,WAAW;AACzC,cAAM,EAAE,UAAU,IAAI,OAAO;AAE7B,cAAM,kBAAkB,OAAO,MAAM,MAAM,WAAW;AACtD,cAAM,SAASC;AAAA,UACb;AAAA,YACE,gBAAgB,IAAI,cAAY,SAAS,OAAO,KAAK,KAAK,CAAC;AAAA,UAC7D,EAAE,OAAO,OAAO;AAAA,QAClB;AAEA,cAAM,eAAe,oBAAoB,QAAQ,UAAU,KAAK,IAAI;AAIpE,YACE,UAAU,KAAK,SACf,iBACC,CAAC;AAAA,QAEA,oBAAoB,QAAQ,eAAe,KAAK,IAAI,MAClD,gBACF,oBAAoB,QAAQ,eAAe,KAAK,EAAE,MAChD,eACJ;AACA,yBAAe,MAAM;AACnB,mBAAO,KAAK,SAAS;AAAA,cACnB,WAAW,UAAU;AAAA,gBACnBC,iBAAgB,MAAM,aAAa,MAAM,aAAa,EAAE;AAAA,cAC1D;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,KAAK,cAAc,OAAO,KAAK,UAAU;AAC3C,aAAK,YAAY,OAAO,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAcC,OAAM,OAAuB;AAAA,EAC/C,SAAS;AACX,CAAC;AAED,IAAM,kBAAkBA,OAAM,OAAyC;AAAA,EACrE,SAAS,qBAAqB;AAChC,CAAC;;;AE9ED,SAAS,WAAAC,UAAS,kBAAkB;AACpC,SAAS,mBAAAC,kBAAiB,aAAa,SAAAC,cAAa;AAiBpD,IAAMC,aAAY,YAAY,kBAAkB,GAAG,QAAM;AAEvD,MAAI,GAAG,cAAc,GAAG,aAAa,GAAG,GAAG,WAAW,SAAS,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,GAAG,WAAW,MAAM,iBAAiB;AACvD,QAAM,QAAQH,SAAQ,UAAU,IAAI,cAAY,SAAS,GAAG,UAAU,CAAC,CAAC;AAExE,MAAI,EAAE,aAAa,IAAI;AAEvB,eAAa,OAAO,QAAQ,CAACI,QAAO,UAAU;AAC5C,eAAW,QAAQ,OAAO;AACxB,UAAI,WAAWA,QAAO,KAAK,MAAM,GAAG;AAClC,cAAM,aAAaA,OAAM,OAAOA,OAAM;AACtC,cAAM,OAAO,KAAK,IAAIA,OAAM,MAAM,KAAK,OAAO,IAAI;AAClD,cAAM,KAAK,KAAK,IAAIA,OAAM,IAAI,KAAK,OAAO,EAAE;AAC5C,cAAM,WAAW,aACbH,iBAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACAG,OAAM;AAAA,UACNA,OAAM,aAAa;AAAA,QACrB,IACAH,iBAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACAG,OAAM;AAAA,UACNA,OAAM,aAAa;AAAA,QACrB;AAEJ,uBAAe,aAAa,aAAa,UAAU,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW;AAAA,IACb;AAAA,EACF;AACF,CAAC;AAED,IAAM,oBAAoBF,OAAM,OAAkC;AAAA,EAChE,SAASC;AACX,CAAC;;;AChED,SAAS,WAAAE,UAAS,cAAAC,mBAAkB;AACpC,SAAS,WAAW,eAAAC,cAAa,SAAAC,cAAa;AAe9C,IAAMC,aAAYF,aAAY,kBAAkB,GAAG,QAAM;AACvD,QAAM,YAAY,GAAG,WAAW,MAAM,gBAAgB;AAEtD,QAAM,QAAQF,SAAQ,UAAU,IAAI,cAAY,SAAS,GAAG,UAAU,CAAC,CAAC;AAExE,QAAM,EAAE,OAAO,IAAI,GAAG,WAAW;AACjC,MAAI,UAAU,UAAU,MAAM,MAAM;AAEpC,KAAG,QAAQ,YAAY,CAAC,OAAO,KAAK,OAAO,QAAQ;AACjD,UAAM,aAAa,UAAU;AAE7B,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,UACEC;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AAAA,QACA,KAAK;AAAA,MACP,GACA;AACA,cAAM,SAAS,UAAU,GAAG,CAAC,EAAE,GAAG,KAAK,QAAQ,QAAQ,GAAG,CAAC,GAAG,MAAM;AAEpE,kBAAU,QAAQ,QAAQ,OAAO,IAAI,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,cAAc,QAAQ,IAAI,GAAG,OAAO;AAE1C,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,mBAAmBE,OAAM,OAAiC;AAAA,EAC9D,SAASC;AACX,CAAC;;;AChED,SAAS,cAAAC,mBAAkB;AAC3B,SAA2B,QAAAC,aAA4B;AAkBvD,IAAM,UACJ,OAAO,cAAc,YAAY,YAAY,KAAK,UAAU,SAAS;AAEvE,IAAM,cAAc,CAAC,MAA+B,QAAQ,CAAC;AAC7D,IAAM,aAAa,CAAC,UAAwB;AAC1C,QAAM,kBAA+B,SAAS,CAAC,GAC5C,IAAI,CAAC,EAAE,MAAM,kBAAkB,QAAQ,MAAM;AAC5C,QAAI,SAAS,aAAa;AACxB,aAAOD,YAAW,aAAa,GAAG,CAAC,MAAM,MAAM,IAAI,WAAW;AAC5D,aACG,UAAU,KAAK,YAAY,KAAK,uBACjC,KAAK,MAAM,UACX;AACA,iBAAO;AAAA,QACT;AACA,cAAM,MAAM,KAAK,MAAM,UAAU;AACjC,YACE,WAAW,oBACX,SAAS,IAAI,QACb,OAAO,IAAI,IACX;AACA,iBAAO;AAAA,QACT;AACA,eAAO,QAAQ;AAAA,UACb;AAAA,UACA,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC,EACA,OAAO,OAAK,YAAY,CAAC,CAAC;AAG7B,SAAOC,MAAK,KAAK,cAAc;AACjC;;;ACxDA,SAAS,kBAAkB;AAC3B,SAAS,UAAU,sBAAsB;AACzC,SAAwB,kBAAkB;AAQ1C,SAAS,aAAa,EAAE,MAAM,eAAe,cAAc,GAAe;AACxE,SAAO,WAAW,OAAO;AAAA,IACvB;AAAA,IACA,QAAQ,eAAe,UAAU;AAAA,MAC/B,MAAM,WAAW,UAAQ;AACvB,YAAI,iBAAiB,KAAK,KAAK,OAAO;AACpC,iBAAO;AAAA,YACL,QAAQ,cAAc;AAAA,YACtB,SAAS,OAAK,EAAE,KAAK,SAAS;AAAA,UAChC;AAAA,QACF;AAEA,YAAI,iBAAiB,KAAK,SAAS,wBAAwB;AACzD,iBAAO;AAAA,YACL,QAAQ,cAAc;AAAA,UACxB;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AC/BA,SAAS,aAAa;AACtB;AAAA,EACE,cAAAC;AAAA,EAEA,cAAAC;AAAA,EACA,cAAAC;AAAA,EAEA,cAAAC;AAAA,OACK;AACP,SAAS,mBAAAC,wBAAuB;;;ACVhC,IAAM,SAAS;AAER,IAAM,eAAe,CAAC,SAAiB,KAAK,MAAM,MAAM,EAAG,CAAC,EAAE;AAE9D,IAAM,YAAY,CAACC,WAA+B;AACvD,MAAI,QAAQ;AACZ,QAAM,SAASA,UAAS,OAAO,IAAIA,OAAM;AACzC,QAAM,SAAkC,CAAC;AAEzC,SAAO,EAAE,QAAQ,QAAQ;AACvB,UAAM,OAAOA,OAAM,KAAK;AACxB,WAAO,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;;;ADAA,IAAM,kBAAkBC,YAAW,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACzE,IAAM,wBAAwB,MAAM,EAAE,EAAE;AAAA,EAAI,OAC1CA,YAAW,KAAK,EAAE,OAAO,wBAAwB,CAAC,GAAG,CAAC;AACxD;AAEA,IAAM,oBAAN,MAAM,2BAA0BC,YAAW;AAAA,EACzC,YAAqB,SAAmB;AACtC,UAAM;AADa;AAAA,EAErB;AAAA,EAEA,OAAO,OAAO,SAAmB;AAC/B,WAAOD,YAAW,OAAO;AAAA,MACvB,QAAQ,IAAI,mBAAkB,OAAO;AAAA,MACrC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AACN,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,SAAS,KAAK,YAAY,SAAS,cAAc,MAAM,CAAC;AAC9D,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,WAAK,OAAO,IAAI,OAAO,SAAS,CAAC,CAAC;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBACP,MACA,IACA,QACA,SACA,SACA;AACA,UAAQ,IAAI,MAAM,MAAM,sBAAsB,SAAS,OAAO,CAAC;AAC/D,WAAS,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,QAAQ,EAAE,GAAG,KAAK,SAAS;AAChE,YAAQ,IAAI,GAAG,IAAI,GAAG,eAAe;AAAA,EACvC;AACF;AAEA,SAAS,sBACP,MACA,IACA,SACA,SACA;AACA,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,GAAG;AAChB;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf,YAAQ,IAAI,IAAI,IAAI,kBAAkB,OAAO,CAAC,OAAO,CAAC,CAAC;AAAA,EACzD,OAAO;AACL,YAAQ,IAAI,IAAI,IAAI,kBAAkB,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,0BAA0B,MAAkB;AACnD,QAAM,UAAU,IAAIE,iBAA4B;AAChD,QAAM,UAAU,OAAO,KAAK,MAAM,OAAO;AACzC,QAAM,EAAE,IAAI,IAAI,KAAK;AACrB,QAAM,iBAAiD,CAAC;AACxD,MAAI,gBAAgB;AACpB,aAAW,EAAE,MAAM,aAAa,IAAI,UAAU,KAAK,KAAK,eAAe;AACrE,QAAI,KAAK,cAAc;AACvB,QAAI,KAAK,MAAM,QAAQ;AAEvB,YAAQ,MAAM,KAAK,MAAM,WAAW;AAClC,OAAC,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG;AAC5C,YAAM,eAAe,aAAa,IAAI;AACtC,YAAM,cAAc,iBAAiB;AAErC,YAAM,aAAa,iBAAiB;AACpC,YAAM,YAAY,KAAK,YAAY,MAAM;AACzC,UAAI,aAAa;AACf,uBAAe,KAAK,EAAE,MAAM,GAAG,CAAC;AAChC;AAAA,MACF,WAAW,YAAY;AACrB,uBAAe,SAAS;AACxB;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,KAAK,eAAe,OAAO,IAAI;AAEnD,UAAI,CAAC,WAAW;AACd,wBAAgB;AAAA,MAClB;AAEA,iBAAW,EAAE,MAAM,WAAW,IAAI,QAAQ,KAAK,gBAAgB;AAC7D;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,8BAAsB,WAAW,SAAS,SAAS,OAAO;AAAA,MAC5D;AACA,qBAAe,SAAS;AAExB,0BAAoB,MAAM,IAAI,QAAQ,SAAS,OAAO;AAAA,IACxD;AAAA,EACF;AACA,SAAO,QAAQ,OAAO;AACxB;AAEA,IAAM,mBAAmBC,YAAW;AAAA,EAClC,MAAM;AAAA,IACJ;AAAA,IACA,YAAY,MAAkB;AAC5B,WAAK,cAAc,0BAA0B,IAAI;AAAA,IACnD;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,0BAA0B,OAAO,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAK,EAAE;AAAA,EACtB;AACF;AAEA,IAAM,mBAAmBC,YAAW,UAAU;AAAA,EAC5C,YAAY;AAAA,IACV,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,EACZ;AAAA,EACA,+BAA+B;AAAA,IAC7B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,GAAG;AAAA,IACD,sBAAsB,IAAI,CAAC,aAAa,MAAM;AAAA,MAC5C,yBAAyB,CAAC;AAAA,MAC1B,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK;AAAA,IACzD,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,eAAe,MAAM,CAAC,kBAAkB,gBAAgB;;;AEpKrE,SAAS,cAAAC,aAAY,SAAAC,cAA8B;;;ACE5C,IAAM,aAAN,MAAwC;AAAA,EAC7C,YACU,YACC,eACA,cACT;AAHQ;AACC;AACA;AAAA,EACR;AAAA,EAEH,OAAO;AACL,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,SAAK,OAAO,GAAG;AACf,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,GAAgB,MAAkB;AACvC,WACE,KAAK,eAAe,KAAK,cACzB,KAAK,kBAAkB,KAAK,iBAC5B,KAAK,iBAAiB,KAAK;AAAA,EAE/B;AAAA,EAEQ,OAAO,KAAkB;AAC/B,QAAI,MAAM,UAAU;AACpB,QAAI,MAAM,QAAQ;AAElB,QAAI,KAAK,aAAa,GAAG;AACvB,UAAI,MAAM,SAAS,QAAQ,OAAO,KAAK,iBAAiB,WAAW,GAAG,KAAK,YAAY,OAAO,MAAM,MAAM,KAAK,aAAa;AAAA,IAC9H,OAAO;AACL,UAAI,MAAM,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,GAAG,GAAe;AAChB,WACE,KAAK,eAAe,EAAE,cACtB,KAAK,kBAAkB,EAAE,iBACzB,KAAK,iBAAiB,EAAE;AAAA,EAE5B;AACF;;;ADtCO,IAAM,uBAAuB,CAAC,iBAA0B;AAAA,EAC7DC,OAAM;AAAA,IACJ,OAAO;AAAA,IACP,uBAAuB;AAAA,IACvB,OAAO;AAAA,IACP,OAAO,QAA6B;AAClC,aAAO,OAAO,MAAM,IAAI,UAAU,OAAO,WAAW,IAAI;AAAA,IAC1D;AAAA,IACA,QAAQ,MAAM;AACZ,YAAM,QAAQ,IAAI;AAAA,QAChB,KAAK,MAAM,IAAI;AAAA,QACf,KAAK;AAAA,QACL;AAAA,MACF;AACA,aAAO,CAAC,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AAAA,EACDC,YAAW,MAAM;AAAA,IACf,4BAA4B;AAAA,MAC1B,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;;;AE1BA,SAAS,cAAAC,aAAgC,cAAAC,mBAAkB;AAC3D,SAA2B,cAAAC,mBAA8B;AAEzD,IAAM,QAAgC;AAAA,EACpC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,sBAAsB,CAAC,OAAoB,cAAsB;AACrE,MAAI;AACF,UAAM,MAAM,MAAM,IAAI,SAAS;AAC/B,QAAI,QAAkB,CAAC;AACvB,QAAI,YAAY;AAChB,QAAI,aAAa;AAGjB,aAAS,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK;AACvC,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,MAAM,IAAI,GAAG;AACf,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAClC,gBAAM,KAAK,IAAI;AAAA,QACjB,OAAO;AACL,cAAI,MAAM,WAAW,GAAG;AACtB,wBAAY;AACZ;AAAA,UACF;AACA,gBAAM,cAAc,MAAM,IAAI;AAC9B,cAAI,MAAM,IAAI,MAAM,aAAa;AAC/B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,CAAC;AAGT,aAAS,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK;AAC3C,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,MAAM,IAAI,GAAG;AACf,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAClC,gBAAM,KAAK,IAAI;AAAA,QACjB,OAAO;AACL,cAAI,MAAM,WAAW,GAAG;AACtB,yBAAa;AACb;AAAA,UACF;AACA,gBAAM,cAAc,MAAM,IAAI;AAC9B,cAAI,MAAM,IAAI,MAAM,aAAa;AAC/B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,MAAM,eAAe,IAAI;AACzC,aAAO,CAAC,WAAW,UAAU;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,YAAQ,MAAM,8BAA8B,CAAC;AAC7C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,cAAc,CAAC,UAAkB;AACrC,QAAM,cAAmC,CAAC;AAC1C,QAAM,OAAOF,YAAW,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAC5D,cAAY,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;AAC7C,SAAO;AACT;AAEA,IAAM,uBAAuBE,YAAW,OAAsB;AAAA,EAC5D,SAAS;AACP,WAAOF,YAAW;AAAA,EACpB;AAAA,EACA,OAAO,MAAM,IAAI;AACf,QAAI,CAAC,GAAG,cAAc,CAAC,GAAG,WAAW;AACnC,aAAO;AAAA,IACT;AAEA,QAAI,cAAmC,CAAC;AAExC,eAAWG,UAAS,GAAG,MAAM,UAAU,QAAQ;AAC7C,UAAI,CAACA,OAAM,OAAO;AAChB;AAAA,MACF;AACA,YAAM,QAAQ,oBAAoB,GAAG,OAAOA,OAAM,IAAI;AAEtD,UAAI,OAAO;AACT,sBAAc,YAAY;AAAA,UACxB,YAAY,MAAM,CAAC,CAAC;AAAA,UACpB,YAAY,MAAM,CAAC,CAAC;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAOH,YAAW,IAAI,aAAa,IAAI;AAAA,EACzC;AAAA,EACA,SAAS,OAAKC,YAAW,YAAY,KAAK,CAAC;AAC7C,CAAC;AAEM,IAAM,mBAAmB,CAAC,oBAAoB;;;AC3GrD;AAAA,EACE,cAAAG;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,OAGK;AACP,SAAS,cAAAC,mBAAkB;AAE3B,IAAM,iBAAiB,CAAC,WAAW,WAAW,SAAS;AAEvD,IAAM,6BAA6BD,YAAW;AAAA,EAC5C,MAAM;AAAA,IACJ;AAAA,IAEA,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,sBAAsB,IAAI;AAAA,IACpD;AAAA,IAEA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,gBAAgB,OAAO,iBAAiB;AACtE,aAAK,cAAc,KAAK,sBAAsB,OAAO,IAAI;AAAA,MAC3D;AAAA,IACF;AAAA,IAEA,sBAAsB,MAAkB;AACtC,YAAM,EAAE,IAAI,IAAI,KAAK;AACrB,YAAM,cAAqB,CAAC;AAC5B,YAAM,QAA0C,CAAC;AACjD,YAAM,gBAAgB,CAAC,WAAW,QAAQ;AAE1C,YAAM,OAAOC,YAAW,KAAK,KAAK;AAElC,eAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,OAAO,GAAG;AAC5C,cAAM,OAAO,IAAI,YAAY,KAAK,MAAM,CAAC;AACzC,cAAM,OAAO,KAAK,aAAa,GAAG;AAElC,YAAI,cAAc,SAAS,KAAK,KAAK,IAAI,GAAG;AAC1C;AAAA,QACF;AAEA,YAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,gBAAM,KAAK,EAAE,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,QACtC,WAAW,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AACvD,gBAAM,OAAO,MAAM,IAAI;AACvB,cAAI,QAAQ,KAAK,SAAS,KAAK,mBAAmB,IAAI,GAAG;AACvD,kBAAM,QAAQ,MAAM,SAAS;AAC7B,wBAAY;AAAA,cACVF,YAAW,KAAK,EAAE,OAAO,wBAAwB,KAAK,GAAG,CAAC,EAAE;AAAA,gBAC1D,KAAK;AAAA,gBACL,KAAK,OAAO;AAAA,cACd;AAAA,cACAA,YAAW,KAAK,EAAE,OAAO,wBAAwB,KAAK,GAAG,CAAC,EAAE;AAAA,gBAC1D;AAAA,gBACA,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS;AAEvE,aAAOA,YAAW,IAAI,WAAW;AAAA,IACnC;AAAA,IAEA,mBAAmB,gBAAwB;AACzC,cAAQ,gBAAgB;AAAA,QACtB,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAK,EAAE;AAAA,EACtB;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACAD,YAAW,UAAU;AAAA,IACnB,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IAC7D,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IAC7D,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,EAC/D,CAAC;AACH;;;AC9FA;AAAA,EACE;AAAA,EAIA,SAAAI;AAAA,OACK;AACP,SAAS,SAAAC,cAAa;AAEtB,IAAK,gBAAL,kBAAKC,mBAAL;AACE,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,YAAS;AAFN,SAAAA;AAAA,GAAA;AASL,IAAM,oBAAoBD,OAAM,OAA2C;AAE3E,SAASE,eAAc,QAAoB;AACzC,SACE,OAAO,WAAW,MAAM,iBAAiB,MACzC,OAAO,MAAM,MAAM,iBAAiB;AAExC;AASA,IAAM,iBAAN,MAA4C;AAAA,EAC1C,YACkB,KACA,MAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,GAAG,QAAwB;AACzB,WAAO;AAAA,OACH,CAAC,KAAK,QAAQ,CAAC,OAAO,QACrB,KAAK,QACJ,OAAO,QACP,KAAK,KAAK,SAAS,OAAO,KAAK,QAC/B,KAAK,KAAK,QAAQ,OAAO,KAAK,OAC9B,KAAK,KAAK,UAAU,OAAO,KAAK,SAChC,KAAK,KAAK,WAAW,OAAO,KAAK,WACnC,KAAK,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO;AACL,SAAK,OAAO,KAAK,GAAG;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,KAAkB;AAC/B,QAAI,MAAM,gBAAgB;AAE1B,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AACA,QAAI,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI;AAClC,QAAI,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG;AAChC,QAAI,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAK;AACpC,QAAI,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM;AAAA,EACxC;AACF;AAEA,SAAS,QAAQ,MAAkB;AACjC,QAAM,OAAO,KAAK,UAAU,sBAAsB;AAClD,QAAM,OACJ,KAAK,kBAAkB,UAAU,MAC7B,KAAK,OACL,KAAK,QAAQ,KAAK,UAAU,cAAc,KAAK;AACrD,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,UAAU,aAAa,KAAK;AAAA,IAC9C,KAAK,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,EAClD;AACF;AAEA,IAAM,uBAAuBH,OAAM;AAAA,EACjC,OAAO;AAAA,EAEP,QAAQ,MAAkB;AACxB,UAAM,WAAW,KAAK,MAAM,MAAM,iBAAiB;AAEnD,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,QAAQ,IAAI;AAEzB,UAAM,OAAc,CAAC;AAErB,UAAM,UAA4B,CAAC;AACnC,eAAW,EAAE,KAAK,IAAI,KAAK,UAAU;AACnC,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,UAAI,WAAW;AAEf,UAAI,OAAO,QAAQ,YAAY;AAC7B,mBAAW,IAAI,IAAI;AAAA,MACrB,WAAW,OAAO,QAAQ,UAAU;AAClC,mBAAW;AAAA,MACb,WAAW,QAAQ,mBAAoB;AACrC,mBAAW,KAAK,MAAM,UAAU,KAAK;AAAA,MACvC,WAAW,QAAQ,uBAAsB;AACvC,mBAAW,KAAK,MAAM,UAAU,KAAK;AAAA,MACvC;AAEA,YAAM,SAAS,KAAK,YAAY,QAAQ;AAGxC,UAAI,QAAQ;AACV,aAAK,KAAK,MAAM;AAEhB,cAAM,QAAQ;AACd,cAAM,OAAO,OAAO,OAAO,KAAK,OAAO,QAAQ;AAC/C,cAAM,MAAM,OAAO,MAAM,KAAK;AAC9B,cAAM,SAAS,OAAO,SAAS,OAAO;AAEtC,gBAAQ,KAAK,IAAI,eAAe,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,CAAC,CAAC;AAAA,MACpE,OAAO;AACL,gBAAQ,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ;AACb,WACE,OAAO,cACP,OAAO,gBACP,OAAO,mBACPG,eAAc,MAAM;AAAA,EAExB;AAAA,EAEA,OAAO;AACT,CAAC;;;ACtJD,SAAS,cAAAC,aAAY,cAAAC,mBAAkB;AACvC,SAAS,SAAAC,QAAsB,mBAAAC,wBAAuB;;;ACKtD,SAASC,QAAO,aAAmC;AACjD,QAAM,SAA+B,CAAC;AACtC,QAAM,UAAUC,6BAA4B,WAAW;AAEvD,UAAQ,QAAQ,CAAC,OAAO,cAAc;AACpC,UAAM,SAASC,gBAAe,KAAK;AACnC,WAAO;AAAA,MACL,GAAG,OAAO,IAAI,QAAM;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,SAAO;AACT;AAEA,SAASD,6BAA4B,aAAmC;AACtE,QAAM,MAAM,oBAAI,IAAkC;AAElD,cAAY,QAAQ,UAAQ;AAC1B,QAAI,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG;AAC5B,UAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,QAAI,IAAI,KAAK,SAAS,EAAG,KAAK,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEA,SAASC,gBAAe,aAAmC;AACzD,QAAM,SAA2C,CAAC;AAClD,QAAM,SAAS,YAAY,IAAI,WAAS;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEvC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,SAAS,QAAQ,KAAK;AAC7B,cAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,KAAK,OAAO;AAEnB,SAAO;AACT;;;AD3DA,IAAM,QAAQ,oBAAI,IAAwB;AAC1C,SAAS,uBAAuB,WAAmB;AACjD,QAAM,WAAW;AAEjB,MAAI,CAAC,MAAM,IAAI,QAAQ,GAAG;AACxB,UAAM,OAAOC,YAAW,KAAK,EAAE,OAAO,UAAU,CAAC;AACjD,UAAM,IAAI,UAAU,IAAI;AAAA,EAC1B;AAEA,SAAO,MAAM,IAAI,QAAQ;AAC3B;AAEA,IAAM,mBAAmBC,OAAM,OAG7B;AAAA,EACA,QAAQ,OAAO;AACb,UAAM,UAAU,IAAIC,iBAA4B;AAEhD,UAAM,YAAY,MAAM;AAAA,MACtB,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO;AAAA,MACvC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQC,QAAO,SAAS,GAAG;AACpC,YAAM,aAAa,uBAAuB,KAAK,SAAS;AACxD,cAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,UAAU;AAAA,IAC5C;AAEA,WAAO,QAAQ,OAAO;AAAA,EACxB;AAAA,EACA,QAAQ,MAAM;AACZ,WAAOC,YAAW,YAAY,QAAQ,CAAC,IAAI,GAAG,WAAS,MAAM,MAAM,IAAI,CAAC;AAAA,EAC1E;AACF,CAAC;;;AEvCD,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,mBAAAC,kBAAiB,eAAAC,cAAa,SAAAC,cAAa;AAOpD,IAAMC,aAAY;AAAA;AAAA,EAEhBF,aAAY,aAAa,GAAG,QAAM;AAChC,UAAM,YAAY,GAAG,WAAW,MAAM,YAAY;AAClD,UAAM,QAAiB,UAAU;AAAA,MAC/B,CAAC,MAAM,aAAa,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,YAAY,MAAM;AAAA,QACtB,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ,EAAE;AAAA,QACrD,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AAAA;AAAA,EAEDA,aAAY,kBAAkB,GAAG,QAAM;AACrC,UAAM,MAAM,GAAG,WAAW,IAAI;AAE9B,UAAM,YAAY,GAAG,WAAW,MAAM,YAAY;AAClD,UAAM,QAAiB,UACpB,OAAgB,CAAC,MAAM,aAAa,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EACxE;AAAA,MACC,UACE,KAAK,QAAQ,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK;AAAA,IACnE;AAEF,QAAI,EAAE,aAAa,IAAI;AACvB,iBAAa,OAAO,QAAQ,CAACG,QAAO,UAAU;AAC5C,iBAAW,QAAQ,OAAO;AACxB,YAAIA,OAAM,SAASA,OAAM,OAAO,KAAK,QAAQA,OAAM,KAAK,KAAK,IAAI;AAC/D,yBAAe,aAAa;AAAA,YAC1BJ,iBAAgB;AAAA,cACdI,OAAM,QAAQ,IAAI,KAAK,OAAO,KAAK;AAAA,cACnCA,OAAM;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAACA,OAAM,SAASL,YAAWK,QAAO,IAAI,GAAG;AAC3C,gBAAM,aAAaA,OAAM,OAAOA,OAAM;AAEtC;AAAA;AAAA,YAEEA,OAAM,SAAS,KAAK;AAAA,YACpB;AACA,2BAAe,aAAa;AAAA,cAC1BJ,iBAAgB;AAAA,gBACdI,OAAM;AAAA,gBACN,KAAK;AAAA,gBACLA,OAAM;AAAA,gBACNA,OAAM,aAAa;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA;AAAA,YAEEA,OAAM,SAAS,KAAK;AAAA,YACpB;AACA,2BAAe,aAAa;AAAA,cAC1BJ,iBAAgB;AAAA,gBACdI,OAAM;AAAA,gBACN,KAAK;AAAA,gBACLA,OAAM;AAAA,gBACNA,OAAM,aAAa;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA;AAAA,YAEEA,OAAM,UAAU,KAAK,QACrBA,OAAM,UAAU,KAAK;AAAA,YACrB;AAEA,gBAAI,YAAY;AACd,6BAAe,aAAa;AAAA,gBAC1BJ,iBAAgB;AAAA,kBACd,KAAK;AAAA,kBACL,KAAK,IAAII,OAAM,MAAM,KAAK,IAAI;AAAA,kBAC9BA,OAAM;AAAA,kBACNA,OAAM,aAAa;AAAA,gBACrB;AAAA,gBACA;AAAA,cACF;AAAA,YACF,OAAO;AACL,6BAAe,aAAa;AAAA,gBAC1BJ,iBAAgB;AAAA,kBACd,KAAK;AAAA,kBACL,KAAK,IAAII,OAAM,MAAM,KAAK,EAAE;AAAA,kBAC5BA,OAAM;AAAA,kBACNA,OAAM,aAAa;AAAA,gBACrB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,aAAa,GAAG,GAAG,YAAY,GAAG;AACpC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAIA,IAAM,eAAeF,OAAM,OAA6B;AAAA,EACtD,SAAS,MAAMC;AACjB,CAAC;","names":["Facet","backgroundDecorations","Facet","Decoration","Facet","syntaxTree","Decoration","syntaxTree","Facet","traverseAST","ViewPlugin","syntaxTree","cursor","ViewPlugin","EditorSelection","Facet","mergeIntervals","range","ViewPlugin","mergeIntervals","EditorSelection","Facet","flatten","EditorSelection","Facet","extension","range","flatten","hasOverlap","EditorState","Facet","extension","EditorView","Prec","Decoration","EditorView","ViewPlugin","WidgetType","RangeSetBuilder","pairs","Decoration","WidgetType","RangeSetBuilder","ViewPlugin","EditorView","EditorView","layer","layer","EditorView","Decoration","EditorView","StateField","range","EditorView","Decoration","ViewPlugin","syntaxTree","layer","Facet","SelectionSide","configChanged","Decoration","EditorView","Facet","RangeSetBuilder","squash","groupDecorationsByClassName","mergeIntervals","Decoration","Facet","RangeSetBuilder","squash","EditorView","hasOverlap","EditorSelection","EditorState","Facet","extension","range"]}
package/dist/index.d.mts CHANGED
@@ -70,12 +70,11 @@ declare abstract class FocusableWidget extends WidgetType {
70
70
  abstract focus(fromSide: -1 | 1): void;
71
71
  }
72
72
 
73
- interface Range {
73
+ interface Range$1 {
74
74
  from: number;
75
75
  to: number;
76
- [key: string]: unknown;
77
76
  }
78
- type RangesProvider = (state: EditorState) => Range[];
77
+ type RangesProvider = (state: EditorState) => Range$1[];
79
78
  type SelectUserEvent = 'select' | 'select.pointer';
80
79
  declare const rangesFacet: Facet<RangesProvider, readonly RangesProvider[]>;
81
80
  declare const selectUserEvent: Facet<SelectUserEvent, SelectUserEvent>;
@@ -161,4 +160,11 @@ interface MarkDecorationSpec {
161
160
 
162
161
  declare const mergeableMarkers: Facet<MarkDecorationSpec[], RangeSet<Decoration>>;
163
162
 
164
- export { type CursorASTDecorator, type DeletionEnlargerSpec, FocusableWidget, type InputRule, type SelectionEnlargerSpec, SelectionSide, type WholeASTDecorator, astDebugger, astDecorator, rangesFacet as autoSelectRanges, selectUserEvent as autoSelectUserEvent, backgroundDecorations, colorizationBrackets, deletionEnlarger, elementAtPosition, focusableKeymap, indentGuides, inputRules, matchingBrackets, mergeableMarkers, mixLanguages, positionElementLayer, scrollBeyondLastLine, selectionEnlarger, updateWholeDecorations };
163
+ interface Range {
164
+ from: number;
165
+ to: number;
166
+ }
167
+ type FrozenRangesProvider = (state: EditorState) => Range[];
168
+ declare const frozenRanges: Facet<FrozenRangesProvider, readonly FrozenRangesProvider[]>;
169
+
170
+ export { type CursorASTDecorator, type DeletionEnlargerSpec, FocusableWidget, type InputRule, type SelectionEnlargerSpec, SelectionSide, type WholeASTDecorator, astDebugger, astDecorator, rangesFacet as autoSelectRanges, selectUserEvent as autoSelectUserEvent, backgroundDecorations, colorizationBrackets, deletionEnlarger, elementAtPosition, focusableKeymap, frozenRanges, indentGuides, inputRules, matchingBrackets, mergeableMarkers, mixLanguages, positionElementLayer, scrollBeyondLastLine, selectionEnlarger, updateWholeDecorations };
package/dist/index.d.ts CHANGED
@@ -70,12 +70,11 @@ declare abstract class FocusableWidget extends WidgetType {
70
70
  abstract focus(fromSide: -1 | 1): void;
71
71
  }
72
72
 
73
- interface Range {
73
+ interface Range$1 {
74
74
  from: number;
75
75
  to: number;
76
- [key: string]: unknown;
77
76
  }
78
- type RangesProvider = (state: EditorState) => Range[];
77
+ type RangesProvider = (state: EditorState) => Range$1[];
79
78
  type SelectUserEvent = 'select' | 'select.pointer';
80
79
  declare const rangesFacet: Facet<RangesProvider, readonly RangesProvider[]>;
81
80
  declare const selectUserEvent: Facet<SelectUserEvent, SelectUserEvent>;
@@ -161,4 +160,11 @@ interface MarkDecorationSpec {
161
160
 
162
161
  declare const mergeableMarkers: Facet<MarkDecorationSpec[], RangeSet<Decoration>>;
163
162
 
164
- export { type CursorASTDecorator, type DeletionEnlargerSpec, FocusableWidget, type InputRule, type SelectionEnlargerSpec, SelectionSide, type WholeASTDecorator, astDebugger, astDecorator, rangesFacet as autoSelectRanges, selectUserEvent as autoSelectUserEvent, backgroundDecorations, colorizationBrackets, deletionEnlarger, elementAtPosition, focusableKeymap, indentGuides, inputRules, matchingBrackets, mergeableMarkers, mixLanguages, positionElementLayer, scrollBeyondLastLine, selectionEnlarger, updateWholeDecorations };
163
+ interface Range {
164
+ from: number;
165
+ to: number;
166
+ }
167
+ type FrozenRangesProvider = (state: EditorState) => Range[];
168
+ declare const frozenRanges: Facet<FrozenRangesProvider, readonly FrozenRangesProvider[]>;
169
+
170
+ export { type CursorASTDecorator, type DeletionEnlargerSpec, FocusableWidget, type InputRule, type SelectionEnlargerSpec, SelectionSide, type WholeASTDecorator, astDebugger, astDecorator, rangesFacet as autoSelectRanges, selectUserEvent as autoSelectUserEvent, backgroundDecorations, colorizationBrackets, deletionEnlarger, elementAtPosition, focusableKeymap, frozenRanges, indentGuides, inputRules, matchingBrackets, mergeableMarkers, mixLanguages, positionElementLayer, scrollBeyondLastLine, selectionEnlarger, updateWholeDecorations };
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ __export(index_exports, {
30
30
  deletionEnlarger: () => deletionEnlarger,
31
31
  elementAtPosition: () => elementAtPosition,
32
32
  focusableKeymap: () => focusableKeymap,
33
+ frozenRanges: () => frozenRanges,
33
34
  indentGuides: () => indentGuides,
34
35
  inputRules: () => inputRules,
35
36
  matchingBrackets: () => matchingBrackets,
@@ -1279,6 +1280,117 @@ var mergeableMarkers = import_state11.Facet.define({
1279
1280
  return import_view13.EditorView.decorations.compute([self], (state) => state.facet(self));
1280
1281
  }
1281
1282
  });
1283
+
1284
+ // src/frozen-ranges/extension.ts
1285
+ var import_utils8 = require("@coze-editor/utils");
1286
+ var import_state12 = require("@codemirror/state");
1287
+ var extension4 = [
1288
+ // 禁止编辑
1289
+ import_state12.EditorState.changeFilter.of((tr) => {
1290
+ const providers = tr.startState.facet(frozenRanges);
1291
+ const specs = providers.reduce(
1292
+ (memo, provider) => [...memo, ...provider(tr.startState)],
1293
+ []
1294
+ );
1295
+ if (Array.isArray(specs)) {
1296
+ const flattened = specs.reduce(
1297
+ (memo, current) => [...memo, current.from, current.to],
1298
+ []
1299
+ );
1300
+ return flattened;
1301
+ }
1302
+ return true;
1303
+ }),
1304
+ // forbid cursor move into frozen ranges
1305
+ import_state12.EditorState.transactionFilter.of((tr) => {
1306
+ const len = tr.startState.doc.length;
1307
+ const providers = tr.startState.facet(frozenRanges);
1308
+ const specs = providers.reduce((memo, provider) => [...memo, ...provider(tr.state)], []).filter(
1309
+ (spec) => spec.from >= 0 && spec.from < len && spec.to >= 0 && spec.to < len
1310
+ );
1311
+ let { newSelection } = tr;
1312
+ newSelection.ranges.forEach((range2, index) => {
1313
+ for (const spec of specs) {
1314
+ if (range2.empty && range2.from > spec.from && range2.to < spec.to) {
1315
+ newSelection = newSelection.replaceRange(
1316
+ import_state12.EditorSelection.cursor(
1317
+ range2.assoc > 0 ? spec.from : spec.to,
1318
+ range2.assoc
1319
+ ),
1320
+ index
1321
+ );
1322
+ }
1323
+ if (!range2.empty && (0, import_utils8.hasOverlap)(range2, spec)) {
1324
+ const isReversed = range2.head < range2.anchor;
1325
+ if (
1326
+ // anchor at left
1327
+ range2.anchor < spec.from
1328
+ ) {
1329
+ newSelection = newSelection.replaceRange(
1330
+ import_state12.EditorSelection.range(
1331
+ range2.anchor,
1332
+ spec.from,
1333
+ range2.goalColumn,
1334
+ range2.bidiLevel ?? void 0
1335
+ ),
1336
+ index
1337
+ );
1338
+ } else if (
1339
+ // anchor at right
1340
+ range2.anchor > spec.to
1341
+ ) {
1342
+ newSelection = newSelection.replaceRange(
1343
+ import_state12.EditorSelection.range(
1344
+ range2.anchor,
1345
+ spec.to,
1346
+ range2.goalColumn,
1347
+ range2.bidiLevel ?? void 0
1348
+ ),
1349
+ index
1350
+ );
1351
+ } else if (
1352
+ // anchor inside
1353
+ range2.anchor >= spec.from && range2.anchor <= spec.to
1354
+ ) {
1355
+ if (isReversed) {
1356
+ newSelection = newSelection.replaceRange(
1357
+ import_state12.EditorSelection.range(
1358
+ spec.from,
1359
+ Math.min(range2.head, spec.from),
1360
+ range2.goalColumn,
1361
+ range2.bidiLevel ?? void 0
1362
+ ),
1363
+ index
1364
+ );
1365
+ } else {
1366
+ newSelection = newSelection.replaceRange(
1367
+ import_state12.EditorSelection.range(
1368
+ spec.to,
1369
+ Math.max(range2.head, spec.to),
1370
+ range2.goalColumn,
1371
+ range2.bidiLevel ?? void 0
1372
+ ),
1373
+ index
1374
+ );
1375
+ }
1376
+ }
1377
+ }
1378
+ }
1379
+ });
1380
+ if (newSelection.eq(tr.newSelection)) {
1381
+ return tr;
1382
+ }
1383
+ return [
1384
+ tr,
1385
+ {
1386
+ selection: newSelection
1387
+ }
1388
+ ];
1389
+ })
1390
+ ];
1391
+ var frozenRanges = import_state12.Facet.define({
1392
+ enables: () => extension4
1393
+ });
1282
1394
  // Annotate the CommonJS export names for ESM import in node:
1283
1395
  0 && (module.exports = {
1284
1396
  FocusableWidget,
@@ -1292,6 +1404,7 @@ var mergeableMarkers = import_state11.Facet.define({
1292
1404
  deletionEnlarger,
1293
1405
  elementAtPosition,
1294
1406
  focusableKeymap,
1407
+ frozenRanges,
1295
1408
  indentGuides,
1296
1409
  inputRules,
1297
1410
  matchingBrackets,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ast-decorator/whole.ts","../src/background-decorations/index.ts","../src/background-decorations/squash.ts","../src/background-decorations/cut.ts","../src/ast-decorator/cursor.ts","../src/ast-decorator/index.ts","../src/ast-debugger/index.ts","../src/focusable/focusable.ts","../src/auto-select-ranges/extension.ts","../src/auto-select-ranges/utils.ts","../src/selection-enlarger/extension.ts","../src/deletion-enlarger/extension.ts","../src/input-rules/index.ts","../src/mix-languages/mix.ts","../src/indent-guides/index.ts","../src/indent-guides/utils.ts","../src/scroll-beyond-last-line/index.ts","../src/scroll-beyond-last-line/empty-block.ts","../src/brackets/matching-brackets.ts","../src/brackets/colorization.ts","../src/position/index.ts","../src/mergeable-markers/index.ts","../src/mergeable-markers/squash.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n} from './ast-decorator';\n\nexport { astDebugger } from './ast-debugger';\n\nexport { focusableKeymap, FocusableWidget } from './focusable';\n\nexport {\n rangesFacet as autoSelectRanges,\n selectUserEvent as autoSelectUserEvent,\n} from './auto-select-ranges';\n\nexport {\n selectionEnlarger,\n type SelectionEnlargerSpec,\n} from './selection-enlarger';\n\nexport {\n deletionEnlarger,\n type DeletionEnlargerSpec,\n} from './deletion-enlarger';\n\nexport { inputRules, type InputRule } from './input-rules';\n\nexport { mixLanguages } from './mix-languages';\n\nexport { indentGuides } from './indent-guides';\n\nexport { scrollBeyondLastLine } from './scroll-beyond-last-line';\n\nexport { colorizationBrackets, matchingBrackets } from './brackets';\n\nexport {\n elementAtPosition,\n positionElementLayer,\n SelectionSide,\n} from './position';\n\nexport { backgroundDecorations } from './background-decorations';\n\nexport { mergeableMarkers } from './mergeable-markers';\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { omit } from 'es-toolkit';\nimport type { Tree, TreeCursor } from '@lezer/common';\nimport { traverseAST } from '@coze-editor/utils';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type WidgetType,\n} from '@codemirror/view';\nimport {\n type EditorState,\n type Range,\n Facet,\n RangeSet,\n StateEffect,\n StateField,\n Prec,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n backgroundDecorations,\n backgroundDecoratorLayer,\n type BackgroundDecoration,\n} from '../background-decorations';\n\ntype Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n atomicRange?: boolean;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n prec?: Precedence;\n}\n\ninterface ReplaceDecorationSpec extends BaseDecorationSpec {\n type: 'replace';\n widget?: WidgetType;\n inclusive?: boolean;\n inclusiveStart?: boolean;\n inclusiveEnd?: boolean;\n block?: boolean;\n}\n\ninterface WidgetDecorationSpec extends BaseDecorationSpec {\n type: 'widget';\n widget: WidgetType;\n side?: number;\n inlineOrder?: boolean;\n block?: boolean;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\ntype DecorationSpec =\n | ClassNameDecorationSpec\n | ReplaceDecorationSpec\n | WidgetDecorationSpec\n | BackgroundDecorationSpec;\n\ntype WholeASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => DecorationSpec[] | DecorationSpec | undefined;\n\nconst updateWholeDecorationsEffect = StateEffect.define();\n\nfunction updateWholeDecorations(view: EditorView) {\n view.dispatch({\n effects: updateWholeDecorationsEffect.of(null),\n });\n}\n\nconst classNameDecorationCache: Map<string, Decoration> = new Map();\nfunction getClassDecoration(className: string): Decoration {\n if (!classNameDecorationCache.has(className)) {\n classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return classNameDecorationCache.get(className)!;\n}\n\ntype CategoriedDecorationSet = Record<Precedence, DecorationSet>;\n\nfunction buildDecorations(state: EditorState, tree: Tree) {\n const decorates = state.facet(wholeASTDecoratorFacet) ?? [];\n\n const treeCursor = tree.cursor();\n const decorations: CategoriedDecorationSet = {\n highest: Decoration.none,\n high: Decoration.none,\n default: Decoration.none,\n low: Decoration.none,\n lowest: Decoration.none,\n };\n let atomicRanges = RangeSet.empty;\n let backgroundDecorations: BackgroundDecoration[] = [];\n\n const from = 0;\n const to = state.doc.length;\n traverseAST(treeCursor, from, to, cursor => {\n decorates.forEach(decorate => {\n const decorationSpec = decorate(cursor, state);\n\n let specs: DecorationSpec[] = [];\n if (Array.isArray(decorationSpec)) {\n specs = decorationSpec;\n } else if (decorationSpec) {\n specs = [decorationSpec];\n }\n\n specs.forEach(spec => {\n const result = updateDecorationSpec(cursor, spec, {\n decorations,\n backgroundDecorations,\n atomicRanges,\n });\n\n if (!result) {\n return;\n }\n\n backgroundDecorations = result.backgroundDecorations;\n atomicRanges = result.atomicRanges;\n });\n });\n });\n\n return {\n decorations,\n atomicRanges,\n backgroundDecorations,\n };\n}\n\nfunction updateDecorationSpec(\n cursor: TreeCursor,\n decorationSpec: DecorationSpec | undefined,\n {\n decorations,\n backgroundDecorations,\n atomicRanges,\n }: {\n decorations: CategoriedDecorationSet;\n backgroundDecorations: BackgroundDecoration[];\n atomicRanges: RangeSet<any>;\n },\n) {\n if (!decorationSpec) {\n return;\n }\n\n const from = decorationSpec.from ?? cursor.from;\n const to = decorationSpec.to ?? cursor.to;\n\n const omitKeys = ['type', 'from', 'to', 'atomicRange'] as const;\n\n let decorationRange: Range<Decoration> | null = null;\n switch (decorationSpec.type) {\n case 'className':\n // from === to marker will cause delete issue\n // e.g. {{content}} renders as `replace-widget mark replace-widget`\n // delete from end of content to start of content\n // when delete to first letter of content, the delete behavior is strange\n decorationRange =\n from === to\n ? null\n : getClassDecoration(decorationSpec.className).range(from, to);\n break;\n case 'replace':\n decorationRange = Decoration.replace(\n omit(decorationSpec, omitKeys),\n ).range(from, to);\n break;\n case 'widget':\n decorationRange = Decoration.widget(omit(decorationSpec, omitKeys)).range(\n from,\n );\n break;\n case 'background':\n backgroundDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decorationRange) {\n const prec =\n decorationSpec.type === 'className'\n ? (decorationSpec.prec ?? 'default')\n : 'default';\n\n if (decorations[prec]) {\n decorations[prec] = decorations[prec].update({\n add: [decorationRange],\n sort: true,\n });\n }\n }\n\n if (\n decorationSpec.type !== 'background' &&\n decorationRange &&\n decorationSpec.atomicRange === true\n ) {\n atomicRanges = atomicRanges.update({\n add: [decorationRange],\n sort: true,\n });\n }\n\n return {\n decorations,\n backgroundDecorations,\n atomicRanges,\n };\n}\n\nconst decorateField = StateField.define<{\n decorations: CategoriedDecorationSet;\n atomicRanges: RangeSet<any>;\n backgroundDecorations: BackgroundDecoration[];\n}>({\n create(state) {\n return buildDecorations(state, syntaxTree(state));\n },\n update(value, tr) {\n const tree = syntaxTree(tr.state);\n\n const hasUpdateEffect = tr.effects.some(effect =>\n effect.is(updateWholeDecorationsEffect),\n );\n const syntaxTreeChanged = syntaxTree(tr.startState) !== tree;\n if (syntaxTreeChanged || hasUpdateEffect) {\n value = buildDecorations(tr.state, tree);\n }\n return value;\n },\n provide(field) {\n return [\n Prec.highest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.highest,\n ),\n ),\n Prec.high(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.high,\n ),\n ),\n Prec.default(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.default,\n ),\n ),\n Prec.low(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.low,\n ),\n ),\n Prec.lowest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.lowest,\n ),\n ),\n\n EditorView.atomicRanges.of(view => view.state.field(field).atomicRanges),\n backgroundDecorations.of(\n view => view.state.field(field).backgroundDecorations,\n ),\n ];\n },\n});\n\nconst wholeASTDecoratorFacet = Facet.define<\n WholeASTDecorator,\n WholeASTDecorator[]\n>({\n enables: [decorateField, backgroundDecoratorLayer],\n});\n\nexport { wholeASTDecoratorFacet, updateWholeDecorations };\n\nexport type { WholeASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n type EditorView,\n RectangleMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { EditorSelection, Facet } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\nimport { squash } from './squash';\nimport { cutAtLineBreak } from './cut';\n\ntype BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(backgroundDecorations) !==\n update.state.facet(backgroundDecorations)\n );\n}\n\n// 使用时需置于 drawSelection 下方(影响 zIndex)\nconst backgroundDecoratorLayer = layer({\n above: false,\n markers(view) {\n const decorations = view.state\n .facet(backgroundDecorations)\n .reduce<\n BackgroundDecoration[]\n >((memo, current) => [...memo, ...current(view)], []);\n\n return cutAtLineBreak(squash(decorations), view.state)\n .map(deco =>\n RectangleMarker.forRange(\n view,\n deco.className,\n EditorSelection.range(deco.from, deco.to),\n ),\n )\n .reduce((memo, current) => [...memo, ...current], []);\n },\n update(update) {\n return (\n update.focusChanged ||\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n class: 'cm-backgroundDecoratorLayer',\n});\n\nconst backgroundDecorations = Facet.define<\n BackgroundDecorationFn,\n BackgroundDecorationFn[]\n>({\n enables: [backgroundDecoratorLayer],\n});\n\nexport { backgroundDecoratorLayer, backgroundDecorations };\n\nexport type { BackgroundDecoration };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { BackgroundDecoration } from './types';\n\nfunction squash(decorations: BackgroundDecoration[]) {\n const result: BackgroundDecoration[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: BackgroundDecoration[]) {\n const map = new Map<string, BackgroundDecoration[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: BackgroundDecoration[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorState } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\n\n// 将跨行的 decoration 在换行符的位置再次切割\nfunction cutAtLineBreak(\n decorations: BackgroundDecoration[],\n state: EditorState,\n) {\n const cuts: BackgroundDecoration[] = [];\n\n decorations.forEach(deco => {\n const startLine = state.doc.lineAt(deco.from);\n const endLine = state.doc.lineAt(deco.to);\n if (startLine.number !== endLine.number) {\n const slices: BackgroundDecoration[] = [];\n let pos = deco.from;\n\n for (let i = startLine.number; i < endLine.number; i++) {\n const line = state.doc.line(i);\n\n slices.push({\n from: pos,\n to: line.to,\n className: deco.className,\n });\n\n pos = line.to + 1;\n }\n\n slices.push({\n from: pos,\n to: deco.to,\n className: deco.className,\n });\n\n cuts.push(...slices);\n } else {\n cuts.push(deco);\n }\n });\n\n return cuts;\n}\n\nexport { cutAtLineBreak };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { TreeCursor } from '@lezer/common';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { type EditorState, Facet, RangeSetBuilder } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n type BackgroundDecoration,\n backgroundDecorations,\n} from '../background-decorations';\n\ntype CursorASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\nclass CursorASTView implements PluginValue {\n private classNameDecorationCache: Map<string, Decoration> = new Map();\n\n decorations: DecorationSet = Decoration.none;\n backgroundDecorations: BackgroundDecoration[] = [];\n\n constructor(private view: EditorView) {}\n\n getClassDecoration(className: string) {\n if (!this.classNameDecorationCache.has(className)) {\n this.classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return this.classNameDecorationCache.get(className);\n }\n\n update(update: ViewUpdate) {\n // focus or selection changed\n if (\n (update.focusChanged && update.view.hasFocus) ||\n !update.startState.selection.eq(update.state.selection)\n ) {\n const tree = syntaxTree(update.state);\n const pos = update.state.selection.main.head;\n const decorators = update.state.facet(cursorASTDecoratorFacet);\n\n const cursor = tree.cursorAt(pos, 0);\n const builder = new RangeSetBuilder<Decoration>();\n const bgDecorations: BackgroundDecoration[] = [];\n\n do {\n decorators.forEach(decorator => {\n const decorationSpec = decorator(cursor, update.state);\n if (!decorationSpec) {\n return;\n }\n\n let decoration;\n switch (decorationSpec.type) {\n case 'className':\n decoration = this.getClassDecoration(decorationSpec.className);\n break;\n case 'background':\n bgDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decoration) {\n builder.add(\n decorationSpec.from ?? cursor.from,\n decorationSpec.to ?? cursor.to,\n decoration,\n );\n }\n });\n } while (cursor.parent());\n\n this.decorations = builder.finish();\n this.backgroundDecorations = bgDecorations;\n }\n\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n this.backgroundDecorations = [];\n }\n }\n}\n\nconst cursorASTDecoratorFacet = Facet.define<\n CursorASTDecorator,\n CursorASTDecorator[]\n>({\n enables: [\n ViewPlugin.fromClass(CursorASTView, {\n decorations: v => v.decorations,\n provide(plugin) {\n return [\n backgroundDecorations.of(\n view => view.plugin(plugin)?.backgroundDecorations ?? [],\n ),\n ];\n },\n }),\n ],\n});\n\nexport { cursorASTDecoratorFacet };\n\nexport type { CursorASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n wholeASTDecoratorFacet,\n updateWholeDecorations,\n type WholeASTDecorator,\n} from './whole';\nimport { cursorASTDecoratorFacet, type CursorASTDecorator } from './cursor';\n\nconst astDecorator = {\n whole: wholeASTDecoratorFacet,\n fromCursor: cursorASTDecoratorFacet,\n};\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { traverseAST } from '@coze-editor/utils';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nconst astDebugger = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n printTreeFromState(view.state);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n printTreeFromState(update.state);\n }\n }\n },\n);\n\nfunction printTreeFromState(state: EditorState) {\n const tree = syntaxTree(state);\n\n console.groupCollapsed('Syntax Tree');\n\n const cursor = tree.cursor();\n traverseAST(cursor, 0, tree.length, cursor => {\n console.group(\n `%c${cursor.name}(${cursor.from}:${cursor.to})`,\n 'color: purple;',\n );\n\n console.log(state.sliceDoc(cursor.from, cursor.to));\n console.groupEnd();\n });\n\n console.groupEnd();\n}\n\nexport { astDebugger };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorView, WidgetType, keymap } from '@codemirror/view';\n\n// function blockAt(view: EditorView, pos: number): BlockInfo {\n// const line = view.lineBlockAt(pos)\n// if (Array.isArray(line.type)) for (const l of line.type) {\n// if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text)) return l\n// }\n// return line\n// }\n\nconst focusableKeymap = keymap.of([\n {\n key: 'ArrowLeft',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n const pos = mainSelection.from;\n\n // WHY get widget view directly from view.docView\n // widget has eq method, if eq returns true, new widget will not be applied\n // widget.toDOM will not be called in this case, so widget.focus won't take effect\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtEnd === pos\n ) {\n child.widget.focus(1);\n handled = true;\n }\n }\n\n if (handled) {\n break;\n }\n }\n return handled;\n },\n },\n {\n key: 'ArrowRight',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n\n const pos = mainSelection.from;\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtStart === pos\n ) {\n child.widget.focus(-1);\n handled = true;\n break;\n }\n }\n\n if (handled) {\n break;\n }\n }\n\n return handled;\n },\n },\n]);\n\nabstract class FocusableWidget extends WidgetType {\n abstract focus(fromSide: -1 | 1): void;\n}\n\nexport { focusableKeymap, FocusableWidget };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy, flatten } from '@coze-editor/utils';\nimport { ViewPlugin, type EditorView, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState, Facet } from '@codemirror/state';\n\nimport { mergeIntervals, findContainingRange } from './utils';\n\ninterface Range {\n from: number;\n to: number;\n [key: string]: unknown;\n}\ntype RangesProvider = (state: EditorState) => Range[];\ntype SelectUserEvent = 'select' | 'select.pointer';\n\nconst extension = ViewPlugin.fromClass(\n class {\n lastFocus = false;\n\n constructor(view: EditorView) {\n this.lastFocus = view.hasFocus;\n }\n\n update(update: ViewUpdate) {\n const userEvent = update.state.facet(selectUserEvent) ?? 'select';\n\n const hasSelectUserEvent = update.transactions.some(tr =>\n tr.isUserEvent(userEvent),\n );\n\n if (hasSelectUserEvent) {\n const lastHasFocus = this.lastFocus;\n\n const startSelection = update.startState.selection;\n const { selection } = update.state;\n\n const rangesProviders = update.state.facet(rangesFacet);\n const ranges = mergeIntervals(\n flatten(\n rangesProviders.map(provider => provider(update.view.state)),\n ).filter(Boolean),\n );\n\n const currentRange = findContainingRange(ranges, selection.main.from);\n\n // 1. 从当前选区外进入当前选区\n // 2. 失焦状态进入当前选区(失焦前原本就在 a range 内,聚焦时再次进入 a range 内,需要再次触发选中)\n if (\n selection.main.empty &&\n currentRange &&\n (!lastHasFocus ||\n // 上一次的选区 from 或 to 在当前选区外(“首次进入”当前选区)\n findContainingRange(ranges, startSelection.main.from) !==\n currentRange ||\n findContainingRange(ranges, startSelection.main.to) !==\n currentRange)\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n selection: selection.replaceRange(\n EditorSelection.range(currentRange.from, currentRange.to),\n ),\n });\n });\n }\n }\n\n if (this.lastFocus !== update.view.hasFocus) {\n this.lastFocus = update.view.hasFocus;\n }\n }\n },\n);\n\nconst rangesFacet = Facet.define<RangesProvider>({\n enables: extension,\n});\n\nconst selectUserEvent = Facet.define<SelectUserEvent, SelectUserEvent>({\n combine: FacetCombineStrategy.Last,\n});\n\nexport { rangesFacet, selectUserEvent };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\ninterface RangeLike {\n from: number;\n to: number;\n [key: string]: unknown;\n}\n\nfunction mergeIntervals(ranges: RangeLike[]) {\n if (ranges.length === 0) {\n return [];\n }\n\n const merged: { from: number; to: number }[] = [];\n const cloned = ranges.map(range => ({\n from: range.from,\n to: range.to,\n }));\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n return merged;\n}\n\nfunction findContainingRange(\n ranges: RangeLike[],\n pos: number,\n): RangeLike | undefined {\n for (const range of ranges) {\n if (pos >= range.from && pos <= range.to) {\n return range;\n }\n }\n}\n\nexport { mergeIntervals, findContainingRange };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface SelectionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype SelectionEnlargerProvider = (\n state: EditorState,\n) => SelectionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n // 内容变化或者选区不变,跳过\n if (tr.docChanged || tr.newSelection.eq(tr.startState.selection)) {\n return tr;\n }\n\n const providers = tr.startState.facet(selectionEnlarger);\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n let { newSelection } = tr;\n\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (hasOverlap(range, spec.source)) {\n const isReversed = range.head < range.anchor;\n const from = Math.min(range.from, spec.target.from);\n const to = Math.max(range.to, spec.target.to);\n const newRange = isReversed\n ? EditorSelection.range(\n to,\n from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n )\n : EditorSelection.range(\n from,\n to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n );\n\n newSelection = newSelection.replaceRange(newRange, index);\n }\n }\n });\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n});\n\nconst selectionEnlarger = Facet.define<SelectionEnlargerProvider>({\n enables: extension,\n});\n\nexport { selectionEnlarger };\n\nexport type { SelectionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { ChangeSet, EditorState, Facet } from '@codemirror/state';\n\ninterface DeletionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n const providers = tr.startState.facet(deletionEnlarger);\n\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n const { length } = tr.startState.doc;\n let changes = ChangeSet.empty(length);\n\n tr.changes.iterChanges((fromA, toA, fromB, toB) => {\n const isDeletion = fromB === toB;\n\n if (!isDeletion) {\n return;\n }\n\n for (const spec of specs) {\n if (\n hasOverlap(\n {\n from: fromA,\n to: toA,\n },\n spec.source,\n )\n ) {\n const change = ChangeSet.of([{ ...spec.target, insert: '' }], length);\n\n changes = changes.compose(change.map(changes));\n }\n }\n });\n\n const nextChanges = changes.map(tr.changes);\n\n if (nextChanges.empty) {\n return tr;\n }\n\n return [\n tr,\n {\n changes: nextChanges,\n sequential: true,\n },\n ];\n});\n\nconst deletionEnlarger = Facet.define<DeletionEnlargerProvider>({\n enables: extension,\n});\n\nexport { deletionEnlarger };\n\nexport type { DeletionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// modified from closeBrackets extension (from @codemirror/autocomplete)\nimport { EditorView } from '@codemirror/view';\nimport { type EditorState, Prec, type Extension } from '@codemirror/state';\n\ninterface InputRule {\n type: 'character';\n triggerCharacter: string;\n handler: ({\n view,\n state,\n from,\n to,\n }: {\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n}\n\nconst android =\n typeof navigator === 'object' && /Android\\b/.test(navigator.userAgent);\n\nconst isExtension = (v: unknown): v is Extension => Boolean(v);\nconst inputRules = (rules?: InputRule[]) => {\n const ruleExtensions: Extension[] = (rules ?? [])\n .map(({ type, triggerCharacter, handler }) => {\n if (type === 'character') {\n return EditorView.inputHandler.of((view, from, to, insert) => {\n if (\n (android ? view.composing : view.compositionStarted) ||\n view.state.readOnly\n ) {\n return false;\n }\n const sel = view.state.selection.main;\n if (\n insert !== triggerCharacter ||\n from !== sel.from ||\n to !== sel.to\n ) {\n return false;\n }\n return handler({\n view,\n state: view.state,\n from,\n to,\n });\n });\n }\n })\n .filter(v => isExtension(v));\n\n // give it a higher precedence than default closebrackets extension\n return Prec.high(ruleExtensions);\n};\n\nexport { inputRules };\n\nexport type { InputRule };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as templateParser } from '@coze-editor/lezer-parser-template';\nimport { type Language, LRLanguage } from '@codemirror/language';\n\ninterface MixOptions {\n name?: string;\n outerLanguage?: Language;\n innerLanguage?: Language;\n}\n\nfunction mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions) {\n return LRLanguage.define({\n name,\n parser: templateParser.configure({\n wrap: parseMixed(node => {\n if (outerLanguage && node.type.isTop) {\n return {\n parser: outerLanguage.parser,\n overlay: n => n.type.name === 'Text',\n };\n }\n\n if (innerLanguage && node.name === 'InterpolationContent') {\n return {\n parser: innerLanguage.parser,\n };\n }\n\n return null;\n }),\n }),\n });\n}\n\nexport { mixLanguages };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/// Adapted from https://github.com/nota-lang/nota/blob/master/packages/nota-editor/lib/indentation-guides.ts 做了一些调整\nimport { range } from 'es-toolkit';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { RangeSetBuilder } from '@codemirror/state';\n\nimport { getCodeStart, fromPairs } from './utils';\n\nconst indentationMark = Decoration.mark({ class: 'cm-indentation-guide' });\nconst indentationLevelMarks = range(20).map(i =>\n Decoration.line({ class: `cm-indentation-level-${i}` }),\n);\n\nclass IndentationWidget extends WidgetType {\n constructor(readonly indents: number[]) {\n super();\n }\n\n static create(indents: number[]) {\n return Decoration.widget({\n widget: new IndentationWidget(indents),\n side: 1,\n });\n }\n\n toDOM() {\n const wrap = document.createElement('span');\n wrap.className = 'cm-indentation-widget';\n for (const indent of this.indents) {\n const marker = wrap.appendChild(document.createElement('span'));\n marker.className = 'cm-indentation-guide';\n marker.textContent = ' ';\n wrap.append(' '.repeat(indent - 1));\n }\n return wrap;\n }\n}\n\nfunction makeIndentationMark(\n from: number,\n to: number,\n indent: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n builder.add(from, from, indentationLevelMarks[indent / tabSize]);\n for (let i = from; i < Math.min(from + indent, to); i += tabSize) {\n builder.add(i, i + 1, indentationMark);\n }\n}\n\nfunction makeIndentationWidget(\n from: number,\n to: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n const length = to - from;\n if (length !== 0) {\n return;\n }\n\n if (tabSize > 2) {\n builder.add(to, to, IndentationWidget.create([tabSize]));\n } else {\n builder.add(to, to, IndentationWidget.create([2, tabSize * 2]));\n }\n}\n\nfunction makeIndentationDecorators(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const tabSize = Number(view.state.tabSize);\n const { doc } = view.state;\n const spaceOnlyLines: { from: number; to: number }[] = [];\n let currentIndent = 0;\n for (const { from: visibleFrom, to: visibleTo } of view.visibleRanges) {\n let to = visibleFrom - 1;\n let pos, from, length, text;\n\n while ((pos = to + 1) <= visibleTo) {\n ({ from, to, length, text } = doc.lineAt(pos));\n const codeStartsAt = getCodeStart(text);\n const isAllSpaces = codeStartsAt === length;\n // we don't have indentation guides for the zero indentation level\n const skipIndent = codeStartsAt === 0;\n const isComment = text[codeStartsAt] === '/';\n if (isAllSpaces) {\n spaceOnlyLines.push({ from, to });\n continue;\n } else if (skipIndent) {\n spaceOnlyLines.length = 0;\n continue;\n }\n\n const indent = Math.ceil(codeStartsAt / tabSize) * tabSize;\n\n if (!isComment) {\n currentIndent = indent;\n }\n\n for (const { from: spaceFrom, to: spaceTo } of spaceOnlyLines) {\n makeIndentationMark(\n spaceFrom,\n spaceTo,\n currentIndent,\n tabSize,\n builder,\n );\n makeIndentationWidget(spaceFrom, spaceTo, tabSize, builder);\n }\n spaceOnlyLines.length = 0;\n\n makeIndentationMark(from, to, indent, tabSize, builder);\n }\n }\n return builder.finish();\n}\n\nconst showIndentations = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = makeIndentationDecorators(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = makeIndentationDecorators(update.view);\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nconst indentationTheme = EditorView.baseTheme({\n '.cm-line': {\n paddingLeft: 0,\n marginLeft: '2px',\n },\n '.cm-indentation-guide': {\n position: 'relative',\n },\n '.cm-indentation-guide:after': {\n position: 'absolute',\n content: \"''\",\n right: '0.9ch',\n height: '1.4em',\n borderLeft: '1px solid rgba(28, 31, 35, .08)',\n },\n ...fromPairs(\n indentationLevelMarks.map((_decoration, i) => [\n `.cm-indentation-level-${i}`,\n { textIndent: `-${i * 2}ch`, paddingLeft: `${i * 2}ch` },\n ]),\n ),\n});\n\nexport const indentGuides = () => [showIndentations, indentationTheme];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nconst SPACES = /^\\s*/;\n\nexport const getCodeStart = (text: string) => text.match(SPACES)![0].length;\n\nexport const fromPairs = (pairs: [string, unknown][]) => {\n let index = -1;\n const length = pairs == null ? 0 : pairs.length;\n const result: Record<string, unknown> = {};\n\n while (++index < length) {\n const pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView, layer, type ViewUpdate } from '@codemirror/view';\n\nimport { EmptyBlock } from './empty-block';\n\nexport const scrollBeyondLastLine = (scrollHeight?: number) => [\n layer({\n above: false,\n updateOnDocViewUpdate: true,\n class: 'cm-empty-marker-layer',\n update(update: ViewUpdate): boolean {\n return update.state.doc.lines !== update.startState.doc.lines;\n },\n markers(view) {\n const maker = new EmptyBlock(\n view.state.doc.lines,\n view.contentHeight,\n scrollHeight,\n );\n return [maker];\n },\n }),\n EditorView.theme({\n '& .cm-empty-marker-layer': {\n height: '100%',\n },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { LayerMarker } from '@codemirror/view';\n\nexport class EmptyBlock implements LayerMarker {\n constructor(\n private lineNumber: number,\n readonly contentHeight: number,\n readonly scrollHeight?: number,\n ) {}\n\n draw() {\n const elt = document.createElement('div');\n elt.className = 'cm-empty-scroll-block-maker';\n this.adjust(elt);\n return elt;\n }\n\n update(_: HTMLElement, prev: EmptyBlock) {\n return (\n prev.lineNumber === this.lineNumber &&\n prev.contentHeight === this.contentHeight &&\n prev.scrollHeight === this.scrollHeight\n );\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.display = 'block';\n elt.style.width = '1px';\n\n if (this.lineNumber > 1) {\n elt.style.height = `calc(${typeof this.scrollHeight === 'number' ? `${this.scrollHeight}px` : '100%'} + ${this.contentHeight}px)`;\n } else {\n elt.style.height = '0';\n }\n }\n\n eq(p: EmptyBlock) {\n return (\n this.lineNumber === p.lineNumber &&\n this.contentHeight === p.contentHeight &&\n this.scrollHeight === p.scrollHeight\n );\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet, EditorView } from '@codemirror/view';\nimport { type EditorState, StateField, type Range } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n '(': ')',\n '{': '}',\n '[': ']',\n ')': '(',\n '}': '{',\n ']': '[',\n};\n\nconst findMatchingBracket = (state: EditorState, cursorPos: number) => {\n try {\n const doc = state.doc.toString();\n let stack: string[] = [];\n let leftIndex = -1;\n let rightIndex = -1;\n\n // 向前查找\n for (let i = cursorPos - 1; i >= 0; i--) {\n const char = doc[i];\n if (pairs[char]) {\n if ([')', '}', ']'].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n leftIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n stack = [];\n\n // 向后查找\n for (let i = cursorPos; i < doc.length; i++) {\n const char = doc[i];\n if (pairs[char]) {\n if (['(', '{', '['].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n rightIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n if (leftIndex !== -1 && rightIndex !== -1) {\n return [leftIndex, rightIndex];\n }\n\n return null;\n } catch (e) {\n console.error('findMatchingBracket failed', e);\n return null;\n }\n};\n\nconst renderMatch = (match: number) => {\n const decorations: Range<Decoration>[] = [];\n const mark = Decoration.mark({ class: 'cm-matchingBracket' });\n decorations.push(mark.range(match, match + 1));\n return decorations;\n};\n\nconst bracketMatchingState = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(deco, tr) {\n if (!tr.docChanged && !tr.selection) {\n return deco;\n }\n\n let decorations: Range<Decoration>[] = [];\n\n for (const range of tr.state.selection.ranges) {\n if (!range.empty) {\n continue;\n }\n const match = findMatchingBracket(tr.state, range.head);\n\n if (match) {\n decorations = decorations.concat(\n renderMatch(match[0]),\n renderMatch(match[1]),\n );\n }\n }\n\n return Decoration.set(decorations, true);\n },\n provide: f => EditorView.decorations.from(f),\n});\n\nexport const matchingBrackets = [bracketMatchingState];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n type ViewUpdate,\n type DecorationSet,\n} from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\n\nconst DEFAULT_COLORS = ['#ffd700', '#da70d6', '#179fff'];\n\nconst ColorizationBracketsPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.getBracketDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = this.getBracketDecorations(update.view);\n }\n }\n\n getBracketDecorations(view: EditorView) {\n const { doc } = view.state;\n const decorations: any[] = [];\n const stack: { type: string; from: number }[] = [];\n const limitNodeType = ['Comment', 'String'];\n\n const tree = syntaxTree(view.state);\n\n for (let pos = 0; pos < doc.length; pos += 1) {\n const char = doc.sliceString(pos, pos + 1);\n const node = tree.resolveInner(pos);\n\n if (limitNodeType.includes(node.type.name)) {\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n stack.push({ type: char, from: pos });\n } else if (char === ')' || char === ']' || char === '}') {\n const open = stack.pop();\n if (open && open.type === this.getMatchingBracket(char)) {\n const index = stack.length % 3;\n decorations.push(\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n open.from,\n open.from + 1,\n ),\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n pos,\n pos + 1,\n ),\n );\n }\n }\n }\n\n decorations.sort((a, b) => a.from - b.from || a.startSide - b.startSide);\n\n return Decoration.set(decorations);\n }\n\n getMatchingBracket(closingBracket: string) {\n switch (closingBracket) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n default:\n return null;\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nexport const colorizationBrackets = [\n ColorizationBracketsPlugin,\n EditorView.baseTheme({\n '.colorization-bracket-0': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-0 > span': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-1': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-1 > span': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-2': { color: DEFAULT_COLORS[2] },\n '.colorization-bracket-2 > span': { color: DEFAULT_COLORS[2] },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n Direction,\n type EditorView,\n type LayerMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { Facet } from '@codemirror/state';\n\nenum SelectionSide {\n Head = 'head',\n Anchor = 'anchor',\n}\n\ninterface PositionElement {\n dom: HTMLElement | null;\n pos: SelectionSide | number | ((view: EditorView) => number);\n}\nconst elementAtPosition = Facet.define<PositionElement, PositionElement[]>();\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(elementAtPosition) !==\n update.state.facet(elementAtPosition)\n );\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nclass PositionMarker implements LayerMarker {\n constructor(\n public readonly dom: HTMLElement,\n public readonly rect?: Rect,\n ) {}\n\n eq(marker: PositionMarker) {\n return Boolean(\n ((!this.rect && !marker.rect) ||\n (this.rect &&\n marker.rect &&\n this.rect.left === marker.rect.left &&\n this.rect.top === marker.rect.top &&\n this.rect.width === marker.rect.width &&\n this.rect.height === marker.rect.height)) &&\n this.dom === marker.dom,\n );\n }\n\n draw() {\n this.adjust(this.dom);\n return this.dom;\n }\n\n update() {\n this.adjust(this.dom);\n return true;\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.pointerEvents = 'none';\n\n if (!this.rect) {\n return;\n }\n elt.style.left = `${this.rect.left}px`;\n elt.style.top = `${this.rect.top}px`;\n elt.style.width = `${this.rect.width}px`;\n elt.style.height = `${this.rect.height}px`;\n }\n}\n\nfunction getBase(view: EditorView) {\n const rect = view.scrollDOM.getBoundingClientRect();\n const left =\n view.textDirection === Direction.LTR\n ? rect.left\n : rect.right - view.scrollDOM.clientWidth * view.scaleX;\n return {\n left: left - view.scrollDOM.scrollLeft * view.scaleX,\n top: rect.top - view.scrollDOM.scrollTop * view.scaleY,\n };\n}\n\nconst positionElementLayer = layer({\n above: true,\n\n markers(view: EditorView) {\n const elements = view.state.facet(elementAtPosition);\n\n if (!elements || elements.length === 0) {\n return [];\n }\n\n const base = getBase(view);\n\n const temp: any[] = [];\n\n const markers: PositionMarker[] = [];\n for (const { dom, pos } of elements) {\n if (!dom) {\n continue;\n }\n\n let finalPos = -1;\n\n if (typeof pos === 'function') {\n finalPos = pos(view);\n } else if (typeof pos === 'number') {\n finalPos = pos;\n } else if (pos === SelectionSide.Head) {\n finalPos = view.state.selection.main.head;\n } else if (pos === SelectionSide.Anchor) {\n finalPos = view.state.selection.main.anchor;\n }\n\n const coords = view.coordsAtPos(finalPos);\n\n // 由于 codemirror 实现了局部渲染,可能取不到 coords\n if (coords) {\n temp.push(coords);\n\n const width = 1;\n const left = coords.left - base.left - width / 2;\n const top = coords.top - base.top;\n const height = coords.bottom - coords.top;\n\n markers.push(new PositionMarker(dom, { left, top, width, height }));\n } else {\n markers.push(new PositionMarker(dom));\n }\n }\n\n return markers;\n },\n\n update(update) {\n return (\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n\n class: 'cm-positionReferenceLayer',\n});\n\nexport { elementAtPosition, positionElementLayer, SelectionSide };\n\nexport type { PositionElement };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, EditorView } from '@codemirror/view';\nimport { Facet, type RangeSet, RangeSetBuilder } from '@codemirror/state';\n\nimport { type MarkDecorationSpec, squash } from './squash';\n\nconst cache = new Map<string, Decoration>();\nfunction getClassNameDecoration(className: string) {\n const cacheKey = className;\n\n if (!cache.has(cacheKey)) {\n const mark = Decoration.mark({ class: className });\n cache.set(cacheKey, mark);\n }\n\n return cache.get(cacheKey)!;\n}\n\nconst mergeableMarkers = Facet.define<\n MarkDecorationSpec[],\n RangeSet<Decoration>\n>({\n combine(specs) {\n const builder = new RangeSetBuilder<Decoration>();\n\n const flattened = specs.reduce(\n (memo, current) => [...memo, ...current],\n [],\n );\n\n for (const spec of squash(flattened)) {\n const decoration = getClassNameDecoration(spec.className);\n builder.add(spec.from, spec.to, decoration);\n }\n\n return builder.finish();\n },\n enables(self) {\n return EditorView.decorations.compute([self], state => state.facet(self));\n },\n});\n\nexport { mergeableMarkers };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport interface MarkDecorationSpec {\n from: number;\n to: number;\n className: string;\n}\n\nfunction squash(decorations: MarkDecorationSpec[]) {\n const result: MarkDecorationSpec[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n result.sort((a, b) => a.from - b.from);\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: MarkDecorationSpec[]) {\n const map = new Map<string, MarkDecorationSpec[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: MarkDecorationSpec[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,wBAAqB;AAErB,mBAA4B;AAC5B,IAAAA,eAKO;AACP,IAAAC,gBAQO;AACP,sBAA2B;;;AClB3B,kBAKO;AACP,mBAAuC;;;ACJvC,SAAS,OAAO,aAAqC;AACnD,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAU,4BAA4B,WAAW;AAEvD,UAAQ,QAAQ,CAAC,OAAO,cAAc;AACpC,UAAM,SAAS,eAAe,KAAK;AACnC,WAAO;AAAA,MACL,GAAG,OAAO,IAAI,QAAM;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,4BAA4B,aAAqC;AACxE,QAAM,MAAM,oBAAI,IAAoC;AAEpD,cAAY,QAAQ,UAAQ;AAC1B,QAAI,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG;AAC5B,UAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,QAAI,IAAI,KAAK,SAAS,EAAG,KAAK,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,aAAqC;AAC3D,QAAM,SAA2C,CAAC;AAClD,QAAM,SAAS,YAAY,IAAI,WAAS;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEvC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,SAAS,QAAQ,KAAK;AAC7B,cAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,KAAK,OAAO;AAEnB,SAAO;AACT;;;ACrDA,SAAS,eACP,aACA,OACA;AACA,QAAM,OAA+B,CAAC;AAEtC,cAAY,QAAQ,UAAQ;AAC1B,UAAM,YAAY,MAAM,IAAI,OAAO,KAAK,IAAI;AAC5C,UAAM,UAAU,MAAM,IAAI,OAAO,KAAK,EAAE;AACxC,QAAI,UAAU,WAAW,QAAQ,QAAQ;AACvC,YAAM,SAAiC,CAAC;AACxC,UAAI,MAAM,KAAK;AAEf,eAAS,IAAI,UAAU,QAAQ,IAAI,QAAQ,QAAQ,KAAK;AACtD,cAAM,OAAO,MAAM,IAAI,KAAK,CAAC;AAE7B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,WAAW,KAAK;AAAA,QAClB,CAAC;AAED,cAAM,KAAK,KAAK;AAAA,MAClB;AAEA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,KAAK;AAAA,QACT,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,WAAK,KAAK,GAAG,MAAM;AAAA,IACrB,OAAO;AACL,WAAK,KAAK,IAAI;AAAA,IAChB;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AF7BA,SAAS,cAAc,QAAoB;AACzC,SACE,OAAO,WAAW,MAAM,qBAAqB,MAC7C,OAAO,MAAM,MAAM,qBAAqB;AAE5C;AAGA,IAAM,+BAA2B,mBAAM;AAAA,EACrC,OAAO;AAAA,EACP,QAAQ,MAAM;AACZ,UAAM,cAAc,KAAK,MACtB,MAAM,qBAAqB,EAC3B,OAEC,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtD,WAAO,eAAe,OAAO,WAAW,GAAG,KAAK,KAAK,EAClD;AAAA,MAAI,UACH,4BAAgB;AAAA,QACd;AAAA,QACA,KAAK;AAAA,QACL,6BAAgB,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA,MAC1C;AAAA,IACF,EACC,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;AAAA,EACxD;AAAA,EACA,OAAO,QAAQ;AACb,WACE,OAAO,gBACP,OAAO,cACP,OAAO,gBACP,OAAO,mBACP,cAAc,MAAM;AAAA,EAExB;AAAA,EACA,OAAO;AACT,CAAC;AAED,IAAM,wBAAwB,mBAAM,OAGlC;AAAA,EACA,SAAS,CAAC,wBAAwB;AACpC,CAAC;;;ADiBD,IAAM,+BAA+B,0BAAY,OAAO;AAExD,SAAS,uBAAuB,MAAkB;AAChD,OAAK,SAAS;AAAA,IACZ,SAAS,6BAA6B,GAAG,IAAI;AAAA,EAC/C,CAAC;AACH;AAEA,IAAM,2BAAoD,oBAAI,IAAI;AAClE,SAAS,mBAAmB,WAA+B;AACzD,MAAI,CAAC,yBAAyB,IAAI,SAAS,GAAG;AAC5C,6BAAyB;AAAA,MACvB;AAAA,MACA,wBAAW,KAAK;AAAA,QACd,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,yBAAyB,IAAI,SAAS;AAC/C;AAIA,SAAS,iBAAiB,OAAoB,MAAY;AACxD,QAAM,YAAY,MAAM,MAAM,sBAAsB,KAAK,CAAC;AAE1D,QAAM,aAAa,KAAK,OAAO;AAC/B,QAAM,cAAuC;AAAA,IAC3C,SAAS,wBAAW;AAAA,IACpB,MAAM,wBAAW;AAAA,IACjB,SAAS,wBAAW;AAAA,IACpB,KAAK,wBAAW;AAAA,IAChB,QAAQ,wBAAW;AAAA,EACrB;AACA,MAAI,eAAe,uBAAS;AAC5B,MAAIC,yBAAgD,CAAC;AAErD,QAAM,OAAO;AACb,QAAM,KAAK,MAAM,IAAI;AACrB,gCAAY,YAAY,MAAM,IAAI,YAAU;AAC1C,cAAU,QAAQ,cAAY;AAC5B,YAAM,iBAAiB,SAAS,QAAQ,KAAK;AAE7C,UAAI,QAA0B,CAAC;AAC/B,UAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,gBAAQ;AAAA,MACV,WAAW,gBAAgB;AACzB,gBAAQ,CAAC,cAAc;AAAA,MACzB;AAEA,YAAM,QAAQ,UAAQ;AACpB,cAAM,SAAS,qBAAqB,QAAQ,MAAM;AAAA,UAChD;AAAA,UACA,uBAAAA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,QAAAA,yBAAwB,OAAO;AAC/B,uBAAe,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,uBAAAA;AAAA,EACF;AACF;AAEA,SAAS,qBACP,QACA,gBACA;AAAA,EACE;AAAA,EACA,uBAAAA;AAAA,EACA;AACF,GAKA;AACA,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,eAAe,QAAQ,OAAO;AAC3C,QAAM,KAAK,eAAe,MAAM,OAAO;AAEvC,QAAM,WAAW,CAAC,QAAQ,QAAQ,MAAM,aAAa;AAErD,MAAI,kBAA4C;AAChD,UAAQ,eAAe,MAAM;AAAA,IAC3B,KAAK;AAKH,wBACE,SAAS,KACL,OACA,mBAAmB,eAAe,SAAS,EAAE,MAAM,MAAM,EAAE;AACjE;AAAA,IACF,KAAK;AACH,wBAAkB,wBAAW;AAAA,YAC3B,wBAAK,gBAAgB,QAAQ;AAAA,MAC/B,EAAE,MAAM,MAAM,EAAE;AAChB;AAAA,IACF,KAAK;AACH,wBAAkB,wBAAW,WAAO,wBAAK,gBAAgB,QAAQ,CAAC,EAAE;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,MAAAA,uBAAsB,KAAK;AAAA,QACzB,MAAM,eAAe,QAAQ,OAAO;AAAA,QACpC,IAAI,eAAe,MAAM,OAAO;AAAA,QAChC,WAAW,eAAe;AAAA,MAC5B,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,iBAAiB;AACnB,UAAM,OACJ,eAAe,SAAS,cACnB,eAAe,QAAQ,YACxB;AAEN,QAAI,YAAY,IAAI,GAAG;AACrB,kBAAY,IAAI,IAAI,YAAY,IAAI,EAAE,OAAO;AAAA,QAC3C,KAAK,CAAC,eAAe;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MACE,eAAe,SAAS,gBACxB,mBACA,eAAe,gBAAgB,MAC/B;AACA,mBAAe,aAAa,OAAO;AAAA,MACjC,KAAK,CAAC,eAAe;AAAA,MACrB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,uBAAAA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,yBAAW,OAI9B;AAAA,EACD,OAAO,OAAO;AACZ,WAAO,iBAAiB,WAAO,4BAAW,KAAK,CAAC;AAAA,EAClD;AAAA,EACA,OAAO,OAAO,IAAI;AAChB,UAAM,WAAO,4BAAW,GAAG,KAAK;AAEhC,UAAM,kBAAkB,GAAG,QAAQ;AAAA,MAAK,YACtC,OAAO,GAAG,4BAA4B;AAAA,IACxC;AACA,UAAM,wBAAoB,4BAAW,GAAG,UAAU,MAAM;AACxD,QAAI,qBAAqB,iBAAiB;AACxC,cAAQ,iBAAiB,GAAG,OAAO,IAAI;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,OAAO;AACb,WAAO;AAAA,MACL,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MAEA,wBAAW,aAAa,GAAG,UAAQ,KAAK,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,MACvE,sBAAsB;AAAA,QACpB,UAAQ,KAAK,MAAM,MAAM,KAAK,EAAE;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAM,yBAAyB,oBAAM,OAGnC;AAAA,EACA,SAAS,CAAC,eAAe,wBAAwB;AACnD,CAAC;;;AI5SD,IAAAC,eAOO;AACP,IAAAC,gBAAyD;AACzD,IAAAC,mBAA2B;AA6B3B,IAAM,gBAAN,MAA2C;AAAA,EAMzC,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAL/B,2BAAoD,oBAAI,IAAI;AAAA,EAEpE,cAA6B,wBAAW;AAAA,EACxC,wBAAgD,CAAC;AAAA,EAIjD,mBAAmB,WAAmB;AACpC,QAAI,CAAC,KAAK,yBAAyB,IAAI,SAAS,GAAG;AACjD,WAAK,yBAAyB;AAAA,QAC5B;AAAA,QACA,wBAAW,KAAK;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,yBAAyB,IAAI,SAAS;AAAA,EACpD;AAAA,EAEA,OAAO,QAAoB;AAEzB,QACG,OAAO,gBAAgB,OAAO,KAAK,YACpC,CAAC,OAAO,WAAW,UAAU,GAAG,OAAO,MAAM,SAAS,GACtD;AACA,YAAM,WAAO,6BAAW,OAAO,KAAK;AACpC,YAAM,MAAM,OAAO,MAAM,UAAU,KAAK;AACxC,YAAM,aAAa,OAAO,MAAM,MAAM,uBAAuB;AAE7D,YAAM,SAAS,KAAK,SAAS,KAAK,CAAC;AACnC,YAAM,UAAU,IAAI,8BAA4B;AAChD,YAAM,gBAAwC,CAAC;AAE/C,SAAG;AACD,mBAAW,QAAQ,eAAa;AAC9B,gBAAM,iBAAiB,UAAU,QAAQ,OAAO,KAAK;AACrD,cAAI,CAAC,gBAAgB;AACnB;AAAA,UACF;AAEA,cAAI;AACJ,kBAAQ,eAAe,MAAM;AAAA,YAC3B,KAAK;AACH,2BAAa,KAAK,mBAAmB,eAAe,SAAS;AAC7D;AAAA,YACF,KAAK;AACH,4BAAc,KAAK;AAAA,gBACjB,MAAM,eAAe,QAAQ,OAAO;AAAA,gBACpC,IAAI,eAAe,MAAM,OAAO;AAAA,gBAChC,WAAW,eAAe;AAAA,cAC5B,CAAC;AACD;AAAA,UACJ;AAEA,cAAI,YAAY;AACd,oBAAQ;AAAA,cACN,eAAe,QAAQ,OAAO;AAAA,cAC9B,eAAe,MAAM,OAAO;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO,OAAO;AAEvB,WAAK,cAAc,QAAQ,OAAO;AAClC,WAAK,wBAAwB;AAAA,IAC/B;AAEA,QAAI,OAAO,gBAAgB,CAAC,OAAO,KAAK,UAAU;AAChD,WAAK,cAAc,wBAAW;AAC9B,WAAK,wBAAwB,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,oBAAM,OAGpC;AAAA,EACA,SAAS;AAAA,IACP,wBAAW,UAAU,eAAe;AAAA,MAClC,aAAa,OAAK,EAAE;AAAA,MACpB,QAAQ,QAAQ;AACd,eAAO;AAAA,UACL,sBAAsB;AAAA,YACpB,UAAK;AAjIjB;AAiIoB,iCAAK,OAAO,MAAM,MAAlB,mBAAqB,0BAAyB,CAAC;AAAA;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;;;AC7HD,IAAM,eAAe;AAAA,EACnB,OAAO;AAAA,EACP,YAAY;AACd;;;ACVA,IAAAC,gBAA4B;AAC5B,IAAAC,eAA6D;AAE7D,IAAAC,mBAA2B;AAE3B,IAAM,cAAc,wBAAW;AAAA,EAC7B,MAAM;AAAA,IACJ,YAAY,MAAkB;AAC5B,yBAAmB,KAAK,KAAK;AAAA,IAC/B;AAAA,IAEA,OAAO,QAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAoB;AAC9C,QAAM,WAAO,6BAAW,KAAK;AAE7B,UAAQ,eAAe,aAAa;AAEpC,QAAM,SAAS,KAAK,OAAO;AAC3B,iCAAY,QAAQ,GAAG,KAAK,QAAQ,CAAAC,YAAU;AAC5C,YAAQ;AAAA,MACN,KAAKA,QAAO,IAAI,IAAIA,QAAO,IAAI,IAAIA,QAAO,EAAE;AAAA,MAC5C;AAAA,IACF;AAEA,YAAQ,IAAI,MAAM,SAASA,QAAO,MAAMA,QAAO,EAAE,CAAC;AAClD,YAAQ,SAAS;AAAA,EACnB,CAAC;AAED,UAAQ,SAAS;AACnB;;;ACpCA,IAAAC,eAAoD;AAUpD,IAAM,kBAAkB,oBAAO,GAAG;AAAA,EAChC;AAAA,IACE,KAAK;AAAA,IACL,IAAI,MAAkB;AACpB,YAAM,gBAAgB,KAAK,MAAM,UAAU;AAC3C,UAAI,CAAC,cAAc,OAAO;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU;AACd,YAAM,MAAM,cAAc;AAO1B,iBAAW,QAAQ,KAAK,QAAQ,UAAU;AACxC,mBAAW,SAAS,KAAK,UAAU;AACjC,cACE,MAAM,YACN,MAAM,kBAAkB,mBACxB,MAAM,aAAa,KACnB;AACA,kBAAM,OAAO,MAAM,CAAC;AACpB,sBAAU;AAAA,UACZ;AAAA,QACF;AAEA,YAAI,SAAS;AACX;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,IAAI,MAAkB;AACpB,YAAM,gBAAgB,KAAK,MAAM,UAAU;AAC3C,UAAI,CAAC,cAAc,OAAO;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU;AAEd,YAAM,MAAM,cAAc;AAG1B,iBAAW,QAAQ,KAAK,QAAQ,UAAU;AACxC,mBAAW,SAAS,KAAK,UAAU;AACjC,cACE,MAAM,YACN,MAAM,kBAAkB,mBACxB,MAAM,eAAe,KACrB;AACA,kBAAM,OAAO,MAAM,EAAE;AACrB,sBAAU;AACV;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS;AACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAED,IAAe,kBAAf,cAAuC,wBAAW;AAElD;;;ACpFA,IAAAC,gBAA8C;AAC9C,IAAAC,eAA6D;AAC7D,IAAAC,gBAAyD;;;ACIzD,SAASC,gBAAe,QAAqB;AAC3C,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,SAAS,OAAO,IAAI,CAAAC,YAAU;AAAA,IAClC,MAAMA,OAAM;AAAA,IACZ,IAAIA,OAAM;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,QAAQ,QAAQ,IAAI;AAC3B,cAAQ,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;AAAA,IAC3C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,QACA,KACuB;AACvB,aAAWA,UAAS,QAAQ;AAC1B,QAAI,OAAOA,OAAM,QAAQ,OAAOA,OAAM,IAAI;AACxC,aAAOA;AAAA,IACT;AAAA,EACF;AACF;;;ADjCA,IAAM,YAAY,wBAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,YAAY;AAAA,IAEZ,YAAY,MAAkB;AAC5B,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,IAEA,OAAO,QAAoB;AACzB,YAAM,YAAY,OAAO,MAAM,MAAM,eAAe,KAAK;AAEzD,YAAM,qBAAqB,OAAO,aAAa;AAAA,QAAK,QAClD,GAAG,YAAY,SAAS;AAAA,MAC1B;AAEA,UAAI,oBAAoB;AACtB,cAAM,eAAe,KAAK;AAE1B,cAAM,iBAAiB,OAAO,WAAW;AACzC,cAAM,EAAE,UAAU,IAAI,OAAO;AAE7B,cAAM,kBAAkB,OAAO,MAAM,MAAM,WAAW;AACtD,cAAM,SAASC;AAAA,cACb;AAAA,YACE,gBAAgB,IAAI,cAAY,SAAS,OAAO,KAAK,KAAK,CAAC;AAAA,UAC7D,EAAE,OAAO,OAAO;AAAA,QAClB;AAEA,cAAM,eAAe,oBAAoB,QAAQ,UAAU,KAAK,IAAI;AAIpE,YACE,UAAU,KAAK,SACf,iBACC,CAAC;AAAA,QAEA,oBAAoB,QAAQ,eAAe,KAAK,IAAI,MAClD,gBACF,oBAAoB,QAAQ,eAAe,KAAK,EAAE,MAChD,eACJ;AACA,yBAAe,MAAM;AACnB,mBAAO,KAAK,SAAS;AAAA,cACnB,WAAW,UAAU;AAAA,gBACnB,8BAAgB,MAAM,aAAa,MAAM,aAAa,EAAE;AAAA,cAC1D;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,KAAK,cAAc,OAAO,KAAK,UAAU;AAC3C,aAAK,YAAY,OAAO,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAc,oBAAM,OAAuB;AAAA,EAC/C,SAAS;AACX,CAAC;AAED,IAAM,kBAAkB,oBAAM,OAAyC;AAAA,EACrE,SAAS,mCAAqB;AAChC,CAAC;;;AE/ED,IAAAC,gBAAoC;AACpC,IAAAC,gBAAoD;AAiBpD,IAAMC,aAAY,0BAAY,kBAAkB,GAAG,QAAM;AAEvD,MAAI,GAAG,cAAc,GAAG,aAAa,GAAG,GAAG,WAAW,SAAS,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,GAAG,WAAW,MAAM,iBAAiB;AACvD,QAAM,YAAQ,uBAAQ,UAAU,IAAI,cAAY,SAAS,GAAG,UAAU,CAAC,CAAC;AAExE,MAAI,EAAE,aAAa,IAAI;AAEvB,eAAa,OAAO,QAAQ,CAACC,QAAO,UAAU;AAC5C,eAAW,QAAQ,OAAO;AACxB,cAAI,0BAAWA,QAAO,KAAK,MAAM,GAAG;AAClC,cAAM,aAAaA,OAAM,OAAOA,OAAM;AACtC,cAAM,OAAO,KAAK,IAAIA,OAAM,MAAM,KAAK,OAAO,IAAI;AAClD,cAAM,KAAK,KAAK,IAAIA,OAAM,IAAI,KAAK,OAAO,EAAE;AAC5C,cAAM,WAAW,aACb,8BAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACAA,OAAM;AAAA,UACNA,OAAM,aAAa;AAAA,QACrB,IACA,8BAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACAA,OAAM;AAAA,UACNA,OAAM,aAAa;AAAA,QACrB;AAEJ,uBAAe,aAAa,aAAa,UAAU,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW;AAAA,IACb;AAAA,EACF;AACF,CAAC;AAED,IAAM,oBAAoB,oBAAM,OAAkC;AAAA,EAChE,SAASD;AACX,CAAC;;;AChED,IAAAE,gBAAoC;AACpC,IAAAC,gBAA8C;AAe9C,IAAMC,aAAY,0BAAY,kBAAkB,GAAG,QAAM;AACvD,QAAM,YAAY,GAAG,WAAW,MAAM,gBAAgB;AAEtD,QAAM,YAAQ,uBAAQ,UAAU,IAAI,cAAY,SAAS,GAAG,UAAU,CAAC,CAAC;AAExE,QAAM,EAAE,OAAO,IAAI,GAAG,WAAW;AACjC,MAAI,UAAU,wBAAU,MAAM,MAAM;AAEpC,KAAG,QAAQ,YAAY,CAAC,OAAO,KAAK,OAAO,QAAQ;AACjD,UAAM,aAAa,UAAU;AAE7B,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,cACE;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AAAA,QACA,KAAK;AAAA,MACP,GACA;AACA,cAAM,SAAS,wBAAU,GAAG,CAAC,EAAE,GAAG,KAAK,QAAQ,QAAQ,GAAG,CAAC,GAAG,MAAM;AAEpE,kBAAU,QAAQ,QAAQ,OAAO,IAAI,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,cAAc,QAAQ,IAAI,GAAG,OAAO;AAE1C,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,mBAAmB,oBAAM,OAAiC;AAAA,EAC9D,SAASA;AACX,CAAC;;;AChED,IAAAC,eAA2B;AAC3B,IAAAC,gBAAuD;AAkBvD,IAAM,UACJ,OAAO,cAAc,YAAY,YAAY,KAAK,UAAU,SAAS;AAEvE,IAAM,cAAc,CAAC,MAA+B,QAAQ,CAAC;AAC7D,IAAM,aAAa,CAAC,UAAwB;AAC1C,QAAM,kBAA+B,SAAS,CAAC,GAC5C,IAAI,CAAC,EAAE,MAAM,kBAAkB,QAAQ,MAAM;AAC5C,QAAI,SAAS,aAAa;AACxB,aAAO,wBAAW,aAAa,GAAG,CAAC,MAAM,MAAM,IAAI,WAAW;AAC5D,aACG,UAAU,KAAK,YAAY,KAAK,uBACjC,KAAK,MAAM,UACX;AACA,iBAAO;AAAA,QACT;AACA,cAAM,MAAM,KAAK,MAAM,UAAU;AACjC,YACE,WAAW,oBACX,SAAS,IAAI,QACb,OAAO,IAAI,IACX;AACA,iBAAO;AAAA,QACT;AACA,eAAO,QAAQ;AAAA,UACb;AAAA,UACA,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC,EACA,OAAO,OAAK,YAAY,CAAC,CAAC;AAG7B,SAAO,mBAAK,KAAK,cAAc;AACjC;;;ACxDA,oBAA2B;AAC3B,mCAAyC;AACzC,IAAAC,mBAA0C;AAQ1C,SAAS,aAAa,EAAE,MAAM,eAAe,cAAc,GAAe;AACxE,SAAO,4BAAW,OAAO;AAAA,IACvB;AAAA,IACA,QAAQ,6BAAAC,OAAe,UAAU;AAAA,MAC/B,UAAM,0BAAW,UAAQ;AACvB,YAAI,iBAAiB,KAAK,KAAK,OAAO;AACpC,iBAAO;AAAA,YACL,QAAQ,cAAc;AAAA,YACtB,SAAS,OAAK,EAAE,KAAK,SAAS;AAAA,UAChC;AAAA,QACF;AAEA,YAAI,iBAAiB,KAAK,SAAS,wBAAwB;AACzD,iBAAO;AAAA,YACL,QAAQ,cAAc;AAAA,UACxB;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AC/BA,IAAAC,qBAAsB;AACtB,IAAAC,eAOO;AACP,IAAAC,gBAAgC;;;ACVhC,IAAM,SAAS;AAER,IAAM,eAAe,CAAC,SAAiB,KAAK,MAAM,MAAM,EAAG,CAAC,EAAE;AAE9D,IAAM,YAAY,CAACC,WAA+B;AACvD,MAAI,QAAQ;AACZ,QAAM,SAASA,UAAS,OAAO,IAAIA,OAAM;AACzC,QAAM,SAAkC,CAAC;AAEzC,SAAO,EAAE,QAAQ,QAAQ;AACvB,UAAM,OAAOA,OAAM,KAAK;AACxB,WAAO,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;;;ADAA,IAAM,kBAAkB,wBAAW,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACzE,IAAM,4BAAwB,0BAAM,EAAE,EAAE;AAAA,EAAI,OAC1C,wBAAW,KAAK,EAAE,OAAO,wBAAwB,CAAC,GAAG,CAAC;AACxD;AAEA,IAAM,oBAAN,MAAM,2BAA0B,wBAAW;AAAA,EACzC,YAAqB,SAAmB;AACtC,UAAM;AADa;AAAA,EAErB;AAAA,EAEA,OAAO,OAAO,SAAmB;AAC/B,WAAO,wBAAW,OAAO;AAAA,MACvB,QAAQ,IAAI,mBAAkB,OAAO;AAAA,MACrC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AACN,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,SAAS,KAAK,YAAY,SAAS,cAAc,MAAM,CAAC;AAC9D,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,WAAK,OAAO,IAAI,OAAO,SAAS,CAAC,CAAC;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBACP,MACA,IACA,QACA,SACA,SACA;AACA,UAAQ,IAAI,MAAM,MAAM,sBAAsB,SAAS,OAAO,CAAC;AAC/D,WAAS,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,QAAQ,EAAE,GAAG,KAAK,SAAS;AAChE,YAAQ,IAAI,GAAG,IAAI,GAAG,eAAe;AAAA,EACvC;AACF;AAEA,SAAS,sBACP,MACA,IACA,SACA,SACA;AACA,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,GAAG;AAChB;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf,YAAQ,IAAI,IAAI,IAAI,kBAAkB,OAAO,CAAC,OAAO,CAAC,CAAC;AAAA,EACzD,OAAO;AACL,YAAQ,IAAI,IAAI,IAAI,kBAAkB,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,0BAA0B,MAAkB;AACnD,QAAM,UAAU,IAAI,8BAA4B;AAChD,QAAM,UAAU,OAAO,KAAK,MAAM,OAAO;AACzC,QAAM,EAAE,IAAI,IAAI,KAAK;AACrB,QAAM,iBAAiD,CAAC;AACxD,MAAI,gBAAgB;AACpB,aAAW,EAAE,MAAM,aAAa,IAAI,UAAU,KAAK,KAAK,eAAe;AACrE,QAAI,KAAK,cAAc;AACvB,QAAI,KAAK,MAAM,QAAQ;AAEvB,YAAQ,MAAM,KAAK,MAAM,WAAW;AAClC,OAAC,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG;AAC5C,YAAM,eAAe,aAAa,IAAI;AACtC,YAAM,cAAc,iBAAiB;AAErC,YAAM,aAAa,iBAAiB;AACpC,YAAM,YAAY,KAAK,YAAY,MAAM;AACzC,UAAI,aAAa;AACf,uBAAe,KAAK,EAAE,MAAM,GAAG,CAAC;AAChC;AAAA,MACF,WAAW,YAAY;AACrB,uBAAe,SAAS;AACxB;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,KAAK,eAAe,OAAO,IAAI;AAEnD,UAAI,CAAC,WAAW;AACd,wBAAgB;AAAA,MAClB;AAEA,iBAAW,EAAE,MAAM,WAAW,IAAI,QAAQ,KAAK,gBAAgB;AAC7D;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,8BAAsB,WAAW,SAAS,SAAS,OAAO;AAAA,MAC5D;AACA,qBAAe,SAAS;AAExB,0BAAoB,MAAM,IAAI,QAAQ,SAAS,OAAO;AAAA,IACxD;AAAA,EACF;AACA,SAAO,QAAQ,OAAO;AACxB;AAEA,IAAM,mBAAmB,wBAAW;AAAA,EAClC,MAAM;AAAA,IACJ;AAAA,IACA,YAAY,MAAkB;AAC5B,WAAK,cAAc,0BAA0B,IAAI;AAAA,IACnD;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,0BAA0B,OAAO,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAK,EAAE;AAAA,EACtB;AACF;AAEA,IAAM,mBAAmB,wBAAW,UAAU;AAAA,EAC5C,YAAY;AAAA,IACV,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,EACZ;AAAA,EACA,+BAA+B;AAAA,IAC7B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,GAAG;AAAA,IACD,sBAAsB,IAAI,CAAC,aAAa,MAAM;AAAA,MAC5C,yBAAyB,CAAC;AAAA,MAC1B,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK;AAAA,IACzD,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,eAAe,MAAM,CAAC,kBAAkB,gBAAgB;;;AEpKrE,IAAAC,eAAmD;;;ACE5C,IAAM,aAAN,MAAwC;AAAA,EAC7C,YACU,YACC,eACA,cACT;AAHQ;AACC;AACA;AAAA,EACR;AAAA,EAEH,OAAO;AACL,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,SAAK,OAAO,GAAG;AACf,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,GAAgB,MAAkB;AACvC,WACE,KAAK,eAAe,KAAK,cACzB,KAAK,kBAAkB,KAAK,iBAC5B,KAAK,iBAAiB,KAAK;AAAA,EAE/B;AAAA,EAEQ,OAAO,KAAkB;AAC/B,QAAI,MAAM,UAAU;AACpB,QAAI,MAAM,QAAQ;AAElB,QAAI,KAAK,aAAa,GAAG;AACvB,UAAI,MAAM,SAAS,QAAQ,OAAO,KAAK,iBAAiB,WAAW,GAAG,KAAK,YAAY,OAAO,MAAM,MAAM,KAAK,aAAa;AAAA,IAC9H,OAAO;AACL,UAAI,MAAM,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,GAAG,GAAe;AAChB,WACE,KAAK,eAAe,EAAE,cACtB,KAAK,kBAAkB,EAAE,iBACzB,KAAK,iBAAiB,EAAE;AAAA,EAE5B;AACF;;;ADtCO,IAAM,uBAAuB,CAAC,iBAA0B;AAAA,MAC7D,oBAAM;AAAA,IACJ,OAAO;AAAA,IACP,uBAAuB;AAAA,IACvB,OAAO;AAAA,IACP,OAAO,QAA6B;AAClC,aAAO,OAAO,MAAM,IAAI,UAAU,OAAO,WAAW,IAAI;AAAA,IAC1D;AAAA,IACA,QAAQ,MAAM;AACZ,YAAM,QAAQ,IAAI;AAAA,QAChB,KAAK,MAAM,IAAI;AAAA,QACf,KAAK;AAAA,QACL;AAAA,MACF;AACA,aAAO,CAAC,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AAAA,EACD,wBAAW,MAAM;AAAA,IACf,4BAA4B;AAAA,MAC1B,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;;;AE1BA,IAAAC,gBAA2D;AAC3D,IAAAC,gBAAyD;AAEzD,IAAM,QAAgC;AAAA,EACpC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,sBAAsB,CAAC,OAAoB,cAAsB;AACrE,MAAI;AACF,UAAM,MAAM,MAAM,IAAI,SAAS;AAC/B,QAAI,QAAkB,CAAC;AACvB,QAAI,YAAY;AAChB,QAAI,aAAa;AAGjB,aAAS,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK;AACvC,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,MAAM,IAAI,GAAG;AACf,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAClC,gBAAM,KAAK,IAAI;AAAA,QACjB,OAAO;AACL,cAAI,MAAM,WAAW,GAAG;AACtB,wBAAY;AACZ;AAAA,UACF;AACA,gBAAM,cAAc,MAAM,IAAI;AAC9B,cAAI,MAAM,IAAI,MAAM,aAAa;AAC/B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,CAAC;AAGT,aAAS,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK;AAC3C,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,MAAM,IAAI,GAAG;AACf,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAClC,gBAAM,KAAK,IAAI;AAAA,QACjB,OAAO;AACL,cAAI,MAAM,WAAW,GAAG;AACtB,yBAAa;AACb;AAAA,UACF;AACA,gBAAM,cAAc,MAAM,IAAI;AAC9B,cAAI,MAAM,IAAI,MAAM,aAAa;AAC/B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,MAAM,eAAe,IAAI;AACzC,aAAO,CAAC,WAAW,UAAU;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,YAAQ,MAAM,8BAA8B,CAAC;AAC7C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,cAAc,CAAC,UAAkB;AACrC,QAAM,cAAmC,CAAC;AAC1C,QAAM,OAAO,yBAAW,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAC5D,cAAY,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;AAC7C,SAAO;AACT;AAEA,IAAM,uBAAuB,yBAAW,OAAsB;AAAA,EAC5D,SAAS;AACP,WAAO,yBAAW;AAAA,EACpB;AAAA,EACA,OAAO,MAAM,IAAI;AACf,QAAI,CAAC,GAAG,cAAc,CAAC,GAAG,WAAW;AACnC,aAAO;AAAA,IACT;AAEA,QAAI,cAAmC,CAAC;AAExC,eAAWC,UAAS,GAAG,MAAM,UAAU,QAAQ;AAC7C,UAAI,CAACA,OAAM,OAAO;AAChB;AAAA,MACF;AACA,YAAM,QAAQ,oBAAoB,GAAG,OAAOA,OAAM,IAAI;AAEtD,UAAI,OAAO;AACT,sBAAc,YAAY;AAAA,UACxB,YAAY,MAAM,CAAC,CAAC;AAAA,UACpB,YAAY,MAAM,CAAC,CAAC;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,yBAAW,IAAI,aAAa,IAAI;AAAA,EACzC;AAAA,EACA,SAAS,OAAK,yBAAW,YAAY,KAAK,CAAC;AAC7C,CAAC;AAEM,IAAM,mBAAmB,CAAC,oBAAoB;;;AC3GrD,IAAAC,gBAMO;AACP,IAAAC,mBAA2B;AAE3B,IAAM,iBAAiB,CAAC,WAAW,WAAW,SAAS;AAEvD,IAAM,6BAA6B,yBAAW;AAAA,EAC5C,MAAM;AAAA,IACJ;AAAA,IAEA,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,sBAAsB,IAAI;AAAA,IACpD;AAAA,IAEA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,gBAAgB,OAAO,iBAAiB;AACtE,aAAK,cAAc,KAAK,sBAAsB,OAAO,IAAI;AAAA,MAC3D;AAAA,IACF;AAAA,IAEA,sBAAsB,MAAkB;AACtC,YAAM,EAAE,IAAI,IAAI,KAAK;AACrB,YAAM,cAAqB,CAAC;AAC5B,YAAM,QAA0C,CAAC;AACjD,YAAM,gBAAgB,CAAC,WAAW,QAAQ;AAE1C,YAAM,WAAO,6BAAW,KAAK,KAAK;AAElC,eAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,OAAO,GAAG;AAC5C,cAAM,OAAO,IAAI,YAAY,KAAK,MAAM,CAAC;AACzC,cAAM,OAAO,KAAK,aAAa,GAAG;AAElC,YAAI,cAAc,SAAS,KAAK,KAAK,IAAI,GAAG;AAC1C;AAAA,QACF;AAEA,YAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,gBAAM,KAAK,EAAE,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,QACtC,WAAW,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AACvD,gBAAM,OAAO,MAAM,IAAI;AACvB,cAAI,QAAQ,KAAK,SAAS,KAAK,mBAAmB,IAAI,GAAG;AACvD,kBAAM,QAAQ,MAAM,SAAS;AAC7B,wBAAY;AAAA,cACV,yBAAW,KAAK,EAAE,OAAO,wBAAwB,KAAK,GAAG,CAAC,EAAE;AAAA,gBAC1D,KAAK;AAAA,gBACL,KAAK,OAAO;AAAA,cACd;AAAA,cACA,yBAAW,KAAK,EAAE,OAAO,wBAAwB,KAAK,GAAG,CAAC,EAAE;AAAA,gBAC1D;AAAA,gBACA,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS;AAEvE,aAAO,yBAAW,IAAI,WAAW;AAAA,IACnC;AAAA,IAEA,mBAAmB,gBAAwB;AACzC,cAAQ,gBAAgB;AAAA,QACtB,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAK,EAAE;AAAA,EACtB;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA,yBAAW,UAAU;AAAA,IACnB,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IAC7D,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IAC7D,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,EAC/D,CAAC;AACH;;;AC9FA,IAAAC,gBAMO;AACP,IAAAC,iBAAsB;AAEtB,IAAK,gBAAL,kBAAKC,mBAAL;AACE,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,YAAS;AAFN,SAAAA;AAAA,GAAA;AASL,IAAM,oBAAoB,qBAAM,OAA2C;AAE3E,SAASC,eAAc,QAAoB;AACzC,SACE,OAAO,WAAW,MAAM,iBAAiB,MACzC,OAAO,MAAM,MAAM,iBAAiB;AAExC;AASA,IAAM,iBAAN,MAA4C;AAAA,EAC1C,YACkB,KACA,MAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,GAAG,QAAwB;AACzB,WAAO;AAAA,OACH,CAAC,KAAK,QAAQ,CAAC,OAAO,QACrB,KAAK,QACJ,OAAO,QACP,KAAK,KAAK,SAAS,OAAO,KAAK,QAC/B,KAAK,KAAK,QAAQ,OAAO,KAAK,OAC9B,KAAK,KAAK,UAAU,OAAO,KAAK,SAChC,KAAK,KAAK,WAAW,OAAO,KAAK,WACnC,KAAK,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO;AACL,SAAK,OAAO,KAAK,GAAG;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,KAAkB;AAC/B,QAAI,MAAM,gBAAgB;AAE1B,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AACA,QAAI,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI;AAClC,QAAI,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG;AAChC,QAAI,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAK;AACpC,QAAI,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM;AAAA,EACxC;AACF;AAEA,SAAS,QAAQ,MAAkB;AACjC,QAAM,OAAO,KAAK,UAAU,sBAAsB;AAClD,QAAM,OACJ,KAAK,kBAAkB,wBAAU,MAC7B,KAAK,OACL,KAAK,QAAQ,KAAK,UAAU,cAAc,KAAK;AACrD,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,UAAU,aAAa,KAAK;AAAA,IAC9C,KAAK,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,EAClD;AACF;AAEA,IAAM,2BAAuB,qBAAM;AAAA,EACjC,OAAO;AAAA,EAEP,QAAQ,MAAkB;AACxB,UAAM,WAAW,KAAK,MAAM,MAAM,iBAAiB;AAEnD,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,QAAQ,IAAI;AAEzB,UAAM,OAAc,CAAC;AAErB,UAAM,UAA4B,CAAC;AACnC,eAAW,EAAE,KAAK,IAAI,KAAK,UAAU;AACnC,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,UAAI,WAAW;AAEf,UAAI,OAAO,QAAQ,YAAY;AAC7B,mBAAW,IAAI,IAAI;AAAA,MACrB,WAAW,OAAO,QAAQ,UAAU;AAClC,mBAAW;AAAA,MACb,WAAW,QAAQ,mBAAoB;AACrC,mBAAW,KAAK,MAAM,UAAU,KAAK;AAAA,MACvC,WAAW,QAAQ,uBAAsB;AACvC,mBAAW,KAAK,MAAM,UAAU,KAAK;AAAA,MACvC;AAEA,YAAM,SAAS,KAAK,YAAY,QAAQ;AAGxC,UAAI,QAAQ;AACV,aAAK,KAAK,MAAM;AAEhB,cAAM,QAAQ;AACd,cAAM,OAAO,OAAO,OAAO,KAAK,OAAO,QAAQ;AAC/C,cAAM,MAAM,OAAO,MAAM,KAAK;AAC9B,cAAM,SAAS,OAAO,SAAS,OAAO;AAEtC,gBAAQ,KAAK,IAAI,eAAe,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,CAAC,CAAC;AAAA,MACpE,OAAO;AACL,gBAAQ,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ;AACb,WACE,OAAO,cACP,OAAO,gBACP,OAAO,mBACPA,eAAc,MAAM;AAAA,EAExB;AAAA,EAEA,OAAO;AACT,CAAC;;;ACtJD,IAAAC,gBAAuC;AACvC,IAAAC,iBAAsD;;;ACKtD,SAASC,QAAO,aAAmC;AACjD,QAAM,SAA+B,CAAC;AACtC,QAAM,UAAUC,6BAA4B,WAAW;AAEvD,UAAQ,QAAQ,CAAC,OAAO,cAAc;AACpC,UAAM,SAASC,gBAAe,KAAK;AACnC,WAAO;AAAA,MACL,GAAG,OAAO,IAAI,QAAM;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,SAAO;AACT;AAEA,SAASD,6BAA4B,aAAmC;AACtE,QAAM,MAAM,oBAAI,IAAkC;AAElD,cAAY,QAAQ,UAAQ;AAC1B,QAAI,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG;AAC5B,UAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,QAAI,IAAI,KAAK,SAAS,EAAG,KAAK,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEA,SAASC,gBAAe,aAAmC;AACzD,QAAM,SAA2C,CAAC;AAClD,QAAM,SAAS,YAAY,IAAI,WAAS;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEvC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,SAAS,QAAQ,KAAK;AAC7B,cAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,KAAK,OAAO;AAEnB,SAAO;AACT;;;AD3DA,IAAM,QAAQ,oBAAI,IAAwB;AAC1C,SAAS,uBAAuB,WAAmB;AACjD,QAAM,WAAW;AAEjB,MAAI,CAAC,MAAM,IAAI,QAAQ,GAAG;AACxB,UAAM,OAAO,yBAAW,KAAK,EAAE,OAAO,UAAU,CAAC;AACjD,UAAM,IAAI,UAAU,IAAI;AAAA,EAC1B;AAEA,SAAO,MAAM,IAAI,QAAQ;AAC3B;AAEA,IAAM,mBAAmB,qBAAM,OAG7B;AAAA,EACA,QAAQ,OAAO;AACb,UAAM,UAAU,IAAI,+BAA4B;AAEhD,UAAM,YAAY,MAAM;AAAA,MACtB,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO;AAAA,MACvC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQC,QAAO,SAAS,GAAG;AACpC,YAAM,aAAa,uBAAuB,KAAK,SAAS;AACxD,cAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,UAAU;AAAA,IAC5C;AAEA,WAAO,QAAQ,OAAO;AAAA,EACxB;AAAA,EACA,QAAQ,MAAM;AACZ,WAAO,yBAAW,YAAY,QAAQ,CAAC,IAAI,GAAG,WAAS,MAAM,MAAM,IAAI,CAAC;AAAA,EAC1E;AACF,CAAC;","names":["import_view","import_state","backgroundDecorations","import_view","import_state","import_language","import_utils","import_view","import_language","cursor","import_view","import_utils","import_view","import_state","mergeIntervals","range","mergeIntervals","import_utils","import_state","extension","range","import_utils","import_state","extension","import_view","import_state","import_language","templateParser","import_es_toolkit","import_view","import_state","pairs","import_view","import_view","import_state","range","import_view","import_language","import_view","import_state","SelectionSide","configChanged","import_view","import_state","squash","groupDecorationsByClassName","mergeIntervals","squash"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ast-decorator/whole.ts","../src/background-decorations/index.ts","../src/background-decorations/squash.ts","../src/background-decorations/cut.ts","../src/ast-decorator/cursor.ts","../src/ast-decorator/index.ts","../src/ast-debugger/index.ts","../src/focusable/focusable.ts","../src/auto-select-ranges/extension.ts","../src/auto-select-ranges/utils.ts","../src/selection-enlarger/extension.ts","../src/deletion-enlarger/extension.ts","../src/input-rules/index.ts","../src/mix-languages/mix.ts","../src/indent-guides/index.ts","../src/indent-guides/utils.ts","../src/scroll-beyond-last-line/index.ts","../src/scroll-beyond-last-line/empty-block.ts","../src/brackets/matching-brackets.ts","../src/brackets/colorization.ts","../src/position/index.ts","../src/mergeable-markers/index.ts","../src/mergeable-markers/squash.ts","../src/frozen-ranges/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n} from './ast-decorator';\n\nexport { astDebugger } from './ast-debugger';\n\nexport { focusableKeymap, FocusableWidget } from './focusable';\n\nexport {\n rangesFacet as autoSelectRanges,\n selectUserEvent as autoSelectUserEvent,\n} from './auto-select-ranges';\n\nexport {\n selectionEnlarger,\n type SelectionEnlargerSpec,\n} from './selection-enlarger';\n\nexport {\n deletionEnlarger,\n type DeletionEnlargerSpec,\n} from './deletion-enlarger';\n\nexport { inputRules, type InputRule } from './input-rules';\n\nexport { mixLanguages } from './mix-languages';\n\nexport { indentGuides } from './indent-guides';\n\nexport { scrollBeyondLastLine } from './scroll-beyond-last-line';\n\nexport { colorizationBrackets, matchingBrackets } from './brackets';\n\nexport {\n elementAtPosition,\n positionElementLayer,\n SelectionSide,\n} from './position';\n\nexport { backgroundDecorations } from './background-decorations';\n\nexport { mergeableMarkers } from './mergeable-markers';\n\nexport { frozenRanges } from './frozen-ranges';\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { omit } from 'es-toolkit';\nimport type { Tree, TreeCursor } from '@lezer/common';\nimport { traverseAST } from '@coze-editor/utils';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n type WidgetType,\n} from '@codemirror/view';\nimport {\n type EditorState,\n type Range,\n Facet,\n RangeSet,\n StateEffect,\n StateField,\n Prec,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n backgroundDecorations,\n backgroundDecoratorLayer,\n type BackgroundDecoration,\n} from '../background-decorations';\n\ntype Precedence = 'highest' | 'high' | 'default' | 'low' | 'lowest';\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n atomicRange?: boolean;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n prec?: Precedence;\n}\n\ninterface ReplaceDecorationSpec extends BaseDecorationSpec {\n type: 'replace';\n widget?: WidgetType;\n inclusive?: boolean;\n inclusiveStart?: boolean;\n inclusiveEnd?: boolean;\n block?: boolean;\n}\n\ninterface WidgetDecorationSpec extends BaseDecorationSpec {\n type: 'widget';\n widget: WidgetType;\n side?: number;\n inlineOrder?: boolean;\n block?: boolean;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\ntype DecorationSpec =\n | ClassNameDecorationSpec\n | ReplaceDecorationSpec\n | WidgetDecorationSpec\n | BackgroundDecorationSpec;\n\ntype WholeASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => DecorationSpec[] | DecorationSpec | undefined;\n\nconst updateWholeDecorationsEffect = StateEffect.define();\n\nfunction updateWholeDecorations(view: EditorView) {\n view.dispatch({\n effects: updateWholeDecorationsEffect.of(null),\n });\n}\n\nconst classNameDecorationCache: Map<string, Decoration> = new Map();\nfunction getClassDecoration(className: string): Decoration {\n if (!classNameDecorationCache.has(className)) {\n classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return classNameDecorationCache.get(className)!;\n}\n\ntype CategoriedDecorationSet = Record<Precedence, DecorationSet>;\n\nfunction buildDecorations(state: EditorState, tree: Tree) {\n const decorates = state.facet(wholeASTDecoratorFacet) ?? [];\n\n const treeCursor = tree.cursor();\n const decorations: CategoriedDecorationSet = {\n highest: Decoration.none,\n high: Decoration.none,\n default: Decoration.none,\n low: Decoration.none,\n lowest: Decoration.none,\n };\n let atomicRanges = RangeSet.empty;\n let backgroundDecorations: BackgroundDecoration[] = [];\n\n const from = 0;\n const to = state.doc.length;\n traverseAST(treeCursor, from, to, cursor => {\n decorates.forEach(decorate => {\n const decorationSpec = decorate(cursor, state);\n\n let specs: DecorationSpec[] = [];\n if (Array.isArray(decorationSpec)) {\n specs = decorationSpec;\n } else if (decorationSpec) {\n specs = [decorationSpec];\n }\n\n specs.forEach(spec => {\n const result = updateDecorationSpec(cursor, spec, {\n decorations,\n backgroundDecorations,\n atomicRanges,\n });\n\n if (!result) {\n return;\n }\n\n backgroundDecorations = result.backgroundDecorations;\n atomicRanges = result.atomicRanges;\n });\n });\n });\n\n return {\n decorations,\n atomicRanges,\n backgroundDecorations,\n };\n}\n\nfunction updateDecorationSpec(\n cursor: TreeCursor,\n decorationSpec: DecorationSpec | undefined,\n {\n decorations,\n backgroundDecorations,\n atomicRanges,\n }: {\n decorations: CategoriedDecorationSet;\n backgroundDecorations: BackgroundDecoration[];\n atomicRanges: RangeSet<any>;\n },\n) {\n if (!decorationSpec) {\n return;\n }\n\n const from = decorationSpec.from ?? cursor.from;\n const to = decorationSpec.to ?? cursor.to;\n\n const omitKeys = ['type', 'from', 'to', 'atomicRange'] as const;\n\n let decorationRange: Range<Decoration> | null = null;\n switch (decorationSpec.type) {\n case 'className':\n // from === to marker will cause delete issue\n // e.g. {{content}} renders as `replace-widget mark replace-widget`\n // delete from end of content to start of content\n // when delete to first letter of content, the delete behavior is strange\n decorationRange =\n from === to\n ? null\n : getClassDecoration(decorationSpec.className).range(from, to);\n break;\n case 'replace':\n decorationRange = Decoration.replace(\n omit(decorationSpec, omitKeys),\n ).range(from, to);\n break;\n case 'widget':\n decorationRange = Decoration.widget(omit(decorationSpec, omitKeys)).range(\n from,\n );\n break;\n case 'background':\n backgroundDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decorationRange) {\n const prec =\n decorationSpec.type === 'className'\n ? (decorationSpec.prec ?? 'default')\n : 'default';\n\n if (decorations[prec]) {\n decorations[prec] = decorations[prec].update({\n add: [decorationRange],\n sort: true,\n });\n }\n }\n\n if (\n decorationSpec.type !== 'background' &&\n decorationRange &&\n decorationSpec.atomicRange === true\n ) {\n atomicRanges = atomicRanges.update({\n add: [decorationRange],\n sort: true,\n });\n }\n\n return {\n decorations,\n backgroundDecorations,\n atomicRanges,\n };\n}\n\nconst decorateField = StateField.define<{\n decorations: CategoriedDecorationSet;\n atomicRanges: RangeSet<any>;\n backgroundDecorations: BackgroundDecoration[];\n}>({\n create(state) {\n return buildDecorations(state, syntaxTree(state));\n },\n update(value, tr) {\n const tree = syntaxTree(tr.state);\n\n const hasUpdateEffect = tr.effects.some(effect =>\n effect.is(updateWholeDecorationsEffect),\n );\n const syntaxTreeChanged = syntaxTree(tr.startState) !== tree;\n if (syntaxTreeChanged || hasUpdateEffect) {\n value = buildDecorations(tr.state, tree);\n }\n return value;\n },\n provide(field) {\n return [\n Prec.highest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.highest,\n ),\n ),\n Prec.high(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.high,\n ),\n ),\n Prec.default(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.default,\n ),\n ),\n Prec.low(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.low,\n ),\n ),\n Prec.lowest(\n EditorView.decorations.compute(\n [field],\n state => state.field(field).decorations.lowest,\n ),\n ),\n\n EditorView.atomicRanges.of(view => view.state.field(field).atomicRanges),\n backgroundDecorations.of(\n view => view.state.field(field).backgroundDecorations,\n ),\n ];\n },\n});\n\nconst wholeASTDecoratorFacet = Facet.define<\n WholeASTDecorator,\n WholeASTDecorator[]\n>({\n enables: [decorateField, backgroundDecoratorLayer],\n});\n\nexport { wholeASTDecoratorFacet, updateWholeDecorations };\n\nexport type { WholeASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n type EditorView,\n RectangleMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { EditorSelection, Facet } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\nimport { squash } from './squash';\nimport { cutAtLineBreak } from './cut';\n\ntype BackgroundDecorationFn = (view: EditorView) => BackgroundDecoration[];\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(backgroundDecorations) !==\n update.state.facet(backgroundDecorations)\n );\n}\n\n// 使用时需置于 drawSelection 下方(影响 zIndex)\nconst backgroundDecoratorLayer = layer({\n above: false,\n markers(view) {\n const decorations = view.state\n .facet(backgroundDecorations)\n .reduce<\n BackgroundDecoration[]\n >((memo, current) => [...memo, ...current(view)], []);\n\n return cutAtLineBreak(squash(decorations), view.state)\n .map(deco =>\n RectangleMarker.forRange(\n view,\n deco.className,\n EditorSelection.range(deco.from, deco.to),\n ),\n )\n .reduce((memo, current) => [...memo, ...current], []);\n },\n update(update) {\n return (\n update.focusChanged ||\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n class: 'cm-backgroundDecoratorLayer',\n});\n\nconst backgroundDecorations = Facet.define<\n BackgroundDecorationFn,\n BackgroundDecorationFn[]\n>({\n enables: [backgroundDecoratorLayer],\n});\n\nexport { backgroundDecoratorLayer, backgroundDecorations };\n\nexport type { BackgroundDecoration };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { BackgroundDecoration } from './types';\n\nfunction squash(decorations: BackgroundDecoration[]) {\n const result: BackgroundDecoration[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: BackgroundDecoration[]) {\n const map = new Map<string, BackgroundDecoration[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: BackgroundDecoration[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorState } from '@codemirror/state';\n\nimport type { BackgroundDecoration } from './types';\n\n// 将跨行的 decoration 在换行符的位置再次切割\nfunction cutAtLineBreak(\n decorations: BackgroundDecoration[],\n state: EditorState,\n) {\n const cuts: BackgroundDecoration[] = [];\n\n decorations.forEach(deco => {\n const startLine = state.doc.lineAt(deco.from);\n const endLine = state.doc.lineAt(deco.to);\n if (startLine.number !== endLine.number) {\n const slices: BackgroundDecoration[] = [];\n let pos = deco.from;\n\n for (let i = startLine.number; i < endLine.number; i++) {\n const line = state.doc.line(i);\n\n slices.push({\n from: pos,\n to: line.to,\n className: deco.className,\n });\n\n pos = line.to + 1;\n }\n\n slices.push({\n from: pos,\n to: deco.to,\n className: deco.className,\n });\n\n cuts.push(...slices);\n } else {\n cuts.push(deco);\n }\n });\n\n return cuts;\n}\n\nexport { cutAtLineBreak };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { TreeCursor } from '@lezer/common';\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { type EditorState, Facet, RangeSetBuilder } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport {\n type BackgroundDecoration,\n backgroundDecorations,\n} from '../background-decorations';\n\ntype CursorASTDecorator = (\n cursor: TreeCursor,\n state: EditorState,\n) => ClassNameDecorationSpec | BackgroundDecorationSpec | undefined;\n\ninterface BaseDecorationSpec {\n from?: number;\n to?: number;\n}\n\ninterface ClassNameDecorationSpec extends BaseDecorationSpec {\n type: 'className';\n className: string;\n}\n\ninterface BackgroundDecorationSpec {\n from?: number;\n to?: number;\n type: 'background';\n className: string;\n}\n\nclass CursorASTView implements PluginValue {\n private classNameDecorationCache: Map<string, Decoration> = new Map();\n\n decorations: DecorationSet = Decoration.none;\n backgroundDecorations: BackgroundDecoration[] = [];\n\n constructor(private view: EditorView) {}\n\n getClassDecoration(className: string) {\n if (!this.classNameDecorationCache.has(className)) {\n this.classNameDecorationCache.set(\n className,\n Decoration.mark({\n class: className,\n }),\n );\n }\n\n return this.classNameDecorationCache.get(className);\n }\n\n update(update: ViewUpdate) {\n // focus or selection changed\n if (\n (update.focusChanged && update.view.hasFocus) ||\n !update.startState.selection.eq(update.state.selection)\n ) {\n const tree = syntaxTree(update.state);\n const pos = update.state.selection.main.head;\n const decorators = update.state.facet(cursorASTDecoratorFacet);\n\n const cursor = tree.cursorAt(pos, 0);\n const builder = new RangeSetBuilder<Decoration>();\n const bgDecorations: BackgroundDecoration[] = [];\n\n do {\n decorators.forEach(decorator => {\n const decorationSpec = decorator(cursor, update.state);\n if (!decorationSpec) {\n return;\n }\n\n let decoration;\n switch (decorationSpec.type) {\n case 'className':\n decoration = this.getClassDecoration(decorationSpec.className);\n break;\n case 'background':\n bgDecorations.push({\n from: decorationSpec.from ?? cursor.from,\n to: decorationSpec.to ?? cursor.to,\n className: decorationSpec.className,\n });\n break;\n }\n\n if (decoration) {\n builder.add(\n decorationSpec.from ?? cursor.from,\n decorationSpec.to ?? cursor.to,\n decoration,\n );\n }\n });\n } while (cursor.parent());\n\n this.decorations = builder.finish();\n this.backgroundDecorations = bgDecorations;\n }\n\n if (update.focusChanged && !update.view.hasFocus) {\n this.decorations = Decoration.none;\n this.backgroundDecorations = [];\n }\n }\n}\n\nconst cursorASTDecoratorFacet = Facet.define<\n CursorASTDecorator,\n CursorASTDecorator[]\n>({\n enables: [\n ViewPlugin.fromClass(CursorASTView, {\n decorations: v => v.decorations,\n provide(plugin) {\n return [\n backgroundDecorations.of(\n view => view.plugin(plugin)?.backgroundDecorations ?? [],\n ),\n ];\n },\n }),\n ],\n});\n\nexport { cursorASTDecoratorFacet };\n\nexport type { CursorASTDecorator };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n wholeASTDecoratorFacet,\n updateWholeDecorations,\n type WholeASTDecorator,\n} from './whole';\nimport { cursorASTDecoratorFacet, type CursorASTDecorator } from './cursor';\n\nconst astDecorator = {\n whole: wholeASTDecoratorFacet,\n fromCursor: cursorASTDecoratorFacet,\n};\n\nexport {\n astDecorator,\n updateWholeDecorations,\n type WholeASTDecorator,\n type CursorASTDecorator,\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { traverseAST } from '@coze-editor/utils';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { type EditorState } from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nconst astDebugger = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n printTreeFromState(view.state);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged) {\n printTreeFromState(update.state);\n }\n }\n },\n);\n\nfunction printTreeFromState(state: EditorState) {\n const tree = syntaxTree(state);\n\n console.groupCollapsed('Syntax Tree');\n\n const cursor = tree.cursor();\n traverseAST(cursor, 0, tree.length, cursor => {\n console.group(\n `%c${cursor.name}(${cursor.from}:${cursor.to})`,\n 'color: purple;',\n );\n\n console.log(state.sliceDoc(cursor.from, cursor.to));\n console.groupEnd();\n });\n\n console.groupEnd();\n}\n\nexport { astDebugger };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { type EditorView, WidgetType, keymap } from '@codemirror/view';\n\n// function blockAt(view: EditorView, pos: number): BlockInfo {\n// const line = view.lineBlockAt(pos)\n// if (Array.isArray(line.type)) for (const l of line.type) {\n// if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text)) return l\n// }\n// return line\n// }\n\nconst focusableKeymap = keymap.of([\n {\n key: 'ArrowLeft',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n const pos = mainSelection.from;\n\n // WHY get widget view directly from view.docView\n // widget has eq method, if eq returns true, new widget will not be applied\n // widget.toDOM will not be called in this case, so widget.focus won't take effect\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtEnd === pos\n ) {\n child.widget.focus(1);\n handled = true;\n }\n }\n\n if (handled) {\n break;\n }\n }\n return handled;\n },\n },\n {\n key: 'ArrowRight',\n run(view: EditorView) {\n const mainSelection = view.state.selection.main;\n if (!mainSelection.empty) {\n return false;\n }\n\n let handled = false;\n\n const pos = mainSelection.from;\n\n // @ts-expect-error docView is not public\n for (const line of view.docView.children) {\n for (const child of line.children) {\n if (\n child.isWidget &&\n child.widget instanceof FocusableWidget &&\n child.posAtStart === pos\n ) {\n child.widget.focus(-1);\n handled = true;\n break;\n }\n }\n\n if (handled) {\n break;\n }\n }\n\n return handled;\n },\n },\n]);\n\nabstract class FocusableWidget extends WidgetType {\n abstract focus(fromSide: -1 | 1): void;\n}\n\nexport { focusableKeymap, FocusableWidget };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { FacetCombineStrategy, flatten } from '@coze-editor/utils';\nimport { ViewPlugin, type EditorView, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState, Facet } from '@codemirror/state';\n\nimport { mergeIntervals, findContainingRange } from './utils';\n\ninterface Range {\n from: number;\n to: number;\n}\ntype RangesProvider = (state: EditorState) => Range[];\ntype SelectUserEvent = 'select' | 'select.pointer';\n\nconst extension = ViewPlugin.fromClass(\n class {\n lastFocus = false;\n\n constructor(view: EditorView) {\n this.lastFocus = view.hasFocus;\n }\n\n update(update: ViewUpdate) {\n const userEvent = update.state.facet(selectUserEvent) ?? 'select';\n\n const hasSelectUserEvent = update.transactions.some(tr =>\n tr.isUserEvent(userEvent),\n );\n\n if (hasSelectUserEvent) {\n const lastHasFocus = this.lastFocus;\n\n const startSelection = update.startState.selection;\n const { selection } = update.state;\n\n const rangesProviders = update.state.facet(rangesFacet);\n const ranges = mergeIntervals(\n flatten(\n rangesProviders.map(provider => provider(update.view.state)),\n ).filter(Boolean),\n );\n\n const currentRange = findContainingRange(ranges, selection.main.from);\n\n // 1. 从当前选区外进入当前选区\n // 2. 失焦状态进入当前选区(失焦前原本就在 a range 内,聚焦时再次进入 a range 内,需要再次触发选中)\n if (\n selection.main.empty &&\n currentRange &&\n (!lastHasFocus ||\n // 上一次的选区 from 或 to 在当前选区外(“首次进入”当前选区)\n findContainingRange(ranges, startSelection.main.from) !==\n currentRange ||\n findContainingRange(ranges, startSelection.main.to) !==\n currentRange)\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n selection: selection.replaceRange(\n EditorSelection.range(currentRange.from, currentRange.to),\n ),\n });\n });\n }\n }\n\n if (this.lastFocus !== update.view.hasFocus) {\n this.lastFocus = update.view.hasFocus;\n }\n }\n },\n);\n\nconst rangesFacet = Facet.define<RangesProvider>({\n enables: extension,\n});\n\nconst selectUserEvent = Facet.define<SelectUserEvent, SelectUserEvent>({\n combine: FacetCombineStrategy.Last,\n});\n\nexport { rangesFacet, selectUserEvent };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\ninterface Range {\n from: number;\n to: number;\n}\n\nfunction mergeIntervals(ranges: Range[]) {\n if (ranges.length === 0) {\n return [];\n }\n\n const merged: { from: number; to: number }[] = [];\n const cloned = ranges.map(range => ({\n from: range.from,\n to: range.to,\n }));\n\n cloned.sort((a, b) => a.from - b.from);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.from <= current.to) {\n current.to = Math.max(current.to, next.to);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n if (current) {\n merged.push(current);\n }\n\n return merged;\n}\n\nfunction findContainingRange(ranges: Range[], pos: number): Range | undefined {\n for (const range of ranges) {\n if (pos >= range.from && pos <= range.to) {\n return range;\n }\n }\n}\n\nexport { mergeIntervals, findContainingRange };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface SelectionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype SelectionEnlargerProvider = (\n state: EditorState,\n) => SelectionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n // 内容变化或者选区不变,跳过\n if (tr.docChanged || tr.newSelection.eq(tr.startState.selection)) {\n return tr;\n }\n\n const providers = tr.startState.facet(selectionEnlarger);\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n let { newSelection } = tr;\n\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (hasOverlap(range, spec.source)) {\n const isReversed = range.head < range.anchor;\n const from = Math.min(range.from, spec.target.from);\n const to = Math.max(range.to, spec.target.to);\n const newRange = isReversed\n ? EditorSelection.range(\n to,\n from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n )\n : EditorSelection.range(\n from,\n to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n );\n\n newSelection = newSelection.replaceRange(newRange, index);\n }\n }\n });\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n});\n\nconst selectionEnlarger = Facet.define<SelectionEnlargerProvider>({\n enables: extension,\n});\n\nexport { selectionEnlarger };\n\nexport type { SelectionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { flatten, hasOverlap } from '@coze-editor/utils';\nimport { ChangeSet, EditorState, Facet } from '@codemirror/state';\n\ninterface DeletionEnlargerSpec {\n source: {\n from: number;\n to: number;\n };\n target: {\n from: number;\n to: number;\n };\n}\n\ntype DeletionEnlargerProvider = (state: EditorState) => DeletionEnlargerSpec[];\n\nconst extension = EditorState.transactionFilter.of(tr => {\n const providers = tr.startState.facet(deletionEnlarger);\n\n const specs = flatten(providers.map(provider => provider(tr.startState)));\n\n const { length } = tr.startState.doc;\n let changes = ChangeSet.empty(length);\n\n tr.changes.iterChanges((fromA, toA, fromB, toB) => {\n const isDeletion = fromB === toB;\n\n if (!isDeletion) {\n return;\n }\n\n for (const spec of specs) {\n if (\n hasOverlap(\n {\n from: fromA,\n to: toA,\n },\n spec.source,\n )\n ) {\n const change = ChangeSet.of([{ ...spec.target, insert: '' }], length);\n\n changes = changes.compose(change.map(changes));\n }\n }\n });\n\n const nextChanges = changes.map(tr.changes);\n\n if (nextChanges.empty) {\n return tr;\n }\n\n return [\n tr,\n {\n changes: nextChanges,\n sequential: true,\n },\n ];\n});\n\nconst deletionEnlarger = Facet.define<DeletionEnlargerProvider>({\n enables: extension,\n});\n\nexport { deletionEnlarger };\n\nexport type { DeletionEnlargerSpec };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n// modified from closeBrackets extension (from @codemirror/autocomplete)\nimport { EditorView } from '@codemirror/view';\nimport { type EditorState, Prec, type Extension } from '@codemirror/state';\n\ninterface InputRule {\n type: 'character';\n triggerCharacter: string;\n handler: ({\n view,\n state,\n from,\n to,\n }: {\n view: EditorView;\n state: EditorState;\n from: number;\n to: number;\n }) => boolean;\n}\n\nconst android =\n typeof navigator === 'object' && /Android\\b/.test(navigator.userAgent);\n\nconst isExtension = (v: unknown): v is Extension => Boolean(v);\nconst inputRules = (rules?: InputRule[]) => {\n const ruleExtensions: Extension[] = (rules ?? [])\n .map(({ type, triggerCharacter, handler }) => {\n if (type === 'character') {\n return EditorView.inputHandler.of((view, from, to, insert) => {\n if (\n (android ? view.composing : view.compositionStarted) ||\n view.state.readOnly\n ) {\n return false;\n }\n const sel = view.state.selection.main;\n if (\n insert !== triggerCharacter ||\n from !== sel.from ||\n to !== sel.to\n ) {\n return false;\n }\n return handler({\n view,\n state: view.state,\n from,\n to,\n });\n });\n }\n })\n .filter(v => isExtension(v));\n\n // give it a higher precedence than default closebrackets extension\n return Prec.high(ruleExtensions);\n};\n\nexport { inputRules };\n\nexport type { InputRule };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parseMixed } from '@lezer/common';\nimport { parser as templateParser } from '@coze-editor/lezer-parser-template';\nimport { type Language, LRLanguage } from '@codemirror/language';\n\ninterface MixOptions {\n name?: string;\n outerLanguage?: Language;\n innerLanguage?: Language;\n}\n\nfunction mixLanguages({ name, outerLanguage, innerLanguage }: MixOptions) {\n return LRLanguage.define({\n name,\n parser: templateParser.configure({\n wrap: parseMixed(node => {\n if (outerLanguage && node.type.isTop) {\n return {\n parser: outerLanguage.parser,\n overlay: n => n.type.name === 'Text',\n };\n }\n\n if (innerLanguage && node.name === 'InterpolationContent') {\n return {\n parser: innerLanguage.parser,\n };\n }\n\n return null;\n }),\n }),\n });\n}\n\nexport { mixLanguages };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\n/// Adapted from https://github.com/nota-lang/nota/blob/master/packages/nota-editor/lib/indentation-guides.ts 做了一些调整\nimport { range } from 'es-toolkit';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n WidgetType,\n} from '@codemirror/view';\nimport { RangeSetBuilder } from '@codemirror/state';\n\nimport { getCodeStart, fromPairs } from './utils';\n\nconst indentationMark = Decoration.mark({ class: 'cm-indentation-guide' });\nconst indentationLevelMarks = range(20).map(i =>\n Decoration.line({ class: `cm-indentation-level-${i}` }),\n);\n\nclass IndentationWidget extends WidgetType {\n constructor(readonly indents: number[]) {\n super();\n }\n\n static create(indents: number[]) {\n return Decoration.widget({\n widget: new IndentationWidget(indents),\n side: 1,\n });\n }\n\n toDOM() {\n const wrap = document.createElement('span');\n wrap.className = 'cm-indentation-widget';\n for (const indent of this.indents) {\n const marker = wrap.appendChild(document.createElement('span'));\n marker.className = 'cm-indentation-guide';\n marker.textContent = ' ';\n wrap.append(' '.repeat(indent - 1));\n }\n return wrap;\n }\n}\n\nfunction makeIndentationMark(\n from: number,\n to: number,\n indent: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n builder.add(from, from, indentationLevelMarks[indent / tabSize]);\n for (let i = from; i < Math.min(from + indent, to); i += tabSize) {\n builder.add(i, i + 1, indentationMark);\n }\n}\n\nfunction makeIndentationWidget(\n from: number,\n to: number,\n tabSize: number,\n builder: RangeSetBuilder<Decoration>,\n) {\n const length = to - from;\n if (length !== 0) {\n return;\n }\n\n if (tabSize > 2) {\n builder.add(to, to, IndentationWidget.create([tabSize]));\n } else {\n builder.add(to, to, IndentationWidget.create([2, tabSize * 2]));\n }\n}\n\nfunction makeIndentationDecorators(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const tabSize = Number(view.state.tabSize);\n const { doc } = view.state;\n const spaceOnlyLines: { from: number; to: number }[] = [];\n let currentIndent = 0;\n for (const { from: visibleFrom, to: visibleTo } of view.visibleRanges) {\n let to = visibleFrom - 1;\n let pos, from, length, text;\n\n while ((pos = to + 1) <= visibleTo) {\n ({ from, to, length, text } = doc.lineAt(pos));\n const codeStartsAt = getCodeStart(text);\n const isAllSpaces = codeStartsAt === length;\n // we don't have indentation guides for the zero indentation level\n const skipIndent = codeStartsAt === 0;\n const isComment = text[codeStartsAt] === '/';\n if (isAllSpaces) {\n spaceOnlyLines.push({ from, to });\n continue;\n } else if (skipIndent) {\n spaceOnlyLines.length = 0;\n continue;\n }\n\n const indent = Math.ceil(codeStartsAt / tabSize) * tabSize;\n\n if (!isComment) {\n currentIndent = indent;\n }\n\n for (const { from: spaceFrom, to: spaceTo } of spaceOnlyLines) {\n makeIndentationMark(\n spaceFrom,\n spaceTo,\n currentIndent,\n tabSize,\n builder,\n );\n makeIndentationWidget(spaceFrom, spaceTo, tabSize, builder);\n }\n spaceOnlyLines.length = 0;\n\n makeIndentationMark(from, to, indent, tabSize, builder);\n }\n }\n return builder.finish();\n}\n\nconst showIndentations = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n constructor(view: EditorView) {\n this.decorations = makeIndentationDecorators(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = makeIndentationDecorators(update.view);\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nconst indentationTheme = EditorView.baseTheme({\n '.cm-line': {\n paddingLeft: 0,\n marginLeft: '2px',\n },\n '.cm-indentation-guide': {\n position: 'relative',\n },\n '.cm-indentation-guide:after': {\n position: 'absolute',\n content: \"''\",\n right: '0.9ch',\n height: '1.4em',\n borderLeft: '1px solid rgba(28, 31, 35, .08)',\n },\n ...fromPairs(\n indentationLevelMarks.map((_decoration, i) => [\n `.cm-indentation-level-${i}`,\n { textIndent: `-${i * 2}ch`, paddingLeft: `${i * 2}ch` },\n ]),\n ),\n});\n\nexport const indentGuides = () => [showIndentations, indentationTheme];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nconst SPACES = /^\\s*/;\n\nexport const getCodeStart = (text: string) => text.match(SPACES)![0].length;\n\nexport const fromPairs = (pairs: [string, unknown][]) => {\n let index = -1;\n const length = pairs == null ? 0 : pairs.length;\n const result: Record<string, unknown> = {};\n\n while (++index < length) {\n const pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n};\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView, layer, type ViewUpdate } from '@codemirror/view';\n\nimport { EmptyBlock } from './empty-block';\n\nexport const scrollBeyondLastLine = (scrollHeight?: number) => [\n layer({\n above: false,\n updateOnDocViewUpdate: true,\n class: 'cm-empty-marker-layer',\n update(update: ViewUpdate): boolean {\n return update.state.doc.lines !== update.startState.doc.lines;\n },\n markers(view) {\n const maker = new EmptyBlock(\n view.state.doc.lines,\n view.contentHeight,\n scrollHeight,\n );\n return [maker];\n },\n }),\n EditorView.theme({\n '& .cm-empty-marker-layer': {\n height: '100%',\n },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport type { LayerMarker } from '@codemirror/view';\n\nexport class EmptyBlock implements LayerMarker {\n constructor(\n private lineNumber: number,\n readonly contentHeight: number,\n readonly scrollHeight?: number,\n ) {}\n\n draw() {\n const elt = document.createElement('div');\n elt.className = 'cm-empty-scroll-block-maker';\n this.adjust(elt);\n return elt;\n }\n\n update(_: HTMLElement, prev: EmptyBlock) {\n return (\n prev.lineNumber === this.lineNumber &&\n prev.contentHeight === this.contentHeight &&\n prev.scrollHeight === this.scrollHeight\n );\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.display = 'block';\n elt.style.width = '1px';\n\n if (this.lineNumber > 1) {\n elt.style.height = `calc(${typeof this.scrollHeight === 'number' ? `${this.scrollHeight}px` : '100%'} + ${this.contentHeight}px)`;\n } else {\n elt.style.height = '0';\n }\n }\n\n eq(p: EmptyBlock) {\n return (\n this.lineNumber === p.lineNumber &&\n this.contentHeight === p.contentHeight &&\n this.scrollHeight === p.scrollHeight\n );\n }\n}\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, type DecorationSet, EditorView } from '@codemirror/view';\nimport { type EditorState, StateField, type Range } from '@codemirror/state';\n\nconst pairs: Record<string, string> = {\n '(': ')',\n '{': '}',\n '[': ']',\n ')': '(',\n '}': '{',\n ']': '[',\n};\n\nconst findMatchingBracket = (state: EditorState, cursorPos: number) => {\n try {\n const doc = state.doc.toString();\n let stack: string[] = [];\n let leftIndex = -1;\n let rightIndex = -1;\n\n // 向前查找\n for (let i = cursorPos - 1; i >= 0; i--) {\n const char = doc[i];\n if (pairs[char]) {\n if ([')', '}', ']'].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n leftIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n stack = [];\n\n // 向后查找\n for (let i = cursorPos; i < doc.length; i++) {\n const char = doc[i];\n if (pairs[char]) {\n if (['(', '{', '['].includes(char)) {\n stack.push(char);\n } else {\n if (stack.length === 0) {\n rightIndex = i;\n break;\n }\n const lastBracket = stack.pop();\n if (pairs[char] !== lastBracket) {\n return null;\n }\n }\n }\n }\n\n if (leftIndex !== -1 && rightIndex !== -1) {\n return [leftIndex, rightIndex];\n }\n\n return null;\n } catch (e) {\n console.error('findMatchingBracket failed', e);\n return null;\n }\n};\n\nconst renderMatch = (match: number) => {\n const decorations: Range<Decoration>[] = [];\n const mark = Decoration.mark({ class: 'cm-matchingBracket' });\n decorations.push(mark.range(match, match + 1));\n return decorations;\n};\n\nconst bracketMatchingState = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(deco, tr) {\n if (!tr.docChanged && !tr.selection) {\n return deco;\n }\n\n let decorations: Range<Decoration>[] = [];\n\n for (const range of tr.state.selection.ranges) {\n if (!range.empty) {\n continue;\n }\n const match = findMatchingBracket(tr.state, range.head);\n\n if (match) {\n decorations = decorations.concat(\n renderMatch(match[0]),\n renderMatch(match[1]),\n );\n }\n }\n\n return Decoration.set(decorations, true);\n },\n provide: f => EditorView.decorations.from(f),\n});\n\nexport const matchingBrackets = [bracketMatchingState];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n EditorView,\n Decoration,\n ViewPlugin,\n type ViewUpdate,\n type DecorationSet,\n} from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\n\nconst DEFAULT_COLORS = ['#ffd700', '#da70d6', '#179fff'];\n\nconst ColorizationBracketsPlugin = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = this.getBracketDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.selectionSet || update.viewportChanged) {\n this.decorations = this.getBracketDecorations(update.view);\n }\n }\n\n getBracketDecorations(view: EditorView) {\n const { doc } = view.state;\n const decorations: any[] = [];\n const stack: { type: string; from: number }[] = [];\n const limitNodeType = ['Comment', 'String'];\n\n const tree = syntaxTree(view.state);\n\n for (let pos = 0; pos < doc.length; pos += 1) {\n const char = doc.sliceString(pos, pos + 1);\n const node = tree.resolveInner(pos);\n\n if (limitNodeType.includes(node.type.name)) {\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n stack.push({ type: char, from: pos });\n } else if (char === ')' || char === ']' || char === '}') {\n const open = stack.pop();\n if (open && open.type === this.getMatchingBracket(char)) {\n const index = stack.length % 3;\n decorations.push(\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n open.from,\n open.from + 1,\n ),\n Decoration.mark({ class: `colorization-bracket-${index}` }).range(\n pos,\n pos + 1,\n ),\n );\n }\n }\n }\n\n decorations.sort((a, b) => a.from - b.from || a.startSide - b.startSide);\n\n return Decoration.set(decorations);\n }\n\n getMatchingBracket(closingBracket: string) {\n switch (closingBracket) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n default:\n return null;\n }\n }\n },\n {\n decorations: v => v.decorations,\n },\n);\n\nexport const colorizationBrackets = [\n ColorizationBracketsPlugin,\n EditorView.baseTheme({\n '.colorization-bracket-0': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-0 > span': { color: DEFAULT_COLORS[0] },\n '.colorization-bracket-1': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-1 > span': { color: DEFAULT_COLORS[1] },\n '.colorization-bracket-2': { color: DEFAULT_COLORS[2] },\n '.colorization-bracket-2 > span': { color: DEFAULT_COLORS[2] },\n }),\n];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport {\n Direction,\n type EditorView,\n type LayerMarker,\n type ViewUpdate,\n layer,\n} from '@codemirror/view';\nimport { Facet } from '@codemirror/state';\n\nenum SelectionSide {\n Head = 'head',\n Anchor = 'anchor',\n}\n\ninterface PositionElement {\n dom: HTMLElement | null;\n pos: SelectionSide | number | ((view: EditorView) => number);\n}\nconst elementAtPosition = Facet.define<PositionElement, PositionElement[]>();\n\nfunction configChanged(update: ViewUpdate) {\n return (\n update.startState.facet(elementAtPosition) !==\n update.state.facet(elementAtPosition)\n );\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nclass PositionMarker implements LayerMarker {\n constructor(\n public readonly dom: HTMLElement,\n public readonly rect?: Rect,\n ) {}\n\n eq(marker: PositionMarker) {\n return Boolean(\n ((!this.rect && !marker.rect) ||\n (this.rect &&\n marker.rect &&\n this.rect.left === marker.rect.left &&\n this.rect.top === marker.rect.top &&\n this.rect.width === marker.rect.width &&\n this.rect.height === marker.rect.height)) &&\n this.dom === marker.dom,\n );\n }\n\n draw() {\n this.adjust(this.dom);\n return this.dom;\n }\n\n update() {\n this.adjust(this.dom);\n return true;\n }\n\n private adjust(elt: HTMLElement) {\n elt.style.pointerEvents = 'none';\n\n if (!this.rect) {\n return;\n }\n elt.style.left = `${this.rect.left}px`;\n elt.style.top = `${this.rect.top}px`;\n elt.style.width = `${this.rect.width}px`;\n elt.style.height = `${this.rect.height}px`;\n }\n}\n\nfunction getBase(view: EditorView) {\n const rect = view.scrollDOM.getBoundingClientRect();\n const left =\n view.textDirection === Direction.LTR\n ? rect.left\n : rect.right - view.scrollDOM.clientWidth * view.scaleX;\n return {\n left: left - view.scrollDOM.scrollLeft * view.scaleX,\n top: rect.top - view.scrollDOM.scrollTop * view.scaleY,\n };\n}\n\nconst positionElementLayer = layer({\n above: true,\n\n markers(view: EditorView) {\n const elements = view.state.facet(elementAtPosition);\n\n if (!elements || elements.length === 0) {\n return [];\n }\n\n const base = getBase(view);\n\n const temp: any[] = [];\n\n const markers: PositionMarker[] = [];\n for (const { dom, pos } of elements) {\n if (!dom) {\n continue;\n }\n\n let finalPos = -1;\n\n if (typeof pos === 'function') {\n finalPos = pos(view);\n } else if (typeof pos === 'number') {\n finalPos = pos;\n } else if (pos === SelectionSide.Head) {\n finalPos = view.state.selection.main.head;\n } else if (pos === SelectionSide.Anchor) {\n finalPos = view.state.selection.main.anchor;\n }\n\n const coords = view.coordsAtPos(finalPos);\n\n // 由于 codemirror 实现了局部渲染,可能取不到 coords\n if (coords) {\n temp.push(coords);\n\n const width = 1;\n const left = coords.left - base.left - width / 2;\n const top = coords.top - base.top;\n const height = coords.bottom - coords.top;\n\n markers.push(new PositionMarker(dom, { left, top, width, height }));\n } else {\n markers.push(new PositionMarker(dom));\n }\n }\n\n return markers;\n },\n\n update(update) {\n return (\n update.docChanged ||\n update.selectionSet ||\n update.viewportChanged ||\n configChanged(update)\n );\n },\n\n class: 'cm-positionReferenceLayer',\n});\n\nexport { elementAtPosition, positionElementLayer, SelectionSide };\n\nexport type { PositionElement };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { Decoration, EditorView } from '@codemirror/view';\nimport { Facet, type RangeSet, RangeSetBuilder } from '@codemirror/state';\n\nimport { type MarkDecorationSpec, squash } from './squash';\n\nconst cache = new Map<string, Decoration>();\nfunction getClassNameDecoration(className: string) {\n const cacheKey = className;\n\n if (!cache.has(cacheKey)) {\n const mark = Decoration.mark({ class: className });\n cache.set(cacheKey, mark);\n }\n\n return cache.get(cacheKey)!;\n}\n\nconst mergeableMarkers = Facet.define<\n MarkDecorationSpec[],\n RangeSet<Decoration>\n>({\n combine(specs) {\n const builder = new RangeSetBuilder<Decoration>();\n\n const flattened = specs.reduce(\n (memo, current) => [...memo, ...current],\n [],\n );\n\n for (const spec of squash(flattened)) {\n const decoration = getClassNameDecoration(spec.className);\n builder.add(spec.from, spec.to, decoration);\n }\n\n return builder.finish();\n },\n enables(self) {\n return EditorView.decorations.compute([self], state => state.facet(self));\n },\n});\n\nexport { mergeableMarkers };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport interface MarkDecorationSpec {\n from: number;\n to: number;\n className: string;\n}\n\nfunction squash(decorations: MarkDecorationSpec[]) {\n const result: MarkDecorationSpec[] = [];\n const grouped = groupDecorationsByClassName(decorations);\n\n grouped.forEach((decos, className) => {\n const merged = mergeIntervals(decos);\n result.push(\n ...merged.map(m => ({\n from: m.start,\n to: m.end,\n className,\n })),\n );\n });\n\n result.sort((a, b) => a.from - b.from);\n\n return result;\n}\n\nfunction groupDecorationsByClassName(decorations: MarkDecorationSpec[]) {\n const map = new Map<string, MarkDecorationSpec[]>();\n\n decorations.forEach(deco => {\n if (!map.has(deco.className)) {\n map.set(deco.className, []);\n }\n\n map.get(deco.className)!.push(deco);\n });\n\n return map;\n}\n\nfunction mergeIntervals(decorations: MarkDecorationSpec[]) {\n const merged: { start: number; end: number }[] = [];\n const cloned = decorations.map(deco => ({\n start: deco.from,\n end: deco.to,\n }));\n\n cloned.sort((a, b) => a.start - b.start);\n\n let current = cloned[0];\n for (let i = 1; i < cloned.length; i++) {\n const next = cloned[i];\n\n if (next.start <= current.end) {\n current.end = Math.max(current.end, next.end);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n\n return merged;\n}\n\nexport { squash };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { hasOverlap } from '@coze-editor/utils';\nimport { EditorSelection, EditorState, Facet } from '@codemirror/state';\n\ninterface Range {\n from: number;\n to: number;\n}\n\nconst extension = [\n // 禁止编辑\n EditorState.changeFilter.of(tr => {\n const providers = tr.startState.facet(frozenRanges);\n const specs: Range[] = providers.reduce<Range[]>(\n (memo, provider) => [...memo, ...provider(tr.startState)],\n [],\n );\n if (Array.isArray(specs)) {\n const flattened = specs.reduce<number[]>(\n (memo, current) => [...memo, current.from, current.to],\n [],\n );\n\n return flattened;\n }\n\n return true;\n }),\n // forbid cursor move into frozen ranges\n EditorState.transactionFilter.of(tr => {\n const len = tr.startState.doc.length;\n\n const providers = tr.startState.facet(frozenRanges);\n const specs: Range[] = providers\n .reduce<Range[]>((memo, provider) => [...memo, ...provider(tr.state)], [])\n .filter(\n spec =>\n spec.from >= 0 && spec.from < len && spec.to >= 0 && spec.to < len,\n );\n\n let { newSelection } = tr;\n newSelection.ranges.forEach((range, index) => {\n for (const spec of specs) {\n if (range.empty && range.from > spec.from && range.to < spec.to) {\n newSelection = newSelection.replaceRange(\n EditorSelection.cursor(\n range.assoc > 0 ? spec.from : spec.to,\n range.assoc,\n ),\n index,\n );\n }\n\n if (!range.empty && hasOverlap(range, spec)) {\n const isReversed = range.head < range.anchor;\n\n if (\n // anchor at left\n range.anchor < spec.from\n ) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n range.anchor,\n spec.from,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else if (\n // anchor at right\n range.anchor > spec.to\n ) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n range.anchor,\n spec.to,\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else if (\n // anchor inside\n range.anchor >= spec.from &&\n range.anchor <= spec.to\n ) {\n // if both anchor and head are inside spec, we should remove this selection\n if (isReversed) {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n spec.from,\n Math.min(range.head, spec.from),\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n } else {\n newSelection = newSelection.replaceRange(\n EditorSelection.range(\n spec.to,\n Math.max(range.head, spec.to),\n range.goalColumn,\n range.bidiLevel ?? undefined,\n ),\n index,\n );\n }\n }\n }\n }\n });\n\n if (newSelection.eq(tr.newSelection)) {\n return tr;\n }\n\n return [\n tr,\n {\n selection: newSelection,\n },\n ];\n }),\n];\n\ntype FrozenRangesProvider = (state: EditorState) => Range[];\n\nconst frozenRanges = Facet.define<FrozenRangesProvider>({\n enables: () => extension,\n});\n\nexport { extension, frozenRanges };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,wBAAqB;AAErB,mBAA4B;AAC5B,IAAAA,eAKO;AACP,IAAAC,gBAQO;AACP,sBAA2B;;;AClB3B,kBAKO;AACP,mBAAuC;;;ACJvC,SAAS,OAAO,aAAqC;AACnD,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAU,4BAA4B,WAAW;AAEvD,UAAQ,QAAQ,CAAC,OAAO,cAAc;AACpC,UAAM,SAAS,eAAe,KAAK;AACnC,WAAO;AAAA,MACL,GAAG,OAAO,IAAI,QAAM;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,4BAA4B,aAAqC;AACxE,QAAM,MAAM,oBAAI,IAAoC;AAEpD,cAAY,QAAQ,UAAQ;AAC1B,QAAI,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG;AAC5B,UAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,QAAI,IAAI,KAAK,SAAS,EAAG,KAAK,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEA,SAAS,eAAe,aAAqC;AAC3D,QAAM,SAA2C,CAAC;AAClD,QAAM,SAAS,YAAY,IAAI,WAAS;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEvC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,SAAS,QAAQ,KAAK;AAC7B,cAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,KAAK,OAAO;AAEnB,SAAO;AACT;;;ACrDA,SAAS,eACP,aACA,OACA;AACA,QAAM,OAA+B,CAAC;AAEtC,cAAY,QAAQ,UAAQ;AAC1B,UAAM,YAAY,MAAM,IAAI,OAAO,KAAK,IAAI;AAC5C,UAAM,UAAU,MAAM,IAAI,OAAO,KAAK,EAAE;AACxC,QAAI,UAAU,WAAW,QAAQ,QAAQ;AACvC,YAAM,SAAiC,CAAC;AACxC,UAAI,MAAM,KAAK;AAEf,eAAS,IAAI,UAAU,QAAQ,IAAI,QAAQ,QAAQ,KAAK;AACtD,cAAM,OAAO,MAAM,IAAI,KAAK,CAAC;AAE7B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,WAAW,KAAK;AAAA,QAClB,CAAC;AAED,cAAM,KAAK,KAAK;AAAA,MAClB;AAEA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,KAAK;AAAA,QACT,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,WAAK,KAAK,GAAG,MAAM;AAAA,IACrB,OAAO;AACL,WAAK,KAAK,IAAI;AAAA,IAChB;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AF7BA,SAAS,cAAc,QAAoB;AACzC,SACE,OAAO,WAAW,MAAM,qBAAqB,MAC7C,OAAO,MAAM,MAAM,qBAAqB;AAE5C;AAGA,IAAM,+BAA2B,mBAAM;AAAA,EACrC,OAAO;AAAA,EACP,QAAQ,MAAM;AACZ,UAAM,cAAc,KAAK,MACtB,MAAM,qBAAqB,EAC3B,OAEC,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtD,WAAO,eAAe,OAAO,WAAW,GAAG,KAAK,KAAK,EAClD;AAAA,MAAI,UACH,4BAAgB;AAAA,QACd;AAAA,QACA,KAAK;AAAA,QACL,6BAAgB,MAAM,KAAK,MAAM,KAAK,EAAE;AAAA,MAC1C;AAAA,IACF,EACC,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;AAAA,EACxD;AAAA,EACA,OAAO,QAAQ;AACb,WACE,OAAO,gBACP,OAAO,cACP,OAAO,gBACP,OAAO,mBACP,cAAc,MAAM;AAAA,EAExB;AAAA,EACA,OAAO;AACT,CAAC;AAED,IAAM,wBAAwB,mBAAM,OAGlC;AAAA,EACA,SAAS,CAAC,wBAAwB;AACpC,CAAC;;;ADiBD,IAAM,+BAA+B,0BAAY,OAAO;AAExD,SAAS,uBAAuB,MAAkB;AAChD,OAAK,SAAS;AAAA,IACZ,SAAS,6BAA6B,GAAG,IAAI;AAAA,EAC/C,CAAC;AACH;AAEA,IAAM,2BAAoD,oBAAI,IAAI;AAClE,SAAS,mBAAmB,WAA+B;AACzD,MAAI,CAAC,yBAAyB,IAAI,SAAS,GAAG;AAC5C,6BAAyB;AAAA,MACvB;AAAA,MACA,wBAAW,KAAK;AAAA,QACd,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,yBAAyB,IAAI,SAAS;AAC/C;AAIA,SAAS,iBAAiB,OAAoB,MAAY;AACxD,QAAM,YAAY,MAAM,MAAM,sBAAsB,KAAK,CAAC;AAE1D,QAAM,aAAa,KAAK,OAAO;AAC/B,QAAM,cAAuC;AAAA,IAC3C,SAAS,wBAAW;AAAA,IACpB,MAAM,wBAAW;AAAA,IACjB,SAAS,wBAAW;AAAA,IACpB,KAAK,wBAAW;AAAA,IAChB,QAAQ,wBAAW;AAAA,EACrB;AACA,MAAI,eAAe,uBAAS;AAC5B,MAAIC,yBAAgD,CAAC;AAErD,QAAM,OAAO;AACb,QAAM,KAAK,MAAM,IAAI;AACrB,gCAAY,YAAY,MAAM,IAAI,YAAU;AAC1C,cAAU,QAAQ,cAAY;AAC5B,YAAM,iBAAiB,SAAS,QAAQ,KAAK;AAE7C,UAAI,QAA0B,CAAC;AAC/B,UAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,gBAAQ;AAAA,MACV,WAAW,gBAAgB;AACzB,gBAAQ,CAAC,cAAc;AAAA,MACzB;AAEA,YAAM,QAAQ,UAAQ;AACpB,cAAM,SAAS,qBAAqB,QAAQ,MAAM;AAAA,UAChD;AAAA,UACA,uBAAAA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,QAAAA,yBAAwB,OAAO;AAC/B,uBAAe,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,uBAAAA;AAAA,EACF;AACF;AAEA,SAAS,qBACP,QACA,gBACA;AAAA,EACE;AAAA,EACA,uBAAAA;AAAA,EACA;AACF,GAKA;AACA,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,QAAM,OAAO,eAAe,QAAQ,OAAO;AAC3C,QAAM,KAAK,eAAe,MAAM,OAAO;AAEvC,QAAM,WAAW,CAAC,QAAQ,QAAQ,MAAM,aAAa;AAErD,MAAI,kBAA4C;AAChD,UAAQ,eAAe,MAAM;AAAA,IAC3B,KAAK;AAKH,wBACE,SAAS,KACL,OACA,mBAAmB,eAAe,SAAS,EAAE,MAAM,MAAM,EAAE;AACjE;AAAA,IACF,KAAK;AACH,wBAAkB,wBAAW;AAAA,YAC3B,wBAAK,gBAAgB,QAAQ;AAAA,MAC/B,EAAE,MAAM,MAAM,EAAE;AAChB;AAAA,IACF,KAAK;AACH,wBAAkB,wBAAW,WAAO,wBAAK,gBAAgB,QAAQ,CAAC,EAAE;AAAA,QAClE;AAAA,MACF;AACA;AAAA,IACF,KAAK;AACH,MAAAA,uBAAsB,KAAK;AAAA,QACzB,MAAM,eAAe,QAAQ,OAAO;AAAA,QACpC,IAAI,eAAe,MAAM,OAAO;AAAA,QAChC,WAAW,eAAe;AAAA,MAC5B,CAAC;AACD;AAAA,EACJ;AAEA,MAAI,iBAAiB;AACnB,UAAM,OACJ,eAAe,SAAS,cACnB,eAAe,QAAQ,YACxB;AAEN,QAAI,YAAY,IAAI,GAAG;AACrB,kBAAY,IAAI,IAAI,YAAY,IAAI,EAAE,OAAO;AAAA,QAC3C,KAAK,CAAC,eAAe;AAAA,QACrB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MACE,eAAe,SAAS,gBACxB,mBACA,eAAe,gBAAgB,MAC/B;AACA,mBAAe,aAAa,OAAO;AAAA,MACjC,KAAK,CAAC,eAAe;AAAA,MACrB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,uBAAAA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,gBAAgB,yBAAW,OAI9B;AAAA,EACD,OAAO,OAAO;AACZ,WAAO,iBAAiB,WAAO,4BAAW,KAAK,CAAC;AAAA,EAClD;AAAA,EACA,OAAO,OAAO,IAAI;AAChB,UAAM,WAAO,4BAAW,GAAG,KAAK;AAEhC,UAAM,kBAAkB,GAAG,QAAQ;AAAA,MAAK,YACtC,OAAO,GAAG,4BAA4B;AAAA,IACxC;AACA,UAAM,wBAAoB,4BAAW,GAAG,UAAU,MAAM;AACxD,QAAI,qBAAqB,iBAAiB;AACxC,cAAQ,iBAAiB,GAAG,OAAO,IAAI;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,OAAO;AACb,WAAO;AAAA,MACL,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,mBAAK;AAAA,QACH,wBAAW,YAAY;AAAA,UACrB,CAAC,KAAK;AAAA,UACN,WAAS,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,QAC1C;AAAA,MACF;AAAA,MAEA,wBAAW,aAAa,GAAG,UAAQ,KAAK,MAAM,MAAM,KAAK,EAAE,YAAY;AAAA,MACvE,sBAAsB;AAAA,QACpB,UAAQ,KAAK,MAAM,MAAM,KAAK,EAAE;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAM,yBAAyB,oBAAM,OAGnC;AAAA,EACA,SAAS,CAAC,eAAe,wBAAwB;AACnD,CAAC;;;AI5SD,IAAAC,eAOO;AACP,IAAAC,gBAAyD;AACzD,IAAAC,mBAA2B;AA6B3B,IAAM,gBAAN,MAA2C;AAAA,EAMzC,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAL/B,2BAAoD,oBAAI,IAAI;AAAA,EAEpE,cAA6B,wBAAW;AAAA,EACxC,wBAAgD,CAAC;AAAA,EAIjD,mBAAmB,WAAmB;AACpC,QAAI,CAAC,KAAK,yBAAyB,IAAI,SAAS,GAAG;AACjD,WAAK,yBAAyB;AAAA,QAC5B;AAAA,QACA,wBAAW,KAAK;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK,yBAAyB,IAAI,SAAS;AAAA,EACpD;AAAA,EAEA,OAAO,QAAoB;AAEzB,QACG,OAAO,gBAAgB,OAAO,KAAK,YACpC,CAAC,OAAO,WAAW,UAAU,GAAG,OAAO,MAAM,SAAS,GACtD;AACA,YAAM,WAAO,6BAAW,OAAO,KAAK;AACpC,YAAM,MAAM,OAAO,MAAM,UAAU,KAAK;AACxC,YAAM,aAAa,OAAO,MAAM,MAAM,uBAAuB;AAE7D,YAAM,SAAS,KAAK,SAAS,KAAK,CAAC;AACnC,YAAM,UAAU,IAAI,8BAA4B;AAChD,YAAM,gBAAwC,CAAC;AAE/C,SAAG;AACD,mBAAW,QAAQ,eAAa;AAC9B,gBAAM,iBAAiB,UAAU,QAAQ,OAAO,KAAK;AACrD,cAAI,CAAC,gBAAgB;AACnB;AAAA,UACF;AAEA,cAAI;AACJ,kBAAQ,eAAe,MAAM;AAAA,YAC3B,KAAK;AACH,2BAAa,KAAK,mBAAmB,eAAe,SAAS;AAC7D;AAAA,YACF,KAAK;AACH,4BAAc,KAAK;AAAA,gBACjB,MAAM,eAAe,QAAQ,OAAO;AAAA,gBACpC,IAAI,eAAe,MAAM,OAAO;AAAA,gBAChC,WAAW,eAAe;AAAA,cAC5B,CAAC;AACD;AAAA,UACJ;AAEA,cAAI,YAAY;AACd,oBAAQ;AAAA,cACN,eAAe,QAAQ,OAAO;AAAA,cAC9B,eAAe,MAAM,OAAO;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAO,OAAO;AAEvB,WAAK,cAAc,QAAQ,OAAO;AAClC,WAAK,wBAAwB;AAAA,IAC/B;AAEA,QAAI,OAAO,gBAAgB,CAAC,OAAO,KAAK,UAAU;AAChD,WAAK,cAAc,wBAAW;AAC9B,WAAK,wBAAwB,CAAC;AAAA,IAChC;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,oBAAM,OAGpC;AAAA,EACA,SAAS;AAAA,IACP,wBAAW,UAAU,eAAe;AAAA,MAClC,aAAa,OAAK,EAAE;AAAA,MACpB,QAAQ,QAAQ;AACd,eAAO;AAAA,UACL,sBAAsB;AAAA,YACpB,UAAK;AAjIjB;AAiIoB,iCAAK,OAAO,MAAM,MAAlB,mBAAqB,0BAAyB,CAAC;AAAA;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;;;AC7HD,IAAM,eAAe;AAAA,EACnB,OAAO;AAAA,EACP,YAAY;AACd;;;ACVA,IAAAC,gBAA4B;AAC5B,IAAAC,eAA6D;AAE7D,IAAAC,mBAA2B;AAE3B,IAAM,cAAc,wBAAW;AAAA,EAC7B,MAAM;AAAA,IACJ,YAAY,MAAkB;AAC5B,yBAAmB,KAAK,KAAK;AAAA,IAC/B;AAAA,IAEA,OAAO,QAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,2BAAmB,OAAO,KAAK;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAoB;AAC9C,QAAM,WAAO,6BAAW,KAAK;AAE7B,UAAQ,eAAe,aAAa;AAEpC,QAAM,SAAS,KAAK,OAAO;AAC3B,iCAAY,QAAQ,GAAG,KAAK,QAAQ,CAAAC,YAAU;AAC5C,YAAQ;AAAA,MACN,KAAKA,QAAO,IAAI,IAAIA,QAAO,IAAI,IAAIA,QAAO,EAAE;AAAA,MAC5C;AAAA,IACF;AAEA,YAAQ,IAAI,MAAM,SAASA,QAAO,MAAMA,QAAO,EAAE,CAAC;AAClD,YAAQ,SAAS;AAAA,EACnB,CAAC;AAED,UAAQ,SAAS;AACnB;;;ACpCA,IAAAC,eAAoD;AAUpD,IAAM,kBAAkB,oBAAO,GAAG;AAAA,EAChC;AAAA,IACE,KAAK;AAAA,IACL,IAAI,MAAkB;AACpB,YAAM,gBAAgB,KAAK,MAAM,UAAU;AAC3C,UAAI,CAAC,cAAc,OAAO;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU;AACd,YAAM,MAAM,cAAc;AAO1B,iBAAW,QAAQ,KAAK,QAAQ,UAAU;AACxC,mBAAW,SAAS,KAAK,UAAU;AACjC,cACE,MAAM,YACN,MAAM,kBAAkB,mBACxB,MAAM,aAAa,KACnB;AACA,kBAAM,OAAO,MAAM,CAAC;AACpB,sBAAU;AAAA,UACZ;AAAA,QACF;AAEA,YAAI,SAAS;AACX;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,KAAK;AAAA,IACL,IAAI,MAAkB;AACpB,YAAM,gBAAgB,KAAK,MAAM,UAAU;AAC3C,UAAI,CAAC,cAAc,OAAO;AACxB,eAAO;AAAA,MACT;AAEA,UAAI,UAAU;AAEd,YAAM,MAAM,cAAc;AAG1B,iBAAW,QAAQ,KAAK,QAAQ,UAAU;AACxC,mBAAW,SAAS,KAAK,UAAU;AACjC,cACE,MAAM,YACN,MAAM,kBAAkB,mBACxB,MAAM,eAAe,KACrB;AACA,kBAAM,OAAO,MAAM,EAAE;AACrB,sBAAU;AACV;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS;AACX;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAED,IAAe,kBAAf,cAAuC,wBAAW;AAElD;;;ACpFA,IAAAC,gBAA8C;AAC9C,IAAAC,eAA6D;AAC7D,IAAAC,gBAAyD;;;ACGzD,SAASC,gBAAe,QAAiB;AACvC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,SAAS,OAAO,IAAI,CAAAC,YAAU;AAAA,IAClC,MAAMA,OAAM;AAAA,IACZ,IAAIA,OAAM;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,QAAQ,QAAQ,IAAI;AAC3B,cAAQ,KAAK,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE;AAAA,IAC3C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,SAAS;AACX,WAAO,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAAiB,KAAgC;AAC5E,aAAWA,UAAS,QAAQ;AAC1B,QAAI,OAAOA,OAAM,QAAQ,OAAOA,OAAM,IAAI;AACxC,aAAOA;AAAA,IACT;AAAA,EACF;AACF;;;AD9BA,IAAM,YAAY,wBAAW;AAAA,EAC3B,MAAM;AAAA,IACJ,YAAY;AAAA,IAEZ,YAAY,MAAkB;AAC5B,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,IAEA,OAAO,QAAoB;AACzB,YAAM,YAAY,OAAO,MAAM,MAAM,eAAe,KAAK;AAEzD,YAAM,qBAAqB,OAAO,aAAa;AAAA,QAAK,QAClD,GAAG,YAAY,SAAS;AAAA,MAC1B;AAEA,UAAI,oBAAoB;AACtB,cAAM,eAAe,KAAK;AAE1B,cAAM,iBAAiB,OAAO,WAAW;AACzC,cAAM,EAAE,UAAU,IAAI,OAAO;AAE7B,cAAM,kBAAkB,OAAO,MAAM,MAAM,WAAW;AACtD,cAAM,SAASC;AAAA,cACb;AAAA,YACE,gBAAgB,IAAI,cAAY,SAAS,OAAO,KAAK,KAAK,CAAC;AAAA,UAC7D,EAAE,OAAO,OAAO;AAAA,QAClB;AAEA,cAAM,eAAe,oBAAoB,QAAQ,UAAU,KAAK,IAAI;AAIpE,YACE,UAAU,KAAK,SACf,iBACC,CAAC;AAAA,QAEA,oBAAoB,QAAQ,eAAe,KAAK,IAAI,MAClD,gBACF,oBAAoB,QAAQ,eAAe,KAAK,EAAE,MAChD,eACJ;AACA,yBAAe,MAAM;AACnB,mBAAO,KAAK,SAAS;AAAA,cACnB,WAAW,UAAU;AAAA,gBACnB,8BAAgB,MAAM,aAAa,MAAM,aAAa,EAAE;AAAA,cAC1D;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,KAAK,cAAc,OAAO,KAAK,UAAU;AAC3C,aAAK,YAAY,OAAO,KAAK;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,cAAc,oBAAM,OAAuB;AAAA,EAC/C,SAAS;AACX,CAAC;AAED,IAAM,kBAAkB,oBAAM,OAAyC;AAAA,EACrE,SAAS,mCAAqB;AAChC,CAAC;;;AE9ED,IAAAC,gBAAoC;AACpC,IAAAC,gBAAoD;AAiBpD,IAAMC,aAAY,0BAAY,kBAAkB,GAAG,QAAM;AAEvD,MAAI,GAAG,cAAc,GAAG,aAAa,GAAG,GAAG,WAAW,SAAS,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,GAAG,WAAW,MAAM,iBAAiB;AACvD,QAAM,YAAQ,uBAAQ,UAAU,IAAI,cAAY,SAAS,GAAG,UAAU,CAAC,CAAC;AAExE,MAAI,EAAE,aAAa,IAAI;AAEvB,eAAa,OAAO,QAAQ,CAACC,QAAO,UAAU;AAC5C,eAAW,QAAQ,OAAO;AACxB,cAAI,0BAAWA,QAAO,KAAK,MAAM,GAAG;AAClC,cAAM,aAAaA,OAAM,OAAOA,OAAM;AACtC,cAAM,OAAO,KAAK,IAAIA,OAAM,MAAM,KAAK,OAAO,IAAI;AAClD,cAAM,KAAK,KAAK,IAAIA,OAAM,IAAI,KAAK,OAAO,EAAE;AAC5C,cAAM,WAAW,aACb,8BAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACAA,OAAM;AAAA,UACNA,OAAM,aAAa;AAAA,QACrB,IACA,8BAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACAA,OAAM;AAAA,UACNA,OAAM,aAAa;AAAA,QACrB;AAEJ,uBAAe,aAAa,aAAa,UAAU,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW;AAAA,IACb;AAAA,EACF;AACF,CAAC;AAED,IAAM,oBAAoB,oBAAM,OAAkC;AAAA,EAChE,SAASD;AACX,CAAC;;;AChED,IAAAE,gBAAoC;AACpC,IAAAC,gBAA8C;AAe9C,IAAMC,aAAY,0BAAY,kBAAkB,GAAG,QAAM;AACvD,QAAM,YAAY,GAAG,WAAW,MAAM,gBAAgB;AAEtD,QAAM,YAAQ,uBAAQ,UAAU,IAAI,cAAY,SAAS,GAAG,UAAU,CAAC,CAAC;AAExE,QAAM,EAAE,OAAO,IAAI,GAAG,WAAW;AACjC,MAAI,UAAU,wBAAU,MAAM,MAAM;AAEpC,KAAG,QAAQ,YAAY,CAAC,OAAO,KAAK,OAAO,QAAQ;AACjD,UAAM,aAAa,UAAU;AAE7B,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,cACE;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AAAA,QACA,KAAK;AAAA,MACP,GACA;AACA,cAAM,SAAS,wBAAU,GAAG,CAAC,EAAE,GAAG,KAAK,QAAQ,QAAQ,GAAG,CAAC,GAAG,MAAM;AAEpE,kBAAU,QAAQ,QAAQ,OAAO,IAAI,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,cAAc,QAAQ,IAAI,GAAG,OAAO;AAE1C,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AACF,CAAC;AAED,IAAM,mBAAmB,oBAAM,OAAiC;AAAA,EAC9D,SAASA;AACX,CAAC;;;AChED,IAAAC,eAA2B;AAC3B,IAAAC,gBAAuD;AAkBvD,IAAM,UACJ,OAAO,cAAc,YAAY,YAAY,KAAK,UAAU,SAAS;AAEvE,IAAM,cAAc,CAAC,MAA+B,QAAQ,CAAC;AAC7D,IAAM,aAAa,CAAC,UAAwB;AAC1C,QAAM,kBAA+B,SAAS,CAAC,GAC5C,IAAI,CAAC,EAAE,MAAM,kBAAkB,QAAQ,MAAM;AAC5C,QAAI,SAAS,aAAa;AACxB,aAAO,wBAAW,aAAa,GAAG,CAAC,MAAM,MAAM,IAAI,WAAW;AAC5D,aACG,UAAU,KAAK,YAAY,KAAK,uBACjC,KAAK,MAAM,UACX;AACA,iBAAO;AAAA,QACT;AACA,cAAM,MAAM,KAAK,MAAM,UAAU;AACjC,YACE,WAAW,oBACX,SAAS,IAAI,QACb,OAAO,IAAI,IACX;AACA,iBAAO;AAAA,QACT;AACA,eAAO,QAAQ;AAAA,UACb;AAAA,UACA,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC,EACA,OAAO,OAAK,YAAY,CAAC,CAAC;AAG7B,SAAO,mBAAK,KAAK,cAAc;AACjC;;;ACxDA,oBAA2B;AAC3B,mCAAyC;AACzC,IAAAC,mBAA0C;AAQ1C,SAAS,aAAa,EAAE,MAAM,eAAe,cAAc,GAAe;AACxE,SAAO,4BAAW,OAAO;AAAA,IACvB;AAAA,IACA,QAAQ,6BAAAC,OAAe,UAAU;AAAA,MAC/B,UAAM,0BAAW,UAAQ;AACvB,YAAI,iBAAiB,KAAK,KAAK,OAAO;AACpC,iBAAO;AAAA,YACL,QAAQ,cAAc;AAAA,YACtB,SAAS,OAAK,EAAE,KAAK,SAAS;AAAA,UAChC;AAAA,QACF;AAEA,YAAI,iBAAiB,KAAK,SAAS,wBAAwB;AACzD,iBAAO;AAAA,YACL,QAAQ,cAAc;AAAA,UACxB;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AC/BA,IAAAC,qBAAsB;AACtB,IAAAC,eAOO;AACP,IAAAC,gBAAgC;;;ACVhC,IAAM,SAAS;AAER,IAAM,eAAe,CAAC,SAAiB,KAAK,MAAM,MAAM,EAAG,CAAC,EAAE;AAE9D,IAAM,YAAY,CAACC,WAA+B;AACvD,MAAI,QAAQ;AACZ,QAAM,SAASA,UAAS,OAAO,IAAIA,OAAM;AACzC,QAAM,SAAkC,CAAC;AAEzC,SAAO,EAAE,QAAQ,QAAQ;AACvB,UAAM,OAAOA,OAAM,KAAK;AACxB,WAAO,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;;;ADAA,IAAM,kBAAkB,wBAAW,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACzE,IAAM,4BAAwB,0BAAM,EAAE,EAAE;AAAA,EAAI,OAC1C,wBAAW,KAAK,EAAE,OAAO,wBAAwB,CAAC,GAAG,CAAC;AACxD;AAEA,IAAM,oBAAN,MAAM,2BAA0B,wBAAW;AAAA,EACzC,YAAqB,SAAmB;AACtC,UAAM;AADa;AAAA,EAErB;AAAA,EAEA,OAAO,OAAO,SAAmB;AAC/B,WAAO,wBAAW,OAAO;AAAA,MACvB,QAAQ,IAAI,mBAAkB,OAAO;AAAA,MACrC,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AACN,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,eAAW,UAAU,KAAK,SAAS;AACjC,YAAM,SAAS,KAAK,YAAY,SAAS,cAAc,MAAM,CAAC;AAC9D,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,WAAK,OAAO,IAAI,OAAO,SAAS,CAAC,CAAC;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBACP,MACA,IACA,QACA,SACA,SACA;AACA,UAAQ,IAAI,MAAM,MAAM,sBAAsB,SAAS,OAAO,CAAC;AAC/D,WAAS,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,QAAQ,EAAE,GAAG,KAAK,SAAS;AAChE,YAAQ,IAAI,GAAG,IAAI,GAAG,eAAe;AAAA,EACvC;AACF;AAEA,SAAS,sBACP,MACA,IACA,SACA,SACA;AACA,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,GAAG;AAChB;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf,YAAQ,IAAI,IAAI,IAAI,kBAAkB,OAAO,CAAC,OAAO,CAAC,CAAC;AAAA,EACzD,OAAO;AACL,YAAQ,IAAI,IAAI,IAAI,kBAAkB,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,0BAA0B,MAAkB;AACnD,QAAM,UAAU,IAAI,8BAA4B;AAChD,QAAM,UAAU,OAAO,KAAK,MAAM,OAAO;AACzC,QAAM,EAAE,IAAI,IAAI,KAAK;AACrB,QAAM,iBAAiD,CAAC;AACxD,MAAI,gBAAgB;AACpB,aAAW,EAAE,MAAM,aAAa,IAAI,UAAU,KAAK,KAAK,eAAe;AACrE,QAAI,KAAK,cAAc;AACvB,QAAI,KAAK,MAAM,QAAQ;AAEvB,YAAQ,MAAM,KAAK,MAAM,WAAW;AAClC,OAAC,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG;AAC5C,YAAM,eAAe,aAAa,IAAI;AACtC,YAAM,cAAc,iBAAiB;AAErC,YAAM,aAAa,iBAAiB;AACpC,YAAM,YAAY,KAAK,YAAY,MAAM;AACzC,UAAI,aAAa;AACf,uBAAe,KAAK,EAAE,MAAM,GAAG,CAAC;AAChC;AAAA,MACF,WAAW,YAAY;AACrB,uBAAe,SAAS;AACxB;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,KAAK,eAAe,OAAO,IAAI;AAEnD,UAAI,CAAC,WAAW;AACd,wBAAgB;AAAA,MAClB;AAEA,iBAAW,EAAE,MAAM,WAAW,IAAI,QAAQ,KAAK,gBAAgB;AAC7D;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,8BAAsB,WAAW,SAAS,SAAS,OAAO;AAAA,MAC5D;AACA,qBAAe,SAAS;AAExB,0BAAoB,MAAM,IAAI,QAAQ,SAAS,OAAO;AAAA,IACxD;AAAA,EACF;AACA,SAAO,QAAQ,OAAO;AACxB;AAEA,IAAM,mBAAmB,wBAAW;AAAA,EAClC,MAAM;AAAA,IACJ;AAAA,IACA,YAAY,MAAkB;AAC5B,WAAK,cAAc,0BAA0B,IAAI;AAAA,IACnD;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,0BAA0B,OAAO,IAAI;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAK,EAAE;AAAA,EACtB;AACF;AAEA,IAAM,mBAAmB,wBAAW,UAAU;AAAA,EAC5C,YAAY;AAAA,IACV,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,EACZ;AAAA,EACA,+BAA+B;AAAA,IAC7B,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,GAAG;AAAA,IACD,sBAAsB,IAAI,CAAC,aAAa,MAAM;AAAA,MAC5C,yBAAyB,CAAC;AAAA,MAC1B,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK;AAAA,IACzD,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,eAAe,MAAM,CAAC,kBAAkB,gBAAgB;;;AEpKrE,IAAAC,eAAmD;;;ACE5C,IAAM,aAAN,MAAwC;AAAA,EAC7C,YACU,YACC,eACA,cACT;AAHQ;AACC;AACA;AAAA,EACR;AAAA,EAEH,OAAO;AACL,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAChB,SAAK,OAAO,GAAG;AACf,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,GAAgB,MAAkB;AACvC,WACE,KAAK,eAAe,KAAK,cACzB,KAAK,kBAAkB,KAAK,iBAC5B,KAAK,iBAAiB,KAAK;AAAA,EAE/B;AAAA,EAEQ,OAAO,KAAkB;AAC/B,QAAI,MAAM,UAAU;AACpB,QAAI,MAAM,QAAQ;AAElB,QAAI,KAAK,aAAa,GAAG;AACvB,UAAI,MAAM,SAAS,QAAQ,OAAO,KAAK,iBAAiB,WAAW,GAAG,KAAK,YAAY,OAAO,MAAM,MAAM,KAAK,aAAa;AAAA,IAC9H,OAAO;AACL,UAAI,MAAM,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,GAAG,GAAe;AAChB,WACE,KAAK,eAAe,EAAE,cACtB,KAAK,kBAAkB,EAAE,iBACzB,KAAK,iBAAiB,EAAE;AAAA,EAE5B;AACF;;;ADtCO,IAAM,uBAAuB,CAAC,iBAA0B;AAAA,MAC7D,oBAAM;AAAA,IACJ,OAAO;AAAA,IACP,uBAAuB;AAAA,IACvB,OAAO;AAAA,IACP,OAAO,QAA6B;AAClC,aAAO,OAAO,MAAM,IAAI,UAAU,OAAO,WAAW,IAAI;AAAA,IAC1D;AAAA,IACA,QAAQ,MAAM;AACZ,YAAM,QAAQ,IAAI;AAAA,QAChB,KAAK,MAAM,IAAI;AAAA,QACf,KAAK;AAAA,QACL;AAAA,MACF;AACA,aAAO,CAAC,KAAK;AAAA,IACf;AAAA,EACF,CAAC;AAAA,EACD,wBAAW,MAAM;AAAA,IACf,4BAA4B;AAAA,MAC1B,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;;;AE1BA,IAAAC,gBAA2D;AAC3D,IAAAC,gBAAyD;AAEzD,IAAM,QAAgC;AAAA,EACpC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,sBAAsB,CAAC,OAAoB,cAAsB;AACrE,MAAI;AACF,UAAM,MAAM,MAAM,IAAI,SAAS;AAC/B,QAAI,QAAkB,CAAC;AACvB,QAAI,YAAY;AAChB,QAAI,aAAa;AAGjB,aAAS,IAAI,YAAY,GAAG,KAAK,GAAG,KAAK;AACvC,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,MAAM,IAAI,GAAG;AACf,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAClC,gBAAM,KAAK,IAAI;AAAA,QACjB,OAAO;AACL,cAAI,MAAM,WAAW,GAAG;AACtB,wBAAY;AACZ;AAAA,UACF;AACA,gBAAM,cAAc,MAAM,IAAI;AAC9B,cAAI,MAAM,IAAI,MAAM,aAAa;AAC/B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,CAAC;AAGT,aAAS,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK;AAC3C,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,MAAM,IAAI,GAAG;AACf,YAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,GAAG;AAClC,gBAAM,KAAK,IAAI;AAAA,QACjB,OAAO;AACL,cAAI,MAAM,WAAW,GAAG;AACtB,yBAAa;AACb;AAAA,UACF;AACA,gBAAM,cAAc,MAAM,IAAI;AAC9B,cAAI,MAAM,IAAI,MAAM,aAAa;AAC/B,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,MAAM,eAAe,IAAI;AACzC,aAAO,CAAC,WAAW,UAAU;AAAA,IAC/B;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,YAAQ,MAAM,8BAA8B,CAAC;AAC7C,WAAO;AAAA,EACT;AACF;AAEA,IAAM,cAAc,CAAC,UAAkB;AACrC,QAAM,cAAmC,CAAC;AAC1C,QAAM,OAAO,yBAAW,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAC5D,cAAY,KAAK,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;AAC7C,SAAO;AACT;AAEA,IAAM,uBAAuB,yBAAW,OAAsB;AAAA,EAC5D,SAAS;AACP,WAAO,yBAAW;AAAA,EACpB;AAAA,EACA,OAAO,MAAM,IAAI;AACf,QAAI,CAAC,GAAG,cAAc,CAAC,GAAG,WAAW;AACnC,aAAO;AAAA,IACT;AAEA,QAAI,cAAmC,CAAC;AAExC,eAAWC,UAAS,GAAG,MAAM,UAAU,QAAQ;AAC7C,UAAI,CAACA,OAAM,OAAO;AAChB;AAAA,MACF;AACA,YAAM,QAAQ,oBAAoB,GAAG,OAAOA,OAAM,IAAI;AAEtD,UAAI,OAAO;AACT,sBAAc,YAAY;AAAA,UACxB,YAAY,MAAM,CAAC,CAAC;AAAA,UACpB,YAAY,MAAM,CAAC,CAAC;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,yBAAW,IAAI,aAAa,IAAI;AAAA,EACzC;AAAA,EACA,SAAS,OAAK,yBAAW,YAAY,KAAK,CAAC;AAC7C,CAAC;AAEM,IAAM,mBAAmB,CAAC,oBAAoB;;;AC3GrD,IAAAC,gBAMO;AACP,IAAAC,mBAA2B;AAE3B,IAAM,iBAAiB,CAAC,WAAW,WAAW,SAAS;AAEvD,IAAM,6BAA6B,yBAAW;AAAA,EAC5C,MAAM;AAAA,IACJ;AAAA,IAEA,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,sBAAsB,IAAI;AAAA,IACpD;AAAA,IAEA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,gBAAgB,OAAO,iBAAiB;AACtE,aAAK,cAAc,KAAK,sBAAsB,OAAO,IAAI;AAAA,MAC3D;AAAA,IACF;AAAA,IAEA,sBAAsB,MAAkB;AACtC,YAAM,EAAE,IAAI,IAAI,KAAK;AACrB,YAAM,cAAqB,CAAC;AAC5B,YAAM,QAA0C,CAAC;AACjD,YAAM,gBAAgB,CAAC,WAAW,QAAQ;AAE1C,YAAM,WAAO,6BAAW,KAAK,KAAK;AAElC,eAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,OAAO,GAAG;AAC5C,cAAM,OAAO,IAAI,YAAY,KAAK,MAAM,CAAC;AACzC,cAAM,OAAO,KAAK,aAAa,GAAG;AAElC,YAAI,cAAc,SAAS,KAAK,KAAK,IAAI,GAAG;AAC1C;AAAA,QACF;AAEA,YAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,gBAAM,KAAK,EAAE,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,QACtC,WAAW,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AACvD,gBAAM,OAAO,MAAM,IAAI;AACvB,cAAI,QAAQ,KAAK,SAAS,KAAK,mBAAmB,IAAI,GAAG;AACvD,kBAAM,QAAQ,MAAM,SAAS;AAC7B,wBAAY;AAAA,cACV,yBAAW,KAAK,EAAE,OAAO,wBAAwB,KAAK,GAAG,CAAC,EAAE;AAAA,gBAC1D,KAAK;AAAA,gBACL,KAAK,OAAO;AAAA,cACd;AAAA,cACA,yBAAW,KAAK,EAAE,OAAO,wBAAwB,KAAK,GAAG,CAAC,EAAE;AAAA,gBAC1D;AAAA,gBACA,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS;AAEvE,aAAO,yBAAW,IAAI,WAAW;AAAA,IACnC;AAAA,IAEA,mBAAmB,gBAAwB;AACzC,cAAQ,gBAAgB;AAAA,QACtB,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,aAAa,OAAK,EAAE;AAAA,EACtB;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EACA,yBAAW,UAAU;AAAA,IACnB,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IAC7D,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IAC7D,2BAA2B,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,IACtD,kCAAkC,EAAE,OAAO,eAAe,CAAC,EAAE;AAAA,EAC/D,CAAC;AACH;;;AC9FA,IAAAC,gBAMO;AACP,IAAAC,iBAAsB;AAEtB,IAAK,gBAAL,kBAAKC,mBAAL;AACE,EAAAA,eAAA,UAAO;AACP,EAAAA,eAAA,YAAS;AAFN,SAAAA;AAAA,GAAA;AASL,IAAM,oBAAoB,qBAAM,OAA2C;AAE3E,SAASC,eAAc,QAAoB;AACzC,SACE,OAAO,WAAW,MAAM,iBAAiB,MACzC,OAAO,MAAM,MAAM,iBAAiB;AAExC;AASA,IAAM,iBAAN,MAA4C;AAAA,EAC1C,YACkB,KACA,MAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAEH,GAAG,QAAwB;AACzB,WAAO;AAAA,OACH,CAAC,KAAK,QAAQ,CAAC,OAAO,QACrB,KAAK,QACJ,OAAO,QACP,KAAK,KAAK,SAAS,OAAO,KAAK,QAC/B,KAAK,KAAK,QAAQ,OAAO,KAAK,OAC9B,KAAK,KAAK,UAAU,OAAO,KAAK,SAChC,KAAK,KAAK,WAAW,OAAO,KAAK,WACnC,KAAK,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO;AACL,SAAK,OAAO,KAAK,GAAG;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,KAAkB;AAC/B,QAAI,MAAM,gBAAgB;AAE1B,QAAI,CAAC,KAAK,MAAM;AACd;AAAA,IACF;AACA,QAAI,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI;AAClC,QAAI,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG;AAChC,QAAI,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAK;AACpC,QAAI,MAAM,SAAS,GAAG,KAAK,KAAK,MAAM;AAAA,EACxC;AACF;AAEA,SAAS,QAAQ,MAAkB;AACjC,QAAM,OAAO,KAAK,UAAU,sBAAsB;AAClD,QAAM,OACJ,KAAK,kBAAkB,wBAAU,MAC7B,KAAK,OACL,KAAK,QAAQ,KAAK,UAAU,cAAc,KAAK;AACrD,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,UAAU,aAAa,KAAK;AAAA,IAC9C,KAAK,KAAK,MAAM,KAAK,UAAU,YAAY,KAAK;AAAA,EAClD;AACF;AAEA,IAAM,2BAAuB,qBAAM;AAAA,EACjC,OAAO;AAAA,EAEP,QAAQ,MAAkB;AACxB,UAAM,WAAW,KAAK,MAAM,MAAM,iBAAiB;AAEnD,QAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,QAAQ,IAAI;AAEzB,UAAM,OAAc,CAAC;AAErB,UAAM,UAA4B,CAAC;AACnC,eAAW,EAAE,KAAK,IAAI,KAAK,UAAU;AACnC,UAAI,CAAC,KAAK;AACR;AAAA,MACF;AAEA,UAAI,WAAW;AAEf,UAAI,OAAO,QAAQ,YAAY;AAC7B,mBAAW,IAAI,IAAI;AAAA,MACrB,WAAW,OAAO,QAAQ,UAAU;AAClC,mBAAW;AAAA,MACb,WAAW,QAAQ,mBAAoB;AACrC,mBAAW,KAAK,MAAM,UAAU,KAAK;AAAA,MACvC,WAAW,QAAQ,uBAAsB;AACvC,mBAAW,KAAK,MAAM,UAAU,KAAK;AAAA,MACvC;AAEA,YAAM,SAAS,KAAK,YAAY,QAAQ;AAGxC,UAAI,QAAQ;AACV,aAAK,KAAK,MAAM;AAEhB,cAAM,QAAQ;AACd,cAAM,OAAO,OAAO,OAAO,KAAK,OAAO,QAAQ;AAC/C,cAAM,MAAM,OAAO,MAAM,KAAK;AAC9B,cAAM,SAAS,OAAO,SAAS,OAAO;AAEtC,gBAAQ,KAAK,IAAI,eAAe,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,CAAC,CAAC;AAAA,MACpE,OAAO;AACL,gBAAQ,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ;AACb,WACE,OAAO,cACP,OAAO,gBACP,OAAO,mBACPA,eAAc,MAAM;AAAA,EAExB;AAAA,EAEA,OAAO;AACT,CAAC;;;ACtJD,IAAAC,gBAAuC;AACvC,IAAAC,iBAAsD;;;ACKtD,SAASC,QAAO,aAAmC;AACjD,QAAM,SAA+B,CAAC;AACtC,QAAM,UAAUC,6BAA4B,WAAW;AAEvD,UAAQ,QAAQ,CAAC,OAAO,cAAc;AACpC,UAAM,SAASC,gBAAe,KAAK;AACnC,WAAO;AAAA,MACL,GAAG,OAAO,IAAI,QAAM;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAErC,SAAO;AACT;AAEA,SAASD,6BAA4B,aAAmC;AACtE,QAAM,MAAM,oBAAI,IAAkC;AAElD,cAAY,QAAQ,UAAQ;AAC1B,QAAI,CAAC,IAAI,IAAI,KAAK,SAAS,GAAG;AAC5B,UAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAAA,IAC5B;AAEA,QAAI,IAAI,KAAK,SAAS,EAAG,KAAK,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AACT;AAEA,SAASC,gBAAe,aAAmC;AACzD,QAAM,SAA2C,CAAC;AAClD,QAAM,SAAS,YAAY,IAAI,WAAS;AAAA,IACtC,OAAO,KAAK;AAAA,IACZ,KAAK,KAAK;AAAA,EACZ,EAAE;AAEF,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEvC,MAAI,UAAU,OAAO,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,KAAK,SAAS,QAAQ,KAAK;AAC7B,cAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG;AAAA,IAC9C,OAAO;AACL,aAAO,KAAK,OAAO;AACnB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,KAAK,OAAO;AAEnB,SAAO;AACT;;;AD3DA,IAAM,QAAQ,oBAAI,IAAwB;AAC1C,SAAS,uBAAuB,WAAmB;AACjD,QAAM,WAAW;AAEjB,MAAI,CAAC,MAAM,IAAI,QAAQ,GAAG;AACxB,UAAM,OAAO,yBAAW,KAAK,EAAE,OAAO,UAAU,CAAC;AACjD,UAAM,IAAI,UAAU,IAAI;AAAA,EAC1B;AAEA,SAAO,MAAM,IAAI,QAAQ;AAC3B;AAEA,IAAM,mBAAmB,qBAAM,OAG7B;AAAA,EACA,QAAQ,OAAO;AACb,UAAM,UAAU,IAAI,+BAA4B;AAEhD,UAAM,YAAY,MAAM;AAAA,MACtB,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,OAAO;AAAA,MACvC,CAAC;AAAA,IACH;AAEA,eAAW,QAAQC,QAAO,SAAS,GAAG;AACpC,YAAM,aAAa,uBAAuB,KAAK,SAAS;AACxD,cAAQ,IAAI,KAAK,MAAM,KAAK,IAAI,UAAU;AAAA,IAC5C;AAEA,WAAO,QAAQ,OAAO;AAAA,EACxB;AAAA,EACA,QAAQ,MAAM;AACZ,WAAO,yBAAW,YAAY,QAAQ,CAAC,IAAI,GAAG,WAAS,MAAM,MAAM,IAAI,CAAC;AAAA,EAC1E;AACF,CAAC;;;AEvCD,IAAAC,gBAA2B;AAC3B,IAAAC,iBAAoD;AAOpD,IAAMC,aAAY;AAAA;AAAA,EAEhB,2BAAY,aAAa,GAAG,QAAM;AAChC,UAAM,YAAY,GAAG,WAAW,MAAM,YAAY;AAClD,UAAM,QAAiB,UAAU;AAAA,MAC/B,CAAC,MAAM,aAAa,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,YAAY,MAAM;AAAA,QACtB,CAAC,MAAM,YAAY,CAAC,GAAG,MAAM,QAAQ,MAAM,QAAQ,EAAE;AAAA,QACrD,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AAAA;AAAA,EAED,2BAAY,kBAAkB,GAAG,QAAM;AACrC,UAAM,MAAM,GAAG,WAAW,IAAI;AAE9B,UAAM,YAAY,GAAG,WAAW,MAAM,YAAY;AAClD,UAAM,QAAiB,UACpB,OAAgB,CAAC,MAAM,aAAa,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EACxE;AAAA,MACC,UACE,KAAK,QAAQ,KAAK,KAAK,OAAO,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK;AAAA,IACnE;AAEF,QAAI,EAAE,aAAa,IAAI;AACvB,iBAAa,OAAO,QAAQ,CAACC,QAAO,UAAU;AAC5C,iBAAW,QAAQ,OAAO;AACxB,YAAIA,OAAM,SAASA,OAAM,OAAO,KAAK,QAAQA,OAAM,KAAK,KAAK,IAAI;AAC/D,yBAAe,aAAa;AAAA,YAC1B,+BAAgB;AAAA,cACdA,OAAM,QAAQ,IAAI,KAAK,OAAO,KAAK;AAAA,cACnCA,OAAM;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAACA,OAAM,aAAS,0BAAWA,QAAO,IAAI,GAAG;AAC3C,gBAAM,aAAaA,OAAM,OAAOA,OAAM;AAEtC;AAAA;AAAA,YAEEA,OAAM,SAAS,KAAK;AAAA,YACpB;AACA,2BAAe,aAAa;AAAA,cAC1B,+BAAgB;AAAA,gBACdA,OAAM;AAAA,gBACN,KAAK;AAAA,gBACLA,OAAM;AAAA,gBACNA,OAAM,aAAa;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA;AAAA,YAEEA,OAAM,SAAS,KAAK;AAAA,YACpB;AACA,2BAAe,aAAa;AAAA,cAC1B,+BAAgB;AAAA,gBACdA,OAAM;AAAA,gBACN,KAAK;AAAA,gBACLA,OAAM;AAAA,gBACNA,OAAM,aAAa;AAAA,cACrB;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA;AAAA,YAEEA,OAAM,UAAU,KAAK,QACrBA,OAAM,UAAU,KAAK;AAAA,YACrB;AAEA,gBAAI,YAAY;AACd,6BAAe,aAAa;AAAA,gBAC1B,+BAAgB;AAAA,kBACd,KAAK;AAAA,kBACL,KAAK,IAAIA,OAAM,MAAM,KAAK,IAAI;AAAA,kBAC9BA,OAAM;AAAA,kBACNA,OAAM,aAAa;AAAA,gBACrB;AAAA,gBACA;AAAA,cACF;AAAA,YACF,OAAO;AACL,6BAAe,aAAa;AAAA,gBAC1B,+BAAgB;AAAA,kBACd,KAAK;AAAA,kBACL,KAAK,IAAIA,OAAM,MAAM,KAAK,EAAE;AAAA,kBAC5BA,OAAM;AAAA,kBACNA,OAAM,aAAa;AAAA,gBACrB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,aAAa,GAAG,GAAG,YAAY,GAAG;AACpC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAIA,IAAM,eAAe,qBAAM,OAA6B;AAAA,EACtD,SAAS,MAAMD;AACjB,CAAC;","names":["import_view","import_state","backgroundDecorations","import_view","import_state","import_language","import_utils","import_view","import_language","cursor","import_view","import_utils","import_view","import_state","mergeIntervals","range","mergeIntervals","import_utils","import_state","extension","range","import_utils","import_state","extension","import_view","import_state","import_language","templateParser","import_es_toolkit","import_view","import_state","pairs","import_view","import_view","import_state","range","import_view","import_language","import_view","import_state","SelectionSide","configChanged","import_view","import_state","squash","groupDecorationsByClassName","mergeIntervals","squash","import_utils","import_state","extension","range"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-editor/extensions",
3
- "version": "0.1.0-alpha.0fd19e",
3
+ "version": "0.1.0-alpha.1bed7f",
4
4
  "description": "extensions",
5
5
  "license": "MIT",
6
6
  "author": "fengzilong",
@@ -22,9 +22,9 @@
22
22
  "lint": "eslint && tsc --noEmit"
23
23
  },
24
24
  "dependencies": {
25
- "@coze-editor/extension-placeholder": "0.1.0-alpha.0fd19e",
26
- "@coze-editor/lezer-parser-template": "0.1.0-alpha.0fd19e",
27
- "@coze-editor/utils": "0.1.0-alpha.0fd19e",
25
+ "@coze-editor/extension-placeholder": "0.1.0-alpha.1bed7f",
26
+ "@coze-editor/lezer-parser-template": "0.1.0-alpha.1bed7f",
27
+ "@coze-editor/utils": "0.1.0-alpha.1bed7f",
28
28
  "@lezer/common": "^1.2.2",
29
29
  "crelt": "^1.0.5",
30
30
  "es-toolkit": "^1.25.2"