{"version":3,"file":"pasty.js","sources":["../../frontend/node_modules/lib0/map.js","../../frontend/node_modules/lib0/set.js","../../frontend/node_modules/lib0/array.js","../../frontend/node_modules/lib0/observable.js","../../frontend/node_modules/lib0/math.js","../../frontend/node_modules/lib0/binary.js","../../frontend/node_modules/lib0/number.js","../../frontend/node_modules/lib0/string.js","../../frontend/node_modules/lib0/encoding.js","../../frontend/node_modules/lib0/error.js","../../frontend/node_modules/lib0/decoding.js","../../frontend/node_modules/lib0/webcrypto.js","../../frontend/node_modules/lib0/random.js","../../frontend/node_modules/lib0/time.js","../../frontend/node_modules/lib0/promise.js","../../frontend/node_modules/lib0/conditions.js","../../frontend/node_modules/lib0/storage.js","../../frontend/node_modules/lib0/trait/equality.js","../../frontend/node_modules/lib0/object.js","../../frontend/node_modules/lib0/function.js","../../frontend/node_modules/lib0/environment.js","../../frontend/node_modules/lib0/buffer.js","../../frontend/node_modules/lib0/pair.js","../../frontend/node_modules/lib0/prng.js","../../frontend/node_modules/lib0/schema.js","../../frontend/node_modules/lib0/dom.js","../../frontend/node_modules/lib0/eventloop.js","../../frontend/node_modules/lib0/symbol.js","../../frontend/node_modules/lib0/logging.common.js","../../frontend/node_modules/lib0/logging.js","../../frontend/node_modules/lib0/iterator.js","../../frontend/node_modules/yjs/dist/yjs.mjs","../../frontend/node_modules/orderedmap/dist/index.js","../../frontend/node_modules/prosemirror-model/dist/index.js","../../frontend/node_modules/prosemirror-transform/dist/index.js","../../frontend/node_modules/prosemirror-state/dist/index.js","../../frontend/node_modules/prosemirror-view/dist/index.js","../../frontend/node_modules/y-protocols/awareness.js","../../frontend/node_modules/lib0/mutex.js","../../frontend/node_modules/lib0/diff.js","../../frontend/node_modules/lib0/hash/sha256.js","../../frontend/node_modules/@tiptap/y-tiptap/dist/y-tiptap.js","../../frontend/src/bootstrap.ts","../../frontend/src/api.ts","../../frontend/src/dom.ts","../../frontend/src/icons.ts","../../frontend/src/persistence.ts","../../frontend/src/anon-banner.ts","../../frontend/src/escapes.ts","../../frontend/src/markdown.ts","../../frontend/src/clipboard.ts","../../frontend/src/autosave.ts","../../frontend/src/collab/codec.ts","../../frontend/src/collab/seed.ts","../../frontend/src/collab/provider.ts","../../frontend/src/collab/live.ts","../../frontend/src/collab/presence.ts","../../frontend/src/conflict.ts","../../frontend/src/handoff.ts","../../frontend/src/appearance-menu.ts","../../frontend/node_modules/@tiptap/core/dist/rolldown-runtime-D7D4PA-g.js","../../frontend/node_modules/prosemirror-commands/dist/index.js","../../frontend/node_modules/prosemirror-schema-list/dist/index.js","../../frontend/node_modules/w3c-keyname/index.js","../../frontend/node_modules/prosemirror-keymap/dist/index.js","../../frontend/node_modules/@tiptap/core/dist/index.js","../../frontend/node_modules/@tiptap/extension-collaboration/dist/index.js","../../frontend/node_modules/@tiptap/extension-collaboration-caret/dist/index.js","../../frontend/node_modules/@tiptap/extension-list/dist/index.js","../../frontend/node_modules/prosemirror-tables/dist/index.js","../../frontend/node_modules/@tiptap/extension-table/dist/index.js","../../frontend/node_modules/marked/lib/marked.esm.js","../../frontend/node_modules/@tiptap/markdown/dist/index.js","../../frontend/node_modules/@tiptap/core/dist/jsx-runtime/jsx-runtime.js","../../frontend/node_modules/@tiptap/extension-blockquote/dist/index.js","../../frontend/node_modules/@tiptap/extension-bold/dist/index.js","../../frontend/node_modules/@tiptap/extension-code/dist/index.js","../../frontend/node_modules/@tiptap/extension-code-block/dist/index.js","../../frontend/node_modules/@tiptap/extension-document/dist/index.js","../../frontend/node_modules/@tiptap/extension-hard-break/dist/index.js","../../frontend/node_modules/@tiptap/extension-heading/dist/index.js","../../frontend/node_modules/@tiptap/extension-horizontal-rule/dist/index.js","../../frontend/node_modules/@tiptap/extension-italic/dist/index.js","../../frontend/node_modules/linkifyjs/dist/linkify.mjs","../../frontend/node_modules/@tiptap/extension-link/dist/index.js","../../frontend/node_modules/@tiptap/extension-paragraph/dist/index.js","../../frontend/node_modules/@tiptap/extension-strike/dist/index.js","../../frontend/node_modules/@tiptap/extension-text/dist/index.js","../../frontend/node_modules/@tiptap/extension-underline/dist/index.js","../../frontend/node_modules/prosemirror-dropcursor/dist/index.js","../../frontend/node_modules/prosemirror-gapcursor/dist/index.js","../../frontend/node_modules/rope-sequence/dist/index.js","../../frontend/node_modules/prosemirror-history/dist/index.js","../../frontend/node_modules/@tiptap/extensions/dist/index.js","../../frontend/node_modules/@tiptap/starter-kit/dist/index.js","../../frontend/src/extensions.ts","../../frontend/src/history.ts","../../frontend/src/lists.ts","../../frontend/src/paste.ts","../../frontend/src/shortcuts.ts","../../frontend/src/vim/cmdline.ts","../../frontend/src/vim/debug.ts","../../frontend/src/vim/lines.ts","../../frontend/src/vim/scan.ts","../../frontend/src/vim/pattern.ts","../../frontend/src/vim/search.ts","../../frontend/src/vim/textobjects.ts","../../frontend/src/vim/motions.ts","../../frontend/src/vim/registers.ts","../../frontend/src/vim/tables.ts","../../frontend/src/vim/viewport.ts","../../frontend/src/vim/exline.ts","../../frontend/src/vim/key.ts","../../frontend/src/vim/types.ts","../../frontend/src/vim/operators.ts","../../frontend/src/vim/cursor.ts","../../frontend/src/vim/gutter.ts","../../frontend/src/vim/keys.ts","../../frontend/src/vim/macro.ts","../../frontend/src/vim/plugin.ts","../../frontend/src/vim/extension.ts","../../frontend/src/vim/index.ts","../../frontend/src/editor.ts","../../frontend/src/menus.ts","../../frontend/src/theme.ts","../../frontend/src/shared-view.ts","../../frontend/src/docs-view.ts","../../frontend/src/fresh-start.ts","../../frontend/src/intro.ts","../../frontend/src/link-popover.ts","../../frontend/src/keycaps.ts","../../frontend/src/title.ts","../../frontend/src/palette.ts","../../frontend/src/settings.ts","../../frontend/src/share-controller.ts","../../frontend/src/table-menu.ts","../../frontend/src/toolbar.ts","../../frontend/src/vim-controller.ts","../../frontend/src/vim-indicator.ts","../../frontend/src/main.ts"],"sourcesContent":["/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * @template K\n * @template V\n * @typedef {Map<K,V>} GlobalMap\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n  const r = create()\n  m.forEach((v, k) => { r.set(k, v) })\n  return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n  let set = map.get(key)\n  if (set === undefined) {\n    map.set(key, set = createT())\n  }\n  return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n  const res = []\n  for (const [key, value] of m) {\n    res.push(f(value, key))\n  }\n  return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n  for (const [key, value] of m) {\n    if (f(value, key)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n  for (const [key, value] of m) {\n    if (!f(value, key)) {\n      return false\n    }\n  }\n  return true\n}\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T|undefined}\n */\nexport const first = set => set.values().next().value\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n  for (let i = 0; i < src.length; i++) {\n    dest.push(src[i])\n  }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template {ArrayLike<any>} ARR\n *\n * @param {ARR} arr\n * @param {ARR extends ArrayLike<infer S> ? ((value:S, index:number, arr:ARR) => boolean) : any} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n  for (let i = 0; i < arr.length; i++) {\n    if (!f(arr[i], i, arr)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template {ArrayLike<any>} ARR\n *\n * @param {ARR} arr\n * @param {ARR extends ArrayLike<infer S> ? ((value:S, index:number, arr:ARR) => boolean) : never} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n  for (let i = 0; i < arr.length; i++) {\n    if (f(arr[i], i, arr)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n  const array = new Array(len)\n  for (let i = 0; i < len; i++) {\n    array[i] = f(i, array)\n  }\n  return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n  /**\n   * @type {Set<M>}\n   */\n  const happened = set.create()\n  /**\n   * @type {Array<T>}\n   */\n  const result = []\n  for (let i = 0; i < arr.length; i++) {\n    const el = arr[i]\n    const mapped = mapper(el)\n    if (!happened.has(mapped)) {\n      happened.add(mapped)\n      result.push(el)\n    }\n  }\n  return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n  /**\n   * @type {Array<any>}\n   */\n  const res = Array(arr.length)\n  for (let i = 0; i < arr.length; i++) {\n    res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n  }\n  return /** @type {any} */ (res)\n}\n\n/**\n * This function bubble-sorts a single item to the correct position. The sort happens in-place and\n * might be useful to ensure that a single item is at the correct position in an otherwise sorted\n * array.\n *\n * @example\n *  const arr = [3, 2, 5]\n *  arr.sort((a, b) => a - b)\n *  arr // => [2, 3, 5]\n *  arr.splice(1, 0, 7)\n *  array.bubbleSortItem(arr, 1, (a, b) => a - b)\n *  arr // => [2, 3, 5, 7]\n *\n * @template T\n * @param {Array<T>} arr\n * @param {number} i\n * @param {(a:T,b:T) => number} compareFn\n */\nexport const bubblesortItem = (arr, i, compareFn) => {\n  const n = arr[i]\n  let j = i\n  // try to sort to the right\n  while (j + 1 < arr.length && compareFn(n, arr[j + 1]) > 0) {\n    arr[j] = arr[j + 1]\n    arr[++j] = n\n  }\n  if (i === j && j > 0) { // no change yet\n    // sort to the left\n    while (j > 0 && compareFn(arr[j - 1], n) > 0) {\n      arr[j] = arr[j - 1]\n      arr[--j] = n\n    }\n  }\n  return j\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n  constructor () {\n    /**\n     * Some desc.\n     * @type {Map<string, Set<any>>}\n     */\n    this._observers = map.create()\n  }\n\n  /**\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name\n   * @param {EVENTS[NAME]} f\n   */\n  on (name, f) {\n    map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n    return f\n  }\n\n  /**\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name\n   * @param {EVENTS[NAME]} f\n   */\n  once (name, f) {\n    /**\n     * @param  {...any} args\n     */\n    const _f = (...args) => {\n      this.off(name, /** @type {any} */ (_f))\n      f(...args)\n    }\n    this.on(name, /** @type {any} */ (_f))\n  }\n\n  /**\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name\n   * @param {EVENTS[NAME]} f\n   */\n  off (name, f) {\n    const observers = this._observers.get(name)\n    if (observers !== undefined) {\n      observers.delete(f)\n      if (observers.size === 0) {\n        this._observers.delete(name)\n      }\n    }\n  }\n\n  /**\n   * Emit a named event. All registered event listeners that listen to the\n   * specified name will receive the event.\n   *\n   * @todo This should catch exceptions\n   *\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name The event name.\n   * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n   */\n  emit (name, args) {\n    // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n    return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n  }\n\n  destroy () {\n    this._observers = map.create()\n  }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n  constructor () {\n    /**\n     * Some desc.\n     * @type {Map<N, any>}\n     */\n    this._observers = map.create()\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  on (name, f) {\n    map.setIfUndefined(this._observers, name, set.create).add(f)\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  once (name, f) {\n    /**\n     * @param  {...any} args\n     */\n    const _f = (...args) => {\n      this.off(name, _f)\n      f(...args)\n    }\n    this.on(name, _f)\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  off (name, f) {\n    const observers = this._observers.get(name)\n    if (observers !== undefined) {\n      observers.delete(f)\n      if (observers.size === 0) {\n        this._observers.delete(name)\n      }\n    }\n  }\n\n  /**\n   * Emit a named event. All registered event listeners that listen to the\n   * specified name will receive the event.\n   *\n   * @todo This should catch exceptions\n   *\n   * @param {N} name The event name.\n   * @param {Array<any>} args The arguments that are applied to the event listener.\n   */\n  emit (name, args) {\n    // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n    return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n  }\n\n  destroy () {\n    this._observers = map.create()\n  }\n}\n/* c8 ignore end */\n","/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * Check whether n is negative, while considering the -0 edge case. While `-0 < 0` is false, this\n * function returns true for -0,-1,,.. and returns false for 0,1,2,...\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also distinguishes between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/* eslint-env browser */\n\n/**\n * Binary data constants.\n *\n * @module binary\n */\n\n/**\n * n-th bit activated.\n *\n * @type {number}\n */\nexport const BIT1 = 1\nexport const BIT2 = 2\nexport const BIT3 = 4\nexport const BIT4 = 8\nexport const BIT5 = 16\nexport const BIT6 = 32\nexport const BIT7 = 64\nexport const BIT8 = 128\nexport const BIT9 = 256\nexport const BIT10 = 512\nexport const BIT11 = 1024\nexport const BIT12 = 2048\nexport const BIT13 = 4096\nexport const BIT14 = 8192\nexport const BIT15 = 16384\nexport const BIT16 = 32768\nexport const BIT17 = 65536\nexport const BIT18 = 1 << 17\nexport const BIT19 = 1 << 18\nexport const BIT20 = 1 << 19\nexport const BIT21 = 1 << 20\nexport const BIT22 = 1 << 21\nexport const BIT23 = 1 << 22\nexport const BIT24 = 1 << 23\nexport const BIT25 = 1 << 24\nexport const BIT26 = 1 << 25\nexport const BIT27 = 1 << 26\nexport const BIT28 = 1 << 27\nexport const BIT29 = 1 << 28\nexport const BIT30 = 1 << 29\nexport const BIT31 = 1 << 30\nexport const BIT32 = 1 << 31\n\n/**\n * First n bits activated.\n *\n * @type {number}\n */\nexport const BITS0 = 0\nexport const BITS1 = 1\nexport const BITS2 = 3\nexport const BITS3 = 7\nexport const BITS4 = 15\nexport const BITS5 = 31\nexport const BITS6 = 63\nexport const BITS7 = 127\nexport const BITS8 = 255\nexport const BITS9 = 511\nexport const BITS10 = 1023\nexport const BITS11 = 2047\nexport const BITS12 = 4095\nexport const BITS13 = 8191\nexport const BITS14 = 16383\nexport const BITS15 = 32767\nexport const BITS16 = 65535\nexport const BITS17 = BIT18 - 1\nexport const BITS18 = BIT19 - 1\nexport const BITS19 = BIT20 - 1\nexport const BITS20 = BIT21 - 1\nexport const BITS21 = BIT22 - 1\nexport const BITS22 = BIT23 - 1\nexport const BITS23 = BIT24 - 1\nexport const BITS24 = BIT25 - 1\nexport const BITS25 = BIT26 - 1\nexport const BITS26 = BIT27 - 1\nexport const BITS27 = BIT28 - 1\nexport const BITS28 = BIT29 - 1\nexport const BITS29 = BIT30 - 1\nexport const BITS30 = BIT31 - 1\n/**\n * @type {number}\n */\nexport const BITS31 = 0x7FFFFFFF\n/**\n * @type {number}\n */\nexport const BITS32 = 0xFFFFFFFF\n","/**\n * Utility helpers for working with numbers.\n *\n * @module number\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER\nexport const MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER\n\nexport const LOWEST_INT32 = 1 << 31\nexport const HIGHEST_INT32 = binary.BITS31\nexport const HIGHEST_UINT32 = binary.BITS32\n\n/* c8 ignore next */\nexport const isInteger = Number.isInteger || (num => typeof num === 'number' && isFinite(num) && math.floor(num) === num)\nexport const isNaN = Number.isNaN\nexport const parseInt = Number.parseInt\n\n/**\n * Count the number of \"1\" bits in an unsigned 32bit number.\n *\n * Super fun bitcount algorithm by Brian Kernighan.\n *\n * @param {number} n\n */\nexport const countBits = n => {\n  n &= binary.BITS32\n  let count = 0\n  while (n) {\n    n &= (n - 1)\n    count++\n  }\n  return count\n}\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const _encodeUtf8Polyfill = str => {\n  const encodedString = unescape(encodeURIComponent(str))\n  const len = encodedString.length\n  const buf = new Uint8Array(len)\n  for (let i = 0; i < len; i++) {\n    buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n  }\n  return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n  let remainingLen = buf.length\n  let encodedString = ''\n  let bufPos = 0\n  while (remainingLen > 0) {\n    const nextLen = remainingLen < 10000 ? remainingLen : 10000\n    const bytes = buf.subarray(bufPos, bufPos + nextLen)\n    bufPos += nextLen\n    // Starting with ES5.1 we can supply a generic array-like object as arguments\n    encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n    remainingLen -= nextLen\n  }\n  return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n  // Safari doesn't handle BOM correctly.\n  // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n  // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n  // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n  // Another issue is that from then on no BOM chars are recognized anymore\n  /* c8 ignore next */\n  utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n\n/**\n * Escape HTML characters &,<,>,',\" to their respective HTML entities &amp;,&lt;,&gt;,&#39;,&quot;\n *\n * @param {string} str\n */\nexport const escapeHTML = str =>\n  str.replace(/[&<>'\"]/g, r => /** @type {string} */ ({\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    \"'\": '&#39;',\n    '\"': '&quot;'\n  }[r]))\n\n/**\n * Reverse of `escapeHTML`\n *\n * @param {string} str\n */\nexport const unescapeHTML = str =>\n  str.replace(/&amp;|&lt;|&gt;|&#39;|&quot;/g, r => /** @type {string} */ ({\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&#39;': \"'\",\n    '&quot;': '\"'\n  }[r]))\n","/**\n * Efficient schema-less binary encoding with support for variable length encoding.\n *\n * Use [lib0/encoding] with [lib0/decoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module encoding\n */\n\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as binary from './binary.js'\nimport * as string from './string.js'\nimport * as array from './array.js'\n\n/**\n * A BinaryEncoder handles the encoding to an Uint8Array.\n */\nexport class Encoder {\n  constructor () {\n    this.cpos = 0\n    this.cbuf = new Uint8Array(100)\n    /**\n     * @type {Array<Uint8Array>}\n     */\n    this.bufs = []\n  }\n}\n\n/**\n * @function\n * @return {Encoder}\n */\nexport const createEncoder = () => new Encoder()\n\n/**\n * @param {function(Encoder):void} f\n */\nexport const encode = (f) => {\n  const encoder = createEncoder()\n  f(encoder)\n  return toUint8Array(encoder)\n}\n\n/**\n * The current length of the encoded data.\n *\n * @function\n * @param {Encoder} encoder\n * @return {number}\n */\nexport const length = encoder => {\n  let len = encoder.cpos\n  for (let i = 0; i < encoder.bufs.length; i++) {\n    len += encoder.bufs[i].length\n  }\n  return len\n}\n\n/**\n * Check whether encoder is empty.\n *\n * @function\n * @param {Encoder} encoder\n * @return {boolean}\n */\nexport const hasContent = encoder => encoder.cpos > 0 || encoder.bufs.length > 0\n\n/**\n * Transform to Uint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @return {Uint8Array<ArrayBuffer>} The created ArrayBuffer.\n */\nexport const toUint8Array = encoder => {\n  const uint8arr = new Uint8Array(length(encoder))\n  let curPos = 0\n  for (let i = 0; i < encoder.bufs.length; i++) {\n    const d = encoder.bufs[i]\n    uint8arr.set(d, curPos)\n    curPos += d.length\n  }\n  uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos)\n  return uint8arr\n}\n\n/**\n * Verify that it is possible to write `len` bytes wtihout checking. If\n * necessary, a new Buffer with the required length is attached.\n *\n * @param {Encoder} encoder\n * @param {number} len\n */\nexport const verifyLen = (encoder, len) => {\n  const bufferLen = encoder.cbuf.length\n  if (bufferLen - encoder.cpos < len) {\n    encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos))\n    encoder.cbuf = new Uint8Array(math.max(bufferLen, len) * 2)\n    encoder.cpos = 0\n  }\n}\n\n/**\n * Write one byte to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The byte that is to be encoded.\n */\nexport const write = (encoder, num) => {\n  const bufferLen = encoder.cbuf.length\n  if (encoder.cpos === bufferLen) {\n    encoder.bufs.push(encoder.cbuf)\n    encoder.cbuf = new Uint8Array(bufferLen * 2)\n    encoder.cpos = 0\n  }\n  encoder.cbuf[encoder.cpos++] = num\n}\n\n/**\n * Write one byte at a specific position.\n * Position must already be written (i.e. encoder.length > pos)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos Position to which to write data\n * @param {number} num Unsigned 8-bit integer\n */\nexport const set = (encoder, pos, num) => {\n  let buffer = null\n  // iterate all buffers and adjust position\n  for (let i = 0; i < encoder.bufs.length && buffer === null; i++) {\n    const b = encoder.bufs[i]\n    if (pos < b.length) {\n      buffer = b // found buffer\n    } else {\n      pos -= b.length\n    }\n  }\n  if (buffer === null) {\n    // use current buffer\n    buffer = encoder.cbuf\n  }\n  buffer[pos] = num\n}\n\n/**\n * Write one byte as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint8 = write\n\n/**\n * Write one byte as an unsigned Integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint8 = set\n\n/**\n * Write two bytes as an unsigned integer.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint16 = (encoder, num) => {\n  write(encoder, num & binary.BITS8)\n  write(encoder, (num >>> 8) & binary.BITS8)\n}\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint16 = (encoder, pos, num) => {\n  set(encoder, pos, num & binary.BITS8)\n  set(encoder, pos + 1, (num >>> 8) & binary.BITS8)\n}\n\n/**\n * Write two bytes as an unsigned integer\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32 = (encoder, num) => {\n  for (let i = 0; i < 4; i++) {\n    write(encoder, num & binary.BITS8)\n    num >>>= 8\n  }\n}\n\n/**\n * Write two bytes as an unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeUint32BigEndian = (encoder, num) => {\n  for (let i = 3; i >= 0; i--) {\n    write(encoder, (num >>> (8 * i)) & binary.BITS8)\n  }\n}\n\n/**\n * Write two bytes as an unsigned integer at a specific location.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} pos The location where the data will be written.\n * @param {number} num The number that is to be encoded.\n */\nexport const setUint32 = (encoder, pos, num) => {\n  for (let i = 0; i < 4; i++) {\n    set(encoder, pos + i, num & binary.BITS8)\n    num >>>= 8\n  }\n}\n\n/**\n * Write a variable length unsigned integer. Max encodable integer is 2^53.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarUint = (encoder, num) => {\n  while (num > binary.BITS7) {\n    write(encoder, binary.BIT8 | (binary.BITS7 & num))\n    num = math.floor(num / 128) // shift >>> 7\n  }\n  write(encoder, binary.BITS7 & num)\n}\n\n/**\n * Write a variable length integer.\n *\n * We use the 7th bit instead for signaling that this is a negative number.\n *\n * @function\n * @param {Encoder} encoder\n * @param {number} num The number that is to be encoded.\n */\nexport const writeVarInt = (encoder, num) => {\n  const isNegative = math.isNegativeZero(num)\n  if (isNegative) {\n    num = -num\n  }\n  //             |- whether to continue reading         |- whether is negative     |- number\n  write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))\n  num = math.floor(num / 64) // shift >>> 6\n  // We don't need to consider the case of num === 0 so we can use a different\n  // pattern here than above.\n  while (num > 0) {\n    write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))\n    num = math.floor(num / 128) // shift >>> 7\n  }\n}\n\n/**\n * A cache to store strings temporarily\n */\nconst _strBuffer = new Uint8Array(30000)\nconst _maxStrBSize = _strBuffer.length / 3\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringNative = (encoder, str) => {\n  if (str.length < _maxStrBSize) {\n    // We can encode the string into the existing buffer\n    /* c8 ignore next */\n    const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0\n    writeVarUint(encoder, written)\n    for (let i = 0; i < written; i++) {\n      write(encoder, _strBuffer[i])\n    }\n  } else {\n    writeVarUint8Array(encoder, string.encodeUtf8(str))\n  }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const _writeVarStringPolyfill = (encoder, str) => {\n  const encodedString = unescape(encodeURIComponent(str))\n  const len = encodedString.length\n  writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    write(encoder, /** @type {number} */ (encodedString.codePointAt(i)))\n  }\n}\n\n/**\n * Write a variable length string.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\n/* c8 ignore next */\nexport const writeVarString = (string.utf8TextEncoder && /** @type {any} */ (string.utf8TextEncoder).encodeInto) ? _writeVarStringNative : _writeVarStringPolyfill\n\n/**\n * Write a string terminated by a special byte sequence. This is not very performant and is\n * generally discouraged. However, the resulting byte arrays are lexiographically ordered which\n * makes this a nice feature for databases.\n *\n * The string will be encoded using utf8 and then terminated and escaped using writeTerminatingUint8Array.\n *\n * @function\n * @param {Encoder} encoder\n * @param {String} str The string that is to be encoded.\n */\nexport const writeTerminatedString = (encoder, str) =>\n  writeTerminatedUint8Array(encoder, string.encodeUtf8(str))\n\n/**\n * Write a terminating Uint8Array. Note that this is not performant and is generally\n * discouraged. There are few situations when this is needed.\n *\n * We use 0x0 as a terminating character. 0x1 serves as an escape character for 0x0 and 0x1.\n *\n * Example: [0,1,2] is encoded to [1,0,1,1,2,0]. 0x0, and 0x1 needed to be escaped using 0x1. Then\n * the result is terminated using the 0x0 character.\n *\n * This is basically how many systems implement null terminated strings. However, we use an escape\n * character 0x1 to avoid issues and potenial attacks on our database (if this is used as a key\n * encoder for NoSql databases).\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} buf The string that is to be encoded.\n */\nexport const writeTerminatedUint8Array = (encoder, buf) => {\n  for (let i = 0; i < buf.length; i++) {\n    const b = buf[i]\n    if (b === 0 || b === 1) {\n      write(encoder, 1)\n    }\n    write(encoder, buf[i])\n  }\n  write(encoder, 0)\n}\n\n/**\n * Write the content of another Encoder.\n *\n * @TODO: can be improved!\n *        - Note: Should consider that when appending a lot of small Encoders, we should rather clone than referencing the old structure.\n *                Encoders start with a rather big initial buffer.\n *\n * @function\n * @param {Encoder} encoder The enUint8Arr\n * @param {Encoder} append The BinaryEncoder to be written.\n */\nexport const writeBinaryEncoder = (encoder, append) => writeUint8Array(encoder, toUint8Array(append))\n\n/**\n * Append fixed-length Uint8Array to the encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeUint8Array = (encoder, uint8Array) => {\n  const bufferLen = encoder.cbuf.length\n  const cpos = encoder.cpos\n  const leftCopyLen = math.min(bufferLen - cpos, uint8Array.length)\n  const rightCopyLen = uint8Array.length - leftCopyLen\n  encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos)\n  encoder.cpos += leftCopyLen\n  if (rightCopyLen > 0) {\n    // Still something to write, write right half..\n    // Append new buffer\n    encoder.bufs.push(encoder.cbuf)\n    // must have at least size of remaining buffer\n    encoder.cbuf = new Uint8Array(math.max(bufferLen * 2, rightCopyLen))\n    // copy array\n    encoder.cbuf.set(uint8Array.subarray(leftCopyLen))\n    encoder.cpos = rightCopyLen\n  }\n}\n\n/**\n * Append an Uint8Array to Encoder.\n *\n * @function\n * @param {Encoder} encoder\n * @param {Uint8Array} uint8Array\n */\nexport const writeVarUint8Array = (encoder, uint8Array) => {\n  writeVarUint(encoder, uint8Array.byteLength)\n  writeUint8Array(encoder, uint8Array)\n}\n\n/**\n * Create an DataView of the next `len` bytes. Use it to write data after\n * calling this function.\n *\n * ```js\n * // write float32 using DataView\n * const dv = writeOnDataView(encoder, 4)\n * dv.setFloat32(0, 1.1)\n * // read float32 using DataView\n * const dv = readFromDataView(encoder, 4)\n * dv.getFloat32(0) // => 1.100000023841858 (leaving it to the reader to find out why this is the correct result)\n * ```\n *\n * @param {Encoder} encoder\n * @param {number} len\n * @return {DataView}\n */\nexport const writeOnDataView = (encoder, len) => {\n  verifyLen(encoder, len)\n  const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len)\n  encoder.cpos += len\n  return dview\n}\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {number} num\n */\nexport const writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigInt64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigInt64(0, num, false)\n\n/**\n * @param {Encoder} encoder\n * @param {bigint} num\n */\nexport const writeBigUint64 = (encoder, num) => /** @type {any} */ (writeOnDataView(encoder, 8)).setBigUint64(0, num, false)\n\nconst floatTestBed = new DataView(new ArrayBuffer(4))\n/**\n * Check if a number can be encoded as a 32 bit float.\n *\n * @param {number} num\n * @return {boolean}\n */\nconst isFloat32 = num => {\n  floatTestBed.setFloat32(0, num)\n  return floatTestBed.getFloat32(0) === num\n}\n\n/**\n * @typedef {Array<AnyEncodable>} AnyEncodableArray\n */\n\n/**\n * @typedef {undefined|null|number|bigint|boolean|string|{[k:string]:AnyEncodable}|AnyEncodableArray|Uint8Array} AnyEncodable\n */\n\n/**\n * Encode data with efficient binary format.\n *\n * Differences to JSON:\n * • Transforms data to a binary format (not to a string)\n * • Encodes undefined, NaN, and ArrayBuffer (these can't be represented in JSON)\n * • Numbers are efficiently encoded either as a variable length integer, as a\n *   32 bit float, as a 64 bit float, or as a 64 bit bigint.\n *\n * Encoding table:\n *\n * | Data Type           | Prefix   | Encoding Method    | Comment |\n * | ------------------- | -------- | ------------------ | ------- |\n * | undefined           | 127      |                    | Functions, symbol, and everything that cannot be identified is encoded as undefined |\n * | null                | 126      |                    | |\n * | integer             | 125      | writeVarInt        | Only encodes 32 bit signed integers |\n * | float32             | 124      | writeFloat32       | |\n * | float64             | 123      | writeFloat64       | |\n * | bigint              | 122      | writeBigInt64      | |\n * | boolean (false)     | 121      |                    | True and false are different data types so we save the following byte |\n * | boolean (true)      | 120      |                    | - 0b01111000 so the last bit determines whether true or false |\n * | string              | 119      | writeVarString     | |\n * | object<string,any>  | 118      | custom             | Writes {length} then {length} key-value pairs |\n * | array<any>          | 117      | custom             | Writes {length} then {length} json values |\n * | Uint8Array          | 116      | writeVarUint8Array | We use Uint8Array for any kind of binary data |\n *\n * Reasons for the decreasing prefix:\n * We need the first bit for extendability (later we may want to encode the\n * prefix with writeVarUint). The remaining 7 bits are divided as follows:\n * [0-30]   the beginning of the data range is used for custom purposes\n *          (defined by the function that uses this library)\n * [31-127] the end of the data range is used for data encoding by\n *          lib0/encoding.js\n *\n * @param {Encoder} encoder\n * @param {AnyEncodable} data\n */\nexport const writeAny = (encoder, data) => {\n  switch (typeof data) {\n    case 'string':\n      // TYPE 119: STRING\n      write(encoder, 119)\n      writeVarString(encoder, data)\n      break\n    case 'number':\n      if (number.isInteger(data) && math.abs(data) <= binary.BITS31) {\n        // TYPE 125: INTEGER\n        write(encoder, 125)\n        writeVarInt(encoder, data)\n      } else if (isFloat32(data)) {\n        // TYPE 124: FLOAT32\n        write(encoder, 124)\n        writeFloat32(encoder, data)\n      } else {\n        // TYPE 123: FLOAT64\n        write(encoder, 123)\n        writeFloat64(encoder, data)\n      }\n      break\n    case 'bigint':\n      // TYPE 122: BigInt\n      write(encoder, 122)\n      writeBigInt64(encoder, data)\n      break\n    case 'object':\n      if (data === null) {\n        // TYPE 126: null\n        write(encoder, 126)\n      } else if (array.isArray(data)) {\n        // TYPE 117: Array\n        write(encoder, 117)\n        writeVarUint(encoder, data.length)\n        for (let i = 0; i < data.length; i++) {\n          writeAny(encoder, data[i])\n        }\n      } else if (data instanceof Uint8Array) {\n        // TYPE 116: ArrayBuffer\n        write(encoder, 116)\n        writeVarUint8Array(encoder, data)\n      } else {\n        // TYPE 118: Object\n        write(encoder, 118)\n        const keys = Object.keys(data)\n        writeVarUint(encoder, keys.length)\n        for (let i = 0; i < keys.length; i++) {\n          const key = keys[i]\n          writeVarString(encoder, key)\n          writeAny(encoder, data[key])\n        }\n      }\n      break\n    case 'boolean':\n      // TYPE 120/121: boolean (true/false)\n      write(encoder, data ? 120 : 121)\n      break\n    default:\n      // TYPE 127: undefined\n      write(encoder, 127)\n  }\n}\n\n/**\n * Now come a few stateful encoder that have their own classes.\n */\n\n/**\n * Basic Run Length Encoder - a basic compression implementation.\n *\n * Encodes [1,1,1,7] to [1,3,7,1] (3 times 1, 1 time 7). This encoder might do more harm than good if there are a lot of values that are not repeated.\n *\n * It was originally used for image compression. Cool .. article http://csbruce.com/cbm/transactor/pdfs/trans_v7_i06.pdf\n *\n * @note T must not be null!\n *\n * @template T\n */\nexport class RleEncoder extends Encoder {\n  /**\n   * @param {function(Encoder, T):void} writer\n   */\n  constructor (writer) {\n    super()\n    /**\n     * The writer\n     */\n    this.w = writer\n    /**\n     * Current state\n     * @type {T|null}\n     */\n    this.s = null\n    this.count = 0\n  }\n\n  /**\n   * @param {T} v\n   */\n  write (v) {\n    if (this.s === v) {\n      this.count++\n    } else {\n      if (this.count > 0) {\n        // flush counter, unless this is the first value (count = 0)\n        writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n      }\n      this.count = 1\n      // write first value\n      this.w(this, v)\n      this.s = v\n    }\n  }\n}\n\n/**\n * Basic diff decoder using variable length encoding.\n *\n * Encodes the values [3, 1100, 1101, 1050, 0] to [3, 1097, 1, -51, -1050] using writeVarInt.\n */\nexport class IntDiffEncoder extends Encoder {\n  /**\n   * @param {number} start\n   */\n  constructor (start) {\n    super()\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    writeVarInt(this, v - this.s)\n    this.s = v\n  }\n}\n\n/**\n * A combination of IntDiffEncoder and RleEncoder.\n *\n * Basically first writes the IntDiffEncoder and then counts duplicate diffs using RleEncoding.\n *\n * Encodes the values [1,1,1,2,3,4,5,6] as [1,1,0,2,1,5] (RLE([1,0,0,1,1,1,1,1]) ⇒ RleIntDiff[1,1,0,2,1,5])\n */\nexport class RleIntDiffEncoder extends Encoder {\n  /**\n   * @param {number} start\n   */\n  constructor (start) {\n    super()\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n    this.count = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.s === v && this.count > 0) {\n      this.count++\n    } else {\n      if (this.count > 0) {\n        // flush counter, unless this is the first value (count = 0)\n        writeVarUint(this, this.count - 1) // since count is always > 0, we can decrement by one. non-standard encoding ftw\n      }\n      this.count = 1\n      // write first value\n      writeVarInt(this, v - this.s)\n      this.s = v\n    }\n  }\n}\n\n/**\n * @param {UintOptRleEncoder} encoder\n */\nconst flushUintOptRleEncoder = encoder => {\n  if (encoder.count > 0) {\n    // flush counter, unless this is the first value (count = 0)\n    // case 1: just a single value. set sign to positive\n    // case 2: write several values. set sign to negative to indicate that there is a length coming\n    writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s)\n    if (encoder.count > 1) {\n      writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n    }\n  }\n}\n\n/**\n * Optimized Rle encoder that does not suffer from the mentioned problem of the basic Rle encoder.\n *\n * Internally uses VarInt encoder to write unsigned integers. If the input occurs multiple times, we write\n * write it as a negative number. The UintOptRleDecoder then understands that it needs to read a count.\n *\n * Encodes [1,2,3,3,3] as [1,2,-3,3] (once 1, once 2, three times 3)\n */\nexport class UintOptRleEncoder {\n  constructor () {\n    this.encoder = new Encoder()\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.s === v) {\n      this.count++\n    } else {\n      flushUintOptRleEncoder(this)\n      this.count = 1\n      this.s = v\n    }\n  }\n\n  /**\n   * Flush the encoded state and transform this to a Uint8Array.\n   *\n   * Note that this should only be called once.\n   */\n  toUint8Array () {\n    flushUintOptRleEncoder(this)\n    return toUint8Array(this.encoder)\n  }\n}\n\n/**\n * Increasing Uint Optimized RLE Encoder\n *\n * The RLE encoder counts the number of same occurences of the same value.\n * The IncUintOptRle encoder counts if the value increases.\n * I.e. 7, 8, 9, 10 will be encoded as [-7, 4]. 1, 3, 5 will be encoded\n * as [1, 3, 5].\n */\nexport class IncUintOptRleEncoder {\n  constructor () {\n    this.encoder = new Encoder()\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.s + this.count === v) {\n      this.count++\n    } else {\n      flushUintOptRleEncoder(this)\n      this.count = 1\n      this.s = v\n    }\n  }\n\n  /**\n   * Flush the encoded state and transform this to a Uint8Array.\n   *\n   * Note that this should only be called once.\n   */\n  toUint8Array () {\n    flushUintOptRleEncoder(this)\n    return toUint8Array(this.encoder)\n  }\n}\n\n/**\n * @param {IntDiffOptRleEncoder} encoder\n */\nconst flushIntDiffOptRleEncoder = encoder => {\n  if (encoder.count > 0) {\n    //          31 bit making up the diff | wether to write the counter\n    // const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)\n    const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)\n    // flush counter, unless this is the first value (count = 0)\n    // case 1: just a single value. set first bit to positive\n    // case 2: write several values. set first bit to negative to indicate that there is a length coming\n    writeVarInt(encoder.encoder, encodedDiff)\n    if (encoder.count > 1) {\n      writeVarUint(encoder.encoder, encoder.count - 2) // since count is always > 1, we can decrement by one. non-standard encoding ftw\n    }\n  }\n}\n\n/**\n * A combination of the IntDiffEncoder and the UintOptRleEncoder.\n *\n * The count approach is similar to the UintDiffOptRleEncoder, but instead of using the negative bitflag, it encodes\n * in the LSB whether a count is to be read. Therefore this Encoder only supports 31 bit integers!\n *\n * Encodes [1, 2, 3, 2] as [3, 1, 6, -1] (more specifically [(1 << 1) | 1, (3 << 0) | 0, -1])\n *\n * Internally uses variable length encoding. Contrary to normal UintVar encoding, the first byte contains:\n * * 1 bit that denotes whether the next value is a count (LSB)\n * * 1 bit that denotes whether this value is negative (MSB - 1)\n * * 1 bit that denotes whether to continue reading the variable length integer (MSB)\n *\n * Therefore, only five bits remain to encode diff ranges.\n *\n * Use this Encoder only when appropriate. In most cases, this is probably a bad idea.\n */\nexport class IntDiffOptRleEncoder {\n  constructor () {\n    this.encoder = new Encoder()\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n    this.diff = 0\n  }\n\n  /**\n   * @param {number} v\n   */\n  write (v) {\n    if (this.diff === v - this.s) {\n      this.s = v\n      this.count++\n    } else {\n      flushIntDiffOptRleEncoder(this)\n      this.count = 1\n      this.diff = v - this.s\n      this.s = v\n    }\n  }\n\n  /**\n   * Flush the encoded state and transform this to a Uint8Array.\n   *\n   * Note that this should only be called once.\n   */\n  toUint8Array () {\n    flushIntDiffOptRleEncoder(this)\n    return toUint8Array(this.encoder)\n  }\n}\n\n/**\n * Optimized String Encoder.\n *\n * Encoding many small strings in a simple Encoder is not very efficient. The function call to decode a string takes some time and creates references that must be eventually deleted.\n * In practice, when decoding several million small strings, the GC will kick in more and more often to collect orphaned string objects (or maybe there is another reason?).\n *\n * This string encoder solves the above problem. All strings are concatenated and written as a single string using a single encoding call.\n *\n * The lengths are encoded using a UintOptRleEncoder.\n */\nexport class StringEncoder {\n  constructor () {\n    /**\n     * @type {Array<string>}\n     */\n    this.sarr = []\n    this.s = ''\n    this.lensE = new UintOptRleEncoder()\n  }\n\n  /**\n   * @param {string} string\n   */\n  write (string) {\n    this.s += string\n    if (this.s.length > 19) {\n      this.sarr.push(this.s)\n      this.s = ''\n    }\n    this.lensE.write(string.length)\n  }\n\n  toUint8Array () {\n    const encoder = new Encoder()\n    this.sarr.push(this.s)\n    this.s = ''\n    writeVarString(encoder, this.sarr.join(''))\n    writeUint8Array(encoder, this.lensE.toUint8Array())\n    return toUint8Array(encoder)\n  }\n}\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n  throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n  throw create('Unexpected case')\n}\n\n/**\n * @param {boolean} property\n * @return {asserts property is true}\n */\nexport const assert = property => { if (!property) throw create('Assert failed') }\n","/**\n * Efficient schema-less binary decoding with support for variable length encoding.\n *\n * Use [lib0/decoding] with [lib0/encoding]. Every encoding function has a corresponding decoding function.\n *\n * Encodes numbers in little-endian order (least to most significant byte order)\n * and is compatible with Golang's binary encoding (https://golang.org/pkg/encoding/binary/)\n * which is also used in Protocol Buffers.\n *\n * ```js\n * // encoding step\n * const encoder = encoding.createEncoder()\n * encoding.writeVarUint(encoder, 256)\n * encoding.writeVarString(encoder, 'Hello world!')\n * const buf = encoding.toUint8Array(encoder)\n * ```\n *\n * ```js\n * // decoding step\n * const decoder = decoding.createDecoder(buf)\n * decoding.readVarUint(decoder) // => 256\n * decoding.readVarString(decoder) // => 'Hello world!'\n * decoding.hasContent(decoder) // => false - all data is read\n * ```\n *\n * @module decoding\n */\n\nimport * as binary from './binary.js'\nimport * as math from './math.js'\nimport * as number from './number.js'\nimport * as string from './string.js'\nimport * as error from './error.js'\nimport * as encoding from './encoding.js'\n\nconst errorUnexpectedEndOfArray = error.create('Unexpected end of array')\nconst errorIntegerOutOfRange = error.create('Integer out of Range')\n\n/**\n * A Decoder handles the decoding of an Uint8Array.\n * @template {ArrayBufferLike} [Buf=ArrayBufferLike]\n */\nexport class Decoder {\n  /**\n   * @param {Uint8Array<Buf>} uint8Array Binary data to decode\n   */\n  constructor (uint8Array) {\n    /**\n     * Decoding target.\n     *\n     * @type {Uint8Array<Buf>}\n     */\n    this.arr = uint8Array\n    /**\n     * Current decoding position.\n     *\n     * @type {number}\n     */\n    this.pos = 0\n  }\n}\n\n/**\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Uint8Array<Buf>} uint8Array\n * @return {Decoder<Buf>}\n */\nexport const createDecoder = uint8Array => new Decoder(uint8Array)\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {boolean}\n */\nexport const hasContent = decoder => decoder.pos !== decoder.arr.length\n\n/**\n * Clone a decoder instance.\n * Optionally set a new position parameter.\n *\n * @function\n * @param {Decoder} decoder The decoder instance\n * @param {number} [newPos] Defaults to current position\n * @return {Decoder} A clone of `decoder`\n */\nexport const clone = (decoder, newPos = decoder.pos) => {\n  const _decoder = createDecoder(decoder.arr)\n  _decoder.pos = newPos\n  return _decoder\n}\n\n/**\n * Create an Uint8Array view of the next `len` bytes and advance the position by `len`.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n *            Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Decoder<Buf>} decoder The decoder instance\n * @param {number} len The length of bytes to read\n * @return {Uint8Array<Buf>}\n */\nexport const readUint8Array = (decoder, len) => {\n  const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len)\n  decoder.pos += len\n  return view\n}\n\n/**\n * Read variable length Uint8Array.\n *\n * Important: The Uint8Array still points to the underlying ArrayBuffer. Make sure to discard the result as soon as possible to prevent any memory leaks.\n *            Use `buffer.copyUint8Array` to copy the result into a new Uint8Array.\n *\n * @function\n * @template {ArrayBufferLike} Buf\n * @param {Decoder<Buf>} decoder\n * @return {Uint8Array<Buf>}\n */\nexport const readVarUint8Array = decoder => readUint8Array(decoder, readVarUint(decoder))\n\n/**\n * Read the rest of the content as an ArrayBuffer\n * @function\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTailAsUint8Array = decoder => readUint8Array(decoder, decoder.arr.length - decoder.pos)\n\n/**\n * Skip one byte, jump to the next position.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} The next position\n */\nexport const skip8 = decoder => decoder.pos++\n\n/**\n * Read one byte as unsigned integer.\n * @function\n * @param {Decoder} decoder The decoder instance\n * @return {number} Unsigned 8-bit integer\n */\nexport const readUint8 = decoder => decoder.arr[decoder.pos++]\n\n/**\n * Read 2 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint16 = decoder => {\n  const uint =\n    decoder.arr[decoder.pos] +\n    (decoder.arr[decoder.pos + 1] << 8)\n  decoder.pos += 2\n  return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32 = decoder => {\n  const uint =\n    (decoder.arr[decoder.pos] +\n    (decoder.arr[decoder.pos + 1] << 8) +\n    (decoder.arr[decoder.pos + 2] << 16) +\n    (decoder.arr[decoder.pos + 3] << 24)) >>> 0\n  decoder.pos += 4\n  return uint\n}\n\n/**\n * Read 4 bytes as unsigned integer in big endian order.\n * (most significant byte first)\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const readUint32BigEndian = decoder => {\n  const uint =\n    (decoder.arr[decoder.pos + 3] +\n    (decoder.arr[decoder.pos + 2] << 8) +\n    (decoder.arr[decoder.pos + 1] << 16) +\n    (decoder.arr[decoder.pos] << 24)) >>> 0\n  decoder.pos += 4\n  return uint\n}\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint8 = decoder => decoder.arr[decoder.pos]\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint16 = decoder =>\n  decoder.arr[decoder.pos] +\n  (decoder.arr[decoder.pos + 1] << 8)\n\n/**\n * Look ahead without incrementing the position\n * to the next byte and read it as unsigned integer.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.\n */\nexport const peekUint32 = decoder => (\n  decoder.arr[decoder.pos] +\n  (decoder.arr[decoder.pos + 1] << 8) +\n  (decoder.arr[decoder.pos + 2] << 16) +\n  (decoder.arr[decoder.pos + 3] << 24)\n) >>> 0\n\n/**\n * Read unsigned integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n *  * numbers < 2^7 is stored in one bytlength\n *  * numbers < 2^14 is stored in two bylength\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarUint = decoder => {\n  let num = 0\n  let mult = 1\n  const len = decoder.arr.length\n  while (decoder.pos < len) {\n    const r = decoder.arr[decoder.pos++]\n    // num = num | ((r & binary.BITS7) << len)\n    num = num + (r & binary.BITS7) * mult // shift $r << (7*#iterations) and add it to num\n    mult *= 128 // next iteration, shift 7 \"more\" to the left\n    if (r < binary.BIT8) {\n      return num\n    }\n    /* c8 ignore start */\n    if (num > number.MAX_SAFE_INTEGER) {\n      throw errorIntegerOutOfRange\n    }\n    /* c8 ignore stop */\n  }\n  throw errorUnexpectedEndOfArray\n}\n\n/**\n * Read signed integer (32bit) with variable length.\n * 1/8th of the storage is used as encoding overhead.\n *  * numbers < 2^7 is stored in one bytlength\n *  * numbers < 2^14 is stored in two bylength\n * @todo This should probably create the inverse ~num if number is negative - but this would be a breaking change.\n *\n * @function\n * @param {Decoder} decoder\n * @return {number} An unsigned integer.length\n */\nexport const readVarInt = decoder => {\n  let r = decoder.arr[decoder.pos++]\n  let num = r & binary.BITS6\n  let mult = 64\n  const sign = (r & binary.BIT7) > 0 ? -1 : 1\n  if ((r & binary.BIT8) === 0) {\n    // don't continue reading\n    return sign * num\n  }\n  const len = decoder.arr.length\n  while (decoder.pos < len) {\n    r = decoder.arr[decoder.pos++]\n    // num = num | ((r & binary.BITS7) << len)\n    num = num + (r & binary.BITS7) * mult\n    mult *= 128\n    if (r < binary.BIT8) {\n      return sign * num\n    }\n    /* c8 ignore start */\n    if (num > number.MAX_SAFE_INTEGER) {\n      throw errorIntegerOutOfRange\n    }\n    /* c8 ignore stop */\n  }\n  throw errorUnexpectedEndOfArray\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarUint = decoder => {\n  const pos = decoder.pos\n  const s = readVarUint(decoder)\n  decoder.pos = pos\n  return s\n}\n\n/**\n * Look ahead and read varUint without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {number}\n */\nexport const peekVarInt = decoder => {\n  const pos = decoder.pos\n  const s = readVarInt(decoder)\n  decoder.pos = pos\n  return s\n}\n\n/**\n * We don't test this function anymore as we use native decoding/encoding by default now.\n * Better not modify this anymore..\n *\n * Transforming utf8 to a string is pretty expensive. The code performs 10x better\n * when String.fromCodePoint is fed with all characters as arguments.\n * But most environments have a maximum number of arguments per functions.\n * For effiency reasons we apply a maximum of 10000 characters at once.\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String.\n */\n/* c8 ignore start */\nexport const _readVarStringPolyfill = decoder => {\n  let remainingLen = readVarUint(decoder)\n  if (remainingLen === 0) {\n    return ''\n  } else {\n    let encodedString = String.fromCodePoint(readUint8(decoder)) // remember to decrease remainingLen\n    if (--remainingLen < 100) { // do not create a Uint8Array for small strings\n      while (remainingLen--) {\n        encodedString += String.fromCodePoint(readUint8(decoder))\n      }\n    } else {\n      while (remainingLen > 0) {\n        const nextLen = remainingLen < 10000 ? remainingLen : 10000\n        // this is dangerous, we create a fresh array view from the existing buffer\n        const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen)\n        decoder.pos += nextLen\n        // Starting with ES5.1 we can supply a generic array-like object as arguments\n        encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n        remainingLen -= nextLen\n      }\n    }\n    return decodeURIComponent(escape(encodedString))\n  }\n}\n/* c8 ignore stop */\n\n/**\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n */\nexport const _readVarStringNative = decoder =>\n  /** @type any */ (string.utf8TextDecoder).decode(readVarUint8Array(decoder))\n\n/**\n * Read string of variable length\n * * varUint is used to store the length of the string\n *\n * @function\n * @param {Decoder} decoder\n * @return {String} The read String\n *\n */\n/* c8 ignore next */\nexport const readVarString = string.utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill\n\n/**\n * @param {Decoder} decoder\n * @return {Uint8Array}\n */\nexport const readTerminatedUint8Array = decoder => {\n  const encoder = encoding.createEncoder()\n  let b\n  while (true) {\n    b = readUint8(decoder)\n    if (b === 0) {\n      return encoding.toUint8Array(encoder)\n    }\n    if (b === 1) {\n      b = readUint8(decoder)\n    }\n    encoding.write(encoder, b)\n  }\n}\n\n/**\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const readTerminatedString = decoder => string.decodeUtf8(readTerminatedUint8Array(decoder))\n\n/**\n * Look ahead and read varString without incrementing position\n *\n * @function\n * @param {Decoder} decoder\n * @return {string}\n */\nexport const peekVarString = decoder => {\n  const pos = decoder.pos\n  const s = readVarString(decoder)\n  decoder.pos = pos\n  return s\n}\n\n/**\n * @param {Decoder} decoder\n * @param {number} len\n * @return {DataView}\n */\nexport const readFromDataView = (decoder, len) => {\n  const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len)\n  decoder.pos += len\n  return dv\n}\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat32 = decoder => readFromDataView(decoder, 4).getFloat32(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readFloat64 = decoder => readFromDataView(decoder, 8).getFloat64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigInt64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigInt64(0, false)\n\n/**\n * @param {Decoder} decoder\n */\nexport const readBigUint64 = decoder => /** @type {any} */ (readFromDataView(decoder, 8)).getBigUint64(0, false)\n\n/**\n * @type {Array<function(Decoder):any>}\n */\nconst readAnyLookupTable = [\n  decoder => undefined, // CASE 127: undefined\n  decoder => null, // CASE 126: null\n  readVarInt, // CASE 125: integer\n  readFloat32, // CASE 124: float32\n  readFloat64, // CASE 123: float64\n  readBigInt64, // CASE 122: bigint\n  decoder => false, // CASE 121: boolean (false)\n  decoder => true, // CASE 120: boolean (true)\n  readVarString, // CASE 119: string\n  decoder => { // CASE 118: object<string,any>\n    const len = readVarUint(decoder)\n    /**\n     * @type {Object<string,any>}\n     */\n    const obj = {}\n    for (let i = 0; i < len; i++) {\n      const key = readVarString(decoder)\n      obj[key] = readAny(decoder)\n    }\n    return obj\n  },\n  decoder => { // CASE 117: array<any>\n    const len = readVarUint(decoder)\n    const arr = []\n    for (let i = 0; i < len; i++) {\n      arr.push(readAny(decoder))\n    }\n    return arr\n  },\n  readVarUint8Array // CASE 116: Uint8Array\n]\n\n/**\n * @param {Decoder} decoder\n */\nexport const readAny = decoder => readAnyLookupTable[127 - readUint8(decoder)](decoder)\n\n/**\n * T must not be null.\n *\n * @template T\n */\nexport class RleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   * @param {function(Decoder):T} reader\n   */\n  constructor (uint8Array, reader) {\n    super(uint8Array)\n    /**\n     * The reader\n     */\n    this.reader = reader\n    /**\n     * Current state\n     * @type {T|null}\n     */\n    this.s = null\n    this.count = 0\n  }\n\n  read () {\n    if (this.count === 0) {\n      this.s = this.reader(this)\n      if (hasContent(this)) {\n        this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n      } else {\n        this.count = -1 // read the current value forever\n      }\n    }\n    this.count--\n    return /** @type {T} */ (this.s)\n  }\n}\n\nexport class IntDiffDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   * @param {number} start\n   */\n  constructor (uint8Array, start) {\n    super(uint8Array)\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n  }\n\n  /**\n   * @return {number}\n   */\n  read () {\n    this.s += readVarInt(this)\n    return this.s\n  }\n}\n\nexport class RleIntDiffDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   * @param {number} start\n   */\n  constructor (uint8Array, start) {\n    super(uint8Array)\n    /**\n     * Current state\n     * @type {number}\n     */\n    this.s = start\n    this.count = 0\n  }\n\n  /**\n   * @return {number}\n   */\n  read () {\n    if (this.count === 0) {\n      this.s += readVarInt(this)\n      if (hasContent(this)) {\n        this.count = readVarUint(this) + 1 // see encoder implementation for the reason why this is incremented\n      } else {\n        this.count = -1 // read the current value forever\n      }\n    }\n    this.count--\n    return /** @type {number} */ (this.s)\n  }\n}\n\nexport class UintOptRleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    super(uint8Array)\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  read () {\n    if (this.count === 0) {\n      this.s = readVarInt(this)\n      // if the sign is negative, we read the count too, otherwise count is 1\n      const isNegative = math.isNegativeZero(this.s)\n      this.count = 1\n      if (isNegative) {\n        this.s = -this.s\n        this.count = readVarUint(this) + 2\n      }\n    }\n    this.count--\n    return /** @type {number} */ (this.s)\n  }\n}\n\nexport class IncUintOptRleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    super(uint8Array)\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n  }\n\n  read () {\n    if (this.count === 0) {\n      this.s = readVarInt(this)\n      // if the sign is negative, we read the count too, otherwise count is 1\n      const isNegative = math.isNegativeZero(this.s)\n      this.count = 1\n      if (isNegative) {\n        this.s = -this.s\n        this.count = readVarUint(this) + 2\n      }\n    }\n    this.count--\n    return /** @type {number} */ (this.s++)\n  }\n}\n\nexport class IntDiffOptRleDecoder extends Decoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    super(uint8Array)\n    /**\n     * @type {number}\n     */\n    this.s = 0\n    this.count = 0\n    this.diff = 0\n  }\n\n  /**\n   * @return {number}\n   */\n  read () {\n    if (this.count === 0) {\n      const diff = readVarInt(this)\n      // if the first bit is set, we read more data\n      const hasCount = diff & 1\n      this.diff = math.floor(diff / 2) // shift >> 1\n      this.count = 1\n      if (hasCount) {\n        this.count = readVarUint(this) + 2\n      }\n    }\n    this.s += this.diff\n    this.count--\n    return this.s\n  }\n}\n\nexport class StringDecoder {\n  /**\n   * @param {Uint8Array} uint8Array\n   */\n  constructor (uint8Array) {\n    this.decoder = new UintOptRleDecoder(uint8Array)\n    this.str = readVarString(this.decoder)\n    /**\n     * @type {number}\n     */\n    this.spos = 0\n  }\n\n  /**\n   * @return {string}\n   */\n  read () {\n    const end = this.spos + this.decoder.read()\n    const res = this.str.slice(this.spos, end)\n    this.spos = end\n    return res\n  }\n}\n","/* eslint-env browser */\n\nexport const subtle = crypto.subtle\nexport const getRandomValues = crypto.getRandomValues.bind(crypto)\n","/**\n * Isomorphic module for true random numbers / buffers / uuids.\n *\n * Attention: falls back to Math.random if the browser does not support crypto.\n *\n * @module random\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\nimport { getRandomValues } from 'lib0/webcrypto'\n\nexport const rand = Math.random\n\nexport const uint32 = () => getRandomValues(new Uint32Array(1))[0]\n\nexport const uint53 = () => {\n  const arr = getRandomValues(new Uint32Array(8))\n  return (arr[0] & binary.BITS21) * (binary.BITS32 + 1) + (arr[1] >>> 0)\n}\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {T}\n */\nexport const oneOf = arr => arr[math.floor(rand() * arr.length)]\n\n// @ts-ignore\nconst uuidv4Template = [1e7] + -1e3 + -4e3 + -8e3 + -1e11\n\n/**\n * @return {string}\n */\nexport const uuidv4 = () => uuidv4Template.replace(/[018]/g, /** @param {number} c */ c =>\n  (c ^ uint32() & 15 >> c / 4).toString(16)\n)\n","/**\n * Utility module to work with time.\n *\n * @module time\n */\n\nimport * as metric from './metric.js'\nimport * as math from './math.js'\n\n/**\n * Return current time.\n *\n * @return {Date}\n */\nexport const getDate = () => new Date()\n\n/**\n * Return current unix time.\n *\n * @return {number}\n */\nexport const getUnixTime = Date.now\n\n/**\n * Transform time (in ms) to a human readable format. E.g. 1100 => 1.1s. 60s => 1min. .001 => 10μs.\n *\n * @param {number} d duration in milliseconds\n * @return {string} humanized approximation of time\n */\nexport const humanizeDuration = d => {\n  if (d < 60000) {\n    const p = metric.prefix(d, -1)\n    return math.round(p.n * 100) / 100 + p.prefix + 's'\n  }\n  d = math.floor(d / 1000)\n  const seconds = d % 60\n  const minutes = math.floor(d / 60) % 60\n  const hours = math.floor(d / 3600) % 24\n  const days = math.floor(d / 86400)\n  if (days > 0) {\n    return days + 'd' + ((hours > 0 || minutes > 30) ? ' ' + (minutes > 30 ? hours + 1 : hours) + 'h' : '')\n  }\n  if (hours > 0) {\n    /* c8 ignore next */\n    return hours + 'h' + ((minutes > 0 || seconds > 30) ? ' ' + (seconds > 30 ? minutes + 1 : minutes) + 'min' : '')\n  }\n  return minutes + 'min' + (seconds > 0 ? ' ' + seconds + 's' : '')\n}\n","/**\n * Utility helpers to work with promises.\n *\n * @module promise\n */\n\nimport * as time from './time.js'\n\n/**\n * @template T\n * @callback PromiseResolve\n * @param {T|PromiseLike<T>} [result]\n */\n\n/**\n * @template T\n * @param {function(PromiseResolve<T>,function(Error):void):any} f\n * @return {Promise<T>}\n */\nexport const create = f => /** @type {Promise<T>} */ (new Promise(f))\n\n/**\n * @param {function(function():void,function(Error):void):void} f\n * @return {Promise<void>}\n */\nexport const createEmpty = f => new Promise(f)\n\n/**\n * `Promise.all` wait for all promises in the array to resolve and return the result\n * @template {unknown[] | []} PS\n *\n * @param {PS} ps\n * @return {Promise<{ -readonly [P in keyof PS]: Awaited<PS[P]> }>}\n */\nexport const all = Promise.all.bind(Promise)\n\n/**\n * @param {Error} [reason]\n * @return {Promise<never>}\n */\nexport const reject = reason => Promise.reject(reason)\n\n/**\n * @template T\n * @param {T|void} res\n * @return {Promise<T|void>}\n */\nexport const resolve = res => Promise.resolve(res)\n\n/**\n * @template T\n * @param {T} res\n * @return {Promise<T>}\n */\nexport const resolveWith = res => Promise.resolve(res)\n\n/**\n * @todo Next version, reorder parameters: check, [timeout, [intervalResolution]]\n * @deprecated use untilAsync instead\n *\n * @param {number} timeout\n * @param {function():boolean} check\n * @param {number} [intervalResolution]\n * @return {Promise<void>}\n */\nexport const until = (timeout, check, intervalResolution = 10) => create((resolve, reject) => {\n  const startTime = time.getUnixTime()\n  const hasTimeout = timeout > 0\n  const untilInterval = () => {\n    if (check()) {\n      clearInterval(intervalHandle)\n      resolve()\n    } else if (hasTimeout) {\n      /* c8 ignore else */\n      if (time.getUnixTime() - startTime > timeout) {\n        clearInterval(intervalHandle)\n        reject(new Error('Timeout'))\n      }\n    }\n  }\n  const intervalHandle = setInterval(untilInterval, intervalResolution)\n})\n\n/**\n * @param {()=>Promise<boolean>|boolean} check\n * @param {number} timeout\n * @param {number} intervalResolution\n * @return {Promise<void>}\n */\nexport const untilAsync = async (check, timeout = 0, intervalResolution = 10) => {\n  const startTime = time.getUnixTime()\n  const noTimeout = timeout <= 0\n  // eslint-disable-next-line no-unmodified-loop-condition\n  while (noTimeout || time.getUnixTime() - startTime <= timeout) {\n    if (await check()) return\n    await wait(intervalResolution)\n  }\n  throw new Error('Timeout')\n}\n\n/**\n * @param {number} timeout\n * @return {Promise<undefined>}\n */\nexport const wait = timeout => create((resolve, _reject) => setTimeout(resolve, timeout))\n\n/**\n * Checks if an object is a promise using ducktyping.\n *\n * Promises are often polyfilled, so it makes sense to add some additional guarantees if the user of this\n * library has some insane environment where global Promise objects are overwritten.\n *\n * @param {any} p\n * @return {boolean}\n */\nexport const isPromise = p => p instanceof Promise || (p && p.then && p.catch && p.finally)\n","/**\n * Often used conditions.\n *\n * @module conditions\n */\n\n/**\n * @template T\n * @param {T|null|undefined} v\n * @return {T|null}\n */\n/* c8 ignore next */\nexport const undefinedToNull = v => v === undefined ? null : v\n","/* eslint-env browser */\n\n/**\n * Isomorphic variable storage.\n *\n * Uses LocalStorage in the browser and falls back to in-memory storage.\n *\n * @module storage\n */\n\n/* c8 ignore start */\nclass VarStoragePolyfill {\n  constructor () {\n    this.map = new Map()\n  }\n\n  /**\n   * @param {string} key\n   * @param {any} newValue\n   */\n  setItem (key, newValue) {\n    this.map.set(key, newValue)\n  }\n\n  /**\n   * @param {string} key\n   */\n  getItem (key) {\n    return this.map.get(key)\n  }\n}\n/* c8 ignore stop */\n\n/**\n * @type {any}\n */\nlet _localStorage = new VarStoragePolyfill()\nlet usePolyfill = true\n\n/* c8 ignore start */\ntry {\n  // if the same-origin rule is violated, accessing localStorage might thrown an error\n  if (typeof localStorage !== 'undefined' && localStorage) {\n    _localStorage = localStorage\n    usePolyfill = false\n  }\n} catch (e) { }\n/* c8 ignore stop */\n\n/**\n * This is basically localStorage in browser, or a polyfill in nodejs\n */\n/* c8 ignore next */\nexport const varStorage = _localStorage\n\n/**\n * A polyfill for `addEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const onChange = eventHandler => usePolyfill || addEventListener('storage', /** @type {any} */ (eventHandler))\n\n/**\n * A polyfill for `removeEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const offChange = eventHandler => usePolyfill || removeEventListener('storage', /** @type {any} */ (eventHandler))\n","export const EqualityTraitSymbol = Symbol('Equality')\n\n/**\n * @typedef {{ [EqualityTraitSymbol]:(other:EqualityTrait)=>boolean }} EqualityTrait\n */\n\n/**\n *\n * Utility function to compare any two objects.\n *\n * Note that it is expected that the first parameter is more specific than the latter one.\n *\n * @example js\n *     class X { [traits.EqualityTraitSymbol] (other) { return other === this }  }\n *     class X2 { [traits.EqualityTraitSymbol] (other) { return other === this }, x2 () { return 2 }  }\n *     // this is fine\n *     traits.equals(new X2(), new X())\n *     // this is not, because the left type is less specific than the right one\n *     traits.equals(new X(), new X2())\n *\n * @template {EqualityTrait} T\n * @param {NoInfer<T>} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equals = (a, b) => a === b || !!a?.[EqualityTraitSymbol]?.(b) || false\n","import * as equalityTrait from './trait/equality.js'\n\n/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * @param {any} o\n * @return {o is { [k:string]:any }}\n */\nexport const isObject = o => typeof o === 'object'\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[key:string]: V}} obj\n * @return {Array<V>}\n */\nexport const values = Object.values\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n  for (const key in obj) {\n    f(obj[key], key)\n  }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n  const results = []\n  for (const key in obj) {\n    results.push(f(obj[key], key))\n  }\n  return results\n}\n\n/**\n * @deprecated use object.size instead\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const size = obj => keys(obj).length\n\n/**\n * @template {{ [key:string|number|symbol]: any }} T\n * @param {T} obj\n * @param {(v:T[keyof T],k:keyof T)=>boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n  for (const key in obj) {\n    if (f(obj[key], key)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * @param {Object|null|undefined} obj\n */\nexport const isEmpty = obj => {\n  // eslint-disable-next-line no-unreachable-loop\n  for (const _k in obj) {\n    return false\n  }\n  return true\n}\n\n/**\n * @template {{ [key:string|number|symbol]: any }} T\n * @param {T} obj\n * @param {(v:T[keyof T],k:keyof T)=>boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n  for (const key in obj) {\n    if (!f(obj[key], key)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|number|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && equalityTrait.equals(b[key], val)))\n\n/**\n * Make an object immutable. This hurts performance and is usually not needed if you perform good\n * coding practices.\n */\nexport const freeze = Object.freeze\n\n/**\n * Make an object and all its children immutable.\n * This *really* hurts performance and is usually not needed if you perform good coding practices.\n *\n * @template {any} T\n * @param {T} o\n * @return {Readonly<T>}\n */\nexport const deepFreeze = (o) => {\n  for (const key in o) {\n    const c = o[key]\n    if (typeof c === 'object' || typeof c === 'function') {\n      deepFreeze(o[key])\n    }\n  }\n  return freeze(o)\n}\n\n/**\n * Get object property. Create T if property is undefined and set T on object.\n *\n * @function\n * @template {object} KV\n * @template {keyof KV} [K=keyof KV]\n * @param {KV} o\n * @param {K} key\n * @param {() => KV[K]} createT\n * @return {KV[K]}\n */\nexport const setIfUndefined = (o, key, createT) => hasProperty(o, key) ? o[key] : (o[key] = createT())\n","/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\nimport * as equalityTrait from './trait/equality.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n  try {\n    for (; i < fs.length; i++) {\n      fs[i](...args)\n    }\n  } finally {\n    if (i < fs.length) {\n      callAll(fs, args, i + 1)\n    }\n  }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n  if (a === b) {\n    return true\n  }\n  if (a == null || b == null || (a.constructor !== b.constructor && (a.constructor || Object) !== (b.constructor || Object))) {\n    return false\n  }\n  if (a[equalityTrait.EqualityTraitSymbol] != null) {\n    return a[equalityTrait.EqualityTraitSymbol](b)\n  }\n  switch (a.constructor) {\n    case ArrayBuffer:\n      a = new Uint8Array(a)\n      b = new Uint8Array(b)\n    // eslint-disable-next-line no-fallthrough\n    case Uint8Array: {\n      if (a.byteLength !== b.byteLength) {\n        return false\n      }\n      for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) {\n          return false\n        }\n      }\n      break\n    }\n    case Set: {\n      if (a.size !== b.size) {\n        return false\n      }\n      for (const value of a) {\n        if (!b.has(value)) {\n          return false\n        }\n      }\n      break\n    }\n    case Map: {\n      if (a.size !== b.size) {\n        return false\n      }\n      for (const key of a.keys()) {\n        if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n          return false\n        }\n      }\n      break\n    }\n    case undefined:\n    case Object:\n      if (object.size(a) !== object.size(b)) {\n        return false\n      }\n      for (const key in a) {\n        if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n          return false\n        }\n      }\n      break\n    case Array:\n      if (a.length !== b.length) {\n        return false\n      }\n      for (let i = 0; i < a.length; i++) {\n        if (!equalityDeep(a[i], b[i])) {\n          return false\n        }\n      }\n      break\n    default:\n      return false\n  }\n  return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n  /**\n   * @param {any} n\n   * @return {n is InstanceType<TYPE>}\n   **/\n  n => n && n.constructor === T\n","/**\n * Isomorphic module to work access the environment (query params, env variables).\n *\n * @module environment\n */\n\nimport * as map from './map.js'\nimport * as string from './string.js'\nimport * as conditions from './conditions.js'\nimport * as storage from './storage.js'\nimport * as f from './function.js'\n\n/* c8 ignore next 2 */\n// @ts-ignore\nexport const isNode = typeof process !== 'undefined' && process.release && /node|io\\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n\n/* c8 ignore next */\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && !isNode\n/* c8 ignore next 3 */\nexport const isMac = typeof navigator !== 'undefined'\n  ? /Mac/.test(navigator.platform)\n  : false\n\n/**\n * @type {Map<string,string>}\n */\nlet params\nconst args = []\n\n/* c8 ignore start */\nconst computeParams = () => {\n  if (params === undefined) {\n    if (isNode) {\n      params = map.create()\n      const pargs = process.argv\n      let currParamName = null\n      for (let i = 0; i < pargs.length; i++) {\n        const parg = pargs[i]\n        if (parg[0] === '-') {\n          if (currParamName !== null) {\n            params.set(currParamName, '')\n          }\n          currParamName = parg\n        } else {\n          if (currParamName !== null) {\n            params.set(currParamName, parg)\n            currParamName = null\n          } else {\n            args.push(parg)\n          }\n        }\n      }\n      if (currParamName !== null) {\n        params.set(currParamName, '')\n      }\n      // in ReactNative for example this would not be true (unless connected to the Remote Debugger)\n    } else if (typeof location === 'object') {\n      params = map.create(); // eslint-disable-next-line no-undef\n      (location.search || '?').slice(1).split('&').forEach((kv) => {\n        if (kv.length !== 0) {\n          const [key, value] = kv.split('=')\n          params.set(`--${string.fromCamelCase(key, '-')}`, value)\n          params.set(`-${string.fromCamelCase(key, '-')}`, value)\n        }\n      })\n    } else {\n      params = map.create()\n    }\n  }\n  return params\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next */\nexport const hasParam = (name) => computeParams().has(name)\n\n/**\n * @param {string} name\n * @param {string} defaultVal\n * @return {string}\n */\n/* c8 ignore next 2 */\nexport const getParam = (name, defaultVal) =>\n  computeParams().get(name) || defaultVal\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 4 */\nexport const getVariable = (name) =>\n  isNode\n    ? conditions.undefinedToNull(process.env[name.toUpperCase().replaceAll('-', '_')])\n    : conditions.undefinedToNull(storage.varStorage.getItem(name))\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 2 */\nexport const getConf = (name) =>\n  computeParams().get('--' + name) || getVariable(name)\n\n/**\n * @param {string} name\n * @return {string}\n */\n/* c8 ignore next 5 */\nexport const ensureConf = (name) => {\n  const c = getConf(name)\n  if (c == null) throw new Error(`Expected configuration \"${name.toUpperCase().replaceAll('-', '_')}\"`)\n  return c\n}\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next 2 */\nexport const hasConf = (name) =>\n  hasParam('--' + name) || getVariable(name) !== null\n\n/* c8 ignore next */\nexport const production = hasConf('production')\n\n/* c8 ignore next 2 */\nconst forceColor = isNode &&\n  f.isOneOf(process.env.FORCE_COLOR, ['true', '1', '2'])\n\n/* c8 ignore start */\n/**\n * Color is enabled by default if the terminal supports it.\n *\n * Explicitly enable color using `--color` parameter\n * Disable color using `--no-color` parameter or using `NO_COLOR=1` environment variable.\n * `FORCE_COLOR=1` enables color and takes precedence over all.\n */\nexport const supportsColor = forceColor || (\n  !hasParam('--no-colors') && // @todo deprecate --no-colors\n  !hasConf('no-color') &&\n  (!isNode || process.stdout.isTTY) && (\n    !isNode ||\n    hasParam('--color') ||\n    getVariable('COLORTERM') !== null ||\n    (getVariable('TERM') || '').includes('color')\n  )\n)\n/* c8 ignore stop */\n","/**\n * Utility functions to work with buffers (Uint8Array).\n *\n * @module buffer\n */\n\nimport * as string from './string.js'\nimport * as env from './environment.js'\nimport * as array from './array.js'\nimport * as math from './math.js'\nimport * as encoding from './encoding.js'\nimport * as decoding from './decoding.js'\n\n/**\n * @param {number} len\n */\nexport const createUint8ArrayFromLen = len => new Uint8Array(len)\n\n/**\n * Create Uint8Array with initial content from buffer\n *\n * @param {ArrayBuffer} buffer\n * @param {number} byteOffset\n * @param {number} length\n */\nexport const createUint8ArrayViewFromArrayBuffer = (buffer, byteOffset, length) => new Uint8Array(buffer, byteOffset, length)\n\n/**\n * Create Uint8Array with initial content from buffer\n *\n * @param {ArrayBuffer} buffer\n */\nexport const createUint8ArrayFromArrayBuffer = buffer => new Uint8Array(buffer)\n\n/* c8 ignore start */\n/**\n * @param {Uint8Array} bytes\n * @return {string}\n */\nconst toBase64Browser = bytes => {\n  let s = ''\n  for (let i = 0; i < bytes.byteLength; i++) {\n    s += string.fromCharCode(bytes[i])\n  }\n  // eslint-disable-next-line no-undef\n  return btoa(s)\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} bytes\n * @return {string}\n */\nconst toBase64Node = bytes => Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('base64')\n\n/* c8 ignore start */\n/**\n * @param {string} s\n * @return {Uint8Array<ArrayBuffer>}\n */\nconst fromBase64Browser = s => {\n  // eslint-disable-next-line no-undef\n  const a = atob(s)\n  const bytes = createUint8ArrayFromLen(a.length)\n  for (let i = 0; i < a.length; i++) {\n    bytes[i] = a.charCodeAt(i)\n  }\n  return bytes\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} s\n */\nconst fromBase64Node = s => {\n  const buf = Buffer.from(s, 'base64')\n  return createUint8ArrayViewFromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength)\n}\n\n/* c8 ignore next */\nexport const toBase64 = env.isBrowser ? toBase64Browser : toBase64Node\n\n/* c8 ignore next */\nexport const fromBase64 = env.isBrowser ? fromBase64Browser : fromBase64Node\n\n/**\n * Implements base64url - see https://datatracker.ietf.org/doc/html/rfc4648#section-5\n * @param {Uint8Array} buf\n */\nexport const toBase64UrlEncoded = buf => toBase64(buf).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '')\n\n/**\n * @param {string} base64\n */\nexport const fromBase64UrlEncoded = base64 => fromBase64(base64.replaceAll('-', '+').replaceAll('_', '/'))\n\n/**\n * Base64 is always a more efficient choice. This exists for utility purposes only.\n *\n * @param {Uint8Array} buf\n */\nexport const toHexString = buf => array.map(buf, b => b.toString(16).padStart(2, '0')).join('')\n\n/**\n * Note: This function expects that the hex doesn't start with 0x..\n *\n * @param {string} hex\n */\nexport const fromHexString = hex => {\n  const hlen = hex.length\n  const buf = new Uint8Array(math.ceil(hlen / 2))\n  for (let i = 0; i < hlen; i += 2) {\n    buf[buf.length - i / 2 - 1] = Number.parseInt(hex.slice(hlen - i - 2, hlen - i), 16)\n  }\n  return buf\n}\n\n/**\n * Copy the content of an Uint8Array view to a new ArrayBuffer.\n *\n * @param {Uint8Array} uint8Array\n * @return {Uint8Array}\n */\nexport const copyUint8Array = uint8Array => {\n  const newBuf = createUint8ArrayFromLen(uint8Array.byteLength)\n  newBuf.set(uint8Array)\n  return newBuf\n}\n\n/**\n * Encode anything as a UInt8Array. It's a pun on typescripts's `any` type.\n * See encoding.writeAny for more information.\n *\n * @param {any} data\n * @return {Uint8Array}\n */\nexport const encodeAny = data =>\n  encoding.encode(encoder => encoding.writeAny(encoder, data))\n\n/**\n * Decode an any-encoded value.\n *\n * @param {Uint8Array} buf\n * @return {any}\n */\nexport const decodeAny = buf => decoding.readAny(decoding.createDecoder(buf))\n\n/**\n * Shift Byte Array {N} bits to the left. Does not expand byte array.\n *\n * @param {Uint8Array} bs\n * @param {number} N should be in the range of [0-7]\n */\nexport const shiftNBitsLeft = (bs, N) => {\n  if (N === 0) return bs\n  bs = new Uint8Array(bs)\n  bs[0] <<= N\n  for (let i = 1; i < bs.length; i++) {\n    bs[i - 1] |= bs[i] >>> (8 - N)\n    bs[i] <<= N\n  }\n  return bs\n}\n","/**\n * Working with value pairs.\n *\n * @module pair\n */\n\n/**\n * @template L,R\n */\nexport class Pair {\n  /**\n   * @param {L} left\n   * @param {R} right\n   */\n  constructor (left, right) {\n    this.left = left\n    this.right = right\n  }\n}\n\n/**\n * @template L,R\n * @param {L} left\n * @param {R} right\n * @return {Pair<L,R>}\n */\nexport const create = (left, right) => new Pair(left, right)\n\n/**\n * @template L,R\n * @param {R} right\n * @param {L} left\n * @return {Pair<L,R>}\n */\nexport const createReversed = (right, left) => new Pair(left, right)\n\n/**\n * @template L,R\n * @param {Array<Pair<L,R>>} arr\n * @param {function(L, R):any} f\n */\nexport const forEach = (arr, f) => arr.forEach(p => f(p.left, p.right))\n\n/**\n * @template L,R,X\n * @param {Array<Pair<L,R>>} arr\n * @param {function(L, R):X} f\n * @return {Array<X>}\n */\nexport const map = (arr, f) => arr.map(p => f(p.left, p.right))\n","/**\n * Fast Pseudo Random Number Generators.\n *\n * Given a seed a PRNG generates a sequence of numbers that cannot be reasonably predicted.\n * Two PRNGs must generate the same random sequence of numbers if  given the same seed.\n *\n * @module prng\n */\n\nimport * as binary from './binary.js'\nimport { fromCharCode, fromCodePoint } from './string.js'\nimport * as math from './math.js'\nimport { Xoroshiro128plus } from './prng/Xoroshiro128plus.js'\nimport * as buffer from './buffer.js'\n\n/**\n * Description of the function\n *  @callback generatorNext\n *  @return {number} A random float in the cange of [0,1)\n */\n\n/**\n * A random type generator.\n *\n * @typedef {Object} PRNG\n * @property {generatorNext} next Generate new number\n */\nexport const DefaultPRNG = Xoroshiro128plus\n\n/**\n * Create a Xoroshiro128plus Pseudo-Random-Number-Generator.\n * This is the fastest full-period generator passing BigCrush without systematic failures.\n * But there are more PRNGs available in ./PRNG/.\n *\n * @param {number} seed A positive 32bit integer. Do not use negative numbers.\n * @return {PRNG}\n */\nexport const create = seed => new DefaultPRNG(seed)\n\n/**\n * Generates a single random bool.\n *\n * @param {PRNG} gen A random number generator.\n * @return {Boolean} A random boolean\n */\nexport const bool = gen => (gen.next() >= 0.5)\n\n/**\n * Generates a random integer with 53 bit resolution.\n *\n * @param {PRNG} gen A random number generator.\n * @param {Number} min The lower bound of the allowed return values (inclusive).\n * @param {Number} max The upper bound of the allowed return values (inclusive).\n * @return {Number} A random integer on [min, max]\n */\nexport const int53 = (gen, min, max) => math.floor(gen.next() * (max + 1 - min) + min)\n\n/**\n * Generates a random integer with 53 bit resolution.\n *\n * @param {PRNG} gen A random number generator.\n * @param {Number} min The lower bound of the allowed return values (inclusive).\n * @param {Number} max The upper bound of the allowed return values (inclusive).\n * @return {Number} A random integer on [min, max]\n */\nexport const uint53 = (gen, min, max) => math.abs(int53(gen, min, max))\n\n/**\n * Generates a random integer with 32 bit resolution.\n *\n * @param {PRNG} gen A random number generator.\n * @param {Number} min The lower bound of the allowed return values (inclusive).\n * @param {Number} max The upper bound of the allowed return values (inclusive).\n * @return {Number} A random integer on [min, max]\n */\nexport const int32 = (gen, min, max) => math.floor(gen.next() * (max + 1 - min) + min)\n\n/**\n * Generates a random integer with 53 bit resolution.\n *\n * @param {PRNG} gen A random number generator.\n * @param {Number} min The lower bound of the allowed return values (inclusive).\n * @param {Number} max The upper bound of the allowed return values (inclusive).\n * @return {Number} A random integer on [min, max]\n */\nexport const uint32 = (gen, min, max) => int32(gen, min, max) >>> 0\n\n/**\n * @deprecated\n * Optimized version of prng.int32. It has the same precision as prng.int32, but should be preferred when\n * openaring on smaller ranges.\n *\n * @param {PRNG} gen A random number generator.\n * @param {Number} min The lower bound of the allowed return values (inclusive).\n * @param {Number} max The upper bound of the allowed return values (inclusive). The max inclusive number is `binary.BITS31-1`\n * @return {Number} A random integer on [min, max]\n */\nexport const int31 = (gen, min, max) => int32(gen, min, max)\n\n/**\n * Generates a random real on [0, 1) with 53 bit resolution.\n *\n * @param {PRNG} gen A random number generator.\n * @return {Number} A random real number on [0, 1).\n */\nexport const real53 = gen => gen.next() // (((gen.next() >>> 5) * binary.BIT26) + (gen.next() >>> 6)) / MAX_SAFE_INTEGER\n\n/**\n * Generates a random character from char code 32 - 126. I.e. Characters, Numbers, special characters, and Space:\n *\n * @param {PRNG} gen A random number generator.\n * @return {string}\n *\n * (Space)!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_`abcdefghijklmnopqrstuvwxyz{|}~\n */\nexport const char = gen => fromCharCode(int31(gen, 32, 126))\n\n/**\n * @param {PRNG} gen\n * @return {string} A single letter (a-z)\n */\nexport const letter = gen => fromCharCode(int31(gen, 97, 122))\n\n/**\n * @param {PRNG} gen\n * @param {number} [minLen=0]\n * @param {number} [maxLen=20]\n * @return {string} A random word (0-20 characters) without spaces consisting of letters (a-z)\n */\nexport const word = (gen, minLen = 0, maxLen = 20) => {\n  const len = int31(gen, minLen, maxLen)\n  let str = ''\n  for (let i = 0; i < len; i++) {\n    str += letter(gen)\n  }\n  return str\n}\n\n/**\n * TODO: this function produces invalid runes. Does not cover all of utf16!!\n *\n * @param {PRNG} gen\n * @return {string}\n */\nexport const utf16Rune = gen => {\n  const codepoint = int31(gen, 0, 256)\n  return fromCodePoint(codepoint)\n}\n\n/**\n * @param {PRNG} gen\n * @param {number} [maxlen = 20]\n */\nexport const utf16String = (gen, maxlen = 20) => {\n  const len = int31(gen, 0, maxlen)\n  let str = ''\n  for (let i = 0; i < len; i++) {\n    str += utf16Rune(gen)\n  }\n  return str\n}\n\n/**\n * Returns one element of a given array.\n *\n * @param {PRNG} gen A random number generator.\n * @param {Array<T>} array Non empty Array of possible values.\n * @return {T} One of the values of the supplied Array.\n * @template T\n */\nexport const oneOf = (gen, array) => array[int31(gen, 0, array.length - 1)]\n\n/**\n * @param {PRNG} gen\n * @param {number} len\n * @return {Uint8Array<ArrayBuffer>}\n */\nexport const uint8Array = (gen, len) => {\n  const buf = buffer.createUint8ArrayFromLen(len)\n  for (let i = 0; i < buf.length; i++) {\n    buf[i] = int32(gen, 0, binary.BITS8)\n  }\n  return buf\n}\n\n/* c8 ignore start */\n/**\n * @param {PRNG} gen\n * @param {number} len\n * @return {Uint16Array}\n */\nexport const uint16Array = (gen, len) => new Uint16Array(uint8Array(gen, len * 2).buffer)\n\n/**\n * @param {PRNG} gen\n * @param {number} len\n * @return {Uint32Array}\n */\nexport const uint32Array = (gen, len) => new Uint32Array(uint8Array(gen, len * 4).buffer)\n/* c8 ignore stop */\n","/**\n * @experimental WIP\n *\n * Simple & efficient schemas for your data.\n */\n\nimport * as obj from './object.js'\nimport * as arr from './array.js'\nimport * as error from './error.js'\nimport * as env from './environment.js'\nimport * as equalityTraits from './trait/equality.js'\nimport * as fun from './function.js'\nimport * as string from './string.js'\nimport * as prng from './prng.js'\nimport * as number from './number.js'\n\n/**\n * @typedef {string|number|bigint|boolean|null|undefined|symbol} Primitive\n */\n\n/**\n * @typedef {{ [k:string|number|symbol]: any }} AnyObject\n */\n\n/**\n * @template T\n * @typedef {T extends Schema<infer X> ? X : T} Unwrap\n */\n\n/**\n * @template T\n * @typedef {T extends Schema<infer X> ? X : T} TypeOf\n */\n\n/**\n * @template {readonly unknown[]} T\n * @typedef {T extends readonly [Schema<infer First>, ...infer Rest] ? [First, ...UnwrapArray<Rest>] : [] } UnwrapArray\n */\n\n/**\n * @template T\n * @typedef {T extends Schema<infer S> ? Schema<S> : never} CastToSchema\n */\n\n/**\n * @template {unknown[]} Arr\n * @typedef {Arr extends [...unknown[], infer L] ? L : never} TupleLast\n */\n\n/**\n * @template {unknown[]} Arr\n * @typedef {Arr extends [...infer Fs, unknown] ? Fs : never} TuplePop\n */\n\n/**\n * @template {readonly unknown[]} T\n * @typedef {T extends []\n *   ? {}\n *   : T extends [infer First]\n *   ? First\n *   : T extends [infer First, ...infer Rest]\n *   ? First & Intersect<Rest>\n *   : never\n * } Intersect\n */\n\nconst schemaSymbol = Symbol('0schema')\n\nexport class ValidationError {\n  constructor () {\n    /**\n     * Reverse errors\n     * @type {Array<{ path: string?, expected: string, has: string, message: string? }>}\n     */\n    this._rerrs = []\n  }\n\n  /**\n   * @param {string?} path\n   * @param {string} expected\n   * @param {string} has\n   * @param {string?} message\n   */\n  extend (path, expected, has, message = null) {\n    this._rerrs.push({ path, expected, has, message })\n  }\n\n  toString () {\n    const s = []\n    for (let i = this._rerrs.length - 1; i > 0; i--) {\n      const r = this._rerrs[i]\n      /* c8 ignore next */\n      s.push(string.repeat(' ', (this._rerrs.length - i) * 2) + `${r.path != null ? `[${r.path}] ` : ''}${r.has} doesn't match ${r.expected}. ${r.message}`)\n    }\n    return s.join('\\n')\n  }\n}\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nconst shapeExtends = (a, b) => {\n  if (a === b) return true\n  if (a == null || b == null || a.constructor !== b.constructor) return false\n  if (a[equalityTraits.EqualityTraitSymbol]) return equalityTraits.equals(a, b) // last resort: check equality (do this before array and obj check which don't implement the equality trait)\n  if (arr.isArray(a)) {\n    return arr.every(a, aitem =>\n      arr.some(b, bitem => shapeExtends(aitem, bitem))\n    )\n  } else if (obj.isObject(a)) {\n    return obj.every(a, (aitem, akey) =>\n      shapeExtends(aitem, b[akey])\n    )\n  }\n  /* c8 ignore next */\n  return false\n}\n\n/**\n * @template T\n * @implements {equalityTraits.EqualityTrait}\n */\nexport class Schema {\n  // this.shape must not be defined on Schema. Otherwise typecheck on metatypes (e.g. $$object) won't work as expected anymore\n  /**\n   * If true, the more things are added to the shape the more objects this schema will accept (e.g.\n   * union). By default, the more objects are added, the the fewer objects this schema will accept.\n   * @protected\n   */\n  static _dilutes = false\n\n  /**\n   * @param {Schema<any>} other\n   */\n  extends (other) {\n    let [a, b] = [/** @type {any} */(this).shape, /** @type {any} */ (other).shape]\n    if (/** @type {typeof Schema<any>} */ (this.constructor)._dilutes) [b, a] = [a, b]\n    return shapeExtends(a, b)\n  }\n\n  /**\n   * Overwrite this when necessary. By default, we only check the `shape` property which every shape\n   * should have.\n   * @param {Schema<any>} other\n   */\n  equals (other) {\n    // @ts-ignore\n    return this.constructor === other.constructor && fun.equalityDeep(this.shape, other.shape)\n  }\n\n  [schemaSymbol] () { return true }\n\n  /**\n   * @param {object} other\n   */\n  [equalityTraits.EqualityTraitSymbol] (other) {\n    return this.equals(/** @type {any} */ (other))\n  }\n\n  /**\n   * Use `schema.validate(obj)` with a typed parameter that is already of typed to be an instance of\n   * Schema. Validate will check the structure of the parameter and return true iff the instance\n   * really is an instance of Schema.\n   *\n   * @param {T} o\n   * @return {boolean}\n   */\n  validate (o) {\n    return this.check(o)\n  }\n\n  /* c8 ignore start */\n  /**\n   * Similar to validate, but this method accepts untyped parameters.\n   *\n   * @param {any} _o\n   * @param {ValidationError} [_err]\n   * @return {_o is T}\n   */\n  check (_o, _err) {\n    error.methodUnimplemented()\n  }\n  /* c8 ignore stop */\n\n  /**\n   * @type {Schema<T?>}\n   */\n  get nullable () {\n    // @ts-ignore\n    return $union(this, $null)\n  }\n\n  /**\n   * @type {$Optional<Schema<T>>}\n   */\n  get optional () {\n    return new $Optional(/** @type {Schema<T>} */ (this))\n  }\n\n  /**\n   * Cast a variable to a specific type. Returns the casted value, or throws an exception otherwise.\n   * Use this if you know that the type is of a specific type and you just want to convince the type\n   * system.\n   *\n   * **Do not rely on these error messages!**\n   * Performs an assertion check only if not in a production environment.\n   *\n   * @template OO\n   * @param {OO} o\n   * @return {Extract<OO, T> extends never ? T : (OO extends Array<never> ? T : Extract<OO,T>)}\n   */\n  cast (o) {\n    assert(o, this)\n    return /** @type {any} */ (o)\n  }\n\n  /**\n   * EXPECTO PATRONUM!! 🪄\n   * This function protects against type errors. Though it may not work in the real world.\n   *\n   * \"After all this time?\"\n   * \"Always.\" - Snape, talking about type safety\n   *\n   * Ensures that a variable is a a specific type. Returns the value, or throws an exception if the assertion check failed.\n   * Use this if you know that the type is of a specific type and you just want to convince the type\n   * system.\n   *\n   * Can be useful when defining lambdas: `s.lambda(s.$number, s.$void).expect((n) => n + 1)`\n   *\n   * **Do not rely on these error messages!**\n   * Performs an assertion check if not in a production environment.\n   *\n   * @param {T} o\n   * @return {o extends T ? T : never}\n   */\n  expect (o) {\n    assert(o, this)\n    return o\n  }\n}\n\n/**\n * @template {(new (...args:any[]) => any) | ((...args:any[]) => any)} Constr\n * @typedef {Constr extends ((...args:any[]) => infer T) ? T : (Constr extends (new (...args:any[]) => any) ? InstanceType<Constr> : never)} Instance\n */\n\n/**\n * @template {(new (...args:any[]) => any) | ((...args:any[]) => any)} C\n * @extends {Schema<Instance<C>>}\n */\nexport class $ConstructedBy extends Schema {\n  /**\n   * @param {C} c\n   * @param {((o:Instance<C>)=>boolean)|null} check\n   */\n  constructor (c, check) {\n    super()\n    this.shape = c\n    this._c = check\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is C extends ((...args:any[]) => infer T) ? T : (C extends (new (...args:any[]) => any) ? InstanceType<C> : never)} o\n   */\n  check (o, err = undefined) {\n    const c = o?.constructor === this.shape && (this._c == null || this._c(o))\n    /* c8 ignore next */\n    !c && err?.extend(null, this.shape.name, o?.constructor.name, o?.constructor !== this.shape ? 'Constructor match failed' : 'Check failed')\n    return c\n  }\n}\n\n/**\n * @template {(new (...args:any[]) => any) | ((...args:any[]) => any)} C\n * @param {C} c\n * @param {((o:Instance<C>) => boolean)|null} check\n * @return {CastToSchema<$ConstructedBy<C>>}\n */\nexport const $constructedBy = (c, check = null) => new $ConstructedBy(c, check)\nexport const $$constructedBy = $constructedBy($ConstructedBy)\n\n/**\n * Check custom properties on any object. You may want to overwrite the generated Schema<any>.\n *\n * @extends {Schema<any>}\n */\nexport class $Custom extends Schema {\n  /**\n   * @param {(o:any) => boolean} check\n   */\n  constructor (check) {\n    super()\n    /**\n     * @type {(o:any) => boolean}\n     */\n    this.shape = check\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} err\n   * @return {o is any}\n   */\n  check (o, err) {\n    const c = this.shape(o)\n    /* c8 ignore next */\n    !c && err?.extend(null, 'custom prop', o?.constructor.name, 'failed to check custom prop')\n    return c\n  }\n}\n\n/**\n * @param {(o:any) => boolean} check\n * @return {Schema<any>}\n */\nexport const $custom = (check) => new $Custom(check)\nexport const $$custom = $constructedBy($Custom)\n\n/**\n * @template {Primitive} T\n * @extends {Schema<T>}\n */\nexport class $Literal extends Schema {\n  /**\n   * @param {Array<T>} literals\n   */\n  constructor (literals) {\n    super()\n    this.shape = literals\n  }\n\n  /**\n   *\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is T}\n   */\n  check (o, err) {\n    const c = this.shape.some(a => a === o)\n    /* c8 ignore next */\n    !c && err?.extend(null, this.shape.join(' | '), o.toString())\n    return c\n  }\n}\n\n/**\n * @template {Primitive[]} T\n * @param {T} literals\n * @return {CastToSchema<$Literal<T[number]>>}\n */\nexport const $literal = (...literals) => new $Literal(literals)\nexport const $$literal = $constructedBy($Literal)\n\n/**\n * @template {Array<string|Schema<string|number>>} Ts\n * @typedef {Ts extends [] ? `` : (Ts extends [infer T] ? (Unwrap<T> extends (string|number) ? Unwrap<T> : never) : (Ts extends [infer T1, ...infer Rest] ? `${Unwrap<T1> extends (string|number) ? Unwrap<T1> : never}${Rest extends Array<string|Schema<string|number>> ? CastStringTemplateArgsToTemplate<Rest> : never}` : never))} CastStringTemplateArgsToTemplate\n */\n\n/**\n * @param {string} str\n * @return {string}\n */\nconst _regexEscape = /** @type {any} */ (RegExp).escape || /** @type {(str:string) => string} */ (str =>\n  str.replace(/[().|&,$^[\\]]/g, s => '\\\\' + s)\n)\n\n/**\n * @param {string|Schema<any>} s\n * @return {string[]}\n */\nconst _schemaStringTemplateToRegex = s => {\n  if ($string.check(s)) {\n    return [_regexEscape(s)]\n  }\n  if ($$literal.check(s)) {\n    return /** @type {Array<string|number>} */ (s.shape).map(v => v + '')\n  }\n  if ($$number.check(s)) {\n    return ['[+-]?\\\\d+.?\\\\d*']\n  }\n  if ($$string.check(s)) {\n    return ['.*']\n  }\n  if ($$union.check(s)) {\n    return s.shape.map(_schemaStringTemplateToRegex).flat(1)\n  }\n  /* c8 ignore next 2 */\n  // unexpected schema structure (only supports unions and string in literal types)\n  error.unexpectedCase()\n}\n\n/**\n * @template {Array<string|Schema<string|number>>} T\n * @extends {Schema<CastStringTemplateArgsToTemplate<T>>}\n */\nexport class $StringTemplate extends Schema {\n  /**\n   * @param {T} shape\n   */\n  constructor (shape) {\n    super()\n    this.shape = shape\n    this._r = new RegExp('^' + shape.map(_schemaStringTemplateToRegex).map(opts => `(${opts.join('|')})`).join('') + '$')\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is CastStringTemplateArgsToTemplate<T>}\n   */\n  check (o, err) {\n    const c = this._r.exec(o) != null\n    /* c8 ignore next */\n    !c && err?.extend(null, this._r.toString(), o.toString(), 'String doesn\\'t match string template.')\n    return c\n  }\n}\n\n/**\n * @template {Array<string|Schema<string|number>>} T\n * @param {T} literals\n * @return {CastToSchema<$StringTemplate<T>>}\n */\nexport const $stringTemplate = (...literals) => new $StringTemplate(literals)\nexport const $$stringTemplate = $constructedBy($StringTemplate)\n\nconst isOptionalSymbol = Symbol('optional')\n/**\n * @template {Schema<any>} S\n * @extends Schema<Unwrap<S>|undefined>\n */\nclass $Optional extends Schema {\n  /**\n   * @param {S} shape\n   */\n  constructor (shape) {\n    super()\n    this.shape = shape\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is (Unwrap<S>|undefined)}\n   */\n  check (o, err) {\n    const c = o === undefined || this.shape.check(o)\n    /* c8 ignore next */\n    !c && err?.extend(null, 'undefined (optional)', '()')\n    return c\n  }\n\n  get [isOptionalSymbol] () { return true }\n}\nexport const $$optional = $constructedBy($Optional)\n\n/**\n * @extends Schema<never>\n */\nclass $Never extends Schema {\n  /**\n   * @param {any} _o\n   * @param {ValidationError} [err]\n   * @return {_o is never}\n   */\n  check (_o, err) {\n    /* c8 ignore next */\n    err?.extend(null, 'never', typeof _o)\n    return false\n  }\n}\n\n/**\n * @type {Schema<never>}\n */\nexport const $never = new $Never()\nexport const $$never = $constructedBy($Never)\n\n/**\n * @template {{ [key: string|symbol|number]: Schema<any> }} S\n * @typedef {{ [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? Key : never]?: S[Key] extends $Optional<Schema<infer Type>> ? Type : never } & { [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? never : Key]: S[Key] extends Schema<infer Type> ? Type : never }} $ObjectToType\n */\n\n/**\n * @template {{[key:string|symbol|number]: Schema<any>}} S\n * @extends {Schema<$ObjectToType<S>>}\n */\nexport class $Object extends Schema {\n  /**\n   * @param {S} shape\n   * @param {boolean} partial\n   */\n  constructor (shape, partial = false) {\n    super()\n    /**\n     * @type {S}\n     */\n    this.shape = shape\n    this._isPartial = partial\n  }\n\n  static _dilutes = true\n\n  /**\n   * @type {Schema<Partial<$ObjectToType<S>>>}\n   */\n  get partial () {\n    return new $Object(this.shape, true)\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} err\n   * @return {o is $ObjectToType<S>}\n   */\n  check (o, err) {\n    if (o == null) {\n      /* c8 ignore next */\n      err?.extend(null, 'object', 'null')\n      return false\n    }\n    return obj.every(this.shape, (vv, vk) => {\n      const c = (this._isPartial && !obj.hasProperty(o, vk)) || vv.check(o[vk], err)\n      !c && err?.extend(vk.toString(), vv.toString(), typeof o[vk], 'Object property does not match')\n      return c\n    })\n  }\n}\n\n/**\n * @template S\n * @typedef {Schema<{ [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? Key : never]?: S[Key] extends $Optional<Schema<infer Type>> ? Type : never } & { [Key in keyof S as S[Key] extends $Optional<Schema<any>> ? never : Key]: S[Key] extends Schema<infer Type> ? Type : never }>} _ObjectDefToSchema\n */\n\n// I used an explicit type annotation instead of $ObjectToType, so that the user doesn't see the\n// weird type definitions when inspecting type definions.\n/**\n * @template {{ [key:string|symbol|number]: Schema<any> }} S\n * @param {S} def\n * @return {_ObjectDefToSchema<S> extends Schema<infer S> ? Schema<{ [K in keyof S]: S[K] }> : never}\n */\nexport const $object = def => /** @type {any} */ (new $Object(def))\nexport const $$object = $constructedBy($Object)\n/**\n * @type {Schema<{[key:string]: any}>}\n */\nexport const $objectAny = $custom(o => o != null && (o.constructor === Object || o.constructor == null))\n\n/**\n * @template {Schema<string|number|symbol>} Keys\n * @template {Schema<any>} Values\n * @extends {Schema<{ [key in Unwrap<Keys>]: Unwrap<Values> }>}\n */\nexport class $Record extends Schema {\n  /**\n   * @param {Keys} keys\n   * @param {Values} values\n   */\n  constructor (keys, values) {\n    super()\n    this.shape = {\n      keys, values\n    }\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} err\n   * @return {o is { [key in Unwrap<Keys>]: Unwrap<Values> }}\n   */\n  check (o, err) {\n    return o != null && obj.every(o, (vv, vk) => {\n      const ck = this.shape.keys.check(vk, err)\n      /* c8 ignore next */\n      !ck && err?.extend(vk + '', 'Record', typeof o, ck ? 'Key doesn\\'t match schema' : 'Value doesn\\'t match value')\n      return ck && this.shape.values.check(vv, err)\n    })\n  }\n}\n\n/**\n * @template {Schema<string|number|symbol>} Keys\n * @template {Schema<any>} Values\n * @param {Keys} keys\n * @param {Values} values\n * @return {CastToSchema<$Record<Keys,Values>>}\n */\nexport const $record = (keys, values) => new $Record(keys, values)\nexport const $$record = $constructedBy($Record)\n\n/**\n * @template {Schema<any>[]} S\n * @extends {Schema<{ [Key in keyof S]: S[Key] extends Schema<infer Type> ? Type : never }>}\n */\nexport class $Tuple extends Schema {\n  /**\n   * @param {S} shape\n   */\n  constructor (shape) {\n    super()\n    this.shape = shape\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} err\n   * @return {o is { [K in keyof S]: S[K] extends Schema<infer Type> ? Type : never }}\n   */\n  check (o, err) {\n    return o != null && obj.every(this.shape, (vv, vk) => {\n      const c = /** @type {Schema<any>} */ (vv).check(o[vk], err)\n      /* c8 ignore next */\n      !c && err?.extend(vk.toString(), 'Tuple', typeof vv)\n      return c\n    })\n  }\n}\n\n/**\n * @template {Array<Schema<any>>} T\n * @param {T} def\n * @return {CastToSchema<$Tuple<T>>}\n */\nexport const $tuple = (...def) => new $Tuple(def)\nexport const $$tuple = $constructedBy($Tuple)\n\n/**\n * @template {Schema<any>} S\n * @extends {Schema<Array<S extends Schema<infer T> ? T : never>>}\n */\nexport class $Array extends Schema {\n  /**\n   * @param {Array<S>} v\n   */\n  constructor (v) {\n    super()\n    /**\n     * @type {Schema<S extends Schema<infer T> ? T : never>}\n     */\n    this.shape = v.length === 1 ? v[0] : new $Union(v)\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is Array<S extends Schema<infer T> ? T : never>} o\n   */\n  check (o, err) {\n    const c = arr.isArray(o) && arr.every(o, oi => this.shape.check(oi))\n    /* c8 ignore next */\n    !c && err?.extend(null, 'Array', '')\n    return c\n  }\n}\n\n/**\n * @template {Array<Schema<any>>} T\n * @param {T} def\n * @return {Schema<Array<T extends Array<Schema<infer S>> ? S : never>>}\n */\nexport const $array = (...def) => new $Array(def)\nexport const $$array = $constructedBy($Array)\n/**\n * @type {Schema<Array<any>>}\n */\nexport const $arrayAny = $custom(o => arr.isArray(o))\n\n/**\n * @template T\n * @extends {Schema<T>}\n */\nexport class $InstanceOf extends Schema {\n  /**\n   * @param {new (...args:any) => T} constructor\n   * @param {((o:T) => boolean)|null} check\n   */\n  constructor (constructor, check) {\n    super()\n    this.shape = constructor\n    this._c = check\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} err\n   * @return {o is T}\n   */\n  check (o, err) {\n    const c = o instanceof this.shape && (this._c == null || this._c(o))\n    /* c8 ignore next */\n    !c && err?.extend(null, this.shape.name, o?.constructor.name)\n    return c\n  }\n}\n\n/**\n * @template T\n * @param {new (...args:any) => T} c\n * @param {((o:T) => boolean)|null} check\n * @return {Schema<T>}\n */\nexport const $instanceOf = (c, check = null) => new $InstanceOf(c, check)\nexport const $$instanceOf = $constructedBy($InstanceOf)\n\nexport const $$schema = $instanceOf(Schema)\n\n/**\n * @template {Schema<any>[]} Args\n * @typedef {(...args:UnwrapArray<TuplePop<Args>>)=>Unwrap<TupleLast<Args>>} _LArgsToLambdaDef\n */\n\n/**\n * @template {Array<Schema<any>>} Args\n * @extends {Schema<_LArgsToLambdaDef<Args>>}\n */\nexport class $Lambda extends Schema {\n  /**\n   * @param {Args} args\n   */\n  constructor (args) {\n    super()\n    this.len = args.length - 1\n    this.args = $tuple(...args.slice(-1))\n    this.res = args[this.len]\n  }\n\n  /**\n   * @param {any} f\n   * @param {ValidationError} err\n   * @return {f is _LArgsToLambdaDef<Args>}\n   */\n  check (f, err) {\n    const c = f.constructor === Function && f.length <= this.len\n    /* c8 ignore next */\n    !c && err?.extend(null, 'function', typeof f)\n    return c\n  }\n}\n\n/**\n * @template {Schema<any>[]} Args\n * @param {Args} args\n * @return {Schema<(...args:UnwrapArray<TuplePop<Args>>)=>Unwrap<TupleLast<Args>>>}\n */\nexport const $lambda = (...args) => new $Lambda(args.length > 0 ? args : [$void])\nexport const $$lambda = $constructedBy($Lambda)\n\n/**\n * @type {Schema<Function>}\n */\nexport const $function = $custom(o => typeof o === 'function')\n\n/**\n * @template {Array<Schema<any>>} T\n * @extends {Schema<Intersect<UnwrapArray<T>>>}\n */\nexport class $Intersection extends Schema {\n  /**\n   * @param {T} v\n   */\n  constructor (v) {\n    super()\n    /**\n     * @type {T}\n     */\n    this.shape = v\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is Intersect<UnwrapArray<T>>}\n   */\n  check (o, err) {\n    // @ts-ignore\n    const c = arr.every(this.shape, check => check.check(o, err))\n    /* c8 ignore next */\n    !c && err?.extend(null, 'Intersectinon', typeof o)\n    return c\n  }\n}\n\n/**\n * @template {Schema<any>[]} T\n * @param {T} def\n * @return {CastToSchema<$Intersection<T>>}\n */\nexport const $intersect = (...def) => new $Intersection(def)\nexport const $$intersect = $constructedBy($Intersection, o => o.shape.length > 0) // Intersection with length=0 is considered \"any\"\n\n/**\n * @template S\n * @extends {Schema<S>}\n */\nexport class $Union extends Schema {\n  static _dilutes = true\n\n  /**\n   * @param {Array<Schema<S>>} v\n   */\n  constructor (v) {\n    super()\n    this.shape = v\n  }\n\n  /**\n   * @param {any} o\n   * @param {ValidationError} [err]\n   * @return {o is S}\n   */\n  check (o, err) {\n    const c = arr.some(this.shape, (vv) => vv.check(o, err))\n    err?.extend(null, 'Union', typeof o)\n    return c\n  }\n}\n\n/**\n * @template {Array<any>} T\n * @param {T} schemas\n * @return {CastToSchema<$Union<Unwrap<ReadSchema<T>>>>}\n */\nexport const $union = (...schemas) => schemas.findIndex($s => $$union.check($s)) >= 0\n  ? $union(...schemas.map($s => $($s)).map($s => $$union.check($s) ? $s.shape : [$s]).flat(1))\n  : (schemas.length === 1\n      ? schemas[0]\n      : new $Union(schemas))\nexport const $$union = /** @type {Schema<$Union<any>>} */ ($constructedBy($Union))\n\nconst _t = () => true\n/**\n * @type {Schema<any>}\n */\nexport const $any = $custom(_t)\nexport const $$any = /** @type {Schema<Schema<any>>} */ ($constructedBy($Custom, o => o.shape === _t))\n\n/**\n * @type {Schema<bigint>}\n */\nexport const $bigint = $custom(o => typeof o === 'bigint')\nexport const $$bigint = /** @type {Schema<Schema<BigInt>>} */ ($custom(o => o === $bigint))\n\n/**\n * @type {Schema<symbol>}\n */\nexport const $symbol = $custom(o => typeof o === 'symbol')\nexport const $$symbol = /** @type {Schema<Schema<Symbol>>} */ ($custom(o => o === $symbol))\n\n/**\n * @type {Schema<number>}\n */\nexport const $number = $custom(o => typeof o === 'number')\nexport const $$number = /** @type {Schema<Schema<number>>} */ ($custom(o => o === $number))\n\n/**\n * @type {Schema<string>}\n */\nexport const $string = $custom(o => typeof o === 'string')\nexport const $$string = /** @type {Schema<Schema<string>>} */ ($custom(o => o === $string))\n\n/**\n * @type {Schema<boolean>}\n */\nexport const $boolean = $custom(o => typeof o === 'boolean')\nexport const $$boolean = /** @type {Schema<Schema<Boolean>>} */ ($custom(o => o === $boolean))\n\n/**\n * @type {Schema<undefined>}\n */\nexport const $undefined = $literal(undefined)\nexport const $$undefined = /** @type {Schema<Schema<undefined>>} */ ($constructedBy($Literal, o => o.shape.length === 1 && o.shape[0] === undefined))\n\n/**\n * @type {Schema<void>}\n */\nexport const $void = $literal(undefined)\nexport const $$void = /** @type {Schema<Schema<void>>} */ ($$undefined)\n\nexport const $null = $literal(null)\nexport const $$null = /** @type {Schema<Schema<null>>} */ ($constructedBy($Literal, o => o.shape.length === 1 && o.shape[0] === null))\n\nexport const $uint8Array = $constructedBy(Uint8Array)\nexport const $$uint8Array = /** @type {Schema<Schema<Uint8Array>>} */ ($constructedBy($ConstructedBy, o => o.shape === Uint8Array))\n\n/**\n * @type {Schema<Primitive>}\n */\nexport const $primitive = $union($number, $string, $null, $undefined, $bigint, $boolean, $symbol)\n\n/**\n * @typedef {JSON[]} JSONArray\n */\n/**\n * @typedef {Primitive|JSONArray|{ [key:string]:JSON }} JSON\n */\n/**\n * @type {Schema<null|number|string|boolean|JSON[]|{[key:string]:JSON}>}\n */\nexport const $json = (() => {\n  const $jsonArr = /** @type {$Array<$any>} */ ($array($any))\n  const $jsonRecord = /** @type {$Record<$string,$any>} */ ($record($string, $any))\n  const $json = $union($number, $string, $null, $boolean, $jsonArr, $jsonRecord)\n  $jsonArr.shape = $json\n  $jsonRecord.shape.values = $json\n  return $json\n})()\n\n/**\n * @template {any} IN\n * @typedef {IN extends Schema<any> ? IN\n *   : (IN extends string|number|boolean|null ? Schema<IN>\n *     : (IN extends new (...args:any[])=>any ? Schema<InstanceType<IN>>\n *       : (IN extends any[] ? Schema<{ [K in keyof IN]: Unwrap<ReadSchema<IN[K]>> }[number]>\n   *       : (IN extends object ? (_ObjectDefToSchema<{[K in keyof IN]:ReadSchema<IN[K]>}> extends Schema<infer S> ? Schema<{ [K in keyof S]: S[K] }> : never)\n   *         : never)\n *         )\n *       )\n *     )\n * } ReadSchemaOld\n */\n\n/**\n * @template {any} IN\n * @typedef {[Extract<IN,Schema<any>>,Extract<IN,string|number|boolean|null>,Extract<IN,new (...args:any[])=>any>,Extract<IN,any[]>,Extract<Exclude<IN,Schema<any>|string|number|boolean|null|(new (...args:any[])=>any)|any[]>,object>] extends [infer Schemas, infer Primitives, infer Constructors, infer Arrs, infer Obj]\n *   ? Schema<\n *       (Schemas extends Schema<infer S> ? S : never)\n *     | Primitives\n *     | (Constructors extends new (...args:any[])=>any ? InstanceType<Constructors> : never)\n *     | (Arrs extends any[] ? { [K in keyof Arrs]: Unwrap<ReadSchema<Arrs[K]>> }[number] : never)\n *     | (Obj extends object ? Unwrap<(_ObjectDefToSchema<{[K in keyof Obj]:ReadSchema<Obj[K]>}> extends Schema<infer S> ? Schema<{ [K in keyof S]: S[K] }> : never)> : never)>\n *   : never\n * } ReadSchema\n */\n\n/**\n * @typedef {ReadSchema<{x:42}|{y:99}|Schema<string>|[1,2,{}]>} Q\n */\n\n/**\n * @template IN\n * @param {IN} o\n * @return {ReadSchema<IN>}\n */\nexport const $ = o => {\n  if ($$schema.check(o)) {\n    return /** @type {any} */ (o)\n  } else if ($objectAny.check(o)) {\n    /**\n     * @type {any}\n     */\n    const o2 = {}\n    for (const k in o) {\n      o2[k] = $(o[k])\n    }\n    return /** @type {any} */ ($object(o2))\n  } else if ($arrayAny.check(o)) {\n    return /** @type {any} */ ($union(...o.map($)))\n  } else if ($primitive.check(o)) {\n    return /** @type {any} */ ($literal(o))\n  } else if ($function.check(o)) {\n    return /** @type {any} */ ($constructedBy(/** @type {any} */ (o)))\n  }\n  /* c8 ignore next */\n  error.unexpectedCase()\n}\n\n/* c8 ignore start */\n/**\n * Assert that a variable is of this specific type.\n * The assertion check is only performed in non-production environments.\n *\n * @type {<T>(o:any,schema:Schema<T>) => asserts o is T}\n */\nexport const assert = env.production\n  ? () => {}\n  : (o, schema) => {\n      const err = new ValidationError()\n      if (!schema.check(o, err)) {\n        throw error.create(`Expected value to be of type ${schema.constructor.name}.\\n${err.toString()}`)\n      }\n    }\n/* c8 ignore end */\n\n/**\n * @template In\n * @template Out\n * @typedef {{ if: Schema<In>, h: (o:In,state?:any)=>Out }} Pattern\n */\n\n/**\n * @template {Pattern<any,any>} P\n * @template In\n * @typedef {ReturnType<Extract<P,Pattern<In extends number ? number : (In extends string ? string : In),any>>['h']>} PatternMatchResult\n */\n\n/**\n * @todo move this to separate library\n * @template {any} [State=undefined]\n * @template {Pattern<any,any>} [Patterns=never]\n */\nexport class PatternMatcher {\n  /**\n   * @param {Schema<State>} [$state]\n   */\n  constructor ($state) {\n    /**\n     * @type {Array<Patterns>}\n     */\n    this.patterns = []\n    this.$state = $state\n  }\n\n  /**\n   * @template P\n   * @template R\n   * @param {P} pattern\n   * @param {(o:NoInfer<Unwrap<ReadSchema<P>>>,s:State)=>R} handler\n   * @return {PatternMatcher<State,Patterns|Pattern<Unwrap<ReadSchema<P>>,R>>}\n   */\n  if (pattern, handler) {\n    // @ts-ignore\n    this.patterns.push({ if: $(pattern), h: handler })\n    // @ts-ignore\n    return this\n  }\n\n  /**\n   * @template R\n   * @param {(o:any,s:State)=>R} h\n   */\n  else (h) {\n    return this.if($any, h)\n  }\n\n  /**\n   * @return {State extends undefined\n   *   ? <In extends Unwrap<Patterns['if']>>(o:In,state?:undefined)=>PatternMatchResult<Patterns,In>\n   *   : <In extends Unwrap<Patterns['if']>>(o:In,state:State)=>PatternMatchResult<Patterns,In>}\n   */\n  done () {\n    // @ts-ignore\n    return /** @type {any} */ (o, s) => {\n      for (let i = 0; i < this.patterns.length; i++) {\n        const p = this.patterns[i]\n        if (p.if.check(o)) {\n          // @ts-ignore\n          return p.h(o, s)\n        }\n      }\n      throw error.create('Unhandled pattern')\n    }\n  }\n}\n\n/**\n * @template [State=undefined]\n * @param {State} [state]\n * @return {PatternMatcher<State extends undefined ? undefined : Unwrap<ReadSchema<State>>>}\n */\nexport const match = state => new PatternMatcher(/** @type {any} */ (state))\n\n/**\n * Helper function to generate a (non-exhaustive) sample set from a gives schema.\n *\n * @type {<T>(o:T,gen:prng.PRNG)=>T}\n */\nconst _random = /** @type {any} */ (match(/** @type {Schema<prng.PRNG>} */ ($any))\n  .if($$number, (_o, gen) => prng.int53(gen, number.MIN_SAFE_INTEGER, number.MAX_SAFE_INTEGER))\n  .if($$string, (_o, gen) => prng.word(gen))\n  .if($$boolean, (_o, gen) => prng.bool(gen))\n  .if($$bigint, (_o, gen) => BigInt(prng.int53(gen, number.MIN_SAFE_INTEGER, number.MAX_SAFE_INTEGER)))\n  .if($$union, (o, gen) => random(gen, prng.oneOf(gen, o.shape)))\n  .if($$object, (o, gen) => {\n    /**\n     * @type {any}\n     */\n    const res = {}\n    for (const k in o.shape) {\n      let prop = o.shape[k]\n      if ($$optional.check(prop)) {\n        if (prng.bool(gen)) { continue }\n        prop = prop.shape\n      }\n      res[k] = _random(prop, gen)\n    }\n    return res\n  })\n  .if($$array, (o, gen) => {\n    const arr = []\n    const n = prng.int32(gen, 0, 42)\n    for (let i = 0; i < n; i++) {\n      arr.push(random(gen, o.shape))\n    }\n    return arr\n  })\n  .if($$literal, (o, gen) => {\n    return prng.oneOf(gen, o.shape)\n  })\n  .if($$null, (o, gen) => {\n    return null\n  })\n  .if($$lambda, (o, gen) => {\n    const res = random(gen, o.res)\n    return () => res\n  })\n  .if($$any, (o, gen) => random(gen, prng.oneOf(gen, [\n    $number, $string, $null, $undefined, $bigint, $boolean,\n    $array($number),\n    $record($union('a', 'b', 'c'), $number)\n  ])))\n  .if($$record, (o, gen) => {\n    /**\n     * @type {any}\n     */\n    const res = {}\n    const keysN = prng.int53(gen, 0, 3)\n    for (let i = 0; i < keysN; i++) {\n      const key = random(gen, o.shape.keys)\n      const val = random(gen, o.shape.values)\n      res[key] = val\n    }\n    return res\n  })\n  .done())\n\n/**\n * @template S\n * @param {prng.PRNG} gen\n * @param {S} schema\n * @return {Unwrap<ReadSchema<S>>}\n */\nexport const random = (gen, schema) => /** @type {any} */ (_random($(schema), gen))\n","/* eslint-env browser */\n\n/**\n * Utility module to work with the DOM.\n *\n * @module dom\n */\n\nimport * as pair from './pair.js'\nimport * as map from './map.js'\nimport * as $ from './schema.js'\n\n/* c8 ignore start */\n/**\n * @type {Document}\n */\nexport const doc = /** @type {Document} */ (typeof document !== 'undefined' ? document : {})\n\n/**\n * @param {string} name\n * @return {HTMLElement}\n */\nexport const createElement = name => doc.createElement(name)\n\n/**\n * @return {DocumentFragment}\n */\nexport const createDocumentFragment = () => doc.createDocumentFragment()\n\n/**\n * @type {$.Schema<DocumentFragment>}\n */\nexport const $fragment = $.$custom(el => el.nodeType === DOCUMENT_FRAGMENT_NODE)\n\n/**\n * @param {string} text\n * @return {Text}\n */\nexport const createTextNode = text => doc.createTextNode(text)\n\nexport const domParser = /** @type {DOMParser} */ (typeof DOMParser !== 'undefined' ? new DOMParser() : null)\n\n/**\n * @param {HTMLElement} el\n * @param {string} name\n * @param {Object} opts\n */\nexport const emitCustomEvent = (el, name, opts) => el.dispatchEvent(new CustomEvent(name, opts))\n\n/**\n * @param {Element} el\n * @param {Array<pair.Pair<string,string|boolean>>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributes = (el, attrs) => {\n  pair.forEach(attrs, (key, value) => {\n    if (value === false) {\n      el.removeAttribute(key)\n    } else if (value === true) {\n      el.setAttribute(key, '')\n    } else {\n      // @ts-ignore\n      el.setAttribute(key, value)\n    }\n  })\n  return el\n}\n\n/**\n * @param {Element} el\n * @param {Map<string, string>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributesMap = (el, attrs) => {\n  attrs.forEach((value, key) => { el.setAttribute(key, value) })\n  return el\n}\n\n/**\n * @param {Array<Node>|HTMLCollection} children\n * @return {DocumentFragment}\n */\nexport const fragment = children => {\n  const fragment = createDocumentFragment()\n  for (let i = 0; i < children.length; i++) {\n    appendChild(fragment, children[i])\n  }\n  return fragment\n}\n\n/**\n * @param {Element} parent\n * @param {Array<Node>} nodes\n * @return {Element}\n */\nexport const append = (parent, nodes) => {\n  appendChild(parent, fragment(nodes))\n  return parent\n}\n\n/**\n * @param {HTMLElement} el\n */\nexport const remove = el => el.remove()\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const addEventListener = (el, name, f) => el.addEventListener(name, f)\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const removeEventListener = (el, name, f) => el.removeEventListener(name, f)\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const addEventListeners = (node, listeners) => {\n  pair.forEach(listeners, (name, f) => addEventListener(node, name, f))\n  return node\n}\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const removeEventListeners = (node, listeners) => {\n  pair.forEach(listeners, (name, f) => removeEventListener(node, name, f))\n  return node\n}\n\n/**\n * @param {string} name\n * @param {Array<pair.Pair<string,string>|pair.Pair<string,boolean>>} attrs Array of key-value pairs\n * @param {Array<Node>} children\n * @return {Element}\n */\nexport const element = (name, attrs = [], children = []) =>\n  append(setAttributes(createElement(name), attrs), children)\n\n/**\n * @type {$.Schema<Element>}\n */\nexport const $element = $.$custom(el => el.nodeType === ELEMENT_NODE)\n\n/**\n * @param {number} width\n * @param {number} height\n */\nexport const canvas = (width, height) => {\n  const c = /** @type {HTMLCanvasElement} */ (createElement('canvas'))\n  c.height = height\n  c.width = width\n  return c\n}\n\n/**\n * @param {string} t\n * @return {Text}\n */\nexport const text = createTextNode\n\n/**\n * @type {$.Schema<Text>}\n */\nexport const $text = $.$custom(el => el.nodeType === TEXT_NODE)\n\n/**\n * @param {pair.Pair<string,string>} pair\n */\nexport const pairToStyleString = pair => `${pair.left}:${pair.right};`\n\n/**\n * @param {Array<pair.Pair<string,string>>} pairs\n * @return {string}\n */\nexport const pairsToStyleString = pairs => pairs.map(pairToStyleString).join('')\n\n/**\n * @param {Map<string,string>} m\n * @return {string}\n */\nexport const mapToStyleString = m => map.map(m, (value, key) => `${key}:${value};`).join('')\n\n/**\n * @todo should always query on a dom element\n *\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {HTMLElement | null}\n */\nexport const querySelector = (el, query) => el.querySelector(query)\n\n/**\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {NodeListOf<HTMLElement>}\n */\nexport const querySelectorAll = (el, query) => el.querySelectorAll(query)\n\n/**\n * @param {string} id\n * @return {HTMLElement}\n */\nexport const getElementById = id => /** @type {HTMLElement} */ (doc.getElementById(id))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nconst _parse = html => domParser.parseFromString(`<html><body>${html}</body></html>`, 'text/html').body\n\n/**\n * @param {string} html\n * @return {DocumentFragment}\n */\nexport const parseFragment = html => fragment(/** @type {any} */ (_parse(html).childNodes))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nexport const parseElement = html => /** @type HTMLElement */ (_parse(html).firstElementChild)\n\n/**\n * @param {HTMLElement} oldEl\n * @param {HTMLElement|DocumentFragment} newEl\n */\nexport const replaceWith = (oldEl, newEl) => oldEl.replaceWith(newEl)\n\n/**\n * @param {HTMLElement} parent\n * @param {HTMLElement} el\n * @param {Node|null} ref\n * @return {HTMLElement}\n */\nexport const insertBefore = (parent, el, ref) => parent.insertBefore(el, ref)\n\n/**\n * @param {Node} parent\n * @param {Node} child\n * @return {Node}\n */\nexport const appendChild = (parent, child) => parent.appendChild(child)\n\nexport const ELEMENT_NODE = doc.ELEMENT_NODE\nexport const TEXT_NODE = doc.TEXT_NODE\nexport const CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE\nexport const COMMENT_NODE = doc.COMMENT_NODE\nexport const DOCUMENT_NODE = doc.DOCUMENT_NODE\nexport const DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE\nexport const DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE\n\n/**\n * @type {$.Schema<Node>}\n */\nexport const $node = $.$custom(el => el.nodeType === DOCUMENT_NODE)\n\n/**\n * @param {any} node\n * @param {number} type\n */\nexport const checkNodeType = (node, type) => node.nodeType === type\n\n/**\n * @param {Node} parent\n * @param {HTMLElement} child\n */\nexport const isParentOf = (parent, child) => {\n  let p = child.parentNode\n  while (p && p !== parent) {\n    p = p.parentNode\n  }\n  return p === parent\n}\n/* c8 ignore stop */\n","/* global requestIdleCallback, requestAnimationFrame, cancelIdleCallback, cancelAnimationFrame */\n\nimport * as time from './time.js'\n\n/**\n * Utility module to work with EcmaScript's event loop.\n *\n * @module eventloop\n */\n\n/**\n * @type {Array<function>}\n */\nlet queue = []\n\nconst _runQueue = () => {\n  for (let i = 0; i < queue.length; i++) {\n    queue[i]()\n  }\n  queue = []\n}\n\n/**\n * @param {function():void} f\n */\nexport const enqueue = f => {\n  queue.push(f)\n  if (queue.length === 1) {\n    setTimeout(_runQueue, 0)\n  }\n}\n\n/**\n * @typedef {Object} TimeoutObject\n * @property {function} TimeoutObject.destroy\n */\n\n/**\n * @param {function(number):void} clearFunction\n */\nconst createTimeoutClass = clearFunction => class TT {\n  /**\n   * @param {number} timeoutId\n   */\n  constructor (timeoutId) {\n    this._ = timeoutId\n  }\n\n  destroy () {\n    clearFunction(this._)\n  }\n}\n\nconst Timeout = createTimeoutClass(clearTimeout)\n\n/**\n * @param {number} timeout\n * @param {function} callback\n * @return {TimeoutObject}\n */\nexport const timeout = (timeout, callback) => new Timeout(setTimeout(callback, timeout))\n\nconst Interval = createTimeoutClass(clearInterval)\n\n/**\n * @param {number} timeout\n * @param {function} callback\n * @return {TimeoutObject}\n */\nexport const interval = (timeout, callback) => new Interval(setInterval(callback, timeout))\n\n/* c8 ignore next */\nexport const Animation = createTimeoutClass(arg => typeof requestAnimationFrame !== 'undefined' && cancelAnimationFrame(arg))\n\n/**\n * @param {function(number):void} cb\n * @return {TimeoutObject}\n */\n/* c8 ignore next */\nexport const animationFrame = cb => typeof requestAnimationFrame === 'undefined' ? timeout(0, cb) : new Animation(requestAnimationFrame(cb))\n\n/* c8 ignore next */\n// @ts-ignore\nconst Idle = createTimeoutClass(arg => typeof cancelIdleCallback !== 'undefined' && cancelIdleCallback(arg))\n\n/**\n * Note: this is experimental and is probably only useful in browsers.\n *\n * @param {function} cb\n * @return {TimeoutObject}\n */\n/* c8 ignore next 2 */\n// @ts-ignore\nexport const idleCallback = cb => typeof requestIdleCallback !== 'undefined' ? new Idle(requestIdleCallback(cb)) : timeout(1000, cb)\n\n/**\n * @param {number} timeout Timeout of the debounce action\n * @param {number} triggerAfter Optional. Trigger callback after a certain amount of time\n *                              without waiting for debounce.\n */\nexport const createDebouncer = (timeout, triggerAfter = -1) => {\n  let timer = -1\n  /**\n   * @type {number?}\n    */\n  let lastCall = null\n  /**\n   * @param {((...args: any)=>void)?} cb function to trigger after debounce. If null, it will reset the\n   *                         debounce.\n   */\n  return cb => {\n    clearTimeout(timer)\n    if (cb) {\n      if (triggerAfter >= 0) {\n        const now = time.getUnixTime()\n        if (lastCall === null) lastCall = now\n        if (now - lastCall > triggerAfter) {\n          lastCall = null\n          timer = /** @type {any} */ (setTimeout(cb, 0))\n          return\n        }\n      }\n      timer = /** @type {any} */ (setTimeout(() => { lastCall = null; cb() }, timeout))\n    } else {\n      lastCall = null\n    }\n  }\n}\n","/**\n * Utility module to work with EcmaScript Symbols.\n *\n * @module symbol\n */\n\n/**\n * Return fresh symbol.\n */\nexport const create = Symbol\n\n/**\n * @param {any} s\n * @return {boolean}\n */\nexport const isSymbol = s => typeof s === 'symbol'\n","import * as symbol from './symbol.js'\nimport * as time from './time.js'\nimport * as env from './environment.js'\nimport * as func from './function.js'\nimport * as json from './json.js'\n\nexport const BOLD = symbol.create()\nexport const UNBOLD = symbol.create()\nexport const BLUE = symbol.create()\nexport const GREY = symbol.create()\nexport const GREEN = symbol.create()\nexport const RED = symbol.create()\nexport const PURPLE = symbol.create()\nexport const ORANGE = symbol.create()\nexport const UNCOLOR = symbol.create()\n\n/* c8 ignore start */\n/**\n * @param {Array<undefined|string|Symbol|Object|number|function():any>} args\n * @return {Array<string|object|number|undefined>}\n */\nexport const computeNoColorLoggingArgs = args => {\n  if (args.length === 1 && args[0]?.constructor === Function) {\n    args = /** @type {Array<string|Symbol|Object|number>} */ (/** @type {[function]} */ (args)[0]())\n  }\n  const strBuilder = []\n  const logArgs = []\n  // try with formatting until we find something unsupported\n  let i = 0\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    if (arg === undefined) {\n      break\n    } else if (arg.constructor === String || arg.constructor === Number) {\n      strBuilder.push(arg)\n    } else if (arg.constructor === Object) {\n      break\n    }\n  }\n  if (i > 0) {\n    // create logArgs with what we have so far\n    logArgs.push(strBuilder.join(''))\n  }\n  // append the rest\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    if (!(arg instanceof Symbol)) {\n      logArgs.push(arg)\n    }\n  }\n  return logArgs\n}\n/* c8 ignore stop */\n\nconst loggingColors = [GREEN, PURPLE, ORANGE, BLUE]\nlet nextColor = 0\nlet lastLoggingTime = time.getUnixTime()\n\n/* c8 ignore start */\n/**\n * @param {function(...any):void} _print\n * @param {string} moduleName\n * @return {function(...any):void}\n */\nexport const createModuleLogger = (_print, moduleName) => {\n  const color = loggingColors[nextColor]\n  const debugRegexVar = env.getVariable('log')\n  const doLogging = debugRegexVar !== null &&\n    (debugRegexVar === '*' || debugRegexVar === 'true' ||\n      new RegExp(debugRegexVar, 'gi').test(moduleName))\n  nextColor = (nextColor + 1) % loggingColors.length\n  moduleName += ': '\n  return !doLogging\n    ? func.nop\n    : (...args) => {\n        if (args.length === 1 && args[0]?.constructor === Function) {\n          args = args[0]()\n        }\n        const timeNow = time.getUnixTime()\n        const timeDiff = timeNow - lastLoggingTime\n        lastLoggingTime = timeNow\n        _print(\n          color,\n          moduleName,\n          UNCOLOR,\n          ...args.map((arg) => {\n            if (arg != null && arg.constructor === Uint8Array) {\n              arg = Array.from(arg)\n            }\n            const t = typeof arg\n            switch (t) {\n              case 'string':\n              case 'symbol':\n                return arg\n              default: {\n                return json.stringify(arg)\n              }\n            }\n          }),\n          color,\n          ' +' + timeDiff + 'ms'\n        )\n      }\n}\n/* c8 ignore stop */\n","/**\n * Isomorphic logging module with support for colors!\n *\n * @module logging\n */\n\nimport * as env from './environment.js'\nimport * as set from './set.js'\nimport * as pair from './pair.js'\nimport * as dom from './dom.js'\nimport * as json from './json.js'\nimport * as map from './map.js'\nimport * as eventloop from './eventloop.js'\nimport * as math from './math.js'\nimport * as common from './logging.common.js'\n\nexport { BOLD, UNBOLD, BLUE, GREY, GREEN, RED, PURPLE, ORANGE, UNCOLOR } from './logging.common.js'\n\n/**\n * @type {Object<Symbol,pair.Pair<string,string>>}\n */\nconst _browserStyleMap = {\n  [common.BOLD]: pair.create('font-weight', 'bold'),\n  [common.UNBOLD]: pair.create('font-weight', 'normal'),\n  [common.BLUE]: pair.create('color', 'blue'),\n  [common.GREEN]: pair.create('color', 'green'),\n  [common.GREY]: pair.create('color', 'grey'),\n  [common.RED]: pair.create('color', 'red'),\n  [common.PURPLE]: pair.create('color', 'purple'),\n  [common.ORANGE]: pair.create('color', 'orange'), // not well supported in chrome when debugging node with inspector - TODO: deprecate\n  [common.UNCOLOR]: pair.create('color', 'black')\n}\n\n/**\n * @param {Array<string|Symbol|Object|number|function():any>} args\n * @return {Array<string|object|number>}\n */\n/* c8 ignore start */\nconst computeBrowserLoggingArgs = (args) => {\n  if (args.length === 1 && args[0]?.constructor === Function) {\n    args = /** @type {Array<string|Symbol|Object|number>} */ (/** @type {[function]} */ (args)[0]())\n  }\n  const strBuilder = []\n  const styles = []\n  const currentStyle = map.create()\n  /**\n   * @type {Array<string|Object|number>}\n   */\n  let logArgs = []\n  // try with formatting until we find something unsupported\n  let i = 0\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    // @ts-ignore\n    const style = _browserStyleMap[arg]\n    if (style !== undefined) {\n      currentStyle.set(style.left, style.right)\n    } else {\n      if (arg === undefined) {\n        break\n      }\n      if (arg.constructor === String || arg.constructor === Number) {\n        const style = dom.mapToStyleString(currentStyle)\n        if (i > 0 || style.length > 0) {\n          strBuilder.push('%c' + arg)\n          styles.push(style)\n        } else {\n          strBuilder.push(arg)\n        }\n      } else {\n        break\n      }\n    }\n  }\n  if (i > 0) {\n    // create logArgs with what we have so far\n    logArgs = styles\n    logArgs.unshift(strBuilder.join(''))\n  }\n  // append the rest\n  for (; i < args.length; i++) {\n    const arg = args[i]\n    if (!(arg instanceof Symbol)) {\n      logArgs.push(arg)\n    }\n  }\n  return logArgs\n}\n/* c8 ignore stop */\n\n/* c8 ignore start */\nconst computeLoggingArgs = env.supportsColor\n  ? computeBrowserLoggingArgs\n  : common.computeNoColorLoggingArgs\n/* c8 ignore stop */\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const print = (...args) => {\n  console.log(...computeLoggingArgs(args))\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.print(args))\n}\n\n/* c8 ignore start */\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const warn = (...args) => {\n  console.warn(...computeLoggingArgs(args))\n  args.unshift(common.ORANGE)\n  vconsoles.forEach((vc) => vc.print(args))\n}\n/* c8 ignore stop */\n\n/**\n * @param {Error} err\n */\n/* c8 ignore start */\nexport const printError = (err) => {\n  console.error(err)\n  vconsoles.forEach((vc) => vc.printError(err))\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} url image location\n * @param {number} height height of the image in pixel\n */\n/* c8 ignore start */\nexport const printImg = (url, height) => {\n  if (env.isBrowser) {\n    console.log(\n      '%c                      ',\n      `font-size: ${height}px; background-size: contain; background-repeat: no-repeat; background-image: url(${url})`\n    )\n    // console.log('%c                ', `font-size: ${height}x; background: url(${url}) no-repeat;`)\n  }\n  vconsoles.forEach((vc) => vc.printImg(url, height))\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} base64\n * @param {number} height\n */\n/* c8 ignore next 2 */\nexport const printImgBase64 = (base64, height) =>\n  printImg(`data:image/gif;base64,${base64}`, height)\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const group = (...args) => {\n  console.group(...computeLoggingArgs(args))\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.group(args))\n}\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n */\nexport const groupCollapsed = (...args) => {\n  console.groupCollapsed(...computeLoggingArgs(args))\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.groupCollapsed(args))\n}\n\nexport const groupEnd = () => {\n  console.groupEnd()\n  /* c8 ignore next */\n  vconsoles.forEach((vc) => vc.groupEnd())\n}\n\n/**\n * @param {function():Node} createNode\n */\n/* c8 ignore next 2 */\nexport const printDom = (createNode) =>\n  vconsoles.forEach((vc) => vc.printDom(createNode()))\n\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {number} height\n */\n/* c8 ignore next 2 */\nexport const printCanvas = (canvas, height) =>\n  printImg(canvas.toDataURL(), height)\n\nexport const vconsoles = set.create()\n\n/**\n * @param {Array<string|Symbol|Object|number>} args\n * @return {Array<Element>}\n */\n/* c8 ignore start */\nconst _computeLineSpans = (args) => {\n  const spans = []\n  const currentStyle = new Map()\n  // try with formatting until we find something unsupported\n  let i = 0\n  for (; i < args.length; i++) {\n    let arg = args[i]\n    // @ts-ignore\n    const style = _browserStyleMap[arg]\n    if (style !== undefined) {\n      currentStyle.set(style.left, style.right)\n    } else {\n      if (arg === undefined) {\n        arg = 'undefined '\n      }\n      if (arg.constructor === String || arg.constructor === Number) {\n        // @ts-ignore\n        const span = dom.element('span', [\n          pair.create('style', dom.mapToStyleString(currentStyle))\n        ], [dom.text(arg.toString())])\n        if (span.innerHTML === '') {\n          span.innerHTML = '&nbsp;'\n        }\n        spans.push(span)\n      } else {\n        break\n      }\n    }\n  }\n  // append the rest\n  for (; i < args.length; i++) {\n    let content = args[i]\n    if (!(content instanceof Symbol)) {\n      if (content.constructor !== String && content.constructor !== Number) {\n        content = ' ' + json.stringify(content) + ' '\n      }\n      spans.push(\n        dom.element('span', [], [dom.text(/** @type {string} */ (content))])\n      )\n    }\n  }\n  return spans\n}\n/* c8 ignore stop */\n\nconst lineStyle =\n  'font-family:monospace;border-bottom:1px solid #e2e2e2;padding:2px;'\n\n/* c8 ignore start */\nexport class VConsole {\n  /**\n   * @param {Element} dom\n   */\n  constructor (dom) {\n    this.dom = dom\n    /**\n     * @type {Element}\n     */\n    this.ccontainer = this.dom\n    this.depth = 0\n    vconsoles.add(this)\n  }\n\n  /**\n   * @param {Array<string|Symbol|Object|number>} args\n   * @param {boolean} collapsed\n   */\n  group (args, collapsed = false) {\n    eventloop.enqueue(() => {\n      const triangleDown = dom.element('span', [\n        pair.create('hidden', collapsed),\n        pair.create('style', 'color:grey;font-size:120%;')\n      ], [dom.text('▼')])\n      const triangleRight = dom.element('span', [\n        pair.create('hidden', !collapsed),\n        pair.create('style', 'color:grey;font-size:125%;')\n      ], [dom.text('▶')])\n      const content = dom.element(\n        'div',\n        [pair.create(\n          'style',\n          `${lineStyle};padding-left:${this.depth * 10}px`\n        )],\n        [triangleDown, triangleRight, dom.text(' ')].concat(\n          _computeLineSpans(args)\n        )\n      )\n      const nextContainer = dom.element('div', [\n        pair.create('hidden', collapsed)\n      ])\n      const nextLine = dom.element('div', [], [content, nextContainer])\n      dom.append(this.ccontainer, [nextLine])\n      this.ccontainer = nextContainer\n      this.depth++\n      // when header is clicked, collapse/uncollapse container\n      dom.addEventListener(content, 'click', (_event) => {\n        nextContainer.toggleAttribute('hidden')\n        triangleDown.toggleAttribute('hidden')\n        triangleRight.toggleAttribute('hidden')\n      })\n    })\n  }\n\n  /**\n   * @param {Array<string|Symbol|Object|number>} args\n   */\n  groupCollapsed (args) {\n    this.group(args, true)\n  }\n\n  groupEnd () {\n    eventloop.enqueue(() => {\n      if (this.depth > 0) {\n        this.depth--\n        // @ts-ignore\n        this.ccontainer = this.ccontainer.parentElement.parentElement\n      }\n    })\n  }\n\n  /**\n   * @param {Array<string|Symbol|Object|number>} args\n   */\n  print (args) {\n    eventloop.enqueue(() => {\n      dom.append(this.ccontainer, [\n        dom.element('div', [\n          pair.create(\n            'style',\n            `${lineStyle};padding-left:${this.depth * 10}px`\n          )\n        ], _computeLineSpans(args))\n      ])\n    })\n  }\n\n  /**\n   * @param {Error} err\n   */\n  printError (err) {\n    this.print([common.RED, common.BOLD, err.toString()])\n  }\n\n  /**\n   * @param {string} url\n   * @param {number} height\n   */\n  printImg (url, height) {\n    eventloop.enqueue(() => {\n      dom.append(this.ccontainer, [\n        dom.element('img', [\n          pair.create('src', url),\n          pair.create('height', `${math.round(height * 1.5)}px`)\n        ])\n      ])\n    })\n  }\n\n  /**\n   * @param {Node} node\n   */\n  printDom (node) {\n    eventloop.enqueue(() => {\n      dom.append(this.ccontainer, [node])\n    })\n  }\n\n  destroy () {\n    eventloop.enqueue(() => {\n      vconsoles.delete(this)\n    })\n  }\n}\n/* c8 ignore stop */\n\n/**\n * @param {Element} dom\n */\n/* c8 ignore next */\nexport const createVConsole = (dom) => new VConsole(dom)\n\n/**\n * @param {string} moduleName\n * @return {function(...any):void}\n */\nexport const createModuleLogger = (moduleName) => common.createModuleLogger(print, moduleName)\n","/**\n * Utility module to create and manipulate Iterators.\n *\n * @module iterator\n */\n\n/**\n * @template T,R\n * @param {Iterator<T>} iterator\n * @param {function(T):R} f\n * @return {IterableIterator<R>}\n */\nexport const mapIterator = (iterator, f) => ({\n  [Symbol.iterator] () {\n    return this\n  },\n  // @ts-ignore\n  next () {\n    const r = iterator.next()\n    return { value: r.done ? undefined : f(r.value), done: r.done }\n  }\n})\n\n/**\n * @template T\n * @param {function():IteratorResult<T>} next\n * @return {IterableIterator<T>}\n */\nexport const createIterator = next => ({\n  /**\n   * @return {IterableIterator<T>}\n   */\n  [Symbol.iterator] () {\n    return this\n  },\n  // @ts-ignore\n  next\n})\n\n/**\n * @template T\n * @param {Iterator<T>} iterator\n * @param {function(T):boolean} filter\n */\nexport const iteratorFilter = (iterator, filter) => createIterator(() => {\n  let res\n  do {\n    res = iterator.next()\n  } while (!res.done && !filter(res.value))\n  return res\n})\n\n/**\n * @template T,M\n * @param {Iterator<T>} iterator\n * @param {function(T):M} fmap\n */\nexport const iteratorMap = (iterator, fmap) => createIterator(() => {\n  const { done, value } = iterator.next()\n  return { done, value: done ? undefined : fmap(value) }\n})\n","import { ObservableV2 } from 'lib0/observable';\nimport * as array from 'lib0/array';\nimport * as math from 'lib0/math';\nimport * as map from 'lib0/map';\nimport * as encoding from 'lib0/encoding';\nimport * as decoding from 'lib0/decoding';\nimport * as random from 'lib0/random';\nimport * as promise from 'lib0/promise';\nimport * as buffer from 'lib0/buffer';\nimport * as error from 'lib0/error';\nimport * as binary from 'lib0/binary';\nimport * as f from 'lib0/function';\nimport { callAll } from 'lib0/function';\nimport * as set from 'lib0/set';\nimport * as logging from 'lib0/logging';\nimport * as time from 'lib0/time';\nimport * as string from 'lib0/string';\nimport * as iterator from 'lib0/iterator';\nimport * as object from 'lib0/object';\nimport * as env from 'lib0/environment';\n\n/**\n * This is an abstract interface that all Connectors should implement to keep them interchangeable.\n *\n * @note This interface is experimental and it is not advised to actually inherit this class.\n *       It just serves as typing information.\n *\n * @extends {ObservableV2<any>}\n */\nclass AbstractConnector extends ObservableV2 {\n  /**\n   * @param {Doc} ydoc\n   * @param {any} awareness\n   */\n  constructor (ydoc, awareness) {\n    super();\n    this.doc = ydoc;\n    this.awareness = awareness;\n  }\n}\n\nclass DeleteItem {\n  /**\n   * @param {number} clock\n   * @param {number} len\n   */\n  constructor (clock, len) {\n    /**\n     * @type {number}\n     */\n    this.clock = clock;\n    /**\n     * @type {number}\n     */\n    this.len = len;\n  }\n}\n\n/**\n * We no longer maintain a DeleteStore. DeleteSet is a temporary object that is created when needed.\n * - When created in a transaction, it must only be accessed after sorting, and merging\n *   - This DeleteSet is send to other clients\n * - We do not create a DeleteSet when we send a sync message. The DeleteSet message is created directly from StructStore\n * - We read a DeleteSet as part of a sync/update message. In this case the DeleteSet is already sorted and merged.\n */\nclass DeleteSet {\n  constructor () {\n    /**\n     * @type {Map<number,Array<DeleteItem>>}\n     */\n    this.clients = new Map();\n  }\n}\n\n/**\n * Iterate over all structs that the DeleteSet gc's.\n *\n * @param {Transaction} transaction\n * @param {DeleteSet} ds\n * @param {function(GC|Item):void} f\n *\n * @function\n */\nconst iterateDeletedStructs = (transaction, ds, f) =>\n  ds.clients.forEach((deletes, clientid) => {\n    const structs = /** @type {Array<GC|Item>} */ (transaction.doc.store.clients.get(clientid));\n    if (structs != null) {\n      const lastStruct = structs[structs.length - 1];\n      const clockState = lastStruct.id.clock + lastStruct.length;\n      for (let i = 0, del = deletes[i]; i < deletes.length && del.clock < clockState; del = deletes[++i]) {\n        iterateStructs(transaction, structs, del.clock, del.len, f);\n      }\n    }\n  });\n\n/**\n * @param {Array<DeleteItem>} dis\n * @param {number} clock\n * @return {number|null}\n *\n * @private\n * @function\n */\nconst findIndexDS = (dis, clock) => {\n  let left = 0;\n  let right = dis.length - 1;\n  while (left <= right) {\n    const midindex = math.floor((left + right) / 2);\n    const mid = dis[midindex];\n    const midclock = mid.clock;\n    if (midclock <= clock) {\n      if (clock < midclock + mid.len) {\n        return midindex\n      }\n      left = midindex + 1;\n    } else {\n      right = midindex - 1;\n    }\n  }\n  return null\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {ID} id\n * @return {boolean}\n *\n * @private\n * @function\n */\nconst isDeleted = (ds, id) => {\n  const dis = ds.clients.get(id.client);\n  return dis !== undefined && findIndexDS(dis, id.clock) !== null\n};\n\n/**\n * @param {DeleteSet} ds\n *\n * @private\n * @function\n */\nconst sortAndMergeDeleteSet = ds => {\n  ds.clients.forEach(dels => {\n    dels.sort((a, b) => a.clock - b.clock);\n    // merge items without filtering or splicing the array\n    // i is the current pointer\n    // j refers to the current insert position for the pointed item\n    // try to merge dels[i] into dels[j-1] or set dels[j]=dels[i]\n    let i, j;\n    for (i = 1, j = 1; i < dels.length; i++) {\n      const left = dels[j - 1];\n      const right = dels[i];\n      if (left.clock + left.len >= right.clock) {\n        dels[j - 1] = new DeleteItem(left.clock, math.max(left.len, right.clock + right.len - left.clock));\n      } else {\n        if (j < i) {\n          dels[j] = right;\n        }\n        j++;\n      }\n    }\n    dels.length = j;\n  });\n};\n\n/**\n * @param {Array<DeleteSet>} dss\n * @return {DeleteSet} A fresh DeleteSet\n */\nconst mergeDeleteSets = dss => {\n  const merged = new DeleteSet();\n  for (let dssI = 0; dssI < dss.length; dssI++) {\n    dss[dssI].clients.forEach((delsLeft, client) => {\n      if (!merged.clients.has(client)) {\n        // Write all missing keys from current ds and all following.\n        // If merged already contains `client` current ds has already been added.\n        /**\n         * @type {Array<DeleteItem>}\n         */\n        const dels = delsLeft.slice();\n        for (let i = dssI + 1; i < dss.length; i++) {\n          array.appendTo(dels, dss[i].clients.get(client) || []);\n        }\n        merged.clients.set(client, dels);\n      }\n    });\n  }\n  sortAndMergeDeleteSet(merged);\n  return merged\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {number} client\n * @param {number} clock\n * @param {number} length\n *\n * @private\n * @function\n */\nconst addToDeleteSet = (ds, client, clock, length) => {\n  map.setIfUndefined(ds.clients, client, () => /** @type {Array<DeleteItem>} */ ([])).push(new DeleteItem(clock, length));\n};\n\nconst createDeleteSet = () => new DeleteSet();\n\n/**\n * @param {StructStore} ss\n * @return {DeleteSet} Merged and sorted DeleteSet\n *\n * @private\n * @function\n */\nconst createDeleteSetFromStructStore = ss => {\n  const ds = createDeleteSet();\n  ss.clients.forEach((structs, client) => {\n    /**\n     * @type {Array<DeleteItem>}\n     */\n    const dsitems = [];\n    for (let i = 0; i < structs.length; i++) {\n      const struct = structs[i];\n      if (struct.deleted) {\n        const clock = struct.id.clock;\n        let len = struct.length;\n        if (i + 1 < structs.length) {\n          for (let next = structs[i + 1]; i + 1 < structs.length && next.deleted; next = structs[++i + 1]) {\n            len += next.length;\n          }\n        }\n        dsitems.push(new DeleteItem(clock, len));\n      }\n    }\n    if (dsitems.length > 0) {\n      ds.clients.set(client, dsitems);\n    }\n  });\n  return ds\n};\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {DeleteSet} ds\n *\n * @private\n * @function\n */\nconst writeDeleteSet = (encoder, ds) => {\n  encoding.writeVarUint(encoder.restEncoder, ds.clients.size);\n\n  // Ensure that the delete set is written in a deterministic order\n  array.from(ds.clients.entries())\n    .sort((a, b) => b[0] - a[0])\n    .forEach(([client, dsitems]) => {\n      encoder.resetDsCurVal();\n      encoding.writeVarUint(encoder.restEncoder, client);\n      const len = dsitems.length;\n      encoding.writeVarUint(encoder.restEncoder, len);\n      for (let i = 0; i < len; i++) {\n        const item = dsitems[i];\n        encoder.writeDsClock(item.clock);\n        encoder.writeDsLen(item.len);\n      }\n    });\n};\n\n/**\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @return {DeleteSet}\n *\n * @private\n * @function\n */\nconst readDeleteSet = decoder => {\n  const ds = new DeleteSet();\n  const numClients = decoding.readVarUint(decoder.restDecoder);\n  for (let i = 0; i < numClients; i++) {\n    decoder.resetDsCurVal();\n    const client = decoding.readVarUint(decoder.restDecoder);\n    const numberOfDeletes = decoding.readVarUint(decoder.restDecoder);\n    if (numberOfDeletes > 0) {\n      const dsField = map.setIfUndefined(ds.clients, client, () => /** @type {Array<DeleteItem>} */ ([]));\n      for (let i = 0; i < numberOfDeletes; i++) {\n        dsField.push(new DeleteItem(decoder.readDsClock(), decoder.readDsLen()));\n      }\n    }\n  }\n  return ds\n};\n\n/**\n * @todo YDecoder also contains references to String and other Decoders. Would make sense to exchange YDecoder.toUint8Array for YDecoder.DsToUint8Array()..\n */\n\n/**\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @return {Uint8Array|null} Returns a v2 update containing all deletes that couldn't be applied yet; or null if all deletes were applied successfully.\n *\n * @private\n * @function\n */\nconst readAndApplyDeleteSet = (decoder, transaction, store) => {\n  const unappliedDS = new DeleteSet();\n  const numClients = decoding.readVarUint(decoder.restDecoder);\n  for (let i = 0; i < numClients; i++) {\n    decoder.resetDsCurVal();\n    const client = decoding.readVarUint(decoder.restDecoder);\n    const numberOfDeletes = decoding.readVarUint(decoder.restDecoder);\n    const structs = store.clients.get(client) || [];\n    const state = getState(store, client);\n    for (let i = 0; i < numberOfDeletes; i++) {\n      const clock = decoder.readDsClock();\n      const clockEnd = clock + decoder.readDsLen();\n      if (clock < state) {\n        if (state < clockEnd) {\n          addToDeleteSet(unappliedDS, client, state, clockEnd - state);\n        }\n        let index = findIndexSS(structs, clock);\n        /**\n         * We can ignore the case of GC and Delete structs, because we are going to skip them\n         * @type {Item}\n         */\n        // @ts-ignore\n        let struct = structs[index];\n        // split the first item if necessary\n        if (!struct.deleted && struct.id.clock < clock) {\n          structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock));\n          index++; // increase we now want to use the next struct\n        }\n        while (index < structs.length) {\n          // @ts-ignore\n          struct = structs[index++];\n          if (struct.id.clock < clockEnd) {\n            if (!struct.deleted) {\n              if (clockEnd < struct.id.clock + struct.length) {\n                structs.splice(index, 0, splitItem(transaction, struct, clockEnd - struct.id.clock));\n              }\n              struct.delete(transaction);\n            }\n          } else {\n            break\n          }\n        }\n      } else {\n        addToDeleteSet(unappliedDS, client, clock, clockEnd - clock);\n      }\n    }\n  }\n  if (unappliedDS.clients.size > 0) {\n    const ds = new UpdateEncoderV2();\n    encoding.writeVarUint(ds.restEncoder, 0); // encode 0 structs\n    writeDeleteSet(ds, unappliedDS);\n    return ds.toUint8Array()\n  }\n  return null\n};\n\n/**\n * @param {DeleteSet} ds1\n * @param {DeleteSet} ds2\n */\nconst equalDeleteSets = (ds1, ds2) => {\n  if (ds1.clients.size !== ds2.clients.size) return false\n  for (const [client, deleteItems1] of ds1.clients.entries()) {\n    const deleteItems2 = /** @type {Array<import('../internals.js').DeleteItem>} */ (ds2.clients.get(client));\n    if (deleteItems2 === undefined || deleteItems1.length !== deleteItems2.length) return false\n    for (let i = 0; i < deleteItems1.length; i++) {\n      const di1 = deleteItems1[i];\n      const di2 = deleteItems2[i];\n      if (di1.clock !== di2.clock || di1.len !== di2.len) {\n        return false\n      }\n    }\n  }\n  return true\n};\n\n/**\n * @module Y\n */\n\n\nconst generateNewClientId = random.uint32;\n\n/**\n * @typedef {Object} DocOpts\n * @property {boolean} [DocOpts.gc=true] Disable garbage collection (default: gc=true)\n * @property {function(Item):boolean} [DocOpts.gcFilter] Will be called before an Item is garbage collected. Return false to keep the Item.\n * @property {string} [DocOpts.guid] Define a globally unique identifier for this document\n * @property {string | null} [DocOpts.collectionid] Associate this document with a collection. This only plays a role if your provider has a concept of collection.\n * @property {any} [DocOpts.meta] Any kind of meta information you want to associate with this document. If this is a subdocument, remote peers will store the meta information as well.\n * @property {boolean} [DocOpts.autoLoad] If a subdocument, automatically load document. If this is a subdocument, remote peers will load the document as well automatically.\n * @property {boolean} [DocOpts.shouldLoad] Whether the document should be synced by the provider now. This is toggled to true when you call ydoc.load()\n */\n\n/**\n * @typedef {Object} DocEvents\n * @property {function(Doc):void} DocEvents.destroy\n * @property {function(Doc):void} DocEvents.load\n * @property {function(boolean, Doc):void} DocEvents.sync\n * @property {function(Uint8Array, any, Doc, Transaction):void} DocEvents.update\n * @property {function(Uint8Array, any, Doc, Transaction):void} DocEvents.updateV2\n * @property {function(Doc):void} DocEvents.beforeAllTransactions\n * @property {function(Transaction, Doc):void} DocEvents.beforeTransaction\n * @property {function(Transaction, Doc):void} DocEvents.beforeObserverCalls\n * @property {function(Transaction, Doc):void} DocEvents.afterTransaction\n * @property {function(Transaction, Doc):void} DocEvents.afterTransactionCleanup\n * @property {function(Doc, Array<Transaction>):void} DocEvents.afterAllTransactions\n * @property {function({ loaded: Set<Doc>, added: Set<Doc>, removed: Set<Doc> }, Doc, Transaction):void} DocEvents.subdocs\n */\n\n/**\n * A Yjs instance handles the state of shared data.\n * @extends ObservableV2<DocEvents>\n */\nclass Doc extends ObservableV2 {\n  /**\n   * @param {DocOpts} opts configuration\n   */\n  constructor ({ guid = random.uuidv4(), collectionid = null, gc = true, gcFilter = () => true, meta = null, autoLoad = false, shouldLoad = true } = {}) {\n    super();\n    this.gc = gc;\n    this.gcFilter = gcFilter;\n    this.clientID = generateNewClientId();\n    this.guid = guid;\n    this.collectionid = collectionid;\n    /**\n     * @type {Map<string, AbstractType<YEvent<any>>>}\n     */\n    this.share = new Map();\n    this.store = new StructStore();\n    /**\n     * @type {Transaction | null}\n     */\n    this._transaction = null;\n    /**\n     * @type {Array<Transaction>}\n     */\n    this._transactionCleanups = [];\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocs = new Set();\n    /**\n     * If this document is a subdocument - a document integrated into another document - then _item is defined.\n     * @type {Item?}\n     */\n    this._item = null;\n    this.shouldLoad = shouldLoad;\n    this.autoLoad = autoLoad;\n    this.meta = meta;\n    /**\n     * This is set to true when the persistence provider loaded the document from the database or when the `sync` event fires.\n     * Note that not all providers implement this feature. Provider authors are encouraged to fire the `load` event when the doc content is loaded from the database.\n     *\n     * @type {boolean}\n     */\n    this.isLoaded = false;\n    /**\n     * This is set to true when the connection provider has successfully synced with a backend.\n     * Note that when using peer-to-peer providers this event may not provide very useful.\n     * Also note that not all providers implement this feature. Provider authors are encouraged to fire\n     * the `sync` event when the doc has been synced (with `true` as a parameter) or if connection is\n     * lost (with false as a parameter).\n     */\n    this.isSynced = false;\n    this.isDestroyed = false;\n    /**\n     * Promise that resolves once the document has been loaded from a persistence provider.\n     */\n    this.whenLoaded = promise.create(resolve => {\n      this.on('load', () => {\n        this.isLoaded = true;\n        resolve(this);\n      });\n    });\n    const provideSyncedPromise = () => promise.create(resolve => {\n      /**\n       * @param {boolean} isSynced\n       */\n      const eventHandler = (isSynced) => {\n        if (isSynced === undefined || isSynced === true) {\n          this.off('sync', eventHandler);\n          resolve();\n        }\n      };\n      this.on('sync', eventHandler);\n    });\n    this.on('sync', isSynced => {\n      if (isSynced === false && this.isSynced) {\n        this.whenSynced = provideSyncedPromise();\n      }\n      this.isSynced = isSynced === undefined || isSynced === true;\n      if (this.isSynced && !this.isLoaded) {\n        this.emit('load', [this]);\n      }\n    });\n    /**\n     * Promise that resolves once the document has been synced with a backend.\n     * This promise is recreated when the connection is lost.\n     * Note the documentation about the `isSynced` property.\n     */\n    this.whenSynced = provideSyncedPromise();\n  }\n\n  /**\n   * Notify the parent document that you request to load data into this subdocument (if it is a subdocument).\n   *\n   * `load()` might be used in the future to request any provider to load the most current data.\n   *\n   * It is safe to call `load()` multiple times.\n   */\n  load () {\n    const item = this._item;\n    if (item !== null && !this.shouldLoad) {\n      transact(/** @type {any} */ (item.parent).doc, transaction => {\n        transaction.subdocsLoaded.add(this);\n      }, null, true);\n    }\n    this.shouldLoad = true;\n  }\n\n  getSubdocs () {\n    return this.subdocs\n  }\n\n  getSubdocGuids () {\n    return new Set(array.from(this.subdocs).map(doc => doc.guid))\n  }\n\n  /**\n   * Changes that happen inside of a transaction are bundled. This means that\n   * the observer fires _after_ the transaction is finished and that all changes\n   * that happened inside of the transaction are sent as one message to the\n   * other peers.\n   *\n   * @template T\n   * @param {function(Transaction):T} f The function that should be executed as a transaction\n   * @param {any} [origin] Origin of who started the transaction. Will be stored on transaction.origin\n   * @return T\n   *\n   * @public\n   */\n  transact (f, origin = null) {\n    return transact(this, f, origin)\n  }\n\n  /**\n   * Define a shared data type.\n   *\n   * Multiple calls of `ydoc.get(name, TypeConstructor)` yield the same result\n   * and do not overwrite each other. I.e.\n   * `ydoc.get(name, Y.Array) === ydoc.get(name, Y.Array)`\n   *\n   * After this method is called, the type is also available on `ydoc.share.get(name)`.\n   *\n   * *Best Practices:*\n   * Define all types right after the Y.Doc instance is created and store them in a separate object.\n   * Also use the typed methods `getText(name)`, `getArray(name)`, ..\n   *\n   * @template {typeof AbstractType<any>} Type\n   * @example\n   *   const ydoc = new Y.Doc(..)\n   *   const appState = {\n   *     document: ydoc.getText('document')\n   *     comments: ydoc.getArray('comments')\n   *   }\n   *\n   * @param {string} name\n   * @param {Type} TypeConstructor The constructor of the type definition. E.g. Y.Text, Y.Array, Y.Map, ...\n   * @return {InstanceType<Type>} The created type. Constructed with TypeConstructor\n   *\n   * @public\n   */\n  get (name, TypeConstructor = /** @type {any} */ (AbstractType)) {\n    const type = map.setIfUndefined(this.share, name, () => {\n      // @ts-ignore\n      const t = new TypeConstructor();\n      t._integrate(this, null);\n      return t\n    });\n    const Constr = type.constructor;\n    if (TypeConstructor !== AbstractType && Constr !== TypeConstructor) {\n      if (Constr === AbstractType) {\n        // @ts-ignore\n        const t = new TypeConstructor();\n        t._map = type._map;\n        type._map.forEach(/** @param {Item?} n */ n => {\n          for (; n !== null; n = n.left) {\n            // @ts-ignore\n            n.parent = t;\n          }\n        });\n        t._start = type._start;\n        for (let n = t._start; n !== null; n = n.right) {\n          n.parent = t;\n        }\n        t._length = type._length;\n        this.share.set(name, t);\n        t._integrate(this, null);\n        return /** @type {InstanceType<Type>} */ (t)\n      } else {\n        throw new Error(`Type with the name ${name} has already been defined with a different constructor`)\n      }\n    }\n    return /** @type {InstanceType<Type>} */ (type)\n  }\n\n  /**\n   * @template T\n   * @param {string} [name]\n   * @return {YArray<T>}\n   *\n   * @public\n   */\n  getArray (name = '') {\n    return /** @type {YArray<T>} */ (this.get(name, YArray))\n  }\n\n  /**\n   * @param {string} [name]\n   * @return {YText}\n   *\n   * @public\n   */\n  getText (name = '') {\n    return this.get(name, YText)\n  }\n\n  /**\n   * @template T\n   * @param {string} [name]\n   * @return {YMap<T>}\n   *\n   * @public\n   */\n  getMap (name = '') {\n    return /** @type {YMap<T>} */ (this.get(name, YMap))\n  }\n\n  /**\n   * @param {string} [name]\n   * @return {YXmlElement}\n   *\n   * @public\n   */\n  getXmlElement (name = '') {\n    return /** @type {YXmlElement<{[key:string]:string}>} */ (this.get(name, YXmlElement))\n  }\n\n  /**\n   * @param {string} [name]\n   * @return {YXmlFragment}\n   *\n   * @public\n   */\n  getXmlFragment (name = '') {\n    return this.get(name, YXmlFragment)\n  }\n\n  /**\n   * Converts the entire document into a js object, recursively traversing each yjs type\n   * Doesn't log types that have not been defined (using ydoc.getType(..)).\n   *\n   * @deprecated Do not use this method and rather call toJSON directly on the shared types.\n   *\n   * @return {Object<string, any>}\n   */\n  toJSON () {\n    /**\n     * @type {Object<string, any>}\n     */\n    const doc = {};\n\n    this.share.forEach((value, key) => {\n      doc[key] = value.toJSON();\n    });\n\n    return doc\n  }\n\n  /**\n   * Emit `destroy` event and unregister all event handlers.\n   */\n  destroy () {\n    this.isDestroyed = true;\n    array.from(this.subdocs).forEach(subdoc => subdoc.destroy());\n    const item = this._item;\n    if (item !== null) {\n      this._item = null;\n      const content = /** @type {ContentDoc} */ (item.content);\n      content.doc = new Doc({ guid: this.guid, ...content.opts, shouldLoad: false });\n      content.doc._item = item;\n      transact(/** @type {any} */ (item).parent.doc, transaction => {\n        const doc = content.doc;\n        if (!item.deleted) {\n          transaction.subdocsAdded.add(doc);\n        }\n        transaction.subdocsRemoved.add(this);\n      }, null, true);\n    }\n    // @ts-ignore\n    this.emit('destroyed', [true]); // DEPRECATED!\n    this.emit('destroy', [this]);\n    super.destroy();\n  }\n}\n\nclass DSDecoderV1 {\n  /**\n   * @param {decoding.Decoder} decoder\n   */\n  constructor (decoder) {\n    this.restDecoder = decoder;\n  }\n\n  resetDsCurVal () {\n    // nop\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsClock () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsLen () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n}\n\nclass UpdateDecoderV1 extends DSDecoderV1 {\n  /**\n   * @return {ID}\n   */\n  readLeftID () {\n    return createID(decoding.readVarUint(this.restDecoder), decoding.readVarUint(this.restDecoder))\n  }\n\n  /**\n   * @return {ID}\n   */\n  readRightID () {\n    return createID(decoding.readVarUint(this.restDecoder), decoding.readVarUint(this.restDecoder))\n  }\n\n  /**\n   * Read the next client id.\n   * Use this in favor of readID whenever possible to reduce the number of objects created.\n   */\n  readClient () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * @return {number} info An unsigned 8-bit integer\n   */\n  readInfo () {\n    return decoding.readUint8(this.restDecoder)\n  }\n\n  /**\n   * @return {string}\n   */\n  readString () {\n    return decoding.readVarString(this.restDecoder)\n  }\n\n  /**\n   * @return {boolean} isKey\n   */\n  readParentInfo () {\n    return decoding.readVarUint(this.restDecoder) === 1\n  }\n\n  /**\n   * @return {number} info An unsigned 8-bit integer\n   */\n  readTypeRef () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @return {number} len\n   */\n  readLen () {\n    return decoding.readVarUint(this.restDecoder)\n  }\n\n  /**\n   * @return {any}\n   */\n  readAny () {\n    return decoding.readAny(this.restDecoder)\n  }\n\n  /**\n   * @return {Uint8Array}\n   */\n  readBuf () {\n    return buffer.copyUint8Array(decoding.readVarUint8Array(this.restDecoder))\n  }\n\n  /**\n   * Legacy implementation uses JSON parse. We use any-decoding in v2.\n   *\n   * @return {any}\n   */\n  readJSON () {\n    return JSON.parse(decoding.readVarString(this.restDecoder))\n  }\n\n  /**\n   * @return {string}\n   */\n  readKey () {\n    return decoding.readVarString(this.restDecoder)\n  }\n}\n\nclass DSDecoderV2 {\n  /**\n   * @param {decoding.Decoder} decoder\n   */\n  constructor (decoder) {\n    /**\n     * @private\n     */\n    this.dsCurrVal = 0;\n    this.restDecoder = decoder;\n  }\n\n  resetDsCurVal () {\n    this.dsCurrVal = 0;\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsClock () {\n    this.dsCurrVal += decoding.readVarUint(this.restDecoder);\n    return this.dsCurrVal\n  }\n\n  /**\n   * @return {number}\n   */\n  readDsLen () {\n    const diff = decoding.readVarUint(this.restDecoder) + 1;\n    this.dsCurrVal += diff;\n    return diff\n  }\n}\n\nclass UpdateDecoderV2 extends DSDecoderV2 {\n  /**\n   * @param {decoding.Decoder} decoder\n   */\n  constructor (decoder) {\n    super(decoder);\n    /**\n     * List of cached keys. If the keys[id] does not exist, we read a new key\n     * from stringEncoder and push it to keys.\n     *\n     * @type {Array<string>}\n     */\n    this.keys = [];\n    decoding.readVarUint(decoder); // read feature flag - currently unused\n    this.keyClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder));\n    this.clientDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder));\n    this.leftClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder));\n    this.rightClockDecoder = new decoding.IntDiffOptRleDecoder(decoding.readVarUint8Array(decoder));\n    this.infoDecoder = new decoding.RleDecoder(decoding.readVarUint8Array(decoder), decoding.readUint8);\n    this.stringDecoder = new decoding.StringDecoder(decoding.readVarUint8Array(decoder));\n    this.parentInfoDecoder = new decoding.RleDecoder(decoding.readVarUint8Array(decoder), decoding.readUint8);\n    this.typeRefDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder));\n    this.lenDecoder = new decoding.UintOptRleDecoder(decoding.readVarUint8Array(decoder));\n  }\n\n  /**\n   * @return {ID}\n   */\n  readLeftID () {\n    return new ID(this.clientDecoder.read(), this.leftClockDecoder.read())\n  }\n\n  /**\n   * @return {ID}\n   */\n  readRightID () {\n    return new ID(this.clientDecoder.read(), this.rightClockDecoder.read())\n  }\n\n  /**\n   * Read the next client id.\n   * Use this in favor of readID whenever possible to reduce the number of objects created.\n   */\n  readClient () {\n    return this.clientDecoder.read()\n  }\n\n  /**\n   * @return {number} info An unsigned 8-bit integer\n   */\n  readInfo () {\n    return /** @type {number} */ (this.infoDecoder.read())\n  }\n\n  /**\n   * @return {string}\n   */\n  readString () {\n    return this.stringDecoder.read()\n  }\n\n  /**\n   * @return {boolean}\n   */\n  readParentInfo () {\n    return this.parentInfoDecoder.read() === 1\n  }\n\n  /**\n   * @return {number} An unsigned 8-bit integer\n   */\n  readTypeRef () {\n    return this.typeRefDecoder.read()\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @return {number}\n   */\n  readLen () {\n    return this.lenDecoder.read()\n  }\n\n  /**\n   * @return {any}\n   */\n  readAny () {\n    return decoding.readAny(this.restDecoder)\n  }\n\n  /**\n   * @return {Uint8Array}\n   */\n  readBuf () {\n    return decoding.readVarUint8Array(this.restDecoder)\n  }\n\n  /**\n   * This is mainly here for legacy purposes.\n   *\n   * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder.\n   *\n   * @return {any}\n   */\n  readJSON () {\n    return decoding.readAny(this.restDecoder)\n  }\n\n  /**\n   * @return {string}\n   */\n  readKey () {\n    const keyClock = this.keyClockDecoder.read();\n    if (keyClock < this.keys.length) {\n      return this.keys[keyClock]\n    } else {\n      const key = this.stringDecoder.read();\n      this.keys.push(key);\n      return key\n    }\n  }\n}\n\nclass DSEncoderV1 {\n  constructor () {\n    this.restEncoder = encoding.createEncoder();\n  }\n\n  toUint8Array () {\n    return encoding.toUint8Array(this.restEncoder)\n  }\n\n  resetDsCurVal () {\n    // nop\n  }\n\n  /**\n   * @param {number} clock\n   */\n  writeDsClock (clock) {\n    encoding.writeVarUint(this.restEncoder, clock);\n  }\n\n  /**\n   * @param {number} len\n   */\n  writeDsLen (len) {\n    encoding.writeVarUint(this.restEncoder, len);\n  }\n}\n\nclass UpdateEncoderV1 extends DSEncoderV1 {\n  /**\n   * @param {ID} id\n   */\n  writeLeftID (id) {\n    encoding.writeVarUint(this.restEncoder, id.client);\n    encoding.writeVarUint(this.restEncoder, id.clock);\n  }\n\n  /**\n   * @param {ID} id\n   */\n  writeRightID (id) {\n    encoding.writeVarUint(this.restEncoder, id.client);\n    encoding.writeVarUint(this.restEncoder, id.clock);\n  }\n\n  /**\n   * Use writeClient and writeClock instead of writeID if possible.\n   * @param {number} client\n   */\n  writeClient (client) {\n    encoding.writeVarUint(this.restEncoder, client);\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeInfo (info) {\n    encoding.writeUint8(this.restEncoder, info);\n  }\n\n  /**\n   * @param {string} s\n   */\n  writeString (s) {\n    encoding.writeVarString(this.restEncoder, s);\n  }\n\n  /**\n   * @param {boolean} isYKey\n   */\n  writeParentInfo (isYKey) {\n    encoding.writeVarUint(this.restEncoder, isYKey ? 1 : 0);\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeTypeRef (info) {\n    encoding.writeVarUint(this.restEncoder, info);\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @param {number} len\n   */\n  writeLen (len) {\n    encoding.writeVarUint(this.restEncoder, len);\n  }\n\n  /**\n   * @param {any} any\n   */\n  writeAny (any) {\n    encoding.writeAny(this.restEncoder, any);\n  }\n\n  /**\n   * @param {Uint8Array} buf\n   */\n  writeBuf (buf) {\n    encoding.writeVarUint8Array(this.restEncoder, buf);\n  }\n\n  /**\n   * @param {any} embed\n   */\n  writeJSON (embed) {\n    encoding.writeVarString(this.restEncoder, JSON.stringify(embed));\n  }\n\n  /**\n   * @param {string} key\n   */\n  writeKey (key) {\n    encoding.writeVarString(this.restEncoder, key);\n  }\n}\n\nclass DSEncoderV2 {\n  constructor () {\n    this.restEncoder = encoding.createEncoder(); // encodes all the rest / non-optimized\n    this.dsCurrVal = 0;\n  }\n\n  toUint8Array () {\n    return encoding.toUint8Array(this.restEncoder)\n  }\n\n  resetDsCurVal () {\n    this.dsCurrVal = 0;\n  }\n\n  /**\n   * @param {number} clock\n   */\n  writeDsClock (clock) {\n    const diff = clock - this.dsCurrVal;\n    this.dsCurrVal = clock;\n    encoding.writeVarUint(this.restEncoder, diff);\n  }\n\n  /**\n   * @param {number} len\n   */\n  writeDsLen (len) {\n    if (len === 0) {\n      error.unexpectedCase();\n    }\n    encoding.writeVarUint(this.restEncoder, len - 1);\n    this.dsCurrVal += len;\n  }\n}\n\nclass UpdateEncoderV2 extends DSEncoderV2 {\n  constructor () {\n    super();\n    /**\n     * @type {Map<string,number>}\n     */\n    this.keyMap = new Map();\n    /**\n     * Refers to the next unique key-identifier to me used.\n     * See writeKey method for more information.\n     *\n     * @type {number}\n     */\n    this.keyClock = 0;\n    this.keyClockEncoder = new encoding.IntDiffOptRleEncoder();\n    this.clientEncoder = new encoding.UintOptRleEncoder();\n    this.leftClockEncoder = new encoding.IntDiffOptRleEncoder();\n    this.rightClockEncoder = new encoding.IntDiffOptRleEncoder();\n    this.infoEncoder = new encoding.RleEncoder(encoding.writeUint8);\n    this.stringEncoder = new encoding.StringEncoder();\n    this.parentInfoEncoder = new encoding.RleEncoder(encoding.writeUint8);\n    this.typeRefEncoder = new encoding.UintOptRleEncoder();\n    this.lenEncoder = new encoding.UintOptRleEncoder();\n  }\n\n  toUint8Array () {\n    const encoder = encoding.createEncoder();\n    encoding.writeVarUint(encoder, 0); // this is a feature flag that we might use in the future\n    encoding.writeVarUint8Array(encoder, this.keyClockEncoder.toUint8Array());\n    encoding.writeVarUint8Array(encoder, this.clientEncoder.toUint8Array());\n    encoding.writeVarUint8Array(encoder, this.leftClockEncoder.toUint8Array());\n    encoding.writeVarUint8Array(encoder, this.rightClockEncoder.toUint8Array());\n    encoding.writeVarUint8Array(encoder, encoding.toUint8Array(this.infoEncoder));\n    encoding.writeVarUint8Array(encoder, this.stringEncoder.toUint8Array());\n    encoding.writeVarUint8Array(encoder, encoding.toUint8Array(this.parentInfoEncoder));\n    encoding.writeVarUint8Array(encoder, this.typeRefEncoder.toUint8Array());\n    encoding.writeVarUint8Array(encoder, this.lenEncoder.toUint8Array());\n    // @note The rest encoder is appended! (note the missing var)\n    encoding.writeUint8Array(encoder, encoding.toUint8Array(this.restEncoder));\n    return encoding.toUint8Array(encoder)\n  }\n\n  /**\n   * @param {ID} id\n   */\n  writeLeftID (id) {\n    this.clientEncoder.write(id.client);\n    this.leftClockEncoder.write(id.clock);\n  }\n\n  /**\n   * @param {ID} id\n   */\n  writeRightID (id) {\n    this.clientEncoder.write(id.client);\n    this.rightClockEncoder.write(id.clock);\n  }\n\n  /**\n   * @param {number} client\n   */\n  writeClient (client) {\n    this.clientEncoder.write(client);\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeInfo (info) {\n    this.infoEncoder.write(info);\n  }\n\n  /**\n   * @param {string} s\n   */\n  writeString (s) {\n    this.stringEncoder.write(s);\n  }\n\n  /**\n   * @param {boolean} isYKey\n   */\n  writeParentInfo (isYKey) {\n    this.parentInfoEncoder.write(isYKey ? 1 : 0);\n  }\n\n  /**\n   * @param {number} info An unsigned 8-bit integer\n   */\n  writeTypeRef (info) {\n    this.typeRefEncoder.write(info);\n  }\n\n  /**\n   * Write len of a struct - well suited for Opt RLE encoder.\n   *\n   * @param {number} len\n   */\n  writeLen (len) {\n    this.lenEncoder.write(len);\n  }\n\n  /**\n   * @param {any} any\n   */\n  writeAny (any) {\n    encoding.writeAny(this.restEncoder, any);\n  }\n\n  /**\n   * @param {Uint8Array} buf\n   */\n  writeBuf (buf) {\n    encoding.writeVarUint8Array(this.restEncoder, buf);\n  }\n\n  /**\n   * This is mainly here for legacy purposes.\n   *\n   * Initial we incoded objects using JSON. Now we use the much faster lib0/any-encoder. This method mainly exists for legacy purposes for the v1 encoder.\n   *\n   * @param {any} embed\n   */\n  writeJSON (embed) {\n    encoding.writeAny(this.restEncoder, embed);\n  }\n\n  /**\n   * Property keys are often reused. For example, in y-prosemirror the key `bold` might\n   * occur very often. For a 3d application, the key `position` might occur very often.\n   *\n   * We cache these keys in a Map and refer to them via a unique number.\n   *\n   * @param {string} key\n   */\n  writeKey (key) {\n    const clock = this.keyMap.get(key);\n    if (clock === undefined) {\n      /**\n       * @todo uncomment to introduce this feature finally\n       *\n       * Background. The ContentFormat object was always encoded using writeKey, but the decoder used to use readString.\n       * Furthermore, I forgot to set the keyclock. So everything was working fine.\n       *\n       * However, this feature here is basically useless as it is not being used (it actually only consumes extra memory).\n       *\n       * I don't know yet how to reintroduce this feature..\n       *\n       * Older clients won't be able to read updates when we reintroduce this feature. So this should probably be done using a flag.\n       *\n       */\n      // this.keyMap.set(key, this.keyClock)\n      this.keyClockEncoder.write(this.keyClock++);\n      this.stringEncoder.write(key);\n    } else {\n      this.keyClockEncoder.write(clock);\n    }\n  }\n}\n\n/**\n * @module encoding\n */\n/*\n * We use the first five bits in the info flag for determining the type of the struct.\n *\n * 0: GC\n * 1: Item with Deleted content\n * 2: Item with JSON content\n * 3: Item with Binary content\n * 4: Item with String content\n * 5: Item with Embed content (for richtext content)\n * 6: Item with Format content (a formatting marker for richtext content)\n * 7: Item with Type\n */\n\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Array<GC|Item>} structs All structs by `client`\n * @param {number} client\n * @param {number} clock write structs starting with `ID(client,clock)`\n *\n * @function\n */\nconst writeStructs = (encoder, structs, client, clock) => {\n  // write first id\n  clock = math.max(clock, structs[0].id.clock); // make sure the first id exists\n  const startNewStructs = findIndexSS(structs, clock);\n  // write # encoded structs\n  encoding.writeVarUint(encoder.restEncoder, structs.length - startNewStructs);\n  encoder.writeClient(client);\n  encoding.writeVarUint(encoder.restEncoder, clock);\n  const firstStruct = structs[startNewStructs];\n  // write first struct with an offset\n  firstStruct.write(encoder, clock - firstStruct.id.clock);\n  for (let i = startNewStructs + 1; i < structs.length; i++) {\n    structs[i].write(encoder, 0);\n  }\n};\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {StructStore} store\n * @param {Map<number,number>} _sm\n *\n * @private\n * @function\n */\nconst writeClientsStructs = (encoder, store, _sm) => {\n  // we filter all valid _sm entries into sm\n  const sm = new Map();\n  _sm.forEach((clock, client) => {\n    // only write if new structs are available\n    if (getState(store, client) > clock) {\n      sm.set(client, clock);\n    }\n  });\n  getStateVector(store).forEach((_clock, client) => {\n    if (!_sm.has(client)) {\n      sm.set(client, 0);\n    }\n  });\n  // write # states that were updated\n  encoding.writeVarUint(encoder.restEncoder, sm.size);\n  // Write items with higher client ids first\n  // This heavily improves the conflict algorithm.\n  array.from(sm.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {\n    writeStructs(encoder, /** @type {Array<GC|Item>} */ (store.clients.get(client)), client, clock);\n  });\n};\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder The decoder object to read data from.\n * @param {Doc} doc\n * @return {Map<number, { i: number, refs: Array<Item | GC> }>}\n *\n * @private\n * @function\n */\nconst readClientsStructRefs = (decoder, doc) => {\n  /**\n   * @type {Map<number, { i: number, refs: Array<Item | GC> }>}\n   */\n  const clientRefs = map.create();\n  const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder);\n  for (let i = 0; i < numOfStateUpdates; i++) {\n    const numberOfStructs = decoding.readVarUint(decoder.restDecoder);\n    /**\n     * @type {Array<GC|Item>}\n     */\n    const refs = new Array(numberOfStructs);\n    const client = decoder.readClient();\n    let clock = decoding.readVarUint(decoder.restDecoder);\n    // const start = performance.now()\n    clientRefs.set(client, { i: 0, refs });\n    for (let i = 0; i < numberOfStructs; i++) {\n      const info = decoder.readInfo();\n      switch (binary.BITS5 & info) {\n        case 0: { // GC\n          const len = decoder.readLen();\n          refs[i] = new GC(createID(client, clock), len);\n          clock += len;\n          break\n        }\n        case 10: { // Skip Struct (nothing to apply)\n          // @todo we could reduce the amount of checks by adding Skip struct to clientRefs so we know that something is missing.\n          const len = decoding.readVarUint(decoder.restDecoder);\n          refs[i] = new Skip(createID(client, clock), len);\n          clock += len;\n          break\n        }\n        default: { // Item with content\n          /**\n           * The optimized implementation doesn't use any variables because inlining variables is faster.\n           * Below a non-optimized version is shown that implements the basic algorithm with\n           * a few comments\n           */\n          const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0;\n          // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n          // and we read the next string as parentYKey.\n          // It indicates how we store/retrieve parent from `y.share`\n          // @type {string|null}\n          const struct = new Item(\n            createID(client, clock),\n            null, // left\n            (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null, // origin\n            null, // right\n            (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null, // right origin\n            cantCopyParentInfo ? (decoder.readParentInfo() ? doc.get(decoder.readString()) : decoder.readLeftID()) : null, // parent\n            cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n            readItemContent(decoder, info) // item content\n          );\n          /* A non-optimized implementation of the above algorithm:\n\n          // The item that was originally to the left of this item.\n          const origin = (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null\n          // The item that was originally to the right of this item.\n          const rightOrigin = (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null\n          const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0\n          const hasParentYKey = cantCopyParentInfo ? decoder.readParentInfo() : false\n          // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n          // and we read the next string as parentYKey.\n          // It indicates how we store/retrieve parent from `y.share`\n          // @type {string|null}\n          const parentYKey = cantCopyParentInfo && hasParentYKey ? decoder.readString() : null\n\n          const struct = new Item(\n            createID(client, clock),\n            null, // left\n            origin, // origin\n            null, // right\n            rightOrigin, // right origin\n            cantCopyParentInfo && !hasParentYKey ? decoder.readLeftID() : (parentYKey !== null ? doc.get(parentYKey) : null), // parent\n            cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n            readItemContent(decoder, info) // item content\n          )\n          */\n          refs[i] = struct;\n          clock += struct.length;\n        }\n      }\n    }\n    // console.log('time to read: ', performance.now() - start) // @todo remove\n  }\n  return clientRefs\n};\n\n/**\n * Resume computing structs generated by struct readers.\n *\n * While there is something to do, we integrate structs in this order\n * 1. top element on stack, if stack is not empty\n * 2. next element from current struct reader (if empty, use next struct reader)\n *\n * If struct causally depends on another struct (ref.missing), we put next reader of\n * `ref.id.client` on top of stack.\n *\n * At some point we find a struct that has no causal dependencies,\n * then we start emptying the stack.\n *\n * It is not possible to have circles: i.e. struct1 (from client1) depends on struct2 (from client2)\n * depends on struct3 (from client1). Therefore the max stack size is equal to `structReaders.length`.\n *\n * This method is implemented in a way so that we can resume computation if this update\n * causally depends on another update.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @param {Map<number, { i: number, refs: (GC | Item)[] }>} clientsStructRefs\n * @return { null | { update: Uint8Array, missing: Map<number,number> } }\n *\n * @private\n * @function\n */\nconst integrateStructs = (transaction, store, clientsStructRefs) => {\n  /**\n   * @type {Array<Item | GC>}\n   */\n  const stack = [];\n  // sort them so that we take the higher id first, in case of conflicts the lower id will probably not conflict with the id from the higher user.\n  let clientsStructRefsIds = array.from(clientsStructRefs.keys()).sort((a, b) => a - b);\n  if (clientsStructRefsIds.length === 0) {\n    return null\n  }\n  const getNextStructTarget = () => {\n    if (clientsStructRefsIds.length === 0) {\n      return null\n    }\n    let nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ (clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]));\n    while (nextStructsTarget.refs.length === nextStructsTarget.i) {\n      clientsStructRefsIds.pop();\n      if (clientsStructRefsIds.length > 0) {\n        nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */ (clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]));\n      } else {\n        return null\n      }\n    }\n    return nextStructsTarget\n  };\n  let curStructsTarget = getNextStructTarget();\n  if (curStructsTarget === null) {\n    return null\n  }\n\n  /**\n   * @type {StructStore}\n   */\n  const restStructs = new StructStore();\n  const missingSV = new Map();\n  /**\n   * @param {number} client\n   * @param {number} clock\n   */\n  const updateMissingSv = (client, clock) => {\n    const mclock = missingSV.get(client);\n    if (mclock == null || mclock > clock) {\n      missingSV.set(client, clock);\n    }\n  };\n  /**\n   * @type {GC|Item}\n   */\n  let stackHead = /** @type {any} */ (curStructsTarget).refs[/** @type {any} */ (curStructsTarget).i++];\n  // caching the state because it is used very often\n  const state = new Map();\n\n  const addStackToRestSS = () => {\n    for (const item of stack) {\n      const client = item.id.client;\n      const inapplicableItems = clientsStructRefs.get(client);\n      if (inapplicableItems) {\n        // decrement because we weren't able to apply previous operation\n        inapplicableItems.i--;\n        restStructs.clients.set(client, inapplicableItems.refs.slice(inapplicableItems.i));\n        clientsStructRefs.delete(client);\n        inapplicableItems.i = 0;\n        inapplicableItems.refs = [];\n      } else {\n        // item was the last item on clientsStructRefs and the field was already cleared. Add item to restStructs and continue\n        restStructs.clients.set(client, [item]);\n      }\n      // remove client from clientsStructRefsIds to prevent users from applying the same update again\n      clientsStructRefsIds = clientsStructRefsIds.filter(c => c !== client);\n    }\n    stack.length = 0;\n  };\n\n  // iterate over all struct readers until we are done\n  while (true) {\n    if (stackHead.constructor !== Skip) {\n      const localClock = map.setIfUndefined(state, stackHead.id.client, () => getState(store, stackHead.id.client));\n      const offset = localClock - stackHead.id.clock;\n      if (offset < 0) {\n        // update from the same client is missing\n        stack.push(stackHead);\n        updateMissingSv(stackHead.id.client, stackHead.id.clock - 1);\n        // hid a dead wall, add all items from stack to restSS\n        addStackToRestSS();\n      } else {\n        const missing = stackHead.getMissing(transaction, store);\n        if (missing !== null) {\n          stack.push(stackHead);\n          // get the struct reader that has the missing struct\n          /**\n           * @type {{ refs: Array<GC|Item>, i: number }}\n           */\n          const structRefs = clientsStructRefs.get(/** @type {number} */ (missing)) || { refs: [], i: 0 };\n          if (structRefs.refs.length === structRefs.i) {\n            // This update message causally depends on another update message that doesn't exist yet\n            updateMissingSv(/** @type {number} */ (missing), getState(store, missing));\n            addStackToRestSS();\n          } else {\n            stackHead = structRefs.refs[structRefs.i++];\n            continue\n          }\n        } else if (offset === 0 || offset < stackHead.length) {\n          // all fine, apply the stackhead\n          stackHead.integrate(transaction, offset);\n          state.set(stackHead.id.client, stackHead.id.clock + stackHead.length);\n        }\n      }\n    }\n    // iterate to next stackHead\n    if (stack.length > 0) {\n      stackHead = /** @type {GC|Item} */ (stack.pop());\n    } else if (curStructsTarget !== null && curStructsTarget.i < curStructsTarget.refs.length) {\n      stackHead = /** @type {GC|Item} */ (curStructsTarget.refs[curStructsTarget.i++]);\n    } else {\n      curStructsTarget = getNextStructTarget();\n      if (curStructsTarget === null) {\n        // we are done!\n        break\n      } else {\n        stackHead = /** @type {GC|Item} */ (curStructsTarget.refs[curStructsTarget.i++]);\n      }\n    }\n  }\n  if (restStructs.clients.size > 0) {\n    const encoder = new UpdateEncoderV2();\n    writeClientsStructs(encoder, restStructs, new Map());\n    // write empty deleteset\n    // writeDeleteSet(encoder, new DeleteSet())\n    encoding.writeVarUint(encoder.restEncoder, 0); // => no need for an extra function call, just write 0 deletes\n    return { missing: missingSV, update: encoder.toUint8Array() }\n  }\n  return null\n};\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Transaction} transaction\n *\n * @private\n * @function\n */\nconst writeStructsFromTransaction = (encoder, transaction) => writeClientsStructs(encoder, transaction.doc.store, transaction.beforeState);\n\n/**\n * Read and apply a document update.\n *\n * This function has the same effect as `applyUpdate` but accepts a decoder.\n *\n * @param {decoding.Decoder} decoder\n * @param {Doc} ydoc\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n * @param {UpdateDecoderV1 | UpdateDecoderV2} [structDecoder]\n *\n * @function\n */\nconst readUpdateV2 = (decoder, ydoc, transactionOrigin, structDecoder = new UpdateDecoderV2(decoder)) =>\n  transact(ydoc, transaction => {\n    // force that transaction.local is set to non-local\n    transaction.local = false;\n    let retry = false;\n    const doc = transaction.doc;\n    const store = doc.store;\n    // let start = performance.now()\n    const ss = readClientsStructRefs(structDecoder, doc);\n    // console.log('time to read structs: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    // console.log('time to merge: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    const restStructs = integrateStructs(transaction, store, ss);\n    const pending = store.pendingStructs;\n    if (pending) {\n      // check if we can apply something\n      for (const [client, clock] of pending.missing) {\n        if (clock < getState(store, client)) {\n          retry = true;\n          break\n        }\n      }\n      if (restStructs) {\n        // merge restStructs into store.pending\n        for (const [client, clock] of restStructs.missing) {\n          const mclock = pending.missing.get(client);\n          if (mclock == null || mclock > clock) {\n            pending.missing.set(client, clock);\n          }\n        }\n        pending.update = mergeUpdatesV2([pending.update, restStructs.update]);\n      }\n    } else {\n      store.pendingStructs = restStructs;\n    }\n    // console.log('time to integrate: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    const dsRest = readAndApplyDeleteSet(structDecoder, transaction, store);\n    if (store.pendingDs) {\n      // @todo we could make a lower-bound state-vector check as we do above\n      const pendingDSUpdate = new UpdateDecoderV2(decoding.createDecoder(store.pendingDs));\n      decoding.readVarUint(pendingDSUpdate.restDecoder); // read 0 structs, because we only encode deletes in pendingdsupdate\n      const dsRest2 = readAndApplyDeleteSet(pendingDSUpdate, transaction, store);\n      if (dsRest && dsRest2) {\n        // case 1: ds1 != null && ds2 != null\n        store.pendingDs = mergeUpdatesV2([dsRest, dsRest2]);\n      } else {\n        // case 2: ds1 != null\n        // case 3: ds2 != null\n        // case 4: ds1 == null && ds2 == null\n        store.pendingDs = dsRest || dsRest2;\n      }\n    } else {\n      // Either dsRest == null && pendingDs == null OR dsRest != null\n      store.pendingDs = dsRest;\n    }\n    // console.log('time to cleanup: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n\n    // console.log('time to resume delete readers: ', performance.now() - start) // @todo remove\n    // start = performance.now()\n    if (retry) {\n      const update = /** @type {{update: Uint8Array}} */ (store.pendingStructs).update;\n      store.pendingStructs = null;\n      applyUpdateV2(transaction.doc, update);\n    }\n  }, transactionOrigin, false);\n\n/**\n * Read and apply a document update.\n *\n * This function has the same effect as `applyUpdate` but accepts a decoder.\n *\n * @param {decoding.Decoder} decoder\n * @param {Doc} ydoc\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n *\n * @function\n */\nconst readUpdate = (decoder, ydoc, transactionOrigin) => readUpdateV2(decoder, ydoc, transactionOrigin, new UpdateDecoderV1(decoder));\n\n/**\n * Apply a document update created by, for example, `y.on('update', update => ..)` or `update = encodeStateAsUpdate()`.\n *\n * This function has the same effect as `readUpdate` but accepts an Uint8Array instead of a Decoder.\n *\n * @param {Doc} ydoc\n * @param {Uint8Array} update\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n *\n * @function\n */\nconst applyUpdateV2 = (ydoc, update, transactionOrigin, YDecoder = UpdateDecoderV2) => {\n  const decoder = decoding.createDecoder(update);\n  readUpdateV2(decoder, ydoc, transactionOrigin, new YDecoder(decoder));\n};\n\n/**\n * Apply a document update created by, for example, `y.on('update', update => ..)` or `update = encodeStateAsUpdate()`.\n *\n * This function has the same effect as `readUpdate` but accepts an Uint8Array instead of a Decoder.\n *\n * @param {Doc} ydoc\n * @param {Uint8Array} update\n * @param {any} [transactionOrigin] This will be stored on `transaction.origin` and `.on('update', (update, origin))`\n *\n * @function\n */\nconst applyUpdate = (ydoc, update, transactionOrigin) => applyUpdateV2(ydoc, update, transactionOrigin, UpdateDecoderV1);\n\n/**\n * Write all the document as a single update message. If you specify the state of the remote client (`targetStateVector`) it will\n * only write the operations that are missing.\n *\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Doc} doc\n * @param {Map<number,number>} [targetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n *\n * @function\n */\nconst writeStateAsUpdate = (encoder, doc, targetStateVector = new Map()) => {\n  writeClientsStructs(encoder, doc.store, targetStateVector);\n  writeDeleteSet(encoder, createDeleteSetFromStructStore(doc.store));\n};\n\n/**\n * Write all the document as a single update message that can be applied on the remote document. If you specify the state of the remote client (`targetState`) it will\n * only write the operations that are missing.\n *\n * Use `writeStateAsUpdate` instead if you are working with lib0/encoding.js#Encoder\n *\n * @param {Doc} doc\n * @param {Uint8Array} [encodedTargetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n * @param {UpdateEncoderV1 | UpdateEncoderV2} [encoder]\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateAsUpdateV2 = (doc, encodedTargetStateVector = new Uint8Array([0]), encoder = new UpdateEncoderV2()) => {\n  const targetStateVector = decodeStateVector(encodedTargetStateVector);\n  writeStateAsUpdate(encoder, doc, targetStateVector);\n  const updates = [encoder.toUint8Array()];\n  // also add the pending updates (if there are any)\n  if (doc.store.pendingDs) {\n    updates.push(doc.store.pendingDs);\n  }\n  if (doc.store.pendingStructs) {\n    updates.push(diffUpdateV2(doc.store.pendingStructs.update, encodedTargetStateVector));\n  }\n  if (updates.length > 1) {\n    if (encoder.constructor === UpdateEncoderV1) {\n      return mergeUpdates(updates.map((update, i) => i === 0 ? update : convertUpdateFormatV2ToV1(update)))\n    } else if (encoder.constructor === UpdateEncoderV2) {\n      return mergeUpdatesV2(updates)\n    }\n  }\n  return updates[0]\n};\n\n/**\n * Write all the document as a single update message that can be applied on the remote document. If you specify the state of the remote client (`targetState`) it will\n * only write the operations that are missing.\n *\n * Use `writeStateAsUpdate` instead if you are working with lib0/encoding.js#Encoder\n *\n * @param {Doc} doc\n * @param {Uint8Array} [encodedTargetStateVector] The state of the target that receives the update. Leave empty to write all known structs\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateAsUpdate = (doc, encodedTargetStateVector) => encodeStateAsUpdateV2(doc, encodedTargetStateVector, new UpdateEncoderV1());\n\n/**\n * Read state vector from Decoder and return as Map\n *\n * @param {DSDecoderV1 | DSDecoderV2} decoder\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\nconst readStateVector = decoder => {\n  const ss = new Map();\n  const ssLength = decoding.readVarUint(decoder.restDecoder);\n  for (let i = 0; i < ssLength; i++) {\n    const client = decoding.readVarUint(decoder.restDecoder);\n    const clock = decoding.readVarUint(decoder.restDecoder);\n    ss.set(client, clock);\n  }\n  return ss\n};\n\n/**\n * Read decodedState and return State as Map.\n *\n * @param {Uint8Array} decodedState\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\n// export const decodeStateVectorV2 = decodedState => readStateVector(new DSDecoderV2(decoding.createDecoder(decodedState)))\n\n/**\n * Read decodedState and return State as Map.\n *\n * @param {Uint8Array} decodedState\n * @return {Map<number,number>} Maps `client` to the number next expected `clock` from that client.\n *\n * @function\n */\nconst decodeStateVector = decodedState => readStateVector(new DSDecoderV1(decoding.createDecoder(decodedState)));\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {Map<number,number>} sv\n * @function\n */\nconst writeStateVector = (encoder, sv) => {\n  encoding.writeVarUint(encoder.restEncoder, sv.size);\n  array.from(sv.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {\n    encoding.writeVarUint(encoder.restEncoder, client); // @todo use a special client decoder that is based on mapping\n    encoding.writeVarUint(encoder.restEncoder, clock);\n  });\n  return encoder\n};\n\n/**\n * @param {DSEncoderV1 | DSEncoderV2} encoder\n * @param {Doc} doc\n *\n * @function\n */\nconst writeDocumentStateVector = (encoder, doc) => writeStateVector(encoder, getStateVector(doc.store));\n\n/**\n * Encode State as Uint8Array.\n *\n * @param {Doc|Map<number,number>} doc\n * @param {DSEncoderV1 | DSEncoderV2} [encoder]\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateVectorV2 = (doc, encoder = new DSEncoderV2()) => {\n  if (doc instanceof Map) {\n    writeStateVector(encoder, doc);\n  } else {\n    writeDocumentStateVector(encoder, doc);\n  }\n  return encoder.toUint8Array()\n};\n\n/**\n * Encode State as Uint8Array.\n *\n * @param {Doc|Map<number,number>} doc\n * @return {Uint8Array}\n *\n * @function\n */\nconst encodeStateVector = doc => encodeStateVectorV2(doc, new DSEncoderV1());\n\n/**\n * General event handler implementation.\n *\n * @template ARG0, ARG1\n *\n * @private\n */\nclass EventHandler {\n  constructor () {\n    /**\n     * @type {Array<function(ARG0, ARG1):void>}\n     */\n    this.l = [];\n  }\n}\n\n/**\n * @template ARG0,ARG1\n * @returns {EventHandler<ARG0,ARG1>}\n *\n * @private\n * @function\n */\nconst createEventHandler = () => new EventHandler();\n\n/**\n * Adds an event listener that is called when\n * {@link EventHandler#callEventListeners} is called.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {function(ARG0,ARG1):void} f The event handler.\n *\n * @private\n * @function\n */\nconst addEventHandlerListener = (eventHandler, f) =>\n  eventHandler.l.push(f);\n\n/**\n * Removes an event listener.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {function(ARG0,ARG1):void} f The event handler that was added with\n *                     {@link EventHandler#addEventListener}\n *\n * @private\n * @function\n */\nconst removeEventHandlerListener = (eventHandler, f) => {\n  const l = eventHandler.l;\n  const len = l.length;\n  eventHandler.l = l.filter(g => f !== g);\n  if (len === eventHandler.l.length) {\n    console.error('[yjs] Tried to remove event handler that doesn\\'t exist.');\n  }\n};\n\n/**\n * Call all event listeners that were added via\n * {@link EventHandler#addEventListener}.\n *\n * @template ARG0,ARG1\n * @param {EventHandler<ARG0,ARG1>} eventHandler\n * @param {ARG0} arg0\n * @param {ARG1} arg1\n *\n * @private\n * @function\n */\nconst callEventHandlerListeners = (eventHandler, arg0, arg1) =>\n  f.callAll(eventHandler.l, [arg0, arg1]);\n\nclass ID {\n  /**\n   * @param {number} client client id\n   * @param {number} clock unique per client id, continuous number\n   */\n  constructor (client, clock) {\n    /**\n     * Client id\n     * @type {number}\n     */\n    this.client = client;\n    /**\n     * unique per client id, continuous number\n     * @type {number}\n     */\n    this.clock = clock;\n  }\n}\n\n/**\n * @param {ID | null} a\n * @param {ID | null} b\n * @return {boolean}\n *\n * @function\n */\nconst compareIDs = (a, b) => a === b || (a !== null && b !== null && a.client === b.client && a.clock === b.clock);\n\n/**\n * @param {number} client\n * @param {number} clock\n *\n * @private\n * @function\n */\nconst createID = (client, clock) => new ID(client, clock);\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {ID} id\n *\n * @private\n * @function\n */\nconst writeID = (encoder, id) => {\n  encoding.writeVarUint(encoder, id.client);\n  encoding.writeVarUint(encoder, id.clock);\n};\n\n/**\n * Read ID.\n * * If first varUint read is 0xFFFFFF a RootID is returned.\n * * Otherwise an ID is returned\n *\n * @param {decoding.Decoder} decoder\n * @return {ID}\n *\n * @private\n * @function\n */\nconst readID = decoder =>\n  createID(decoding.readVarUint(decoder), decoding.readVarUint(decoder));\n\n/**\n * The top types are mapped from y.share.get(keyname) => type.\n * `type` does not store any information about the `keyname`.\n * This function finds the correct `keyname` for `type` and throws otherwise.\n *\n * @param {AbstractType<any>} type\n * @return {string}\n *\n * @private\n * @function\n */\nconst findRootTypeKey = type => {\n  // @ts-ignore _y must be defined, otherwise unexpected case\n  for (const [key, value] of type.doc.share.entries()) {\n    if (value === type) {\n      return key\n    }\n  }\n  throw error.unexpectedCase()\n};\n\n/**\n * Check if `parent` is a parent of `child`.\n *\n * @param {AbstractType<any>} parent\n * @param {Item|null} child\n * @return {Boolean} Whether `parent` is a parent of `child`.\n *\n * @private\n * @function\n */\nconst isParentOf = (parent, child) => {\n  while (child !== null) {\n    if (child.parent === parent) {\n      return true\n    }\n    child = /** @type {AbstractType<any>} */ (child.parent)._item;\n  }\n  return false\n};\n\n/**\n * Convenient helper to log type information.\n *\n * Do not use in productive systems as the output can be immense!\n *\n * @param {AbstractType<any>} type\n */\nconst logType = type => {\n  const res = [];\n  let n = type._start;\n  while (n) {\n    res.push(n);\n    n = n.right;\n  }\n  console.log('Children: ', res);\n  console.log('Children content: ', res.filter(m => !m.deleted).map(m => m.content));\n};\n\nclass PermanentUserData {\n  /**\n   * @param {Doc} doc\n   * @param {YMap<any>} [storeType]\n   */\n  constructor (doc, storeType = doc.getMap('users')) {\n    /**\n     * @type {Map<string,DeleteSet>}\n     */\n    const dss = new Map();\n    this.yusers = storeType;\n    this.doc = doc;\n    /**\n     * Maps from clientid to userDescription\n     *\n     * @type {Map<number,string>}\n     */\n    this.clients = new Map();\n    this.dss = dss;\n    /**\n     * @param {YMap<any>} user\n     * @param {string} userDescription\n     */\n    const initUser = (user, userDescription) => {\n      /**\n       * @type {YArray<Uint8Array>}\n       */\n      const ds = user.get('ds');\n      const ids = user.get('ids');\n      const addClientId = /** @param {number} clientid */ clientid => this.clients.set(clientid, userDescription);\n      ds.observe(/** @param {YArrayEvent<any>} event */ event => {\n        event.changes.added.forEach(item => {\n          item.content.getContent().forEach(encodedDs => {\n            if (encodedDs instanceof Uint8Array) {\n              this.dss.set(userDescription, mergeDeleteSets([this.dss.get(userDescription) || createDeleteSet(), readDeleteSet(new DSDecoderV1(decoding.createDecoder(encodedDs)))]));\n            }\n          });\n        });\n      });\n      this.dss.set(userDescription, mergeDeleteSets(ds.map(encodedDs => readDeleteSet(new DSDecoderV1(decoding.createDecoder(encodedDs))))));\n      ids.observe(/** @param {YArrayEvent<any>} event */ event =>\n        event.changes.added.forEach(item => item.content.getContent().forEach(addClientId))\n      );\n      ids.forEach(addClientId);\n    };\n    // observe users\n    storeType.observe(event => {\n      event.keysChanged.forEach(userDescription =>\n        initUser(storeType.get(userDescription), userDescription)\n      );\n    });\n    // add initial data\n    storeType.forEach(initUser);\n  }\n\n  /**\n   * @param {Doc} doc\n   * @param {number} clientid\n   * @param {string} userDescription\n   * @param {Object} conf\n   * @param {function(Transaction, DeleteSet):boolean} [conf.filter]\n   */\n  setUserMapping (doc, clientid, userDescription, { filter = () => true } = {}) {\n    const users = this.yusers;\n    let user = users.get(userDescription);\n    if (!user) {\n      user = new YMap();\n      user.set('ids', new YArray());\n      user.set('ds', new YArray());\n      users.set(userDescription, user);\n    }\n    user.get('ids').push([clientid]);\n    users.observe(_event => {\n      setTimeout(() => {\n        const userOverwrite = users.get(userDescription);\n        if (userOverwrite !== user) {\n          // user was overwritten, port all data over to the next user object\n          // @todo Experiment with Y.Sets here\n          user = userOverwrite;\n          // @todo iterate over old type\n          this.clients.forEach((_userDescription, clientid) => {\n            if (userDescription === _userDescription) {\n              user.get('ids').push([clientid]);\n            }\n          });\n          const encoder = new DSEncoderV1();\n          const ds = this.dss.get(userDescription);\n          if (ds) {\n            writeDeleteSet(encoder, ds);\n            user.get('ds').push([encoder.toUint8Array()]);\n          }\n        }\n      }, 0);\n    });\n    doc.on('afterTransaction', /** @param {Transaction} transaction */ transaction => {\n      setTimeout(() => {\n        const yds = user.get('ds');\n        const ds = transaction.deleteSet;\n        if (transaction.local && ds.clients.size > 0 && filter(transaction, ds)) {\n          const encoder = new DSEncoderV1();\n          writeDeleteSet(encoder, ds);\n          yds.push([encoder.toUint8Array()]);\n        }\n      });\n    });\n  }\n\n  /**\n   * @param {number} clientid\n   * @return {any}\n   */\n  getUserByClientId (clientid) {\n    return this.clients.get(clientid) || null\n  }\n\n  /**\n   * @param {ID} id\n   * @return {string | null}\n   */\n  getUserByDeletedId (id) {\n    for (const [userDescription, ds] of this.dss.entries()) {\n      if (isDeleted(ds, id)) {\n        return userDescription\n      }\n    }\n    return null\n  }\n}\n\n/**\n * A relative position is based on the Yjs model and is not affected by document changes.\n * E.g. If you place a relative position before a certain character, it will always point to this character.\n * If you place a relative position at the end of a type, it will always point to the end of the type.\n *\n * A numeric position is often unsuited for user selections, because it does not change when content is inserted\n * before or after.\n *\n * ```Insert(0, 'x')('a|bc') = 'xa|bc'``` Where | is the relative position.\n *\n * One of the properties must be defined.\n *\n * @example\n *   // Current cursor position is at position 10\n *   const relativePosition = createRelativePositionFromIndex(yText, 10)\n *   // modify yText\n *   yText.insert(0, 'abc')\n *   yText.delete(3, 10)\n *   // Compute the cursor position\n *   const absolutePosition = createAbsolutePositionFromRelativePosition(y, relativePosition)\n *   absolutePosition.type === yText // => true\n *   console.log('cursor location is ' + absolutePosition.index) // => cursor location is 3\n *\n */\nclass RelativePosition {\n  /**\n   * @param {ID|null} type\n   * @param {string|null} tname\n   * @param {ID|null} item\n   * @param {number} assoc\n   */\n  constructor (type, tname, item, assoc = 0) {\n    /**\n     * @type {ID|null}\n     */\n    this.type = type;\n    /**\n     * @type {string|null}\n     */\n    this.tname = tname;\n    /**\n     * @type {ID | null}\n     */\n    this.item = item;\n    /**\n     * A relative position is associated to a specific character. By default\n     * assoc >= 0, the relative position is associated to the character\n     * after the meant position.\n     * I.e. position 1 in 'ab' is associated to character 'b'.\n     *\n     * If assoc < 0, then the relative position is associated to the character\n     * before the meant position.\n     *\n     * @type {number}\n     */\n    this.assoc = assoc;\n  }\n}\n\n/**\n * @param {RelativePosition} rpos\n * @return {any}\n */\nconst relativePositionToJSON = rpos => {\n  const json = {};\n  if (rpos.type) {\n    json.type = rpos.type;\n  }\n  if (rpos.tname) {\n    json.tname = rpos.tname;\n  }\n  if (rpos.item) {\n    json.item = rpos.item;\n  }\n  if (rpos.assoc != null) {\n    json.assoc = rpos.assoc;\n  }\n  return json\n};\n\n/**\n * @param {any} json\n * @return {RelativePosition}\n *\n * @function\n */\nconst createRelativePositionFromJSON = json => new RelativePosition(json.type == null ? null : createID(json.type.client, json.type.clock), json.tname ?? null, json.item == null ? null : createID(json.item.client, json.item.clock), json.assoc == null ? 0 : json.assoc);\n\nclass AbsolutePosition {\n  /**\n   * @param {AbstractType<any>} type\n   * @param {number} index\n   * @param {number} [assoc]\n   */\n  constructor (type, index, assoc = 0) {\n    /**\n     * @type {AbstractType<any>}\n     */\n    this.type = type;\n    /**\n     * @type {number}\n     */\n    this.index = index;\n    this.assoc = assoc;\n  }\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @param {number} [assoc]\n *\n * @function\n */\nconst createAbsolutePosition = (type, index, assoc = 0) => new AbsolutePosition(type, index, assoc);\n\n/**\n * @param {AbstractType<any>} type\n * @param {ID|null} item\n * @param {number} [assoc]\n *\n * @function\n */\nconst createRelativePosition = (type, item, assoc) => {\n  let typeid = null;\n  let tname = null;\n  if (type._item === null) {\n    tname = findRootTypeKey(type);\n  } else {\n    typeid = createID(type._item.id.client, type._item.id.clock);\n  }\n  return new RelativePosition(typeid, tname, item, assoc)\n};\n\n/**\n * Create a relativePosition based on a absolute position.\n *\n * @param {AbstractType<any>} type The base type (e.g. YText or YArray).\n * @param {number} index The absolute position.\n * @param {number} [assoc]\n * @return {RelativePosition}\n *\n * @function\n */\nconst createRelativePositionFromTypeIndex = (type, index, assoc = 0) => {\n  let t = type._start;\n  if (assoc < 0) {\n    // associated to the left character or the beginning of a type, increment index if possible.\n    if (index === 0) {\n      return createRelativePosition(type, null, assoc)\n    }\n    index--;\n  }\n  while (t !== null) {\n    if (!t.deleted && t.countable) {\n      if (t.length > index) {\n        // case 1: found position somewhere in the linked list\n        return createRelativePosition(type, createID(t.id.client, t.id.clock + index), assoc)\n      }\n      index -= t.length;\n    }\n    if (t.right === null && assoc < 0) {\n      // left-associated position, return last available id\n      return createRelativePosition(type, t.lastId, assoc)\n    }\n    t = t.right;\n  }\n  return createRelativePosition(type, null, assoc)\n};\n\n/**\n * @param {encoding.Encoder} encoder\n * @param {RelativePosition} rpos\n *\n * @function\n */\nconst writeRelativePosition = (encoder, rpos) => {\n  const { type, tname, item, assoc } = rpos;\n  if (item !== null) {\n    encoding.writeVarUint(encoder, 0);\n    writeID(encoder, item);\n  } else if (tname !== null) {\n    // case 2: found position at the end of the list and type is stored in y.share\n    encoding.writeUint8(encoder, 1);\n    encoding.writeVarString(encoder, tname);\n  } else if (type !== null) {\n    // case 3: found position at the end of the list and type is attached to an item\n    encoding.writeUint8(encoder, 2);\n    writeID(encoder, type);\n  } else {\n    throw error.unexpectedCase()\n  }\n  encoding.writeVarInt(encoder, assoc);\n  return encoder\n};\n\n/**\n * @param {RelativePosition} rpos\n * @return {Uint8Array}\n */\nconst encodeRelativePosition = rpos => {\n  const encoder = encoding.createEncoder();\n  writeRelativePosition(encoder, rpos);\n  return encoding.toUint8Array(encoder)\n};\n\n/**\n * @param {decoding.Decoder} decoder\n * @return {RelativePosition}\n *\n * @function\n */\nconst readRelativePosition = decoder => {\n  let type = null;\n  let tname = null;\n  let itemID = null;\n  switch (decoding.readVarUint(decoder)) {\n    case 0:\n      // case 1: found position somewhere in the linked list\n      itemID = readID(decoder);\n      break\n    case 1:\n      // case 2: found position at the end of the list and type is stored in y.share\n      tname = decoding.readVarString(decoder);\n      break\n    case 2: {\n      // case 3: found position at the end of the list and type is attached to an item\n      type = readID(decoder);\n    }\n  }\n  const assoc = decoding.hasContent(decoder) ? decoding.readVarInt(decoder) : 0;\n  return new RelativePosition(type, tname, itemID, assoc)\n};\n\n/**\n * @param {Uint8Array} uint8Array\n * @return {RelativePosition}\n */\nconst decodeRelativePosition = uint8Array => readRelativePosition(decoding.createDecoder(uint8Array));\n\n/**\n * @param {StructStore} store\n * @param {ID} id\n */\nconst getItemWithOffset = (store, id) => {\n  const item = getItem(store, id);\n  const diff = id.clock - item.id.clock;\n  return {\n    item, diff\n  }\n};\n\n/**\n * Transform a relative position to an absolute position.\n *\n * If you want to share the relative position with other users, you should set\n * `followUndoneDeletions` to false to get consistent results across all clients.\n *\n * When calculating the absolute position, we try to follow the \"undone deletions\". This yields\n * better results for the user who performed undo. However, only the user who performed the undo\n * will get the better results, the other users don't know which operations recreated a deleted\n * range of content. There is more information in this ticket: https://github.com/yjs/yjs/issues/638\n *\n * @param {RelativePosition} rpos\n * @param {Doc} doc\n * @param {boolean} followUndoneDeletions - whether to follow undone deletions - see https://github.com/yjs/yjs/issues/638\n * @return {AbsolutePosition|null}\n *\n * @function\n */\nconst createAbsolutePositionFromRelativePosition = (rpos, doc, followUndoneDeletions = true) => {\n  const store = doc.store;\n  const rightID = rpos.item;\n  const typeID = rpos.type;\n  const tname = rpos.tname;\n  const assoc = rpos.assoc;\n  let type = null;\n  let index = 0;\n  if (rightID !== null) {\n    if (getState(store, rightID.client) <= rightID.clock) {\n      return null\n    }\n    const res = followUndoneDeletions ? followRedone(store, rightID) : getItemWithOffset(store, rightID);\n    const right = res.item;\n    if (!(right instanceof Item)) {\n      return null\n    }\n    type = /** @type {AbstractType<any>} */ (right.parent);\n    if (type._item === null || !type._item.deleted) {\n      index = (right.deleted || !right.countable) ? 0 : (res.diff + (assoc >= 0 ? 0 : 1)); // adjust position based on left association if necessary\n      let n = right.left;\n      while (n !== null) {\n        if (!n.deleted && n.countable) {\n          index += n.length;\n        }\n        n = n.left;\n      }\n    }\n  } else {\n    if (tname !== null) {\n      type = doc.get(tname);\n    } else if (typeID !== null) {\n      if (getState(store, typeID.client) <= typeID.clock) {\n        // type does not exist yet\n        return null\n      }\n      const { item } = followUndoneDeletions ? followRedone(store, typeID) : { item: getItem(store, typeID) };\n      if (item instanceof Item && item.content instanceof ContentType) {\n        type = item.content.type;\n      } else {\n        // struct is garbage collected\n        return null\n      }\n    } else {\n      throw error.unexpectedCase()\n    }\n    if (assoc >= 0) {\n      index = type._length;\n    } else {\n      index = 0;\n    }\n  }\n  return createAbsolutePosition(type, index, rpos.assoc)\n};\n\n/**\n * @param {RelativePosition|null} a\n * @param {RelativePosition|null} b\n * @return {boolean}\n *\n * @function\n */\nconst compareRelativePositions = (a, b) => a === b || (\n  a !== null && b !== null && a.tname === b.tname && compareIDs(a.item, b.item) && compareIDs(a.type, b.type) && a.assoc === b.assoc\n);\n\nclass Snapshot {\n  /**\n   * @param {DeleteSet} ds\n   * @param {Map<number,number>} sv state map\n   */\n  constructor (ds, sv) {\n    /**\n     * @type {DeleteSet}\n     */\n    this.ds = ds;\n    /**\n     * State Map\n     * @type {Map<number,number>}\n     */\n    this.sv = sv;\n  }\n}\n\n/**\n * @param {Snapshot} snap1\n * @param {Snapshot} snap2\n * @return {boolean}\n */\nconst equalSnapshots = (snap1, snap2) => {\n  const ds1 = snap1.ds.clients;\n  const ds2 = snap2.ds.clients;\n  const sv1 = snap1.sv;\n  const sv2 = snap2.sv;\n  if (sv1.size !== sv2.size || ds1.size !== ds2.size) {\n    return false\n  }\n  for (const [key, value] of sv1.entries()) {\n    if (sv2.get(key) !== value) {\n      return false\n    }\n  }\n  for (const [client, dsitems1] of ds1.entries()) {\n    const dsitems2 = ds2.get(client) || [];\n    if (dsitems1.length !== dsitems2.length) {\n      return false\n    }\n    for (let i = 0; i < dsitems1.length; i++) {\n      const dsitem1 = dsitems1[i];\n      const dsitem2 = dsitems2[i];\n      if (dsitem1.clock !== dsitem2.clock || dsitem1.len !== dsitem2.len) {\n        return false\n      }\n    }\n  }\n  return true\n};\n\n/**\n * @param {Snapshot} snapshot\n * @param {DSEncoderV1 | DSEncoderV2} [encoder]\n * @return {Uint8Array}\n */\nconst encodeSnapshotV2 = (snapshot, encoder = new DSEncoderV2()) => {\n  writeDeleteSet(encoder, snapshot.ds);\n  writeStateVector(encoder, snapshot.sv);\n  return encoder.toUint8Array()\n};\n\n/**\n * @param {Snapshot} snapshot\n * @return {Uint8Array}\n */\nconst encodeSnapshot = snapshot => encodeSnapshotV2(snapshot, new DSEncoderV1());\n\n/**\n * @param {Uint8Array} buf\n * @param {DSDecoderV1 | DSDecoderV2} [decoder]\n * @return {Snapshot}\n */\nconst decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(decoding.createDecoder(buf))) => {\n  return new Snapshot(readDeleteSet(decoder), readStateVector(decoder))\n};\n\n/**\n * @param {Uint8Array} buf\n * @return {Snapshot}\n */\nconst decodeSnapshot = buf => decodeSnapshotV2(buf, new DSDecoderV1(decoding.createDecoder(buf)));\n\n/**\n * @param {DeleteSet} ds\n * @param {Map<number,number>} sm\n * @return {Snapshot}\n */\nconst createSnapshot = (ds, sm) => new Snapshot(ds, sm);\n\nconst emptySnapshot = createSnapshot(createDeleteSet(), new Map());\n\n/**\n * @param {Doc} doc\n * @return {Snapshot}\n */\nconst snapshot = doc => createSnapshot(createDeleteSetFromStructStore(doc.store), getStateVector(doc.store));\n\n/**\n * @param {Item} item\n * @param {Snapshot|undefined} snapshot\n *\n * @protected\n * @function\n */\nconst isVisible = (item, snapshot) => snapshot === undefined\n  ? !item.deleted\n  : snapshot.sv.has(item.id.client) && (snapshot.sv.get(item.id.client) || 0) > item.id.clock && !isDeleted(snapshot.ds, item.id);\n\n/**\n * @param {Transaction} transaction\n * @param {Snapshot} snapshot\n */\nconst splitSnapshotAffectedStructs = (transaction, snapshot) => {\n  const meta = map.setIfUndefined(transaction.meta, splitSnapshotAffectedStructs, set.create);\n  const store = transaction.doc.store;\n  // check if we already split for this snapshot\n  if (!meta.has(snapshot)) {\n    snapshot.sv.forEach((clock, client) => {\n      if (clock < getState(store, client)) {\n        getItemCleanStart(transaction, createID(client, clock));\n      }\n    });\n    iterateDeletedStructs(transaction, snapshot.ds, _item => {});\n    meta.add(snapshot);\n  }\n};\n\n/**\n * @example\n *  const ydoc = new Y.Doc({ gc: false })\n *  ydoc.getText().insert(0, 'world!')\n *  const snapshot = Y.snapshot(ydoc)\n *  ydoc.getText().insert(0, 'hello ')\n *  const restored = Y.createDocFromSnapshot(ydoc, snapshot)\n *  assert(restored.getText().toString() === 'world!')\n *\n * @param {Doc} originDoc\n * @param {Snapshot} snapshot\n * @param {Doc} [newDoc] Optionally, you may define the Yjs document that receives the data from originDoc\n * @return {Doc}\n */\nconst createDocFromSnapshot = (originDoc, snapshot, newDoc = new Doc()) => {\n  if (originDoc.gc) {\n    // we should not try to restore a GC-ed document, because some of the restored items might have their content deleted\n    throw new Error('Garbage-collection must be disabled in `originDoc`!')\n  }\n  const { sv, ds } = snapshot;\n\n  const encoder = new UpdateEncoderV2();\n  originDoc.transact(transaction => {\n    let size = 0;\n    sv.forEach(clock => {\n      if (clock > 0) {\n        size++;\n      }\n    });\n    encoding.writeVarUint(encoder.restEncoder, size);\n    // splitting the structs before writing them to the encoder\n    for (const [client, clock] of sv) {\n      if (clock === 0) {\n        continue\n      }\n      if (clock < getState(originDoc.store, client)) {\n        getItemCleanStart(transaction, createID(client, clock));\n      }\n      const structs = originDoc.store.clients.get(client) || [];\n      const lastStructIndex = findIndexSS(structs, clock - 1);\n      // write # encoded structs\n      encoding.writeVarUint(encoder.restEncoder, lastStructIndex + 1);\n      encoder.writeClient(client);\n      // first clock written is 0\n      encoding.writeVarUint(encoder.restEncoder, 0);\n      for (let i = 0; i <= lastStructIndex; i++) {\n        structs[i].write(encoder, 0);\n      }\n    }\n    writeDeleteSet(encoder, ds);\n  });\n\n  applyUpdateV2(newDoc, encoder.toUint8Array(), 'snapshot');\n  return newDoc\n};\n\n/**\n * @param {Snapshot} snapshot\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n */\nconst snapshotContainsUpdateV2 = (snapshot, update, YDecoder = UpdateDecoderV2) => {\n  const updateDecoder = new YDecoder(decoding.createDecoder(update));\n  const lazyDecoder = new LazyStructReader(updateDecoder, false);\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    if ((snapshot.sv.get(curr.id.client) || 0) < curr.id.clock + curr.length) {\n      return false\n    }\n  }\n  const mergedDS = mergeDeleteSets([snapshot.ds, readDeleteSet(updateDecoder)]);\n  return equalDeleteSets(snapshot.ds, mergedDS)\n};\n\n/**\n * @param {Snapshot} snapshot\n * @param {Uint8Array} update\n */\nconst snapshotContainsUpdate = (snapshot, update) => snapshotContainsUpdateV2(snapshot, update, UpdateDecoderV1);\n\nclass StructStore {\n  constructor () {\n    /**\n     * @type {Map<number,Array<GC|Item>>}\n     */\n    this.clients = new Map();\n    /**\n     * @type {null | { missing: Map<number, number>, update: Uint8Array }}\n     */\n    this.pendingStructs = null;\n    /**\n     * @type {null | Uint8Array}\n     */\n    this.pendingDs = null;\n  }\n}\n\n/**\n * Return the states as a Map<client,clock>.\n * Note that clock refers to the next expected clock id.\n *\n * @param {StructStore} store\n * @return {Map<number,number>}\n *\n * @public\n * @function\n */\nconst getStateVector = store => {\n  const sm = new Map();\n  store.clients.forEach((structs, client) => {\n    const struct = structs[structs.length - 1];\n    sm.set(client, struct.id.clock + struct.length);\n  });\n  return sm\n};\n\n/**\n * @param {StructStore} store\n * @param {number} client\n * @return {number}\n *\n * @public\n * @function\n */\nconst getState = (store, client) => {\n  const structs = store.clients.get(client);\n  if (structs === undefined) {\n    return 0\n  }\n  const lastStruct = structs[structs.length - 1];\n  return lastStruct.id.clock + lastStruct.length\n};\n\n/**\n * @param {StructStore} store\n * @param {GC|Item} struct\n *\n * @private\n * @function\n */\nconst addStruct = (store, struct) => {\n  let structs = store.clients.get(struct.id.client);\n  if (structs === undefined) {\n    structs = [];\n    store.clients.set(struct.id.client, structs);\n  } else {\n    const lastStruct = structs[structs.length - 1];\n    if (lastStruct.id.clock + lastStruct.length !== struct.id.clock) {\n      throw error.unexpectedCase()\n    }\n  }\n  structs.push(struct);\n};\n\n/**\n * Perform a binary search on a sorted array\n * @param {Array<Item|GC>} structs\n * @param {number} clock\n * @return {number}\n *\n * @private\n * @function\n */\nconst findIndexSS = (structs, clock) => {\n  let left = 0;\n  let right = structs.length - 1;\n  let mid = structs[right];\n  let midclock = mid.id.clock;\n  if (midclock === clock) {\n    return right\n  }\n  // @todo does it even make sense to pivot the search?\n  // If a good split misses, it might actually increase the time to find the correct item.\n  // Currently, the only advantage is that search with pivoting might find the item on the first try.\n  let midindex = math.floor((clock / (midclock + mid.length - 1)) * right); // pivoting the search\n  while (left <= right) {\n    mid = structs[midindex];\n    midclock = mid.id.clock;\n    if (midclock <= clock) {\n      if (clock < midclock + mid.length) {\n        return midindex\n      }\n      left = midindex + 1;\n    } else {\n      right = midindex - 1;\n    }\n    midindex = math.floor((left + right) / 2);\n  }\n  // Always check state before looking for a struct in StructStore\n  // Therefore the case of not finding a struct is unexpected\n  throw error.unexpectedCase()\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {StructStore} store\n * @param {ID} id\n * @return {GC|Item}\n *\n * @private\n * @function\n */\nconst find = (store, id) => {\n  /**\n   * @type {Array<GC|Item>}\n   */\n  // @ts-ignore\n  const structs = store.clients.get(id.client);\n  return structs[findIndexSS(structs, id.clock)]\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n * @private\n * @function\n */\nconst getItem = /** @type {function(StructStore,ID):Item} */ (find);\n\n/**\n * @param {Transaction} transaction\n * @param {Array<Item|GC>} structs\n * @param {number} clock\n */\nconst findIndexCleanStart = (transaction, structs, clock) => {\n  const index = findIndexSS(structs, clock);\n  const struct = structs[index];\n  if (struct.id.clock < clock && struct instanceof Item) {\n    structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock));\n    return index + 1\n  }\n  return index\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {Transaction} transaction\n * @param {ID} id\n * @return {Item}\n *\n * @private\n * @function\n */\nconst getItemCleanStart = (transaction, id) => {\n  const structs = /** @type {Array<Item>} */ (transaction.doc.store.clients.get(id.client));\n  return structs[findIndexCleanStart(transaction, structs, id.clock)]\n};\n\n/**\n * Expects that id is actually in store. This function throws or is an infinite loop otherwise.\n *\n * @param {Transaction} transaction\n * @param {StructStore} store\n * @param {ID} id\n * @return {Item}\n *\n * @private\n * @function\n */\nconst getItemCleanEnd = (transaction, store, id) => {\n  /**\n   * @type {Array<Item>}\n   */\n  // @ts-ignore\n  const structs = store.clients.get(id.client);\n  const index = findIndexSS(structs, id.clock);\n  const struct = structs[index];\n  if (id.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) {\n    structs.splice(index + 1, 0, splitItem(transaction, struct, id.clock - struct.id.clock + 1));\n  }\n  return struct\n};\n\n/**\n * Replace `item` with `newitem` in store\n * @param {StructStore} store\n * @param {GC|Item} struct\n * @param {GC|Item} newStruct\n *\n * @private\n * @function\n */\nconst replaceStruct = (store, struct, newStruct) => {\n  const structs = /** @type {Array<GC|Item>} */ (store.clients.get(struct.id.client));\n  structs[findIndexSS(structs, struct.id.clock)] = newStruct;\n};\n\n/**\n * Iterate over a range of structs\n *\n * @param {Transaction} transaction\n * @param {Array<Item|GC>} structs\n * @param {number} clockStart Inclusive start\n * @param {number} len\n * @param {function(GC|Item):void} f\n *\n * @function\n */\nconst iterateStructs = (transaction, structs, clockStart, len, f) => {\n  if (len === 0) {\n    return\n  }\n  const clockEnd = clockStart + len;\n  let index = findIndexCleanStart(transaction, structs, clockStart);\n  let struct;\n  do {\n    struct = structs[index++];\n    if (clockEnd < struct.id.clock + struct.length) {\n      findIndexCleanStart(transaction, structs, clockEnd);\n    }\n    f(struct);\n  } while (index < structs.length && structs[index].id.clock < clockEnd)\n};\n\n/**\n * A transaction is created for every change on the Yjs model. It is possible\n * to bundle changes on the Yjs model in a single transaction to\n * minimize the number on messages sent and the number of observer calls.\n * If possible the user of this library should bundle as many changes as\n * possible. Here is an example to illustrate the advantages of bundling:\n *\n * @example\n * const ydoc = new Y.Doc()\n * const map = ydoc.getMap('map')\n * // Log content when change is triggered\n * map.observe(() => {\n *   console.log('change triggered')\n * })\n * // Each change on the map type triggers a log message:\n * map.set('a', 0) // => \"change triggered\"\n * map.set('b', 0) // => \"change triggered\"\n * // When put in a transaction, it will trigger the log after the transaction:\n * ydoc.transact(() => {\n *   map.set('a', 1)\n *   map.set('b', 1)\n * }) // => \"change triggered\"\n *\n * @public\n */\nclass Transaction {\n  /**\n   * @param {Doc} doc\n   * @param {any} origin\n   * @param {boolean} local\n   */\n  constructor (doc, origin, local) {\n    /**\n     * The Yjs instance.\n     * @type {Doc}\n     */\n    this.doc = doc;\n    /**\n     * Describes the set of deleted items by ids\n     * @type {DeleteSet}\n     */\n    this.deleteSet = new DeleteSet();\n    /**\n     * Holds the state before the transaction started.\n     * @type {Map<Number,Number>}\n     */\n    this.beforeState = getStateVector(doc.store);\n    /**\n     * Holds the state after the transaction.\n     * @type {Map<Number,Number>}\n     */\n    this.afterState = new Map();\n    /**\n     * All types that were directly modified (property added or child\n     * inserted/deleted). New types are not included in this Set.\n     * Maps from type to parentSubs (`item.parentSub = null` for YArray)\n     * @type {Map<AbstractType<YEvent<any>>,Set<String|null>>}\n     */\n    this.changed = new Map();\n    /**\n     * Stores the events for the types that observe also child elements.\n     * It is mainly used by `observeDeep`.\n     * @type {Map<AbstractType<YEvent<any>>,Array<YEvent<any>>>}\n     */\n    this.changedParentTypes = new Map();\n    /**\n     * @type {Array<AbstractStruct>}\n     */\n    this._mergeStructs = [];\n    /**\n     * @type {any}\n     */\n    this.origin = origin;\n    /**\n     * Stores meta information on the transaction\n     * @type {Map<any,any>}\n     */\n    this.meta = new Map();\n    /**\n     * Whether this change originates from this doc.\n     * @type {boolean}\n     */\n    this.local = local;\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocsAdded = new Set();\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocsRemoved = new Set();\n    /**\n     * @type {Set<Doc>}\n     */\n    this.subdocsLoaded = new Set();\n    /**\n     * @type {boolean}\n     */\n    this._needFormattingCleanup = false;\n  }\n}\n\n/**\n * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n * @param {Transaction} transaction\n * @return {boolean} Whether data was written.\n */\nconst writeUpdateMessageFromTransaction = (encoder, transaction) => {\n  if (transaction.deleteSet.clients.size === 0 && !map.any(transaction.afterState, (clock, client) => transaction.beforeState.get(client) !== clock)) {\n    return false\n  }\n  sortAndMergeDeleteSet(transaction.deleteSet);\n  writeStructsFromTransaction(encoder, transaction);\n  writeDeleteSet(encoder, transaction.deleteSet);\n  return true\n};\n\n/**\n * If `type.parent` was added in current transaction, `type` technically\n * did not change, it was just added and we should not fire events for `type`.\n *\n * @param {Transaction} transaction\n * @param {AbstractType<YEvent<any>>} type\n * @param {string|null} parentSub\n */\nconst addChangedTypeToTransaction = (transaction, type, parentSub) => {\n  const item = type._item;\n  if (item === null || (item.id.clock < (transaction.beforeState.get(item.id.client) || 0) && !item.deleted)) {\n    map.setIfUndefined(transaction.changed, type, set.create).add(parentSub);\n  }\n};\n\n/**\n * @param {Array<AbstractStruct>} structs\n * @param {number} pos\n * @return {number} # of merged structs\n */\nconst tryToMergeWithLefts = (structs, pos) => {\n  let right = structs[pos];\n  let left = structs[pos - 1];\n  let i = pos;\n  for (; i > 0; right = left, left = structs[--i - 1]) {\n    if (left.deleted === right.deleted && left.constructor === right.constructor) {\n      if (left.mergeWith(right)) {\n        if (right instanceof Item && right.parentSub !== null && /** @type {AbstractType<any>} */ (right.parent)._map.get(right.parentSub) === right) {\n          /** @type {AbstractType<any>} */ (right.parent)._map.set(right.parentSub, /** @type {Item} */ (left));\n        }\n        continue\n      }\n    }\n    break\n  }\n  const merged = pos - i;\n  if (merged) {\n    // remove all merged structs from the array\n    structs.splice(pos + 1 - merged, merged);\n  }\n  return merged\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n * @param {function(Item):boolean} gcFilter\n */\nconst tryGcDeleteSet = (ds, store, gcFilter) => {\n  for (const [client, deleteItems] of ds.clients.entries()) {\n    const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n    for (let di = deleteItems.length - 1; di >= 0; di--) {\n      const deleteItem = deleteItems[di];\n      const endDeleteItemClock = deleteItem.clock + deleteItem.len;\n      for (\n        let si = findIndexSS(structs, deleteItem.clock), struct = structs[si];\n        si < structs.length && struct.id.clock < endDeleteItemClock;\n        struct = structs[++si]\n      ) {\n        const struct = structs[si];\n        if (deleteItem.clock + deleteItem.len <= struct.id.clock) {\n          break\n        }\n        if (struct instanceof Item && struct.deleted && !struct.keep && gcFilter(struct)) {\n          struct.gc(store, false);\n        }\n      }\n    }\n  }\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n */\nconst tryMergeDeleteSet = (ds, store) => {\n  // try to merge deleted / gc'd items\n  // merge from right to left for better efficiency and so we don't miss any merge targets\n  ds.clients.forEach((deleteItems, client) => {\n    const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n    for (let di = deleteItems.length - 1; di >= 0; di--) {\n      const deleteItem = deleteItems[di];\n      // start with merging the item next to the last deleted item\n      const mostRightIndexToCheck = math.min(structs.length - 1, 1 + findIndexSS(structs, deleteItem.clock + deleteItem.len - 1));\n      for (\n        let si = mostRightIndexToCheck, struct = structs[si];\n        si > 0 && struct.id.clock >= deleteItem.clock;\n        struct = structs[si]\n      ) {\n        si -= 1 + tryToMergeWithLefts(structs, si);\n      }\n    }\n  });\n};\n\n/**\n * @param {DeleteSet} ds\n * @param {StructStore} store\n * @param {function(Item):boolean} gcFilter\n */\nconst tryGc = (ds, store, gcFilter) => {\n  tryGcDeleteSet(ds, store, gcFilter);\n  tryMergeDeleteSet(ds, store);\n};\n\n/**\n * @param {Array<Transaction>} transactionCleanups\n * @param {number} i\n */\nconst cleanupTransactions = (transactionCleanups, i) => {\n  if (i < transactionCleanups.length) {\n    const transaction = transactionCleanups[i];\n    const doc = transaction.doc;\n    const store = doc.store;\n    const ds = transaction.deleteSet;\n    const mergeStructs = transaction._mergeStructs;\n    try {\n      sortAndMergeDeleteSet(ds);\n      transaction.afterState = getStateVector(transaction.doc.store);\n      doc.emit('beforeObserverCalls', [transaction, doc]);\n      /**\n       * An array of event callbacks.\n       *\n       * Each callback is called even if the other ones throw errors.\n       *\n       * @type {Array<function():void>}\n       */\n      const fs = [];\n      // observe events on changed types\n      transaction.changed.forEach((subs, itemtype) =>\n        fs.push(() => {\n          if (itemtype._item === null || !itemtype._item.deleted) {\n            itemtype._callObserver(transaction, subs);\n          }\n        })\n      );\n      fs.push(() => {\n        // deep observe events\n        transaction.changedParentTypes.forEach((events, type) => {\n          // We need to think about the possibility that the user transforms the\n          // Y.Doc in the event.\n          if (type._dEH.l.length > 0 && (type._item === null || !type._item.deleted)) {\n            events = events\n              .filter(event =>\n                event.target._item === null || !event.target._item.deleted\n              );\n            events\n              .forEach(event => {\n                event.currentTarget = type;\n                // path is relative to the current target\n                event._path = null;\n              });\n            // sort events by path length so that top-level events are fired first.\n            events\n              .sort((event1, event2) => event1.path.length - event2.path.length);\n            fs.push(() => {\n              // We don't need to check for events.length\n              // because we know it has at least one element\n              callEventHandlerListeners(type._dEH, events, transaction);\n            });\n          }\n        });\n        fs.push(() => doc.emit('afterTransaction', [transaction, doc]));\n        fs.push(() => {\n          if (transaction._needFormattingCleanup) {\n            cleanupYTextAfterTransaction(transaction);\n          }\n        });\n      });\n      callAll(fs, []);\n    } finally {\n      // Replace deleted items with ItemDeleted / GC.\n      // This is where content is actually remove from the Yjs Doc.\n      if (doc.gc) {\n        tryGcDeleteSet(ds, store, doc.gcFilter);\n      }\n      tryMergeDeleteSet(ds, store);\n\n      // on all affected store.clients props, try to merge\n      transaction.afterState.forEach((clock, client) => {\n        const beforeClock = transaction.beforeState.get(client) || 0;\n        if (beforeClock !== clock) {\n          const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n          // we iterate from right to left so we can safely remove entries\n          const firstChangePos = math.max(findIndexSS(structs, beforeClock), 1);\n          for (let i = structs.length - 1; i >= firstChangePos;) {\n            i -= 1 + tryToMergeWithLefts(structs, i);\n          }\n        }\n      });\n      // try to merge mergeStructs\n      // @todo: it makes more sense to transform mergeStructs to a DS, sort it, and merge from right to left\n      //        but at the moment DS does not handle duplicates\n      for (let i = mergeStructs.length - 1; i >= 0; i--) {\n        const { client, clock } = mergeStructs[i].id;\n        const structs = /** @type {Array<GC|Item>} */ (store.clients.get(client));\n        const replacedStructPos = findIndexSS(structs, clock);\n        if (replacedStructPos + 1 < structs.length) {\n          if (tryToMergeWithLefts(structs, replacedStructPos + 1) > 1) {\n            continue // no need to perform next check, both are already merged\n          }\n        }\n        if (replacedStructPos > 0) {\n          tryToMergeWithLefts(structs, replacedStructPos);\n        }\n      }\n      if (!transaction.local && transaction.afterState.get(doc.clientID) !== transaction.beforeState.get(doc.clientID)) {\n        logging.print(logging.ORANGE, logging.BOLD, '[yjs] ', logging.UNBOLD, logging.RED, 'Changed the client-id because another client seems to be using it.');\n        doc.clientID = generateNewClientId();\n      }\n      // @todo Merge all the transactions into one and provide send the data as a single update message\n      doc.emit('afterTransactionCleanup', [transaction, doc]);\n      if (doc._observers.has('update')) {\n        const encoder = new UpdateEncoderV1();\n        const hasContent = writeUpdateMessageFromTransaction(encoder, transaction);\n        if (hasContent) {\n          doc.emit('update', [encoder.toUint8Array(), transaction.origin, doc, transaction]);\n        }\n      }\n      if (doc._observers.has('updateV2')) {\n        const encoder = new UpdateEncoderV2();\n        const hasContent = writeUpdateMessageFromTransaction(encoder, transaction);\n        if (hasContent) {\n          doc.emit('updateV2', [encoder.toUint8Array(), transaction.origin, doc, transaction]);\n        }\n      }\n      const { subdocsAdded, subdocsLoaded, subdocsRemoved } = transaction;\n      if (subdocsAdded.size > 0 || subdocsRemoved.size > 0 || subdocsLoaded.size > 0) {\n        subdocsAdded.forEach(subdoc => {\n          subdoc.clientID = doc.clientID;\n          if (subdoc.collectionid == null) {\n            subdoc.collectionid = doc.collectionid;\n          }\n          doc.subdocs.add(subdoc);\n        });\n        subdocsRemoved.forEach(subdoc => doc.subdocs.delete(subdoc));\n        doc.emit('subdocs', [{ loaded: subdocsLoaded, added: subdocsAdded, removed: subdocsRemoved }, doc, transaction]);\n        subdocsRemoved.forEach(subdoc => subdoc.destroy());\n      }\n\n      if (transactionCleanups.length <= i + 1) {\n        doc._transactionCleanups = [];\n        doc.emit('afterAllTransactions', [doc, transactionCleanups]);\n      } else {\n        cleanupTransactions(transactionCleanups, i + 1);\n      }\n    }\n  }\n};\n\n/**\n * Implements the functionality of `y.transact(()=>{..})`\n *\n * @template T\n * @param {Doc} doc\n * @param {function(Transaction):T} f\n * @param {any} [origin=true]\n * @return {T}\n *\n * @function\n */\nconst transact = (doc, f, origin = null, local = true) => {\n  const transactionCleanups = doc._transactionCleanups;\n  let initialCall = false;\n  /**\n   * @type {any}\n   */\n  let result = null;\n  if (doc._transaction === null) {\n    initialCall = true;\n    doc._transaction = new Transaction(doc, origin, local);\n    transactionCleanups.push(doc._transaction);\n    if (transactionCleanups.length === 1) {\n      doc.emit('beforeAllTransactions', [doc]);\n    }\n    doc.emit('beforeTransaction', [doc._transaction, doc]);\n  }\n  try {\n    result = f(doc._transaction);\n  } finally {\n    if (initialCall) {\n      const finishCleanup = doc._transaction === transactionCleanups[0];\n      doc._transaction = null;\n      if (finishCleanup) {\n        // The first transaction ended, now process observer calls.\n        // Observer call may create new transactions for which we need to call the observers and do cleanup.\n        // We don't want to nest these calls, so we execute these calls one after\n        // another.\n        // Also we need to ensure that all cleanups are called, even if the\n        // observes throw errors.\n        // This file is full of hacky try {} finally {} blocks to ensure that an\n        // event can throw errors and also that the cleanup is called.\n        cleanupTransactions(transactionCleanups, 0);\n      }\n    }\n  }\n  return result\n};\n\nclass StackItem {\n  /**\n   * @param {DeleteSet} deletions\n   * @param {DeleteSet} insertions\n   */\n  constructor (deletions, insertions) {\n    this.insertions = insertions;\n    this.deletions = deletions;\n    /**\n     * Use this to save and restore metadata like selection range\n     */\n    this.meta = new Map();\n  }\n}\n/**\n * @param {Transaction} tr\n * @param {UndoManager} um\n * @param {StackItem} stackItem\n */\nconst clearUndoManagerStackItem = (tr, um, stackItem) => {\n  iterateDeletedStructs(tr, stackItem.deletions, item => {\n    if (item instanceof Item && um.scope.some(type => type === tr.doc || isParentOf(/** @type {AbstractType<any>} */ (type), item))) {\n      keepItem(item, false);\n    }\n  });\n};\n\n/**\n * @param {UndoManager} undoManager\n * @param {Array<StackItem>} stack\n * @param {'undo'|'redo'} eventType\n * @return {StackItem?}\n */\nconst popStackItem = (undoManager, stack, eventType) => {\n  /**\n   * Keep a reference to the transaction so we can fire the event with the changedParentTypes\n   * @type {any}\n   */\n  let _tr = null;\n  const doc = undoManager.doc;\n  const scope = undoManager.scope;\n  transact(doc, transaction => {\n    while (stack.length > 0 && undoManager.currStackItem === null) {\n      const store = doc.store;\n      const stackItem = /** @type {StackItem} */ (stack.pop());\n      /**\n       * @type {Set<Item>}\n       */\n      const itemsToRedo = new Set();\n      /**\n       * @type {Array<Item>}\n       */\n      const itemsToDelete = [];\n      let performedChange = false;\n      iterateDeletedStructs(transaction, stackItem.insertions, struct => {\n        if (struct instanceof Item) {\n          if (struct.redone !== null) {\n            let { item, diff } = followRedone(store, struct.id);\n            if (diff > 0) {\n              item = getItemCleanStart(transaction, createID(item.id.client, item.id.clock + diff));\n            }\n            struct = item;\n          }\n          if (!struct.deleted && scope.some(type => type === transaction.doc || isParentOf(/** @type {AbstractType<any>} */ (type), /** @type {Item} */ (struct)))) {\n            itemsToDelete.push(struct);\n          }\n        }\n      });\n      iterateDeletedStructs(transaction, stackItem.deletions, struct => {\n        if (\n          struct instanceof Item &&\n          scope.some(type => type === transaction.doc || isParentOf(/** @type {AbstractType<any>} */ (type), struct)) &&\n          // Never redo structs in stackItem.insertions because they were created and deleted in the same capture interval.\n          !isDeleted(stackItem.insertions, struct.id)\n        ) {\n          itemsToRedo.add(struct);\n        }\n      });\n      itemsToRedo.forEach(struct => {\n        performedChange = redoItem(transaction, struct, itemsToRedo, stackItem.insertions, undoManager.ignoreRemoteMapChanges, undoManager) !== null || performedChange;\n      });\n      // We want to delete in reverse order so that children are deleted before\n      // parents, so we have more information available when items are filtered.\n      for (let i = itemsToDelete.length - 1; i >= 0; i--) {\n        const item = itemsToDelete[i];\n        if (undoManager.deleteFilter(item)) {\n          item.delete(transaction);\n          performedChange = true;\n        }\n      }\n      undoManager.currStackItem = performedChange ? stackItem : null;\n    }\n    transaction.changed.forEach((subProps, type) => {\n      // destroy search marker if necessary\n      if (subProps.has(null) && type._searchMarker) {\n        type._searchMarker.length = 0;\n      }\n    });\n    _tr = transaction;\n  }, undoManager);\n  const res = undoManager.currStackItem;\n  if (res != null) {\n    const changedParentTypes = _tr.changedParentTypes;\n    undoManager.emit('stack-item-popped', [{ stackItem: res, type: eventType, changedParentTypes, origin: undoManager }, undoManager]);\n    undoManager.currStackItem = null;\n  }\n  return res\n};\n\n/**\n * @typedef {Object} UndoManagerOptions\n * @property {number} [UndoManagerOptions.captureTimeout=500]\n * @property {function(Transaction):boolean} [UndoManagerOptions.captureTransaction] Do not capture changes of a Transaction if result false.\n * @property {function(Item):boolean} [UndoManagerOptions.deleteFilter=()=>true] Sometimes\n * it is necessary to filter what an Undo/Redo operation can delete. If this\n * filter returns false, the type/item won't be deleted even it is in the\n * undo/redo scope.\n * @property {Set<any>} [UndoManagerOptions.trackedOrigins=new Set([null])]\n * @property {boolean} [ignoreRemoteMapChanges] Experimental. By default, the UndoManager will never overwrite remote changes. Enable this property to enable overwriting remote changes on key-value changes (Y.Map, properties on Y.Xml, etc..).\n * @property {Doc} [doc] The document that this UndoManager operates on. Only needed if typeScope is empty.\n */\n\n/**\n * @typedef {Object} StackItemEvent\n * @property {StackItem} StackItemEvent.stackItem\n * @property {any} StackItemEvent.origin\n * @property {'undo'|'redo'} StackItemEvent.type\n * @property {Map<AbstractType<YEvent<any>>,Array<YEvent<any>>>} StackItemEvent.changedParentTypes\n */\n\n/**\n * Fires 'stack-item-added' event when a stack item was added to either the undo- or\n * the redo-stack. You may store additional stack information via the\n * metadata property on `event.stackItem.meta` (it is a `Map` of metadata properties).\n * Fires 'stack-item-popped' event when a stack item was popped from either the\n * undo- or the redo-stack. You may restore the saved stack information from `event.stackItem.meta`.\n *\n * @extends {ObservableV2<{'stack-item-added':function(StackItemEvent, UndoManager):void, 'stack-item-popped': function(StackItemEvent, UndoManager):void, 'stack-cleared': function({ undoStackCleared: boolean, redoStackCleared: boolean }):void, 'stack-item-updated': function(StackItemEvent, UndoManager):void }>}\n */\nclass UndoManager extends ObservableV2 {\n  /**\n   * @param {Doc|AbstractType<any>|Array<AbstractType<any>>} typeScope Limits the scope of the UndoManager. If this is set to a ydoc instance, all changes on that ydoc will be undone. If set to a specific type, only changes on that type or its children will be undone. Also accepts an array of types.\n   * @param {UndoManagerOptions} options\n   */\n  constructor (typeScope, {\n    captureTimeout = 500,\n    captureTransaction = _tr => true,\n    deleteFilter = () => true,\n    trackedOrigins = new Set([null]),\n    ignoreRemoteMapChanges = false,\n    doc = /** @type {Doc} */ (array.isArray(typeScope) ? typeScope[0].doc : typeScope instanceof Doc ? typeScope : typeScope.doc)\n  } = {}) {\n    super();\n    /**\n     * @type {Array<AbstractType<any> | Doc>}\n     */\n    this.scope = [];\n    this.doc = doc;\n    this.addToScope(typeScope);\n    this.deleteFilter = deleteFilter;\n    trackedOrigins.add(this);\n    this.trackedOrigins = trackedOrigins;\n    this.captureTransaction = captureTransaction;\n    /**\n     * @type {Array<StackItem>}\n     */\n    this.undoStack = [];\n    /**\n     * @type {Array<StackItem>}\n     */\n    this.redoStack = [];\n    /**\n     * Whether the client is currently undoing (calling UndoManager.undo)\n     *\n     * @type {boolean}\n     */\n    this.undoing = false;\n    this.redoing = false;\n    /**\n     * The currently popped stack item if UndoManager.undoing or UndoManager.redoing\n     *\n     * @type {StackItem|null}\n     */\n    this.currStackItem = null;\n    this.lastChange = 0;\n    this.ignoreRemoteMapChanges = ignoreRemoteMapChanges;\n    this.captureTimeout = captureTimeout;\n    /**\n     * @param {Transaction} transaction\n     */\n    this.afterTransactionHandler = transaction => {\n      // Only track certain transactions\n      if (\n        !this.captureTransaction(transaction) ||\n        !this.scope.some(type => transaction.changedParentTypes.has(/** @type {AbstractType<any>} */ (type)) || type === this.doc) ||\n        (!this.trackedOrigins.has(transaction.origin) && (!transaction.origin || !this.trackedOrigins.has(transaction.origin.constructor)))\n      ) {\n        return\n      }\n      const undoing = this.undoing;\n      const redoing = this.redoing;\n      const stack = undoing ? this.redoStack : this.undoStack;\n      if (undoing) {\n        this.stopCapturing(); // next undo should not be appended to last stack item\n      } else if (!redoing) {\n        // neither undoing nor redoing: delete redoStack\n        this.clear(false, true);\n      }\n      const insertions = new DeleteSet();\n      transaction.afterState.forEach((endClock, client) => {\n        const startClock = transaction.beforeState.get(client) || 0;\n        const len = endClock - startClock;\n        if (len > 0) {\n          addToDeleteSet(insertions, client, startClock, len);\n        }\n      });\n      const now = time.getUnixTime();\n      let didAdd = false;\n      if (this.lastChange > 0 && now - this.lastChange < this.captureTimeout && stack.length > 0 && !undoing && !redoing) {\n        // append change to last stack op\n        const lastOp = stack[stack.length - 1];\n        lastOp.deletions = mergeDeleteSets([lastOp.deletions, transaction.deleteSet]);\n        lastOp.insertions = mergeDeleteSets([lastOp.insertions, insertions]);\n      } else {\n        // create a new stack op\n        stack.push(new StackItem(transaction.deleteSet, insertions));\n        didAdd = true;\n      }\n      if (!undoing && !redoing) {\n        this.lastChange = now;\n      }\n      // make sure that deleted structs are not gc'd\n      iterateDeletedStructs(transaction, transaction.deleteSet, /** @param {Item|GC} item */ item => {\n        if (item instanceof Item && this.scope.some(type => type === transaction.doc || isParentOf(/** @type {AbstractType<any>} */ (type), item))) {\n          keepItem(item, true);\n        }\n      });\n      /**\n       * @type {[StackItemEvent, UndoManager]}\n       */\n      const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? 'redo' : 'undo', changedParentTypes: transaction.changedParentTypes }, this];\n      if (didAdd) {\n        this.emit('stack-item-added', changeEvent);\n      } else {\n        this.emit('stack-item-updated', changeEvent);\n      }\n    };\n    this.destroy = this.destroy.bind(this);\n    this.doc.on('afterTransaction', this.afterTransactionHandler);\n    this.doc.on('destroy', this.destroy);\n  }\n\n  /**\n   * Extend the scope.\n   *\n   * @param {Array<AbstractType<any> | Doc> | AbstractType<any> | Doc} ytypes\n   */\n  addToScope (ytypes) {\n    const tmpSet = new Set(this.scope);\n    ytypes = array.isArray(ytypes) ? ytypes : [ytypes];\n    ytypes.forEach(ytype => {\n      if (!tmpSet.has(ytype)) {\n        tmpSet.add(ytype);\n        if (ytype instanceof AbstractType ? ytype.doc !== this.doc : ytype !== this.doc) logging.warn('[yjs#509] Not same Y.Doc'); // use MultiDocUndoManager instead. also see https://github.com/yjs/yjs/issues/509\n        this.scope.push(ytype);\n      }\n    });\n  }\n\n  /**\n   * @param {any} origin\n   */\n  addTrackedOrigin (origin) {\n    this.trackedOrigins.add(origin);\n  }\n\n  /**\n   * @param {any} origin\n   */\n  removeTrackedOrigin (origin) {\n    this.trackedOrigins.delete(origin);\n  }\n\n  clear (clearUndoStack = true, clearRedoStack = true) {\n    if ((clearUndoStack && this.canUndo()) || (clearRedoStack && this.canRedo())) {\n      this.doc.transact(tr => {\n        if (clearUndoStack) {\n          this.undoStack.forEach(item => clearUndoManagerStackItem(tr, this, item));\n          this.undoStack = [];\n        }\n        if (clearRedoStack) {\n          this.redoStack.forEach(item => clearUndoManagerStackItem(tr, this, item));\n          this.redoStack = [];\n        }\n        this.emit('stack-cleared', [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }]);\n      });\n    }\n  }\n\n  /**\n   * UndoManager merges Undo-StackItem if they are created within time-gap\n   * smaller than `options.captureTimeout`. Call `um.stopCapturing()` so that the next\n   * StackItem won't be merged.\n   *\n   *\n   * @example\n   *     // without stopCapturing\n   *     ytext.insert(0, 'a')\n   *     ytext.insert(1, 'b')\n   *     um.undo()\n   *     ytext.toString() // => '' (note that 'ab' was removed)\n   *     // with stopCapturing\n   *     ytext.insert(0, 'a')\n   *     um.stopCapturing()\n   *     ytext.insert(0, 'b')\n   *     um.undo()\n   *     ytext.toString() // => 'a' (note that only 'b' was removed)\n   *\n   */\n  stopCapturing () {\n    this.lastChange = 0;\n  }\n\n  /**\n   * Undo last changes on type.\n   *\n   * @return {StackItem?} Returns StackItem if a change was applied\n   */\n  undo () {\n    this.undoing = true;\n    let res;\n    try {\n      res = popStackItem(this, this.undoStack, 'undo');\n    } finally {\n      this.undoing = false;\n    }\n    return res\n  }\n\n  /**\n   * Redo last undo operation.\n   *\n   * @return {StackItem?} Returns StackItem if a change was applied\n   */\n  redo () {\n    this.redoing = true;\n    let res;\n    try {\n      res = popStackItem(this, this.redoStack, 'redo');\n    } finally {\n      this.redoing = false;\n    }\n    return res\n  }\n\n  /**\n   * Are undo steps available?\n   *\n   * @return {boolean} `true` if undo is possible\n   */\n  canUndo () {\n    return this.undoStack.length > 0\n  }\n\n  /**\n   * Are redo steps available?\n   *\n   * @return {boolean} `true` if redo is possible\n   */\n  canRedo () {\n    return this.redoStack.length > 0\n  }\n\n  destroy () {\n    this.trackedOrigins.delete(this);\n    this.doc.off('afterTransaction', this.afterTransactionHandler);\n    this.doc.off('destroy', this.destroy);\n    super.destroy();\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n */\nfunction * lazyStructReaderGenerator (decoder) {\n  const numOfStateUpdates = decoding.readVarUint(decoder.restDecoder);\n  for (let i = 0; i < numOfStateUpdates; i++) {\n    const numberOfStructs = decoding.readVarUint(decoder.restDecoder);\n    const client = decoder.readClient();\n    let clock = decoding.readVarUint(decoder.restDecoder);\n    for (let i = 0; i < numberOfStructs; i++) {\n      const info = decoder.readInfo();\n      // @todo use switch instead of ifs\n      if (info === 10) {\n        const len = decoding.readVarUint(decoder.restDecoder);\n        yield new Skip(createID(client, clock), len);\n        clock += len;\n      } else if ((binary.BITS5 & info) !== 0) {\n        const cantCopyParentInfo = (info & (binary.BIT7 | binary.BIT8)) === 0;\n        // If parent = null and neither left nor right are defined, then we know that `parent` is child of `y`\n        // and we read the next string as parentYKey.\n        // It indicates how we store/retrieve parent from `y.share`\n        // @type {string|null}\n        const struct = new Item(\n          createID(client, clock),\n          null, // left\n          (info & binary.BIT8) === binary.BIT8 ? decoder.readLeftID() : null, // origin\n          null, // right\n          (info & binary.BIT7) === binary.BIT7 ? decoder.readRightID() : null, // right origin\n          // @ts-ignore Force writing a string here.\n          cantCopyParentInfo ? (decoder.readParentInfo() ? decoder.readString() : decoder.readLeftID()) : null, // parent\n          cantCopyParentInfo && (info & binary.BIT6) === binary.BIT6 ? decoder.readString() : null, // parentSub\n          readItemContent(decoder, info) // item content\n        );\n        yield struct;\n        clock += struct.length;\n      } else {\n        const len = decoder.readLen();\n        yield new GC(createID(client, clock), len);\n        clock += len;\n      }\n    }\n  }\n}\n\nclass LazyStructReader {\n  /**\n   * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n   * @param {boolean} filterSkips\n   */\n  constructor (decoder, filterSkips) {\n    this.gen = lazyStructReaderGenerator(decoder);\n    /**\n     * @type {null | Item | Skip | GC}\n     */\n    this.curr = null;\n    this.done = false;\n    this.filterSkips = filterSkips;\n    this.next();\n  }\n\n  /**\n   * @return {Item | GC | Skip |null}\n   */\n  next () {\n    // ignore \"Skip\" structs\n    do {\n      this.curr = this.gen.next().value || null;\n    } while (this.filterSkips && this.curr !== null && this.curr.constructor === Skip)\n    return this.curr\n  }\n}\n\n/**\n * @param {Uint8Array} update\n *\n */\nconst logUpdate = update => logUpdateV2(update, UpdateDecoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n *\n */\nconst logUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {\n  const structs = [];\n  const updateDecoder = new YDecoder(decoding.createDecoder(update));\n  const lazyDecoder = new LazyStructReader(updateDecoder, false);\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    structs.push(curr);\n  }\n  logging.print('Structs: ', structs);\n  const ds = readDeleteSet(updateDecoder);\n  logging.print('DeleteSet: ', ds);\n};\n\n/**\n * @param {Uint8Array} update\n *\n */\nconst decodeUpdate = (update) => decodeUpdateV2(update, UpdateDecoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} [YDecoder]\n *\n */\nconst decodeUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {\n  const structs = [];\n  const updateDecoder = new YDecoder(decoding.createDecoder(update));\n  const lazyDecoder = new LazyStructReader(updateDecoder, false);\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    structs.push(curr);\n  }\n  return {\n    structs,\n    ds: readDeleteSet(updateDecoder)\n  }\n};\n\nclass LazyStructWriter {\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  constructor (encoder) {\n    this.currClient = 0;\n    this.startClock = 0;\n    this.written = 0;\n    this.encoder = encoder;\n    /**\n     * We want to write operations lazily, but also we need to know beforehand how many operations we want to write for each client.\n     *\n     * This kind of meta-information (#clients, #structs-per-client-written) is written to the restEncoder.\n     *\n     * We fragment the restEncoder and store a slice of it per-client until we know how many clients there are.\n     * When we flush (toUint8Array) we write the restEncoder using the fragments and the meta-information.\n     *\n     * @type {Array<{ written: number, restEncoder: Uint8Array }>}\n     */\n    this.clientStructs = [];\n  }\n}\n\n/**\n * @param {Array<Uint8Array>} updates\n * @return {Uint8Array}\n */\nconst mergeUpdates = updates => mergeUpdatesV2(updates, UpdateDecoderV1, UpdateEncoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof DSEncoderV1 | typeof DSEncoderV2} YEncoder\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} YDecoder\n * @return {Uint8Array}\n */\nconst encodeStateVectorFromUpdateV2 = (update, YEncoder = DSEncoderV2, YDecoder = UpdateDecoderV2) => {\n  const encoder = new YEncoder();\n  const updateDecoder = new LazyStructReader(new YDecoder(decoding.createDecoder(update)), false);\n  let curr = updateDecoder.curr;\n  if (curr !== null) {\n    let size = 0;\n    let currClient = curr.id.client;\n    let stopCounting = curr.id.clock !== 0; // must start at 0\n    let currClock = stopCounting ? 0 : curr.id.clock + curr.length;\n    for (; curr !== null; curr = updateDecoder.next()) {\n      if (currClient !== curr.id.client) {\n        if (currClock !== 0) {\n          size++;\n          // We found a new client\n          // write what we have to the encoder\n          encoding.writeVarUint(encoder.restEncoder, currClient);\n          encoding.writeVarUint(encoder.restEncoder, currClock);\n        }\n        currClient = curr.id.client;\n        currClock = 0;\n        stopCounting = curr.id.clock !== 0;\n      }\n      // we ignore skips\n      if (curr.constructor === Skip) {\n        stopCounting = true;\n      }\n      if (!stopCounting) {\n        currClock = curr.id.clock + curr.length;\n      }\n    }\n    // write what we have\n    if (currClock !== 0) {\n      size++;\n      encoding.writeVarUint(encoder.restEncoder, currClient);\n      encoding.writeVarUint(encoder.restEncoder, currClock);\n    }\n    // prepend the size of the state vector\n    const enc = encoding.createEncoder();\n    encoding.writeVarUint(enc, size);\n    encoding.writeBinaryEncoder(enc, encoder.restEncoder);\n    encoder.restEncoder = enc;\n    return encoder.toUint8Array()\n  } else {\n    encoding.writeVarUint(encoder.restEncoder, 0);\n    return encoder.toUint8Array()\n  }\n};\n\n/**\n * @param {Uint8Array} update\n * @return {Uint8Array}\n */\nconst encodeStateVectorFromUpdate = update => encodeStateVectorFromUpdateV2(update, DSEncoderV1, UpdateDecoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} YDecoder\n * @return {{ from: Map<number,number>, to: Map<number,number> }}\n */\nconst parseUpdateMetaV2 = (update, YDecoder = UpdateDecoderV2) => {\n  /**\n   * @type {Map<number, number>}\n   */\n  const from = new Map();\n  /**\n   * @type {Map<number, number>}\n   */\n  const to = new Map();\n  const updateDecoder = new LazyStructReader(new YDecoder(decoding.createDecoder(update)), false);\n  let curr = updateDecoder.curr;\n  if (curr !== null) {\n    let currClient = curr.id.client;\n    let currClock = curr.id.clock;\n    // write the beginning to `from`\n    from.set(currClient, currClock);\n    for (; curr !== null; curr = updateDecoder.next()) {\n      if (currClient !== curr.id.client) {\n        // We found a new client\n        // write the end to `to`\n        to.set(currClient, currClock);\n        // write the beginning to `from`\n        from.set(curr.id.client, curr.id.clock);\n        // update currClient\n        currClient = curr.id.client;\n      }\n      currClock = curr.id.clock + curr.length;\n    }\n    // write the end to `to`\n    to.set(currClient, currClock);\n  }\n  return { from, to }\n};\n\n/**\n * @param {Uint8Array} update\n * @return {{ from: Map<number,number>, to: Map<number,number> }}\n */\nconst parseUpdateMeta = update => parseUpdateMetaV2(update, UpdateDecoderV1);\n\n/**\n * This method is intended to slice any kind of struct and retrieve the right part.\n * It does not handle side-effects, so it should only be used by the lazy-encoder.\n *\n * @param {Item | GC | Skip} left\n * @param {number} diff\n * @return {Item | GC}\n */\nconst sliceStruct = (left, diff) => {\n  if (left.constructor === GC) {\n    const { client, clock } = left.id;\n    return new GC(createID(client, clock + diff), left.length - diff)\n  } else if (left.constructor === Skip) {\n    const { client, clock } = left.id;\n    return new Skip(createID(client, clock + diff), left.length - diff)\n  } else {\n    const leftItem = /** @type {Item} */ (left);\n    const { client, clock } = leftItem.id;\n    return new Item(\n      createID(client, clock + diff),\n      null,\n      createID(client, clock + diff - 1),\n      null,\n      leftItem.rightOrigin,\n      leftItem.parent,\n      leftItem.parentSub,\n      leftItem.content.splice(diff)\n    )\n  }\n};\n\n/**\n *\n * This function works similarly to `readUpdateV2`.\n *\n * @param {Array<Uint8Array>} updates\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} [YEncoder]\n * @return {Uint8Array}\n */\nconst mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {\n  if (updates.length === 1) {\n    return updates[0]\n  }\n  const updateDecoders = updates.map(update => new YDecoder(decoding.createDecoder(update)));\n  let lazyStructDecoders = updateDecoders.map(decoder => new LazyStructReader(decoder, true));\n\n  /**\n   * @todo we don't need offset because we always slice before\n   * @type {null | { struct: Item | GC | Skip, offset: number }}\n   */\n  let currWrite = null;\n\n  const updateEncoder = new YEncoder();\n  // write structs lazily\n  const lazyStructEncoder = new LazyStructWriter(updateEncoder);\n\n  // Note: We need to ensure that all lazyStructDecoders are fully consumed\n  // Note: Should merge document updates whenever possible - even from different updates\n  // Note: Should handle that some operations cannot be applied yet ()\n\n  while (true) {\n    // Write higher clients first ⇒ sort by clientID & clock and remove decoders without content\n    lazyStructDecoders = lazyStructDecoders.filter(dec => dec.curr !== null);\n    lazyStructDecoders.sort(\n      /** @type {function(any,any):number} */ (dec1, dec2) => {\n        if (dec1.curr.id.client === dec2.curr.id.client) {\n          const clockDiff = dec1.curr.id.clock - dec2.curr.id.clock;\n          if (clockDiff === 0) {\n            // @todo remove references to skip since the structDecoders must filter Skips.\n            return dec1.curr.constructor === dec2.curr.constructor\n              ? 0\n              : dec1.curr.constructor === Skip ? 1 : -1 // we are filtering skips anyway.\n          } else {\n            return clockDiff\n          }\n        } else {\n          return dec2.curr.id.client - dec1.curr.id.client\n        }\n      }\n    );\n    if (lazyStructDecoders.length === 0) {\n      break\n    }\n    const currDecoder = lazyStructDecoders[0];\n    // write from currDecoder until the next operation is from another client or if filler-struct\n    // then we need to reorder the decoders and find the next operation to write\n    const firstClient = /** @type {Item | GC} */ (currDecoder.curr).id.client;\n\n    if (currWrite !== null) {\n      let curr = /** @type {Item | GC | null} */ (currDecoder.curr);\n      let iterated = false;\n\n      // iterate until we find something that we haven't written already\n      // remember: first the high client-ids are written\n      while (curr !== null && curr.id.clock + curr.length <= currWrite.struct.id.clock + currWrite.struct.length && curr.id.client >= currWrite.struct.id.client) {\n        curr = currDecoder.next();\n        iterated = true;\n      }\n      if (\n        curr === null || // current decoder is empty\n        curr.id.client !== firstClient || // check whether there is another decoder that has has updates from `firstClient`\n        (iterated && curr.id.clock > currWrite.struct.id.clock + currWrite.struct.length) // the above while loop was used and we are potentially missing updates\n      ) {\n        continue\n      }\n\n      if (firstClient !== currWrite.struct.id.client) {\n        writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n        currWrite = { struct: curr, offset: 0 };\n        currDecoder.next();\n      } else {\n        if (currWrite.struct.id.clock + currWrite.struct.length < curr.id.clock) {\n          // @todo write currStruct & set currStruct = Skip(clock = currStruct.id.clock + currStruct.length, length = curr.id.clock - self.clock)\n          if (currWrite.struct.constructor === Skip) {\n            // extend existing skip\n            currWrite.struct.length = curr.id.clock + curr.length - currWrite.struct.id.clock;\n          } else {\n            writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n            const diff = curr.id.clock - currWrite.struct.id.clock - currWrite.struct.length;\n            /**\n             * @type {Skip}\n             */\n            const struct = new Skip(createID(firstClient, currWrite.struct.id.clock + currWrite.struct.length), diff);\n            currWrite = { struct, offset: 0 };\n          }\n        } else { // if (currWrite.struct.id.clock + currWrite.struct.length >= curr.id.clock) {\n          const diff = currWrite.struct.id.clock + currWrite.struct.length - curr.id.clock;\n          if (diff > 0) {\n            if (currWrite.struct.constructor === Skip) {\n              // prefer to slice Skip because the other struct might contain more information\n              currWrite.struct.length -= diff;\n            } else {\n              curr = sliceStruct(curr, diff);\n            }\n          }\n          if (!currWrite.struct.mergeWith(/** @type {any} */ (curr))) {\n            writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n            currWrite = { struct: curr, offset: 0 };\n            currDecoder.next();\n          }\n        }\n      }\n    } else {\n      currWrite = { struct: /** @type {Item | GC} */ (currDecoder.curr), offset: 0 };\n      currDecoder.next();\n    }\n    for (\n      let next = currDecoder.curr;\n      next !== null && next.id.client === firstClient && next.id.clock === currWrite.struct.id.clock + currWrite.struct.length && next.constructor !== Skip;\n      next = currDecoder.next()\n    ) {\n      writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n      currWrite = { struct: next, offset: 0 };\n    }\n  }\n  if (currWrite !== null) {\n    writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);\n    currWrite = null;\n  }\n  finishLazyStructWriting(lazyStructEncoder);\n\n  const dss = updateDecoders.map(decoder => readDeleteSet(decoder));\n  const ds = mergeDeleteSets(dss);\n  writeDeleteSet(updateEncoder, ds);\n  return updateEncoder.toUint8Array()\n};\n\n/**\n * @param {Uint8Array} update\n * @param {Uint8Array} sv\n * @param {typeof UpdateDecoderV1 | typeof UpdateDecoderV2} [YDecoder]\n * @param {typeof UpdateEncoderV1 | typeof UpdateEncoderV2} [YEncoder]\n */\nconst diffUpdateV2 = (update, sv, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {\n  const state = decodeStateVector(sv);\n  const encoder = new YEncoder();\n  const lazyStructWriter = new LazyStructWriter(encoder);\n  const decoder = new YDecoder(decoding.createDecoder(update));\n  const reader = new LazyStructReader(decoder, false);\n  while (reader.curr) {\n    const curr = reader.curr;\n    const currClient = curr.id.client;\n    const svClock = state.get(currClient) || 0;\n    if (reader.curr.constructor === Skip) {\n      // the first written struct shouldn't be a skip\n      reader.next();\n      continue\n    }\n    if (curr.id.clock + curr.length > svClock) {\n      writeStructToLazyStructWriter(lazyStructWriter, curr, math.max(svClock - curr.id.clock, 0));\n      reader.next();\n      while (reader.curr && reader.curr.id.client === currClient) {\n        writeStructToLazyStructWriter(lazyStructWriter, reader.curr, 0);\n        reader.next();\n      }\n    } else {\n      // read until something new comes up\n      while (reader.curr && reader.curr.id.client === currClient && reader.curr.id.clock + reader.curr.length <= svClock) {\n        reader.next();\n      }\n    }\n  }\n  finishLazyStructWriting(lazyStructWriter);\n  // write ds\n  const ds = readDeleteSet(decoder);\n  writeDeleteSet(encoder, ds);\n  return encoder.toUint8Array()\n};\n\n/**\n * @param {Uint8Array} update\n * @param {Uint8Array} sv\n */\nconst diffUpdate = (update, sv) => diffUpdateV2(update, sv, UpdateDecoderV1, UpdateEncoderV1);\n\n/**\n * @param {LazyStructWriter} lazyWriter\n */\nconst flushLazyStructWriter = lazyWriter => {\n  if (lazyWriter.written > 0) {\n    lazyWriter.clientStructs.push({ written: lazyWriter.written, restEncoder: encoding.toUint8Array(lazyWriter.encoder.restEncoder) });\n    lazyWriter.encoder.restEncoder = encoding.createEncoder();\n    lazyWriter.written = 0;\n  }\n};\n\n/**\n * @param {LazyStructWriter} lazyWriter\n * @param {Item | GC} struct\n * @param {number} offset\n */\nconst writeStructToLazyStructWriter = (lazyWriter, struct, offset) => {\n  // flush curr if we start another client\n  if (lazyWriter.written > 0 && lazyWriter.currClient !== struct.id.client) {\n    flushLazyStructWriter(lazyWriter);\n  }\n  if (lazyWriter.written === 0) {\n    lazyWriter.currClient = struct.id.client;\n    // write next client\n    lazyWriter.encoder.writeClient(struct.id.client);\n    // write startClock\n    encoding.writeVarUint(lazyWriter.encoder.restEncoder, struct.id.clock + offset);\n  }\n  struct.write(lazyWriter.encoder, offset);\n  lazyWriter.written++;\n};\n/**\n * Call this function when we collected all parts and want to\n * put all the parts together. After calling this method,\n * you can continue using the UpdateEncoder.\n *\n * @param {LazyStructWriter} lazyWriter\n */\nconst finishLazyStructWriting = (lazyWriter) => {\n  flushLazyStructWriter(lazyWriter);\n\n  // this is a fresh encoder because we called flushCurr\n  const restEncoder = lazyWriter.encoder.restEncoder;\n\n  /**\n   * Now we put all the fragments together.\n   * This works similarly to `writeClientsStructs`\n   */\n\n  // write # states that were updated - i.e. the clients\n  encoding.writeVarUint(restEncoder, lazyWriter.clientStructs.length);\n\n  for (let i = 0; i < lazyWriter.clientStructs.length; i++) {\n    const partStructs = lazyWriter.clientStructs[i];\n    /**\n     * Works similarly to `writeStructs`\n     */\n    // write # encoded structs\n    encoding.writeVarUint(restEncoder, partStructs.written);\n    // write the rest of the fragment\n    encoding.writeUint8Array(restEncoder, partStructs.restEncoder);\n  }\n};\n\n/**\n * @param {Uint8Array} update\n * @param {function(Item|GC|Skip):Item|GC|Skip} blockTransformer\n * @param {typeof UpdateDecoderV2 | typeof UpdateDecoderV1} YDecoder\n * @param {typeof UpdateEncoderV2 | typeof UpdateEncoderV1 } YEncoder\n */\nconst convertUpdateFormat = (update, blockTransformer, YDecoder, YEncoder) => {\n  const updateDecoder = new YDecoder(decoding.createDecoder(update));\n  const lazyDecoder = new LazyStructReader(updateDecoder, false);\n  const updateEncoder = new YEncoder();\n  const lazyWriter = new LazyStructWriter(updateEncoder);\n  for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {\n    writeStructToLazyStructWriter(lazyWriter, blockTransformer(curr), 0);\n  }\n  finishLazyStructWriting(lazyWriter);\n  const ds = readDeleteSet(updateDecoder);\n  writeDeleteSet(updateEncoder, ds);\n  return updateEncoder.toUint8Array()\n};\n\n/**\n * @typedef {Object} ObfuscatorOptions\n * @property {boolean} [ObfuscatorOptions.formatting=true]\n * @property {boolean} [ObfuscatorOptions.subdocs=true]\n * @property {boolean} [ObfuscatorOptions.yxml=true] Whether to obfuscate nodeName / hookName\n */\n\n/**\n * @param {ObfuscatorOptions} obfuscator\n */\nconst createObfuscator = ({ formatting = true, subdocs = true, yxml = true } = {}) => {\n  let i = 0;\n  const mapKeyCache = map.create();\n  const nodeNameCache = map.create();\n  const formattingKeyCache = map.create();\n  const formattingValueCache = map.create();\n  formattingValueCache.set(null, null); // end of a formatting range should always be the end of a formatting range\n  /**\n   * @param {Item|GC|Skip} block\n   * @return {Item|GC|Skip}\n   */\n  return block => {\n    switch (block.constructor) {\n      case GC:\n      case Skip:\n        return block\n      case Item: {\n        const item = /** @type {Item} */ (block);\n        const content = item.content;\n        switch (content.constructor) {\n          case ContentDeleted:\n            break\n          case ContentType: {\n            if (yxml) {\n              const type = /** @type {ContentType} */ (content).type;\n              if (type instanceof YXmlElement) {\n                type.nodeName = map.setIfUndefined(nodeNameCache, type.nodeName, () => 'node-' + i);\n              }\n              if (type instanceof YXmlHook) {\n                type.hookName = map.setIfUndefined(nodeNameCache, type.hookName, () => 'hook-' + i);\n              }\n            }\n            break\n          }\n          case ContentAny: {\n            const c = /** @type {ContentAny} */ (content);\n            c.arr = c.arr.map(() => i);\n            break\n          }\n          case ContentBinary: {\n            const c = /** @type {ContentBinary} */ (content);\n            c.content = new Uint8Array([i]);\n            break\n          }\n          case ContentDoc: {\n            const c = /** @type {ContentDoc} */ (content);\n            if (subdocs) {\n              c.opts = {};\n              c.doc.guid = i + '';\n            }\n            break\n          }\n          case ContentEmbed: {\n            const c = /** @type {ContentEmbed} */ (content);\n            c.embed = {};\n            break\n          }\n          case ContentFormat: {\n            const c = /** @type {ContentFormat} */ (content);\n            if (formatting) {\n              c.key = map.setIfUndefined(formattingKeyCache, c.key, () => i + '');\n              c.value = map.setIfUndefined(formattingValueCache, c.value, () => ({ i }));\n            }\n            break\n          }\n          case ContentJSON: {\n            const c = /** @type {ContentJSON} */ (content);\n            c.arr = c.arr.map(() => i);\n            break\n          }\n          case ContentString: {\n            const c = /** @type {ContentString} */ (content);\n            c.str = string.repeat((i % 10) + '', c.str.length);\n            break\n          }\n          default:\n            // unknown content type\n            error.unexpectedCase();\n        }\n        if (item.parentSub) {\n          item.parentSub = map.setIfUndefined(mapKeyCache, item.parentSub, () => i + '');\n        }\n        i++;\n        return block\n      }\n      default:\n        // unknown block-type\n        error.unexpectedCase();\n    }\n  }\n};\n\n/**\n * This function obfuscates the content of a Yjs update. This is useful to share\n * buggy Yjs documents while significantly limiting the possibility that a\n * developer can on the user. Note that it might still be possible to deduce\n * some information by analyzing the \"structure\" of the document or by analyzing\n * the typing behavior using the CRDT-related metadata that is still kept fully\n * intact.\n *\n * @param {Uint8Array} update\n * @param {ObfuscatorOptions} [opts]\n */\nconst obfuscateUpdate = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV1, UpdateEncoderV1);\n\n/**\n * @param {Uint8Array} update\n * @param {ObfuscatorOptions} [opts]\n */\nconst obfuscateUpdateV2 = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV2, UpdateEncoderV2);\n\n/**\n * @param {Uint8Array} update\n */\nconst convertUpdateFormatV1ToV2 = update => convertUpdateFormat(update, f.id, UpdateDecoderV1, UpdateEncoderV2);\n\n/**\n * @param {Uint8Array} update\n */\nconst convertUpdateFormatV2ToV1 = update => convertUpdateFormat(update, f.id, UpdateDecoderV2, UpdateEncoderV1);\n\nconst errorComputeChanges = 'You must not compute changes after the event-handler fired.';\n\n/**\n * @template {AbstractType<any>} T\n * YEvent describes the changes on a YType.\n */\nclass YEvent {\n  /**\n   * @param {T} target The changed type.\n   * @param {Transaction} transaction\n   */\n  constructor (target, transaction) {\n    /**\n     * The type on which this event was created on.\n     * @type {T}\n     */\n    this.target = target;\n    /**\n     * The current target on which the observe callback is called.\n     * @type {AbstractType<any>}\n     */\n    this.currentTarget = target;\n    /**\n     * The transaction that triggered this event.\n     * @type {Transaction}\n     */\n    this.transaction = transaction;\n    /**\n     * @type {Object|null}\n     */\n    this._changes = null;\n    /**\n     * @type {null | Map<string, { action: 'add' | 'update' | 'delete', oldValue: any }>}\n     */\n    this._keys = null;\n    /**\n     * @type {null | Array<{ insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any> }>}\n     */\n    this._delta = null;\n    /**\n     * @type {Array<string|number>|null}\n     */\n    this._path = null;\n  }\n\n  /**\n   * Computes the path from `y` to the changed type.\n   *\n   * @todo v14 should standardize on path: Array<{parent, index}> because that is easier to work with.\n   *\n   * The following property holds:\n   * @example\n   *   let type = y\n   *   event.path.forEach(dir => {\n   *     type = type.get(dir)\n   *   })\n   *   type === event.target // => true\n   */\n  get path () {\n    return this._path || (this._path = getPathTo(this.currentTarget, this.target))\n  }\n\n  /**\n   * Check if a struct is deleted by this event.\n   *\n   * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.\n   *\n   * @param {AbstractStruct} struct\n   * @return {boolean}\n   */\n  deletes (struct) {\n    return isDeleted(this.transaction.deleteSet, struct.id)\n  }\n\n  /**\n   * @type {Map<string, { action: 'add' | 'update' | 'delete', oldValue: any }>}\n   */\n  get keys () {\n    if (this._keys === null) {\n      if (this.transaction.doc._transactionCleanups.length === 0) {\n        throw error.create(errorComputeChanges)\n      }\n      const keys = new Map();\n      const target = this.target;\n      const changed = /** @type Set<string|null> */ (this.transaction.changed.get(target));\n      changed.forEach(key => {\n        if (key !== null) {\n          const item = /** @type {Item} */ (target._map.get(key));\n          /**\n           * @type {'delete' | 'add' | 'update'}\n           */\n          let action;\n          let oldValue;\n          if (this.adds(item)) {\n            let prev = item.left;\n            while (prev !== null && this.adds(prev)) {\n              prev = prev.left;\n            }\n            if (this.deletes(item)) {\n              if (prev !== null && this.deletes(prev)) {\n                action = 'delete';\n                oldValue = array.last(prev.content.getContent());\n              } else {\n                return\n              }\n            } else {\n              if (prev !== null && this.deletes(prev)) {\n                action = 'update';\n                oldValue = array.last(prev.content.getContent());\n              } else {\n                action = 'add';\n                oldValue = undefined;\n              }\n            }\n          } else {\n            if (this.deletes(item)) {\n              action = 'delete';\n              oldValue = array.last(/** @type {Item} */ item.content.getContent());\n            } else {\n              return // nop\n            }\n          }\n          keys.set(key, { action, oldValue });\n        }\n      });\n      this._keys = keys;\n    }\n    return this._keys\n  }\n\n  /**\n   * This is a computed property. Note that this can only be safely computed during the\n   * event call. Computing this property after other changes happened might result in\n   * unexpected behavior (incorrect computation of deltas). A safe way to collect changes\n   * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.\n   *\n   * @type {Array<{insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any>}>}\n   */\n  get delta () {\n    return this.changes.delta\n  }\n\n  /**\n   * Check if a struct is added by this event.\n   *\n   * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.\n   *\n   * @param {AbstractStruct} struct\n   * @return {boolean}\n   */\n  adds (struct) {\n    return struct.id.clock >= (this.transaction.beforeState.get(struct.id.client) || 0)\n  }\n\n  /**\n   * This is a computed property. Note that this can only be safely computed during the\n   * event call. Computing this property after other changes happened might result in\n   * unexpected behavior (incorrect computation of deltas). A safe way to collect changes\n   * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.\n   *\n   * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}}\n   */\n  get changes () {\n    let changes = this._changes;\n    if (changes === null) {\n      if (this.transaction.doc._transactionCleanups.length === 0) {\n        throw error.create(errorComputeChanges)\n      }\n      const target = this.target;\n      const added = set.create();\n      const deleted = set.create();\n      /**\n       * @type {Array<{insert:Array<any>}|{delete:number}|{retain:number}>}\n       */\n      const delta = [];\n      changes = {\n        added,\n        deleted,\n        delta,\n        keys: this.keys\n      };\n      const changed = /** @type Set<string|null> */ (this.transaction.changed.get(target));\n      if (changed.has(null)) {\n        /**\n         * @type {any}\n         */\n        let lastOp = null;\n        const packOp = () => {\n          if (lastOp) {\n            delta.push(lastOp);\n          }\n        };\n        for (let item = target._start; item !== null; item = item.right) {\n          if (item.deleted) {\n            if (this.deletes(item) && !this.adds(item)) {\n              if (lastOp === null || lastOp.delete === undefined) {\n                packOp();\n                lastOp = { delete: 0 };\n              }\n              lastOp.delete += item.length;\n              deleted.add(item);\n            } // else nop\n          } else {\n            if (this.adds(item)) {\n              if (lastOp === null || lastOp.insert === undefined) {\n                packOp();\n                lastOp = { insert: [] };\n              }\n              lastOp.insert = lastOp.insert.concat(item.content.getContent());\n              added.add(item);\n            } else {\n              if (lastOp === null || lastOp.retain === undefined) {\n                packOp();\n                lastOp = { retain: 0 };\n              }\n              lastOp.retain += item.length;\n            }\n          }\n        }\n        if (lastOp !== null && lastOp.retain === undefined) {\n          packOp();\n        }\n      }\n      this._changes = changes;\n    }\n    return /** @type {any} */ (changes)\n  }\n}\n\n/**\n * Compute the path from this type to the specified target.\n *\n * @example\n *   // `child` should be accessible via `type.get(path[0]).get(path[1])..`\n *   const path = type.getPathTo(child)\n *   // assuming `type instanceof YArray`\n *   console.log(path) // might look like => [2, 'key1']\n *   child === type.get(path[0]).get(path[1])\n *\n * @param {AbstractType<any>} parent\n * @param {AbstractType<any>} child target\n * @return {Array<string|number>} Path to the target\n *\n * @private\n * @function\n */\nconst getPathTo = (parent, child) => {\n  const path = [];\n  while (child._item !== null && child !== parent) {\n    if (child._item.parentSub !== null) {\n      // parent is map-ish\n      path.unshift(child._item.parentSub);\n    } else {\n      // parent is array-ish\n      let i = 0;\n      let c = /** @type {AbstractType<any>} */ (child._item.parent)._start;\n      while (c !== child._item && c !== null) {\n        if (!c.deleted && c.countable) {\n          i += c.length;\n        }\n        c = c.right;\n      }\n      path.unshift(i);\n    }\n    child = /** @type {AbstractType<any>} */ (child._item.parent);\n  }\n  return path\n};\n\n/**\n * https://docs.yjs.dev/getting-started/working-with-shared-types#caveats\n */\nconst warnPrematureAccess = () => { logging.warn('Invalid access: Add Yjs type to a document before reading data.'); };\n\nconst maxSearchMarker = 80;\n\n/**\n * A unique timestamp that identifies each marker.\n *\n * Time is relative,.. this is more like an ever-increasing clock.\n *\n * @type {number}\n */\nlet globalSearchMarkerTimestamp = 0;\n\nclass ArraySearchMarker {\n  /**\n   * @param {Item} p\n   * @param {number} index\n   */\n  constructor (p, index) {\n    p.marker = true;\n    this.p = p;\n    this.index = index;\n    this.timestamp = globalSearchMarkerTimestamp++;\n  }\n}\n\n/**\n * @param {ArraySearchMarker} marker\n */\nconst refreshMarkerTimestamp = marker => { marker.timestamp = globalSearchMarkerTimestamp++; };\n\n/**\n * This is rather complex so this function is the only thing that should overwrite a marker\n *\n * @param {ArraySearchMarker} marker\n * @param {Item} p\n * @param {number} index\n */\nconst overwriteMarker = (marker, p, index) => {\n  marker.p.marker = false;\n  marker.p = p;\n  p.marker = true;\n  marker.index = index;\n  marker.timestamp = globalSearchMarkerTimestamp++;\n};\n\n/**\n * @param {Array<ArraySearchMarker>} searchMarker\n * @param {Item} p\n * @param {number} index\n */\nconst markPosition = (searchMarker, p, index) => {\n  if (searchMarker.length >= maxSearchMarker) {\n    // override oldest marker (we don't want to create more objects)\n    const marker = searchMarker.reduce((a, b) => a.timestamp < b.timestamp ? a : b);\n    overwriteMarker(marker, p, index);\n    return marker\n  } else {\n    // create new marker\n    const pm = new ArraySearchMarker(p, index);\n    searchMarker.push(pm);\n    return pm\n  }\n};\n\n/**\n * Search marker help us to find positions in the associative array faster.\n *\n * They speed up the process of finding a position without much bookkeeping.\n *\n * A maximum of `maxSearchMarker` objects are created.\n *\n * This function always returns a refreshed marker (updated timestamp)\n *\n * @param {AbstractType<any>} yarray\n * @param {number} index\n */\nconst findMarker = (yarray, index) => {\n  if (yarray._start === null || index === 0 || yarray._searchMarker === null) {\n    return null\n  }\n  const marker = yarray._searchMarker.length === 0 ? null : yarray._searchMarker.reduce((a, b) => math.abs(index - a.index) < math.abs(index - b.index) ? a : b);\n  let p = yarray._start;\n  let pindex = 0;\n  if (marker !== null) {\n    p = marker.p;\n    pindex = marker.index;\n    refreshMarkerTimestamp(marker); // we used it, we might need to use it again\n  }\n  // iterate to right if possible\n  while (p.right !== null && pindex < index) {\n    if (!p.deleted && p.countable) {\n      if (index < pindex + p.length) {\n        break\n      }\n      pindex += p.length;\n    }\n    p = p.right;\n  }\n  // iterate to left if necessary (might be that pindex > index)\n  while (p.left !== null && pindex > index) {\n    p = p.left;\n    if (!p.deleted && p.countable) {\n      pindex -= p.length;\n    }\n  }\n  // we want to make sure that p can't be merged with left, because that would screw up everything\n  // in that cas just return what we have (it is most likely the best marker anyway)\n  // iterate to left until p can't be merged with left\n  while (p.left !== null && p.left.id.client === p.id.client && p.left.id.clock + p.left.length === p.id.clock) {\n    p = p.left;\n    if (!p.deleted && p.countable) {\n      pindex -= p.length;\n    }\n  }\n\n  // @todo remove!\n  // assure position\n  // {\n  //   let start = yarray._start\n  //   let pos = 0\n  //   while (start !== p) {\n  //     if (!start.deleted && start.countable) {\n  //       pos += start.length\n  //     }\n  //     start = /** @type {Item} */ (start.right)\n  //   }\n  //   if (pos !== pindex) {\n  //     debugger\n  //     throw new Error('Gotcha position fail!')\n  //   }\n  // }\n  // if (marker) {\n  //   if (window.lengths == null) {\n  //     window.lengths = []\n  //     window.getLengths = () => window.lengths.sort((a, b) => a - b)\n  //   }\n  //   window.lengths.push(marker.index - pindex)\n  //   console.log('distance', marker.index - pindex, 'len', p && p.parent.length)\n  // }\n  if (marker !== null && math.abs(marker.index - pindex) < /** @type {YText|YArray<any>} */ (p.parent).length / maxSearchMarker) {\n    // adjust existing marker\n    overwriteMarker(marker, p, pindex);\n    return marker\n  } else {\n    // create new marker\n    return markPosition(yarray._searchMarker, p, pindex)\n  }\n};\n\n/**\n * Update markers when a change happened.\n *\n * This should be called before doing a deletion!\n *\n * @param {Array<ArraySearchMarker>} searchMarker\n * @param {number} index\n * @param {number} len If insertion, len is positive. If deletion, len is negative.\n */\nconst updateMarkerChanges = (searchMarker, index, len) => {\n  for (let i = searchMarker.length - 1; i >= 0; i--) {\n    const m = searchMarker[i];\n    if (len > 0) {\n      /**\n       * @type {Item|null}\n       */\n      let p = m.p;\n      p.marker = false;\n      // Ideally we just want to do a simple position comparison, but this will only work if\n      // search markers don't point to deleted items for formats.\n      // Iterate marker to prev undeleted countable position so we know what to do when updating a position\n      while (p && (p.deleted || !p.countable)) {\n        p = p.left;\n        if (p && !p.deleted && p.countable) {\n          // adjust position. the loop should break now\n          m.index -= p.length;\n        }\n      }\n      if (p === null || p.marker === true) {\n        // remove search marker if updated position is null or if position is already marked\n        searchMarker.splice(i, 1);\n        continue\n      }\n      m.p = p;\n      p.marker = true;\n    }\n    if (index < m.index || (len > 0 && index === m.index)) { // a simple index <= m.index check would actually suffice\n      m.index = math.max(index, m.index + len);\n    }\n  }\n};\n\n/**\n * Accumulate all (list) children of a type and return them as an Array.\n *\n * @param {AbstractType<any>} t\n * @return {Array<Item>}\n */\nconst getTypeChildren = t => {\n  t.doc ?? warnPrematureAccess();\n  let s = t._start;\n  const arr = [];\n  while (s) {\n    arr.push(s);\n    s = s.right;\n  }\n  return arr\n};\n\n/**\n * Call event listeners with an event. This will also add an event to all\n * parents (for `.observeDeep` handlers).\n *\n * @template EventType\n * @param {AbstractType<EventType>} type\n * @param {Transaction} transaction\n * @param {EventType} event\n */\nconst callTypeObservers = (type, transaction, event) => {\n  const changedType = type;\n  const changedParentTypes = transaction.changedParentTypes;\n  while (true) {\n    // @ts-ignore\n    map.setIfUndefined(changedParentTypes, type, () => []).push(event);\n    if (type._item === null) {\n      break\n    }\n    type = /** @type {AbstractType<any>} */ (type._item.parent);\n  }\n  callEventHandlerListeners(changedType._eH, event, transaction);\n};\n\n/**\n * @template EventType\n * Abstract Yjs Type class\n */\nclass AbstractType {\n  constructor () {\n    /**\n     * @type {Item|null}\n     */\n    this._item = null;\n    /**\n     * @type {Map<string,Item>}\n     */\n    this._map = new Map();\n    /**\n     * @type {Item|null}\n     */\n    this._start = null;\n    /**\n     * @type {Doc|null}\n     */\n    this.doc = null;\n    this._length = 0;\n    /**\n     * Event handlers\n     * @type {EventHandler<EventType,Transaction>}\n     */\n    this._eH = createEventHandler();\n    /**\n     * Deep event handlers\n     * @type {EventHandler<Array<YEvent<any>>,Transaction>}\n     */\n    this._dEH = createEventHandler();\n    /**\n     * @type {null | Array<ArraySearchMarker>}\n     */\n    this._searchMarker = null;\n  }\n\n  /**\n   * @return {AbstractType<any>|null}\n   */\n  get parent () {\n    return this._item ? /** @type {AbstractType<any>} */ (this._item.parent) : null\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item|null} item\n   */\n  _integrate (y, item) {\n    this.doc = y;\n    this._item = item;\n  }\n\n  /**\n   * @return {AbstractType<EventType>}\n   */\n  _copy () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {AbstractType<EventType>}\n   */\n  clone () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder\n   */\n  _write (_encoder) { }\n\n  /**\n   * The first non-deleted item\n   */\n  get _first () {\n    let n = this._start;\n    while (n !== null && n.deleted) {\n      n = n.right;\n    }\n    return n\n  }\n\n  /**\n   * Creates YEvent and calls all type observers.\n   * Must be implemented by each type.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} _parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, _parentSubs) {\n    if (!transaction.local && this._searchMarker) {\n      this._searchMarker.length = 0;\n    }\n  }\n\n  /**\n   * Observe all events that are created on this type.\n   *\n   * @param {function(EventType, Transaction):void} f Observer function\n   */\n  observe (f) {\n    addEventHandlerListener(this._eH, f);\n  }\n\n  /**\n   * Observe all events that are created by this type and its children.\n   *\n   * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function\n   */\n  observeDeep (f) {\n    addEventHandlerListener(this._dEH, f);\n  }\n\n  /**\n   * Unregister an observer function.\n   *\n   * @param {function(EventType,Transaction):void} f Observer function\n   */\n  unobserve (f) {\n    removeEventHandlerListener(this._eH, f);\n  }\n\n  /**\n   * Unregister an observer function.\n   *\n   * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function\n   */\n  unobserveDeep (f) {\n    removeEventHandlerListener(this._dEH, f);\n  }\n\n  /**\n   * @abstract\n   * @return {any}\n   */\n  toJSON () {}\n}\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} start\n * @param {number} end\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nconst typeListSlice = (type, start, end) => {\n  type.doc ?? warnPrematureAccess();\n  if (start < 0) {\n    start = type._length + start;\n  }\n  if (end < 0) {\n    end = type._length + end;\n  }\n  let len = end - start;\n  const cs = [];\n  let n = type._start;\n  while (n !== null && len > 0) {\n    if (n.countable && !n.deleted) {\n      const c = n.content.getContent();\n      if (c.length <= start) {\n        start -= c.length;\n      } else {\n        for (let i = start; i < c.length && len > 0; i++) {\n          cs.push(c[i]);\n          len--;\n        }\n        start = 0;\n      }\n    }\n    n = n.right;\n  }\n  return cs\n};\n\n/**\n * @param {AbstractType<any>} type\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nconst typeListToArray = type => {\n  type.doc ?? warnPrematureAccess();\n  const cs = [];\n  let n = type._start;\n  while (n !== null) {\n    if (n.countable && !n.deleted) {\n      const c = n.content.getContent();\n      for (let i = 0; i < c.length; i++) {\n        cs.push(c[i]);\n      }\n    }\n    n = n.right;\n  }\n  return cs\n};\n\n/**\n * @param {AbstractType<any>} type\n * @param {Snapshot} snapshot\n * @return {Array<any>}\n *\n * @private\n * @function\n */\nconst typeListToArraySnapshot = (type, snapshot) => {\n  const cs = [];\n  let n = type._start;\n  while (n !== null) {\n    if (n.countable && isVisible(n, snapshot)) {\n      const c = n.content.getContent();\n      for (let i = 0; i < c.length; i++) {\n        cs.push(c[i]);\n      }\n    }\n    n = n.right;\n  }\n  return cs\n};\n\n/**\n * Executes a provided function on once on every element of this YArray.\n *\n * @param {AbstractType<any>} type\n * @param {function(any,number,any):void} f A function to execute on every element of this YArray.\n *\n * @private\n * @function\n */\nconst typeListForEach = (type, f) => {\n  let index = 0;\n  let n = type._start;\n  type.doc ?? warnPrematureAccess();\n  while (n !== null) {\n    if (n.countable && !n.deleted) {\n      const c = n.content.getContent();\n      for (let i = 0; i < c.length; i++) {\n        f(c[i], index++, type);\n      }\n    }\n    n = n.right;\n  }\n};\n\n/**\n * @template C,R\n * @param {AbstractType<any>} type\n * @param {function(C,number,AbstractType<any>):R} f\n * @return {Array<R>}\n *\n * @private\n * @function\n */\nconst typeListMap = (type, f) => {\n  /**\n   * @type {Array<any>}\n   */\n  const result = [];\n  typeListForEach(type, (c, i) => {\n    result.push(f(c, i, type));\n  });\n  return result\n};\n\n/**\n * @param {AbstractType<any>} type\n * @return {IterableIterator<any>}\n *\n * @private\n * @function\n */\nconst typeListCreateIterator = type => {\n  let n = type._start;\n  /**\n   * @type {Array<any>|null}\n   */\n  let currentContent = null;\n  let currentContentIndex = 0;\n  return {\n    [Symbol.iterator] () {\n      return this\n    },\n    next: () => {\n      // find some content\n      if (currentContent === null) {\n        while (n !== null && n.deleted) {\n          n = n.right;\n        }\n        // check if we reached the end, no need to check currentContent, because it does not exist\n        if (n === null) {\n          return {\n            done: true,\n            value: undefined\n          }\n        }\n        // we found n, so we can set currentContent\n        currentContent = n.content.getContent();\n        currentContentIndex = 0;\n        n = n.right; // we used the content of n, now iterate to next\n      }\n      const value = currentContent[currentContentIndex++];\n      // check if we need to empty currentContent\n      if (currentContent.length <= currentContentIndex) {\n        currentContent = null;\n      }\n      return {\n        done: false,\n        value\n      }\n    }\n  }\n};\n\n/**\n * @param {AbstractType<any>} type\n * @param {number} index\n * @return {any}\n *\n * @private\n * @function\n */\nconst typeListGet = (type, index) => {\n  type.doc ?? warnPrematureAccess();\n  const marker = findMarker(type, index);\n  let n = type._start;\n  if (marker !== null) {\n    n = marker.p;\n    index -= marker.index;\n  }\n  for (; n !== null; n = n.right) {\n    if (!n.deleted && n.countable) {\n      if (index < n.length) {\n        return n.content.getContent()[index]\n      }\n      index -= n.length;\n    }\n  }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {Item?} referenceItem\n * @param {Array<Object<string,any>|Array<any>|boolean|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nconst typeListInsertGenericsAfter = (transaction, parent, referenceItem, content) => {\n  let left = referenceItem;\n  const doc = transaction.doc;\n  const ownClientId = doc.clientID;\n  const store = doc.store;\n  const right = referenceItem === null ? parent._start : referenceItem.right;\n  /**\n   * @type {Array<Object|Array<any>|number|null>}\n   */\n  let jsonContent = [];\n  const packJsonContent = () => {\n    if (jsonContent.length > 0) {\n      left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentAny(jsonContent));\n      left.integrate(transaction, 0);\n      jsonContent = [];\n    }\n  };\n  content.forEach(c => {\n    if (c === null) {\n      jsonContent.push(c);\n    } else {\n      switch (c.constructor) {\n        case Number:\n        case Object:\n        case Boolean:\n        case Array:\n        case String:\n          jsonContent.push(c);\n          break\n        default:\n          packJsonContent();\n          switch (c.constructor) {\n            case Uint8Array:\n            case ArrayBuffer:\n              left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentBinary(new Uint8Array(/** @type {Uint8Array} */ (c))));\n              left.integrate(transaction, 0);\n              break\n            case Doc:\n              left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentDoc(/** @type {Doc} */ (c)));\n              left.integrate(transaction, 0);\n              break\n            default:\n              if (c instanceof AbstractType) {\n                left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentType(c));\n                left.integrate(transaction, 0);\n              } else {\n                throw new Error('Unexpected content type in insert operation')\n              }\n          }\n      }\n    }\n  });\n  packJsonContent();\n};\n\nconst lengthExceeded = () => error.create('Length exceeded!');\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {Array<Object<string,any>|Array<any>|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nconst typeListInsertGenerics = (transaction, parent, index, content) => {\n  if (index > parent._length) {\n    throw lengthExceeded()\n  }\n  if (index === 0) {\n    if (parent._searchMarker) {\n      updateMarkerChanges(parent._searchMarker, index, content.length);\n    }\n    return typeListInsertGenericsAfter(transaction, parent, null, content)\n  }\n  const startIndex = index;\n  const marker = findMarker(parent, index);\n  let n = parent._start;\n  if (marker !== null) {\n    n = marker.p;\n    index -= marker.index;\n    // we need to iterate one to the left so that the algorithm works\n    if (index === 0) {\n      // @todo refactor this as it actually doesn't consider formats\n      n = n.prev; // important! get the left undeleted item so that we can actually decrease index\n      index += (n && n.countable && !n.deleted) ? n.length : 0;\n    }\n  }\n  for (; n !== null; n = n.right) {\n    if (!n.deleted && n.countable) {\n      if (index <= n.length) {\n        if (index < n.length) {\n          // insert in-between\n          getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index));\n        }\n        break\n      }\n      index -= n.length;\n    }\n  }\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, startIndex, content.length);\n  }\n  return typeListInsertGenericsAfter(transaction, parent, n, content)\n};\n\n/**\n * Pushing content is special as we generally want to push after the last item. So we don't have to update\n * the search marker.\n *\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {Array<Object<string,any>|Array<any>|number|null|string|Uint8Array>} content\n *\n * @private\n * @function\n */\nconst typeListPushGenerics = (transaction, parent, content) => {\n  // Use the marker with the highest index and iterate to the right.\n  const marker = (parent._searchMarker || []).reduce((maxMarker, currMarker) => currMarker.index > maxMarker.index ? currMarker : maxMarker, { index: 0, p: parent._start });\n  let n = marker.p;\n  if (n) {\n    while (n.right) {\n      n = n.right;\n    }\n  }\n  return typeListInsertGenericsAfter(transaction, parent, n, content)\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {number} length\n *\n * @private\n * @function\n */\nconst typeListDelete = (transaction, parent, index, length) => {\n  if (length === 0) { return }\n  const startIndex = index;\n  const startLength = length;\n  const marker = findMarker(parent, index);\n  let n = parent._start;\n  if (marker !== null) {\n    n = marker.p;\n    index -= marker.index;\n  }\n  // compute the first item to be deleted\n  for (; n !== null && index > 0; n = n.right) {\n    if (!n.deleted && n.countable) {\n      if (index < n.length) {\n        getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index));\n      }\n      index -= n.length;\n    }\n  }\n  // delete all items until done\n  while (length > 0 && n !== null) {\n    if (!n.deleted) {\n      if (length < n.length) {\n        getItemCleanStart(transaction, createID(n.id.client, n.id.clock + length));\n      }\n      n.delete(transaction);\n      length -= n.length;\n    }\n    n = n.right;\n  }\n  if (length > 0) {\n    throw lengthExceeded()\n  }\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, startIndex, -startLength + length /* in case we remove the above exception */);\n  }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {string} key\n *\n * @private\n * @function\n */\nconst typeMapDelete = (transaction, parent, key) => {\n  const c = parent._map.get(key);\n  if (c !== undefined) {\n    c.delete(transaction);\n  }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @param {Object|number|null|Array<any>|string|Uint8Array|AbstractType<any>} value\n *\n * @private\n * @function\n */\nconst typeMapSet = (transaction, parent, key, value) => {\n  const left = parent._map.get(key) || null;\n  const doc = transaction.doc;\n  const ownClientId = doc.clientID;\n  let content;\n  if (value == null) {\n    content = new ContentAny([value]);\n  } else {\n    switch (value.constructor) {\n      case Number:\n      case Object:\n      case Boolean:\n      case Array:\n      case String:\n      case Date:\n      case BigInt:\n        content = new ContentAny([value]);\n        break\n      case Uint8Array:\n        content = new ContentBinary(/** @type {Uint8Array} */ (value));\n        break\n      case Doc:\n        content = new ContentDoc(/** @type {Doc} */ (value));\n        break\n      default:\n        if (value instanceof AbstractType) {\n          content = new ContentType(value);\n        } else {\n          throw new Error('Unexpected content type')\n        }\n    }\n  }\n  new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, null, null, parent, key, content).integrate(transaction, 0);\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @return {Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined}\n *\n * @private\n * @function\n */\nconst typeMapGet = (parent, key) => {\n  parent.doc ?? warnPrematureAccess();\n  const val = parent._map.get(key);\n  return val !== undefined && !val.deleted ? val.content.getContent()[val.length - 1] : undefined\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @return {Object<string,Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined>}\n *\n * @private\n * @function\n */\nconst typeMapGetAll = (parent) => {\n  /**\n   * @type {Object<string,any>}\n   */\n  const res = {};\n  parent.doc ?? warnPrematureAccess();\n  parent._map.forEach((value, key) => {\n    if (!value.deleted) {\n      res[key] = value.content.getContent()[value.length - 1];\n    }\n  });\n  return res\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @return {boolean}\n *\n * @private\n * @function\n */\nconst typeMapHas = (parent, key) => {\n  parent.doc ?? warnPrematureAccess();\n  const val = parent._map.get(key);\n  return val !== undefined && !val.deleted\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {string} key\n * @param {Snapshot} snapshot\n * @return {Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined}\n *\n * @private\n * @function\n */\nconst typeMapGetSnapshot = (parent, key, snapshot) => {\n  let v = parent._map.get(key) || null;\n  while (v !== null && (!snapshot.sv.has(v.id.client) || v.id.clock >= (snapshot.sv.get(v.id.client) || 0))) {\n    v = v.left;\n  }\n  return v !== null && isVisible(v, snapshot) ? v.content.getContent()[v.length - 1] : undefined\n};\n\n/**\n * @param {AbstractType<any>} parent\n * @param {Snapshot} snapshot\n * @return {Object<string,Object<string,any>|number|null|Array<any>|string|Uint8Array|AbstractType<any>|undefined>}\n *\n * @private\n * @function\n */\nconst typeMapGetAllSnapshot = (parent, snapshot) => {\n  /**\n   * @type {Object<string,any>}\n   */\n  const res = {};\n  parent._map.forEach((value, key) => {\n    /**\n     * @type {Item|null}\n     */\n    let v = value;\n    while (v !== null && (!snapshot.sv.has(v.id.client) || v.id.clock >= (snapshot.sv.get(v.id.client) || 0))) {\n      v = v.left;\n    }\n    if (v !== null && isVisible(v, snapshot)) {\n      res[key] = v.content.getContent()[v.length - 1];\n    }\n  });\n  return res\n};\n\n/**\n * @param {AbstractType<any> & { _map: Map<string, Item> }} type\n * @return {IterableIterator<Array<any>>}\n *\n * @private\n * @function\n */\nconst createMapIterator = type => {\n  type.doc ?? warnPrematureAccess();\n  return iterator.iteratorFilter(type._map.entries(), /** @param {any} entry */ entry => !entry[1].deleted)\n};\n\n/**\n * @module YArray\n */\n\n\n/**\n * Event that describes the changes on a YArray\n * @template T\n * @extends YEvent<YArray<T>>\n */\nclass YArrayEvent extends YEvent {}\n\n/**\n * A shared Array implementation.\n * @template T\n * @extends AbstractType<YArrayEvent<T>>\n * @implements {Iterable<T>}\n */\nclass YArray extends AbstractType {\n  constructor () {\n    super();\n    /**\n     * @type {Array<any>?}\n     * @private\n     */\n    this._prelimContent = [];\n    /**\n     * @type {Array<ArraySearchMarker>}\n     */\n    this._searchMarker = [];\n  }\n\n  /**\n   * Construct a new YArray containing the specified items.\n   * @template {Object<string,any>|Array<any>|number|null|string|Uint8Array} T\n   * @param {Array<T>} items\n   * @return {YArray<T>}\n   */\n  static from (items) {\n    /**\n     * @type {YArray<T>}\n     */\n    const a = new YArray();\n    a.push(items);\n    return a\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item);\n    this.insert(0, /** @type {Array<any>} */ (this._prelimContent));\n    this._prelimContent = null;\n  }\n\n  /**\n   * @return {YArray<T>}\n   */\n  _copy () {\n    return new YArray()\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YArray<T>}\n   */\n  clone () {\n    /**\n     * @type {YArray<T>}\n     */\n    const arr = new YArray();\n    arr.insert(0, this.toArray().map(el =>\n      el instanceof AbstractType ? /** @type {typeof el} */ (el.clone()) : el\n    ));\n    return arr\n  }\n\n  get length () {\n    this.doc ?? warnPrematureAccess();\n    return this._length\n  }\n\n  /**\n   * Creates YArrayEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    super._callObserver(transaction, parentSubs);\n    callTypeObservers(this, transaction, new YArrayEvent(this, transaction));\n  }\n\n  /**\n   * Inserts new content at an index.\n   *\n   * Important: This function expects an array of content. Not just a content\n   * object. The reason for this \"weirdness\" is that inserting several elements\n   * is very efficient when it is done as a single operation.\n   *\n   * @example\n   *  // Insert character 'a' at position 0\n   *  yarray.insert(0, ['a'])\n   *  // Insert numbers 1, 2 at position 1\n   *  yarray.insert(1, [1, 2])\n   *\n   * @param {number} index The index to insert content at.\n   * @param {Array<T>} content The array of content\n   */\n  insert (index, content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListInsertGenerics(transaction, this, index, /** @type {any} */ (content));\n      });\n    } else {\n      /** @type {Array<any>} */ (this._prelimContent).splice(index, 0, ...content);\n    }\n  }\n\n  /**\n   * Appends content to this YArray.\n   *\n   * @param {Array<T>} content Array of content to append.\n   *\n   * @todo Use the following implementation in all types.\n   */\n  push (content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListPushGenerics(transaction, this, /** @type {any} */ (content));\n      });\n    } else {\n      /** @type {Array<any>} */ (this._prelimContent).push(...content);\n    }\n  }\n\n  /**\n   * Prepends content to this YArray.\n   *\n   * @param {Array<T>} content Array of content to prepend.\n   */\n  unshift (content) {\n    this.insert(0, content);\n  }\n\n  /**\n   * Deletes elements starting from an index.\n   *\n   * @param {number} index Index at which to start deleting elements\n   * @param {number} length The number of elements to remove. Defaults to 1.\n   */\n  delete (index, length = 1) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListDelete(transaction, this, index, length);\n      });\n    } else {\n      /** @type {Array<any>} */ (this._prelimContent).splice(index, length);\n    }\n  }\n\n  /**\n   * Returns the i-th element from a YArray.\n   *\n   * @param {number} index The index of the element to return from the YArray\n   * @return {T}\n   */\n  get (index) {\n    return typeListGet(this, index)\n  }\n\n  /**\n   * Transforms this YArray to a JavaScript Array.\n   *\n   * @return {Array<T>}\n   */\n  toArray () {\n    return typeListToArray(this)\n  }\n\n  /**\n   * Returns a portion of this YArray into a JavaScript Array selected\n   * from start to end (end not included).\n   *\n   * @param {number} [start]\n   * @param {number} [end]\n   * @return {Array<T>}\n   */\n  slice (start = 0, end = this.length) {\n    return typeListSlice(this, start, end)\n  }\n\n  /**\n   * Transforms this Shared Type to a JSON object.\n   *\n   * @return {Array<any>}\n   */\n  toJSON () {\n    return this.map(c => c instanceof AbstractType ? c.toJSON() : c)\n  }\n\n  /**\n   * Returns an Array with the result of calling a provided function on every\n   * element of this YArray.\n   *\n   * @template M\n   * @param {function(T,number,YArray<T>):M} f Function that produces an element of the new Array\n   * @return {Array<M>} A new array with each element being the result of the\n   *                 callback function\n   */\n  map (f) {\n    return typeListMap(this, /** @type {any} */ (f))\n  }\n\n  /**\n   * Executes a provided function once on every element of this YArray.\n   *\n   * @param {function(T,number,YArray<T>):void} f A function to execute on every element of this YArray.\n   */\n  forEach (f) {\n    typeListForEach(this, f);\n  }\n\n  /**\n   * @return {IterableIterator<T>}\n   */\n  [Symbol.iterator] () {\n    return typeListCreateIterator(this)\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YArrayRefID);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n *\n * @private\n * @function\n */\nconst readYArray = _decoder => new YArray();\n\n/**\n * @module YMap\n */\n\n\n/**\n * @template T\n * @extends YEvent<YMap<T>>\n * Event that describes the changes on a YMap.\n */\nclass YMapEvent extends YEvent {\n  /**\n   * @param {YMap<T>} ymap The YArray that changed.\n   * @param {Transaction} transaction\n   * @param {Set<any>} subs The keys that changed.\n   */\n  constructor (ymap, transaction, subs) {\n    super(ymap, transaction);\n    this.keysChanged = subs;\n  }\n}\n\n/**\n * @template MapType\n * A shared Map implementation.\n *\n * @extends AbstractType<YMapEvent<MapType>>\n * @implements {Iterable<[string, MapType]>}\n */\nclass YMap extends AbstractType {\n  /**\n   *\n   * @param {Iterable<readonly [string, any]>=} entries - an optional iterable to initialize the YMap\n   */\n  constructor (entries) {\n    super();\n    /**\n     * @type {Map<string,any>?}\n     * @private\n     */\n    this._prelimContent = null;\n\n    if (entries === undefined) {\n      this._prelimContent = new Map();\n    } else {\n      this._prelimContent = new Map(entries);\n    }\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    ;/** @type {Map<string, any>} */ (this._prelimContent).forEach((value, key) => {\n      this.set(key, value);\n    });\n    this._prelimContent = null;\n  }\n\n  /**\n   * @return {YMap<MapType>}\n   */\n  _copy () {\n    return new YMap()\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YMap<MapType>}\n   */\n  clone () {\n    /**\n     * @type {YMap<MapType>}\n     */\n    const map = new YMap();\n    this.forEach((value, key) => {\n      map.set(key, value instanceof AbstractType ? /** @type {typeof value} */ (value.clone()) : value);\n    });\n    return map\n  }\n\n  /**\n   * Creates YMapEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    callTypeObservers(this, transaction, new YMapEvent(this, transaction, parentSubs));\n  }\n\n  /**\n   * Transforms this Shared Type to a JSON object.\n   *\n   * @return {Object<string,any>}\n   */\n  toJSON () {\n    this.doc ?? warnPrematureAccess();\n    /**\n     * @type {Object<string,MapType>}\n     */\n    const map = {};\n    this._map.forEach((item, key) => {\n      if (!item.deleted) {\n        const v = item.content.getContent()[item.length - 1];\n        map[key] = v instanceof AbstractType ? v.toJSON() : v;\n      }\n    });\n    return map\n  }\n\n  /**\n   * Returns the size of the YMap (count of key/value pairs)\n   *\n   * @return {number}\n   */\n  get size () {\n    return [...createMapIterator(this)].length\n  }\n\n  /**\n   * Returns the keys for each element in the YMap Type.\n   *\n   * @return {IterableIterator<string>}\n   */\n  keys () {\n    return iterator.iteratorMap(createMapIterator(this), /** @param {any} v */ v => v[0])\n  }\n\n  /**\n   * Returns the values for each element in the YMap Type.\n   *\n   * @return {IterableIterator<MapType>}\n   */\n  values () {\n    return iterator.iteratorMap(createMapIterator(this), /** @param {any} v */ v => v[1].content.getContent()[v[1].length - 1])\n  }\n\n  /**\n   * Returns an Iterator of [key, value] pairs\n   *\n   * @return {IterableIterator<[string, MapType]>}\n   */\n  entries () {\n    return iterator.iteratorMap(createMapIterator(this), /** @param {any} v */ v => /** @type {any} */ ([v[0], v[1].content.getContent()[v[1].length - 1]]))\n  }\n\n  /**\n   * Executes a provided function on once on every key-value pair.\n   *\n   * @param {function(MapType,string,YMap<MapType>):void} f A function to execute on every element of this YArray.\n   */\n  forEach (f) {\n    this.doc ?? warnPrematureAccess();\n    this._map.forEach((item, key) => {\n      if (!item.deleted) {\n        f(item.content.getContent()[item.length - 1], key, this);\n      }\n    });\n  }\n\n  /**\n   * Returns an Iterator of [key, value] pairs\n   *\n   * @return {IterableIterator<[string, MapType]>}\n   */\n  [Symbol.iterator] () {\n    return this.entries()\n  }\n\n  /**\n   * Remove a specified element from this YMap.\n   *\n   * @param {string} key The key of the element to remove.\n   */\n  delete (key) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapDelete(transaction, this, key);\n      });\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimContent).delete(key);\n    }\n  }\n\n  /**\n   * Adds or updates an element with a specified key and value.\n   * @template {MapType} VAL\n   *\n   * @param {string} key The key of the element to add to this YMap\n   * @param {VAL} value The value of the element to add\n   * @return {VAL}\n   */\n  set (key, value) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapSet(transaction, this, key, /** @type {any} */ (value));\n      });\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimContent).set(key, value);\n    }\n    return value\n  }\n\n  /**\n   * Returns a specified element from this YMap.\n   *\n   * @param {string} key\n   * @return {MapType|undefined}\n   */\n  get (key) {\n    return /** @type {any} */ (typeMapGet(this, key))\n  }\n\n  /**\n   * Returns a boolean indicating whether the specified key exists or not.\n   *\n   * @param {string} key The key to test.\n   * @return {boolean}\n   */\n  has (key) {\n    return typeMapHas(this, key)\n  }\n\n  /**\n   * Removes all elements from this YMap.\n   */\n  clear () {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        this.forEach(function (_value, key, map) {\n          typeMapDelete(transaction, map, key);\n        });\n      });\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimContent).clear();\n    }\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YMapRefID);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n *\n * @private\n * @function\n */\nconst readYMap = _decoder => new YMap();\n\n/**\n * @module YText\n */\n\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nconst equalAttrs = (a, b) => a === b || (typeof a === 'object' && typeof b === 'object' && a && b && object.equalFlat(a, b));\n\nclass ItemTextListPosition {\n  /**\n   * @param {Item|null} left\n   * @param {Item|null} right\n   * @param {number} index\n   * @param {Map<string,any>} currentAttributes\n   */\n  constructor (left, right, index, currentAttributes) {\n    this.left = left;\n    this.right = right;\n    this.index = index;\n    this.currentAttributes = currentAttributes;\n  }\n\n  /**\n   * Only call this if you know that this.right is defined\n   */\n  forward () {\n    if (this.right === null) {\n      error.unexpectedCase();\n    }\n    switch (this.right.content.constructor) {\n      case ContentFormat:\n        if (!this.right.deleted) {\n          updateCurrentAttributes(this.currentAttributes, /** @type {ContentFormat} */ (this.right.content));\n        }\n        break\n      default:\n        if (!this.right.deleted) {\n          this.index += this.right.length;\n        }\n        break\n    }\n    this.left = this.right;\n    this.right = this.right.right;\n  }\n}\n\n/**\n * @param {Transaction} transaction\n * @param {ItemTextListPosition} pos\n * @param {number} count steps to move forward\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst findNextPosition = (transaction, pos, count) => {\n  while (pos.right !== null && count > 0) {\n    switch (pos.right.content.constructor) {\n      case ContentFormat:\n        if (!pos.right.deleted) {\n          updateCurrentAttributes(pos.currentAttributes, /** @type {ContentFormat} */ (pos.right.content));\n        }\n        break\n      default:\n        if (!pos.right.deleted) {\n          if (count < pos.right.length) {\n            // split right\n            getItemCleanStart(transaction, createID(pos.right.id.client, pos.right.id.clock + count));\n          }\n          pos.index += pos.right.length;\n          count -= pos.right.length;\n        }\n        break\n    }\n    pos.left = pos.right;\n    pos.right = pos.right.right;\n    // pos.forward() - we don't forward because that would halve the performance because we already do the checks above\n  }\n  return pos\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {number} index\n * @param {boolean} useSearchMarker\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst findPosition = (transaction, parent, index, useSearchMarker) => {\n  const currentAttributes = new Map();\n  const marker = useSearchMarker ? findMarker(parent, index) : null;\n  if (marker) {\n    const pos = new ItemTextListPosition(marker.p.left, marker.p, marker.index, currentAttributes);\n    return findNextPosition(transaction, pos, index - marker.index)\n  } else {\n    const pos = new ItemTextListPosition(null, parent._start, 0, currentAttributes);\n    return findNextPosition(transaction, pos, index)\n  }\n};\n\n/**\n * Negate applied formats\n *\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {Map<string,any>} negatedAttributes\n *\n * @private\n * @function\n */\nconst insertNegatedAttributes = (transaction, parent, currPos, negatedAttributes) => {\n  // check if we really need to remove attributes\n  while (\n    currPos.right !== null && (\n      currPos.right.deleted === true || (\n        currPos.right.content.constructor === ContentFormat &&\n        equalAttrs(negatedAttributes.get(/** @type {ContentFormat} */ (currPos.right.content).key), /** @type {ContentFormat} */ (currPos.right.content).value)\n      )\n    )\n  ) {\n    if (!currPos.right.deleted) {\n      negatedAttributes.delete(/** @type {ContentFormat} */ (currPos.right.content).key);\n    }\n    currPos.forward();\n  }\n  const doc = transaction.doc;\n  const ownClientId = doc.clientID;\n  negatedAttributes.forEach((val, key) => {\n    const left = currPos.left;\n    const right = currPos.right;\n    const nextFormat = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val));\n    nextFormat.integrate(transaction, 0);\n    currPos.right = nextFormat;\n    currPos.forward();\n  });\n};\n\n/**\n * @param {Map<string,any>} currentAttributes\n * @param {ContentFormat} format\n *\n * @private\n * @function\n */\nconst updateCurrentAttributes = (currentAttributes, format) => {\n  const { key, value } = format;\n  if (value === null) {\n    currentAttributes.delete(key);\n  } else {\n    currentAttributes.set(key, value);\n  }\n};\n\n/**\n * @param {ItemTextListPosition} currPos\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n */\nconst minimizeAttributeChanges = (currPos, attributes) => {\n  // go right while attributes[right.key] === right.value (or right is deleted)\n  while (true) {\n    if (currPos.right === null) {\n      break\n    } else if (currPos.right.deleted || (currPos.right.content.constructor === ContentFormat && equalAttrs(attributes[(/** @type {ContentFormat} */ (currPos.right.content)).key] ?? null, /** @type {ContentFormat} */ (currPos.right.content).value))) ; else {\n      break\n    }\n    currPos.forward();\n  }\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {Object<string,any>} attributes\n * @return {Map<string,any>}\n *\n * @private\n * @function\n **/\nconst insertAttributes = (transaction, parent, currPos, attributes) => {\n  const doc = transaction.doc;\n  const ownClientId = doc.clientID;\n  const negatedAttributes = new Map();\n  // insert format-start items\n  for (const key in attributes) {\n    const val = attributes[key];\n    const currentVal = currPos.currentAttributes.get(key) ?? null;\n    if (!equalAttrs(currentVal, val)) {\n      // save negated attribute (set null if currentVal undefined)\n      negatedAttributes.set(key, currentVal);\n      const { left, right } = currPos;\n      currPos.right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val));\n      currPos.right.integrate(transaction, 0);\n      currPos.forward();\n    }\n  }\n  return negatedAttributes\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {string|object|AbstractType<any>} text\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n **/\nconst insertText = (transaction, parent, currPos, text, attributes) => {\n  currPos.currentAttributes.forEach((_val, key) => {\n    if (attributes[key] === undefined) {\n      attributes[key] = null;\n    }\n  });\n  const doc = transaction.doc;\n  const ownClientId = doc.clientID;\n  minimizeAttributeChanges(currPos, attributes);\n  const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes);\n  // insert content\n  const content = text.constructor === String ? new ContentString(/** @type {string} */ (text)) : (text instanceof AbstractType ? new ContentType(text) : new ContentEmbed(text));\n  let { left, right, index } = currPos;\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, currPos.index, content.getLength());\n  }\n  right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, content);\n  right.integrate(transaction, 0);\n  currPos.right = right;\n  currPos.index = index;\n  currPos.forward();\n  insertNegatedAttributes(transaction, parent, currPos, negatedAttributes);\n};\n\n/**\n * @param {Transaction} transaction\n * @param {AbstractType<any>} parent\n * @param {ItemTextListPosition} currPos\n * @param {number} length\n * @param {Object<string,any>} attributes\n *\n * @private\n * @function\n */\nconst formatText = (transaction, parent, currPos, length, attributes) => {\n  const doc = transaction.doc;\n  const ownClientId = doc.clientID;\n  minimizeAttributeChanges(currPos, attributes);\n  const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes);\n  // iterate until first non-format or null is found\n  // delete all formats with attributes[format.key] != null\n  // also check the attributes after the first non-format as we do not want to insert redundant negated attributes there\n  // eslint-disable-next-line no-labels\n  iterationLoop: while (\n    currPos.right !== null &&\n    (length > 0 ||\n      (\n        negatedAttributes.size > 0 &&\n        (currPos.right.deleted || currPos.right.content.constructor === ContentFormat)\n      )\n    )\n  ) {\n    if (!currPos.right.deleted) {\n      switch (currPos.right.content.constructor) {\n        case ContentFormat: {\n          const { key, value } = /** @type {ContentFormat} */ (currPos.right.content);\n          const attr = attributes[key];\n          if (attr !== undefined) {\n            if (equalAttrs(attr, value)) {\n              negatedAttributes.delete(key);\n            } else {\n              if (length === 0) {\n                // no need to further extend negatedAttributes\n                // eslint-disable-next-line no-labels\n                break iterationLoop\n              }\n              negatedAttributes.set(key, value);\n            }\n            currPos.right.delete(transaction);\n          } else {\n            currPos.currentAttributes.set(key, value);\n          }\n          break\n        }\n        default:\n          if (length < currPos.right.length) {\n            getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length));\n          }\n          length -= currPos.right.length;\n          break\n      }\n    }\n    currPos.forward();\n  }\n  // Quill just assumes that the editor starts with a newline and that it always\n  // ends with a newline. We only insert that newline when a new newline is\n  // inserted - i.e when length is bigger than type.length\n  if (length > 0) {\n    let newlines = '';\n    for (; length > 0; length--) {\n      newlines += '\\n';\n    }\n    currPos.right = new Item(createID(ownClientId, getState(doc.store, ownClientId)), currPos.left, currPos.left && currPos.left.lastId, currPos.right, currPos.right && currPos.right.id, parent, null, new ContentString(newlines));\n    currPos.right.integrate(transaction, 0);\n    currPos.forward();\n  }\n  insertNegatedAttributes(transaction, parent, currPos, negatedAttributes);\n};\n\n/**\n * Call this function after string content has been deleted in order to\n * clean up formatting Items.\n *\n * @param {Transaction} transaction\n * @param {Item} start\n * @param {Item|null} curr exclusive end, automatically iterates to the next Content Item\n * @param {Map<string,any>} startAttributes\n * @param {Map<string,any>} currAttributes\n * @return {number} The amount of formatting Items deleted.\n *\n * @function\n */\nconst cleanupFormattingGap = (transaction, start, curr, startAttributes, currAttributes) => {\n  /**\n   * @type {Item|null}\n   */\n  let end = start;\n  /**\n   * @type {Map<string,ContentFormat>}\n   */\n  const endFormats = map.create();\n  while (end && (!end.countable || end.deleted)) {\n    if (!end.deleted && end.content.constructor === ContentFormat) {\n      const cf = /** @type {ContentFormat} */ (end.content);\n      endFormats.set(cf.key, cf);\n    }\n    end = end.right;\n  }\n  let cleanups = 0;\n  let reachedCurr = false;\n  while (start !== end) {\n    if (curr === start) {\n      reachedCurr = true;\n    }\n    if (!start.deleted) {\n      const content = start.content;\n      switch (content.constructor) {\n        case ContentFormat: {\n          const { key, value } = /** @type {ContentFormat} */ (content);\n          const startAttrValue = startAttributes.get(key) ?? null;\n          if (endFormats.get(key) !== content || startAttrValue === value) {\n            // Either this format is overwritten or it is not necessary because the attribute already existed.\n            start.delete(transaction);\n            cleanups++;\n            if (!reachedCurr && (currAttributes.get(key) ?? null) === value && startAttrValue !== value) {\n              if (startAttrValue === null) {\n                currAttributes.delete(key);\n              } else {\n                currAttributes.set(key, startAttrValue);\n              }\n            }\n          }\n          if (!reachedCurr && !start.deleted) {\n            updateCurrentAttributes(currAttributes, /** @type {ContentFormat} */ (content));\n          }\n          break\n        }\n      }\n    }\n    start = /** @type {Item} */ (start.right);\n  }\n  return cleanups\n};\n\n/**\n * @param {Transaction} transaction\n * @param {Item | null} item\n */\nconst cleanupContextlessFormattingGap = (transaction, item) => {\n  // iterate until item.right is null or content\n  while (item && item.right && (item.right.deleted || !item.right.countable)) {\n    item = item.right;\n  }\n  const attrs = new Set();\n  // iterate back until a content item is found\n  while (item && (item.deleted || !item.countable)) {\n    if (!item.deleted && item.content.constructor === ContentFormat) {\n      const key = /** @type {ContentFormat} */ (item.content).key;\n      if (attrs.has(key)) {\n        item.delete(transaction);\n      } else {\n        attrs.add(key);\n      }\n    }\n    item = item.left;\n  }\n};\n\n/**\n * This function is experimental and subject to change / be removed.\n *\n * Ideally, we don't need this function at all. Formatting attributes should be cleaned up\n * automatically after each change. This function iterates twice over the complete YText type\n * and removes unnecessary formatting attributes. This is also helpful for testing.\n *\n * This function won't be exported anymore as soon as there is confidence that the YText type works as intended.\n *\n * @param {YText} type\n * @return {number} How many formatting attributes have been cleaned up.\n */\nconst cleanupYTextFormatting = type => {\n  let res = 0;\n  transact(/** @type {Doc} */ (type.doc), transaction => {\n    let start = /** @type {Item} */ (type._start);\n    let end = type._start;\n    let startAttributes = map.create();\n    const currentAttributes = map.copy(startAttributes);\n    while (end) {\n      if (end.deleted === false) {\n        switch (end.content.constructor) {\n          case ContentFormat:\n            updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (end.content));\n            break\n          default:\n            res += cleanupFormattingGap(transaction, start, end, startAttributes, currentAttributes);\n            startAttributes = map.copy(currentAttributes);\n            start = end;\n            break\n        }\n      }\n      end = end.right;\n    }\n  });\n  return res\n};\n\n/**\n * This will be called by the transaction once the event handlers are called to potentially cleanup\n * formatting attributes.\n *\n * @param {Transaction} transaction\n */\nconst cleanupYTextAfterTransaction = transaction => {\n  /**\n   * @type {Set<YText>}\n   */\n  const needFullCleanup = new Set();\n  // check if another formatting item was inserted\n  const doc = transaction.doc;\n  for (const [client, afterClock] of transaction.afterState.entries()) {\n    const clock = transaction.beforeState.get(client) || 0;\n    if (afterClock === clock) {\n      continue\n    }\n    iterateStructs(transaction, /** @type {Array<Item|GC>} */ (doc.store.clients.get(client)), clock, afterClock, item => {\n      if (\n        !item.deleted && /** @type {Item} */ (item).content.constructor === ContentFormat && item.constructor !== GC\n      ) {\n        needFullCleanup.add(/** @type {any} */ (item).parent);\n      }\n    });\n  }\n  // cleanup in a new transaction\n  transact(doc, (t) => {\n    iterateDeletedStructs(transaction, transaction.deleteSet, item => {\n      if (item instanceof GC || !(/** @type {YText} */ (item.parent)._hasFormatting) || needFullCleanup.has(/** @type {YText} */ (item.parent))) {\n        return\n      }\n      const parent = /** @type {YText} */ (item.parent);\n      if (item.content.constructor === ContentFormat) {\n        needFullCleanup.add(parent);\n      } else {\n        // If no formatting attribute was inserted or deleted, we can make due with contextless\n        // formatting cleanups.\n        // Contextless: it is not necessary to compute currentAttributes for the affected position.\n        cleanupContextlessFormattingGap(t, item);\n      }\n    });\n    // If a formatting item was inserted, we simply clean the whole type.\n    // We need to compute currentAttributes for the current position anyway.\n    for (const yText of needFullCleanup) {\n      cleanupYTextFormatting(yText);\n    }\n  });\n};\n\n/**\n * @param {Transaction} transaction\n * @param {ItemTextListPosition} currPos\n * @param {number} length\n * @return {ItemTextListPosition}\n *\n * @private\n * @function\n */\nconst deleteText = (transaction, currPos, length) => {\n  const startLength = length;\n  const startAttrs = map.copy(currPos.currentAttributes);\n  const start = currPos.right;\n  while (length > 0 && currPos.right !== null) {\n    if (currPos.right.deleted === false) {\n      switch (currPos.right.content.constructor) {\n        case ContentType:\n        case ContentEmbed:\n        case ContentString:\n          if (length < currPos.right.length) {\n            getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length));\n          }\n          length -= currPos.right.length;\n          currPos.right.delete(transaction);\n          break\n      }\n    }\n    currPos.forward();\n  }\n  if (start) {\n    cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes);\n  }\n  const parent = /** @type {AbstractType<any>} */ (/** @type {Item} */ (currPos.left || currPos.right).parent);\n  if (parent._searchMarker) {\n    updateMarkerChanges(parent._searchMarker, currPos.index, -startLength + length);\n  }\n  return currPos\n};\n\n/**\n * The Quill Delta format represents changes on a text document with\n * formatting information. For more information visit {@link https://quilljs.com/docs/delta/|Quill Delta}\n *\n * @example\n *   {\n *     ops: [\n *       { insert: 'Gandalf', attributes: { bold: true } },\n *       { insert: ' the ' },\n *       { insert: 'Grey', attributes: { color: '#cccccc' } }\n *     ]\n *   }\n *\n */\n\n/**\n  * Attributes that can be assigned to a selection of text.\n  *\n  * @example\n  *   {\n  *     bold: true,\n  *     font-size: '40px'\n  *   }\n  *\n  * @typedef {Object} TextAttributes\n  */\n\n/**\n * @extends YEvent<YText>\n * Event that describes the changes on a YText type.\n */\nclass YTextEvent extends YEvent {\n  /**\n   * @param {YText} ytext\n   * @param {Transaction} transaction\n   * @param {Set<any>} subs The keys that changed\n   */\n  constructor (ytext, transaction, subs) {\n    super(ytext, transaction);\n    /**\n     * Whether the children changed.\n     * @type {Boolean}\n     * @private\n     */\n    this.childListChanged = false;\n    /**\n     * Set of all changed attributes.\n     * @type {Set<string>}\n     */\n    this.keysChanged = new Set();\n    subs.forEach((sub) => {\n      if (sub === null) {\n        this.childListChanged = true;\n      } else {\n        this.keysChanged.add(sub);\n      }\n    });\n  }\n\n  /**\n   * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string, delete?:number, retain?:number}>}}\n   */\n  get changes () {\n    if (this._changes === null) {\n      /**\n       * @type {{added:Set<Item>,deleted:Set<Item>,keys:Map<string,{action:'add'|'update'|'delete',oldValue:any}>,delta:Array<{insert?:Array<any>|string|AbstractType<any>|object, delete?:number, retain?:number}>}}\n       */\n      const changes = {\n        keys: this.keys,\n        delta: this.delta,\n        added: new Set(),\n        deleted: new Set()\n      };\n      this._changes = changes;\n    }\n    return /** @type {any} */ (this._changes)\n  }\n\n  /**\n   * Compute the changes in the delta format.\n   * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document.\n   *\n   * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}\n   *\n   * @public\n   */\n  get delta () {\n    if (this._delta === null) {\n      const y = /** @type {Doc} */ (this.target.doc);\n      /**\n       * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}\n       */\n      const delta = [];\n      transact(y, transaction => {\n        const currentAttributes = new Map(); // saves all current attributes for insert\n        const oldAttributes = new Map();\n        let item = this.target._start;\n        /**\n         * @type {string?}\n         */\n        let action = null;\n        /**\n         * @type {Object<string,any>}\n         */\n        const attributes = {}; // counts added or removed new attributes for retain\n        /**\n         * @type {string|object}\n         */\n        let insert = '';\n        let retain = 0;\n        let deleteLen = 0;\n        const addOp = () => {\n          if (action !== null) {\n            /**\n             * @type {any}\n             */\n            let op = null;\n            switch (action) {\n              case 'delete':\n                if (deleteLen > 0) {\n                  op = { delete: deleteLen };\n                }\n                deleteLen = 0;\n                break\n              case 'insert':\n                if (typeof insert === 'object' || insert.length > 0) {\n                  op = { insert };\n                  if (currentAttributes.size > 0) {\n                    op.attributes = {};\n                    currentAttributes.forEach((value, key) => {\n                      if (value !== null) {\n                        op.attributes[key] = value;\n                      }\n                    });\n                  }\n                }\n                insert = '';\n                break\n              case 'retain':\n                if (retain > 0) {\n                  op = { retain };\n                  if (!object.isEmpty(attributes)) {\n                    op.attributes = object.assign({}, attributes);\n                  }\n                }\n                retain = 0;\n                break\n            }\n            if (op) delta.push(op);\n            action = null;\n          }\n        };\n        while (item !== null) {\n          switch (item.content.constructor) {\n            case ContentType:\n            case ContentEmbed:\n              if (this.adds(item)) {\n                if (!this.deletes(item)) {\n                  addOp();\n                  action = 'insert';\n                  insert = item.content.getContent()[0];\n                  addOp();\n                }\n              } else if (this.deletes(item)) {\n                if (action !== 'delete') {\n                  addOp();\n                  action = 'delete';\n                }\n                deleteLen += 1;\n              } else if (!item.deleted) {\n                if (action !== 'retain') {\n                  addOp();\n                  action = 'retain';\n                }\n                retain += 1;\n              }\n              break\n            case ContentString:\n              if (this.adds(item)) {\n                if (!this.deletes(item)) {\n                  if (action !== 'insert') {\n                    addOp();\n                    action = 'insert';\n                  }\n                  insert += /** @type {ContentString} */ (item.content).str;\n                }\n              } else if (this.deletes(item)) {\n                if (action !== 'delete') {\n                  addOp();\n                  action = 'delete';\n                }\n                deleteLen += item.length;\n              } else if (!item.deleted) {\n                if (action !== 'retain') {\n                  addOp();\n                  action = 'retain';\n                }\n                retain += item.length;\n              }\n              break\n            case ContentFormat: {\n              const { key, value } = /** @type {ContentFormat} */ (item.content);\n              if (this.adds(item)) {\n                if (!this.deletes(item)) {\n                  const curVal = currentAttributes.get(key) ?? null;\n                  if (!equalAttrs(curVal, value)) {\n                    if (action === 'retain') {\n                      addOp();\n                    }\n                    if (equalAttrs(value, (oldAttributes.get(key) ?? null))) {\n                      delete attributes[key];\n                    } else {\n                      attributes[key] = value;\n                    }\n                  } else if (value !== null) {\n                    item.delete(transaction);\n                  }\n                }\n              } else if (this.deletes(item)) {\n                oldAttributes.set(key, value);\n                const curVal = currentAttributes.get(key) ?? null;\n                if (!equalAttrs(curVal, value)) {\n                  if (action === 'retain') {\n                    addOp();\n                  }\n                  attributes[key] = curVal;\n                }\n              } else if (!item.deleted) {\n                oldAttributes.set(key, value);\n                const attr = attributes[key];\n                if (attr !== undefined) {\n                  if (!equalAttrs(attr, value)) {\n                    if (action === 'retain') {\n                      addOp();\n                    }\n                    if (value === null) {\n                      delete attributes[key];\n                    } else {\n                      attributes[key] = value;\n                    }\n                  } else if (attr !== null) { // this will be cleaned up automatically by the contextless cleanup function\n                    item.delete(transaction);\n                  }\n                }\n              }\n              if (!item.deleted) {\n                if (action === 'insert') {\n                  addOp();\n                }\n                updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (item.content));\n              }\n              break\n            }\n          }\n          item = item.right;\n        }\n        addOp();\n        while (delta.length > 0) {\n          const lastOp = delta[delta.length - 1];\n          if (lastOp.retain !== undefined && lastOp.attributes === undefined) {\n            // retain delta's if they don't assign attributes\n            delta.pop();\n          } else {\n            break\n          }\n        }\n      });\n      this._delta = delta;\n    }\n    return /** @type {any} */ (this._delta)\n  }\n}\n\n/**\n * Type that represents text with formatting information.\n *\n * This type replaces y-richtext as this implementation is able to handle\n * block formats (format information on a paragraph), embeds (complex elements\n * like pictures and videos), and text formats (**bold**, *italic*).\n *\n * @extends AbstractType<YTextEvent>\n */\nclass YText extends AbstractType {\n  /**\n   * @param {String} [string] The initial value of the YText.\n   */\n  constructor (string) {\n    super();\n    /**\n     * Array of pending operations on this type\n     * @type {Array<function():void>?}\n     */\n    this._pending = string !== undefined ? [() => this.insert(0, string)] : [];\n    /**\n     * @type {Array<ArraySearchMarker>|null}\n     */\n    this._searchMarker = [];\n    /**\n     * Whether this YText contains formatting attributes.\n     * This flag is updated when a formatting item is integrated (see ContentFormat.integrate)\n     */\n    this._hasFormatting = false;\n  }\n\n  /**\n   * Number of characters of this text type.\n   *\n   * @type {number}\n   */\n  get length () {\n    this.doc ?? warnPrematureAccess();\n    return this._length\n  }\n\n  /**\n   * @param {Doc} y\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item);\n    try {\n      /** @type {Array<function>} */ (this._pending).forEach(f => f());\n    } catch (e) {\n      console.error(e);\n    }\n    this._pending = null;\n  }\n\n  _copy () {\n    return new YText()\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YText}\n   */\n  clone () {\n    const text = new YText();\n    text.applyDelta(this.toDelta());\n    return text\n  }\n\n  /**\n   * Creates YTextEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    super._callObserver(transaction, parentSubs);\n    const event = new YTextEvent(this, transaction, parentSubs);\n    callTypeObservers(this, transaction, event);\n    // If a remote change happened, we try to cleanup potential formatting duplicates.\n    if (!transaction.local && this._hasFormatting) {\n      transaction._needFormattingCleanup = true;\n    }\n  }\n\n  /**\n   * Returns the unformatted string representation of this YText type.\n   *\n   * @public\n   */\n  toString () {\n    this.doc ?? warnPrematureAccess();\n    let str = '';\n    /**\n     * @type {Item|null}\n     */\n    let n = this._start;\n    while (n !== null) {\n      if (!n.deleted && n.countable && n.content.constructor === ContentString) {\n        str += /** @type {ContentString} */ (n.content).str;\n      }\n      n = n.right;\n    }\n    return str\n  }\n\n  /**\n   * Returns the unformatted string representation of this YText type.\n   *\n   * @return {string}\n   * @public\n   */\n  toJSON () {\n    return this.toString()\n  }\n\n  /**\n   * Apply a {@link Delta} on this shared YText type.\n   *\n   * @param {Array<any>} delta The changes to apply on this element.\n   * @param {object}  opts\n   * @param {boolean} [opts.sanitize] Sanitize input delta. Removes ending newlines if set to true.\n   *\n   *\n   * @public\n   */\n  applyDelta (delta, { sanitize = true } = {}) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        const currPos = new ItemTextListPosition(null, this._start, 0, new Map());\n        for (let i = 0; i < delta.length; i++) {\n          const op = delta[i];\n          if (op.insert !== undefined) {\n            // Quill assumes that the content starts with an empty paragraph.\n            // Yjs/Y.Text assumes that it starts empty. We always hide that\n            // there is a newline at the end of the content.\n            // If we omit this step, clients will see a different number of\n            // paragraphs, but nothing bad will happen.\n            const ins = (!sanitize && typeof op.insert === 'string' && i === delta.length - 1 && currPos.right === null && op.insert.slice(-1) === '\\n') ? op.insert.slice(0, -1) : op.insert;\n            if (typeof ins !== 'string' || ins.length > 0) {\n              insertText(transaction, this, currPos, ins, op.attributes || {});\n            }\n          } else if (op.retain !== undefined) {\n            formatText(transaction, this, currPos, op.retain, op.attributes || {});\n          } else if (op.delete !== undefined) {\n            deleteText(transaction, currPos, op.delete);\n          }\n        }\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.applyDelta(delta));\n    }\n  }\n\n  /**\n   * Returns the Delta representation of this YText type.\n   *\n   * @param {Snapshot} [snapshot]\n   * @param {Snapshot} [prevSnapshot]\n   * @param {function('removed' | 'added', ID):any} [computeYChange]\n   * @return {any} The Delta representation of this type.\n   *\n   * @public\n   */\n  toDelta (snapshot, prevSnapshot, computeYChange) {\n    this.doc ?? warnPrematureAccess();\n    /**\n     * @type{Array<any>}\n     */\n    const ops = [];\n    const currentAttributes = new Map();\n    const doc = /** @type {Doc} */ (this.doc);\n    let str = '';\n    let n = this._start;\n    function packStr () {\n      if (str.length > 0) {\n        // pack str with attributes to ops\n        /**\n         * @type {Object<string,any>}\n         */\n        const attributes = {};\n        let addAttributes = false;\n        currentAttributes.forEach((value, key) => {\n          addAttributes = true;\n          attributes[key] = value;\n        });\n        /**\n         * @type {Object<string,any>}\n         */\n        const op = { insert: str };\n        if (addAttributes) {\n          op.attributes = attributes;\n        }\n        ops.push(op);\n        str = '';\n      }\n    }\n    const computeDelta = () => {\n      while (n !== null) {\n        if (isVisible(n, snapshot) || (prevSnapshot !== undefined && isVisible(n, prevSnapshot))) {\n          switch (n.content.constructor) {\n            case ContentString: {\n              const cur = currentAttributes.get('ychange');\n              if (snapshot !== undefined && !isVisible(n, snapshot)) {\n                if (cur === undefined || cur.user !== n.id.client || cur.type !== 'removed') {\n                  packStr();\n                  currentAttributes.set('ychange', computeYChange ? computeYChange('removed', n.id) : { type: 'removed' });\n                }\n              } else if (prevSnapshot !== undefined && !isVisible(n, prevSnapshot)) {\n                if (cur === undefined || cur.user !== n.id.client || cur.type !== 'added') {\n                  packStr();\n                  currentAttributes.set('ychange', computeYChange ? computeYChange('added', n.id) : { type: 'added' });\n                }\n              } else if (cur !== undefined) {\n                packStr();\n                currentAttributes.delete('ychange');\n              }\n              str += /** @type {ContentString} */ (n.content).str;\n              break\n            }\n            case ContentType:\n            case ContentEmbed: {\n              packStr();\n              /**\n               * @type {Object<string,any>}\n               */\n              const op = {\n                insert: n.content.getContent()[0]\n              };\n              if (currentAttributes.size > 0) {\n                const attrs = /** @type {Object<string,any>} */ ({});\n                op.attributes = attrs;\n                currentAttributes.forEach((value, key) => {\n                  attrs[key] = value;\n                });\n              }\n              ops.push(op);\n              break\n            }\n            case ContentFormat:\n              if (isVisible(n, snapshot)) {\n                packStr();\n                updateCurrentAttributes(currentAttributes, /** @type {ContentFormat} */ (n.content));\n              }\n              break\n          }\n        }\n        n = n.right;\n      }\n      packStr();\n    };\n    if (snapshot || prevSnapshot) {\n      // snapshots are merged again after the transaction, so we need to keep the\n      // transaction alive until we are done\n      transact(doc, transaction => {\n        if (snapshot) {\n          splitSnapshotAffectedStructs(transaction, snapshot);\n        }\n        if (prevSnapshot) {\n          splitSnapshotAffectedStructs(transaction, prevSnapshot);\n        }\n        computeDelta();\n      }, 'cleanup');\n    } else {\n      computeDelta();\n    }\n    return ops\n  }\n\n  /**\n   * Insert text at a given index.\n   *\n   * @param {number} index The index at which to start inserting.\n   * @param {String} text The text to insert at the specified position.\n   * @param {TextAttributes} [attributes] Optionally define some formatting\n   *                                    information to apply on the inserted\n   *                                    Text.\n   * @public\n   */\n  insert (index, text, attributes) {\n    if (text.length <= 0) {\n      return\n    }\n    const y = this.doc;\n    if (y !== null) {\n      transact(y, transaction => {\n        const pos = findPosition(transaction, this, index, !attributes);\n        if (!attributes) {\n          attributes = {};\n          // @ts-ignore\n          pos.currentAttributes.forEach((v, k) => { attributes[k] = v; });\n        }\n        insertText(transaction, this, pos, text, attributes);\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.insert(index, text, attributes));\n    }\n  }\n\n  /**\n   * Inserts an embed at a index.\n   *\n   * @param {number} index The index to insert the embed at.\n   * @param {Object | AbstractType<any>} embed The Object that represents the embed.\n   * @param {TextAttributes} [attributes] Attribute information to apply on the\n   *                                    embed\n   *\n   * @public\n   */\n  insertEmbed (index, embed, attributes) {\n    const y = this.doc;\n    if (y !== null) {\n      transact(y, transaction => {\n        const pos = findPosition(transaction, this, index, !attributes);\n        insertText(transaction, this, pos, embed, attributes || {});\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.insertEmbed(index, embed, attributes || {}));\n    }\n  }\n\n  /**\n   * Deletes text starting from an index.\n   *\n   * @param {number} index Index at which to start deleting.\n   * @param {number} length The number of characters to remove. Defaults to 1.\n   *\n   * @public\n   */\n  delete (index, length) {\n    if (length === 0) {\n      return\n    }\n    const y = this.doc;\n    if (y !== null) {\n      transact(y, transaction => {\n        deleteText(transaction, findPosition(transaction, this, index, true), length);\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.delete(index, length));\n    }\n  }\n\n  /**\n   * Assigns properties to a range of text.\n   *\n   * @param {number} index The position where to start formatting.\n   * @param {number} length The amount of characters to assign properties to.\n   * @param {TextAttributes} attributes Attribute information to apply on the\n   *                                    text.\n   *\n   * @public\n   */\n  format (index, length, attributes) {\n    if (length === 0) {\n      return\n    }\n    const y = this.doc;\n    if (y !== null) {\n      transact(y, transaction => {\n        const pos = findPosition(transaction, this, index, false);\n        if (pos.right === null) {\n          return\n        }\n        formatText(transaction, this, pos, length, attributes);\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.format(index, length, attributes));\n    }\n  }\n\n  /**\n   * Removes an attribute.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @param {String} attributeName The attribute name that is to be removed.\n   *\n   * @public\n   */\n  removeAttribute (attributeName) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapDelete(transaction, this, attributeName);\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.removeAttribute(attributeName));\n    }\n  }\n\n  /**\n   * Sets or updates an attribute.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @param {String} attributeName The attribute name that is to be set.\n   * @param {any} attributeValue The attribute value that is to be set.\n   *\n   * @public\n   */\n  setAttribute (attributeName, attributeValue) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapSet(transaction, this, attributeName, attributeValue);\n      });\n    } else {\n      /** @type {Array<function>} */ (this._pending).push(() => this.setAttribute(attributeName, attributeValue));\n    }\n  }\n\n  /**\n   * Returns an attribute value that belongs to the attribute name.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @param {String} attributeName The attribute name that identifies the\n   *                               queried value.\n   * @return {any} The queried attribute value.\n   *\n   * @public\n   */\n  getAttribute (attributeName) {\n    return /** @type {any} */ (typeMapGet(this, attributeName))\n  }\n\n  /**\n   * Returns all attribute name/value pairs in a JSON Object.\n   *\n   * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.\n   *\n   * @return {Object<string, any>} A JSON Object that describes the attributes.\n   *\n   * @public\n   */\n  getAttributes () {\n    return typeMapGetAll(this)\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YTextRefID);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n * @return {YText}\n *\n * @private\n * @function\n */\nconst readYText = _decoder => new YText();\n\n/**\n * @module YXml\n */\n\n\n/**\n * Define the elements to which a set of CSS queries apply.\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors|CSS_Selectors}\n *\n * @example\n *   query = '.classSelector'\n *   query = 'nodeSelector'\n *   query = '#idSelector'\n *\n * @typedef {string} CSS_Selector\n */\n\n/**\n * Dom filter function.\n *\n * @callback domFilter\n * @param {string} nodeName The nodeName of the element\n * @param {Map} attributes The map of attributes.\n * @return {boolean} Whether to include the Dom node in the YXmlElement.\n */\n\n/**\n * Represents a subset of the nodes of a YXmlElement / YXmlFragment and a\n * position within them.\n *\n * Can be created with {@link YXmlFragment#createTreeWalker}\n *\n * @public\n * @implements {Iterable<YXmlElement|YXmlText|YXmlElement|YXmlHook>}\n */\nclass YXmlTreeWalker {\n  /**\n   * @param {YXmlFragment | YXmlElement} root\n   * @param {function(AbstractType<any>):boolean} [f]\n   */\n  constructor (root, f = () => true) {\n    this._filter = f;\n    this._root = root;\n    /**\n     * @type {Item}\n     */\n    this._currentNode = /** @type {Item} */ (root._start);\n    this._firstCall = true;\n    root.doc ?? warnPrematureAccess();\n  }\n\n  [Symbol.iterator] () {\n    return this\n  }\n\n  /**\n   * Get the next node.\n   *\n   * @return {IteratorResult<YXmlElement|YXmlText|YXmlHook>} The next node.\n   *\n   * @public\n   */\n  next () {\n    /**\n     * @type {Item|null}\n     */\n    let n = this._currentNode;\n    let type = n && n.content && /** @type {any} */ (n.content).type;\n    if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) { // if first call, we check if we can use the first item\n      do {\n        type = /** @type {any} */ (n.content).type;\n        if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) {\n          // walk down in the tree\n          n = type._start;\n        } else {\n          // walk right or up in the tree\n          while (n !== null) {\n            /**\n             * @type {Item | null}\n             */\n            const nxt = n.next;\n            if (nxt !== null) {\n              n = nxt;\n              break\n            } else if (n.parent === this._root) {\n              n = null;\n            } else {\n              n = /** @type {AbstractType<any>} */ (n.parent)._item;\n            }\n          }\n        }\n      } while (n !== null && (n.deleted || !this._filter(/** @type {ContentType} */ (n.content).type)))\n    }\n    this._firstCall = false;\n    if (n === null) {\n      // @ts-ignore\n      return { value: undefined, done: true }\n    }\n    this._currentNode = n;\n    return { value: /** @type {any} */ (n.content).type, done: false }\n  }\n}\n\n/**\n * Represents a list of {@link YXmlElement}.and {@link YXmlText} types.\n * A YxmlFragment is similar to a {@link YXmlElement}, but it does not have a\n * nodeName and it does not have attributes. Though it can be bound to a DOM\n * element - in this case the attributes and the nodeName are not shared.\n *\n * @public\n * @extends AbstractType<YXmlEvent>\n */\nclass YXmlFragment extends AbstractType {\n  constructor () {\n    super();\n    /**\n     * @type {Array<any>|null}\n     */\n    this._prelimContent = [];\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get firstChild () {\n    const first = this._first;\n    return first ? first.content.getContent()[0] : null\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item);\n    this.insert(0, /** @type {Array<any>} */ (this._prelimContent));\n    this._prelimContent = null;\n  }\n\n  _copy () {\n    return new YXmlFragment()\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YXmlFragment}\n   */\n  clone () {\n    const el = new YXmlFragment();\n    // @ts-ignore\n    el.insert(0, this.toArray().map(item => item instanceof AbstractType ? item.clone() : item));\n    return el\n  }\n\n  get length () {\n    this.doc ?? warnPrematureAccess();\n    return this._prelimContent === null ? this._length : this._prelimContent.length\n  }\n\n  /**\n   * Create a subtree of childNodes.\n   *\n   * @example\n   * const walker = elem.createTreeWalker(dom => dom.nodeName === 'div')\n   * for (let node in walker) {\n   *   // `node` is a div node\n   *   nop(node)\n   * }\n   *\n   * @param {function(AbstractType<any>):boolean} filter Function that is called on each child element and\n   *                          returns a Boolean indicating whether the child\n   *                          is to be included in the subtree.\n   * @return {YXmlTreeWalker} A subtree and a position within it.\n   *\n   * @public\n   */\n  createTreeWalker (filter) {\n    return new YXmlTreeWalker(this, filter)\n  }\n\n  /**\n   * Returns the first YXmlElement that matches the query.\n   * Similar to DOM's {@link querySelector}.\n   *\n   * Query support:\n   *   - tagname\n   * TODO:\n   *   - id\n   *   - attribute\n   *\n   * @param {CSS_Selector} query The query on the children.\n   * @return {YXmlElement|YXmlText|YXmlHook|null} The first element that matches the query or null.\n   *\n   * @public\n   */\n  querySelector (query) {\n    query = query.toUpperCase();\n    // @ts-ignore\n    const iterator = new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query);\n    const next = iterator.next();\n    if (next.done) {\n      return null\n    } else {\n      return next.value\n    }\n  }\n\n  /**\n   * Returns all YXmlElements that match the query.\n   * Similar to Dom's {@link querySelectorAll}.\n   *\n   * @todo Does not yet support all queries. Currently only query by tagName.\n   *\n   * @param {CSS_Selector} query The query on the children\n   * @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query.\n   *\n   * @public\n   */\n  querySelectorAll (query) {\n    query = query.toUpperCase();\n    // @ts-ignore\n    return array.from(new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query))\n  }\n\n  /**\n   * Creates YXmlEvent and calls observers.\n   *\n   * @param {Transaction} transaction\n   * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.\n   */\n  _callObserver (transaction, parentSubs) {\n    callTypeObservers(this, transaction, new YXmlEvent(this, parentSubs, transaction));\n  }\n\n  /**\n   * Get the string representation of all the children of this YXmlFragment.\n   *\n   * @return {string} The string representation of all children.\n   */\n  toString () {\n    return typeListMap(this, xml => xml.toString()).join('')\n  }\n\n  /**\n   * @return {string}\n   */\n  toJSON () {\n    return this.toString()\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlElement.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type.\n   * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks = {}, binding) {\n    const fragment = _document.createDocumentFragment();\n    if (binding !== undefined) {\n      binding._createAssociation(fragment, this);\n    }\n    typeListForEach(this, xmlType => {\n      fragment.insertBefore(xmlType.toDOM(_document, hooks, binding), null);\n    });\n    return fragment\n  }\n\n  /**\n   * Inserts new content at an index.\n   *\n   * @example\n   *  // Insert character 'a' at position 0\n   *  xml.insert(0, [new Y.XmlText('text')])\n   *\n   * @param {number} index The index to insert content at\n   * @param {Array<YXmlElement|YXmlText>} content The array of content\n   */\n  insert (index, content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListInsertGenerics(transaction, this, index, content);\n      });\n    } else {\n      // @ts-ignore _prelimContent is defined because this is not yet integrated\n      this._prelimContent.splice(index, 0, ...content);\n    }\n  }\n\n  /**\n   * Inserts new content at an index.\n   *\n   * @example\n   *  // Insert character 'a' at position 0\n   *  xml.insert(0, [new Y.XmlText('text')])\n   *\n   * @param {null|Item|YXmlElement|YXmlText} ref The index to insert content at\n   * @param {Array<YXmlElement|YXmlText>} content The array of content\n   */\n  insertAfter (ref, content) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        const refItem = (ref && ref instanceof AbstractType) ? ref._item : ref;\n        typeListInsertGenericsAfter(transaction, this, refItem, content);\n      });\n    } else {\n      const pc = /** @type {Array<any>} */ (this._prelimContent);\n      const index = ref === null ? 0 : pc.findIndex(el => el === ref) + 1;\n      if (index === 0 && ref !== null) {\n        throw error.create('Reference item not found')\n      }\n      pc.splice(index, 0, ...content);\n    }\n  }\n\n  /**\n   * Deletes elements starting from an index.\n   *\n   * @param {number} index Index at which to start deleting elements\n   * @param {number} [length=1] The number of elements to remove. Defaults to 1.\n   */\n  delete (index, length = 1) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeListDelete(transaction, this, index, length);\n      });\n    } else {\n      // @ts-ignore _prelimContent is defined because this is not yet integrated\n      this._prelimContent.splice(index, length);\n    }\n  }\n\n  /**\n   * Transforms this YArray to a JavaScript Array.\n   *\n   * @return {Array<YXmlElement|YXmlText|YXmlHook>}\n   */\n  toArray () {\n    return typeListToArray(this)\n  }\n\n  /**\n   * Appends content to this YArray.\n   *\n   * @param {Array<YXmlElement|YXmlText>} content Array of content to append.\n   */\n  push (content) {\n    this.insert(this.length, content);\n  }\n\n  /**\n   * Prepends content to this YArray.\n   *\n   * @param {Array<YXmlElement|YXmlText>} content Array of content to prepend.\n   */\n  unshift (content) {\n    this.insert(0, content);\n  }\n\n  /**\n   * Returns the i-th element from a YArray.\n   *\n   * @param {number} index The index of the element to return from the YArray\n   * @return {YXmlElement|YXmlText}\n   */\n  get (index) {\n    return typeListGet(this, index)\n  }\n\n  /**\n   * Returns a portion of this YXmlFragment into a JavaScript Array selected\n   * from start to end (end not included).\n   *\n   * @param {number} [start]\n   * @param {number} [end]\n   * @return {Array<YXmlElement|YXmlText>}\n   */\n  slice (start = 0, end = this.length) {\n    return typeListSlice(this, start, end)\n  }\n\n  /**\n   * Executes a provided function on once on every child element.\n   *\n   * @param {function(YXmlElement|YXmlText,number, typeof self):void} f A function to execute on every element of this YArray.\n   */\n  forEach (f) {\n    typeListForEach(this, f);\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlFragmentRefID);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} _decoder\n * @return {YXmlFragment}\n *\n * @private\n * @function\n */\nconst readYXmlFragment = _decoder => new YXmlFragment();\n\n/**\n * @typedef {Object|number|null|Array<any>|string|Uint8Array|AbstractType<any>} ValueTypes\n */\n\n/**\n * An YXmlElement imitates the behavior of a\n * https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element\n *\n * * An YXmlElement has attributes (key value pairs)\n * * An YXmlElement has childElements that must inherit from YXmlElement\n *\n * @template {{ [key: string]: ValueTypes }} [KV={ [key: string]: string }]\n */\nclass YXmlElement extends YXmlFragment {\n  constructor (nodeName = 'UNDEFINED') {\n    super();\n    this.nodeName = nodeName;\n    /**\n     * @type {Map<string, any>|null}\n     */\n    this._prelimAttrs = new Map();\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get nextSibling () {\n    const n = this._item ? this._item.next : null;\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get prevSibling () {\n    const n = this._item ? this._item.prev : null;\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  /**\n   * Integrate this type into the Yjs instance.\n   *\n   * * Save this struct in the os\n   * * This type is sent to other client\n   * * Observer functions are fired\n   *\n   * @param {Doc} y The Yjs instance\n   * @param {Item} item\n   */\n  _integrate (y, item) {\n    super._integrate(y, item)\n    ;(/** @type {Map<string, any>} */ (this._prelimAttrs)).forEach((value, key) => {\n      this.setAttribute(key, value);\n    });\n    this._prelimAttrs = null;\n  }\n\n  /**\n   * Creates an Item with the same effect as this Item (without position effect)\n   *\n   * @return {YXmlElement}\n   */\n  _copy () {\n    return new YXmlElement(this.nodeName)\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YXmlElement<KV>}\n   */\n  clone () {\n    /**\n     * @type {YXmlElement<KV>}\n     */\n    const el = new YXmlElement(this.nodeName);\n    const attrs = this.getAttributes();\n    object.forEach(attrs, (value, key) => {\n      el.setAttribute(key, /** @type {any} */ (value));\n    });\n    // @ts-ignore\n    el.insert(0, this.toArray().map(v => v instanceof AbstractType ? v.clone() : v));\n    return el\n  }\n\n  /**\n   * Returns the XML serialization of this YXmlElement.\n   * The attributes are ordered by attribute-name, so you can easily use this\n   * method to compare YXmlElements\n   *\n   * @return {string} The string representation of this type.\n   *\n   * @public\n   */\n  toString () {\n    const attrs = this.getAttributes();\n    const stringBuilder = [];\n    const keys = [];\n    for (const key in attrs) {\n      keys.push(key);\n    }\n    keys.sort();\n    const keysLen = keys.length;\n    for (let i = 0; i < keysLen; i++) {\n      const key = keys[i];\n      stringBuilder.push(key + '=\"' + attrs[key] + '\"');\n    }\n    const nodeName = this.nodeName.toLocaleLowerCase();\n    const attrsString = stringBuilder.length > 0 ? ' ' + stringBuilder.join(' ') : '';\n    return `<${nodeName}${attrsString}>${super.toString()}</${nodeName}>`\n  }\n\n  /**\n   * Removes an attribute from this YXmlElement.\n   *\n   * @param {string} attributeName The attribute name that is to be removed.\n   *\n   * @public\n   */\n  removeAttribute (attributeName) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapDelete(transaction, this, attributeName);\n      });\n    } else {\n      /** @type {Map<string,any>} */ (this._prelimAttrs).delete(attributeName);\n    }\n  }\n\n  /**\n   * Sets or updates an attribute.\n   *\n   * @template {keyof KV & string} KEY\n   *\n   * @param {KEY} attributeName The attribute name that is to be set.\n   * @param {KV[KEY]} attributeValue The attribute value that is to be set.\n   *\n   * @public\n   */\n  setAttribute (attributeName, attributeValue) {\n    if (this.doc !== null) {\n      transact(this.doc, transaction => {\n        typeMapSet(transaction, this, attributeName, attributeValue);\n      });\n    } else {\n      /** @type {Map<string, any>} */ (this._prelimAttrs).set(attributeName, attributeValue);\n    }\n  }\n\n  /**\n   * Returns an attribute value that belongs to the attribute name.\n   *\n   * @template {keyof KV & string} KEY\n   *\n   * @param {KEY} attributeName The attribute name that identifies the\n   *                               queried value.\n   * @return {KV[KEY]|undefined} The queried attribute value.\n   *\n   * @public\n   */\n  getAttribute (attributeName) {\n    return /** @type {any} */ (typeMapGet(this, attributeName))\n  }\n\n  /**\n   * Returns whether an attribute exists\n   *\n   * @param {string} attributeName The attribute name to check for existence.\n   * @return {boolean} whether the attribute exists.\n   *\n   * @public\n   */\n  hasAttribute (attributeName) {\n    return /** @type {any} */ (typeMapHas(this, attributeName))\n  }\n\n  /**\n   * Returns all attribute name/value pairs in a JSON Object.\n   *\n   * @param {Snapshot} [snapshot]\n   * @return {{ [Key in Extract<keyof KV,string>]?: KV[Key]}} A JSON Object that describes the attributes.\n   *\n   * @public\n   */\n  getAttributes (snapshot) {\n    return /** @type {any} */ (snapshot ? typeMapGetAllSnapshot(this, snapshot) : typeMapGetAll(this))\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlElement.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type.\n   * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks = {}, binding) {\n    const dom = _document.createElement(this.nodeName);\n    const attrs = this.getAttributes();\n    for (const key in attrs) {\n      const value = attrs[key];\n      if (typeof value === 'string') {\n        dom.setAttribute(key, value);\n      }\n    }\n    typeListForEach(this, yxml => {\n      dom.appendChild(yxml.toDOM(_document, hooks, binding));\n    });\n    if (binding !== undefined) {\n      binding._createAssociation(dom, this);\n    }\n    return dom\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlElementRefID);\n    encoder.writeKey(this.nodeName);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlElement}\n *\n * @function\n */\nconst readYXmlElement = decoder => new YXmlElement(decoder.readKey());\n\n/**\n * @extends YEvent<YXmlElement|YXmlText|YXmlFragment>\n * An Event that describes changes on a YXml Element or Yxml Fragment\n */\nclass YXmlEvent extends YEvent {\n  /**\n   * @param {YXmlElement|YXmlText|YXmlFragment} target The target on which the event is created.\n   * @param {Set<string|null>} subs The set of changed attributes. `null` is included if the\n   *                   child list changed.\n   * @param {Transaction} transaction The transaction instance with which the\n   *                                  change was created.\n   */\n  constructor (target, subs, transaction) {\n    super(target, transaction);\n    /**\n     * Whether the children changed.\n     * @type {Boolean}\n     * @private\n     */\n    this.childListChanged = false;\n    /**\n     * Set of all changed attributes.\n     * @type {Set<string>}\n     */\n    this.attributesChanged = new Set();\n    subs.forEach((sub) => {\n      if (sub === null) {\n        this.childListChanged = true;\n      } else {\n        this.attributesChanged.add(sub);\n      }\n    });\n  }\n}\n\n/**\n * You can manage binding to a custom type with YXmlHook.\n *\n * @extends {YMap<any>}\n */\nclass YXmlHook extends YMap {\n  /**\n   * @param {string} hookName nodeName of the Dom Node.\n   */\n  constructor (hookName) {\n    super();\n    /**\n     * @type {string}\n     */\n    this.hookName = hookName;\n  }\n\n  /**\n   * Creates an Item with the same effect as this Item (without position effect)\n   */\n  _copy () {\n    return new YXmlHook(this.hookName)\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YXmlHook}\n   */\n  clone () {\n    const el = new YXmlHook(this.hookName);\n    this.forEach((value, key) => {\n      el.set(key, value);\n    });\n    return el\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlElement.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object.<string, any>} [hooks] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type\n   * @return {Element} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks = {}, binding) {\n    const hook = hooks[this.hookName];\n    let dom;\n    if (hook !== undefined) {\n      dom = hook.createDom(this);\n    } else {\n      dom = document.createElement(this.hookName);\n    }\n    dom.setAttribute('data-yjs-hook', this.hookName);\n    if (binding !== undefined) {\n      binding._createAssociation(dom, this);\n    }\n    return dom\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlHookRefID);\n    encoder.writeKey(this.hookName);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlHook}\n *\n * @private\n * @function\n */\nconst readYXmlHook = decoder =>\n  new YXmlHook(decoder.readKey());\n\n/**\n * Represents text in a Dom Element. In the future this type will also handle\n * simple formatting information like bold and italic.\n */\nclass YXmlText extends YText {\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get nextSibling () {\n    const n = this._item ? this._item.next : null;\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  /**\n   * @type {YXmlElement|YXmlText|null}\n   */\n  get prevSibling () {\n    const n = this._item ? this._item.prev : null;\n    return n ? /** @type {YXmlElement|YXmlText} */ (/** @type {ContentType} */ (n.content).type) : null\n  }\n\n  _copy () {\n    return new YXmlText()\n  }\n\n  /**\n   * Makes a copy of this data type that can be included somewhere else.\n   *\n   * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.\n   *\n   * @return {YXmlText}\n   */\n  clone () {\n    const text = new YXmlText();\n    text.applyDelta(this.toDelta());\n    return text\n  }\n\n  /**\n   * Creates a Dom Element that mirrors this YXmlText.\n   *\n   * @param {Document} [_document=document] The document object (you must define\n   *                                        this when calling this method in\n   *                                        nodejs)\n   * @param {Object<string, any>} [hooks] Optional property to customize how hooks\n   *                                             are presented in the DOM\n   * @param {any} [binding] You should not set this property. This is\n   *                               used if DomBinding wants to create a\n   *                               association to the created DOM type.\n   * @return {Text} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}\n   *\n   * @public\n   */\n  toDOM (_document = document, hooks, binding) {\n    const dom = _document.createTextNode(this.toString());\n    if (binding !== undefined) {\n      binding._createAssociation(dom, this);\n    }\n    return dom\n  }\n\n  toString () {\n    // @ts-ignore\n    return this.toDelta().map(delta => {\n      const nestedNodes = [];\n      for (const nodeName in delta.attributes) {\n        const attrs = [];\n        for (const key in delta.attributes[nodeName]) {\n          attrs.push({ key, value: delta.attributes[nodeName][key] });\n        }\n        // sort attributes to get a unique order\n        attrs.sort((a, b) => a.key < b.key ? -1 : 1);\n        nestedNodes.push({ nodeName, attrs });\n      }\n      // sort node order to get a unique order\n      nestedNodes.sort((a, b) => a.nodeName < b.nodeName ? -1 : 1);\n      // now convert to dom string\n      let str = '';\n      for (let i = 0; i < nestedNodes.length; i++) {\n        const node = nestedNodes[i];\n        str += `<${node.nodeName}`;\n        for (let j = 0; j < node.attrs.length; j++) {\n          const attr = node.attrs[j];\n          str += ` ${attr.key}=\"${attr.value}\"`;\n        }\n        str += '>';\n      }\n      str += delta.insert;\n      for (let i = nestedNodes.length - 1; i >= 0; i--) {\n        str += `</${nestedNodes[i].nodeName}>`;\n      }\n      return str\n    }).join('')\n  }\n\n  /**\n   * @return {string}\n   */\n  toJSON () {\n    return this.toString()\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   */\n  _write (encoder) {\n    encoder.writeTypeRef(YXmlTextRefID);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {YXmlText}\n *\n * @private\n * @function\n */\nconst readYXmlText = decoder => new YXmlText();\n\nclass AbstractStruct {\n  /**\n   * @param {ID} id\n   * @param {number} length\n   */\n  constructor (id, length) {\n    this.id = id;\n    this.length = length;\n  }\n\n  /**\n   * @type {boolean}\n   */\n  get deleted () {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * Merge this struct with the item to the right.\n   * This method is already assuming that `this.id.clock + this.length === this.id.clock`.\n   * Also this method does *not* remove right from StructStore!\n   * @param {AbstractStruct} right\n   * @return {boolean} whether this merged with right\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   * @param {number} offset\n   * @param {number} encodingRef\n   */\n  write (encoder, offset, encodingRef) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    throw error.methodUnimplemented()\n  }\n}\n\nconst structGCRefNumber = 0;\n\n/**\n * @private\n */\nclass GC extends AbstractStruct {\n  get deleted () {\n    return true\n  }\n\n  delete () {}\n\n  /**\n   * @param {GC} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    if (this.constructor !== right.constructor) {\n      return false\n    }\n    this.length += right.length;\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    if (offset > 0) {\n      this.id.clock += offset;\n      this.length -= offset;\n    }\n    addStruct(transaction.doc.store, this);\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeInfo(structGCRefNumber);\n    encoder.writeLen(this.length - offset);\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {StructStore} store\n   * @return {null | number}\n   */\n  getMissing (transaction, store) {\n    return null\n  }\n}\n\nclass ContentBinary {\n  /**\n   * @param {Uint8Array} content\n   */\n  constructor (content) {\n    this.content = content;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.content]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentBinary}\n   */\n  copy () {\n    return new ContentBinary(this.content)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentBinary}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentBinary} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeBuf(this.content);\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 3\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder\n * @return {ContentBinary}\n */\nconst readContentBinary = decoder => new ContentBinary(decoder.readBuf());\n\nclass ContentDeleted {\n  /**\n   * @param {number} len\n   */\n  constructor (len) {\n    this.len = len;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.len\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return []\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return false\n  }\n\n  /**\n   * @return {ContentDeleted}\n   */\n  copy () {\n    return new ContentDeleted(this.len)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentDeleted}\n   */\n  splice (offset) {\n    const right = new ContentDeleted(this.len - offset);\n    this.len = offset;\n    return right\n  }\n\n  /**\n   * @param {ContentDeleted} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.len += right.len;\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {\n    addToDeleteSet(transaction.deleteSet, item.id.client, item.id.clock, this.len);\n    item.markDeleted();\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeLen(this.len - offset);\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 1\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2 } decoder\n * @return {ContentDeleted}\n */\nconst readContentDeleted = decoder => new ContentDeleted(decoder.readLen());\n\n/**\n * @param {string} guid\n * @param {Object<string, any>} opts\n */\nconst createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false });\n\n/**\n * @private\n */\nclass ContentDoc {\n  /**\n   * @param {Doc} doc\n   */\n  constructor (doc) {\n    if (doc._item) {\n      console.error('This document was already integrated as a sub-document. You should create a second instance instead with the same guid.');\n    }\n    /**\n     * @type {Doc}\n     */\n    this.doc = doc;\n    /**\n     * @type {any}\n     */\n    const opts = {};\n    this.opts = opts;\n    if (!doc.gc) {\n      opts.gc = false;\n    }\n    if (doc.autoLoad) {\n      opts.autoLoad = true;\n    }\n    if (doc.meta !== null) {\n      opts.meta = doc.meta;\n    }\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.doc]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentDoc}\n   */\n  copy () {\n    return new ContentDoc(createDocFromOpts(this.doc.guid, this.opts))\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentDoc}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentDoc} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {\n    // this needs to be reflected in doc.destroy as well\n    this.doc._item = item;\n    transaction.subdocsAdded.add(this.doc);\n    if (this.doc.shouldLoad) {\n      transaction.subdocsLoaded.add(this.doc);\n    }\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {\n    if (transaction.subdocsAdded.has(this.doc)) {\n      transaction.subdocsAdded.delete(this.doc);\n    } else {\n      transaction.subdocsRemoved.add(this.doc);\n    }\n  }\n\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) { }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeString(this.doc.guid);\n    encoder.writeAny(this.opts);\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 9\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentDoc}\n */\nconst readContentDoc = decoder => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny()));\n\n/**\n * @private\n */\nclass ContentEmbed {\n  /**\n   * @param {Object} embed\n   */\n  constructor (embed) {\n    this.embed = embed;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.embed]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentEmbed}\n   */\n  copy () {\n    return new ContentEmbed(this.embed)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentEmbed}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentEmbed} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeJSON(this.embed);\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 5\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentEmbed}\n */\nconst readContentEmbed = decoder => new ContentEmbed(decoder.readJSON());\n\n/**\n * @private\n */\nclass ContentFormat {\n  /**\n   * @param {string} key\n   * @param {Object} value\n   */\n  constructor (key, value) {\n    this.key = key;\n    this.value = value;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return []\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return false\n  }\n\n  /**\n   * @return {ContentFormat}\n   */\n  copy () {\n    return new ContentFormat(this.key, this.value)\n  }\n\n  /**\n   * @param {number} _offset\n   * @return {ContentFormat}\n   */\n  splice (_offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentFormat} _right\n   * @return {boolean}\n   */\n  mergeWith (_right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} _transaction\n   * @param {Item} item\n   */\n  integrate (_transaction, item) {\n    // @todo searchmarker are currently unsupported for rich text documents\n    const p = /** @type {YText} */ (item.parent);\n    p._searchMarker = null;\n    p._hasFormatting = true;\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeKey(this.key);\n    encoder.writeJSON(this.value);\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 6\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentFormat}\n */\nconst readContentFormat = decoder => new ContentFormat(decoder.readKey(), decoder.readJSON());\n\n/**\n * @private\n */\nclass ContentJSON {\n  /**\n   * @param {Array<any>} arr\n   */\n  constructor (arr) {\n    /**\n     * @type {Array<any>}\n     */\n    this.arr = arr;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.arr.length\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return this.arr\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentJSON}\n   */\n  copy () {\n    return new ContentJSON(this.arr)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentJSON}\n   */\n  splice (offset) {\n    const right = new ContentJSON(this.arr.slice(offset));\n    this.arr = this.arr.slice(0, offset);\n    return right\n  }\n\n  /**\n   * @param {ContentJSON} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.arr = this.arr.concat(right.arr);\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    const len = this.arr.length;\n    encoder.writeLen(len - offset);\n    for (let i = offset; i < len; i++) {\n      const c = this.arr[i];\n      encoder.writeString(c === undefined ? 'undefined' : JSON.stringify(c));\n    }\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 2\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentJSON}\n */\nconst readContentJSON = decoder => {\n  const len = decoder.readLen();\n  const cs = [];\n  for (let i = 0; i < len; i++) {\n    const c = decoder.readString();\n    if (c === 'undefined') {\n      cs.push(undefined);\n    } else {\n      cs.push(JSON.parse(c));\n    }\n  }\n  return new ContentJSON(cs)\n};\n\nconst isDevMode = env.getVariable('node_env') === 'development';\n\nclass ContentAny {\n  /**\n   * @param {Array<any>} arr\n   */\n  constructor (arr) {\n    /**\n     * @type {Array<any>}\n     */\n    this.arr = arr;\n    isDevMode && object.deepFreeze(arr);\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.arr.length\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return this.arr\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentAny}\n   */\n  copy () {\n    return new ContentAny(this.arr)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentAny}\n   */\n  splice (offset) {\n    const right = new ContentAny(this.arr.slice(offset));\n    this.arr = this.arr.slice(0, offset);\n    return right\n  }\n\n  /**\n   * @param {ContentAny} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.arr = this.arr.concat(right.arr);\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    const len = this.arr.length;\n    encoder.writeLen(len - offset);\n    for (let i = offset; i < len; i++) {\n      const c = this.arr[i];\n      encoder.writeAny(c);\n    }\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 8\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentAny}\n */\nconst readContentAny = decoder => {\n  const len = decoder.readLen();\n  const cs = [];\n  for (let i = 0; i < len; i++) {\n    cs.push(decoder.readAny());\n  }\n  return new ContentAny(cs)\n};\n\n/**\n * @private\n */\nclass ContentString {\n  /**\n   * @param {string} str\n   */\n  constructor (str) {\n    /**\n     * @type {string}\n     */\n    this.str = str;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return this.str.length\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return this.str.split('')\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentString}\n   */\n  copy () {\n    return new ContentString(this.str)\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentString}\n   */\n  splice (offset) {\n    const right = new ContentString(this.str.slice(offset));\n    this.str = this.str.slice(0, offset);\n\n    // Prevent encoding invalid documents because of splitting of surrogate pairs: https://github.com/yjs/yjs/issues/248\n    const firstCharCode = this.str.charCodeAt(offset - 1);\n    if (firstCharCode >= 0xD800 && firstCharCode <= 0xDBFF) {\n      // Last character of the left split is the start of a surrogate utf16/ucs2 pair.\n      // We don't support splitting of surrogate pairs because this may lead to invalid documents.\n      // Replace the invalid character with a unicode replacement character (� / U+FFFD)\n      this.str = this.str.slice(0, offset - 1) + '�';\n      // replace right as well\n      right.str = '�' + right.str.slice(1);\n    }\n    return right\n  }\n\n  /**\n   * @param {ContentString} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    this.str += right.str;\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {}\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {}\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {}\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeString(offset === 0 ? this.str : this.str.slice(offset));\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 4\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentString}\n */\nconst readContentString = decoder => new ContentString(decoder.readString());\n\n/**\n * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractType<any>>}\n * @private\n */\nconst typeRefs = [\n  readYArray,\n  readYMap,\n  readYText,\n  readYXmlElement,\n  readYXmlFragment,\n  readYXmlHook,\n  readYXmlText\n];\n\nconst YArrayRefID = 0;\nconst YMapRefID = 1;\nconst YTextRefID = 2;\nconst YXmlElementRefID = 3;\nconst YXmlFragmentRefID = 4;\nconst YXmlHookRefID = 5;\nconst YXmlTextRefID = 6;\n\n/**\n * @private\n */\nclass ContentType {\n  /**\n   * @param {AbstractType<any>} type\n   */\n  constructor (type) {\n    /**\n     * @type {AbstractType<any>}\n     */\n    this.type = type;\n  }\n\n  /**\n   * @return {number}\n   */\n  getLength () {\n    return 1\n  }\n\n  /**\n   * @return {Array<any>}\n   */\n  getContent () {\n    return [this.type]\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isCountable () {\n    return true\n  }\n\n  /**\n   * @return {ContentType}\n   */\n  copy () {\n    return new ContentType(this.type._copy())\n  }\n\n  /**\n   * @param {number} offset\n   * @return {ContentType}\n   */\n  splice (offset) {\n    throw error.methodUnimplemented()\n  }\n\n  /**\n   * @param {ContentType} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    return false\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {Item} item\n   */\n  integrate (transaction, item) {\n    this.type._integrate(transaction.doc, item);\n  }\n\n  /**\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {\n    let item = this.type._start;\n    while (item !== null) {\n      if (!item.deleted) {\n        item.delete(transaction);\n      } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {\n        // This will be gc'd later and we want to merge it if possible\n        // We try to merge all deleted items after each transaction,\n        // but we have no knowledge about that this needs to be merged\n        // since it is not in transaction.ds. Hence we add it to transaction._mergeStructs\n        transaction._mergeStructs.push(item);\n      }\n      item = item.right;\n    }\n    this.type._map.forEach(item => {\n      if (!item.deleted) {\n        item.delete(transaction);\n      } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {\n        // same as above\n        transaction._mergeStructs.push(item);\n      }\n    });\n    transaction.changed.delete(this.type);\n  }\n\n  /**\n   * @param {StructStore} store\n   */\n  gc (store) {\n    let item = this.type._start;\n    while (item !== null) {\n      item.gc(store, true);\n      item = item.right;\n    }\n    this.type._start = null;\n    this.type._map.forEach(/** @param {Item | null} item */ (item) => {\n      while (item !== null) {\n        item.gc(store, true);\n        item = item.left;\n      }\n    });\n    this.type._map = new Map();\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    this.type._write(encoder);\n  }\n\n  /**\n   * @return {number}\n   */\n  getRef () {\n    return 7\n  }\n}\n\n/**\n * @private\n *\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @return {ContentType}\n */\nconst readContentType = decoder => new ContentType(typeRefs[decoder.readTypeRef()](decoder));\n\n/**\n * @todo This should return several items\n *\n * @param {StructStore} store\n * @param {ID} id\n * @return {{item:Item, diff:number}}\n */\nconst followRedone = (store, id) => {\n  /**\n   * @type {ID|null}\n   */\n  let nextID = id;\n  let diff = 0;\n  let item;\n  do {\n    if (diff > 0) {\n      nextID = createID(nextID.client, nextID.clock + diff);\n    }\n    item = getItem(store, nextID);\n    diff = nextID.clock - item.id.clock;\n    nextID = item.redone;\n  } while (nextID !== null && item instanceof Item)\n  return {\n    item, diff\n  }\n};\n\n/**\n * Make sure that neither item nor any of its parents is ever deleted.\n *\n * This property does not persist when storing it into a database or when\n * sending it to other peers\n *\n * @param {Item|null} item\n * @param {boolean} keep\n */\nconst keepItem = (item, keep) => {\n  while (item !== null && item.keep !== keep) {\n    item.keep = keep;\n    item = /** @type {AbstractType<any>} */ (item.parent)._item;\n  }\n};\n\n/**\n * Split leftItem into two items\n * @param {Transaction} transaction\n * @param {Item} leftItem\n * @param {number} diff\n * @return {Item}\n *\n * @function\n * @private\n */\nconst splitItem = (transaction, leftItem, diff) => {\n  // create rightItem\n  const { client, clock } = leftItem.id;\n  const rightItem = new Item(\n    createID(client, clock + diff),\n    leftItem,\n    createID(client, clock + diff - 1),\n    leftItem.right,\n    leftItem.rightOrigin,\n    leftItem.parent,\n    leftItem.parentSub,\n    leftItem.content.splice(diff)\n  );\n  if (leftItem.deleted) {\n    rightItem.markDeleted();\n  }\n  if (leftItem.keep) {\n    rightItem.keep = true;\n  }\n  if (leftItem.redone !== null) {\n    rightItem.redone = createID(leftItem.redone.client, leftItem.redone.clock + diff);\n  }\n  // update left (do not set leftItem.rightOrigin as it will lead to problems when syncing)\n  leftItem.right = rightItem;\n  // update right\n  if (rightItem.right !== null) {\n    rightItem.right.left = rightItem;\n  }\n  // right is more specific.\n  transaction._mergeStructs.push(rightItem);\n  // update parent._map\n  if (rightItem.parentSub !== null && rightItem.right === null) {\n    /** @type {AbstractType<any>} */ (rightItem.parent)._map.set(rightItem.parentSub, rightItem);\n  }\n  leftItem.length = diff;\n  return rightItem\n};\n\n/**\n * @param {Array<StackItem>} stack\n * @param {ID} id\n */\nconst isDeletedByUndoStack = (stack, id) => array.some(stack, /** @param {StackItem} s */ s => isDeleted(s.deletions, id));\n\n/**\n * Redoes the effect of this operation.\n *\n * @param {Transaction} transaction The Yjs instance.\n * @param {Item} item\n * @param {Set<Item>} redoitems\n * @param {DeleteSet} itemsToDelete\n * @param {boolean} ignoreRemoteMapChanges\n * @param {import('../utils/UndoManager.js').UndoManager} um\n *\n * @return {Item|null}\n *\n * @private\n */\nconst redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) => {\n  const doc = transaction.doc;\n  const store = doc.store;\n  const ownClientID = doc.clientID;\n  const redone = item.redone;\n  if (redone !== null) {\n    return getItemCleanStart(transaction, redone)\n  }\n  let parentItem = /** @type {AbstractType<any>} */ (item.parent)._item;\n  /**\n   * @type {Item|null}\n   */\n  let left = null;\n  /**\n   * @type {Item|null}\n   */\n  let right;\n  // make sure that parent is redone\n  if (parentItem !== null && parentItem.deleted === true) {\n    // try to undo parent if it will be undone anyway\n    if (parentItem.redone === null && (!redoitems.has(parentItem) || redoItem(transaction, parentItem, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) === null)) {\n      return null\n    }\n    while (parentItem.redone !== null) {\n      parentItem = getItemCleanStart(transaction, parentItem.redone);\n    }\n  }\n  const parentType = parentItem === null ? /** @type {AbstractType<any>} */ (item.parent) : /** @type {ContentType} */ (parentItem.content).type;\n\n  if (item.parentSub === null) {\n    // Is an array item. Insert at the old position\n    left = item.left;\n    right = item;\n    // find next cloned_redo items\n    while (left !== null) {\n      /**\n       * @type {Item|null}\n       */\n      let leftTrace = left;\n      // trace redone until parent matches\n      while (leftTrace !== null && /** @type {AbstractType<any>} */ (leftTrace.parent)._item !== parentItem) {\n        leftTrace = leftTrace.redone === null ? null : getItemCleanStart(transaction, leftTrace.redone);\n      }\n      if (leftTrace !== null && /** @type {AbstractType<any>} */ (leftTrace.parent)._item === parentItem) {\n        left = leftTrace;\n        break\n      }\n      left = left.left;\n    }\n    while (right !== null) {\n      /**\n       * @type {Item|null}\n       */\n      let rightTrace = right;\n      // trace redone until parent matches\n      while (rightTrace !== null && /** @type {AbstractType<any>} */ (rightTrace.parent)._item !== parentItem) {\n        rightTrace = rightTrace.redone === null ? null : getItemCleanStart(transaction, rightTrace.redone);\n      }\n      if (rightTrace !== null && /** @type {AbstractType<any>} */ (rightTrace.parent)._item === parentItem) {\n        right = rightTrace;\n        break\n      }\n      right = right.right;\n    }\n  } else {\n    right = null;\n    if (item.right && !ignoreRemoteMapChanges) {\n      left = item;\n      // Iterate right while right is in itemsToDelete\n      // If it is intended to delete right while item is redone, we can expect that item should replace right.\n      while (left !== null && left.right !== null && (left.right.redone || isDeleted(itemsToDelete, left.right.id) || isDeletedByUndoStack(um.undoStack, left.right.id) || isDeletedByUndoStack(um.redoStack, left.right.id))) {\n        left = left.right;\n        // follow redone\n        while (left.redone) left = getItemCleanStart(transaction, left.redone);\n      }\n      if (left && left.right !== null) {\n        // It is not possible to redo this item because it conflicts with a\n        // change from another client\n        return null\n      }\n    } else {\n      left = parentType._map.get(item.parentSub) || null;\n    }\n    // drop cross-parent left so origin doesn't mislead the remote (#757)\n    if (left !== null && /** @type {AbstractType<any>} */ (left.parent)._item !== parentItem) {\n      left = parentType._map.get(item.parentSub) || null;\n    }\n  }\n  const nextClock = getState(store, ownClientID);\n  const nextId = createID(ownClientID, nextClock);\n  const redoneItem = new Item(\n    nextId,\n    left, left && left.lastId,\n    right, right && right.id,\n    parentType,\n    item.parentSub,\n    item.content.copy()\n  );\n  item.redone = nextId;\n  keepItem(redoneItem, true);\n  redoneItem.integrate(transaction, 0);\n  return redoneItem\n};\n\n/**\n * Abstract class that represents any content.\n */\nclass Item extends AbstractStruct {\n  /**\n   * @param {ID} id\n   * @param {Item | null} left\n   * @param {ID | null} origin\n   * @param {Item | null} right\n   * @param {ID | null} rightOrigin\n   * @param {AbstractType<any>|ID|null} parent Is a type if integrated, is null if it is possible to copy parent from left or right, is ID before integration to search for it.\n   * @param {string | null} parentSub\n   * @param {AbstractContent} content\n   */\n  constructor (id, left, origin, right, rightOrigin, parent, parentSub, content) {\n    super(id, content.getLength());\n    /**\n     * The item that was originally to the left of this item.\n     * @type {ID | null}\n     */\n    this.origin = origin;\n    /**\n     * The item that is currently to the left of this item.\n     * @type {Item | null}\n     */\n    this.left = left;\n    /**\n     * The item that is currently to the right of this item.\n     * @type {Item | null}\n     */\n    this.right = right;\n    /**\n     * The item that was originally to the right of this item.\n     * @type {ID | null}\n     */\n    this.rightOrigin = rightOrigin;\n    /**\n     * @type {AbstractType<any>|ID|null}\n     */\n    this.parent = parent;\n    /**\n     * If the parent refers to this item with some kind of key (e.g. YMap, the\n     * key is specified here. The key is then used to refer to the list in which\n     * to insert this item. If `parentSub = null` type._start is the list in\n     * which to insert to. Otherwise it is `parent._map`.\n     * @type {String | null}\n     */\n    this.parentSub = parentSub;\n    /**\n     * If this type's effect is redone this type refers to the type that undid\n     * this operation.\n     * @type {ID | null}\n     */\n    this.redone = null;\n    /**\n     * @type {AbstractContent}\n     */\n    this.content = content;\n    /**\n     * bit1: keep\n     * bit2: countable\n     * bit3: deleted\n     * bit4: mark - mark node as fast-search-marker\n     * @type {number} byte\n     */\n    this.info = this.content.isCountable() ? binary.BIT2 : 0;\n  }\n\n  /**\n   * This is used to mark the item as an indexed fast-search marker\n   *\n   * @type {boolean}\n   */\n  set marker (isMarked) {\n    if (((this.info & binary.BIT4) > 0) !== isMarked) {\n      this.info ^= binary.BIT4;\n    }\n  }\n\n  get marker () {\n    return (this.info & binary.BIT4) > 0\n  }\n\n  /**\n   * If true, do not garbage collect this Item.\n   */\n  get keep () {\n    return (this.info & binary.BIT1) > 0\n  }\n\n  set keep (doKeep) {\n    if (this.keep !== doKeep) {\n      this.info ^= binary.BIT1;\n    }\n  }\n\n  get countable () {\n    return (this.info & binary.BIT2) > 0\n  }\n\n  /**\n   * Whether this item was deleted or not.\n   * @type {Boolean}\n   */\n  get deleted () {\n    return (this.info & binary.BIT3) > 0\n  }\n\n  set deleted (doDelete) {\n    if (this.deleted !== doDelete) {\n      this.info ^= binary.BIT3;\n    }\n  }\n\n  markDeleted () {\n    this.info |= binary.BIT3;\n  }\n\n  /**\n   * Return the creator clientID of the missing op or define missing items and return null.\n   *\n   * @param {Transaction} transaction\n   * @param {StructStore} store\n   * @return {null | number}\n   */\n  getMissing (transaction, store) {\n    if (this.origin && this.origin.client !== this.id.client && this.origin.clock >= getState(store, this.origin.client)) {\n      return this.origin.client\n    }\n    if (this.rightOrigin && this.rightOrigin.client !== this.id.client && this.rightOrigin.clock >= getState(store, this.rightOrigin.client)) {\n      return this.rightOrigin.client\n    }\n    if (this.parent && this.parent.constructor === ID && this.id.client !== this.parent.client && this.parent.clock >= getState(store, this.parent.client)) {\n      return this.parent.client\n    }\n\n    // We have all missing ids, now find the items\n\n    if (this.origin) {\n      this.left = getItemCleanEnd(transaction, store, this.origin);\n      this.origin = this.left.lastId;\n    }\n    if (this.rightOrigin) {\n      this.right = getItemCleanStart(transaction, this.rightOrigin);\n      this.rightOrigin = this.right.id;\n    }\n    if ((this.left && this.left.constructor === GC) || (this.right && this.right.constructor === GC)) {\n      this.parent = null;\n    } else if (!this.parent) {\n      // only set parent if this shouldn't be garbage collected\n      if (this.left && this.left.constructor === Item) {\n        this.parent = this.left.parent;\n        this.parentSub = this.left.parentSub;\n      } else if (this.right && this.right.constructor === Item) {\n        this.parent = this.right.parent;\n        this.parentSub = this.right.parentSub;\n      }\n    } else if (this.parent.constructor === ID) {\n      const parentItem = getItem(store, this.parent);\n      if (parentItem.constructor === GC) {\n        this.parent = null;\n      } else {\n        this.parent = /** @type {ContentType} */ (parentItem.content).type;\n      }\n    }\n    return null\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    if (offset > 0) {\n      this.id.clock += offset;\n      this.left = getItemCleanEnd(transaction, transaction.doc.store, createID(this.id.client, this.id.clock - 1));\n      this.origin = this.left.lastId;\n      this.content = this.content.splice(offset);\n      this.length -= offset;\n    }\n\n    if (this.parent) {\n      if ((!this.left && (!this.right || this.right.left !== null)) || (this.left && this.left.right !== this.right)) {\n        /**\n         * @type {Item|null}\n         */\n        let left = this.left;\n\n        /**\n         * @type {Item|null}\n         */\n        let o;\n        // set o to the first conflicting item\n        if (left !== null) {\n          o = left.right;\n        } else if (this.parentSub !== null) {\n          o = /** @type {AbstractType<any>} */ (this.parent)._map.get(this.parentSub) || null;\n          while (o !== null && o.left !== null) {\n            o = o.left;\n          }\n        } else {\n          o = /** @type {AbstractType<any>} */ (this.parent)._start;\n        }\n        // TODO: use something like DeleteSet here (a tree implementation would be best)\n        // @todo use global set definitions\n        /**\n         * @type {Set<Item>}\n         */\n        const conflictingItems = new Set();\n        /**\n         * @type {Set<Item>}\n         */\n        const itemsBeforeOrigin = new Set();\n        // Let c in conflictingItems, b in itemsBeforeOrigin\n        // ***{origin}bbbb{this}{c,b}{c,b}{o}***\n        // Note that conflictingItems is a subset of itemsBeforeOrigin\n        while (o !== null && o !== this.right) {\n          itemsBeforeOrigin.add(o);\n          conflictingItems.add(o);\n          if (compareIDs(this.origin, o.origin)) {\n            // case 1\n            if (o.id.client < this.id.client) {\n              left = o;\n              conflictingItems.clear();\n            } else if (compareIDs(this.rightOrigin, o.rightOrigin)) {\n              // this and o are conflicting and point to the same integration points. The id decides which item comes first.\n              // Since this is to the left of o, we can break here\n              break\n            } // else, o might be integrated before an item that this conflicts with. If so, we will find it in the next iterations\n          } else if (o.origin !== null && itemsBeforeOrigin.has(getItem(transaction.doc.store, o.origin))) { // use getItem instead of getItemCleanEnd because we don't want / need to split items.\n            // case 2\n            if (!conflictingItems.has(getItem(transaction.doc.store, o.origin))) {\n              left = o;\n              conflictingItems.clear();\n            }\n          } else {\n            break\n          }\n          o = o.right;\n        }\n        this.left = left;\n      }\n      // reconnect left/right + update parent map/start if necessary\n      if (this.left !== null) {\n        const right = this.left.right;\n        this.right = right;\n        this.left.right = this;\n      } else {\n        let r;\n        if (this.parentSub !== null) {\n          r = /** @type {AbstractType<any>} */ (this.parent)._map.get(this.parentSub) || null;\n          while (r !== null && r.left !== null) {\n            r = r.left;\n          }\n        } else {\n          r = /** @type {AbstractType<any>} */ (this.parent)._start\n          ;/** @type {AbstractType<any>} */ (this.parent)._start = this;\n        }\n        this.right = r;\n      }\n      if (this.right !== null) {\n        this.right.left = this;\n      } else if (this.parentSub !== null) {\n        // set as current parent value if right === null and this is parentSub\n        /** @type {AbstractType<any>} */ (this.parent)._map.set(this.parentSub, this);\n        if (this.left !== null) {\n          // this is the current attribute value of parent. delete right\n          this.left.delete(transaction);\n        }\n      }\n      // adjust length of parent\n      if (this.parentSub === null && this.countable && !this.deleted) {\n        /** @type {AbstractType<any>} */ (this.parent)._length += this.length;\n      }\n      addStruct(transaction.doc.store, this);\n      this.content.integrate(transaction, this);\n      // add parent to transaction.changed\n      addChangedTypeToTransaction(transaction, /** @type {AbstractType<any>} */ (this.parent), this.parentSub);\n      if ((/** @type {AbstractType<any>} */ (this.parent)._item !== null && /** @type {AbstractType<any>} */ (this.parent)._item.deleted) || (this.parentSub !== null && this.right !== null)) {\n        // delete if parent is deleted or if this is not the current attribute value of parent\n        this.delete(transaction);\n      }\n    } else {\n      // parent is not defined. Integrate GC struct instead\n      new GC(this.id, this.length).integrate(transaction, 0);\n    }\n  }\n\n  /**\n   * Returns the next non-deleted item\n   */\n  get next () {\n    let n = this.right;\n    while (n !== null && n.deleted) {\n      n = n.right;\n    }\n    return n\n  }\n\n  /**\n   * Returns the previous non-deleted item\n   */\n  get prev () {\n    let n = this.left;\n    while (n !== null && n.deleted) {\n      n = n.left;\n    }\n    return n\n  }\n\n  /**\n   * Computes the last content address of this Item.\n   */\n  get lastId () {\n    // allocating ids is pretty costly because of the amount of ids created, so we try to reuse whenever possible\n    return this.length === 1 ? this.id : createID(this.id.client, this.id.clock + this.length - 1)\n  }\n\n  /**\n   * Try to merge two items\n   *\n   * @param {Item} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    if (\n      this.constructor === right.constructor &&\n      compareIDs(right.origin, this.lastId) &&\n      this.right === right &&\n      compareIDs(this.rightOrigin, right.rightOrigin) &&\n      this.id.client === right.id.client &&\n      this.id.clock + this.length === right.id.clock &&\n      this.deleted === right.deleted &&\n      this.redone === null &&\n      right.redone === null &&\n      this.content.constructor === right.content.constructor &&\n      this.content.mergeWith(right.content)\n    ) {\n      const searchMarker = /** @type {AbstractType<any>} */ (this.parent)._searchMarker;\n      if (searchMarker) {\n        searchMarker.forEach(marker => {\n          if (marker.p === right) {\n            // right is going to be \"forgotten\" so we need to update the marker\n            marker.p = this;\n            // adjust marker index\n            if (!this.deleted && this.countable) {\n              marker.index -= this.length;\n            }\n          }\n        });\n      }\n      if (right.keep) {\n        this.keep = true;\n      }\n      this.right = right.right;\n      if (this.right !== null) {\n        this.right.left = this;\n      }\n      this.length += right.length;\n      return true\n    }\n    return false\n  }\n\n  /**\n   * Mark this Item as deleted.\n   *\n   * @param {Transaction} transaction\n   */\n  delete (transaction) {\n    if (!this.deleted) {\n      const parent = /** @type {AbstractType<any>} */ (this.parent);\n      // adjust the length of parent\n      if (this.countable && this.parentSub === null) {\n        parent._length -= this.length;\n      }\n      this.markDeleted();\n      addToDeleteSet(transaction.deleteSet, this.id.client, this.id.clock, this.length);\n      addChangedTypeToTransaction(transaction, parent, this.parentSub);\n      this.content.delete(transaction);\n    }\n  }\n\n  /**\n   * @param {StructStore} store\n   * @param {boolean} parentGCd\n   */\n  gc (store, parentGCd) {\n    if (!this.deleted) {\n      throw error.unexpectedCase()\n    }\n    this.content.gc(store);\n    if (parentGCd) {\n      replaceStruct(store, this, new GC(this.id, this.length));\n    } else {\n      this.content = new ContentDeleted(this.length);\n    }\n  }\n\n  /**\n   * Transform the properties of this type to binary and write it to an\n   * BinaryEncoder.\n   *\n   * This is called when this Item is sent to a remote peer.\n   *\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    const origin = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin;\n    const rightOrigin = this.rightOrigin;\n    const parentSub = this.parentSub;\n    const info = (this.content.getRef() & binary.BITS5) |\n      (origin === null ? 0 : binary.BIT8) | // origin is defined\n      (rightOrigin === null ? 0 : binary.BIT7) | // right origin is defined\n      (parentSub === null ? 0 : binary.BIT6); // parentSub is non-null\n    encoder.writeInfo(info);\n    if (origin !== null) {\n      encoder.writeLeftID(origin);\n    }\n    if (rightOrigin !== null) {\n      encoder.writeRightID(rightOrigin);\n    }\n    if (origin === null && rightOrigin === null) {\n      const parent = /** @type {AbstractType<any>} */ (this.parent);\n      if (parent._item !== undefined) {\n        const parentItem = parent._item;\n        if (parentItem === null) {\n          // parent type on y._map\n          // find the correct key\n          const ykey = findRootTypeKey(parent);\n          encoder.writeParentInfo(true); // write parentYKey\n          encoder.writeString(ykey);\n        } else {\n          encoder.writeParentInfo(false); // write parent id\n          encoder.writeLeftID(parentItem.id);\n        }\n      } else if (parent.constructor === String) { // this edge case was added by differential updates\n        encoder.writeParentInfo(true); // write parentYKey\n        encoder.writeString(parent);\n      } else if (parent.constructor === ID) {\n        encoder.writeParentInfo(false); // write parent id\n        encoder.writeLeftID(parent);\n      } else {\n        error.unexpectedCase();\n      }\n      if (parentSub !== null) {\n        encoder.writeString(parentSub);\n      }\n    }\n    this.content.write(encoder, offset);\n  }\n}\n\n/**\n * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder\n * @param {number} info\n */\nconst readItemContent = (decoder, info) => contentRefs[info & binary.BITS5](decoder);\n\n/**\n * A lookup map for reading Item content.\n *\n * @type {Array<function(UpdateDecoderV1 | UpdateDecoderV2):AbstractContent>}\n */\nconst contentRefs = [\n  () => { error.unexpectedCase(); }, // GC is not ItemContent\n  readContentDeleted, // 1\n  readContentJSON, // 2\n  readContentBinary, // 3\n  readContentString, // 4\n  readContentEmbed, // 5\n  readContentFormat, // 6\n  readContentType, // 7\n  readContentAny, // 8\n  readContentDoc, // 9\n  () => { error.unexpectedCase(); } // 10 - Skip is not ItemContent\n];\n\nconst structSkipRefNumber = 10;\n\n/**\n * @private\n */\nclass Skip extends AbstractStruct {\n  get deleted () {\n    return true\n  }\n\n  delete () {}\n\n  /**\n   * @param {Skip} right\n   * @return {boolean}\n   */\n  mergeWith (right) {\n    if (this.constructor !== right.constructor) {\n      return false\n    }\n    this.length += right.length;\n    return true\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {number} offset\n   */\n  integrate (transaction, offset) {\n    // skip structs cannot be integrated\n    error.unexpectedCase();\n  }\n\n  /**\n   * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder\n   * @param {number} offset\n   */\n  write (encoder, offset) {\n    encoder.writeInfo(structSkipRefNumber);\n    // write as VarUint because Skips can't make use of predictable length-encoding\n    encoding.writeVarUint(encoder.restEncoder, this.length - offset);\n  }\n\n  /**\n   * @param {Transaction} transaction\n   * @param {StructStore} store\n   * @return {null | number}\n   */\n  getMissing (transaction, store) {\n    return null\n  }\n}\n\n/** eslint-env browser */\n\n\nconst glo = /** @type {any} */ (typeof globalThis !== 'undefined'\n  ? globalThis\n  : typeof window !== 'undefined'\n    ? window\n    // @ts-ignore\n    : typeof global !== 'undefined' ? global : {});\n\nconst importIdentifier = '__ $YJS$ __';\n\nif (glo[importIdentifier] === true) {\n  /**\n   * Dear reader of this message. Please take this seriously.\n   *\n   * If you see this message, make sure that you only import one version of Yjs. In many cases,\n   * your package manager installs two versions of Yjs that are used by different packages within your project.\n   * Another reason for this message is that some parts of your project use the commonjs version of Yjs\n   * and others use the EcmaScript version of Yjs.\n   *\n   * This often leads to issues that are hard to debug. We often need to perform constructor checks,\n   * e.g. `struct instanceof GC`. If you imported different versions of Yjs, it is impossible for us to\n   * do the constructor checks anymore - which might break the CRDT algorithm.\n   *\n   * https://github.com/yjs/yjs/issues/438\n   */\n  console.error('Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438');\n}\nglo[importIdentifier] = true;\n\nexport { AbsolutePosition, AbstractConnector, AbstractStruct, AbstractType, YArray as Array, ContentAny, ContentBinary, ContentDeleted, ContentDoc, ContentEmbed, ContentFormat, ContentJSON, ContentString, ContentType, Doc, GC, ID, Item, YMap as Map, PermanentUserData, RelativePosition, Skip, Snapshot, YText as Text, Transaction, UndoManager, UpdateDecoderV1, UpdateDecoderV2, UpdateEncoderV1, UpdateEncoderV2, YXmlElement as XmlElement, YXmlFragment as XmlFragment, YXmlHook as XmlHook, YXmlText as XmlText, YArrayEvent, YEvent, YMapEvent, YTextEvent, YXmlEvent, applyUpdate, applyUpdateV2, cleanupYTextFormatting, compareIDs, compareRelativePositions, convertUpdateFormatV1ToV2, convertUpdateFormatV2ToV1, createAbsolutePositionFromRelativePosition, createDeleteSet, createDeleteSetFromStructStore, createDocFromSnapshot, createID, createRelativePositionFromJSON, createRelativePositionFromTypeIndex, createSnapshot, decodeRelativePosition, decodeSnapshot, decodeSnapshotV2, decodeStateVector, decodeUpdate, decodeUpdateV2, diffUpdate, diffUpdateV2, emptySnapshot, encodeRelativePosition, encodeSnapshot, encodeSnapshotV2, encodeStateAsUpdate, encodeStateAsUpdateV2, encodeStateVector, encodeStateVectorFromUpdate, encodeStateVectorFromUpdateV2, equalDeleteSets, equalSnapshots, findIndexSS, findRootTypeKey, getItem, getItemCleanEnd, getItemCleanStart, getState, getTypeChildren, isDeleted, isParentOf, iterateDeletedStructs, logType, logUpdate, logUpdateV2, mergeDeleteSets, mergeUpdates, mergeUpdatesV2, obfuscateUpdate, obfuscateUpdateV2, parseUpdateMeta, parseUpdateMetaV2, readUpdate, readUpdateV2, relativePositionToJSON, snapshot, snapshotContainsUpdate, transact, tryGc, typeListToArraySnapshot, typeMapGetAllSnapshot, typeMapGetSnapshot };\n//# sourceMappingURL=yjs.mjs.map\n","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n  this.content = content;\n}\n\nOrderedMap.prototype = {\n  constructor: OrderedMap,\n\n  find: function(key) {\n    for (var i = 0; i < this.content.length; i += 2)\n      if (this.content[i] === key) return i\n    return -1\n  },\n\n  // :: (string) → ?any\n  // Retrieve the value stored under `key`, or return undefined when\n  // no such key exists.\n  get: function(key) {\n    var found = this.find(key);\n    return found == -1 ? undefined : this.content[found + 1]\n  },\n\n  // :: (string, any, ?string) → OrderedMap\n  // Create a new map by replacing the value of `key` with a new\n  // value, or adding a binding to the end of the map. If `newKey` is\n  // given, the key of the binding will be replaced with that key.\n  update: function(key, value, newKey) {\n    var self = newKey && newKey != key ? this.remove(newKey) : this;\n    var found = self.find(key), content = self.content.slice();\n    if (found == -1) {\n      content.push(newKey || key, value);\n    } else {\n      content[found + 1] = value;\n      if (newKey) content[found] = newKey;\n    }\n    return new OrderedMap(content)\n  },\n\n  // :: (string) → OrderedMap\n  // Return a map with the given key removed, if it existed.\n  remove: function(key) {\n    var found = this.find(key);\n    if (found == -1) return this\n    var content = this.content.slice();\n    content.splice(found, 2);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the start of the map.\n  addToStart: function(key, value) {\n    return new OrderedMap([key, value].concat(this.remove(key).content))\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the end of the map.\n  addToEnd: function(key, value) {\n    var content = this.remove(key).content.slice();\n    content.push(key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, string, any) → OrderedMap\n  // Add a key after the given key. If `place` is not found, the new\n  // key is added to the end.\n  addBefore: function(place, key, value) {\n    var without = this.remove(key), content = without.content.slice();\n    var found = without.find(place);\n    content.splice(found == -1 ? content.length : found, 0, key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: ((key: string, value: any))\n  // Call the given function for each key/value pair in the map, in\n  // order.\n  forEach: function(f) {\n    for (var i = 0; i < this.content.length; i += 2)\n      f(this.content[i], this.content[i + 1]);\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by prepending the keys in this map that don't\n  // appear in `map` before the keys in `map`.\n  prepend: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(map.content.concat(this.subtract(map).content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by appending the keys in this map that don't\n  // appear in `map` after the keys in `map`.\n  append: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(this.subtract(map).content.concat(map.content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a map containing all the keys in this map that don't\n  // appear in `map`.\n  subtract: function(map) {\n    var result = this;\n    map = OrderedMap.from(map);\n    for (var i = 0; i < map.content.length; i += 2)\n      result = result.remove(map.content[i]);\n    return result\n  },\n\n  // :: () → Object\n  // Turn ordered map into a plain object.\n  toObject: function() {\n    var result = {};\n    this.forEach(function(key, value) { result[key] = value; });\n    return result\n  },\n\n  // :: number\n  // The amount of keys in this map.\n  get size() {\n    return this.content.length >> 1\n  }\n};\n\n// :: (?union<Object, OrderedMap>) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n  if (value instanceof OrderedMap) return value\n  var content = [];\n  if (value) for (var prop in value) content.push(prop, value[prop]);\n  return new OrderedMap(content)\n};\n\nexport default OrderedMap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n    for (let i = 0;; i++) {\n        if (i == a.childCount || i == b.childCount)\n            return a.childCount == b.childCount ? null : pos;\n        let childA = a.child(i), childB = b.child(i);\n        if (childA == childB) {\n            pos += childA.nodeSize;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return pos;\n        if (childA.isText && childA.text != childB.text) {\n            let tA = childA.text, tB = childB.text, j = 0;\n            for (; tA[j] == tB[j]; j++)\n                pos++;\n            if (j && j < tA.length && j < tB.length && surrogateHigh(tA.charCodeAt(j - 1)) && surrogateLow(tA.charCodeAt(j)))\n                pos--;\n            return pos;\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffStart(childA.content, childB.content, pos + 1);\n            if (inner != null)\n                return inner;\n        }\n        pos += childA.nodeSize;\n    }\n}\nfunction findDiffEnd(a, b, posA, posB) {\n    for (let iA = a.childCount, iB = b.childCount;;) {\n        if (iA == 0 || iB == 0)\n            return iA == iB ? null : { a: posA, b: posB };\n        let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n        if (childA == childB) {\n            posA -= size;\n            posB -= size;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return { a: posA, b: posB };\n        if (childA.isText && childA.text != childB.text) {\n            let tA = childA.text, tB = childB.text, iA = tA.length, iB = tB.length;\n            while (iA > 0 && iB > 0 && tA[iA - 1] == tB[iB - 1]) {\n                iA--;\n                iB--;\n                posA--;\n                posB--;\n            }\n            if (iA && iB && iA < tA.length && surrogateHigh(tA.charCodeAt(iA - 1)) && surrogateLow(tA.charCodeAt(iA))) {\n                posA++;\n                posB++;\n            }\n            return { a: posA, b: posB };\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n            if (inner)\n                return inner;\n        }\n        posA -= size;\n        posB -= size;\n    }\n}\nfunction surrogateLow(ch) { return ch >= 0xDC00 && ch < 0xE000; }\nfunction surrogateHigh(ch) { return ch >= 0xD800 && ch < 0xDC00; }\n\n/**\nA fragment represents a node's collection of child nodes.\n\nLike nodes, fragments are persistent data structures, and you\nshould not mutate them or their content. Rather, you create new\ninstances whenever needed. The API tries to make this easy.\n*/\nclass Fragment {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The child nodes in this fragment.\n    */\n    content, size) {\n        this.content = content;\n        this.size = size || 0;\n        if (size == null)\n            for (let i = 0; i < content.length; i++)\n                this.size += content[i].nodeSize;\n    }\n    /**\n    Invoke a callback for all descendant nodes between the given two\n    positions (relative to start of this fragment). Doesn't descend\n    into a node when the callback returns `false`.\n    */\n    nodesBetween(from, to, f, nodeStart = 0, parent) {\n        for (let i = 0, pos = 0; pos < to; i++) {\n            let child = this.content[i], end = pos + child.nodeSize;\n            if (end > from && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) {\n                let start = pos + 1;\n                child.nodesBetween(Math.max(0, from - start), Math.min(child.content.size, to - start), f, nodeStart + start);\n            }\n            pos = end;\n        }\n    }\n    /**\n    Call the given callback for every descendant node. `pos` will be\n    relative to the start of the fragment. The callback may return\n    `false` to prevent traversal of a given node's children.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.size, f);\n    }\n    /**\n    Extract the text between `from` and `to`. See the same method on\n    [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        let text = \"\", first = true;\n        this.nodesBetween(from, to, (node, pos) => {\n            let nodeText = node.isText ? node.text.slice(Math.max(from, pos) - pos, to - pos)\n                : !node.isLeaf ? \"\"\n                    : leafText ? (typeof leafText === \"function\" ? leafText(node) : leafText)\n                        : node.type.spec.leafText ? node.type.spec.leafText(node)\n                            : \"\";\n            if (node.isBlock && (node.isLeaf && nodeText || node.isTextblock) && blockSeparator) {\n                if (first)\n                    first = false;\n                else\n                    text += blockSeparator;\n            }\n            text += nodeText;\n        }, 0);\n        return text;\n    }\n    /**\n    Create a new fragment containing the combined content of this\n    fragment and the other.\n    */\n    append(other) {\n        if (!other.size)\n            return this;\n        if (!this.size)\n            return other;\n        let last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n        if (last.isText && last.sameMarkup(first)) {\n            content[content.length - 1] = last.withText(last.text + first.text);\n            i = 1;\n        }\n        for (; i < other.content.length; i++)\n            content.push(other.content[i]);\n        return new Fragment(content, this.size + other.size);\n    }\n    /**\n    Cut out the sub-fragment between the two given positions.\n    */\n    cut(from, to = this.size) {\n        if (from == 0 && to == this.size)\n            return this;\n        let result = [], size = 0;\n        if (to > from)\n            for (let i = 0, pos = 0; pos < to; i++) {\n                let child = this.content[i], end = pos + child.nodeSize;\n                if (end > from) {\n                    if (pos < from || end > to) {\n                        if (child.isText)\n                            child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos));\n                        else\n                            child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1));\n                    }\n                    result.push(child);\n                    size += child.nodeSize;\n                }\n                pos = end;\n            }\n        return new Fragment(result, size);\n    }\n    /**\n    @internal\n    */\n    cutByIndex(from, to) {\n        if (from == to)\n            return Fragment.empty;\n        if (from == 0 && to == this.content.length)\n            return this;\n        return new Fragment(this.content.slice(from, to));\n    }\n    /**\n    Create a new fragment in which the node at the given index is\n    replaced by the given node.\n    */\n    replaceChild(index, node) {\n        let current = this.content[index];\n        if (current == node)\n            return this;\n        let copy = this.content.slice();\n        let size = this.size + node.nodeSize - current.nodeSize;\n        copy[index] = node;\n        return new Fragment(copy, size);\n    }\n    /**\n    Create a new fragment by prepending the given node to this\n    fragment.\n    */\n    addToStart(node) {\n        return new Fragment([node].concat(this.content), this.size + node.nodeSize);\n    }\n    /**\n    Create a new fragment by appending the given node to this\n    fragment.\n    */\n    addToEnd(node) {\n        return new Fragment(this.content.concat(node), this.size + node.nodeSize);\n    }\n    /**\n    Compare this fragment to another one.\n    */\n    eq(other) {\n        if (this.content.length != other.content.length)\n            return false;\n        for (let i = 0; i < this.content.length; i++)\n            if (!this.content[i].eq(other.content[i]))\n                return false;\n        return true;\n    }\n    /**\n    The first child of the fragment, or `null` if it is empty.\n    */\n    get firstChild() { return this.content.length ? this.content[0] : null; }\n    /**\n    The last child of the fragment, or `null` if it is empty.\n    */\n    get lastChild() { return this.content.length ? this.content[this.content.length - 1] : null; }\n    /**\n    The number of child nodes in this fragment.\n    */\n    get childCount() { return this.content.length; }\n    /**\n    Get the child node at the given index. Raise an error when the\n    index is out of range.\n    */\n    child(index) {\n        let found = this.content[index];\n        if (!found)\n            throw new RangeError(\"Index \" + index + \" out of range for \" + this);\n        return found;\n    }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) {\n        return this.content[index] || null;\n    }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) {\n        for (let i = 0, p = 0; i < this.content.length; i++) {\n            let child = this.content[i];\n            f(child, p, i);\n            p += child.nodeSize;\n        }\n    }\n    /**\n    Find the first position at which this fragment and another\n    fragment differ, or `null` if they are the same.\n    */\n    findDiffStart(other, pos = 0) {\n        return findDiffStart(this, other, pos);\n    }\n    /**\n    Find the first position, searching from the end, at which this\n    fragment and the given fragment differ, or `null` if they are\n    the same. Since this position will not be the same in both\n    nodes, an object with two separate positions is returned.\n    */\n    findDiffEnd(other, pos = this.size, otherPos = other.size) {\n        return findDiffEnd(this, other, pos, otherPos);\n    }\n    /**\n    Find the index and inner offset corresponding to a given relative\n    position in this fragment. The result object will be reused\n    (overwritten) the next time the function is called. @internal\n    */\n    findIndex(pos) {\n        if (pos == 0)\n            return retIndex(0, pos);\n        if (pos == this.size)\n            return retIndex(this.content.length, pos);\n        if (pos > this.size || pos < 0)\n            throw new RangeError(`Position ${pos} outside of fragment (${this})`);\n        for (let i = 0, curPos = 0;; i++) {\n            let cur = this.child(i), end = curPos + cur.nodeSize;\n            if (end >= pos) {\n                if (end == pos)\n                    return retIndex(i + 1, end);\n                return retIndex(i, curPos);\n            }\n            curPos = end;\n        }\n    }\n    /**\n    Return a debugging string that describes this fragment.\n    */\n    toString() { return \"<\" + this.toStringInner() + \">\"; }\n    /**\n    @internal\n    */\n    toStringInner() { return this.content.join(\", \"); }\n    /**\n    Create a JSON-serializeable representation of this fragment.\n    */\n    toJSON() {\n        return this.content.length ? this.content.map(n => n.toJSON()) : null;\n    }\n    /**\n    Deserialize a fragment from its JSON representation.\n    */\n    static fromJSON(schema, value) {\n        if (!value)\n            return Fragment.empty;\n        if (!Array.isArray(value))\n            throw new RangeError(\"Invalid input for Fragment.fromJSON\");\n        return Fragment.fromArray(value.map(schema.nodeFromJSON));\n    }\n    /**\n    Build a fragment from an array of nodes. Ensures that adjacent\n    text nodes with the same marks are joined together.\n    */\n    static fromArray(array) {\n        if (!array.length)\n            return Fragment.empty;\n        let joined, size = 0;\n        for (let i = 0; i < array.length; i++) {\n            let node = array[i];\n            size += node.nodeSize;\n            if (i && node.isText && array[i - 1].sameMarkup(node)) {\n                if (!joined)\n                    joined = array.slice(0, i);\n                joined[joined.length - 1] = node\n                    .withText(joined[joined.length - 1].text + node.text);\n            }\n            else if (joined) {\n                joined.push(node);\n            }\n        }\n        return new Fragment(joined || array, size);\n    }\n    /**\n    Create a fragment from something that can be interpreted as a\n    set of nodes. For `null`, it returns the empty fragment. For a\n    fragment, the fragment itself. For a node or array of nodes, a\n    fragment containing those nodes.\n    */\n    static from(nodes) {\n        if (!nodes)\n            return Fragment.empty;\n        if (nodes instanceof Fragment)\n            return nodes;\n        if (Array.isArray(nodes))\n            return this.fromArray(nodes);\n        if (nodes.attrs)\n            return new Fragment([nodes], nodes.nodeSize);\n        throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n            (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"));\n    }\n}\n/**\nAn empty fragment. Intended to be reused whenever a node doesn't\ncontain anything (rather than allocating a new empty fragment for\neach leaf node).\n*/\nFragment.empty = new Fragment([], 0);\nconst found = { index: 0, offset: 0 };\nfunction retIndex(index, offset) {\n    found.index = index;\n    found.offset = offset;\n    return found;\n}\n\nfunction compareDeep(a, b) {\n    if (a === b)\n        return true;\n    if (!(a && typeof a == \"object\") ||\n        !(b && typeof b == \"object\"))\n        return false;\n    let array = Array.isArray(a);\n    if (Array.isArray(b) != array)\n        return false;\n    if (array) {\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!compareDeep(a[i], b[i]))\n                return false;\n    }\n    else {\n        for (let p in a)\n            if (!(p in b) || !compareDeep(a[p], b[p]))\n                return false;\n        for (let p in b)\n            if (!(p in a))\n                return false;\n    }\n    return true;\n}\n\n/**\nA mark is a piece of information that can be attached to a node,\nsuch as it being emphasized, in code font, or a link. It has a\ntype and optionally a set of attributes that provide further\ninformation (such as the target of the link). Marks are created\nthrough a `Schema`, which controls which types exist and which\nattributes they have.\n*/\nclass Mark {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of this mark.\n    */\n    type, \n    /**\n    The attributes associated with this mark.\n    */\n    attrs) {\n        this.type = type;\n        this.attrs = attrs;\n    }\n    /**\n    Given a set of marks, create a new set which contains this one as\n    well, in the right position. If this mark is already in the set,\n    the set itself is returned. If any marks that are set to be\n    [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,\n    those are replaced by this one.\n    */\n    addToSet(set) {\n        let copy, placed = false;\n        for (let i = 0; i < set.length; i++) {\n            let other = set[i];\n            if (this.eq(other))\n                return set;\n            if (this.type.excludes(other.type)) {\n                if (!copy)\n                    copy = set.slice(0, i);\n            }\n            else if (other.type.excludes(this.type)) {\n                return set;\n            }\n            else {\n                if (!placed && other.type.rank > this.type.rank) {\n                    if (!copy)\n                        copy = set.slice(0, i);\n                    copy.push(this);\n                    placed = true;\n                }\n                if (copy)\n                    copy.push(other);\n            }\n        }\n        if (!copy)\n            copy = set.slice();\n        if (!placed)\n            copy.push(this);\n        return copy;\n    }\n    /**\n    Remove this mark from the given set, returning a new set. If this\n    mark is not in the set, the set itself is returned.\n    */\n    removeFromSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return set.slice(0, i).concat(set.slice(i + 1));\n        return set;\n    }\n    /**\n    Test whether this mark is in the given set of marks.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return true;\n        return false;\n    }\n    /**\n    Test whether this mark has the same type and attributes as\n    another mark.\n    */\n    eq(other) {\n        return this == other ||\n            (this.type == other.type && compareDeep(this.attrs, other.attrs));\n    }\n    /**\n    Convert this mark to a JSON-serializeable representation.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        return obj;\n    }\n    /**\n    Deserialize a mark from JSON.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Mark.fromJSON\");\n        let type = schema.marks[json.type];\n        if (!type)\n            throw new RangeError(`There is no mark type ${json.type} in this schema`);\n        let mark = type.create(json.attrs);\n        type.checkAttrs(mark.attrs);\n        return mark;\n    }\n    /**\n    Test whether two sets of marks are identical.\n    */\n    static sameSet(a, b) {\n        if (a == b)\n            return true;\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!a[i].eq(b[i]))\n                return false;\n        return true;\n    }\n    /**\n    Create a properly sorted mark set from null, a single mark, or an\n    unsorted array of marks.\n    */\n    static setFrom(marks) {\n        if (!marks || Array.isArray(marks) && marks.length == 0)\n            return Mark.none;\n        if (marks instanceof Mark)\n            return [marks];\n        let copy = marks.slice();\n        copy.sort((a, b) => a.type.rank - b.type.rank);\n        return copy;\n    }\n}\n/**\nThe empty set of marks.\n*/\nMark.none = [];\n\n/**\nError type raised by [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) when\ngiven an invalid replacement.\n*/\nclass ReplaceError extends Error {\n}\n/**\nA slice represents a piece cut out of a larger document. It\nstores not only a fragment, but also the depth up to which nodes on\nboth side are ‘open’ (cut through).\n*/\nclass Slice {\n    /**\n    Create a slice. When specifying a non-zero open depth, you must\n    make sure that there are nodes of at least that depth at the\n    appropriate side of the fragment—i.e. if the fragment is an\n    empty paragraph node, `openStart` and `openEnd` can't be greater\n    than 1.\n    \n    It is not necessary for the content of open nodes to conform to\n    the schema's content constraints, though it should be a valid\n    start/end/middle for such a node, depending on which sides are\n    open.\n    */\n    constructor(\n    /**\n    The slice's content.\n    */\n    content, \n    /**\n    The open depth at the start of the fragment.\n    */\n    openStart, \n    /**\n    The open depth at the end.\n    */\n    openEnd) {\n        this.content = content;\n        this.openStart = openStart;\n        this.openEnd = openEnd;\n    }\n    /**\n    The size this slice would add when inserted into a document.\n    */\n    get size() {\n        return this.content.size - this.openStart - this.openEnd;\n    }\n    /**\n    @internal\n    */\n    insertAt(pos, fragment) {\n        let content = insertInto(this.content, pos + this.openStart, fragment, this.openStart + 1, this.openEnd + 1);\n        return content && new Slice(content, this.openStart, this.openEnd);\n    }\n    /**\n    @internal\n    */\n    removeBetween(from, to) {\n        return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd);\n    }\n    /**\n    Tests whether this slice is equal to another slice.\n    */\n    eq(other) {\n        return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\";\n    }\n    /**\n    Convert a slice to a JSON-serializable representation.\n    */\n    toJSON() {\n        if (!this.content.size)\n            return null;\n        let json = { content: this.content.toJSON() };\n        if (this.openStart > 0)\n            json.openStart = this.openStart;\n        if (this.openEnd > 0)\n            json.openEnd = this.openEnd;\n        return json;\n    }\n    /**\n    Deserialize a slice from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            return Slice.empty;\n        let openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n        if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n            throw new RangeError(\"Invalid input for Slice.fromJSON\");\n        return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd);\n    }\n    /**\n    Create a slice from a fragment by taking the maximum possible\n    open value on both side of the fragment.\n    */\n    static maxOpen(fragment, openIsolating = true) {\n        let openStart = 0, openEnd = 0;\n        for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild)\n            openStart++;\n        for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild)\n            openEnd++;\n        return new Slice(fragment, openStart, openEnd);\n    }\n}\n/**\nThe empty slice.\n*/\nSlice.empty = new Slice(Fragment.empty, 0, 0);\nfunction removeRange(content, from, to) {\n    let { index, offset } = content.findIndex(from), child = content.maybeChild(index);\n    let { index: indexTo, offset: offsetTo } = content.findIndex(to);\n    if (offset == from || child.isText) {\n        if (offsetTo != to && !content.child(indexTo).isText)\n            throw new RangeError(\"Removing non-flat range\");\n        return content.cut(0, from).append(content.cut(to));\n    }\n    if (index != indexTo)\n        throw new RangeError(\"Removing non-flat range\");\n    return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)));\n}\nfunction insertInto(content, dist, insert, openStart, openEnd, parent) {\n    let { index, offset } = content.findIndex(dist), child = content.maybeChild(index);\n    if (offset == dist || child.isText) {\n        if (parent && openStart <= 0 && openEnd <= 0 && !parent.canReplace(index, index, insert))\n            return null;\n        return content.cut(0, dist).append(insert).append(content.cut(dist));\n    }\n    let inner = insertInto(child.content, dist - offset - 1, insert, index == 0 ? openStart - 1 : 0, index == content.childCount - 1 ? openEnd - 1 : 0, child);\n    return inner && content.replaceChild(index, child.copy(inner));\n}\nfunction replace($from, $to, slice) {\n    if (slice.openStart > $from.depth)\n        throw new ReplaceError(\"Inserted content deeper than insertion position\");\n    if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n        throw new ReplaceError(\"Inconsistent open depths\");\n    return replaceOuter($from, $to, slice, 0);\n}\nfunction replaceOuter($from, $to, slice, depth) {\n    let index = $from.index(depth), node = $from.node(depth);\n    if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n        let inner = replaceOuter($from, $to, slice, depth + 1);\n        return node.copy(node.content.replaceChild(index, inner));\n    }\n    else if (!slice.content.size) {\n        return close(node, replaceTwoWay($from, $to, depth));\n    }\n    else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n        let parent = $from.parent, content = parent.content;\n        return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)));\n    }\n    else {\n        let { start, end } = prepareSliceForReplace(slice, $from);\n        return close(node, replaceThreeWay($from, start, end, $to, depth));\n    }\n}\nfunction checkJoin(main, sub) {\n    if (!sub.type.compatibleContent(main.type))\n        throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name);\n}\nfunction joinable($before, $after, depth) {\n    let node = $before.node(depth);\n    checkJoin(node, $after.node(depth));\n    return node;\n}\nfunction addNode(child, target) {\n    let last = target.length - 1;\n    if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n        target[last] = child.withText(target[last].text + child.text);\n    else\n        target.push(child);\n}\nfunction addRange($start, $end, depth, target) {\n    let node = ($end || $start).node(depth);\n    let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n    if ($start) {\n        startIndex = $start.index(depth);\n        if ($start.depth > depth) {\n            startIndex++;\n        }\n        else if ($start.textOffset) {\n            addNode($start.nodeAfter, target);\n            startIndex++;\n        }\n    }\n    for (let i = startIndex; i < endIndex; i++)\n        addNode(node.child(i), target);\n    if ($end && $end.depth == depth && $end.textOffset)\n        addNode($end.nodeBefore, target);\n}\nfunction close(node, content) {\n    if (!node.type.validContent(content))\n        throw new ReplaceError(\"Invalid content for node \" + node.type.name);\n    return node.copy(content);\n}\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n    let openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n    let openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n    let content = [];\n    addRange(null, $from, depth, content);\n    if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n        checkJoin(openStart, openEnd);\n        addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n    }\n    else {\n        if (openStart)\n            addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content);\n        addRange($start, $end, depth, content);\n        if (openEnd)\n            addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction replaceTwoWay($from, $to, depth) {\n    let content = [];\n    addRange(null, $from, depth, content);\n    if ($from.depth > depth) {\n        let type = joinable($from, $to, depth + 1);\n        addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction prepareSliceForReplace(slice, $along) {\n    let extra = $along.depth - slice.openStart, parent = $along.node(extra);\n    let node = parent.copy(slice.content);\n    for (let i = extra - 1; i >= 0; i--)\n        node = $along.node(i).copy(Fragment.from(node));\n    return { start: node.resolveNoCache(slice.openStart + extra),\n        end: node.resolveNoCache(node.content.size - slice.openEnd - extra) };\n}\n\n/**\nYou can [_resolve_](https://prosemirror.net/docs/ref/#model.Node.resolve) a position to get more\ninformation about it. Objects of this class represent such a\nresolved position, providing various pieces of context\ninformation, and some helper methods.\n\nThroughout this interface, methods that take an optional `depth`\nparameter will interpret undefined as `this.depth` and negative\nnumbers as `this.depth + value`.\n*/\nclass ResolvedPos {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The position that was resolved.\n    */\n    pos, \n    /**\n    @internal\n    */\n    path, \n    /**\n    The offset this position has into its parent node.\n    */\n    parentOffset) {\n        this.pos = pos;\n        this.path = path;\n        this.parentOffset = parentOffset;\n        this.depth = path.length / 3 - 1;\n    }\n    /**\n    @internal\n    */\n    resolveDepth(val) {\n        if (val == null)\n            return this.depth;\n        if (val < 0)\n            return this.depth + val;\n        return val;\n    }\n    /**\n    The parent node that the position points into. Note that even if\n    a position points into a text node, that node is not considered\n    the parent—text nodes are ‘flat’ in this model, and have no content.\n    */\n    get parent() { return this.node(this.depth); }\n    /**\n    The root node in which the position was resolved.\n    */\n    get doc() { return this.node(0); }\n    /**\n    The ancestor node at the given level. `p.node(p.depth)` is the\n    same as `p.parent`.\n    */\n    node(depth) { return this.path[this.resolveDepth(depth) * 3]; }\n    /**\n    The index into the ancestor at the given level. If this points\n    at the 3rd node in the 2nd paragraph on the top level, for\n    example, `p.index(0)` is 1 and `p.index(1)` is 2.\n    */\n    index(depth) { return this.path[this.resolveDepth(depth) * 3 + 1]; }\n    /**\n    The index pointing after this position into the ancestor at the\n    given level.\n    */\n    indexAfter(depth) {\n        depth = this.resolveDepth(depth);\n        return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1);\n    }\n    /**\n    The (absolute) position at the start of the node at the given\n    level.\n    */\n    start(depth) {\n        depth = this.resolveDepth(depth);\n        return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n    }\n    /**\n    The (absolute) position at the end of the node at the given\n    level.\n    */\n    end(depth) {\n        depth = this.resolveDepth(depth);\n        return this.start(depth) + this.node(depth).content.size;\n    }\n    /**\n    The (absolute) position directly before the wrapping node at the\n    given level, or, when `depth` is `this.depth + 1`, the original\n    position.\n    */\n    before(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position before the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1];\n    }\n    /**\n    The (absolute) position directly after the wrapping node at the\n    given level, or the original position when `depth` is `this.depth + 1`.\n    */\n    after(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position after the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize;\n    }\n    /**\n    When this position points into a text node, this returns the\n    distance between the position and the start of the text node.\n    Will be zero for positions that point between nodes.\n    */\n    get textOffset() { return this.pos - this.path[this.path.length - 1]; }\n    /**\n    Get the node directly after the position, if any. If the position\n    points into a text node, only the part of that node after the\n    position is returned.\n    */\n    get nodeAfter() {\n        let parent = this.parent, index = this.index(this.depth);\n        if (index == parent.childCount)\n            return null;\n        let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n        return dOff ? parent.child(index).cut(dOff) : child;\n    }\n    /**\n    Get the node directly before the position, if any. If the\n    position points into a text node, only the part of that node\n    before the position is returned.\n    */\n    get nodeBefore() {\n        let index = this.index(this.depth);\n        let dOff = this.pos - this.path[this.path.length - 1];\n        if (dOff)\n            return this.parent.child(index).cut(0, dOff);\n        return index == 0 ? null : this.parent.child(index - 1);\n    }\n    /**\n    Get the position at the given index in the parent node at the\n    given depth (which defaults to `this.depth`).\n    */\n    posAtIndex(index, depth) {\n        depth = this.resolveDepth(depth);\n        let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n        for (let i = 0; i < index; i++)\n            pos += node.child(i).nodeSize;\n        return pos;\n    }\n    /**\n    Get the marks at this position, factoring in the surrounding\n    marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the\n    position is at the start of a non-empty node, the marks of the\n    node after it (if any) are returned.\n    */\n    marks() {\n        let parent = this.parent, index = this.index();\n        // In an empty parent, return the empty array\n        if (parent.content.size == 0)\n            return Mark.none;\n        // When inside a text node, just return the text node's marks\n        if (this.textOffset)\n            return parent.child(index).marks;\n        let main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n        // If the `after` flag is true of there is no node before, make\n        // the node after this position the main reference.\n        if (!main) {\n            let tmp = main;\n            main = other;\n            other = tmp;\n        }\n        // Use all marks in the main node, except those that have\n        // `inclusive` set to false and are not present in the other node.\n        let marks = main.marks;\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    Get the marks after the current position, if any, except those\n    that are non-inclusive and not present at position `$end`. This\n    is mostly useful for getting the set of marks to preserve after a\n    deletion. Will return `null` if this position is at the end of\n    its parent node or its parent node isn't a textblock (in which\n    case no marks should be preserved).\n    */\n    marksAcross($end) {\n        let after = this.parent.maybeChild(this.index());\n        if (!after || !after.isInline)\n            return null;\n        let marks = after.marks, next = $end.parent.maybeChild($end.index());\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    The depth up to which this position and the given (non-resolved)\n    position share the same parent nodes.\n    */\n    sharedDepth(pos) {\n        for (let depth = this.depth; depth > 0; depth--)\n            if (this.start(depth) <= pos && this.end(depth) >= pos)\n                return depth;\n        return 0;\n    }\n    /**\n    Returns a range based on the place where this position and the\n    given position diverge around block content. If both point into\n    the same textblock, for example, a range around that textblock\n    will be returned. If they point into different blocks, the range\n    around those blocks in their shared ancestor is returned. You can\n    pass in an optional predicate that will be called with a parent\n    node to see if a range into that parent is acceptable.\n    */\n    blockRange(other = this, pred) {\n        if (other.pos < this.pos)\n            return other.blockRange(this);\n        for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n            if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n                return new NodeRange(this, other, d);\n        return null;\n    }\n    /**\n    Query whether the given position shares the same parent node.\n    */\n    sameParent(other) {\n        return this.pos - this.parentOffset == other.pos - other.parentOffset;\n    }\n    /**\n    Return the greater of this and the given position.\n    */\n    max(other) {\n        return other.pos > this.pos ? other : this;\n    }\n    /**\n    Return the smaller of this and the given position.\n    */\n    min(other) {\n        return other.pos < this.pos ? other : this;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let str = \"\";\n        for (let i = 1; i <= this.depth; i++)\n            str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1);\n        return str + \":\" + this.parentOffset;\n    }\n    /**\n    @internal\n    */\n    static resolve(doc, pos) {\n        if (!(pos >= 0 && pos <= doc.content.size))\n            throw new RangeError(\"Position \" + pos + \" out of range\");\n        let path = [];\n        let start = 0, parentOffset = pos;\n        for (let node = doc;;) {\n            let { index, offset } = node.content.findIndex(parentOffset);\n            let rem = parentOffset - offset;\n            path.push(node, index, start + offset);\n            if (!rem)\n                break;\n            node = node.child(index);\n            if (node.isText)\n                break;\n            parentOffset = rem - 1;\n            start += offset + 1;\n        }\n        return new ResolvedPos(pos, path, parentOffset);\n    }\n    /**\n    @internal\n    */\n    static resolveCached(doc, pos) {\n        let cache = resolveCache.get(doc);\n        if (cache) {\n            for (let i = 0; i < cache.elts.length; i++) {\n                let elt = cache.elts[i];\n                if (elt.pos == pos)\n                    return elt;\n            }\n        }\n        else {\n            resolveCache.set(doc, cache = new ResolveCache);\n        }\n        let result = cache.elts[cache.i] = ResolvedPos.resolve(doc, pos);\n        cache.i = (cache.i + 1) % resolveCacheSize;\n        return result;\n    }\n}\nclass ResolveCache {\n    constructor() {\n        this.elts = [];\n        this.i = 0;\n    }\n}\nconst resolveCacheSize = 12, resolveCache = new WeakMap();\n/**\nRepresents a flat range of content, i.e. one that starts and\nends in the same node.\n*/\nclass NodeRange {\n    /**\n    Construct a node range. `$from` and `$to` should point into the\n    same node until at least the given `depth`, since a node range\n    denotes an adjacent set of nodes in a single parent node.\n    */\n    constructor(\n    /**\n    A resolved position along the start of the content. May have a\n    `depth` greater than this object's `depth` property, since\n    these are the positions that were used to compute the range,\n    not re-resolved positions directly at its boundaries.\n    */\n    $from, \n    /**\n    A position along the end of the content. See\n    caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).\n    */\n    $to, \n    /**\n    The depth of the node that this range points into.\n    */\n    depth) {\n        this.$from = $from;\n        this.$to = $to;\n        this.depth = depth;\n    }\n    /**\n    The position at the start of the range.\n    */\n    get start() { return this.$from.before(this.depth + 1); }\n    /**\n    The position at the end of the range.\n    */\n    get end() { return this.$to.after(this.depth + 1); }\n    /**\n    The parent node that the range points into.\n    */\n    get parent() { return this.$from.node(this.depth); }\n    /**\n    The start index of the range in the parent node.\n    */\n    get startIndex() { return this.$from.index(this.depth); }\n    /**\n    The end index of the range in the parent node.\n    */\n    get endIndex() { return this.$to.indexAfter(this.depth); }\n}\n\nconst emptyAttrs = Object.create(null);\n/**\nThis class represents a node in the tree that makes up a\nProseMirror document. So a document is an instance of `Node`, with\nchildren that are also instances of `Node`.\n\nNodes are persistent data structures. Instead of changing them, you\ncreate new ones with the content you want. Old ones keep pointing\nat the old document shape. This is made cheaper by sharing\nstructure between the old and new data as much as possible, which a\ntree shape like this (without back pointers) makes easy.\n\n**Do not** directly mutate the properties of a `Node` object. See\n[the guide](https://prosemirror.net/docs/guide/#doc) for more information.\n*/\nclass Node {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of node that this is.\n    */\n    type, \n    /**\n    An object mapping attribute names to values. The kind of\n    attributes allowed and required are\n    [determined](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) by the node type.\n    */\n    attrs, \n    // A fragment holding the node's children.\n    content, \n    /**\n    The marks (things like whether it is emphasized or part of a\n    link) applied to this node.\n    */\n    marks = Mark.none) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.content = content || Fragment.empty;\n    }\n    /**\n    The array of this node's child nodes.\n    */\n    get children() { return this.content.content; }\n    /**\n    The size of this node, as defined by the integer-based [indexing\n    scheme](https://prosemirror.net/docs/guide/#doc.indexing). For text nodes, this is the\n    amount of characters. For other leaf nodes, it is one. For\n    non-leaf nodes, it is the size of the content plus two (the\n    start and end token).\n    */\n    get nodeSize() { return this.isLeaf ? 1 : 2 + this.content.size; }\n    /**\n    The number of children that the node has.\n    */\n    get childCount() { return this.content.childCount; }\n    /**\n    Get the child node at the given index. Raises an error when the\n    index is out of range.\n    */\n    child(index) { return this.content.child(index); }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) { return this.content.maybeChild(index); }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) { this.content.forEach(f); }\n    /**\n    Invoke a callback for all descendant nodes recursively overlapping\n    the given two positions that are relative to start of this\n    node's content. This includes all ancestors of the nodes\n    containing the two positions. The callback is invoked with the\n    node, its position relative to the original node (method receiver),\n    its parent node, and its child index. When the callback returns\n    false for a given node, that node's children will not be\n    recursed over. The last parameter can be used to specify a\n    starting position to count from.\n    */\n    nodesBetween(from, to, f, startPos = 0) {\n        this.content.nodesBetween(from, to, f, startPos, this);\n    }\n    /**\n    Call the given callback for every descendant node. Doesn't\n    descend into a node when the callback returns `false`.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.content.size, f);\n    }\n    /**\n    Concatenates all the text nodes found in this fragment and its\n    children.\n    */\n    get textContent() {\n        return (this.isLeaf && this.type.spec.leafText)\n            ? this.type.spec.leafText(this)\n            : this.textBetween(0, this.content.size, \"\");\n    }\n    /**\n    Get all text between positions `from` and `to`. When\n    `blockSeparator` is given, it will be inserted to separate text\n    from different block nodes. If `leafText` is given, it'll be\n    inserted for every non-text leaf node encountered, otherwise\n    [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec.leafText) will be used.\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        return this.content.textBetween(from, to, blockSeparator, leafText);\n    }\n    /**\n    Returns this node's first child, or `null` if there are no\n    children.\n    */\n    get firstChild() { return this.content.firstChild; }\n    /**\n    Returns this node's last child, or `null` if there are no\n    children.\n    */\n    get lastChild() { return this.content.lastChild; }\n    /**\n    Test whether two nodes represent the same piece of document.\n    */\n    eq(other) {\n        return this == other || (this.sameMarkup(other) && this.content.eq(other.content));\n    }\n    /**\n    Compare the markup (type, attributes, and marks) of this node to\n    those of another. Returns `true` if both have the same markup.\n    */\n    sameMarkup(other) {\n        return this.hasMarkup(other.type, other.attrs, other.marks);\n    }\n    /**\n    Check whether this node's markup correspond to the given type,\n    attributes, and marks.\n    */\n    hasMarkup(type, attrs, marks) {\n        return this.type == type &&\n            compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n            Mark.sameSet(this.marks, marks || Mark.none);\n    }\n    /**\n    Create a new node with the same markup as this node, containing\n    the given content (or empty, if no content is given).\n    */\n    copy(content = null) {\n        if (content == this.content)\n            return this;\n        return new Node(this.type, this.attrs, content, this.marks);\n    }\n    /**\n    Create a copy of this node, with the given set of marks instead\n    of the node's own marks.\n    */\n    mark(marks) {\n        return marks == this.marks ? this : new Node(this.type, this.attrs, this.content, marks);\n    }\n    /**\n    Create a copy of this node with only the content between the\n    given positions. If `to` is not given, it defaults to the end of\n    the node.\n    */\n    cut(from, to = this.content.size) {\n        if (from == 0 && to == this.content.size)\n            return this;\n        return this.copy(this.content.cut(from, to));\n    }\n    /**\n    Cut out the part of the document between the given positions, and\n    return it as a `Slice` object.\n    */\n    slice(from, to = this.content.size, includeParents = false) {\n        if (from == to)\n            return Slice.empty;\n        let $from = this.resolve(from), $to = this.resolve(to);\n        let depth = includeParents ? 0 : $from.sharedDepth(to);\n        let start = $from.start(depth), node = $from.node(depth);\n        let content = node.content.cut($from.pos - start, $to.pos - start);\n        return new Slice(content, $from.depth - depth, $to.depth - depth);\n    }\n    /**\n    Replace the part of the document between the given positions with\n    the given slice. The slice must 'fit', meaning its open sides\n    must be able to connect to the surrounding content, and its\n    content nodes must be valid children for the node they are placed\n    into. If any of this is violated, an error of type\n    [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.\n    */\n    replace(from, to, slice) {\n        return replace(this.resolve(from), this.resolve(to), slice);\n    }\n    /**\n    Find the node directly after the given position.\n    */\n    nodeAt(pos) {\n        for (let node = this;;) {\n            let { index, offset } = node.content.findIndex(pos);\n            node = node.maybeChild(index);\n            if (!node)\n                return null;\n            if (offset == pos || node.isText)\n                return node;\n            pos -= offset + 1;\n        }\n    }\n    /**\n    Find the (direct) child node after the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childAfter(pos) {\n        let { index, offset } = this.content.findIndex(pos);\n        return { node: this.content.maybeChild(index), index, offset };\n    }\n    /**\n    Find the (direct) child node before the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childBefore(pos) {\n        if (pos == 0)\n            return { node: null, index: 0, offset: 0 };\n        let { index, offset } = this.content.findIndex(pos);\n        if (offset < pos)\n            return { node: this.content.child(index), index, offset };\n        let node = this.content.child(index - 1);\n        return { node, index: index - 1, offset: offset - node.nodeSize };\n    }\n    /**\n    Resolve the given position in the document, returning an\n    [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.\n    */\n    resolve(pos) { return ResolvedPos.resolveCached(this, pos); }\n    /**\n    @internal\n    */\n    resolveNoCache(pos) { return ResolvedPos.resolve(this, pos); }\n    /**\n    Test whether a given mark or mark type occurs in this document\n    between the two given positions.\n    */\n    rangeHasMark(from, to, type) {\n        let found = false;\n        if (to > from)\n            this.nodesBetween(from, to, node => {\n                if (type.isInSet(node.marks))\n                    found = true;\n                return !found;\n            });\n        return found;\n    }\n    /**\n    True when this is a block (non-inline node)\n    */\n    get isBlock() { return this.type.isBlock; }\n    /**\n    True when this is a textblock node, a block node with inline\n    content.\n    */\n    get isTextblock() { return this.type.isTextblock; }\n    /**\n    True when this node allows inline content.\n    */\n    get inlineContent() { return this.type.inlineContent; }\n    /**\n    True when this is an inline node (a text node or a node that can\n    appear among text).\n    */\n    get isInline() { return this.type.isInline; }\n    /**\n    True when this is a text node.\n    */\n    get isText() { return this.type.isText; }\n    /**\n    True when this is a leaf node.\n    */\n    get isLeaf() { return this.type.isLeaf; }\n    /**\n    True when this is an atom, i.e. when it does not have directly\n    editable content. This is usually the same as `isLeaf`, but can\n    be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)\n    on a node's spec (typically used when the node is displayed as\n    an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).\n    */\n    get isAtom() { return this.type.isAtom; }\n    /**\n    Return a string representation of this node for debugging\n    purposes.\n    */\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        let name = this.type.name;\n        if (this.content.size)\n            name += \"(\" + this.content.toStringInner() + \")\";\n        return wrapMarks(this.marks, name);\n    }\n    /**\n    Get the content match in this node at the given index.\n    */\n    contentMatchAt(index) {\n        let match = this.type.contentMatch.matchFragment(this.content, 0, index);\n        if (!match)\n            throw new Error(\"Called contentMatchAt on a node with invalid content\");\n        return match;\n    }\n    /**\n    Test whether replacing the range between `from` and `to` (by\n    child index) with the given replacement fragment (which defaults\n    to the empty fragment) would leave the node's content valid. You\n    can optionally pass `start` and `end` indices into the\n    replacement fragment.\n    */\n    canReplace(from, to, replacement = Fragment.empty, start = 0, end = replacement.childCount) {\n        let one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n        let two = one && one.matchFragment(this.content, to);\n        if (!two || !two.validEnd)\n            return false;\n        for (let i = start; i < end; i++)\n            if (!this.type.allowsMarks(replacement.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Test whether replacing the range `from` to `to` (by index) with\n    a node of the given type would leave the node's content valid.\n    */\n    canReplaceWith(from, to, type, marks) {\n        if (marks && !this.type.allowsMarks(marks))\n            return false;\n        let start = this.contentMatchAt(from).matchType(type);\n        let end = start && start.matchFragment(this.content, to);\n        return end ? end.validEnd : false;\n    }\n    /**\n    Test whether the given node's content could be appended to this\n    node. If that node is empty, this will only return true if there\n    is at least one node type that can appear in both nodes (to avoid\n    merging completely incompatible nodes).\n    */\n    canAppend(other) {\n        if (other.content.size)\n            return this.canReplace(this.childCount, this.childCount, other.content);\n        else\n            return this.type.compatibleContent(other.type);\n    }\n    /**\n    Check whether this node and its descendants conform to the\n    schema, and raise an exception when they do not.\n    */\n    check() {\n        this.type.checkContent(this.content);\n        this.type.checkAttrs(this.attrs);\n        let copy = Mark.none;\n        for (let i = 0; i < this.marks.length; i++) {\n            let mark = this.marks[i];\n            mark.type.checkAttrs(mark.attrs);\n            copy = mark.addToSet(copy);\n        }\n        if (!Mark.sameSet(copy, this.marks))\n            throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map(m => m.type.name)}`);\n        this.content.forEach(node => node.check());\n    }\n    /**\n    Return a JSON-serializeable representation of this node.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        if (this.content.size)\n            obj.content = this.content.toJSON();\n        if (this.marks.length)\n            obj.marks = this.marks.map(n => n.toJSON());\n        return obj;\n    }\n    /**\n    Deserialize a node from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Node.fromJSON\");\n        let marks = undefined;\n        if (json.marks) {\n            if (!Array.isArray(json.marks))\n                throw new RangeError(\"Invalid mark data for Node.fromJSON\");\n            marks = json.marks.map(schema.markFromJSON);\n        }\n        if (json.type == \"text\") {\n            if (typeof json.text != \"string\")\n                throw new RangeError(\"Invalid text node in JSON\");\n            return schema.text(json.text, marks);\n        }\n        let content = Fragment.fromJSON(schema, json.content);\n        let node = schema.nodeType(json.type).create(json.attrs, content, marks);\n        node.type.checkAttrs(node.attrs);\n        return node;\n    }\n}\nNode.prototype.text = undefined;\nclass TextNode extends Node {\n    /**\n    @internal\n    */\n    constructor(type, attrs, content, marks) {\n        super(type, attrs, null, marks);\n        if (!content)\n            throw new RangeError(\"Empty text nodes are not allowed\");\n        this.text = content;\n    }\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        return wrapMarks(this.marks, JSON.stringify(this.text));\n    }\n    get textContent() { return this.text; }\n    textBetween(from, to) { return this.text.slice(from, to); }\n    get nodeSize() { return this.text.length; }\n    mark(marks) {\n        return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks);\n    }\n    withText(text) {\n        if (text == this.text)\n            return this;\n        return new TextNode(this.type, this.attrs, text, this.marks);\n    }\n    cut(from = 0, to = this.text.length) {\n        if (from == 0 && to == this.text.length)\n            return this;\n        return this.withText(this.text.slice(from, to));\n    }\n    eq(other) {\n        return this.sameMarkup(other) && this.text == other.text;\n    }\n    toJSON() {\n        let base = super.toJSON();\n        base.text = this.text;\n        return base;\n    }\n}\nfunction wrapMarks(marks, str) {\n    for (let i = marks.length - 1; i >= 0; i--)\n        str = marks[i].type.name + \"(\" + str + \")\";\n    return str;\n}\n\n/**\nInstances of this class represent a match state of a node type's\n[content expression](https://prosemirror.net/docs/ref/#model.NodeSpec.content), and can be used to\nfind out whether further content matches here, and whether a given\nposition is a valid end of the node.\n*/\nclass ContentMatch {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    True when this match state represents a valid end of the node.\n    */\n    validEnd) {\n        this.validEnd = validEnd;\n        /**\n        @internal\n        */\n        this.next = [];\n        /**\n        @internal\n        */\n        this.wrapCache = [];\n    }\n    /**\n    @internal\n    */\n    static parse(string, nodeTypes) {\n        let stream = new TokenStream(string, nodeTypes);\n        if (stream.next == null)\n            return ContentMatch.empty;\n        let expr = parseExpr(stream);\n        if (stream.next)\n            stream.err(\"Unexpected trailing text\");\n        let match = dfa(nfa(expr));\n        checkForDeadEnds(match, stream);\n        return match;\n    }\n    /**\n    Match a node type, returning a match after that node if\n    successful.\n    */\n    matchType(type) {\n        for (let i = 0; i < this.next.length; i++)\n            if (this.next[i].type == type)\n                return this.next[i].next;\n        return null;\n    }\n    /**\n    Try to match a fragment. Returns the resulting match when\n    successful.\n    */\n    matchFragment(frag, start = 0, end = frag.childCount) {\n        let cur = this;\n        for (let i = start; cur && i < end; i++)\n            cur = cur.matchType(frag.child(i).type);\n        return cur;\n    }\n    /**\n    @internal\n    */\n    get inlineContent() {\n        return this.next.length != 0 && this.next[0].type.isInline;\n    }\n    /**\n    Get the first matching node type at this match position that can\n    be generated.\n    */\n    get defaultType() {\n        for (let i = 0; i < this.next.length; i++) {\n            let { type } = this.next[i];\n            if (!(type.isText || type.hasRequiredAttrs()))\n                return type;\n        }\n        return null;\n    }\n    /**\n    @internal\n    */\n    compatible(other) {\n        for (let i = 0; i < this.next.length; i++)\n            for (let j = 0; j < other.next.length; j++)\n                if (this.next[i].type == other.next[j].type)\n                    return true;\n        return false;\n    }\n    /**\n    Try to match the given fragment, and if that fails, see if it can\n    be made to match by inserting nodes in front of it. When\n    successful, return a fragment of inserted nodes (which may be\n    empty if nothing had to be inserted). When `toEnd` is true, only\n    return a fragment if the resulting match goes to the end of the\n    content expression.\n    */\n    fillBefore(after, toEnd = false, startIndex = 0) {\n        let seen = [this];\n        function search(match, types) {\n            let finished = match.matchFragment(after, startIndex);\n            if (finished && (!toEnd || finished.validEnd))\n                return Fragment.from(types.map(tp => tp.createAndFill()));\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n                    seen.push(next);\n                    let found = search(next, types.concat(type));\n                    if (found)\n                        return found;\n                }\n            }\n            return null;\n        }\n        return search(this, []);\n    }\n    /**\n    Find a set of wrapping node types that would allow a node of the\n    given type to appear at this position. The result may be empty\n    (when it fits directly) and will be null when no such wrapping\n    exists.\n    */\n    findWrapping(target) {\n        for (let i = 0; i < this.wrapCache.length; i += 2)\n            if (this.wrapCache[i] == target)\n                return this.wrapCache[i + 1];\n        let computed = this.computeWrapping(target);\n        this.wrapCache.push(target, computed);\n        return computed;\n    }\n    /**\n    @internal\n    */\n    computeWrapping(target) {\n        let seen = Object.create(null), active = [{ match: this, type: null, via: null }];\n        while (active.length) {\n            let current = active.shift(), match = current.match;\n            if (match.matchType(target)) {\n                let result = [];\n                for (let obj = current; obj.type; obj = obj.via)\n                    result.push(obj.type);\n                return result.reverse();\n            }\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) {\n                    active.push({ match: type.contentMatch, type, via: current });\n                    seen[type.name] = true;\n                }\n            }\n        }\n        return null;\n    }\n    /**\n    The number of outgoing edges this node has in the finite\n    automaton that describes the content expression.\n    */\n    get edgeCount() {\n        return this.next.length;\n    }\n    /**\n    Get the _n_​th outgoing edge from this node in the finite\n    automaton that describes the content expression.\n    */\n    edge(n) {\n        if (n >= this.next.length)\n            throw new RangeError(`There's no ${n}th edge in this content match`);\n        return this.next[n];\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let seen = [];\n        function scan(m) {\n            seen.push(m);\n            for (let i = 0; i < m.next.length; i++)\n                if (seen.indexOf(m.next[i].next) == -1)\n                    scan(m.next[i].next);\n        }\n        scan(this);\n        return seen.map((m, i) => {\n            let out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n            for (let i = 0; i < m.next.length; i++)\n                out += (i ? \", \" : \"\") + m.next[i].type.name + \"->\" + seen.indexOf(m.next[i].next);\n            return out;\n        }).join(\"\\n\");\n    }\n}\n/**\n@internal\n*/\nContentMatch.empty = new ContentMatch(true);\nclass TokenStream {\n    constructor(string, nodeTypes) {\n        this.string = string;\n        this.nodeTypes = nodeTypes;\n        this.inline = null;\n        this.pos = 0;\n        this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n        if (this.tokens[this.tokens.length - 1] == \"\")\n            this.tokens.pop();\n        if (this.tokens[0] == \"\")\n            this.tokens.shift();\n    }\n    get next() { return this.tokens[this.pos]; }\n    eat(tok) { return this.next == tok && (this.pos++ || true); }\n    err(str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\"); }\n}\nfunction parseExpr(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSeq(stream));\n    } while (stream.eat(\"|\"));\n    return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n}\nfunction parseExprSeq(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSubscript(stream));\n    } while (stream.next && stream.next != \")\" && stream.next != \"|\");\n    return exprs.length == 1 ? exprs[0] : { type: \"seq\", exprs };\n}\nfunction parseExprSubscript(stream) {\n    let expr = parseExprAtom(stream);\n    for (;;) {\n        if (stream.eat(\"+\"))\n            expr = { type: \"plus\", expr };\n        else if (stream.eat(\"*\"))\n            expr = { type: \"star\", expr };\n        else if (stream.eat(\"?\"))\n            expr = { type: \"opt\", expr };\n        else if (stream.eat(\"{\"))\n            expr = parseExprRange(stream, expr);\n        else\n            break;\n    }\n    return expr;\n}\nfunction parseNum(stream) {\n    if (/\\D/.test(stream.next))\n        stream.err(\"Expected number, got '\" + stream.next + \"'\");\n    let result = Number(stream.next);\n    stream.pos++;\n    return result;\n}\nfunction parseExprRange(stream, expr) {\n    let min = parseNum(stream), max = min;\n    if (stream.eat(\",\")) {\n        if (stream.next != \"}\")\n            max = parseNum(stream);\n        else\n            max = -1;\n    }\n    if (!stream.eat(\"}\"))\n        stream.err(\"Unclosed braced range\");\n    return { type: \"range\", min, max, expr };\n}\nfunction resolveName(stream, name) {\n    let types = stream.nodeTypes, type = types[name];\n    if (type)\n        return [type];\n    let result = [];\n    for (let typeName in types) {\n        let type = types[typeName];\n        if (type.isInGroup(name))\n            result.push(type);\n    }\n    if (result.length == 0)\n        stream.err(\"No node type or group '\" + name + \"' found\");\n    return result;\n}\nfunction parseExprAtom(stream) {\n    if (stream.eat(\"(\")) {\n        let expr = parseExpr(stream);\n        if (!stream.eat(\")\"))\n            stream.err(\"Missing closing paren\");\n        return expr;\n    }\n    else if (!/\\W/.test(stream.next)) {\n        let exprs = resolveName(stream, stream.next).map(type => {\n            if (stream.inline == null)\n                stream.inline = type.isInline;\n            else if (stream.inline != type.isInline)\n                stream.err(\"Mixing inline and block content\");\n            return { type: \"name\", value: type };\n        });\n        stream.pos++;\n        return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n    }\n    else {\n        stream.err(\"Unexpected token '\" + stream.next + \"'\");\n    }\n}\n// Construct an NFA from an expression as returned by the parser. The\n// NFA is represented as an array of states, which are themselves\n// arrays of edges, which are `{term, to}` objects. The first state is\n// the entry state and the last node is the success state.\n//\n// Note that unlike typical NFAs, the edge ordering in this one is\n// significant, in that it is used to contruct filler content when\n// necessary.\nfunction nfa(expr) {\n    let nfa = [[]];\n    connect(compile(expr, 0), node());\n    return nfa;\n    function node() { return nfa.push([]) - 1; }\n    function edge(from, to, term) {\n        let edge = { term, to };\n        nfa[from].push(edge);\n        return edge;\n    }\n    function connect(edges, to) {\n        edges.forEach(edge => edge.to = to);\n    }\n    function compile(expr, from) {\n        if (expr.type == \"choice\") {\n            return expr.exprs.reduce((out, expr) => out.concat(compile(expr, from)), []);\n        }\n        else if (expr.type == \"seq\") {\n            for (let i = 0;; i++) {\n                let next = compile(expr.exprs[i], from);\n                if (i == expr.exprs.length - 1)\n                    return next;\n                connect(next, from = node());\n            }\n        }\n        else if (expr.type == \"star\") {\n            let loop = node();\n            edge(from, loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"plus\") {\n            let loop = node();\n            connect(compile(expr.expr, from), loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"opt\") {\n            return [edge(from)].concat(compile(expr.expr, from));\n        }\n        else if (expr.type == \"range\") {\n            let cur = from;\n            for (let i = 0; i < expr.min; i++) {\n                let next = node();\n                connect(compile(expr.expr, cur), next);\n                cur = next;\n            }\n            if (expr.max == -1) {\n                connect(compile(expr.expr, cur), cur);\n            }\n            else {\n                for (let i = expr.min; i < expr.max; i++) {\n                    let next = node();\n                    edge(cur, next);\n                    connect(compile(expr.expr, cur), next);\n                    cur = next;\n                }\n            }\n            return [edge(cur)];\n        }\n        else if (expr.type == \"name\") {\n            return [edge(from, undefined, expr.value)];\n        }\n        else {\n            throw new Error(\"Unknown expr type\");\n        }\n    }\n}\nfunction cmp(a, b) { return b - a; }\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n    let result = [];\n    scan(node);\n    return result.sort(cmp);\n    function scan(node) {\n        let edges = nfa[node];\n        if (edges.length == 1 && !edges[0].term)\n            return scan(edges[0].to);\n        result.push(node);\n        for (let i = 0; i < edges.length; i++) {\n            let { term, to } = edges[i];\n            if (!term && result.indexOf(to) == -1)\n                scan(to);\n        }\n    }\n}\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n    let labeled = Object.create(null);\n    return explore(nullFrom(nfa, 0));\n    function explore(states) {\n        let out = [];\n        states.forEach(node => {\n            nfa[node].forEach(({ term, to }) => {\n                if (!term)\n                    return;\n                let set;\n                for (let i = 0; i < out.length; i++)\n                    if (out[i][0] == term)\n                        set = out[i][1];\n                nullFrom(nfa, to).forEach(node => {\n                    if (!set)\n                        out.push([term, set = []]);\n                    if (set.indexOf(node) == -1)\n                        set.push(node);\n                });\n            });\n        });\n        let state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n        for (let i = 0; i < out.length; i++) {\n            let states = out[i][1].sort(cmp);\n            state.next.push({ type: out[i][0], next: labeled[states.join(\",\")] || explore(states) });\n        }\n        return state;\n    }\n}\nfunction checkForDeadEnds(match, stream) {\n    for (let i = 0, work = [match]; i < work.length; i++) {\n        let state = work[i], dead = !state.validEnd, nodes = [];\n        for (let j = 0; j < state.next.length; j++) {\n            let { type, next } = state.next[j];\n            nodes.push(type.name);\n            if (dead && !(type.isText || type.hasRequiredAttrs()))\n                dead = false;\n            if (work.indexOf(next) == -1)\n                work.push(next);\n        }\n        if (dead)\n            stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\");\n    }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n    let defaults = Object.create(null);\n    for (let attrName in attrs) {\n        let attr = attrs[attrName];\n        if (!attr.hasDefault)\n            return null;\n        defaults[attrName] = attr.default;\n    }\n    return defaults;\n}\nfunction computeAttrs(attrs, value) {\n    let built = Object.create(null);\n    for (let name in attrs) {\n        let given = value && value[name];\n        if (given === undefined) {\n            let attr = attrs[name];\n            if (attr.hasDefault)\n                given = attr.default;\n            else\n                throw new RangeError(\"No value supplied for attribute \" + name);\n        }\n        built[name] = given;\n    }\n    return built;\n}\nfunction checkAttrs(attrs, values, type, name) {\n    for (let attr in values)\n        if (!(attr in attrs))\n            throw new RangeError(`Unsupported attribute ${attr} for ${type} of type ${name}`);\n    for (let attr in attrs) {\n        if (attrs[attr].validate)\n            attrs[attr].validate(values[attr]);\n    }\n}\nfunction initAttrs(typeName, attrs) {\n    let result = Object.create(null);\n    if (attrs)\n        for (let name in attrs)\n            result[name] = new Attribute(typeName, name, attrs[name]);\n    return result;\n}\n/**\nNode types are objects allocated once per `Schema` and used to\n[tag](https://prosemirror.net/docs/ref/#model.Node.type) `Node` instances. They contain information\nabout the node type, such as its name and what kind of node it\nrepresents.\n*/\nclass NodeType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name the node type has in this schema.\n    */\n    name, \n    /**\n    A link back to the `Schema` the node type belongs to.\n    */\n    schema, \n    /**\n    The spec that this type is based on\n    */\n    spec) {\n        this.name = name;\n        this.schema = schema;\n        this.spec = spec;\n        /**\n        The set of marks allowed in this node. `null` means all marks\n        are allowed.\n        */\n        this.markSet = null;\n        this.groups = spec.group ? spec.group.split(\" \") : [];\n        this.attrs = initAttrs(name, spec.attrs);\n        this.defaultAttrs = defaultAttrs(this.attrs);\n        this.contentMatch = null;\n        this.inlineContent = null;\n        this.isBlock = !(spec.inline || name == \"text\");\n        this.isText = name == \"text\";\n    }\n    /**\n    True if this is an inline type.\n    */\n    get isInline() { return !this.isBlock; }\n    /**\n    True if this is a textblock type, a block that contains inline\n    content.\n    */\n    get isTextblock() { return this.isBlock && this.inlineContent; }\n    /**\n    True for node types that allow no content.\n    */\n    get isLeaf() { return this.contentMatch == ContentMatch.empty; }\n    /**\n    True when this node is an atom, i.e. when it does not have\n    directly editable content.\n    */\n    get isAtom() { return this.isLeaf || !!this.spec.atom; }\n    /**\n    Return true when this node type is part of the given\n    [group](https://prosemirror.net/docs/ref/#model.NodeSpec.group).\n    */\n    isInGroup(group) {\n        return this.groups.indexOf(group) > -1;\n    }\n    /**\n    The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.\n    */\n    get whitespace() {\n        return this.spec.whitespace || (this.spec.code ? \"pre\" : \"normal\");\n    }\n    /**\n    Tells you whether this node type has any required attributes.\n    */\n    hasRequiredAttrs() {\n        for (let n in this.attrs)\n            if (this.attrs[n].isRequired)\n                return true;\n        return false;\n    }\n    /**\n    Indicates whether this node allows some of the same content as\n    the given node type.\n    */\n    compatibleContent(other) {\n        return this == other || this.contentMatch.compatible(other.contentMatch);\n    }\n    /**\n    @internal\n    */\n    computeAttrs(attrs) {\n        if (!attrs && this.defaultAttrs)\n            return this.defaultAttrs;\n        else\n            return computeAttrs(this.attrs, attrs);\n    }\n    /**\n    Create a `Node` of this type. The given attributes are\n    checked and defaulted (you can pass `null` to use the type's\n    defaults entirely, if no required attributes exist). `content`\n    may be a `Fragment`, a node, an array of nodes, or\n    `null`. Similarly `marks` may be `null` to default to the empty\n    set of marks.\n    */\n    create(attrs = null, content, marks) {\n        if (this.isText)\n            throw new Error(\"NodeType.create can't construct text nodes\");\n        return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content\n    against the node type's content restrictions, and throw an error\n    if it doesn't match.\n    */\n    createChecked(attrs = null, content, marks) {\n        content = Fragment.from(content);\n        this.checkContent(content);\n        return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is\n    necessary to add nodes to the start or end of the given fragment\n    to make it fit the node. If no fitting wrapping can be found,\n    return null. Note that, due to the fact that required nodes can\n    always be created, this will always succeed if you pass null or\n    `Fragment.empty` as content.\n    */\n    createAndFill(attrs = null, content, marks) {\n        attrs = this.computeAttrs(attrs);\n        content = Fragment.from(content);\n        if (content.size) {\n            let before = this.contentMatch.fillBefore(content);\n            if (!before)\n                return null;\n            content = before.append(content);\n        }\n        let matched = this.contentMatch.matchFragment(content);\n        let after = matched && matched.fillBefore(Fragment.empty, true);\n        if (!after)\n            return null;\n        return new Node(this, attrs, content.append(after), Mark.setFrom(marks));\n    }\n    /**\n    Returns true if the given fragment is valid content for this node\n    type.\n    */\n    validContent(content) {\n        let result = this.contentMatch.matchFragment(content);\n        if (!result || !result.validEnd)\n            return false;\n        for (let i = 0; i < content.childCount; i++)\n            if (!this.allowsMarks(content.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Throws a RangeError if the given fragment is not valid content for this\n    node type.\n    @internal\n    */\n    checkContent(content) {\n        if (!this.validContent(content))\n            throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`);\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"node\", this.name);\n    }\n    /**\n    Check whether the given mark type is allowed in this node.\n    */\n    allowsMarkType(markType) {\n        return this.markSet == null || this.markSet.indexOf(markType) > -1;\n    }\n    /**\n    Test whether the given set of marks are allowed in this node.\n    */\n    allowsMarks(marks) {\n        if (this.markSet == null)\n            return true;\n        for (let i = 0; i < marks.length; i++)\n            if (!this.allowsMarkType(marks[i].type))\n                return false;\n        return true;\n    }\n    /**\n    Removes the marks that are not allowed in this node from the given set.\n    */\n    allowedMarks(marks) {\n        if (this.markSet == null)\n            return marks;\n        let copy;\n        for (let i = 0; i < marks.length; i++) {\n            if (!this.allowsMarkType(marks[i].type)) {\n                if (!copy)\n                    copy = marks.slice(0, i);\n            }\n            else if (copy) {\n                copy.push(marks[i]);\n            }\n        }\n        return !copy ? marks : copy.length ? copy : Mark.none;\n    }\n    /**\n    @internal\n    */\n    static compile(nodes, schema) {\n        let result = Object.create(null);\n        nodes.forEach((name, spec) => result[name] = new NodeType(name, schema, spec));\n        let topType = schema.spec.topNode || \"doc\";\n        if (!result[topType])\n            throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\");\n        if (!result.text)\n            throw new RangeError(\"Every schema needs a 'text' type\");\n        for (let _ in result.text.attrs)\n            throw new RangeError(\"The text node type should not have attributes\");\n        return result;\n    }\n}\nfunction validateType(typeName, attrName, type) {\n    let types = type.split(\"|\");\n    return (value) => {\n        let name = value === null ? \"null\" : typeof value;\n        if (types.indexOf(name) < 0)\n            throw new RangeError(`Expected value of type ${types} for attribute ${attrName} on type ${typeName}, got ${name}`);\n    };\n}\n// Attribute descriptors\nclass Attribute {\n    constructor(typeName, attrName, options) {\n        this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n        this.default = options.default;\n        this.validate = typeof options.validate == \"string\" ? validateType(typeName, attrName, options.validate) : options.validate;\n    }\n    get isRequired() {\n        return !this.hasDefault;\n    }\n}\n// Marks\n/**\nLike nodes, marks (which are associated with nodes to signify\nthings like emphasis or being part of a link) are\n[tagged](https://prosemirror.net/docs/ref/#model.Mark.type) with type objects, which are\ninstantiated once per `Schema`.\n*/\nclass MarkType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name of the mark type.\n    */\n    name, \n    /**\n    @internal\n    */\n    rank, \n    /**\n    The schema that this mark type instance is part of.\n    */\n    schema, \n    /**\n    The spec on which the type is based.\n    */\n    spec) {\n        this.name = name;\n        this.rank = rank;\n        this.schema = schema;\n        this.spec = spec;\n        this.attrs = initAttrs(name, spec.attrs);\n        this.excluded = null;\n        let defaults = defaultAttrs(this.attrs);\n        this.instance = defaults ? new Mark(this, defaults) : null;\n    }\n    /**\n    Create a mark of this type. `attrs` may be `null` or an object\n    containing only some of the mark's attributes. The others, if\n    they have defaults, will be added.\n    */\n    create(attrs = null) {\n        if (!attrs && this.instance)\n            return this.instance;\n        return new Mark(this, computeAttrs(this.attrs, attrs));\n    }\n    /**\n    @internal\n    */\n    static compile(marks, schema) {\n        let result = Object.create(null), rank = 0;\n        marks.forEach((name, spec) => result[name] = new MarkType(name, rank++, schema, spec));\n        return result;\n    }\n    /**\n    When there is a mark of this type in the given set, a new set\n    without it is returned. Otherwise, the input set is returned.\n    */\n    removeFromSet(set) {\n        for (var i = 0; i < set.length; i++)\n            if (set[i].type == this) {\n                set = set.slice(0, i).concat(set.slice(i + 1));\n                i--;\n            }\n        return set;\n    }\n    /**\n    Tests whether there is a mark of this type in the given set.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (set[i].type == this)\n                return set[i];\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"mark\", this.name);\n    }\n    /**\n    Queries whether a given mark type is\n    [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.\n    */\n    excludes(other) {\n        return this.excluded.indexOf(other) > -1;\n    }\n}\n/**\nA document schema. Holds [node](https://prosemirror.net/docs/ref/#model.NodeType) and [mark\ntype](https://prosemirror.net/docs/ref/#model.MarkType) objects for the nodes and marks that may\noccur in conforming documents, and provides functionality for\ncreating and deserializing such documents.\n\nWhen given, the type parameters provide the names of the nodes and\nmarks in this schema.\n*/\nclass Schema {\n    /**\n    Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).\n    */\n    constructor(spec) {\n        /**\n        The [linebreak\n        replacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement) node defined\n        in this schema, if any.\n        */\n        this.linebreakReplacement = null;\n        /**\n        An object for storing whatever values modules may want to\n        compute and cache per schema. (If you want to store something\n        in it, try to use property names unlikely to clash.)\n        */\n        this.cached = Object.create(null);\n        let instanceSpec = this.spec = {};\n        for (let prop in spec)\n            instanceSpec[prop] = spec[prop];\n        instanceSpec.nodes = OrderedMap.from(spec.nodes),\n            instanceSpec.marks = OrderedMap.from(spec.marks || {}),\n            this.nodes = NodeType.compile(this.spec.nodes, this);\n        this.marks = MarkType.compile(this.spec.marks, this);\n        let contentExprCache = Object.create(null);\n        for (let prop in this.nodes) {\n            if (prop in this.marks)\n                throw new RangeError(prop + \" can not be both a node and a mark\");\n            let type = this.nodes[prop], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n            type.contentMatch = contentExprCache[contentExpr] ||\n                (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n            type.inlineContent = type.contentMatch.inlineContent;\n            if (type.spec.linebreakReplacement) {\n                if (this.linebreakReplacement)\n                    throw new RangeError(\"Multiple linebreak nodes defined\");\n                if (!type.isInline || !type.isLeaf)\n                    throw new RangeError(\"Linebreak replacement nodes must be inline leaf nodes\");\n                this.linebreakReplacement = type;\n            }\n            type.markSet = markExpr == \"_\" ? null :\n                markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n                    markExpr == \"\" || !type.inlineContent ? [] : null;\n        }\n        for (let prop in this.marks) {\n            let type = this.marks[prop], excl = type.spec.excludes;\n            type.excluded = excl == null ? [type] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n        }\n        this.nodeFromJSON = json => Node.fromJSON(this, json);\n        this.markFromJSON = json => Mark.fromJSON(this, json);\n        this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n        this.cached.wrappings = Object.create(null);\n    }\n    /**\n    Create a node in this schema. The `type` may be a string or a\n    `NodeType` instance. Attributes will be extended with defaults,\n    `content` may be a `Fragment`, `null`, a `Node`, or an array of\n    nodes.\n    */\n    node(type, attrs = null, content, marks) {\n        if (typeof type == \"string\")\n            type = this.nodeType(type);\n        else if (!(type instanceof NodeType))\n            throw new RangeError(\"Invalid node type: \" + type);\n        else if (type.schema != this)\n            throw new RangeError(\"Node type from different schema used (\" + type.name + \")\");\n        return type.createChecked(attrs, content, marks);\n    }\n    /**\n    Create a text node in the schema. Empty text nodes are not\n    allowed.\n    */\n    text(text, marks) {\n        let type = this.nodes.text;\n        return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks));\n    }\n    /**\n    Create a mark with the given type and attributes.\n    */\n    mark(type, attrs) {\n        if (typeof type == \"string\")\n            type = this.marks[type];\n        return type.create(attrs);\n    }\n    /**\n    @internal\n    */\n    nodeType(name) {\n        let found = this.nodes[name];\n        if (!found)\n            throw new RangeError(\"Unknown node type: \" + name);\n        return found;\n    }\n}\nfunction gatherMarks(schema, marks) {\n    let found = [];\n    for (let i = 0; i < marks.length; i++) {\n        let name = marks[i], mark = schema.marks[name], ok = mark;\n        if (mark) {\n            found.push(mark);\n        }\n        else {\n            for (let prop in schema.marks) {\n                let mark = schema.marks[prop];\n                if (name == \"_\" || (mark.spec.group && mark.spec.group.split(\" \").indexOf(name) > -1))\n                    found.push(ok = mark);\n            }\n        }\n        if (!ok)\n            throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\");\n    }\n    return found;\n}\n\nfunction isTagRule(rule) { return rule.tag != null; }\nfunction isStyleRule(rule) { return rule.style != null; }\n/**\nA DOM parser represents a strategy for parsing DOM content into a\nProseMirror document conforming to a given schema. Its behavior is\ndefined by an array of [rules](https://prosemirror.net/docs/ref/#model.ParseRule).\n*/\nclass DOMParser {\n    /**\n    Create a parser that targets the given schema, using the given\n    parsing rules.\n    */\n    constructor(\n    /**\n    The schema into which the parser parses.\n    */\n    schema, \n    /**\n    The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser\n    uses, in order of precedence.\n    */\n    rules) {\n        this.schema = schema;\n        this.rules = rules;\n        /**\n        @internal\n        */\n        this.tags = [];\n        /**\n        @internal\n        */\n        this.styles = [];\n        let matchedStyles = this.matchedStyles = [];\n        rules.forEach(rule => {\n            if (isTagRule(rule)) {\n                this.tags.push(rule);\n            }\n            else if (isStyleRule(rule)) {\n                let prop = /[^=]*/.exec(rule.style)[0];\n                if (matchedStyles.indexOf(prop) < 0)\n                    matchedStyles.push(prop);\n                this.styles.push(rule);\n            }\n        });\n        // Only normalize list elements when lists in the schema can't directly contain themselves\n        this.normalizeLists = !this.tags.some(r => {\n            if (!/^(ul|ol)\\b/.test(r.tag) || !r.node)\n                return false;\n            let node = schema.nodes[r.node];\n            return node.contentMatch.matchType(node);\n        });\n    }\n    /**\n    Parse a document from the content of a DOM node.\n    */\n    parse(dom, options = {}) {\n        let context = new ParseContext(this, options, false);\n        context.addAll(dom, Mark.none, options.from, options.to);\n        return context.finish();\n    }\n    /**\n    Parses the content of the given DOM node, like\n    [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of\n    options. But unlike that method, which produces a whole node,\n    this one returns a slice that is open at the sides, meaning that\n    the schema constraints aren't applied to the start of nodes to\n    the left of the input and the end of nodes at the end.\n    */\n    parseSlice(dom, options = {}) {\n        let context = new ParseContext(this, options, true);\n        context.addAll(dom, Mark.none, options.from, options.to);\n        return Slice.maxOpen(context.finish());\n    }\n    /**\n    @internal\n    */\n    matchTag(dom, context, after) {\n        for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n            let rule = this.tags[i];\n            if (matches(dom, rule.tag) &&\n                (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n                (!rule.context || context.matchesContext(rule.context))) {\n                if (rule.getAttrs) {\n                    let result = rule.getAttrs(dom);\n                    if (result === false)\n                        continue;\n                    rule.attrs = result || undefined;\n                }\n                return rule;\n            }\n        }\n    }\n    /**\n    @internal\n    */\n    matchStyle(prop, value, context, after) {\n        for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n            let rule = this.styles[i], style = rule.style;\n            if (style.indexOf(prop) != 0 ||\n                rule.context && !context.matchesContext(rule.context) ||\n                // Test that the style string either precisely matches the prop,\n                // or has an '=' sign after the prop, followed by the given\n                // value.\n                style.length > prop.length &&\n                    (style.charCodeAt(prop.length) != 61 || style.slice(prop.length + 1) != value))\n                continue;\n            if (rule.getAttrs) {\n                let result = rule.getAttrs(value);\n                if (result === false)\n                    continue;\n                rule.attrs = result || undefined;\n            }\n            return rule;\n        }\n    }\n    /**\n    @internal\n    */\n    static schemaRules(schema) {\n        let result = [];\n        function insert(rule) {\n            let priority = rule.priority == null ? 50 : rule.priority, i = 0;\n            for (; i < result.length; i++) {\n                let next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n                if (nextPriority < priority)\n                    break;\n            }\n            result.splice(i, 0, rule);\n        }\n        for (let name in schema.marks) {\n            let rules = schema.marks[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.mark || rule.ignore || rule.clearMark))\n                        rule.mark = name;\n                });\n        }\n        for (let name in schema.nodes) {\n            let rules = schema.nodes[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.node || rule.ignore || rule.mark))\n                        rule.node = name;\n                });\n        }\n        return result;\n    }\n    /**\n    Construct a DOM parser using the parsing rules listed in a\n    schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by\n    [priority](https://prosemirror.net/docs/ref/#model.GenericParseRule.priority).\n    */\n    static fromSchema(schema) {\n        return schema.cached.domParser ||\n            (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));\n    }\n}\nconst blockTags = {\n    address: true, article: true, aside: true, blockquote: true, body: true, canvas: true,\n    dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n    footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n    h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n    output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\nconst ignoreTags = {\n    head: true, noscript: true, object: true, script: true, style: true, title: true\n};\nconst listTags = { ol: true, ul: true };\n// Using a bitfield for node context options\nconst OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\nfunction wsOptionsFor(type, preserveWhitespace, base) {\n    if (preserveWhitespace != null)\n        return (preserveWhitespace ? OPT_PRESERVE_WS : 0) |\n            (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0);\n    return type && type.whitespace == \"pre\" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;\n}\nclass NodeContext {\n    constructor(type, attrs, marks, solid, match, options) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.solid = solid;\n        this.options = options;\n        this.content = [];\n        // Marks applied to the node's children\n        this.activeMarks = Mark.none;\n        this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n    }\n    findWrapping(node) {\n        if (!this.match) {\n            if (!this.type)\n                return [];\n            let fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n            if (fill) {\n                this.match = this.type.contentMatch.matchFragment(fill);\n            }\n            else {\n                let start = this.type.contentMatch, wrap;\n                if (wrap = start.findWrapping(node.type)) {\n                    this.match = start;\n                    return wrap;\n                }\n                else {\n                    return null;\n                }\n            }\n        }\n        return this.match.findWrapping(node.type);\n    }\n    finish(openEnd) {\n        if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n            let last = this.content[this.content.length - 1], m;\n            if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n                let text = last;\n                if (last.text.length == m[0].length)\n                    this.content.pop();\n                else\n                    this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length));\n            }\n        }\n        let content = Fragment.from(this.content);\n        if (!openEnd && this.match)\n            content = content.append(this.match.fillBefore(Fragment.empty, true));\n        return this.type ? this.type.create(this.attrs, content, this.marks) : content;\n    }\n    inlineContext(node) {\n        if (this.type)\n            return this.type.inlineContent;\n        if (this.content.length)\n            return this.content[0].isInline;\n        return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase());\n    }\n}\nclass ParseContext {\n    constructor(\n    // The parser we are using.\n    parser, \n    // The options passed to this parse.\n    options, isOpen) {\n        this.parser = parser;\n        this.options = options;\n        this.isOpen = isOpen;\n        this.open = 0;\n        this.localPreserveWS = false;\n        let topNode = options.topNode, topContext;\n        let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);\n        if (topNode)\n            topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions);\n        else if (isOpen)\n            topContext = new NodeContext(null, null, Mark.none, true, null, topOptions);\n        else\n            topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, true, null, topOptions);\n        this.nodes = [topContext];\n        this.find = options.findPositions;\n        this.needsBlock = false;\n    }\n    get top() {\n        return this.nodes[this.open];\n    }\n    // Add a DOM node to the content. Text is inserted as text node,\n    // otherwise, the node is passed to `addElement` or, if it has a\n    // `style` attribute, `addElementWithStyles`.\n    addDOM(dom, marks) {\n        if (dom.nodeType == 3)\n            this.addTextNode(dom, marks);\n        else if (dom.nodeType == 1)\n            this.addElement(dom, marks);\n    }\n    addTextNode(dom, marks) {\n        let value = dom.nodeValue;\n        let top = this.top, preserveWS = (top.options & OPT_PRESERVE_WS_FULL) ? \"full\"\n            : this.localPreserveWS || (top.options & OPT_PRESERVE_WS) > 0;\n        let { schema } = this.parser;\n        if (preserveWS === \"full\" ||\n            top.inlineContext(dom) ||\n            /[^ \\t\\r\\n\\u000c]/.test(value)) {\n            if (!preserveWS) {\n                value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n                // If this starts with whitespace, and there is no node before it, or\n                // a hard break, or a text node that ends with whitespace, strip the\n                // leading space.\n                if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n                    let nodeBefore = top.content[top.content.length - 1];\n                    let domNodeBefore = dom.previousSibling;\n                    if (!nodeBefore ||\n                        (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n                        (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n                        value = value.slice(1);\n                }\n            }\n            else if (preserveWS === \"full\") {\n                value = value.replace(/\\r\\n?/g, \"\\n\");\n            }\n            else if (schema.linebreakReplacement && /[\\r\\n]/.test(value) && this.top.findWrapping(schema.linebreakReplacement.create())) {\n                let lines = value.split(/\\r?\\n|\\r/);\n                for (let i = 0; i < lines.length; i++) {\n                    if (i)\n                        this.insertNode(schema.linebreakReplacement.create(), marks, true);\n                    if (lines[i])\n                        this.insertNode(schema.text(lines[i]), marks, !/\\S/.test(lines[i]));\n                }\n                value = \"\";\n            }\n            else {\n                value = value.replace(/\\r?\\n|\\r/g, \" \");\n            }\n            if (value)\n                this.insertNode(schema.text(value), marks, !/\\S/.test(value));\n            this.findInText(dom);\n        }\n        else {\n            this.findInside(dom);\n        }\n    }\n    // Try to find a handler for the given tag and use that to parse. If\n    // none is found, the element's content nodes are added directly.\n    addElement(dom, marks, matchAfter) {\n        let outerWS = this.localPreserveWS, top = this.top;\n        if (dom.tagName == \"PRE\" || /pre/.test(dom.style && dom.style.whiteSpace))\n            this.localPreserveWS = true;\n        let name = dom.nodeName.toLowerCase(), ruleID;\n        if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)\n            normalizeList(dom);\n        let rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n            (ruleID = this.parser.matchTag(dom, this, matchAfter));\n        out: if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n            this.findInside(dom);\n            this.ignoreFallback(dom, marks);\n        }\n        else if (!rule || rule.skip || rule.closeParent) {\n            if (rule && rule.closeParent)\n                this.open = Math.max(0, this.open - 1);\n            else if (rule && rule.skip.nodeType)\n                dom = rule.skip;\n            let sync, oldNeedsBlock = this.needsBlock;\n            if (blockTags.hasOwnProperty(name)) {\n                if (top.content.length && top.content[0].isInline && this.open) {\n                    this.open--;\n                    top = this.top;\n                }\n                sync = true;\n                if (!top.type)\n                    this.needsBlock = true;\n            }\n            else if (!dom.firstChild) {\n                this.leafFallback(dom, marks);\n                break out;\n            }\n            let innerMarks = rule && rule.skip ? marks : this.readStyles(dom, marks);\n            if (innerMarks)\n                this.addAll(dom, innerMarks);\n            if (sync)\n                this.sync(top);\n            this.needsBlock = oldNeedsBlock;\n        }\n        else {\n            let innerMarks = this.readStyles(dom, marks);\n            if (innerMarks)\n                this.addElementByRule(dom, rule, innerMarks, rule.consuming === false ? ruleID : undefined);\n        }\n        this.localPreserveWS = outerWS;\n    }\n    // Called for leaf DOM nodes that would otherwise be ignored\n    leafFallback(dom, marks) {\n        if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n            this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\"), marks);\n    }\n    // Called for ignored nodes\n    ignoreFallback(dom, marks) {\n        // Ignored BR nodes should at least create an inline context\n        if (dom.nodeName == \"BR\" && (!this.top.type || !this.top.type.inlineContent))\n            this.findPlace(this.parser.schema.text(\"-\"), marks, true);\n    }\n    // Run any style parser associated with the node's styles. Either\n    // return an updated array of marks, or null to indicate some of the\n    // styles had a rule with `ignore` set.\n    readStyles(dom, marks) {\n        let styles = dom.style;\n        // Because many properties will only show up in 'normalized' form\n        // in `style.item` (i.e. text-decoration becomes\n        // text-decoration-line, text-decoration-color, etc), we directly\n        // query the styles mentioned in our rules instead of iterating\n        // over the items.\n        if (styles && styles.length)\n            for (let i = 0; i < this.parser.matchedStyles.length; i++) {\n                let name = this.parser.matchedStyles[i], value = styles.getPropertyValue(name);\n                if (value)\n                    for (let after = undefined;;) {\n                        let rule = this.parser.matchStyle(name, value, this, after);\n                        if (!rule)\n                            break;\n                        if (rule.ignore)\n                            return null;\n                        if (rule.clearMark)\n                            marks = marks.filter(m => !rule.clearMark(m));\n                        else\n                            marks = marks.concat(this.parser.schema.marks[rule.mark].create(rule.attrs));\n                        if (rule.consuming === false)\n                            after = rule;\n                        else\n                            break;\n                    }\n            }\n        return marks;\n    }\n    // Look up a handler for the given node. If none are found, return\n    // false. Otherwise, apply it, use its return value to drive the way\n    // the node's content is wrapped, and return true.\n    addElementByRule(dom, rule, marks, continueAfter) {\n        let sync, nodeType;\n        if (rule.node) {\n            nodeType = this.parser.schema.nodes[rule.node];\n            if (!nodeType.isLeaf) {\n                let inner = this.enter(nodeType, rule.attrs || null, marks, rule.preserveWhitespace);\n                if (inner) {\n                    sync = true;\n                    marks = inner;\n                }\n            }\n            else if (!this.insertNode(nodeType.create(rule.attrs), marks, dom.nodeName == \"BR\")) {\n                this.leafFallback(dom, marks);\n            }\n        }\n        else {\n            let markType = this.parser.schema.marks[rule.mark];\n            marks = marks.concat(markType.create(rule.attrs));\n        }\n        let startIn = this.top;\n        if (nodeType && nodeType.isLeaf) {\n            this.findInside(dom);\n        }\n        else if (continueAfter) {\n            this.addElement(dom, marks, continueAfter);\n        }\n        else if (rule.getContent) {\n            this.findInside(dom);\n            rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node, marks, false));\n        }\n        else {\n            let contentDOM = dom;\n            if (typeof rule.contentElement == \"string\")\n                contentDOM = dom.querySelector(rule.contentElement);\n            else if (typeof rule.contentElement == \"function\")\n                contentDOM = rule.contentElement(dom);\n            else if (rule.contentElement)\n                contentDOM = rule.contentElement;\n            this.findAround(dom, contentDOM, true);\n            this.addAll(contentDOM, marks);\n            this.findAround(dom, contentDOM, false);\n        }\n        if (sync && this.sync(startIn))\n            this.open--;\n    }\n    // Add all child nodes between `startIndex` and `endIndex` (or the\n    // whole node, if not given). If `sync` is passed, use it to\n    // synchronize after every block element.\n    addAll(parent, marks, startIndex, endIndex) {\n        let index = startIndex || 0;\n        for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {\n            this.findAtPoint(parent, index);\n            this.addDOM(dom, marks);\n        }\n        this.findAtPoint(parent, index);\n    }\n    // Try to find a way to fit the given node type into the current\n    // context. May add intermediate wrappers and/or leave non-solid\n    // nodes that we're in.\n    findPlace(node, marks, cautious) {\n        let route, sync;\n        for (let depth = this.open, penalty = 0; depth >= 0; depth--) {\n            let cx = this.nodes[depth];\n            let found = cx.findWrapping(node);\n            if (found && (!route || route.length > found.length + penalty)) {\n                route = found;\n                sync = cx;\n                if (!found.length)\n                    break;\n            }\n            if (cx.solid) {\n                if (cautious)\n                    break;\n                penalty += 2;\n            }\n        }\n        if (!route)\n            return null;\n        this.sync(sync);\n        for (let i = 0; i < route.length; i++)\n            marks = this.enterInner(route[i], null, marks, false);\n        return marks;\n    }\n    // Try to insert the given node, adjusting the context when needed.\n    insertNode(node, marks, cautious) {\n        if (node.isInline && this.needsBlock && !this.top.type) {\n            let block = this.textblockFromContext();\n            if (block)\n                marks = this.enterInner(block, null, marks);\n        }\n        let innerMarks = this.findPlace(node, marks, cautious);\n        if (innerMarks) {\n            this.closeExtra();\n            let top = this.top;\n            if (top.match)\n                top.match = top.match.matchType(node.type);\n            let nodeMarks = Mark.none;\n            for (let m of innerMarks.concat(node.marks))\n                if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, node.type))\n                    nodeMarks = m.addToSet(nodeMarks);\n            top.content.push(node.mark(nodeMarks));\n            return true;\n        }\n        return false;\n    }\n    // Try to start a node of the given type, adjusting the context when\n    // necessary.\n    enter(type, attrs, marks, preserveWS) {\n        let innerMarks = this.findPlace(type.create(attrs), marks, false);\n        if (innerMarks)\n            innerMarks = this.enterInner(type, attrs, marks, true, preserveWS);\n        return innerMarks;\n    }\n    // Open a node of the given type\n    enterInner(type, attrs, marks, solid = false, preserveWS) {\n        this.closeExtra();\n        let top = this.top;\n        top.match = top.match && top.match.matchType(type);\n        let options = wsOptionsFor(type, preserveWS, top.options);\n        if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0)\n            options |= OPT_OPEN_LEFT;\n        let applyMarks = Mark.none;\n        marks = marks.filter(m => {\n            if (top.type ? top.type.allowsMarkType(m.type) : markMayApply(m.type, type)) {\n                applyMarks = m.addToSet(applyMarks);\n                return false;\n            }\n            return true;\n        });\n        this.nodes.push(new NodeContext(type, attrs, applyMarks, solid, null, options));\n        this.open++;\n        return marks;\n    }\n    // Make sure all nodes above this.open are finished and added to\n    // their parents\n    closeExtra(openEnd = false) {\n        let i = this.nodes.length - 1;\n        if (i > this.open) {\n            for (; i > this.open; i--)\n                this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd));\n            this.nodes.length = this.open + 1;\n        }\n    }\n    finish() {\n        this.open = 0;\n        this.closeExtra(this.isOpen);\n        return this.nodes[0].finish(!!(this.isOpen || this.options.topOpen));\n    }\n    sync(to) {\n        for (let i = this.open; i >= 0; i--) {\n            if (this.nodes[i] == to) {\n                this.open = i;\n                return true;\n            }\n            else if (this.localPreserveWS) {\n                this.nodes[i].options |= OPT_PRESERVE_WS;\n            }\n        }\n        return false;\n    }\n    get currentPos() {\n        this.closeExtra();\n        let pos = 0;\n        for (let i = this.open; i >= 0; i--) {\n            let content = this.nodes[i].content;\n            for (let j = content.length - 1; j >= 0; j--)\n                pos += content[j].nodeSize;\n            if (i)\n                pos++;\n        }\n        return pos;\n    }\n    findAtPoint(parent, offset) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == parent && this.find[i].offset == offset)\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findInside(parent) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findAround(parent, content, before) {\n        if (parent != content && this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n                    let pos = content.compareDocumentPosition(this.find[i].node);\n                    if (pos & (before ? 2 : 4))\n                        this.find[i].pos = this.currentPos;\n                }\n            }\n    }\n    findInText(textNode) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == textNode)\n                    this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset);\n            }\n    }\n    // Determines whether the given context string matches this context.\n    matchesContext(context) {\n        if (context.indexOf(\"|\") > -1)\n            return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this);\n        let parts = context.split(\"/\");\n        let option = this.options.context;\n        let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n        let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n        let match = (i, depth) => {\n            for (; i >= 0; i--) {\n                let part = parts[i];\n                if (part == \"\") {\n                    if (i == parts.length - 1 || i == 0)\n                        continue;\n                    for (; depth >= minDepth; depth--)\n                        if (match(i - 1, depth))\n                            return true;\n                    return false;\n                }\n                else {\n                    let next = depth > 0 || (depth == 0 && useRoot) ? this.nodes[depth].type\n                        : option && depth >= minDepth ? option.node(depth - minDepth).type\n                            : null;\n                    if (!next || (next.name != part && !next.isInGroup(part)))\n                        return false;\n                    depth--;\n                }\n            }\n            return true;\n        };\n        return match(parts.length - 1, this.open);\n    }\n    textblockFromContext() {\n        let $context = this.options.context;\n        if ($context)\n            for (let d = $context.depth; d >= 0; d--) {\n                let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n                if (deflt && deflt.isTextblock && deflt.defaultAttrs)\n                    return deflt;\n            }\n        for (let name in this.parser.schema.nodes) {\n            let type = this.parser.schema.nodes[name];\n            if (type.isTextblock && type.defaultAttrs)\n                return type;\n        }\n    }\n}\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n    for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n        let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n        if (name && listTags.hasOwnProperty(name) && prevItem) {\n            prevItem.appendChild(child);\n            child = prevItem;\n        }\n        else if (name == \"li\") {\n            prevItem = child;\n        }\n        else if (name) {\n            prevItem = null;\n        }\n    }\n}\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n    return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector);\n}\nfunction copy(obj) {\n    let copy = {};\n    for (let prop in obj)\n        copy[prop] = obj[prop];\n    return copy;\n}\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n    let nodes = nodeType.schema.nodes;\n    for (let name in nodes) {\n        let parent = nodes[name];\n        if (!parent.allowsMarkType(markType))\n            continue;\n        let seen = [], scan = (match) => {\n            seen.push(match);\n            for (let i = 0; i < match.edgeCount; i++) {\n                let { type, next } = match.edge(i);\n                if (type == nodeType)\n                    return true;\n                if (seen.indexOf(next) < 0 && scan(next))\n                    return true;\n            }\n        };\n        if (scan(parent.contentMatch))\n            return true;\n    }\n}\n\n/**\nA DOM serializer knows how to convert ProseMirror nodes and\nmarks of various types to DOM nodes.\n*/\nclass DOMSerializer {\n    /**\n    Create a serializer. `nodes` should map node names to functions\n    that take a node and return a description of the corresponding\n    DOM. `marks` does the same for mark names, but also gets an\n    argument that tells it whether the mark's content is block or\n    inline content (for typical use, it'll always be inline). A mark\n    serializer may be `null` to indicate that marks of that type\n    should not be serialized.\n    */\n    constructor(\n    /**\n    The node serialization functions.\n    */\n    nodes, \n    /**\n    The mark serialization functions.\n    */\n    marks) {\n        this.nodes = nodes;\n        this.marks = marks;\n    }\n    /**\n    Serialize the content of this fragment to a DOM fragment. When\n    not in the browser, the `document` option, containing a DOM\n    document, should be passed so that the serializer can create\n    nodes.\n    */\n    serializeFragment(fragment, options = {}, target) {\n        if (!target)\n            target = doc(options).createDocumentFragment();\n        let top = target, active = [];\n        fragment.forEach(node => {\n            if (active.length || node.marks.length) {\n                let keep = 0, rendered = 0;\n                while (keep < active.length && rendered < node.marks.length) {\n                    let next = node.marks[rendered];\n                    if (!this.marks[next.type.name]) {\n                        rendered++;\n                        continue;\n                    }\n                    if (!next.eq(active[keep][0]) || next.type.spec.spanning === false)\n                        break;\n                    keep++;\n                    rendered++;\n                }\n                while (keep < active.length)\n                    top = active.pop()[1];\n                while (rendered < node.marks.length) {\n                    let add = node.marks[rendered++];\n                    let markDOM = this.serializeMark(add, node.isInline, options);\n                    if (markDOM) {\n                        active.push([add, top]);\n                        top.appendChild(markDOM.dom);\n                        top = markDOM.contentDOM || markDOM.dom;\n                    }\n                }\n            }\n            top.appendChild(this.serializeNodeInner(node, options));\n        });\n        return target;\n    }\n    /**\n    @internal\n    */\n    serializeNodeInner(node, options) {\n        if (node.isText)\n            return doc(options).createTextNode(node.text);\n        let { dom, contentDOM } = renderSpec(doc(options), this.nodes[node.type.name](node), null, node.attrs);\n        if (contentDOM) {\n            if (node.isLeaf)\n                throw new RangeError(\"Content hole not allowed in a leaf node spec\");\n            this.serializeFragment(node.content, options, contentDOM);\n        }\n        return dom;\n    }\n    /**\n    Serialize this node to a DOM node. This can be useful when you\n    need to serialize a part of a document, as opposed to the whole\n    document. To serialize a whole document, use\n    [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on\n    its [content](https://prosemirror.net/docs/ref/#model.Node.content).\n    */\n    serializeNode(node, options = {}) {\n        let dom = this.serializeNodeInner(node, options);\n        for (let i = node.marks.length - 1; i >= 0; i--) {\n            let wrap = this.serializeMark(node.marks[i], node.isInline, options);\n            if (wrap) {\n                (wrap.contentDOM || wrap.dom).appendChild(dom);\n                dom = wrap.dom;\n            }\n        }\n        return dom;\n    }\n    /**\n    @internal\n    */\n    serializeMark(mark, inline, options = {}) {\n        let toDOM = this.marks[mark.type.name];\n        return toDOM && renderSpec(doc(options), toDOM(mark, inline), null, mark.attrs);\n    }\n    static renderSpec(doc, structure, xmlNS = null, blockArraysIn) {\n        // Kludge for backwards-compatibility with accidental original behavious\n        if (typeof structure == \"string\")\n            return { dom: doc.createTextNode(structure) };\n        return renderSpec(doc, structure, xmlNS, blockArraysIn);\n    }\n    /**\n    Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)\n    properties in a schema's node and mark specs.\n    */\n    static fromSchema(schema) {\n        return schema.cached.domSerializer ||\n            (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)));\n    }\n    /**\n    Gather the serializers in a schema's node specs into an object.\n    This can be useful as a base to build a custom serializer from.\n    */\n    static nodesFromSchema(schema) {\n        let result = gatherToDOM(schema.nodes);\n        if (!result.text)\n            result.text = node => node.text;\n        return result;\n    }\n    /**\n    Gather the serializers in a schema's mark specs into an object.\n    */\n    static marksFromSchema(schema) {\n        return gatherToDOM(schema.marks);\n    }\n}\nfunction gatherToDOM(obj) {\n    let result = {};\n    for (let name in obj) {\n        let toDOM = obj[name].spec.toDOM;\n        if (toDOM)\n            result[name] = toDOM;\n    }\n    return result;\n}\nfunction doc(options) {\n    return options.document || window.document;\n}\nconst suspiciousAttributeCache = new WeakMap();\nfunction suspiciousAttributes(attrs) {\n    let value = suspiciousAttributeCache.get(attrs);\n    if (value === undefined)\n        suspiciousAttributeCache.set(attrs, value = suspiciousAttributesInner(attrs));\n    return value;\n}\nfunction suspiciousAttributesInner(attrs) {\n    let result = null;\n    function scan(value) {\n        if (value && typeof value == \"object\") {\n            if (Array.isArray(value)) {\n                if (typeof value[0] == \"string\") {\n                    if (!result)\n                        result = [];\n                    result.push(value);\n                }\n                else {\n                    for (let i = 0; i < value.length; i++)\n                        scan(value[i]);\n                }\n            }\n            else {\n                for (let prop in value)\n                    scan(value[prop]);\n            }\n        }\n    }\n    scan(attrs);\n    return result;\n}\nfunction renderSpec(doc, structure, xmlNS, blockArraysIn) {\n    if (structure.nodeType == 1)\n        return { dom: structure };\n    if (structure.dom && structure.dom.nodeType == 1)\n        return structure;\n    let tagName = structure[0], suspicious;\n    if (typeof tagName != \"string\")\n        throw new RangeError(\"Invalid array passed to renderSpec\");\n    if (blockArraysIn && (suspicious = suspiciousAttributes(blockArraysIn)) &&\n        suspicious.indexOf(structure) > -1)\n        throw new RangeError(\"Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.\");\n    let space = tagName.indexOf(\" \");\n    if (space > 0) {\n        xmlNS = tagName.slice(0, space);\n        tagName = tagName.slice(space + 1);\n    }\n    let contentDOM;\n    let dom = (xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName));\n    let attrs = structure[1], start = 1;\n    if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n        start = 2;\n        for (let name in attrs)\n            if (attrs[name] != null) {\n                let space = name.indexOf(\" \");\n                if (space > 0)\n                    dom.setAttributeNS(name.slice(0, space), name.slice(space + 1), attrs[name]);\n                else if (name == \"style\" && dom.style)\n                    dom.style.cssText = attrs[name];\n                else\n                    dom.setAttribute(name, attrs[name]);\n            }\n    }\n    for (let i = start; i < structure.length; i++) {\n        let child = structure[i];\n        if (child === 0) {\n            if (i < structure.length - 1 || i > start)\n                throw new RangeError(\"Content hole must be the only child of its parent node\");\n            return { dom, contentDOM: dom };\n        }\n        else if (typeof child == \"string\") {\n            dom.appendChild(doc.createTextNode(child));\n        }\n        else {\n            let { dom: inner, contentDOM: innerContent } = renderSpec(doc, child, xmlNS, blockArraysIn);\n            dom.appendChild(inner);\n            if (innerContent) {\n                if (contentDOM)\n                    throw new RangeError(\"Multiple content holes\");\n                contentDOM = innerContent;\n            }\n        }\n    }\n    return { dom, contentDOM };\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The mapped version of the position.\n    */\n    pos, \n    /**\n    @internal\n    */\n    delInfo, \n    /**\n    @internal\n    */\n    recover) {\n        this.pos = pos;\n        this.delInfo = delInfo;\n        this.recover = recover;\n    }\n    /**\n    Tells you whether the position was deleted, that is, whether the\n    step removed the token on the side queried (via the `assoc`)\n    argument from the document.\n    */\n    get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n    /**\n    Tells you whether the token before the mapped position was deleted.\n    */\n    get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n    /**\n    True when the token after the mapped position was deleted.\n    */\n    get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n    /**\n    Tells whether any of the steps mapped through deletes across the\n    position (including both the token before and after the\n    position).\n    */\n    get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n    /**\n    Create a position map. The modifications to the document are\n    represented as an array of numbers, in which each group of three\n    represents a modified chunk as `[start, oldSize, newSize]`.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    ranges, \n    /**\n    @internal\n    */\n    inverted = false) {\n        this.ranges = ranges;\n        this.inverted = inverted;\n        if (!ranges.length && StepMap.empty)\n            return StepMap.empty;\n    }\n    /**\n    @internal\n    */\n    recover(value) {\n        let diff = 0, index = recoverIndex(value);\n        if (!this.inverted)\n            for (let i = 0; i < index; i++)\n                diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n        return this.ranges[index * 3] + diff + recoverOffset(value);\n    }\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n            if (pos <= end) {\n                let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n                let result = start + diff + (side < 0 ? 0 : newSize);\n                if (simple)\n                    return result;\n                let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n                let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n                if (assoc < 0 ? pos != start : pos != end)\n                    del |= DEL_SIDE;\n                return new MapResult(result, del, recover);\n            }\n            diff += newSize - oldSize;\n        }\n        return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n    }\n    /**\n    @internal\n    */\n    touches(pos, recover) {\n        let diff = 0, index = recoverIndex(recover);\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n            if (pos <= end && i == index * 3)\n                return true;\n            diff += this.ranges[i + newIndex] - oldSize;\n        }\n        return false;\n    }\n    /**\n    Calls the given function on each of the changed ranges included in\n    this map.\n    */\n    forEach(f) {\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n            f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n            diff += newSize - oldSize;\n        }\n    }\n    /**\n    Create an inverted version of this map. The result can be used to\n    map positions in the post-step document to the pre-step document.\n    */\n    invert() {\n        return new StepMap(this.ranges, !this.inverted);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n    }\n    /**\n    Create a map that moves all positions by offset `n` (which may be\n    negative). This can be useful when applying steps meant for a\n    sub-document to a larger document, or vice-versa.\n    */\n    static offset(n) {\n        return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n    }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](https://prosemirror.net/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n    /**\n    Create a new mapping with the given position maps.\n    */\n    constructor(maps, \n    /**\n    @internal\n    */\n    mirror, \n    /**\n    The starting position in the `maps` array, used when `map` or\n    `mapResult` is called.\n    */\n    from = 0, \n    /**\n    The end position in the `maps` array.\n    */\n    to = maps ? maps.length : 0) {\n        this.mirror = mirror;\n        this.from = from;\n        this.to = to;\n        this._maps = maps || [];\n        this.ownData = !(maps || mirror);\n    }\n    /**\n    The step maps in this mapping.\n    */\n    get maps() { return this._maps; }\n    /**\n    Create a mapping that maps only through a part of this one.\n    */\n    slice(from = 0, to = this.maps.length) {\n        return new Mapping(this._maps, this.mirror, from, to);\n    }\n    /**\n    Add a step map to the end of this mapping. If `mirrors` is\n    given, it should be the index of the step map that is the mirror\n    image of this one.\n    */\n    appendMap(map, mirrors) {\n        if (!this.ownData) {\n            this._maps = this._maps.slice();\n            this.mirror = this.mirror && this.mirror.slice();\n            this.ownData = true;\n        }\n        this.to = this._maps.push(map);\n        if (mirrors != null)\n            this.setMirror(this._maps.length - 1, mirrors);\n    }\n    /**\n    Add all the step maps in a given mapping to this one (preserving\n    mirroring information).\n    */\n    appendMapping(mapping) {\n        for (let i = 0, startSize = this._maps.length; i < mapping._maps.length; i++) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping._maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n        }\n    }\n    /**\n    Finds the offset of the step map that mirrors the map at the\n    given offset, in this mapping (as per the second argument to\n    `appendMap`).\n    */\n    getMirror(n) {\n        if (this.mirror)\n            for (let i = 0; i < this.mirror.length; i++)\n                if (this.mirror[i] == n)\n                    return this.mirror[i + (i % 2 ? -1 : 1)];\n    }\n    /**\n    @internal\n    */\n    setMirror(n, m) {\n        if (!this.mirror)\n            this.mirror = [];\n        this.mirror.push(n, m);\n    }\n    /**\n    Append the inverse of the given mapping to this one.\n    */\n    appendMappingInverted(mapping) {\n        for (let i = mapping.maps.length - 1, totalSize = this._maps.length + mapping._maps.length; i >= 0; i--) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping._maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n        }\n    }\n    /**\n    Create an inverted version of this mapping.\n    */\n    invert() {\n        let inverse = new Mapping;\n        inverse.appendMappingInverted(this);\n        return inverse;\n    }\n    /**\n    Map a position through this mapping.\n    */\n    map(pos, assoc = 1) {\n        if (this.mirror)\n            return this._map(pos, assoc, true);\n        for (let i = this.from; i < this.to; i++)\n            pos = this._maps[i].map(pos, assoc);\n        return pos;\n    }\n    /**\n    Map a position through this mapping, returning a mapping\n    result.\n    */\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let delInfo = 0;\n        for (let i = this.from; i < this.to; i++) {\n            let map = this._maps[i], result = map.mapResult(pos, assoc);\n            if (result.recover != null) {\n                let corr = this.getMirror(i);\n                if (corr != null && corr > i && corr < this.to) {\n                    i = corr;\n                    pos = this._maps[corr].recover(result.recover);\n                    continue;\n                }\n            }\n            delInfo |= result.delInfo;\n            pos = result.pos;\n        }\n        return simple ? pos : new MapResult(pos, delInfo, null);\n    }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n    /**\n    Get the step map that represents the changes made by this step,\n    and which can be used to transform between positions in the old\n    and the new document.\n    */\n    getMap() { return StepMap.empty; }\n    /**\n    Try to merge this step with another one, to be applied directly\n    after it. Returns the merged step when possible, null if the\n    steps can't be merged.\n    */\n    merge(other) { return null; }\n    /**\n    Deserialize a step from its JSON representation. Will call\n    through to the step class' own implementation of this method.\n    */\n    static fromJSON(schema, json) {\n        if (!json || !json.stepType)\n            throw new RangeError(\"Invalid input for Step.fromJSON\");\n        let type = stepsByID[json.stepType];\n        if (!type)\n            throw new RangeError(`No step type ${json.stepType} defined`);\n        return type.fromJSON(schema, json);\n    }\n    /**\n    To be able to serialize steps to JSON, each step needs a string\n    ID to attach to its JSON representation. Use this method to\n    register an ID for your step classes. Try to pick something\n    that's unlikely to clash with steps from other modules.\n    */\n    static jsonID(id, stepClass) {\n        if (id in stepsByID)\n            throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n        stepsByID[id] = stepClass;\n        stepClass.prototype.jsonID = id;\n        return stepClass;\n    }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The transformed document, if successful.\n    */\n    doc, \n    /**\n    The failure message, if unsuccessful.\n    */\n    failed) {\n        this.doc = doc;\n        this.failed = failed;\n    }\n    /**\n    Create a successful step result.\n    */\n    static ok(doc) { return new StepResult(doc, null); }\n    /**\n    Create a failed step result.\n    */\n    static fail(message) { return new StepResult(null, message); }\n    /**\n    Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n    arguments. Create a successful result if it succeeds, and a\n    failed one if it throws a `ReplaceError`.\n    */\n    static fromReplace(doc, from, to, slice) {\n        try {\n            return StepResult.ok(doc.replace(from, to, slice));\n        }\n        catch (e) {\n            if (e instanceof ReplaceError)\n                return StepResult.fail(e.message);\n            throw e;\n        }\n    }\n}\n\nfunction mapFragment(fragment, f, parent) {\n    let mapped = [];\n    for (let i = 0; i < fragment.childCount; i++) {\n        let child = fragment.child(i);\n        if (child.content.size)\n            child = child.copy(mapFragment(child.content, f, child));\n        if (child.isInline)\n            child = f(child, parent, i);\n        mapped.push(child);\n    }\n    return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n    /**\n    Create a mark step.\n    */\n    constructor(\n    /**\n    The start of the marked range.\n    */\n    from, \n    /**\n    The end of the marked range.\n    */\n    to, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n        let parent = $from.node($from.sharedDepth(this.to));\n        let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n            if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n                return node;\n            return node.mark(this.mark.addToSet(node.marks));\n        }, parent), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new RemoveMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new AddMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof AddMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"addMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n        return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The start of the unmarked range.\n    */\n    from, \n    /**\n    The end of the unmarked range.\n    */\n    to, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to);\n        let slice = new Slice(mapFragment(oldSlice.content, node => {\n            return node.mark(this.mark.removeFromSet(node.marks));\n        }, doc), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new AddMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new RemoveMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof RemoveMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n        return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n    /**\n    Create a node mark step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (node) {\n            let newSet = this.mark.addToSet(node.marks);\n            if (newSet.length == node.marks.length) {\n                for (let i = 0; i < node.marks.length; i++)\n                    if (!node.marks[i].isInSet(newSet))\n                        return new AddNodeMarkStep(this.pos, node.marks[i]);\n                return new AddNodeMarkStep(this.pos, this.mark);\n            }\n        }\n        return new RemoveNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n        return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node || !this.mark.isInSet(node.marks))\n            return this;\n        return new AddNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n        return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n    /**\n    The given `slice` should fit the 'gap' between `from` and\n    `to`—the depths must line up, and the surrounding nodes must be\n    able to be joined with the open sides of the slice. When\n    `structure` is true, the step will fail if the content between\n    from and to is not just a sequence of closing and then opening\n    tokens (this is to guard against rebased replace steps\n    overwriting something they weren't supposed to).\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.slice = slice;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && contentBetween(doc, this.from, this.to))\n            return StepResult.fail(\"Structure replace would overwrite content\");\n        return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n    }\n    getMap() {\n        return new StepMap([this.from, this.to - this.from, this.slice.size]);\n    }\n    invert(doc) {\n        return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n    }\n    map(mapping) {\n        let to = mapping.mapResult(this.to, -1);\n        let from = this.from == this.to && ReplaceStep.MAP_BIAS < 0 ? to : mapping.mapResult(this.from, 1);\n        if (from.deletedAcross && to.deletedAcross)\n            return null;\n        return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice, this.structure);\n    }\n    merge(other) {\n        if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n            return null;\n        if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n            return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n        }\n        else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n            return new ReplaceStep(other.from, this.to, slice, this.structure);\n        }\n        else {\n            return null;\n        }\n    }\n    toJSON() {\n        let json = { stepType: \"replace\", from: this.from, to: this.to };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n        return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n    }\n}\n/**\nBy default, for backwards compatibility, an inserting step\nmapped over an insertion at that same position fill move after\nthe inserted content. In a collaborative editing situation, that\ncan make redone insertions appear in unexpected places. You can\nset this to -1 to make such mapping keep the step before the\ninsertion instead.\n*/\nReplaceStep.MAP_BIAS = 1;\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n    /**\n    Create a replace-around step with the given range and gap.\n    `insert` should be the point in the slice into which the content\n    of the gap should be moved. `structure` has the same meaning as\n    it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The start of preserved range.\n    */\n    gapFrom, \n    /**\n    The end of preserved range.\n    */\n    gapTo, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    The position in the slice where the preserved range should be\n    inserted.\n    */\n    insert, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.gapFrom = gapFrom;\n        this.gapTo = gapTo;\n        this.slice = slice;\n        this.insert = insert;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n            contentBetween(doc, this.gapTo, this.to)))\n            return StepResult.fail(\"Structure gap-replace would overwrite content\");\n        let gap = doc.slice(this.gapFrom, this.gapTo);\n        if (gap.openStart || gap.openEnd)\n            return StepResult.fail(\"Gap is not a flat range\");\n        let inserted = this.slice.insertAt(this.insert, gap.content);\n        if (!inserted)\n            return StepResult.fail(\"Content does not fit in gap\");\n        return StepResult.fromReplace(doc, this.from, this.to, inserted);\n    }\n    getMap() {\n        return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n            this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n    }\n    invert(doc) {\n        let gap = this.gapTo - this.gapFrom;\n        return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        let gapFrom = this.from == this.gapFrom ? from.pos : mapping.map(this.gapFrom, -1);\n        let gapTo = this.to == this.gapTo ? to.pos : mapping.map(this.gapTo, 1);\n        if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n            return null;\n        return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n    }\n    toJSON() {\n        let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n            gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n            typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n        return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n    }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n    let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n    while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n        depth--;\n        dist--;\n    }\n    if (dist > 0) {\n        let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n        while (dist > 0) {\n            if (!next || next.isLeaf)\n                return true;\n            next = next.firstChild;\n            dist--;\n        }\n    }\n    return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n    let removed = [], added = [];\n    let removing, adding;\n    tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n        if (!node.isInline)\n            return;\n        let marks = node.marks;\n        if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n            let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n            let newSet = mark.addToSet(marks);\n            for (let i = 0; i < marks.length; i++) {\n                if (!marks[i].isInSet(newSet)) {\n                    if (removing && removing.to == start && removing.mark.eq(marks[i]))\n                        removing.to = end;\n                    else\n                        removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n                }\n            }\n            if (adding && adding.to == start)\n                adding.to = end;\n            else\n                added.push(adding = new AddMarkStep(start, end, mark));\n        }\n    });\n    removed.forEach(s => tr.step(s));\n    added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n    let matched = [], step = 0;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isInline)\n            return;\n        step++;\n        let toRemove = null;\n        if (mark instanceof MarkType) {\n            let set = node.marks, found;\n            while (found = mark.isInSet(set)) {\n                (toRemove || (toRemove = [])).push(found);\n                set = found.removeFromSet(set);\n            }\n        }\n        else if (mark) {\n            if (mark.isInSet(node.marks))\n                toRemove = [mark];\n        }\n        else {\n            toRemove = node.marks;\n        }\n        if (toRemove && toRemove.length) {\n            let end = Math.min(pos + node.nodeSize, to);\n            for (let i = 0; i < toRemove.length; i++) {\n                let style = toRemove[i], found;\n                for (let j = 0; j < matched.length; j++) {\n                    let m = matched[j];\n                    if (m.step == step - 1 && style.eq(matched[j].style))\n                        found = m;\n                }\n                if (found) {\n                    found.to = end;\n                    found.step = step;\n                }\n                else {\n                    matched.push({ style, from: Math.max(pos, from), to: end, step });\n                }\n            }\n        }\n    });\n    matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch, clearNewlines = true) {\n    let node = tr.doc.nodeAt(pos);\n    let replSteps = [], cur = pos + 1;\n    for (let i = 0; i < node.childCount; i++) {\n        let child = node.child(i), end = cur + child.nodeSize;\n        let allowed = match.matchType(child.type);\n        if (!allowed) {\n            replSteps.push(new ReplaceStep(cur, end, Slice.empty));\n        }\n        else {\n            match = allowed;\n            for (let j = 0; j < child.marks.length; j++)\n                if (!parentType.allowsMarkType(child.marks[j].type))\n                    tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n            if (clearNewlines && child.isText && parentType.whitespace != \"pre\") {\n                let m, newline = /\\r?\\n|\\r/g, slice;\n                while (m = newline.exec(child.text)) {\n                    if (!slice)\n                        slice = new Slice(Fragment.from(parentType.schema.text(\" \", parentType.allowedMarks(child.marks))), 0, 0);\n                    replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice));\n                }\n            }\n        }\n        cur = end;\n    }\n    if (!match.validEnd) {\n        let fill = match.fillBefore(Fragment.empty, true);\n        tr.replace(cur, cur, new Slice(fill, 0, 0));\n    }\n    for (let i = replSteps.length - 1; i >= 0; i--)\n        tr.step(replSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n    return (start == 0 || node.canReplace(start, node.childCount)) &&\n        (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n    let parent = range.parent;\n    let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n    for (let depth = range.depth, contentBefore = 0, contentAfter = 0;; --depth) {\n        let node = range.$from.node(depth);\n        let index = range.$from.index(depth) + contentBefore, endIndex = range.$to.indexAfter(depth) - contentAfter;\n        if (depth < range.depth && node.canReplace(index, endIndex, content))\n            return depth;\n        if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n            break;\n        if (index)\n            contentBefore = 1;\n        if (endIndex < node.childCount)\n            contentAfter = 1;\n    }\n    return null;\n}\nfunction lift(tr, range, target) {\n    let { $from, $to, depth } = range;\n    let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n    let start = gapStart, end = gapEnd;\n    let before = Fragment.empty, openStart = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $from.index(d) > 0) {\n            splitting = true;\n            before = Fragment.from($from.node(d).copy(before));\n            openStart++;\n        }\n        else {\n            start--;\n        }\n    let after = Fragment.empty, openEnd = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $to.after(d + 1) < $to.end(d)) {\n            splitting = true;\n            after = Fragment.from($to.node(d).copy(after));\n            openEnd++;\n        }\n        else {\n            end++;\n        }\n    tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n    let around = findWrappingOutside(range, nodeType);\n    let inner = around && findWrappingInside(innerRange, nodeType);\n    if (!inner)\n        return null;\n    return around.map(withAttrs)\n        .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let around = parent.contentMatchAt(startIndex).findWrapping(type);\n    if (!around)\n        return null;\n    let outer = around.length ? around[0] : type;\n    return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let inner = parent.child(startIndex);\n    let inside = type.contentMatch.findWrapping(inner.type);\n    if (!inside)\n        return null;\n    let lastType = inside.length ? inside[inside.length - 1] : type;\n    let innerMatch = lastType.contentMatch;\n    for (let i = startIndex; innerMatch && i < endIndex; i++)\n        innerMatch = innerMatch.matchType(parent.child(i).type);\n    if (!innerMatch || !innerMatch.validEnd)\n        return null;\n    return inside;\n}\nfunction wrap(tr, range, wrappers) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--) {\n        if (content.size) {\n            let match = wrappers[i].type.contentMatch.matchFragment(content);\n            if (!match || !match.validEnd)\n                throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n        }\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    }\n    let start = range.start, end = range.end;\n    tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n    if (!type.isTextblock)\n        throw new RangeError(\"Type given to setBlockType should be a textblock\");\n    let mapFrom = tr.steps.length;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        let attrsHere = typeof attrs == \"function\" ? attrs(node) : attrs;\n        if (node.isTextblock && !node.hasMarkup(type, attrsHere) &&\n            canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n            let convertNewlines = null;\n            if (type.schema.linebreakReplacement) {\n                let pre = type.whitespace == \"pre\", supportLinebreak = !!type.contentMatch.matchType(type.schema.linebreakReplacement);\n                if (pre && !supportLinebreak)\n                    convertNewlines = false;\n                else if (!pre && supportLinebreak)\n                    convertNewlines = true;\n            }\n            // Ensure all markup that isn't allowed in the new node type is cleared\n            if (convertNewlines === false)\n                replaceLinebreaks(tr, node, pos, mapFrom);\n            clearIncompatible(tr, tr.mapping.slice(mapFrom).map(pos, 1), type, undefined, convertNewlines === null);\n            let mapping = tr.mapping.slice(mapFrom);\n            let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n            tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrsHere, null, node.marks)), 0, 0), 1, true));\n            if (convertNewlines === true)\n                replaceNewlines(tr, node, pos, mapFrom);\n            return false;\n        }\n    });\n}\nfunction replaceNewlines(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.isText) {\n            let m, newline = /\\r?\\n|\\r/g;\n            while (m = newline.exec(child.text)) {\n                let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset + m.index);\n                tr.replaceWith(start, start + 1, node.type.schema.linebreakReplacement.create());\n            }\n        }\n    });\n}\nfunction replaceLinebreaks(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.type == child.type.schema.linebreakReplacement) {\n            let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset);\n            tr.replaceWith(start, start + 1, node.type.schema.text(\"\\n\"));\n        }\n    });\n}\nfunction canChangeType(doc, pos, type) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n    let node = tr.doc.nodeAt(pos);\n    if (!node)\n        throw new RangeError(\"No node at given position\");\n    if (!type)\n        type = node.type;\n    let newNode = type.create(attrs, null, marks || node.marks);\n    if (node.isLeaf)\n        return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n    if (!type.validContent(node.content))\n        throw new RangeError(\"Invalid content for node type \" + type.name);\n    tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n    let $pos = doc.resolve(pos), base = $pos.depth - depth;\n    let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n    if (base < 0 || $pos.parent.type.spec.isolating ||\n        !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n        !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n        return false;\n    for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n        let node = $pos.node(d), index = $pos.index(d);\n        if (node.type.spec.isolating)\n            return false;\n        let rest = node.content.cutByIndex(index, node.childCount);\n        let overrideChild = typesAfter && typesAfter[i + 1];\n        if (overrideChild)\n            rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));\n        let after = (typesAfter && typesAfter[i]) || node;\n        if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n            return false;\n    }\n    let index = $pos.indexAfter(base);\n    let baseType = typesAfter && typesAfter[0];\n    return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n    let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n    for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n        before = Fragment.from($pos.node(d).copy(before));\n        let typeAfter = typesAfter && typesAfter[i];\n        after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n    }\n    tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n        $pos.parent.canReplace(index, index + 1);\n}\nfunction canAppendWithSubstitutedLinebreaks(a, b) {\n    if (!b.content.size)\n        a.type.compatibleContent(b.type);\n    let match = a.contentMatchAt(a.childCount);\n    let { linebreakReplacement } = a.type.schema;\n    for (let i = 0; i < b.childCount; i++) {\n        let child = b.child(i);\n        let type = child.type == linebreakReplacement ? a.type.schema.nodes.text : child.type;\n        match = match.matchType(type);\n        if (!match)\n            return false;\n        if (!a.type.allowsMarks(child.marks))\n            return false;\n    }\n    return match.validEnd;\n}\nfunction joinable(a, b) {\n    return !!(a && b && !a.isLeaf && canAppendWithSubstitutedLinebreaks(a, b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n    let $pos = doc.resolve(pos);\n    for (let d = $pos.depth;; d--) {\n        let before, after, index = $pos.index(d);\n        if (d == $pos.depth) {\n            before = $pos.nodeBefore;\n            after = $pos.nodeAfter;\n        }\n        else if (dir > 0) {\n            before = $pos.node(d + 1);\n            index++;\n            after = $pos.node(d).maybeChild(index);\n        }\n        else {\n            before = $pos.node(d).maybeChild(index - 1);\n            after = $pos.node(d + 1);\n        }\n        if (before && !before.isTextblock && joinable(before, after) &&\n            $pos.node(d).canReplace(index, index + 1))\n            return pos;\n        if (d == 0)\n            break;\n        pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n    }\n}\nfunction join(tr, pos, depth) {\n    let convertNewlines = null;\n    let { linebreakReplacement } = tr.doc.type.schema;\n    let $before = tr.doc.resolve(pos - depth), beforeType = $before.node().type;\n    if (linebreakReplacement && beforeType.inlineContent) {\n        let pre = beforeType.whitespace == \"pre\";\n        let supportLinebreak = !!beforeType.contentMatch.matchType(linebreakReplacement);\n        if (pre && !supportLinebreak)\n            convertNewlines = false;\n        else if (!pre && supportLinebreak)\n            convertNewlines = true;\n    }\n    let mapFrom = tr.steps.length;\n    if (convertNewlines === false) {\n        let $after = tr.doc.resolve(pos + depth);\n        replaceLinebreaks(tr, $after.node(), $after.before(), mapFrom);\n    }\n    if (beforeType.inlineContent)\n        clearIncompatible(tr, pos + depth - 1, beforeType, $before.node().contentMatchAt($before.index()), convertNewlines == null);\n    let mapping = tr.mapping.slice(mapFrom), start = mapping.map(pos - depth);\n    tr.step(new ReplaceStep(start, mapping.map(pos + depth, -1), Slice.empty, true));\n    if (convertNewlines === true) {\n        let $full = tr.doc.resolve(start);\n        replaceNewlines(tr, $full.node(), $full.before(), tr.steps.length);\n    }\n    return tr;\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n    let $pos = doc.resolve(pos);\n    if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n        return pos;\n    if ($pos.parentOffset == 0)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.index(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.before(d + 1);\n            if (index > 0)\n                return null;\n        }\n    if ($pos.parentOffset == $pos.parent.content.size)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.indexAfter(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.after(d + 1);\n            if (index < $pos.node(d).childCount)\n                return null;\n        }\n    return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n    let $pos = doc.resolve(pos);\n    if (!slice.content.size)\n        return pos;\n    let content = slice.content;\n    for (let i = 0; i < slice.openStart; i++)\n        content = content.firstChild.content;\n    for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n        for (let d = $pos.depth; d >= 0; d--) {\n            let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n            let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n            let parent = $pos.node(d), fits = false;\n            if (pass == 1) {\n                fits = parent.canReplace(insertPos, insertPos, content);\n            }\n            else {\n                let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n                fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n            }\n            if (fits)\n                return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n        }\n    }\n    return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n    if (from == to && !slice.size)\n        return null;\n    let $from = doc.resolve(from), $to = doc.resolve(to);\n    // Optimization -- avoid work if it's obvious that it's not needed.\n    if (fitsTrivially($from, $to, slice))\n        return new ReplaceStep(from, to, slice);\n    return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n    return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n        $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n//  - `frontier` holds a stack of `{type, match}` objects that\n//    represent the open side of the replacement. It starts at\n//    `$from`, then moves forward as content is placed, and is finally\n//    reconciled with `$to`.\n//\n//  - `unplaced` is a slice that represents the content that hasn't\n//    been placed yet.\n//\n//  - `placed` is a fragment of placed content. Its open-start value\n//    is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n    constructor($from, $to, unplaced) {\n        this.$from = $from;\n        this.$to = $to;\n        this.unplaced = unplaced;\n        this.frontier = [];\n        this.placed = Fragment.empty;\n        for (let i = 0; i <= $from.depth; i++) {\n            let node = $from.node(i);\n            this.frontier.push({\n                type: node.type,\n                match: node.contentMatchAt($from.indexAfter(i))\n            });\n        }\n        for (let i = $from.depth; i > 0; i--)\n            this.placed = Fragment.from($from.node(i).copy(this.placed));\n    }\n    get depth() { return this.frontier.length - 1; }\n    fit() {\n        // As long as there's unplaced content, try to place some of it.\n        // If that fails, either increase the open score of the unplaced\n        // slice, or drop nodes from it, and then try again.\n        while (this.unplaced.size) {\n            let fit = this.findFittable();\n            if (fit)\n                this.placeNodes(fit);\n            else\n                this.openMore() || this.dropNode();\n        }\n        // When there's inline content directly after the frontier _and_\n        // directly after `this.$to`, we must generate a `ReplaceAround`\n        // step that pulls that content into the node after the frontier.\n        // That means the fitting must be done to the end of the textblock\n        // node after `this.$to`, not `this.$to` itself.\n        let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n        let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n        if (!$to)\n            return null;\n        // If closing to `$to` succeeded, create a step\n        let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n        while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n            content = content.firstChild.content;\n            openStart--;\n            openEnd--;\n        }\n        let slice = new Slice(content, openStart, openEnd);\n        if (moveInline > -1)\n            return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n        if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n            return new ReplaceStep($from.pos, $to.pos, slice);\n        return null;\n    }\n    // Find a position on the start spine of `this.unplaced` that has\n    // content that can be moved somewhere on the frontier. Returns two\n    // depths, one for the slice and one for the frontier.\n    findFittable() {\n        let startDepth = this.unplaced.openStart;\n        for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n            let node = cur.firstChild;\n            if (cur.childCount > 1)\n                openEnd = 0;\n            if (node.type.spec.isolating && openEnd <= d) {\n                startDepth = d;\n                break;\n            }\n            cur = node.content;\n        }\n        // Only try wrapping nodes (pass 2) after finding a place without\n        // wrapping failed.\n        for (let pass = 1; pass <= 2; pass++) {\n            for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n                let fragment, parent = null;\n                if (sliceDepth) {\n                    parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n                    fragment = parent.content;\n                }\n                else {\n                    fragment = this.unplaced.content;\n                }\n                let first = fragment.firstChild;\n                for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n                    let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n                    // In pass 1, if the next node matches, or there is no next\n                    // node but the parents look compatible, we've found a\n                    // place.\n                    if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n                        : parent && type.compatibleContent(parent.type)))\n                        return { sliceDepth, frontierDepth, parent, inject };\n                    // In pass 2, look for a set of wrapping nodes that make\n                    // `first` fit here.\n                    else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n                        return { sliceDepth, frontierDepth, parent, wrap };\n                    // Don't continue looking further up if the parent node\n                    // would fit here.\n                    if (parent && match.matchType(parent.type))\n                        break;\n                }\n            }\n        }\n    }\n    openMore() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (!inner.childCount || inner.firstChild.isLeaf)\n            return false;\n        this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n        return true;\n    }\n    dropNode() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (inner.childCount <= 1 && openStart > 0) {\n            let openAtEnd = content.size - openStart <= openStart + inner.size;\n            this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n        }\n        else {\n            this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n        }\n    }\n    // Move content from the unplaced slice at `sliceDepth` to the\n    // frontier node at `frontierDepth`. Close that frontier node when\n    // applicable.\n    placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n        while (this.depth > frontierDepth)\n            this.closeFrontierNode();\n        if (wrap)\n            for (let i = 0; i < wrap.length; i++)\n                this.openFrontierNode(wrap[i]);\n        let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n        let openStart = slice.openStart - sliceDepth;\n        let taken = 0, add = [];\n        let { match, type } = this.frontier[frontierDepth];\n        if (inject) {\n            for (let i = 0; i < inject.childCount; i++)\n                add.push(inject.child(i));\n            match = match.matchFragment(inject);\n        }\n        // Computes the amount of (end) open nodes at the end of the\n        // fragment. When 0, the parent is open, but no more. When\n        // negative, nothing is open.\n        let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n        // Scan over the fragment, fitting as many child nodes as\n        // possible.\n        while (taken < fragment.childCount) {\n            let next = fragment.child(taken), matches = match.matchType(next.type);\n            if (!matches)\n                break;\n            taken++;\n            if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n                match = matches;\n                add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n            }\n        }\n        let toEnd = taken == fragment.childCount;\n        if (!toEnd)\n            openEndCount = -1;\n        this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n        this.frontier[frontierDepth].match = match;\n        // If the parent types match, and the entire node was moved, and\n        // it's not open, close this frontier node right away.\n        if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n            this.closeFrontierNode();\n        // Add new frontier nodes for any open nodes at the end.\n        for (let i = 0, cur = fragment; i < openEndCount; i++) {\n            let node = cur.lastChild;\n            this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n            cur = node.content;\n        }\n        // Update `this.unplaced`. Drop the entire node from which we\n        // placed it we got to its end, otherwise just drop the placed\n        // nodes.\n        this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n            : sliceDepth == 0 ? Slice.empty\n                : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n    }\n    mustMoveInline() {\n        if (!this.$to.parent.isTextblock)\n            return -1;\n        let top = this.frontier[this.depth], level;\n        if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n            (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n            return -1;\n        let { depth } = this.$to, after = this.$to.after(depth);\n        while (depth > 1 && after == this.$to.end(--depth))\n            ++after;\n        return after;\n    }\n    findCloseLevel($to) {\n        scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n            let { match, type } = this.frontier[i];\n            let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n            let fit = contentAfterFits($to, i, type, match, dropInner);\n            if (!fit)\n                continue;\n            for (let d = i - 1; d >= 0; d--) {\n                let { match, type } = this.frontier[d];\n                let matches = contentAfterFits($to, d, type, match, true);\n                if (!matches || matches.childCount)\n                    continue scan;\n            }\n            return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n        }\n    }\n    close($to) {\n        let close = this.findCloseLevel($to);\n        if (!close)\n            return null;\n        while (this.depth > close.depth)\n            this.closeFrontierNode();\n        if (close.fit.childCount)\n            this.placed = addToFragment(this.placed, close.depth, close.fit);\n        $to = close.move;\n        for (let d = close.depth + 1; d <= $to.depth; d++) {\n            let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n            this.openFrontierNode(node.type, node.attrs, add);\n        }\n        return $to;\n    }\n    openFrontierNode(type, attrs = null, content) {\n        let top = this.frontier[this.depth];\n        top.match = top.match.matchType(type);\n        this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n        this.frontier.push({ type, match: type.contentMatch });\n    }\n    closeFrontierNode() {\n        let open = this.frontier.pop();\n        let add = open.match.fillBefore(Fragment.empty, true);\n        if (add.childCount)\n            this.placed = addToFragment(this.placed, this.frontier.length, add);\n    }\n}\nfunction dropFromFragment(fragment, depth, count) {\n    if (depth == 0)\n        return fragment.cutByIndex(count, fragment.childCount);\n    return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n    if (depth == 0)\n        return fragment.append(content);\n    return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n    for (let i = 0; i < depth; i++)\n        fragment = fragment.firstChild.content;\n    return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n    if (openStart <= 0)\n        return node;\n    let frag = node.content;\n    if (openStart > 1)\n        frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n    if (openStart > 0) {\n        frag = node.type.contentMatch.fillBefore(frag).append(frag);\n        if (openEnd <= 0)\n            frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n    }\n    return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n    let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n    if (index == node.childCount && !type.compatibleContent(node.type))\n        return null;\n    let fit = match.fillBefore(node.content, true, index);\n    return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n    for (let i = start; i < fragment.childCount; i++)\n        if (!type.allowsMarks(fragment.child(i).marks))\n            return true;\n    return false;\n}\nfunction definesContent(type) {\n    return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n    if (!slice.size)\n        return tr.deleteRange(from, to);\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    if (fitsTrivially($from, $to, slice))\n        return tr.step(new ReplaceStep(from, to, slice));\n    let targetDepths = coveredDepths($from, $to);\n    // Can't replace the whole document, so remove 0 if it's present\n    if (targetDepths[targetDepths.length - 1] == 0)\n        targetDepths.pop();\n    // Negative numbers represent not expansion over the whole node at\n    // that depth, but replacing from $from.before(-D) to $to.pos.\n    let preferredTarget = -($from.depth + 1);\n    targetDepths.unshift(preferredTarget);\n    // This loop picks a preferred target depth, if one of the covering\n    // depths is not outside of a defining node, and adds negative\n    // depths for any depth that has $from at its start and does not\n    // cross a defining node.\n    for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n        let spec = $from.node(d).type.spec;\n        if (spec.defining || spec.definingAsContext || spec.isolating)\n            break;\n        if (targetDepths.indexOf(d) > -1)\n            preferredTarget = d;\n        else if ($from.before(d) == pos)\n            targetDepths.splice(1, 0, -d);\n    }\n    // Try to fit each possible depth of the slice into each possible\n    // target depth, starting with the preferred depths.\n    let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n    let leftNodes = [], preferredDepth = slice.openStart;\n    for (let content = slice.content, i = 0;; i++) {\n        let node = content.firstChild;\n        leftNodes.push(node);\n        if (i == slice.openStart)\n            break;\n        content = node.content;\n    }\n    // Back up preferredDepth to cover defining textblocks directly\n    // above it, possibly skipping a non-defining textblock.\n    for (let d = preferredDepth - 1; d >= 0; d--) {\n        let leftNode = leftNodes[d], def = definesContent(leftNode.type);\n        if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1)))\n            preferredDepth = d;\n        else if (def || !leftNode.type.isTextblock)\n            break;\n    }\n    for (let j = slice.openStart; j >= 0; j--) {\n        let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n        let insert = leftNodes[openDepth];\n        if (!insert)\n            continue;\n        for (let i = 0; i < targetDepths.length; i++) {\n            // Loop over possible expansion levels, starting with the\n            // preferred one\n            let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n            if (targetDepth < 0) {\n                expand = false;\n                targetDepth = -targetDepth;\n            }\n            let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n            if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n                return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n        }\n    }\n    let startSteps = tr.steps.length;\n    for (let i = targetDepths.length - 1; i >= 0; i--) {\n        tr.replace(from, to, slice);\n        if (tr.steps.length > startSteps)\n            break;\n        let depth = targetDepths[i];\n        if (depth < 0)\n            continue;\n        from = $from.before(depth);\n        to = $to.after(depth);\n    }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n    if (depth < oldOpen) {\n        let first = fragment.firstChild;\n        fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n    }\n    if (depth > newOpen) {\n        let match = parent.contentMatchAt(0);\n        let start = match.fillBefore(fragment).append(fragment);\n        fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n    }\n    return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n    if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n        let point = insertPoint(tr.doc, from, node.type);\n        if (point != null)\n            from = to = point;\n    }\n    tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    // When the deleted range spans from the start of one textblock to\n    // the start of another one, move out of the start of both blocks.\n    if ($from.parent.isTextblock && $to.parent.isTextblock && $from.start() != $to.start() &&\n        $from.parentOffset == 0 && $to.parentOffset == 0) {\n        let shared = $from.sharedDepth(to), isolated = false;\n        for (let d = $from.depth; d > shared; d--)\n            if ($from.node(d).type.spec.isolating)\n                isolated = true;\n        for (let d = $to.depth; d > shared; d--)\n            if ($to.node(d).type.spec.isolating)\n                isolated = true;\n        if (!isolated) {\n            for (let d = $from.depth; d > 0 && from == $from.start(d); d--)\n                from = $from.before(d);\n            for (let d = $to.depth; d > 0 && to == $to.start(d); d--)\n                to = $to.before(d);\n            $from = tr.doc.resolve(from);\n            $to = tr.doc.resolve(to);\n        }\n    }\n    let covered = coveredDepths($from, $to);\n    for (let i = 0; i < covered.length; i++) {\n        let depth = covered[i], last = i == covered.length - 1;\n        if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n            return tr.delete($from.start(depth), $to.end(depth));\n        if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n            return tr.delete($from.before(depth), $to.after(depth));\n    }\n    for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n        if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d &&\n            $from.start(d - 1) == $to.start(d - 1) && $from.node(d - 1).canReplace($from.index(d - 1), $to.index(d - 1)))\n            return tr.delete($from.before(d), to);\n    }\n    tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n    let result = [], minDepth = Math.min($from.depth, $to.depth);\n    for (let d = minDepth; d >= 0; d--) {\n        let start = $from.start(d);\n        if (start < $from.pos - ($from.depth - d) ||\n            $to.end(d) > $to.pos + ($to.depth - d) ||\n            $from.node(d).type.spec.isolating ||\n            $to.node(d).type.spec.isolating)\n            break;\n        if (start == $to.start(d) ||\n            (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n                d && $to.start(d - 1) == start - 1))\n            result.push(d);\n    }\n    return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.pos = pos;\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at attribute step's position\");\n        let attrs = Object.create(null);\n        for (let name in node.attrs)\n            attrs[name] = node.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = node.type.create(attrs, null, node.marks);\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n    }\n    toJSON() {\n        return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n        return new AttrStep(json.pos, json.attr, json.value);\n    }\n}\nStep.jsonID(\"attr\", AttrStep);\n/**\nUpdate an attribute in the doc node.\n*/\nclass DocAttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let attrs = Object.create(null);\n        for (let name in doc.attrs)\n            attrs[name] = doc.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = doc.type.create(attrs, doc.content, doc.marks);\n        return StepResult.ok(updated);\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new DocAttrStep(this.attr, doc.attrs[this.attr]);\n    }\n    map(mapping) {\n        return this;\n    }\n    toJSON() {\n        return { stepType: \"docAttr\", attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for DocAttrStep.fromJSON\");\n        return new DocAttrStep(json.attr, json.value);\n    }\n}\nStep.jsonID(\"docAttr\", DocAttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n    let err = Error.call(this, message);\n    err.__proto__ = TransformError.prototype;\n    return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n    /**\n    Create a transform that starts with the given document.\n    */\n    constructor(\n    /**\n    The current document (the result of applying the steps in the\n    transform).\n    */\n    doc) {\n        this.doc = doc;\n        /**\n        The steps in this transform.\n        */\n        this.steps = [];\n        /**\n        The documents before each of the steps.\n        */\n        this.docs = [];\n        /**\n        A mapping with the maps for each of the steps in this transform.\n        */\n        this.mapping = new Mapping;\n    }\n    /**\n    The starting document.\n    */\n    get before() { return this.docs.length ? this.docs[0] : this.doc; }\n    /**\n    Apply a new step in this transform, saving the result. Throws an\n    error when the step fails.\n    */\n    step(step) {\n        let result = this.maybeStep(step);\n        if (result.failed)\n            throw new TransformError(result.failed);\n        return this;\n    }\n    /**\n    Try to apply a step in this transformation, ignoring it if it\n    fails. Returns the step result.\n    */\n    maybeStep(step) {\n        let result = step.apply(this.doc);\n        if (!result.failed)\n            this.addStep(step, result.doc);\n        return result;\n    }\n    /**\n    True when the document has been changed (when there are any\n    steps).\n    */\n    get docChanged() {\n        return this.steps.length > 0;\n    }\n    /**\n    Return a single range, in post-transform document positions,\n    that covers all content changed by this transform. Returns null\n    if no replacements are made. Note that this will ignore changes\n    that add/remove marks without replacing the underlying content.\n    */\n    changedRange() {\n        let from = 1e9, to = -1e9;\n        for (let i = 0; i < this.mapping.maps.length; i++) {\n            let map = this.mapping.maps[i];\n            if (i) {\n                from = map.map(from, 1);\n                to = map.map(to, -1);\n            }\n            map.forEach((_f, _t, fromB, toB) => {\n                from = Math.min(from, fromB);\n                to = Math.max(to, toB);\n            });\n        }\n        return from == 1e9 ? null : { from, to };\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        this.docs.push(this.doc);\n        this.steps.push(step);\n        this.mapping.appendMap(step.getMap());\n        this.doc = doc;\n    }\n    /**\n    Replace the part of the document between `from` and `to` with the\n    given `slice`.\n    */\n    replace(from, to = from, slice = Slice.empty) {\n        let step = replaceStep(this.doc, from, to, slice);\n        if (step)\n            this.step(step);\n        return this;\n    }\n    /**\n    Replace the given range with the given content, which may be a\n    fragment, node, or array of nodes.\n    */\n    replaceWith(from, to, content) {\n        return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n    }\n    /**\n    Delete the content between the given positions.\n    */\n    delete(from, to) {\n        return this.replace(from, to, Slice.empty);\n    }\n    /**\n    Insert the given content at the given position.\n    */\n    insert(pos, content) {\n        return this.replaceWith(pos, pos, content);\n    }\n    /**\n    Replace a range of the document with a given slice, using\n    `from`, `to`, and the slice's\n    [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n    than fixed start and end points. This method may grow the\n    replaced area or close open nodes in the slice in order to get a\n    fit that is more in line with WYSIWYG expectations, by dropping\n    fully covered parent nodes of the replaced region when they are\n    marked [non-defining as\n    context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n    open parent node from the slice that _is_ marked as [defining\n    its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n    \n    This is the method, for example, to handle paste. The similar\n    [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n    primitive tool which will _not_ move the start and end of its given\n    range, and is useful in situations where you need more precise\n    control over what happens.\n    */\n    replaceRange(from, to, slice) {\n        replaceRange(this, from, to, slice);\n        return this;\n    }\n    /**\n    Replace the given range with a node, but use `from` and `to` as\n    hints, rather than precise positions. When from and to are the same\n    and are at the start or end of a parent node in which the given\n    node doesn't fit, this method may _move_ them out towards a parent\n    that does allow the given node to be placed. When the given range\n    completely covers a parent node, this method may completely replace\n    that parent node.\n    */\n    replaceRangeWith(from, to, node) {\n        replaceRangeWith(this, from, to, node);\n        return this;\n    }\n    /**\n    Delete the given range, expanding it to cover fully covered\n    parent nodes until a valid replace is found.\n    */\n    deleteRange(from, to) {\n        deleteRange(this, from, to);\n        return this;\n    }\n    /**\n    Split the content in the given range off from its parent, if there\n    is sibling content before or after it, and move it up the tree to\n    the depth specified by `target`. You'll probably want to use\n    [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n    sure the lift is valid.\n    */\n    lift(range, target) {\n        lift(this, range, target);\n        return this;\n    }\n    /**\n    Join the blocks around the given position. If depth is 2, their\n    last and first siblings are also joined, and so on.\n    */\n    join(pos, depth = 1) {\n        join(this, pos, depth);\n        return this;\n    }\n    /**\n    Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n    The wrappers are assumed to be valid in this position, and should\n    probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n    */\n    wrap(range, wrappers) {\n        wrap(this, range, wrappers);\n        return this;\n    }\n    /**\n    Set the type of all textblocks (partly) between `from` and `to` to\n    the given node type with the given attributes.\n    */\n    setBlockType(from, to = from, type, attrs = null) {\n        setBlockType(this, from, to, type, attrs);\n        return this;\n    }\n    /**\n    Change the type, attributes, and/or marks of the node at `pos`.\n    When `type` isn't given, the existing node type is preserved,\n    */\n    setNodeMarkup(pos, type, attrs = null, marks) {\n        setNodeMarkup(this, pos, type, attrs, marks);\n        return this;\n    }\n    /**\n    Set a single attribute on a given node to a new value.\n    The `pos` addresses the document content. Use `setDocAttribute`\n    to set attributes on the document itself.\n    */\n    setNodeAttribute(pos, attr, value) {\n        this.step(new AttrStep(pos, attr, value));\n        return this;\n    }\n    /**\n    Set a single attribute on the document to a new value.\n    */\n    setDocAttribute(attr, value) {\n        this.step(new DocAttrStep(attr, value));\n        return this;\n    }\n    /**\n    Add a mark to the node at position `pos`.\n    */\n    addNodeMark(pos, mark) {\n        this.step(new AddNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Remove a mark (or all marks of the given type) from the node at\n    position `pos`.\n    */\n    removeNodeMark(pos, mark) {\n        let node = this.doc.nodeAt(pos);\n        if (!node)\n            throw new RangeError(\"No node at position \" + pos);\n        if (mark instanceof Mark) {\n            if (mark.isInSet(node.marks))\n                this.step(new RemoveNodeMarkStep(pos, mark));\n        }\n        else {\n            let set = node.marks, found, steps = [];\n            while (found = mark.isInSet(set)) {\n                steps.push(new RemoveNodeMarkStep(pos, found));\n                set = found.removeFromSet(set);\n            }\n            for (let i = steps.length - 1; i >= 0; i--)\n                this.step(steps[i]);\n        }\n        return this;\n    }\n    /**\n    Split the node at the given position, and optionally, if `depth` is\n    greater than one, any number of nodes above that. By default, the\n    parts split off will inherit the node type of the original node.\n    This can be changed by passing an array of types and attributes to\n    use after the split (with the outermost nodes coming first).\n    */\n    split(pos, depth = 1, typesAfter) {\n        split(this, pos, depth, typesAfter);\n        return this;\n    }\n    /**\n    Add the given mark to the inline content between `from` and `to`.\n    */\n    addMark(from, to, mark) {\n        addMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Remove marks from inline nodes between `from` and `to`. When\n    `mark` is a single mark, remove precisely that mark. When it is\n    a mark type, remove all marks of that type. When it is null,\n    remove all marks of any type.\n    */\n    removeMark(from, to, mark) {\n        removeMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Removes all marks and nodes from the content of the node at\n    `pos` that don't match the given new parent node type. Accepts\n    an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n    third argument.\n    */\n    clearIncompatible(pos, parentType, match) {\n        clearIncompatible(this, pos, parentType, match);\n        return this;\n    }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, DocAttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nconst classesById = Object.create(null);\n/**\nSuperclass for editor selections. Every selection type should\nextend this. Should not be instantiated directly.\n*/\nclass Selection {\n    /**\n    Initialize a selection with the head and anchor and ranges. If no\n    ranges are given, constructs a single range across `$anchor` and\n    `$head`.\n    */\n    constructor(\n    /**\n    The resolved anchor of the selection (the side that stays in\n    place when the selection is modified).\n    */\n    $anchor, \n    /**\n    The resolved head of the selection (the side that moves when\n    the selection is modified).\n    */\n    $head, ranges) {\n        this.$anchor = $anchor;\n        this.$head = $head;\n        this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n    }\n    /**\n    The selection's anchor, as an unresolved position.\n    */\n    get anchor() { return this.$anchor.pos; }\n    /**\n    The selection's head.\n    */\n    get head() { return this.$head.pos; }\n    /**\n    The lower bound of the selection's main range.\n    */\n    get from() { return this.$from.pos; }\n    /**\n    The upper bound of the selection's main range.\n    */\n    get to() { return this.$to.pos; }\n    /**\n    The resolved lower  bound of the selection's main range.\n    */\n    get $from() {\n        return this.ranges[0].$from;\n    }\n    /**\n    The resolved upper bound of the selection's main range.\n    */\n    get $to() {\n        return this.ranges[0].$to;\n    }\n    /**\n    Indicates whether the selection contains any content.\n    */\n    get empty() {\n        let ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++)\n            if (ranges[i].$from.pos != ranges[i].$to.pos)\n                return false;\n        return true;\n    }\n    /**\n    Get the content of this selection as a slice.\n    */\n    content() {\n        return this.$from.doc.slice(this.from, this.to, true);\n    }\n    /**\n    Replace the selection with a slice or, if no slice is given,\n    delete the selection. Will append to the given transaction.\n    */\n    replace(tr, content = Slice.empty) {\n        // Put the new selection at the position after the inserted\n        // content. When that ended in an inline node, search backwards,\n        // to get the position after that node. If not, search forward.\n        let lastNode = content.content.lastChild, lastParent = null;\n        for (let i = 0; i < content.openEnd; i++) {\n            lastParent = lastNode;\n            lastNode = lastNode.lastChild;\n        }\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content);\n            if (i == 0)\n                selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1);\n        }\n    }\n    /**\n    Replace the selection with the given node, appending the changes\n    to the given transaction.\n    */\n    replaceWith(tr, node) {\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            let from = mapping.map($from.pos), to = mapping.map($to.pos);\n            if (i) {\n                tr.deleteRange(from, to);\n            }\n            else {\n                tr.replaceRangeWith(from, to, node);\n                selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n            }\n        }\n    }\n    /**\n    Find a valid cursor or leaf node selection starting at the given\n    position and searching back if `dir` is negative, and forward if\n    positive. When `textOnly` is true, only consider cursor\n    selections. Will return null when no valid selection position is\n    found.\n    */\n    static findFrom($pos, dir, textOnly = false) {\n        let inner = $pos.parent.inlineContent ? new TextSelection($pos)\n            : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n        if (inner)\n            return inner;\n        for (let depth = $pos.depth - 1; depth >= 0; depth--) {\n            let found = dir < 0\n                ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n                : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n            if (found)\n                return found;\n        }\n        return null;\n    }\n    /**\n    Find a valid cursor or leaf node selection near the given\n    position. Searches forward first by default, but if `bias` is\n    negative, it will search backwards first.\n    */\n    static near($pos, bias = 1) {\n        return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0));\n    }\n    /**\n    Find the cursor or leaf node selection closest to the start of\n    the given document. Will return an\n    [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position\n    exists.\n    */\n    static atStart(doc) {\n        return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc);\n    }\n    /**\n    Find the cursor or leaf node selection closest to the end of the\n    given document.\n    */\n    static atEnd(doc) {\n        return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc);\n    }\n    /**\n    Deserialize the JSON representation of a selection. Must be\n    implemented for custom classes (as a static class method).\n    */\n    static fromJSON(doc, json) {\n        if (!json || !json.type)\n            throw new RangeError(\"Invalid input for Selection.fromJSON\");\n        let cls = classesById[json.type];\n        if (!cls)\n            throw new RangeError(`No selection type ${json.type} defined`);\n        return cls.fromJSON(doc, json);\n    }\n    /**\n    To be able to deserialize selections from JSON, custom selection\n    classes must register themselves with an ID string, so that they\n    can be disambiguated. Try to pick something that's unlikely to\n    clash with classes from other modules.\n    */\n    static jsonID(id, selectionClass) {\n        if (id in classesById)\n            throw new RangeError(\"Duplicate use of selection JSON ID \" + id);\n        classesById[id] = selectionClass;\n        selectionClass.prototype.jsonID = id;\n        return selectionClass;\n    }\n    /**\n    Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection,\n    which is a value that can be mapped without having access to a\n    current document, and later resolved to a real selection for a\n    given document again. (This is used mostly by the history to\n    track and restore old selections.) The default implementation of\n    this method just converts the selection to a text selection and\n    returns the bookmark for that.\n    */\n    getBookmark() {\n        return TextSelection.between(this.$anchor, this.$head).getBookmark();\n    }\n}\nSelection.prototype.visible = true;\n/**\nRepresents a selected range in a document.\n*/\nclass SelectionRange {\n    /**\n    Create a range.\n    */\n    constructor(\n    /**\n    The lower bound of the range.\n    */\n    $from, \n    /**\n    The upper bound of the range.\n    */\n    $to) {\n        this.$from = $from;\n        this.$to = $to;\n    }\n}\nlet warnedAboutTextSelection = false;\nfunction checkTextSelection($pos) {\n    if (!warnedAboutTextSelection && !$pos.parent.inlineContent) {\n        warnedAboutTextSelection = true;\n        console[\"warn\"](\"TextSelection endpoint not pointing into a node with inline content (\" + $pos.parent.type.name + \")\");\n    }\n}\n/**\nA text selection represents a classical editor selection, with a\nhead (the moving side) and anchor (immobile side), both of which\npoint into textblock nodes. It can be empty (a regular cursor\nposition).\n*/\nclass TextSelection extends Selection {\n    /**\n    Construct a text selection between the given points.\n    */\n    constructor($anchor, $head = $anchor) {\n        checkTextSelection($anchor);\n        checkTextSelection($head);\n        super($anchor, $head);\n    }\n    /**\n    Returns a resolved position if this is a cursor selection (an\n    empty text selection), and null otherwise.\n    */\n    get $cursor() { return this.$anchor.pos == this.$head.pos ? this.$head : null; }\n    map(doc, mapping) {\n        let $head = doc.resolve(mapping.map(this.head));\n        if (!$head.parent.inlineContent)\n            return Selection.near($head);\n        let $anchor = doc.resolve(mapping.map(this.anchor));\n        return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head);\n    }\n    replace(tr, content = Slice.empty) {\n        super.replace(tr, content);\n        if (content == Slice.empty) {\n            let marks = this.$from.marksAcross(this.$to);\n            if (marks)\n                tr.ensureMarks(marks);\n        }\n    }\n    eq(other) {\n        return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head;\n    }\n    getBookmark() {\n        return new TextBookmark(this.anchor, this.head);\n    }\n    toJSON() {\n        return { type: \"text\", anchor: this.anchor, head: this.head };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n            throw new RangeError(\"Invalid input for TextSelection.fromJSON\");\n        return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n    }\n    /**\n    Create a text selection from non-resolved positions.\n    */\n    static create(doc, anchor, head = anchor) {\n        let $anchor = doc.resolve(anchor);\n        return new this($anchor, head == anchor ? $anchor : doc.resolve(head));\n    }\n    /**\n    Return a text selection that spans the given positions or, if\n    they aren't text positions, find a text selection near them.\n    `bias` determines whether the method searches forward (default)\n    or backwards (negative number) first. Will fall back to calling\n    [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document\n    doesn't contain a valid text position.\n    */\n    static between($anchor, $head, bias) {\n        let dPos = $anchor.pos - $head.pos;\n        if (!bias || dPos)\n            bias = dPos >= 0 ? 1 : -1;\n        if (!$head.parent.inlineContent) {\n            let found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n            if (found)\n                $head = found.$head;\n            else\n                return Selection.near($head, bias);\n        }\n        if (!$anchor.parent.inlineContent) {\n            if (dPos == 0) {\n                $anchor = $head;\n            }\n            else {\n                $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n                if (($anchor.pos < $head.pos) != (dPos < 0))\n                    $anchor = $head;\n            }\n        }\n        return new TextSelection($anchor, $head);\n    }\n}\nSelection.jsonID(\"text\", TextSelection);\nclass TextBookmark {\n    constructor(anchor, head) {\n        this.anchor = anchor;\n        this.head = head;\n    }\n    map(mapping) {\n        return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head));\n    }\n    resolve(doc) {\n        return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head));\n    }\n}\n/**\nA node selection is a selection that points at a single node. All\nnodes marked [selectable](https://prosemirror.net/docs/ref/#model.NodeSpec.selectable) can be the\ntarget of a node selection. In such a selection, `from` and `to`\npoint directly before and after the selected node, `anchor` equals\n`from`, and `head` equals `to`..\n*/\nclass NodeSelection extends Selection {\n    /**\n    Create a node selection. Does not verify the validity of its\n    argument.\n    */\n    constructor($pos) {\n        let node = $pos.nodeAfter;\n        let $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n        super($pos, $end);\n        this.node = node;\n    }\n    map(doc, mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        let $pos = doc.resolve(pos);\n        if (deleted)\n            return Selection.near($pos);\n        return new NodeSelection($pos);\n    }\n    content() {\n        return new Slice(Fragment.from(this.node), 0, 0);\n    }\n    eq(other) {\n        return other instanceof NodeSelection && other.anchor == this.anchor;\n    }\n    toJSON() {\n        return { type: \"node\", anchor: this.anchor };\n    }\n    getBookmark() { return new NodeBookmark(this.anchor); }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\")\n            throw new RangeError(\"Invalid input for NodeSelection.fromJSON\");\n        return new NodeSelection(doc.resolve(json.anchor));\n    }\n    /**\n    Create a node selection from non-resolved positions.\n    */\n    static create(doc, from) {\n        return new NodeSelection(doc.resolve(from));\n    }\n    /**\n    Determines whether the given node may be selected as a node\n    selection.\n    */\n    static isSelectable(node) {\n        return !node.isText && node.type.spec.selectable !== false;\n    }\n}\nNodeSelection.prototype.visible = false;\nSelection.jsonID(\"node\", NodeSelection);\nclass NodeBookmark {\n    constructor(anchor) {\n        this.anchor = anchor;\n    }\n    map(mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos);\n    }\n    resolve(doc) {\n        let $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n        if (node && NodeSelection.isSelectable(node))\n            return new NodeSelection($pos);\n        return Selection.near($pos);\n    }\n}\n/**\nA selection type that represents selecting the whole document\n(which can not necessarily be expressed with a text selection, when\nthere are for example leaf block nodes at the start or end of the\ndocument).\n*/\nclass AllSelection extends Selection {\n    /**\n    Create an all-selection over the given document.\n    */\n    constructor(doc) {\n        super(doc.resolve(0), doc.resolve(doc.content.size));\n    }\n    replace(tr, content = Slice.empty) {\n        if (content == Slice.empty) {\n            tr.delete(0, tr.doc.content.size);\n            let sel = Selection.atStart(tr.doc);\n            if (!sel.eq(tr.selection))\n                tr.setSelection(sel);\n        }\n        else {\n            super.replace(tr, content);\n        }\n    }\n    toJSON() { return { type: \"all\" }; }\n    /**\n    @internal\n    */\n    static fromJSON(doc) { return new AllSelection(doc); }\n    map(doc) { return new AllSelection(doc); }\n    eq(other) { return other instanceof AllSelection; }\n    getBookmark() { return AllBookmark; }\n}\nSelection.jsonID(\"all\", AllSelection);\nconst AllBookmark = {\n    map() { return this; },\n    resolve(doc) { return new AllSelection(doc); }\n};\n// FIXME we'll need some awareness of text direction when scanning for selections\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text = false) {\n    if (node.inlineContent)\n        return TextSelection.create(doc, pos);\n    for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n        let child = node.child(i);\n        if (!child.isAtom) {\n            let inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n            if (inner)\n                return inner;\n        }\n        else if (!text && NodeSelection.isSelectable(child)) {\n            return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0));\n        }\n        pos += child.nodeSize * dir;\n    }\n    return null;\n}\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n    let last = tr.steps.length - 1;\n    if (last < startLen)\n        return;\n    let step = tr.steps[last];\n    if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep))\n        return;\n    let map = tr.mapping.maps[last], end;\n    map.forEach((_from, _to, _newFrom, newTo) => { if (end == null)\n        end = newTo; });\n    tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nconst UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n/**\nAn editor state transaction, which can be applied to a state to\ncreate an updated state. Use\n[`EditorState.tr`](https://prosemirror.net/docs/ref/#state.EditorState.tr) to create an instance.\n\nTransactions track changes to the document (they are a subclass of\n[`Transform`](https://prosemirror.net/docs/ref/#transform.Transform)), but also other state changes,\nlike selection updates and adjustments of the set of [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks). In addition, you can store\nmetadata properties in a transaction, which are extra pieces of\ninformation that client code or plugins can use to describe what a\ntransaction represents, so that they can update their [own\nstate](https://prosemirror.net/docs/ref/#state.StateField) accordingly.\n\nThe [editor view](https://prosemirror.net/docs/ref/#view.EditorView) uses a few metadata\nproperties: it will attach a property `\"pointer\"` with the value\n`true` to selection transactions directly caused by mouse or touch\ninput, a `\"composition\"` property holding an ID identifying the\ncomposition that caused it to transactions caused by composed DOM\ninput, and a `\"uiEvent\"` property of that may be `\"paste\"`,\n`\"cut\"`, or `\"drop\"`.\n*/\nclass Transaction extends Transform {\n    /**\n    @internal\n    */\n    constructor(state) {\n        super(state.doc);\n        // The step count for which the current selection is valid.\n        this.curSelectionFor = 0;\n        // Bitfield to track which aspects of the state were updated by\n        // this transaction.\n        this.updated = 0;\n        // Object used to store metadata properties for the transaction.\n        this.meta = Object.create(null);\n        this.time = Date.now();\n        this.curSelection = state.selection;\n        this.storedMarks = state.storedMarks;\n    }\n    /**\n    The transaction's current selection. This defaults to the editor\n    selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the\n    transaction, but can be overwritten with\n    [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection).\n    */\n    get selection() {\n        if (this.curSelectionFor < this.steps.length) {\n            this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n            this.curSelectionFor = this.steps.length;\n        }\n        return this.curSelection;\n    }\n    /**\n    Update the transaction's current selection. Will determine the\n    selection that the editor gets when the transaction is applied.\n    */\n    setSelection(selection) {\n        if (selection.$from.doc != this.doc)\n            throw new RangeError(\"Selection passed to setSelection must point at the current document\");\n        this.curSelection = selection;\n        this.curSelectionFor = this.steps.length;\n        this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n        this.storedMarks = null;\n        return this;\n    }\n    /**\n    Whether the selection was explicitly updated by this transaction.\n    */\n    get selectionSet() {\n        return (this.updated & UPDATED_SEL) > 0;\n    }\n    /**\n    Set the current stored marks.\n    */\n    setStoredMarks(marks) {\n        this.storedMarks = marks;\n        this.updated |= UPDATED_MARKS;\n        return this;\n    }\n    /**\n    Make sure the current stored marks or, if that is null, the marks\n    at the selection, match the given set of marks. Does nothing if\n    this is already the case.\n    */\n    ensureMarks(marks) {\n        if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n            this.setStoredMarks(marks);\n        return this;\n    }\n    /**\n    Add a mark to the set of stored marks.\n    */\n    addStoredMark(mark) {\n        return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Remove a mark or mark type from the set of stored marks.\n    */\n    removeStoredMark(mark) {\n        return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Whether the stored marks were explicitly set for this transaction.\n    */\n    get storedMarksSet() {\n        return (this.updated & UPDATED_MARKS) > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        super.addStep(step, doc);\n        this.updated = this.updated & ~UPDATED_MARKS;\n        this.storedMarks = null;\n    }\n    /**\n    Update the timestamp for the transaction.\n    */\n    setTime(time) {\n        this.time = time;\n        return this;\n    }\n    /**\n    Replace the current selection with the given slice.\n    */\n    replaceSelection(slice) {\n        this.selection.replace(this, slice);\n        return this;\n    }\n    /**\n    Replace the selection with the given node. When `inheritMarks` is\n    true and the content is inline, it inherits the marks from the\n    place where it is inserted.\n    */\n    replaceSelectionWith(node, inheritMarks = true) {\n        let selection = this.selection;\n        if (inheritMarks)\n            node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none)));\n        selection.replaceWith(this, node);\n        return this;\n    }\n    /**\n    Delete the selection.\n    */\n    deleteSelection() {\n        this.selection.replace(this);\n        return this;\n    }\n    /**\n    Replace the given range, or the selection if no range is given,\n    with a text node containing the given string.\n    */\n    insertText(text, from, to) {\n        let schema = this.doc.type.schema;\n        if (from == null) {\n            if (!text)\n                return this.deleteSelection();\n            return this.replaceSelectionWith(schema.text(text), true);\n        }\n        else {\n            if (to == null)\n                to = from;\n            if (!text)\n                return this.deleteRange(from, to);\n            let marks = this.storedMarks;\n            if (!marks) {\n                let $from = this.doc.resolve(from);\n                marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n            }\n            this.replaceRangeWith(from, to, schema.text(text, marks));\n            if (!this.selection.empty && this.selection.to == from + text.length)\n                this.setSelection(Selection.near(this.selection.$to));\n            return this;\n        }\n    }\n    /**\n    Store a metadata property in this transaction, keyed either by\n    name or by plugin.\n    */\n    setMeta(key, value) {\n        this.meta[typeof key == \"string\" ? key : key.key] = value;\n        return this;\n    }\n    /**\n    Retrieve a metadata property for a given name or plugin.\n    */\n    getMeta(key) {\n        return this.meta[typeof key == \"string\" ? key : key.key];\n    }\n    /**\n    Returns true if this transaction doesn't contain any metadata,\n    and can thus safely be extended.\n    */\n    get isGeneric() {\n        for (let _ in this.meta)\n            return false;\n        return true;\n    }\n    /**\n    Indicate that the editor should scroll the selection into view\n    when updated to the state produced by this transaction.\n    */\n    scrollIntoView() {\n        this.updated |= UPDATED_SCROLL;\n        return this;\n    }\n    /**\n    True when this transaction has had `scrollIntoView` called on it.\n    */\n    get scrolledIntoView() {\n        return (this.updated & UPDATED_SCROLL) > 0;\n    }\n}\n\nfunction bind(f, self) {\n    return !self || !f ? f : f.bind(self);\n}\nclass FieldDesc {\n    constructor(name, desc, self) {\n        this.name = name;\n        this.init = bind(desc.init, self);\n        this.apply = bind(desc.apply, self);\n    }\n}\nconst baseFields = [\n    new FieldDesc(\"doc\", {\n        init(config) { return config.doc || config.schema.topNodeType.createAndFill(); },\n        apply(tr) { return tr.doc; }\n    }),\n    new FieldDesc(\"selection\", {\n        init(config, instance) { return config.selection || Selection.atStart(instance.doc); },\n        apply(tr) { return tr.selection; }\n    }),\n    new FieldDesc(\"storedMarks\", {\n        init(config) { return config.storedMarks || null; },\n        apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null; }\n    }),\n    new FieldDesc(\"scrollToSelection\", {\n        init() { return 0; },\n        apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev; }\n    })\n];\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nclass Configuration {\n    constructor(schema, plugins) {\n        this.schema = schema;\n        this.plugins = [];\n        this.pluginsByKey = Object.create(null);\n        this.fields = baseFields.slice();\n        if (plugins)\n            plugins.forEach(plugin => {\n                if (this.pluginsByKey[plugin.key])\n                    throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\");\n                this.plugins.push(plugin);\n                this.pluginsByKey[plugin.key] = plugin;\n                if (plugin.spec.state)\n                    this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin));\n            });\n    }\n}\n/**\nThe state of a ProseMirror editor is represented by an object of\nthis type. A state is a persistent data structure—it isn't\nupdated, but rather a new state value is computed from an old one\nusing the [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) method.\n\nA state holds a number of built-in fields, and plugins can\n[define](https://prosemirror.net/docs/ref/#state.PluginSpec.state) additional fields.\n*/\nclass EditorState {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    @internal\n    */\n    config) {\n        this.config = config;\n    }\n    /**\n    The schema of the state's document.\n    */\n    get schema() {\n        return this.config.schema;\n    }\n    /**\n    The plugins that are active in this state.\n    */\n    get plugins() {\n        return this.config.plugins;\n    }\n    /**\n    Apply the given transaction to produce a new state.\n    */\n    apply(tr) {\n        return this.applyTransaction(tr).state;\n    }\n    /**\n    @internal\n    */\n    filterTransaction(tr, ignore = -1) {\n        for (let i = 0; i < this.config.plugins.length; i++)\n            if (i != ignore) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n                    return false;\n            }\n        return true;\n    }\n    /**\n    Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that\n    returns the precise transactions that were applied (which might\n    be influenced by the [transaction\n    hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of\n    plugins) along with the new state.\n    */\n    applyTransaction(rootTr) {\n        if (!this.filterTransaction(rootTr))\n            return { state: this, transactions: [] };\n        let trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n        // This loop repeatedly gives plugins a chance to respond to\n        // transactions as new transactions are added, making sure to only\n        // pass the transactions the plugin did not see before.\n        for (;;) {\n            let haveNew = false;\n            for (let i = 0; i < this.config.plugins.length; i++) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.appendTransaction) {\n                    let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n                    let tr = n < trs.length &&\n                        plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n                    if (tr && newState.filterTransaction(tr, i)) {\n                        tr.setMeta(\"appendedTransaction\", rootTr);\n                        if (!seen) {\n                            seen = [];\n                            for (let j = 0; j < this.config.plugins.length; j++)\n                                seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 });\n                        }\n                        trs.push(tr);\n                        newState = newState.applyInner(tr);\n                        haveNew = true;\n                    }\n                    if (seen)\n                        seen[i] = { state: newState, n: trs.length };\n                }\n            }\n            if (!haveNew)\n                return { state: newState, transactions: trs };\n        }\n    }\n    /**\n    @internal\n    */\n    applyInner(tr) {\n        if (!tr.before.eq(this.doc))\n            throw new RangeError(\"Applying a mismatched transaction\");\n        let newInstance = new EditorState(this.config), fields = this.config.fields;\n        for (let i = 0; i < fields.length; i++) {\n            let field = fields[i];\n            newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n        }\n        return newInstance;\n    }\n    /**\n    Accessor that constructs and returns a new [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state.\n    */\n    get tr() { return new Transaction(this); }\n    /**\n    Create a new state.\n    */\n    static create(config) {\n        let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n        let instance = new EditorState($config);\n        for (let i = 0; i < $config.fields.length; i++)\n            instance[$config.fields[i].name] = $config.fields[i].init(config, instance);\n        return instance;\n    }\n    /**\n    Create a new state based on this one, but with an adjusted set\n    of active plugins. State fields that exist in both sets of\n    plugins are kept unchanged. Those that no longer exist are\n    dropped, and those that are new are initialized using their\n    [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new\n    configuration object..\n    */\n    reconfigure(config) {\n        let $config = new Configuration(this.schema, config.plugins);\n        let fields = $config.fields, instance = new EditorState($config);\n        for (let i = 0; i < fields.length; i++) {\n            let name = fields[i].name;\n            instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n        }\n        return instance;\n    }\n    /**\n    Serialize this state to JSON. If you want to serialize the state\n    of plugins, pass an object mapping property names to use in the\n    resulting JSON object to plugin objects. The argument may also be\n    a string or number, in which case it is ignored, to support the\n    way `JSON.stringify` calls `toString` methods.\n    */\n    toJSON(pluginFields) {\n        let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() };\n        if (this.storedMarks)\n            result.storedMarks = this.storedMarks.map(m => m.toJSON());\n        if (pluginFields && typeof pluginFields == 'object')\n            for (let prop in pluginFields) {\n                if (prop == \"doc\" || prop == \"selection\")\n                    throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\");\n                let plugin = pluginFields[prop], state = plugin.spec.state;\n                if (state && state.toJSON)\n                    result[prop] = state.toJSON.call(plugin, this[plugin.key]);\n            }\n        return result;\n    }\n    /**\n    Deserialize a JSON representation of a state. `config` should\n    have at least a `schema` field, and should contain array of\n    plugins to initialize the state with. `pluginFields` can be used\n    to deserialize the state of plugins, by associating plugin\n    instances with the property names they use in the JSON object.\n    */\n    static fromJSON(config, json, pluginFields) {\n        if (!json)\n            throw new RangeError(\"Invalid input for EditorState.fromJSON\");\n        if (!config.schema)\n            throw new RangeError(\"Required config field 'schema' missing\");\n        let $config = new Configuration(config.schema, config.plugins);\n        let instance = new EditorState($config);\n        $config.fields.forEach(field => {\n            if (field.name == \"doc\") {\n                instance.doc = Node.fromJSON(config.schema, json.doc);\n            }\n            else if (field.name == \"selection\") {\n                instance.selection = Selection.fromJSON(instance.doc, json.selection);\n            }\n            else if (field.name == \"storedMarks\") {\n                if (json.storedMarks)\n                    instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON);\n            }\n            else {\n                if (pluginFields)\n                    for (let prop in pluginFields) {\n                        let plugin = pluginFields[prop], state = plugin.spec.state;\n                        if (plugin.key == field.name && state && state.fromJSON &&\n                            Object.prototype.hasOwnProperty.call(json, prop)) {\n                            instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n                            return;\n                        }\n                    }\n                instance[field.name] = field.init(config, instance);\n            }\n        });\n        return instance;\n    }\n}\n\nfunction bindProps(obj, self, target) {\n    for (let prop in obj) {\n        let val = obj[prop];\n        if (val instanceof Function)\n            val = val.bind(self);\n        else if (prop == \"handleDOMEvents\")\n            val = bindProps(val, self, {});\n        target[prop] = val;\n    }\n    return target;\n}\n/**\nPlugins bundle functionality that can be added to an editor.\nThey are part of the [editor state](https://prosemirror.net/docs/ref/#state.EditorState) and\nmay influence that state and the view that contains it.\n*/\nclass Plugin {\n    /**\n    Create a plugin.\n    */\n    constructor(\n    /**\n    The plugin's [spec object](https://prosemirror.net/docs/ref/#state.PluginSpec).\n    */\n    spec) {\n        this.spec = spec;\n        /**\n        The [props](https://prosemirror.net/docs/ref/#view.EditorProps) exported by this plugin.\n        */\n        this.props = {};\n        if (spec.props)\n            bindProps(spec.props, this, this.props);\n        this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n    }\n    /**\n    Extract the plugin's state field from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\nconst keys = Object.create(null);\nfunction createKey(name) {\n    if (name in keys)\n        return name + \"$\" + ++keys[name];\n    keys[name] = 0;\n    return name + \"$\";\n}\n/**\nA key is used to [tag](https://prosemirror.net/docs/ref/#state.PluginSpec.key) plugins in a way\nthat makes it possible to find them, given an editor state.\nAssigning a key does mean only one plugin of that type can be\nactive in a state.\n*/\nclass PluginKey {\n    /**\n    Create a plugin key.\n    */\n    constructor(name = \"key\") { this.key = createKey(name); }\n    /**\n    Get the active plugin with this key, if any, from an editor\n    state.\n    */\n    get(state) { return state.config.pluginsByKey[this.key]; }\n    /**\n    Get the plugin's state from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n","import { TextSelection, NodeSelection, AllSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n    for (var index = 0;; index++) {\n        node = node.previousSibling;\n        if (!node)\n            return index;\n    }\n};\nconst parentNode = function (node) {\n    let parent = node.assignedSlot || node.parentNode;\n    return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n    let range = reusedRange || (reusedRange = document.createRange());\n    range.setEnd(node, to == null ? node.nodeValue.length : to);\n    range.setStart(node, from || 0);\n    return range;\n};\nconst clearReusedRange = function () {\n    reusedRange = null;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n    return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n        scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n    var _a;\n    for (;;) {\n        if (node == targetNode && off == targetOff)\n            return true;\n        if (off == (dir < 0 ? 0 : nodeSize(node))) {\n            let parent = node.parentNode;\n            if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n                node.contentEditable == \"false\")\n                return false;\n            off = domIndex(node) + (dir < 0 ? 0 : 1);\n            node = parent;\n        }\n        else if (node.nodeType == 1) {\n            let child = node.childNodes[off + (dir < 0 ? -1 : 0)];\n            if (child.nodeType == 1 && child.contentEditable == \"false\") {\n                if ((_a = child.pmViewDesc) === null || _a === void 0 ? void 0 : _a.ignoreForSelection)\n                    off += dir;\n                else\n                    return false;\n            }\n            else {\n                node = child;\n                off = dir < 0 ? nodeSize(node) : 0;\n            }\n        }\n        else {\n            return false;\n        }\n    }\n}\nfunction nodeSize(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction textNodeBefore$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset)\n            return node;\n        if (node.nodeType == 1 && offset > 0) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset - 1];\n            offset = nodeSize(node);\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node);\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction textNodeAfter$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset < node.nodeValue.length)\n            return node;\n        if (node.nodeType == 1 && offset < node.childNodes.length) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset];\n            offset = 0;\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node) + 1;\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction isOnEdge(node, offset, parent) {\n    for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n        if (node == parent)\n            return true;\n        let index = domIndex(node);\n        node = node.parentNode;\n        if (!node)\n            return false;\n        atStart = atStart && index == 0;\n        atEnd = atEnd && index == nodeSize(node);\n    }\n}\nfunction hasBlockDesc(dom) {\n    let desc;\n    for (let cur = dom; cur; cur = cur.parentNode)\n        if (desc = cur.pmViewDesc)\n            break;\n    return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n    return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"keydown\", true, true);\n    event.keyCode = keyCode;\n    event.key = event.code = key;\n    return event;\n}\nfunction deepActiveElement(doc) {\n    let elt = doc.activeElement;\n    while (elt && elt.shadowRoot)\n        elt = elt.shadowRoot.activeElement;\n    return elt;\n}\nfunction caretFromPoint(doc, x, y) {\n    if (doc.caretPositionFromPoint) {\n        try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n            let pos = doc.caretPositionFromPoint(x, y);\n            // Clip the offset, because Chrome will return a text offset\n            // into <input> nodes, which can't be treated as a regular DOM\n            // offset\n            if (pos)\n                return { node: pos.offsetNode, offset: Math.min(nodeSize(pos.offsetNode), pos.offset) };\n        }\n        catch (_) { }\n    }\n    if (doc.caretRangeFromPoint) {\n        let range = doc.caretRangeFromPoint(x, y);\n        if (range)\n            return { node: range.startContainer, offset: Math.min(nodeSize(range.startContainer), range.startOffset) };\n    }\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n    let vp = doc.defaultView && doc.defaultView.visualViewport;\n    if (vp)\n        return {\n            left: 0, right: vp.width,\n            top: 0, bottom: vp.height\n        };\n    return { left: 0, right: doc.documentElement.clientWidth,\n        top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n    return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n    let rect = node.getBoundingClientRect();\n    // Adjust for elements with style \"transform: scale()\"\n    let scaleX = (rect.width / node.offsetWidth) || 1;\n    let scaleY = (rect.height / node.offsetHeight) || 1;\n    // Make sure scrollbar width isn't included in the rectangle\n    return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n        top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n    // Skip empty rects with all sides at 0, for example, when the element has no CSS box (display: none)\n    if (!nonZero(rect) && rect.left == 0)\n        return;\n    let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n    let doc = view.dom.ownerDocument;\n    for (let parent = startDOM || view.dom;;) {\n        if (!parent)\n            break;\n        if (parent.nodeType != 1) {\n            parent = parentNode(parent);\n            continue;\n        }\n        let elt = parent;\n        let atTop = elt == doc.body;\n        let bounding = atTop ? windowRect(doc) : clientRect(elt);\n        let moveX = 0, moveY = 0;\n        if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n            moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n        else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n            moveY = rect.bottom - rect.top > bounding.bottom - bounding.top\n                ? rect.top + getSide(scrollMargin, \"top\") - bounding.top\n                : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n        if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n            moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n        else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n            moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n        if (moveX || moveY) {\n            if (atTop) {\n                doc.defaultView.scrollBy(moveX, moveY);\n            }\n            else {\n                let startX = elt.scrollLeft, startY = elt.scrollTop;\n                if (moveY)\n                    elt.scrollTop += moveY;\n                if (moveX)\n                    elt.scrollLeft += moveX;\n                let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n                rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n            }\n        }\n        let pos = atTop ? \"fixed\" : getComputedStyle(parent).position;\n        if (/^(fixed|sticky)$/.test(pos))\n            break;\n        parent = pos == \"absolute\" ? parent.offsetParent : parentNode(parent);\n    }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n    let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n    let refDOM, refTop;\n    for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n        let dom = view.root.elementFromPoint(x, y);\n        if (!dom || dom == view.dom || !view.dom.contains(dom))\n            continue;\n        let localRect = dom.getBoundingClientRect();\n        if (localRect.top >= startY - 20) {\n            refDOM = dom;\n            refTop = localRect.top;\n            break;\n        }\n    }\n    return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n    let stack = [], doc = dom.ownerDocument;\n    for (let cur = dom; cur; cur = parentNode(cur)) {\n        stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n        if (dom == doc)\n            break;\n    }\n    return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n    let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n    restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n    for (let i = 0; i < stack.length; i++) {\n        let { dom, top, left } = stack[i];\n        if (dom.scrollTop != top + dTop)\n            dom.scrollTop = top + dTop;\n        if (dom.scrollLeft != left)\n            dom.scrollLeft = left;\n    }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n    if (dom.setActive)\n        return dom.setActive(); // in IE\n    if (preventScrollSupported)\n        return dom.focus(preventScrollSupported);\n    let stored = scrollStack(dom);\n    dom.focus(preventScrollSupported == null ? {\n        get preventScroll() {\n            preventScrollSupported = { preventScroll: true };\n            return true;\n        }\n    } : undefined);\n    if (!preventScrollSupported) {\n        preventScrollSupported = false;\n        restoreScrollStack(stored, 0);\n    }\n}\nfunction findOffsetInNode(node, coords) {\n    let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n    let rowBot = coords.top, rowTop = coords.top;\n    let firstBelow, coordsBelow;\n    for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n        let rects;\n        if (child.nodeType == 1)\n            rects = child.getClientRects();\n        else if (child.nodeType == 3)\n            rects = textRange(child).getClientRects();\n        else\n            continue;\n        for (let i = 0; i < rects.length; i++) {\n            let rect = rects[i];\n            if (rect.top <= rowBot && rect.bottom >= rowTop) {\n                rowBot = Math.max(rect.bottom, rowBot);\n                rowTop = Math.min(rect.top, rowTop);\n                let dx = rect.left > coords.left ? rect.left - coords.left\n                    : rect.right < coords.left ? coords.left - rect.right : 0;\n                if (dx < dxClosest) {\n                    closest = child;\n                    dxClosest = dx;\n                    coordsClosest = dx && closest.nodeType == 3 ? {\n                        left: rect.right < coords.left ? rect.right : rect.left,\n                        top: coords.top\n                    } : coords;\n                    if (child.nodeType == 1 && dx)\n                        offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n                    continue;\n                }\n            }\n            else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n                firstBelow = child;\n                coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n            }\n            if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n                coords.left >= rect.left && coords.top >= rect.bottom))\n                offset = childIndex + 1;\n        }\n    }\n    if (!closest && firstBelow) {\n        closest = firstBelow;\n        coordsClosest = coordsBelow;\n        dxClosest = 0;\n    }\n    if (closest && closest.nodeType == 3)\n        return findOffsetInText(closest, coordsClosest);\n    if (!closest || (dxClosest && closest.nodeType == 1))\n        return { node, offset };\n    return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n    let len = node.nodeValue.length;\n    let range = document.createRange(), result;\n    for (let i = 0; i < len; i++) {\n        range.setEnd(node, i + 1);\n        range.setStart(node, i);\n        let rect = singleRect(range, 1);\n        if (rect.top == rect.bottom)\n            continue;\n        if (inRect(coords, rect)) {\n            result = { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n            break;\n        }\n    }\n    range.detach();\n    return result || { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n    return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n        coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n    let parent = dom.parentNode;\n    if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n        return parent;\n    return dom;\n}\nfunction posFromElement(view, elt, coords) {\n    let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n    if (node.nodeType == 1 && !node.firstChild) {\n        let rect = node.getBoundingClientRect();\n        bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n    }\n    return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n    // Browser (in caretPosition/RangeFromPoint) will agressively\n    // normalize towards nearby inline nodes. Since we are interested in\n    // positions between block nodes too, we first walk up the hierarchy\n    // of nodes to see if there are block nodes that the coordinates\n    // fall outside of. If so, we take the position before/after that\n    // block. If not, we call `posFromDOM` on the raw node/offset.\n    let outsideBlock = -1;\n    for (let cur = node, sawBlock = false;;) {\n        if (cur == view.dom)\n            break;\n        let desc = view.docView.nearestDesc(cur, true), rect;\n        if (!desc)\n            return null;\n        if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&\n            // Ignore elements with zero-size bounding rectangles\n            ((rect = desc.dom.getBoundingClientRect()).width || rect.height)) {\n            if (desc.node.isBlock && desc.parent && !/^T(R|BODY|HEAD|FOOT)$/.test(desc.dom.nodeName)) {\n                // Only apply the horizontal test to the innermost block. Vertical for any parent.\n                if (!sawBlock && rect.left > coords.left || rect.top > coords.top)\n                    outsideBlock = desc.posBefore;\n                else if (!sawBlock && rect.right < coords.left || rect.bottom < coords.top)\n                    outsideBlock = desc.posAfter;\n                sawBlock = true;\n            }\n            if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n                // If we are inside a leaf, return the side of the leaf closer to the coords\n                let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n                    : coords.left < (rect.left + rect.right) / 2;\n                return before ? desc.posBefore : desc.posAfter;\n            }\n        }\n        cur = desc.dom.parentNode;\n    }\n    return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n    let len = element.childNodes.length;\n    if (len && box.top < box.bottom) {\n        for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n            let child = element.childNodes[i];\n            if (child.nodeType == 1) {\n                let rects = child.getClientRects();\n                for (let j = 0; j < rects.length; j++) {\n                    let rect = rects[j];\n                    if (inRect(coords, rect))\n                        return elementFromPoint(child, coords, rect);\n                }\n            }\n            if ((i = (i + 1) % len) == startI)\n                break;\n        }\n    }\n    return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n    let doc = view.dom.ownerDocument, node, offset = 0;\n    let caret = caretFromPoint(doc, coords.left, coords.top);\n    if (caret)\n        ({ node, offset } = caret);\n    let elt = (view.root.elementFromPoint ? view.root : doc)\n        .elementFromPoint(coords.left, coords.top);\n    let pos;\n    if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n        let box = view.dom.getBoundingClientRect();\n        if (!inRect(coords, box))\n            return null;\n        elt = elementFromPoint(view.dom, coords, box);\n        if (!elt)\n            return null;\n    }\n    // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n    if (safari) {\n        for (let p = elt; node && p; p = parentNode(p))\n            if (p.draggable)\n                node = undefined;\n    }\n    elt = targetKludge(elt, coords);\n    if (node) {\n        if (gecko && node.nodeType == 1) {\n            // Firefox will sometimes return offsets into <input> nodes, which\n            // have no actual children, from caretPositionFromPoint (#953)\n            offset = Math.min(offset, node.childNodes.length);\n            // It'll also move the returned position before image nodes,\n            // even if those are behind it.\n            if (offset < node.childNodes.length) {\n                let next = node.childNodes[offset], box;\n                if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n                    box.bottom > coords.top)\n                    offset++;\n            }\n        }\n        let prev;\n        // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.\n        if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&\n            prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n            offset--;\n        // Suspiciously specific kludge to work around caret*FromPoint\n        // never returning a position at the end of the document\n        if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n            coords.top > node.lastChild.getBoundingClientRect().bottom)\n            pos = view.state.doc.content.size;\n        // Ignore positions directly after a BR, since caret*FromPoint\n        // 'round up' positions that would be more accurately placed\n        // before the BR node.\n        else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n            pos = posFromCaret(view, node, offset, coords);\n    }\n    if (pos == null)\n        pos = posFromElement(view, elt, coords);\n    let desc = view.docView.nearestDesc(elt, true);\n    return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n    return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n    let rects = target.getClientRects();\n    if (rects.length) {\n        let first = rects[bias < 0 ? 0 : rects.length - 1];\n        if (nonZero(first))\n            return first;\n    }\n    return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n    let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n    let supportEmptyRange = webkit || gecko;\n    if (node.nodeType == 3) {\n        // These browsers support querying empty text ranges. Prefer that in\n        // bidi context or when at the end of a node.\n        if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n            let rect = singleRect(textRange(node, offset, offset), side);\n            // Firefox returns bad results (the position before the space)\n            // when querying a position directly after line-broken\n            // whitespace. Detect this situation and and kludge around it\n            if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n                let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n                if (rectBefore.top == rect.top) {\n                    let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n                    if (rectAfter.top != rect.top)\n                        return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n                }\n            }\n            return rect;\n        }\n        else {\n            let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n            if (side < 0 && !offset) {\n                to++;\n                takeSide = -1;\n            }\n            else if (side >= 0 && offset == node.nodeValue.length) {\n                from--;\n                takeSide = 1;\n            }\n            else if (side < 0) {\n                from--;\n            }\n            else {\n                to++;\n            }\n            return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n        }\n    }\n    let $dom = view.state.doc.resolve(pos - (atom || 0));\n    // Return a horizontal line in block context\n    if (!$dom.parent.inlineContent) {\n        if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n            let before = node.childNodes[offset - 1];\n            if (before.nodeType == 1)\n                return flattenH(before.getBoundingClientRect(), false);\n        }\n        if (atom == null && offset < nodeSize(node)) {\n            let after = node.childNodes[offset];\n            if (after.nodeType == 1)\n                return flattenH(after.getBoundingClientRect(), true);\n        }\n        return flattenH(node.getBoundingClientRect(), side >= 0);\n    }\n    // Inline, not in text node (this is not Bidi-safe)\n    if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n        let before = node.childNodes[offset - 1];\n        let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n            // BR nodes tend to only return the rectangle before them.\n            // Only use them if they are the last element in their parent\n            : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n        if (target)\n            return flattenV(singleRect(target, 1), false);\n    }\n    if (atom == null && offset < nodeSize(node)) {\n        let after = node.childNodes[offset];\n        while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n            after = after.nextSibling;\n        let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n            : after.nodeType == 1 ? after : null;\n        if (target)\n            return flattenV(singleRect(target, -1), true);\n    }\n    // All else failed, just try to get a rectangle for the target node\n    return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n    if (rect.width == 0)\n        return rect;\n    let x = left ? rect.left : rect.right;\n    return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n    if (rect.height == 0)\n        return rect;\n    let y = top ? rect.top : rect.bottom;\n    return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n    let viewState = view.state, active = view.root.activeElement;\n    if (viewState != state)\n        view.updateState(state);\n    if (active != view.dom)\n        view.focus();\n    try {\n        return f();\n    }\n    finally {\n        if (viewState != state)\n            view.updateState(viewState);\n        if (active != view.dom && active)\n            active.focus();\n    }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n    let sel = state.selection;\n    let $pos = dir == \"up\" ? sel.$from : sel.$to;\n    return withFlushedState(view, state, () => {\n        let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n        for (;;) {\n            let nearest = view.docView.nearestDesc(dom, true);\n            if (!nearest)\n                break;\n            if (nearest.node.isBlock) {\n                dom = nearest.contentDOM || nearest.dom;\n                break;\n            }\n            dom = nearest.dom.parentNode;\n        }\n        let coords = coordsAtPos(view, $pos.pos, 1);\n        for (let child = dom.firstChild; child; child = child.nextSibling) {\n            let boxes;\n            if (child.nodeType == 1)\n                boxes = child.getClientRects();\n            else if (child.nodeType == 3)\n                boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n            else\n                continue;\n            for (let i = 0; i < boxes.length; i++) {\n                let box = boxes[i];\n                if (box.bottom > box.top + 1 &&\n                    (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n                        : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n                    return false;\n            }\n        }\n        return true;\n    });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n    let { $head } = state.selection;\n    if (!$head.parent.isTextblock)\n        return false;\n    let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n    let sel = view.domSelection();\n    if (!sel)\n        return $head.pos == $head.start() || $head.pos == $head.end();\n    // If the textblock is all LTR, or the browser doesn't support\n    // Selection.modify (Edge), fall back to a primitive approach\n    if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n        return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n    return withFlushedState(view, state, () => {\n        // This is a huge hack, but appears to be the best we can\n        // currently do: use `Selection.modify` to move the selection by\n        // one character, and see if that moves the cursor out of the\n        // textblock (or doesn't move it at all, when at the start/end of\n        // the document).\n        let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n        let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n        ;\n        sel.modify(\"move\", dir, \"character\");\n        let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n        let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n        let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n            (oldNode == newNode && oldOff == newOff);\n        // Restore the previous selection\n        try {\n            sel.collapse(anchorNode, anchorOffset);\n            if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n                sel.extend(oldNode, oldOff);\n        }\n        catch (_) { }\n        if (oldBidiLevel != null)\n            sel.caretBidiLevel = oldBidiLevel;\n        return result;\n    });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n    if (cachedState == state && cachedDir == dir)\n        return cachedResult;\n    cachedState = state;\n    cachedDir = dir;\n    return cachedResult = dir == \"up\" || dir == \"down\"\n        ? endOfTextblockVertical(view, state, dir)\n        : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n//   corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n//   given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n    constructor(parent, children, dom, \n    // This is the node that holds the child views. It may be null for\n    // descs that don't have children.\n    contentDOM) {\n        this.parent = parent;\n        this.children = children;\n        this.dom = dom;\n        this.contentDOM = contentDOM;\n        this.dirty = NOT_DIRTY;\n        // An expando property on the DOM node provides a link back to its\n        // description.\n        dom.pmViewDesc = this;\n    }\n    // Used to check whether a given description corresponds to a\n    // widget/mark/node.\n    matchesWidget(widget) { return false; }\n    matchesMark(mark) { return false; }\n    matchesNode(node, outerDeco, innerDeco) { return false; }\n    matchesHack(nodeName) { return false; }\n    // When parsing in-editor content (in domchange.js), we allow\n    // descriptions to determine the parse rules that should be used to\n    // parse them.\n    parseRule(addedNodes) { return null; }\n    // Used by the editor's event handler to ignore events that come\n    // from certain descs.\n    stopEvent(event) { return false; }\n    // The size of the content represented by this desc.\n    get size() {\n        let size = 0;\n        for (let i = 0; i < this.children.length; i++)\n            size += this.children[i].size;\n        return size;\n    }\n    // For block nodes, this represents the space taken up by their\n    // start/end tokens.\n    get border() { return 0; }\n    destroy() {\n        this.parent = undefined;\n        if (this.dom.pmViewDesc == this)\n            this.dom.pmViewDesc = undefined;\n        for (let i = 0; i < this.children.length; i++)\n            this.children[i].destroy();\n    }\n    posBeforeChild(child) {\n        for (let i = 0, pos = this.posAtStart;; i++) {\n            let cur = this.children[i];\n            if (cur == child)\n                return pos;\n            pos += cur.size;\n        }\n    }\n    get posBefore() {\n        return this.parent.posBeforeChild(this);\n    }\n    get posAtStart() {\n        return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n    }\n    get posAfter() {\n        return this.posBefore + this.size;\n    }\n    get posAtEnd() {\n        return this.posAtStart + this.size - 2 * this.border;\n    }\n    localPosFromDOM(dom, offset, bias) {\n        // If the DOM position is in the content, use the child desc after\n        // it to figure out a position.\n        if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n            if (bias < 0) {\n                let domBefore, desc;\n                if (dom == this.contentDOM) {\n                    domBefore = dom.childNodes[offset - 1];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domBefore = dom.previousSibling;\n                }\n                while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n                    domBefore = domBefore.previousSibling;\n                return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n            }\n            else {\n                let domAfter, desc;\n                if (dom == this.contentDOM) {\n                    domAfter = dom.childNodes[offset];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domAfter = dom.nextSibling;\n                }\n                while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n                    domAfter = domAfter.nextSibling;\n                return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n            }\n        }\n        // Otherwise, use various heuristics, falling back on the bias\n        // parameter, to determine whether to return the position at the\n        // start or at the end of this view desc.\n        let atEnd;\n        if (dom == this.dom && this.contentDOM) {\n            atEnd = offset > domIndex(this.contentDOM);\n        }\n        else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n            atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n        }\n        else if (this.dom.firstChild) {\n            if (offset == 0)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = false;\n                        break;\n                    }\n                    if (search.previousSibling)\n                        break;\n                }\n            if (atEnd == null && offset == dom.childNodes.length)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = true;\n                        break;\n                    }\n                    if (search.nextSibling)\n                        break;\n                }\n        }\n        return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n    }\n    nearestDesc(dom, onlyNodes = false) {\n        for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n            let desc = this.getDesc(cur), nodeDOM;\n            if (desc && (!onlyNodes || desc.node)) {\n                // If dom is outside of this desc's nodeDOM, don't count it.\n                if (first && (nodeDOM = desc.nodeDOM) &&\n                    !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n                    first = false;\n                else\n                    return desc;\n            }\n        }\n    }\n    getDesc(dom) {\n        let desc = dom.pmViewDesc;\n        for (let cur = desc; cur; cur = cur.parent)\n            if (cur == this)\n                return desc;\n    }\n    posFromDOM(dom, offset, bias) {\n        for (let scan = dom; scan; scan = scan.parentNode) {\n            let desc = this.getDesc(scan);\n            if (desc)\n                return desc.localPosFromDOM(dom, offset, bias);\n        }\n        return -1;\n    }\n    // Find the desc for the node after the given pos, if any. (When a\n    // parent node overrode rendering, there might not be one.)\n    descAt(pos) {\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == pos && end != offset) {\n                while (!child.border && child.children.length) {\n                    for (let i = 0; i < child.children.length; i++) {\n                        let inner = child.children[i];\n                        if (inner.size) {\n                            child = inner;\n                            break;\n                        }\n                    }\n                }\n                return child;\n            }\n            if (pos < end)\n                return child.descAt(pos - offset - child.border);\n            offset = end;\n        }\n    }\n    domFromPos(pos, side) {\n        if (!this.contentDOM)\n            return { node: this.dom, offset: 0, atom: pos + 1 };\n        // First find the position in the child array\n        let i = 0, offset = 0;\n        for (let curPos = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = curPos + child.size;\n            if (end > pos || child instanceof TrailingHackViewDesc) {\n                offset = pos - curPos;\n                break;\n            }\n            curPos = end;\n        }\n        // If this points into the middle of a child, call through\n        if (offset)\n            return this.children[i].domFromPos(offset - this.children[i].border, side);\n        // Go back if there were any zero-length widgets with side >= 0 before this point\n        for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n        // Scan towards the first useable node\n        if (side <= 0) {\n            let prev, enter = true;\n            for (;; i--, enter = false) {\n                prev = i ? this.children[i - 1] : null;\n                if (!prev || prev.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (prev && side && enter && !prev.border && !prev.domAtom)\n                return prev.domFromPos(prev.size, side);\n            return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n        }\n        else {\n            let next, enter = true;\n            for (;; i++, enter = false) {\n                next = i < this.children.length ? this.children[i] : null;\n                if (!next || next.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (next && enter && !next.border && !next.domAtom)\n                return next.domFromPos(0, side);\n            return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n        }\n    }\n    // Used to find a DOM range in a single parent for a given changed\n    // range.\n    parseRange(from, to, base = 0) {\n        if (this.children.length == 0)\n            return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n        let fromOffset = -1, toOffset = -1;\n        for (let offset = base, i = 0;; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (fromOffset == -1 && from <= end) {\n                let childBase = offset + child.border;\n                // FIXME maybe descend mark views to parse a narrower range?\n                if (from >= childBase && to <= end - child.border && child.node &&\n                    child.contentDOM && this.contentDOM.contains(child.contentDOM))\n                    return child.parseRange(from, to, childBase);\n                from = offset;\n                for (let j = i; j > 0; j--) {\n                    let prev = this.children[j - 1];\n                    if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n                        fromOffset = domIndex(prev.dom) + 1;\n                        break;\n                    }\n                    from -= prev.size;\n                }\n                if (fromOffset == -1)\n                    fromOffset = 0;\n            }\n            if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n                to = end;\n                for (let j = i + 1; j < this.children.length; j++) {\n                    let next = this.children[j];\n                    if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n                        toOffset = domIndex(next.dom);\n                        break;\n                    }\n                    to += next.size;\n                }\n                if (toOffset == -1)\n                    toOffset = this.contentDOM.childNodes.length;\n                break;\n            }\n            offset = end;\n        }\n        return { node: this.contentDOM, from, to, fromOffset, toOffset };\n    }\n    emptyChildAt(side) {\n        if (this.border || !this.contentDOM || !this.children.length)\n            return false;\n        let child = this.children[side < 0 ? 0 : this.children.length - 1];\n        return child.size == 0 || child.emptyChildAt(side);\n    }\n    domAfterPos(pos) {\n        let { node, offset } = this.domFromPos(pos, 0);\n        if (node.nodeType != 1 || offset == node.childNodes.length)\n            throw new RangeError(\"No node after pos \" + pos);\n        return node.childNodes[offset];\n    }\n    // View descs are responsible for setting any selection that falls\n    // entirely inside of them, so that custom implementations can do\n    // custom things with the selection. Note that this falls apart when\n    // a selection starts in such a node and ends in another, in which\n    // case we just use whatever domFromPos produces as a best effort.\n    setSelection(anchor, head, view, force = false) {\n        // If the selection falls entirely in a child, give it to that child\n        let from = Math.min(anchor, head), to = Math.max(anchor, head);\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (from > offset && to < end)\n                return child.setSelection(anchor - offset - child.border, head - offset - child.border, view, force);\n            offset = end;\n        }\n        let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n        let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n        let domSel = view.root.getSelection();\n        let selRange = view.domSelectionRange();\n        let brKludge = false;\n        // On Firefox, using Selection.collapse to put the cursor after a\n        // BR node for some reason doesn't always work (#1073). On Safari,\n        // the cursor sometimes inexplicable visually lags behind its\n        // reported position in such situations (#1092).\n        if ((gecko || safari) && anchor == head) {\n            let { node, offset } = anchorDOM;\n            if (node.nodeType == 3) {\n                brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n                // Issue #1128\n                if (brKludge && offset == node.nodeValue.length) {\n                    for (let scan = node, after; scan; scan = scan.parentNode) {\n                        if (after = scan.nextSibling) {\n                            if (after.nodeName == \"BR\")\n                                anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n                            break;\n                        }\n                        let desc = scan.pmViewDesc;\n                        if (desc && desc.node && desc.node.isBlock)\n                            break;\n                    }\n                }\n            }\n            else {\n                let prev = node.childNodes[offset - 1];\n                brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n            }\n        }\n        // Firefox can act strangely when the selection is in front of an\n        // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n        if (gecko && selRange.focusNode && selRange.focusNode != headDOM.node && selRange.focusNode.nodeType == 1) {\n            let after = selRange.focusNode.childNodes[selRange.focusOffset];\n            if (after && after.contentEditable == \"false\")\n                force = true;\n        }\n        if (!(force || brKludge && safari) &&\n            isEquivalentPosition(anchorDOM.node, anchorDOM.offset, selRange.anchorNode, selRange.anchorOffset) &&\n            isEquivalentPosition(headDOM.node, headDOM.offset, selRange.focusNode, selRange.focusOffset))\n            return;\n        // Selection.extend can be used to create an 'inverted' selection\n        // (one where the focus is before the anchor), but not all\n        // browsers support it yet.\n        let domSelExtended = false;\n        if ((domSel.extend || anchor == head) && !(brKludge && gecko)) {\n            domSel.collapse(anchorDOM.node, anchorDOM.offset);\n            try {\n                if (anchor != head)\n                    domSel.extend(headDOM.node, headDOM.offset);\n                domSelExtended = true;\n            }\n            catch (_) {\n                // In some cases with Chrome the selection is empty after calling\n                // collapse, even when it should be valid. This appears to be a bug, but\n                // it is difficult to isolate. If this happens fallback to the old path\n                // without using extend.\n                // Similarly, this could crash on Safari if the editor is hidden, and\n                // there was no selection.\n            }\n        }\n        if (!domSelExtended) {\n            if (anchor > head) {\n                let tmp = anchorDOM;\n                anchorDOM = headDOM;\n                headDOM = tmp;\n            }\n            let range = document.createRange();\n            range.setEnd(headDOM.node, headDOM.offset);\n            range.setStart(anchorDOM.node, anchorDOM.offset);\n            domSel.removeAllRanges();\n            domSel.addRange(range);\n        }\n    }\n    ignoreMutation(mutation) {\n        return !this.contentDOM && mutation.type != \"selection\";\n    }\n    get contentLost() {\n        return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n    }\n    // Remove a subtree of the element tree that has been touched\n    // by a DOM change, so that the next update will redraw it.\n    markDirty(from, to) {\n        for (let offset = 0, i = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n                let startInside = offset + child.border, endInside = end - child.border;\n                if (from >= startInside && to <= endInside) {\n                    this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n                    if (from == startInside && to == endInside &&\n                        (child.contentLost || child.dom.parentNode != this.contentDOM))\n                        child.dirty = NODE_DIRTY;\n                    else\n                        child.markDirty(from - startInside, to - startInside);\n                    return;\n                }\n                else {\n                    child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n                        ? CONTENT_DIRTY : NODE_DIRTY;\n                }\n            }\n            offset = end;\n        }\n        this.dirty = CONTENT_DIRTY;\n    }\n    markParentsDirty() {\n        let level = 1;\n        for (let node = this.parent; node; node = node.parent, level++) {\n            let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n            if (node.dirty < dirty)\n                node.dirty = dirty;\n        }\n    }\n    get domAtom() { return false; }\n    get ignoreForCoords() { return false; }\n    get ignoreForSelection() { return false; }\n    isText(text) { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n    constructor(parent, widget, view, pos) {\n        let self, dom = widget.type.toDOM;\n        if (typeof dom == \"function\")\n            dom = dom(view, () => {\n                if (!self)\n                    return pos;\n                if (self.parent)\n                    return self.parent.posBeforeChild(self);\n            });\n        if (!widget.type.spec.raw) {\n            if (dom.nodeType != 1) {\n                let wrap = document.createElement(\"span\");\n                wrap.appendChild(dom);\n                dom = wrap;\n            }\n            if (!dom.hasAttribute(\"contenteditable\"))\n                dom.contentEditable = \"false\";\n            dom.classList.add(\"ProseMirror-widget\");\n        }\n        super(parent, [], dom, null);\n        this.widget = widget;\n        this.widget = widget;\n        self = this;\n    }\n    matchesWidget(widget) {\n        return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n    }\n    parseRule() { return { ignore: true }; }\n    stopEvent(event) {\n        let stop = this.widget.spec.stopEvent;\n        return stop ? stop(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n    }\n    destroy() {\n        this.widget.type.destroy(this.dom);\n        super.destroy();\n    }\n    get domAtom() { return true; }\n    get ignoreForSelection() { return !!this.widget.type.spec.relaxedSide; }\n    get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n    constructor(parent, dom, textDOM, text) {\n        super(parent, [], dom, null);\n        this.textDOM = textDOM;\n        this.text = text;\n    }\n    get size() { return this.text.length; }\n    localPosFromDOM(dom, offset) {\n        if (dom != this.textDOM)\n            return this.posAtStart + (offset ? this.size : 0);\n        return this.posAtStart + offset;\n    }\n    domFromPos(pos) {\n        return { node: this.textDOM, offset: pos };\n    }\n    ignoreMutation(mut) {\n        return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n    }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n    constructor(parent, mark, dom, contentDOM, spec) {\n        super(parent, [], dom, contentDOM);\n        this.mark = mark;\n        this.spec = spec;\n    }\n    static create(parent, mark, inline, view) {\n        let custom = view.nodeViews[mark.type.name];\n        let spec = custom && custom(mark, view, inline);\n        if (!spec || !spec.dom)\n            spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline), null, mark.attrs);\n        return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom, spec);\n    }\n    parseRule() {\n        if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n            return null;\n        return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n    }\n    matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        // Move dirty info to nearest node view\n        if (this.dirty != NOT_DIRTY) {\n            let parent = this.parent;\n            while (!parent.node)\n                parent = parent.parent;\n            if (parent.dirty < this.dirty)\n                parent.dirty = this.dirty;\n            this.dirty = NOT_DIRTY;\n        }\n    }\n    slice(from, to, view) {\n        let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n        let nodes = this.children, size = this.size;\n        if (to < size)\n            nodes = replaceNodes(nodes, to, size, view);\n        if (from > 0)\n            nodes = replaceNodes(nodes, 0, from, view);\n        for (let i = 0; i < nodes.length; i++)\n            nodes[i].parent = copy;\n        copy.children = nodes;\n        return copy;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM) {\n        super(parent, [], dom, contentDOM);\n        this.node = node;\n        this.outerDeco = outerDeco;\n        this.innerDeco = innerDeco;\n        this.nodeDOM = nodeDOM;\n    }\n    // By default, a node is rendered using the `toDOM` method from the\n    // node type spec. But client code can use the `nodeViews` spec to\n    // supply a custom node view, which can influence various aspects of\n    // the way the node works.\n    //\n    // (Using subclassing for this was intentionally decided against,\n    // since it'd require exposing a whole slew of finicky\n    // implementation details to the user code that they probably will\n    // never need.)\n    static create(parent, node, outerDeco, innerDeco, view, pos) {\n        let custom = view.nodeViews[node.type.name], descObj;\n        let spec = custom && custom(node, view, () => {\n            // (This is a function that allows the custom view to find its\n            // own position)\n            if (!descObj)\n                return pos;\n            if (descObj.parent)\n                return descObj.parent.posBeforeChild(descObj);\n        }, outerDeco, innerDeco);\n        let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n        if (node.isText) {\n            if (!dom)\n                dom = document.createTextNode(node.text);\n            else if (dom.nodeType != 3)\n                throw new RangeError(\"Text must be rendered as a DOM text node\");\n        }\n        else if (!dom) {\n            let spec = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node), null, node.attrs);\n            ({ dom, contentDOM } = spec);\n        }\n        if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n            if (!dom.hasAttribute(\"contenteditable\"))\n                dom.contentEditable = \"false\";\n            if (node.type.spec.draggable)\n                dom.draggable = true;\n        }\n        let nodeDOM = dom;\n        dom = applyOuterDeco(dom, outerDeco, node);\n        if (spec)\n            return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec);\n        else if (node.isText)\n            return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM);\n        else\n            return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM);\n    }\n    parseRule(addedNodes) {\n        // Experimental kludge to allow opt-in re-parsing of nodes\n        if (this.node.type.spec.reparseInView)\n            return null;\n        // FIXME the assumption that this can always return the current\n        // attrs means that if the user somehow manages to change the\n        // attrs in the dom, that won't be picked up. Not entirely sure\n        // whether this is a problem\n        let rule = { node: this.node.type.name, attrs: this.node.attrs };\n        if (this.node.type.whitespace == \"pre\")\n            rule.preserveWhitespace = \"full\";\n        if (!this.contentDOM) {\n            rule.getContent = () => this.node.content;\n        }\n        else if (!this.contentLost) {\n            rule.contentElement = this.contentDOM;\n        }\n        else {\n            // Chrome likes to randomly recreate parent nodes when\n            // backspacing things. When that happens, this tries to find the\n            // new parent.\n            for (let i = this.children.length - 1; i >= 0; i--) {\n                let child = this.children[i];\n                if (this.dom.contains(child.dom.parentNode)) {\n                    rule.contentElement = child.dom.parentNode;\n                    break;\n                }\n            }\n            if (!rule.contentElement) {\n                let found = addedNodes &&\n                    addedNodes.find(n => n.nodeType == 1 && addedNodes.indexOf(n.parentNode) < 0 && this.dom.contains(n));\n                if (found)\n                    rule.contentElement = found;\n                else\n                    rule.getContent = () => Fragment.empty;\n            }\n        }\n        return rule;\n    }\n    matchesNode(node, outerDeco, innerDeco) {\n        return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n            sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n    }\n    get size() { return this.node.nodeSize; }\n    get border() { return this.node.isLeaf ? 0 : 1; }\n    // Syncs `this.children` to match `this.node.content` and the local\n    // decorations, possibly introducing nesting for marks. Then, in a\n    // separate step, syncs the DOM inside `this.contentDOM` to\n    // `this.children`.\n    updateChildren(view, pos) {\n        let inline = this.node.inlineContent, off = pos;\n        let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n        let localComposition = composition && composition.pos > -1 ? composition : null;\n        let compositionInChild = composition && composition.pos < 0;\n        let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n        iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n            if (widget.spec.marks)\n                updater.syncToMarks(widget.spec.marks, inline, view, i);\n            else if (widget.type.side >= 0 && !insideNode)\n                updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view, i);\n            // If the next node is a desc matching this widget, reuse it,\n            // otherwise insert the widget as a new view desc.\n            updater.placeWidget(widget, view, off);\n        }, (child, outerDeco, innerDeco, i) => {\n            // Make sure the wrapping mark descs match the node's marks.\n            updater.syncToMarks(child.marks, inline, view, i);\n            // Try several strategies for drawing this node\n            let compIndex;\n            if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n            else if (compositionInChild && view.state.selection.from > off &&\n                view.state.selection.to < off + child.nodeSize &&\n                (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n                updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n            else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) ;\n            else {\n                // Add it as a new view\n                updater.addNode(child, outerDeco, innerDeco, view, off);\n            }\n            off += child.nodeSize;\n        });\n        // Drop all remaining descs after the current position.\n        updater.syncToMarks([], inline, view, 0);\n        if (this.node.isTextblock)\n            updater.addTextblockHacks();\n        updater.destroyRest();\n        // Sync the DOM if anything changed\n        if (updater.changed || this.dirty == CONTENT_DIRTY) {\n            // May have to protect focused DOM from being changed if a composition is active\n            if (localComposition)\n                this.protectLocalComposition(view, localComposition);\n            renderDescs(this.contentDOM, this.children, view);\n            if (ios)\n                iosHacks(this.dom);\n        }\n    }\n    localCompositionInfo(view, pos) {\n        // Only do something if both the selection and a focused text node\n        // are inside of this node\n        let { from, to } = view.state.selection;\n        if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n            return null;\n        let textNode = view.input.compositionNode;\n        if (!textNode || !this.dom.contains(textNode.parentNode))\n            return null;\n        if (this.node.inlineContent) {\n            // Find the text in the focused node in the node, stop if it's not\n            // there (may have been modified through other means, in which\n            // case it should overwritten)\n            let text = textNode.nodeValue;\n            let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n            return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n        }\n        else {\n            return { node: textNode, pos: -1, text: \"\" };\n        }\n    }\n    protectLocalComposition(view, { node, pos, text }) {\n        // The node is already part of a local view desc, leave it there\n        if (this.getDesc(node))\n            return;\n        // Create a composition view for the orphaned nodes\n        let topNode = node;\n        for (;; topNode = topNode.parentNode) {\n            if (topNode.parentNode == this.contentDOM)\n                break;\n            while (topNode.previousSibling)\n                topNode.parentNode.removeChild(topNode.previousSibling);\n            while (topNode.nextSibling)\n                topNode.parentNode.removeChild(topNode.nextSibling);\n            if (topNode.pmViewDesc)\n                topNode.pmViewDesc = undefined;\n        }\n        let desc = new CompositionViewDesc(this, topNode, node, text);\n        view.input.compositionNodes.push(desc);\n        // Patch up this.children to contain the composition view\n        this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n    }\n    // If this desc must be updated to match the given node decoration,\n    // do so and return true.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateInner(node, outerDeco, innerDeco, view);\n        return true;\n    }\n    updateInner(node, outerDeco, innerDeco, view) {\n        this.updateOuterDeco(outerDeco);\n        this.node = node;\n        this.innerDeco = innerDeco;\n        if (this.contentDOM)\n            this.updateChildren(view, this.posAtStart);\n        this.dirty = NOT_DIRTY;\n    }\n    updateOuterDeco(outerDeco) {\n        if (sameOuterDeco(outerDeco, this.outerDeco))\n            return;\n        let needsWrap = this.nodeDOM.nodeType != 1;\n        let oldDOM = this.dom;\n        this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n        if (this.dom != oldDOM) {\n            oldDOM.pmViewDesc = undefined;\n            this.dom.pmViewDesc = this;\n        }\n        this.outerDeco = outerDeco;\n    }\n    // Mark this node as being the selected node.\n    selectNode() {\n        if (this.nodeDOM.nodeType == 1) {\n            this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n            if (this.contentDOM || !this.node.type.spec.draggable)\n                this.nodeDOM.draggable = true;\n        }\n    }\n    // Remove selected node marking from this node.\n    deselectNode() {\n        if (this.nodeDOM.nodeType == 1) {\n            this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n            if (this.contentDOM || !this.node.type.spec.draggable)\n                this.nodeDOM.removeAttribute(\"draggable\");\n        }\n    }\n    get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n    applyOuterDeco(dom, outerDeco, doc);\n    let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom);\n    if (docView.contentDOM)\n        docView.updateChildren(view, 0);\n    return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM) {\n        super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM);\n    }\n    parseRule() {\n        let skip = this.nodeDOM.parentNode;\n        while (skip && skip != this.dom && !skip.pmIsDeco)\n            skip = skip.parentNode;\n        return { skip: (skip || true) };\n    }\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateOuterDeco(outerDeco);\n        if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n            this.nodeDOM.nodeValue = node.text;\n            if (view.trackWrites == this.nodeDOM)\n                view.trackWrites = null;\n        }\n        this.node = node;\n        this.dirty = NOT_DIRTY;\n        return true;\n    }\n    inParent() {\n        let parentDOM = this.parent.contentDOM;\n        for (let n = this.nodeDOM; n; n = n.parentNode)\n            if (n == parentDOM)\n                return true;\n        return false;\n    }\n    domFromPos(pos) {\n        return { node: this.nodeDOM, offset: pos };\n    }\n    localPosFromDOM(dom, offset, bias) {\n        if (dom == this.nodeDOM)\n            return this.posAtStart + Math.min(offset, this.node.text.length);\n        return super.localPosFromDOM(dom, offset, bias);\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"characterData\" && mutation.type != \"selection\";\n    }\n    slice(from, to, _view) {\n        let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n        return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom);\n    }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n            this.dirty = NODE_DIRTY;\n    }\n    get domAtom() { return false; }\n    isText(text) { return this.node.text == text; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n    parseRule() { return { ignore: true }; }\n    matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n    get domAtom() { return true; }\n    get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec) {\n        super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM);\n        this.spec = spec;\n    }\n    // A custom `update` method gets to decide whether the update goes\n    // through. If it does, and there's a `contentDOM` node, our logic\n    // updates the children.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY)\n            return false;\n        if (this.spec.update && (this.node.type == node.type || this.spec.multiType)) {\n            let result = this.spec.update(node, outerDeco, innerDeco);\n            if (result)\n                this.updateInner(node, outerDeco, innerDeco, view);\n            return result;\n        }\n        else if (!this.contentDOM && !node.isLeaf) {\n            return false;\n        }\n        else {\n            return super.update(node, outerDeco, innerDeco, view);\n        }\n    }\n    selectNode() {\n        this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n    }\n    deselectNode() {\n        this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n    }\n    setSelection(anchor, head, view, force) {\n        this.spec.setSelection ? this.spec.setSelection(anchor, head, view.root)\n            : super.setSelection(anchor, head, view, force);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n    stopEvent(event) {\n        return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n    let dom = parentDOM.firstChild, written = false;\n    for (let i = 0; i < descs.length; i++) {\n        let desc = descs[i], childDOM = desc.dom;\n        if (childDOM.parentNode == parentDOM) {\n            while (childDOM != dom) {\n                dom = rm(dom);\n                written = true;\n            }\n            dom = dom.nextSibling;\n        }\n        else {\n            written = true;\n            parentDOM.insertBefore(childDOM, dom);\n        }\n        if (desc instanceof MarkViewDesc) {\n            let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n            renderDescs(desc.contentDOM, desc.children, view);\n            dom = pos ? pos.nextSibling : parentDOM.firstChild;\n        }\n    }\n    while (dom) {\n        dom = rm(dom);\n        written = true;\n    }\n    if (written && view.trackWrites == parentDOM)\n        view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n    if (nodeName)\n        this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n    if (outerDeco.length == 0)\n        return noDeco;\n    let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n    for (let i = 0; i < outerDeco.length; i++) {\n        let attrs = outerDeco[i].type.attrs;\n        if (!attrs)\n            continue;\n        if (attrs.nodeName)\n            result.push(top = new OuterDecoLevel(attrs.nodeName));\n        for (let name in attrs) {\n            let val = attrs[name];\n            if (val == null)\n                continue;\n            if (needsWrap && result.length == 1)\n                result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n            if (name == \"class\")\n                top.class = (top.class ? top.class + \" \" : \"\") + val;\n            else if (name == \"style\")\n                top.style = (top.style ? top.style + \";\" : \"\") + val;\n            else if (name != \"nodeName\")\n                top[name] = val;\n        }\n    }\n    return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n    // Shortcut for trivial case\n    if (prevComputed == noDeco && curComputed == noDeco)\n        return nodeDOM;\n    let curDOM = nodeDOM;\n    for (let i = 0; i < curComputed.length; i++) {\n        let deco = curComputed[i], prev = prevComputed[i];\n        if (i) {\n            let parent;\n            if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n                (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n                curDOM = parent;\n            }\n            else {\n                parent = document.createElement(deco.nodeName);\n                parent.pmIsDeco = true;\n                parent.appendChild(curDOM);\n                prev = noDeco[0];\n                curDOM = parent;\n            }\n        }\n        patchAttributes(curDOM, prev || noDeco[0], deco);\n    }\n    return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n    for (let name in prev)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n            dom.removeAttribute(name);\n    for (let name in cur)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n            dom.setAttribute(name, cur[name]);\n    if (prev.class != cur.class) {\n        let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n        let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n        for (let i = 0; i < prevList.length; i++)\n            if (curList.indexOf(prevList[i]) == -1)\n                dom.classList.remove(prevList[i]);\n        for (let i = 0; i < curList.length; i++)\n            if (prevList.indexOf(curList[i]) == -1)\n                dom.classList.add(curList[i]);\n        if (dom.classList.length == 0)\n            dom.removeAttribute(\"class\");\n    }\n    if (prev.style != cur.style) {\n        if (prev.style) {\n            let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n            while (m = prop.exec(prev.style))\n                dom.style.removeProperty(m[1]);\n        }\n        if (cur.style)\n            dom.style.cssText += cur.style;\n    }\n}\nfunction applyOuterDeco(dom, deco, node) {\n    return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n    if (a.length != b.length)\n        return false;\n    for (let i = 0; i < a.length; i++)\n        if (!a[i].type.eq(b[i].type))\n            return false;\n    return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n    let next = dom.nextSibling;\n    dom.parentNode.removeChild(dom);\n    return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n    constructor(top, lock, view) {\n        this.lock = lock;\n        this.view = view;\n        // Index into `this.top`'s child array, represents the current\n        // update position.\n        this.index = 0;\n        // When entering a mark, the current top and index are pushed\n        // onto this.\n        this.stack = [];\n        // Tracks whether anything was changed\n        this.changed = false;\n        this.top = top;\n        this.preMatch = preMatch(top.node.content, top);\n    }\n    // Destroy and remove the children between the given indices in\n    // `this.top`.\n    destroyBetween(start, end) {\n        if (start == end)\n            return;\n        for (let i = start; i < end; i++)\n            this.top.children[i].destroy();\n        this.top.children.splice(start, end - start);\n        this.changed = true;\n    }\n    // Destroy all remaining children in `this.top`.\n    destroyRest() {\n        this.destroyBetween(this.index, this.top.children.length);\n    }\n    // Sync the current stack of mark descs with the given array of\n    // marks, reusing existing mark descs when possible.\n    syncToMarks(marks, inline, view, parentIndex) {\n        let keep = 0, depth = this.stack.length >> 1;\n        let maxKeep = Math.min(depth, marks.length);\n        while (keep < maxKeep &&\n            (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n                .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n            keep++;\n        while (keep < depth) {\n            this.destroyRest();\n            this.top.dirty = NOT_DIRTY;\n            this.index = this.stack.pop();\n            this.top = this.stack.pop();\n            depth--;\n        }\n        while (depth < marks.length) {\n            this.stack.push(this.top, this.index + 1);\n            let found = -1, scanTo = this.top.children.length;\n            if (parentIndex < this.preMatch.index)\n                scanTo = Math.min(this.index + 3, scanTo);\n            for (let i = this.index; i < scanTo; i++) {\n                let next = this.top.children[i];\n                if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n                    found = i;\n                    break;\n                }\n            }\n            // When nothing matches, try to update the mark view at this position\n            // in place, so a custom mark view can adapt to a changed mark without\n            // re-creating its DOM.\n            if (found < 0 && this.index < this.top.children.length) {\n                let cur = this.top.children[this.index];\n                if (cur instanceof MarkViewDesc && cur.dirty != NODE_DIRTY &&\n                    cur.mark.type == marks[depth].type && cur.spec.update &&\n                    !this.isLocked(cur.dom) && cur.spec.update(marks[depth])) {\n                    cur.mark = marks[depth];\n                    found = this.index;\n                    this.changed = true;\n                }\n            }\n            if (found > -1) {\n                if (found > this.index) {\n                    this.changed = true;\n                    this.destroyBetween(this.index, found);\n                }\n                this.top = this.top.children[this.index];\n            }\n            else {\n                let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n                this.top.children.splice(this.index, 0, markDesc);\n                this.top = markDesc;\n                this.changed = true;\n            }\n            this.index = 0;\n            depth++;\n        }\n    }\n    // Try to find a node desc matching the given data. Skip over it and\n    // return true when successful.\n    findNodeMatch(node, outerDeco, innerDeco, index) {\n        let found = -1, targetDesc;\n        if (index >= this.preMatch.index &&\n            (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n            targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n            found = this.top.children.indexOf(targetDesc, this.index);\n        }\n        else {\n            for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n                let child = this.top.children[i];\n                if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n                    found = i;\n                    break;\n                }\n            }\n        }\n        if (found < 0)\n            return false;\n        this.destroyBetween(this.index, found);\n        this.index++;\n        return true;\n    }\n    updateNodeAt(node, outerDeco, innerDeco, index, view) {\n        let child = this.top.children[index];\n        if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n            child.dirty = CONTENT_DIRTY;\n        if (!child.update(node, outerDeco, innerDeco, view))\n            return false;\n        this.destroyBetween(this.index, index);\n        this.index++;\n        return true;\n    }\n    findIndexWithChild(domNode) {\n        for (;;) {\n            let parent = domNode.parentNode;\n            if (!parent)\n                return -1;\n            if (parent == this.top.contentDOM) {\n                let desc = domNode.pmViewDesc;\n                if (desc)\n                    for (let i = this.index; i < this.top.children.length; i++) {\n                        if (this.top.children[i] == desc)\n                            return i;\n                    }\n                return -1;\n            }\n            domNode = parent;\n        }\n    }\n    // Try to update the next node, if any, to the given data. Checks\n    // pre-matches to avoid overwriting nodes that could still be used.\n    updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n        for (let i = this.index; i < this.top.children.length; i++) {\n            let next = this.top.children[i];\n            if (next instanceof NodeViewDesc) {\n                let preMatch = this.preMatch.matched.get(next);\n                if (preMatch != null && preMatch != index)\n                    return false;\n                let nextDOM = next.dom, updated;\n                // Can't update if nextDOM is or contains this.lock, except if\n                // it's a text node whose content already matches the new text\n                // and whose decorations match the new ones.\n                let locked = this.isLocked(nextDOM) &&\n                    !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n                        next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n                if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n                    this.destroyBetween(this.index, i);\n                    if (next.dom != nextDOM)\n                        this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n                    this.destroyBetween(this.index, i);\n                    this.top.children[this.index] = updated;\n                    if (updated.contentDOM) {\n                        updated.dirty = CONTENT_DIRTY;\n                        updated.updateChildren(view, pos + 1);\n                        updated.dirty = NOT_DIRTY;\n                    }\n                    this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                break;\n            }\n        }\n        return false;\n    }\n    // When a node with content is replaced by a different node with\n    // identical content, move over its children.\n    recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n        if (next.dirty || node.isAtom || !next.children.length ||\n            !next.node.content.eq(node.content) ||\n            !sameOuterDeco(outerDeco, next.outerDeco) || !innerDeco.eq(next.innerDeco))\n            return null;\n        let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (wrapper.contentDOM) {\n            wrapper.children = next.children;\n            next.children = [];\n            for (let ch of wrapper.children)\n                ch.parent = wrapper;\n        }\n        next.destroy();\n        return wrapper;\n    }\n    // Insert the node as a newly created node desc.\n    addNode(node, outerDeco, innerDeco, view, pos) {\n        let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (desc.contentDOM)\n            desc.updateChildren(view, pos + 1);\n        this.top.children.splice(this.index++, 0, desc);\n        this.changed = true;\n    }\n    placeWidget(widget, view, pos) {\n        let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n        if (next && next.matchesWidget(widget) &&\n            (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n            this.index++;\n        }\n        else {\n            let desc = new WidgetViewDesc(this.top, widget, view, pos);\n            this.top.children.splice(this.index++, 0, desc);\n            this.changed = true;\n        }\n    }\n    // Make sure a textblock looks and behaves correctly in\n    // contentEditable.\n    addTextblockHacks() {\n        let lastChild = this.top.children[this.index - 1], parent = this.top;\n        while (lastChild instanceof MarkViewDesc) {\n            parent = lastChild;\n            lastChild = parent.children[parent.children.length - 1];\n        }\n        if (!lastChild || // Empty textblock\n            !(lastChild instanceof TextViewDesc) ||\n            /\\n$/.test(lastChild.node.text) ||\n            (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n            // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n            if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n                this.addHackNode(\"IMG\", parent);\n            this.addHackNode(\"BR\", this.top);\n        }\n    }\n    addHackNode(nodeName, parent) {\n        if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n            this.index++;\n        }\n        else {\n            let dom = document.createElement(nodeName);\n            if (nodeName == \"IMG\") {\n                dom.className = \"ProseMirror-separator\";\n                dom.alt = \"\";\n            }\n            if (nodeName == \"BR\")\n                dom.className = \"ProseMirror-trailingBreak\";\n            let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n            if (parent != this.top)\n                parent.children.push(hack);\n            else\n                parent.children.splice(this.index++, 0, hack);\n            this.changed = true;\n        }\n    }\n    isLocked(node) {\n        return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n    }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes.\nfunction preMatch(frag, parentDesc) {\n    let curDesc = parentDesc, descI = curDesc.children.length;\n    let fI = frag.childCount, matched = new Map, matches = [];\n    outer: while (fI > 0) {\n        let desc;\n        for (;;) {\n            if (descI) {\n                let next = curDesc.children[descI - 1];\n                if (next instanceof MarkViewDesc) {\n                    curDesc = next;\n                    descI = next.children.length;\n                }\n                else {\n                    desc = next;\n                    descI--;\n                    break;\n                }\n            }\n            else if (curDesc == parentDesc) {\n                break outer;\n            }\n            else {\n                descI = curDesc.parent.children.indexOf(curDesc);\n                curDesc = curDesc.parent;\n            }\n        }\n        let node = desc.node;\n        if (!node)\n            continue;\n        if (node != frag.child(fI - 1))\n            break;\n        --fI;\n        matched.set(desc, fI);\n        matches.push(desc);\n    }\n    return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n    return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n    let locals = deco.locals(parent), offset = 0;\n    // Simple, cheap variant for when there are no local decorations\n    if (locals.length == 0) {\n        for (let i = 0; i < parent.childCount; i++) {\n            let child = parent.child(i);\n            onNode(child, locals, deco.forChild(offset, child), i);\n            offset += child.nodeSize;\n        }\n        return;\n    }\n    let decoIndex = 0, active = [], restNode = null;\n    for (let parentIndex = 0;;) {\n        let widget, widgets;\n        while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n            let next = locals[decoIndex++];\n            if (next.widget) {\n                if (!widget)\n                    widget = next;\n                else\n                    (widgets || (widgets = [widget])).push(next);\n            }\n        }\n        if (widget) {\n            if (widgets) {\n                widgets.sort(compareSide);\n                for (let i = 0; i < widgets.length; i++)\n                    onWidget(widgets[i], parentIndex, !!restNode);\n            }\n            else {\n                onWidget(widget, parentIndex, !!restNode);\n            }\n        }\n        let child, index;\n        if (restNode) {\n            index = -1;\n            child = restNode;\n            restNode = null;\n        }\n        else if (parentIndex < parent.childCount) {\n            index = parentIndex;\n            child = parent.child(parentIndex++);\n        }\n        else {\n            break;\n        }\n        for (let i = 0; i < active.length; i++)\n            if (active[i].to <= offset)\n                active.splice(i--, 1);\n        while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n            active.push(locals[decoIndex++]);\n        let end = offset + child.nodeSize;\n        if (child.isText) {\n            let cutAt = end;\n            if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n                cutAt = locals[decoIndex].from;\n            for (let i = 0; i < active.length; i++)\n                if (active[i].to < cutAt)\n                    cutAt = active[i].to;\n            if (cutAt < end) {\n                restNode = child.cut(cutAt - offset);\n                child = child.cut(0, cutAt - offset);\n                end = cutAt;\n                index = -1;\n            }\n        }\n        else {\n            while (decoIndex < locals.length && locals[decoIndex].to < end)\n                decoIndex++;\n        }\n        let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n        onNode(child, outerDeco, deco.forChild(offset, child), index);\n        offset = end;\n    }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n    if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n        let oldCSS = dom.style.cssText;\n        dom.style.cssText = oldCSS + \"; list-style: square !important\";\n        window.getComputedStyle(dom).listStyle;\n        dom.style.cssText = oldCSS;\n    }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n    for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n        let child = frag.child(i++), childStart = pos;\n        pos += child.nodeSize;\n        if (!child.isText)\n            continue;\n        let str = child.text;\n        while (i < frag.childCount) {\n            let next = frag.child(i++);\n            pos += next.nodeSize;\n            if (!next.isText)\n                break;\n            str += next.text;\n        }\n        if (pos >= from) {\n            if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n                return to - text.length;\n            let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n            if (found >= 0 && found + text.length + childStart >= from)\n                return childStart + found;\n            if (from == to && str.length >= (to + text.length) - childStart &&\n                str.slice(to - childStart, to - childStart + text.length) == text)\n                return to;\n        }\n    }\n    return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n    let result = [];\n    for (let i = 0, off = 0; i < nodes.length; i++) {\n        let child = nodes[i], start = off, end = off += child.size;\n        if (start >= to || end <= from) {\n            result.push(child);\n        }\n        else {\n            if (start < from)\n                result.push(child.slice(0, from - start, view));\n            if (replacement) {\n                result.push(replacement);\n                replacement = undefined;\n            }\n            if (end > to)\n                result.push(child.slice(to - start, child.size, view));\n        }\n    }\n    return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n    let domSel = view.domSelectionRange(), doc = view.state.doc;\n    if (!domSel.focusNode)\n        return null;\n    let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n    let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n    if (head < 0)\n        return null;\n    let $head = doc.resolve(head), anchor, selection;\n    if (selectionCollapsed(domSel)) {\n        anchor = head;\n        while (nearestDesc && !nearestDesc.node)\n            nearestDesc = nearestDesc.parent;\n        let nearestDescNode = nearestDesc.node;\n        if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n            && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n            let pos = nearestDesc.posBefore;\n            selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n        }\n    }\n    else {\n        if (domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {\n            let min = head, max = head;\n            for (let i = 0; i < domSel.rangeCount; i++) {\n                let range = domSel.getRangeAt(i);\n                min = Math.min(min, view.docView.posFromDOM(range.startContainer, range.startOffset, 1));\n                max = Math.max(max, view.docView.posFromDOM(range.endContainer, range.endOffset, -1));\n            }\n            if (min < 0)\n                return null;\n            [anchor, head] = max == view.state.selection.anchor ? [max, min] : [min, max];\n            $head = doc.resolve(head);\n        }\n        else {\n            anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n        }\n        if (anchor < 0)\n            return null;\n    }\n    let $anchor = doc.resolve(anchor);\n    if (!selection) {\n        let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n        selection = selectionBetween(view, $anchor, $head, bias);\n    }\n    return selection;\n}\nfunction editorOwnsSelection(view) {\n    return view.editable ? view.hasFocus() :\n        hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n    let sel = view.state.selection;\n    syncNodeSelection(view, sel);\n    if (!editorOwnsSelection(view))\n        return;\n    // Need to delay selection normalization during a native selection\n    // drag on Chrome, or it will cause further dragging to glitch.\n    let mouseDown = view.input.mouseDown;\n    if (!force && chrome && mouseDown) {\n        let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n        if (domSel.anchorNode && curSel.anchorNode &&\n            isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset) &&\n            mouseDown.delaySelUpdate()) {\n            view.domObserver.setCurSelection();\n            return;\n        }\n    }\n    view.domObserver.disconnectSelection();\n    if (view.cursorWrapper) {\n        selectCursorWrapper(view);\n    }\n    else {\n        let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n        if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n            if (!sel.$from.parent.inlineContent)\n                resetEditableFrom = temporarilyEditableNear(view, sel.from);\n            if (!sel.empty && !sel.$from.parent.inlineContent)\n                resetEditableTo = temporarilyEditableNear(view, sel.to);\n        }\n        view.docView.setSelection(anchor, head, view, force);\n        if (brokenSelectBetweenUneditable) {\n            if (resetEditableFrom)\n                resetEditable(resetEditableFrom);\n            if (resetEditableTo)\n                resetEditable(resetEditableTo);\n        }\n        if (sel.visible) {\n            view.dom.classList.remove(\"ProseMirror-hideselection\");\n        }\n        else {\n            view.dom.classList.add(\"ProseMirror-hideselection\");\n            if (\"onselectionchange\" in document)\n                removeClassOnSelectionChange(view);\n        }\n    }\n    view.domObserver.setCurSelection();\n    view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n    let { node, offset } = view.docView.domFromPos(pos, 0);\n    let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n    let before = offset ? node.childNodes[offset - 1] : null;\n    if (safari && after && after.contentEditable == \"false\")\n        return setEditable(after);\n    if ((!after || after.contentEditable == \"false\") &&\n        (!before || before.contentEditable == \"false\")) {\n        if (after)\n            return setEditable(after);\n        else if (before)\n            return setEditable(before);\n    }\n}\nfunction setEditable(element) {\n    element.contentEditable = \"true\";\n    if (safari && element.draggable) {\n        element.draggable = false;\n        element.wasDraggable = true;\n    }\n    return element;\n}\nfunction resetEditable(element) {\n    element.contentEditable = \"false\";\n    if (element.wasDraggable) {\n        element.draggable = true;\n        element.wasDraggable = null;\n    }\n}\nfunction removeClassOnSelectionChange(view) {\n    let doc = view.dom.ownerDocument;\n    doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n    let domSel = view.domSelectionRange();\n    let node = domSel.anchorNode, offset = domSel.anchorOffset;\n    doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n        if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n            doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n            setTimeout(() => {\n                if (!editorOwnsSelection(view) || view.state.selection.visible)\n                    view.dom.classList.remove(\"ProseMirror-hideselection\");\n            }, 20);\n        }\n    });\n}\nfunction selectCursorWrapper(view) {\n    let domSel = view.domSelection();\n    if (!domSel)\n        return;\n    let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n    if (img)\n        domSel.collapse(node.parentNode, domIndex(node) + 1);\n    else\n        domSel.collapse(node, 0);\n    // Kludge to kill 'control selection' in IE11 when selecting an\n    // invisible cursor wrapper, since that would result in those weird\n    // resize handles and a selection that considers the absolutely\n    // positioned wrapper, rather than the root editable node, the\n    // focused element.\n    if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n        node.disabled = true;\n        node.disabled = false;\n    }\n}\nfunction syncNodeSelection(view, sel) {\n    if (sel instanceof NodeSelection) {\n        let desc = view.docView.descAt(sel.from);\n        if (desc != view.lastSelectedViewDesc) {\n            clearNodeSelection(view);\n            if (desc)\n                desc.selectNode();\n            view.lastSelectedViewDesc = desc;\n        }\n    }\n    else {\n        clearNodeSelection(view);\n    }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n    if (view.lastSelectedViewDesc) {\n        if (view.lastSelectedViewDesc.parent)\n            view.lastSelectedViewDesc.deselectNode();\n        view.lastSelectedViewDesc = undefined;\n    }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n    return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n        || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n    if (view.editable && !view.hasFocus())\n        return false;\n    return hasSelection(view);\n}\nfunction hasSelection(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.anchorNode)\n        return false;\n    try {\n        // Firefox will raise 'permission denied' errors when accessing\n        // properties of `sel.anchorNode` when it's in a generated CSS\n        // element.\n        return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n            (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n    }\n    catch (_) {\n        return false;\n    }\n}\nfunction anchorInRightPlace(view) {\n    let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n    let domSel = view.domSelectionRange();\n    return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n    let { $anchor, $head } = state.selection;\n    let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n    let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n    return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n    view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n    return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection) {\n        if (mods.indexOf(\"s\") > -1) {\n            let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n            if (!node || node.isText || !node.isLeaf)\n                return false;\n            let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n            return apply(view, new TextSelection(sel.$anchor, $newHead));\n        }\n        else if (!sel.empty) {\n            return false;\n        }\n        else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n            let next = moveSelectionBlock(view.state, dir);\n            if (next && (next instanceof NodeSelection))\n                return apply(view, next);\n            return false;\n        }\n        else if (!(mac && mods.indexOf(\"m\") > -1)) {\n            let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n            if (!node || node.isText)\n                return false;\n            let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n            if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n                return false;\n            if (NodeSelection.isSelectable(node)) {\n                return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n            }\n            else if (webkit) {\n                // Chrome and Safari will introduce extra pointless cursor\n                // positions around inline uneditable nodes, so we have to\n                // take over and move the cursor past them (#937)\n                return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    else if (sel instanceof NodeSelection && sel.node.isInline) {\n        return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n    }\n    else {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next)\n            return apply(view, next);\n        return false;\n    }\n}\nfunction nodeLen(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n    return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesBefore(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let moveNode, moveOffset, force = false;\n    // Gecko will do odd things when the selection is directly in front\n    // of a non-editable node, so in that case, move it into the next\n    // node if possible. Issue prosemirror/prosemirror#832.\n    if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n        force = true;\n    for (;;) {\n        if (offset > 0) {\n            if (node.nodeType != 1) {\n                break;\n            }\n            else {\n                let before = node.childNodes[offset - 1];\n                if (isIgnorable(before, -1)) {\n                    moveNode = node;\n                    moveOffset = --offset;\n                }\n                else if (before.nodeType == 3) {\n                    node = before;\n                    offset = node.nodeValue.length;\n                }\n                else\n                    break;\n            }\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let prev = node.previousSibling;\n            while (prev && isIgnorable(prev, -1)) {\n                moveNode = node.parentNode;\n                moveOffset = domIndex(prev);\n                prev = prev.previousSibling;\n            }\n            if (!prev) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = 0;\n            }\n            else {\n                node = prev;\n                offset = nodeLen(node);\n            }\n        }\n    }\n    if (force)\n        setSelFocus(view, node, offset);\n    else if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesAfter(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let len = nodeLen(node);\n    let moveNode, moveOffset;\n    for (;;) {\n        if (offset < len) {\n            if (node.nodeType != 1)\n                break;\n            let after = node.childNodes[offset];\n            if (isIgnorable(after, 1)) {\n                moveNode = node;\n                moveOffset = ++offset;\n            }\n            else\n                break;\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let next = node.nextSibling;\n            while (next && isIgnorable(next, 1)) {\n                moveNode = next.parentNode;\n                moveOffset = domIndex(next) + 1;\n                next = next.nextSibling;\n            }\n            if (!next) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = len = 0;\n            }\n            else {\n                node = next;\n                offset = 0;\n                len = nodeLen(node);\n            }\n        }\n    }\n    if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n    while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n        offset = domIndex(node) + 1;\n        node = node.parentNode;\n    }\n    while (node && offset < node.childNodes.length) {\n        let next = node.childNodes[offset];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = 0;\n    }\n}\nfunction textNodeBefore(node, offset) {\n    while (node && !offset && !hasBlockDesc(node)) {\n        offset = domIndex(node);\n        node = node.parentNode;\n    }\n    while (node && offset) {\n        let next = node.childNodes[offset - 1];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = node.childNodes.length;\n    }\n}\nfunction setSelFocus(view, node, offset) {\n    if (node.nodeType != 3) {\n        let before, after;\n        if (after = textNodeAfter(node, offset)) {\n            node = after;\n            offset = 0;\n        }\n        else if (before = textNodeBefore(node, offset)) {\n            node = before;\n            offset = before.nodeValue.length;\n        }\n    }\n    let sel = view.domSelection();\n    if (!sel)\n        return;\n    if (selectionCollapsed(sel)) {\n        let range = document.createRange();\n        range.setEnd(node, offset);\n        range.setStart(node, offset);\n        sel.removeAllRanges();\n        sel.addRange(range);\n    }\n    else if (sel.extend) {\n        sel.extend(node, offset);\n    }\n    view.domObserver.setCurSelection();\n    let { state } = view;\n    // If no state update ends up happening, reset the selection.\n    setTimeout(() => {\n        if (view.state == state)\n            selectionToDOM(view);\n    }, 50);\n}\nfunction findDirection(view, pos) {\n    let $pos = view.state.doc.resolve(pos);\n    if (!(chrome || windows) && $pos.parent.inlineContent) {\n        let coords = view.coordsAtPos(pos);\n        if (pos > $pos.start()) {\n            let before = view.coordsAtPos(pos - 1);\n            let mid = (before.top + before.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n                return before.left < coords.left ? \"ltr\" : \"rtl\";\n        }\n        if (pos < $pos.end()) {\n            let after = view.coordsAtPos(pos + 1);\n            let mid = (after.top + after.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n                return after.left > coords.left ? \"ltr\" : \"rtl\";\n        }\n    }\n    let computed = getComputedStyle(view.dom).direction;\n    return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n        return false;\n    if (mac && mods.indexOf(\"m\") > -1)\n        return false;\n    let { $from, $to } = sel;\n    if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next && (next instanceof NodeSelection))\n            return apply(view, next);\n    }\n    if (!$from.parent.inlineContent) {\n        let side = dir < 0 ? $from : $to;\n        let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n        return beyond ? apply(view, beyond) : false;\n    }\n    return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n    if (!(view.state.selection instanceof TextSelection))\n        return true;\n    let { $head, $anchor, empty } = view.state.selection;\n    if (!$head.sameParent($anchor))\n        return true;\n    if (!empty)\n        return false;\n    if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n        return true;\n    let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n    if (nextNode && !nextNode.isText) {\n        let tr = view.state.tr;\n        if (dir < 0)\n            tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n        else\n            tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n        view.dispatch(tr);\n        return true;\n    }\n    return false;\n}\nfunction switchEditable(view, node, state) {\n    view.domObserver.stop();\n    node.contentEditable = state;\n    view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n    if (!safari || view.state.selection.$head.parentOffset > 0)\n        return false;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n        focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n        let child = focusNode.firstChild;\n        switchEditable(view, child, \"true\");\n        setTimeout(() => switchEditable(view, child, \"false\"), 20);\n    }\n    return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n    let result = \"\";\n    if (event.ctrlKey)\n        result += \"c\";\n    if (event.metaKey)\n        result += \"m\";\n    if (event.altKey)\n        result += \"a\";\n    if (event.shiftKey)\n        result += \"s\";\n    return result;\n}\nfunction captureKeyDown(view, event) {\n    let code = event.keyCode, mods = getMods(event);\n    if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n        return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n    }\n    else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n        return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n    }\n    else if (code == 13 || code == 27) { // Enter, Esc\n        return true;\n    }\n    else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n        let dir = code == 37 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1) : -1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n        let dir = code == 39 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1) : 1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n        return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n    }\n    else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n        return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n    }\n    else if (mods == (mac ? \"m\" : \"c\") &&\n        (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n        return true;\n    }\n    return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n    view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n    let context = [], { content, openStart, openEnd } = slice;\n    while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n        openStart--;\n        openEnd--;\n        let node = content.firstChild;\n        context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n        content = node.content;\n    }\n    let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n    let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n    wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n    let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n    while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n        for (let i = needsWrap.length - 1; i >= 0; i--) {\n            let wrapper = doc.createElement(needsWrap[i]);\n            while (wrap.firstChild)\n                wrapper.appendChild(wrap.firstChild);\n            wrap.appendChild(wrapper);\n            wrappers++;\n        }\n        firstChild = wrap.firstChild;\n    }\n    if (firstChild && firstChild.nodeType == 1)\n        firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n    let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n        slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n    return { dom: wrap, text, slice };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n    let inCode = $context.parent.type.spec.code;\n    let dom, slice;\n    if (!html && !text)\n        return null;\n    let asText = !!text && (plainText || inCode || !html);\n    if (asText) {\n        view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n        if (inCode) {\n            slice = new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0);\n            view.someProp(\"transformPasted\", f => { slice = f(slice, view, true); });\n            return slice;\n        }\n        let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n        if (parsed) {\n            slice = parsed;\n        }\n        else {\n            let marks = $context.marks();\n            let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n            dom = document.createElement(\"div\");\n            text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n                let p = dom.appendChild(document.createElement(\"p\"));\n                if (block)\n                    p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n            });\n        }\n    }\n    else {\n        view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n        dom = readHTML(html);\n        if (webkit)\n            restoreReplacedSpaces(dom);\n    }\n    let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n    let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n    if (sliceData && sliceData[3])\n        for (let i = +sliceData[3]; i > 0; i--) {\n            let child = dom.firstChild;\n            while (child && child.nodeType != 1)\n                child = child.nextSibling;\n            if (!child)\n                break;\n            dom = child;\n        }\n    if (!slice) {\n        let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n        slice = parser.parseSlice(dom, {\n            preserveWhitespace: !!(asText || sliceData),\n            context: $context,\n            ruleFromNode(dom) {\n                if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n                    dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n                    return { ignore: true };\n                return null;\n            }\n        });\n    }\n    if (sliceData) {\n        slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n    }\n    else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n        slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n        if (slice.openStart || slice.openEnd) {\n            let openStart = 0, openEnd = 0;\n            for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n            for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n            slice = closeSlice(slice, openStart, openEnd);\n        }\n    }\n    view.someProp(\"transformPasted\", f => { slice = f(slice, view, asText); });\n    return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n    if (fragment.childCount < 2)\n        return fragment;\n    for (let d = $context.depth; d >= 0; d--) {\n        let parent = $context.node(d);\n        let match = parent.contentMatchAt($context.index(d));\n        let lastWrap, result = [];\n        fragment.forEach(node => {\n            if (!result)\n                return;\n            let wrap = match.findWrapping(node.type), inLast;\n            if (!wrap)\n                return result = null;\n            if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n                result[result.length - 1] = inLast;\n            }\n            else {\n                if (result.length)\n                    result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n                let wrapped = withWrappers(node, wrap);\n                result.push(wrapped);\n                match = match.matchType(wrapped.type);\n                lastWrap = wrap;\n            }\n        });\n        if (result)\n            return Fragment.from(result);\n    }\n    return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n    for (let i = wrap.length - 1; i >= from; i--)\n        node = wrap[i].create(null, Fragment.from(node));\n    return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n    if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n        let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n        if (inner)\n            return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n        let match = sibling.contentMatchAt(sibling.childCount);\n        if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n            return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n    }\n}\nfunction closeRight(node, depth) {\n    if (depth == 0)\n        return node;\n    let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n    let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n    return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n    let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n    if (fragment.childCount > 1)\n        openEnd = 0;\n    if (depth < to - 1)\n        inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n    if (depth >= from)\n        inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner)\n            : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n    return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n    if (openStart < slice.openStart)\n        slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n    if (openEnd < slice.openEnd)\n        slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n    return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n    thead: [\"table\"],\n    tbody: [\"table\"],\n    tfoot: [\"table\"],\n    caption: [\"table\"],\n    colgroup: [\"table\"],\n    col: [\"table\", \"colgroup\"],\n    tr: [\"table\", \"tbody\"],\n    td: [\"table\", \"tbody\", \"tr\"],\n    th: [\"table\", \"tbody\", \"tr\"]\n};\nfunction detachedDoc() {\n    return document.implementation.createHTMLDocument(\"title\");\n}\nlet _policy = null;\nfunction maybeWrapTrusted(html) {\n    let trustedTypes = window.trustedTypes;\n    if (!trustedTypes)\n        return html;\n    // With the require-trusted-types-for CSP, Chrome will block\n    // innerHTML, even on a detached document. This wraps the string in\n    // a way that makes the browser allow us to use its parser again.\n    if (!_policy) {\n        if (_policy = trustedTypes.defaultPolicy)\n            try {\n                return _policy.createHTML(html);\n            }\n            catch (_a) { }\n        _policy = trustedTypes.createPolicy(\"ProseMirrorClipboard\", { createHTML: (s) => s });\n    }\n    return _policy.createHTML(html);\n}\nfunction readHTML(html) {\n    let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n    if (metas)\n        html = html.slice(metas[0].length);\n    let doc = detachedDoc(), elt = doc.body;\n    let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n    if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n        html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n    elt.innerHTML = maybeWrapTrusted(html);\n    if (wrap)\n        for (let i = 0; i < wrap.length; i++)\n            elt = elt.querySelector(wrap[i]) || elt;\n    // Inline styles defined in the pasted content, so that parse rules pick them up\n    for (let i = 0; i < doc.styleSheets.length; i++) {\n        let style = doc.styleSheets[i];\n        for (let j = 0; j < style.rules.length; j++) {\n            let rule = style.rules[j];\n            if (rule instanceof CSSStyleRule) {\n                let matches = elt.querySelectorAll(rule.selectorText);\n                for (let k = 0; k < matches.length; k++)\n                    matches[k].style.cssText += rule.style.cssText;\n            }\n        }\n    }\n    return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n    let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n    for (let i = 0; i < nodes.length; i++) {\n        let node = nodes[i];\n        if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n            node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n    }\n}\nfunction addContext(slice, context) {\n    if (!slice.size)\n        return slice;\n    let schema = slice.content.firstChild.type.schema, array;\n    try {\n        array = JSON.parse(context);\n    }\n    catch (e) {\n        return slice;\n    }\n    let { content, openStart, openEnd } = slice;\n    for (let i = array.length - 2; i >= 0; i -= 2) {\n        let type = schema.nodes[array[i]];\n        if (!type || type.hasRequiredAttrs())\n            break;\n        try {\n            type.checkAttrs(array[i + 1]);\n        }\n        catch (e) {\n            break;\n        }\n        content = Fragment.from(type.create(array[i + 1], content));\n        openStart++;\n        openEnd++;\n    }\n    return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n    constructor() {\n        this.shiftKey = false;\n        this.mouseDown = null;\n        this.lastKeyCode = null;\n        this.lastKeyCodeTime = 0;\n        this.lastClick = { time: 0, x: 0, y: 0, type: \"\", button: 0 };\n        this.lastSelectionOrigin = null;\n        this.lastSelectionTime = 0;\n        this.lastIOSEnter = 0;\n        this.lastIOSEnterFallbackTimeout = -1;\n        this.lastFocus = 0;\n        this.lastTouch = 0;\n        this.lastChromeDelete = 0;\n        this.composing = false;\n        this.compositionNode = null;\n        this.composingTimeout = -1;\n        this.compositionNodes = [];\n        this.compositionEndedAt = -2e8;\n        this.compositionID = 1;\n        this.badSafariComposition = false;\n        // Set to a composition ID when there are pending changes at compositionend\n        this.compositionPendingChanges = 0;\n        this.domChangeCount = 0;\n        this.eventHandlers = Object.create(null);\n        this.hideSelectionGuard = null;\n    }\n}\nfunction initInput(view) {\n    for (let event in handlers) {\n        let handler = handlers[event];\n        view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n            if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n                (view.editable || !(event.type in editHandlers)))\n                handler(view, event);\n        }, passiveHandlers[event] ? { passive: true } : undefined);\n    }\n    // On Safari, for reasons beyond my understanding, adding an input\n    // event handler makes an issue where the composition vanishes when\n    // you press enter go away.\n    if (safari)\n        view.dom.addEventListener(\"input\", () => null);\n    ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n    view.input.lastSelectionOrigin = origin;\n    view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n    if (view.input.mouseDown)\n        view.input.mouseDown.done();\n    view.domObserver.stop();\n    for (let type in view.input.eventHandlers)\n        view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n    clearTimeout(view.input.composingTimeout);\n    clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n    view.someProp(\"handleDOMEvents\", currentHandlers => {\n        for (let type in currentHandlers)\n            if (!view.input.eventHandlers[type])\n                view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n    });\n}\nfunction runCustomHandler(view, event) {\n    return view.someProp(\"handleDOMEvents\", handlers => {\n        let handler = handlers[event.type];\n        return handler ? handler(view, event) || event.defaultPrevented : false;\n    });\n}\nfunction eventBelongsToView(view, event) {\n    if (!event.bubbles)\n        return true;\n    if (event.defaultPrevented)\n        return false;\n    for (let node = event.target; node != view.dom; node = node.parentNode)\n        if (!node || node.nodeType == 11 ||\n            (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n            return false;\n    return true;\n}\nfunction dispatchEvent(view, event) {\n    if (!runCustomHandler(view, event) && handlers[event.type] &&\n        (view.editable || !(event.type in editHandlers)))\n        handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n    if (inOrNearComposition(view))\n        return;\n    view.input.lastKeyCode = event.keyCode;\n    view.input.lastKeyCodeTime = Date.now();\n    // Suppress enter key events on Chrome Android, because those tend\n    // to be part of a confused sequence of composition events fired,\n    // and handling them eagerly tends to corrupt the input.\n    if (android && chrome && event.keyCode == 13)\n        return;\n    if (event.keyCode != 229)\n        view.domObserver.forceFlush();\n    // On iOS, if we preventDefault enter key presses, the virtual\n    // keyboard gets confused. So the hack here is to set a flag that\n    // makes the DOM change code recognize that what just happens should\n    // be replaced by whatever the Enter key handlers do.\n    if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n        let now = Date.now();\n        view.input.lastIOSEnter = now;\n        view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n            if (view.input.lastIOSEnter == now) {\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n                view.input.lastIOSEnter = 0;\n            }\n        }, 200);\n    }\n    else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"key\");\n    }\n};\neditHandlers.keyup = (view, event) => {\n    if (event.keyCode == 16)\n        view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n    let event = _event;\n    if (inOrNearComposition(view) || !event.charCode ||\n        event.ctrlKey && !event.altKey || mac && event.metaKey)\n        return;\n    if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n        event.preventDefault();\n        return;\n    }\n    let sel = view.state.selection;\n    if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n        let text = String.fromCharCode(event.charCode);\n        let deflt = () => view.state.tr.insertText(text).scrollIntoView();\n        if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text, deflt)))\n            view.dispatch(deflt());\n        event.preventDefault();\n    }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n    let dx = click.x - event.clientX, dy = click.y - event.clientY;\n    return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n            : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n            return true;\n    }\n    return false;\n}\nfunction updateSelection(view, selection, origin) {\n    if (!view.focused)\n        view.focus();\n    if (view.state.selection.eq(selection))\n        return;\n    let tr = view.state.tr.setSelection(selection);\n    if (origin == \"pointer\")\n        tr.setMeta(\"pointer\", true);\n    view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n    if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n        updateSelection(view, new NodeSelection($pos), \"pointer\");\n        return true;\n    }\n    return false;\n}\nfunction selectClickedNode(view, inside) {\n    if (inside == -1)\n        return false;\n    let sel = view.state.selection, selectedNode, selectAt;\n    if (sel instanceof NodeSelection)\n        selectedNode = sel.node;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        if (NodeSelection.isSelectable(node)) {\n            if (selectedNode && sel.$from.depth > 0 &&\n                i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n                selectAt = $pos.before(sel.$from.depth);\n            else\n                selectAt = $pos.before(i);\n            break;\n        }\n    }\n    if (selectAt != null) {\n        updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n        return true;\n    }\n    else {\n        return false;\n    }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n    return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n        (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n        defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n    if (event.button != 0)\n        return false;\n    let selection = selectionForTripleClick(view, inside, true), doc = view.state.doc;\n    if (!selection)\n        return false;\n    updateSelection(view, selection, \"pointer\");\n    if (selection instanceof TextSelection && doc.eq(view.state.doc))\n        view.input.mouseDown = new TripleClickDrag(view, selection);\n    return true;\n}\nfunction selectionForTripleClick(view, inside, selectNodes) {\n    let doc = view.state.doc;\n    if (inside == -1)\n        return doc.inlineContent ? TextSelection.create(doc, 0, doc.content.size) : null;\n    let $pos = doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        let nodePos = $pos.before(i);\n        if (node.inlineContent)\n            return TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size);\n        else if (selectNodes && NodeSelection.isSelectable(node))\n            return NodeSelection.create(doc, nodePos);\n    }\n    return null;\n}\nfunction forceDOMFlush(view) {\n    return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.shiftKey;\n    let flushed = forceDOMFlush(view);\n    let now = Date.now(), type = \"singleClick\";\n    if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier] &&\n        view.input.lastClick.button == event.button) {\n        if (view.input.lastClick.type == \"singleClick\")\n            type = \"doubleClick\";\n        else if (view.input.lastClick.type == \"doubleClick\")\n            type = \"tripleClick\";\n    }\n    view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type, button: event.button };\n    if (view.input.mouseDown)\n        view.input.mouseDown.done();\n    let pos = view.posAtCoords(eventCoords(event));\n    if (!pos)\n        return;\n    if (type == \"singleClick\") {\n        view.input.mouseDown = new LeftMouseDown(view, pos, event, !!flushed);\n    }\n    else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"pointer\");\n    }\n};\nclass MouseDown {\n    constructor(view) {\n        this.view = view;\n        this.mightDrag = null;\n        view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n        view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n    }\n    up(event) {\n        this.done();\n    }\n    move(event) {\n        if (event.buttons == 0)\n            this.done();\n    }\n    done() {\n        this.view.root.removeEventListener(\"mouseup\", this.up);\n        this.view.root.removeEventListener(\"mousemove\", this.move);\n        if (this.view.input.mouseDown == this)\n            this.view.input.mouseDown = null;\n    }\n    delaySelUpdate() { return false; }\n}\nclass LeftMouseDown extends MouseDown {\n    constructor(view, pos, event, flushed) {\n        super(view);\n        this.pos = pos;\n        this.event = event;\n        this.flushed = flushed;\n        this.delayedSelectionSync = false;\n        this.startDoc = view.state.doc;\n        this.selectNode = !!event[selectNodeModifier];\n        this.allowDefault = event.shiftKey;\n        let targetNode, targetPos;\n        if (pos.inside > -1) {\n            targetNode = view.state.doc.nodeAt(pos.inside);\n            targetPos = pos.inside;\n        }\n        else {\n            let $pos = view.state.doc.resolve(pos.pos);\n            targetNode = $pos.parent;\n            targetPos = $pos.depth ? $pos.before() : 0;\n        }\n        const target = flushed ? null : event.target;\n        const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n        this.target = targetDesc && targetDesc.nodeDOM.nodeType == 1 ? targetDesc.nodeDOM : null;\n        let { selection } = view.state;\n        if (event.button == 0 &&\n            (targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n                selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos))\n            this.mightDrag = {\n                node: targetNode,\n                pos: targetPos,\n                addAttr: !!(this.target && !this.target.draggable),\n                setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n            };\n        if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.draggable = true;\n            if (this.mightDrag.setUneditable)\n                setTimeout(() => {\n                    if (this.view.input.mouseDown == this)\n                        this.target.setAttribute(\"contentEditable\", \"false\");\n                }, 20);\n            this.view.domObserver.start();\n        }\n        setSelectionOrigin(view, \"pointer\");\n    }\n    done() {\n        super.done();\n        if (this.mightDrag && this.target) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.removeAttribute(\"draggable\");\n            if (this.mightDrag.setUneditable)\n                this.target.removeAttribute(\"contentEditable\");\n            this.view.domObserver.start();\n        }\n        if (this.delayedSelectionSync)\n            setTimeout(() => {\n                if (!this.view.isDestroyed)\n                    selectionToDOM(this.view);\n            });\n    }\n    up(event) {\n        this.done();\n        if (!this.view.dom.contains(event.target))\n            return;\n        let pos = this.pos;\n        if (this.view.state.doc != this.startDoc)\n            pos = this.view.posAtCoords(eventCoords(event));\n        this.updateAllowDefault(event);\n        if (this.allowDefault || !pos) {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n        else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n            event.preventDefault();\n        }\n        else if (event.button == 0 &&\n            (this.flushed ||\n                // Safari ignores clicks on draggable elements\n                (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n                // Chrome will sometimes treat a node selection as a\n                // cursor, but still report that the node is selected\n                // when asked through getSelection. You'll then get a\n                // situation where clicking at the point where that\n                // (hidden) cursor is doesn't change the selection, and\n                // thus doesn't get a reaction from ProseMirror. This\n                // works around that.\n                (chrome && !this.view.state.selection.visible &&\n                    Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n            updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n            event.preventDefault();\n        }\n        else {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n    }\n    move(event) {\n        this.updateAllowDefault(event);\n        setSelectionOrigin(this.view, \"pointer\");\n        super.move(event);\n    }\n    updateAllowDefault(event) {\n        if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n            Math.abs(this.event.y - event.clientY) > 4))\n            this.allowDefault = true;\n    }\n    delaySelUpdate() {\n        if (!this.allowDefault)\n            return false;\n        this.delayedSelectionSync = true;\n        return true;\n    }\n}\nclass TripleClickDrag extends MouseDown {\n    constructor(view, startSelection) {\n        super(view);\n        this.startSelection = startSelection;\n        this.startDoc = view.state.doc;\n    }\n    move(event) {\n        if (event.buttons == 0 || this.view.isDestroyed || !this.view.state.doc.eq(this.startDoc)) {\n            this.done();\n            return;\n        }\n        event.preventDefault();\n        setSelectionOrigin(this.view, \"pointer\");\n        let pos = this.view.posAtCoords(eventCoords(event));\n        let target = pos && selectionForTripleClick(this.view, pos.inside, false);\n        if (!target)\n            return;\n        let { doc } = this.view.state, start = this.startSelection;\n        let [anchor, head] = target.from < start.from ? [start.to, target.from] : [start.from, target.to];\n        updateSelection(this.view, TextSelection.create(doc, anchor, head), \"pointer\");\n    }\n}\nhandlers.touchstart = view => {\n    view.input.lastTouch = Date.now();\n    forceDOMFlush(view);\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n    view.input.lastTouch = Date.now();\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n    if (view.composing)\n        return true;\n    // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n    // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n    // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n    // emitted. The keydown event triggers newline insertion, which we don't want.\n    // This method returns true if the keydown event should be ignored.\n    // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n    // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n    // This guards against the case where compositionend is triggered without the keyboard\n    // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n    // afterwards- we wouldn't want to ignore the keydown event in this case.\n    if (safari && Math.abs(Date.now() - view.input.compositionEndedAt) < 500) {\n        view.input.compositionEndedAt = -2e8;\n        return true;\n    }\n    return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n    if (!view.composing) {\n        view.domObserver.flush();\n        let { state } = view, $pos = state.selection.$to;\n        if (state.selection instanceof TextSelection &&\n            (state.storedMarks ||\n                (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)) ||\n                chrome && windows && selectionBeforeUneditable(view))) { // Issue #1500\n            // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n            view.markCursor = view.state.storedMarks || $pos.marks();\n            endComposition(view, true);\n            view.markCursor = null;\n        }\n        else {\n            endComposition(view, !state.selection.empty);\n            // In firefox, if the cursor is after but outside a marked node,\n            // the inserted text won't inherit the marks. So this moves it\n            // inside if necessary.\n            if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n                let sel = view.domSelectionRange();\n                for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n                    let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n                    if (!before)\n                        break;\n                    if (before.nodeType == 3) {\n                        let sel = view.domSelection();\n                        if (sel)\n                            sel.collapse(before, before.nodeValue.length);\n                        break;\n                    }\n                    else {\n                        node = before;\n                        offset = -1;\n                    }\n                }\n            }\n        }\n        view.input.composing = true;\n    }\n    scheduleComposeEnd(view, timeoutComposition);\n};\nfunction selectionBeforeUneditable(view) {\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (!focusNode || focusNode.nodeType != 1 || focusOffset >= focusNode.childNodes.length)\n        return false;\n    let next = focusNode.childNodes[focusOffset];\n    return next.nodeType == 1 && next.contentEditable == \"false\";\n}\neditHandlers.compositionend = (view, event) => {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = Date.now();\n        view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n        view.input.compositionNode = null;\n        if (view.input.badSafariComposition)\n            view.domObserver.forceFlush();\n        else if (view.input.compositionPendingChanges)\n            Promise.resolve().then(() => view.domObserver.flush());\n        view.input.compositionID++;\n        scheduleComposeEnd(view, 20);\n    }\n};\nfunction scheduleComposeEnd(view, delay) {\n    clearTimeout(view.input.composingTimeout);\n    if (delay > -1)\n        view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = Date.now();\n    }\n    while (view.input.compositionNodes.length > 0)\n        view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction findCompositionNode(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.focusNode)\n        return null;\n    let textBefore = textNodeBefore$1(sel.focusNode, sel.focusOffset);\n    let textAfter = textNodeAfter$1(sel.focusNode, sel.focusOffset);\n    if (textBefore && textAfter && textBefore != textAfter) {\n        let descAfter = textAfter.pmViewDesc, lastChanged = view.domObserver.lastChangedTextNode;\n        if (textBefore == lastChanged || textAfter == lastChanged)\n            return lastChanged;\n        if (!descAfter || !descAfter.isText(textAfter.nodeValue)) {\n            return textAfter;\n        }\n        else if (view.input.compositionNode == textAfter) {\n            let descBefore = textBefore.pmViewDesc;\n            if (!(!descBefore || !descBefore.isText(textBefore.nodeValue)))\n                return textAfter;\n        }\n    }\n    return textBefore || textAfter;\n}\n/**\n@internal\n*/\nfunction endComposition(view, restarting = false) {\n    if (android && view.domObserver.flushingSoon >= 0)\n        return;\n    view.domObserver.forceFlush();\n    clearComposition(view);\n    if (restarting || view.docView && view.docView.dirty) {\n        let sel = selectionFromDOM(view), cur = view.state.selection;\n        if (sel && !sel.eq(cur))\n            view.dispatch(view.state.tr.setSelection(sel));\n        else if ((view.markCursor || restarting) && !cur.$from.node(cur.$from.sharedDepth(cur.to)).inlineContent)\n            view.dispatch(view.state.tr.deleteSelection());\n        else\n            view.updateState(view.state);\n        return true;\n    }\n    return false;\n}\nfunction captureCopy(view, dom) {\n    // The extra wrapper is somehow necessary on IE/Edge to prevent the\n    // content from being mangled when it is put onto the clipboard\n    if (!view.dom.parentNode)\n        return;\n    let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n    wrap.appendChild(dom);\n    wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    let sel = getSelection(), range = document.createRange();\n    range.selectNodeContents(dom);\n    // Done because IE will fire a selectionchange moving the selection\n    // to its start when removeAllRanges is called and the editor still\n    // has focus (which will mess up the editor's selection state).\n    view.dom.blur();\n    sel.removeAllRanges();\n    sel.addRange(range);\n    setTimeout(() => {\n        if (wrap.parentNode)\n            wrap.parentNode.removeChild(wrap);\n        view.focus();\n    }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n    (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n    let event = _event;\n    let sel = view.state.selection, cut = event.type == \"cut\";\n    if (sel.empty)\n        return;\n    // IE and Edge's clipboard interface is completely broken\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n    if (data) {\n        event.preventDefault();\n        data.clearData();\n        data.setData(\"text/html\", dom.innerHTML);\n        data.setData(\"text/plain\", text);\n    }\n    else {\n        captureCopy(view, dom);\n    }\n    if (cut)\n        view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n    return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n    if (!view.dom.parentNode)\n        return;\n    let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n    let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n    if (!plainText)\n        target.contentEditable = \"true\";\n    target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    target.focus();\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    setTimeout(() => {\n        view.focus();\n        if (target.parentNode)\n            target.parentNode.removeChild(target);\n        if (plainText)\n            doPaste(view, target.value, null, plain, event);\n        else\n            doPaste(view, target.textContent, target.innerHTML, plain, event);\n    }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n    let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n    if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n        return true;\n    if (!slice)\n        return false;\n    let singleNode = sliceSingleNode(slice);\n    let tr = singleNode\n        ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)\n        : view.state.tr.replaceSelection(slice);\n    view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n    return true;\n}\nfunction getText(clipboardData) {\n    let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n    if (text)\n        return text;\n    let uris = clipboardData.getData(\"text/uri-list\");\n    return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n    let event = _event;\n    // Handling paste from JavaScript during composition is very poorly\n    // handled by browsers, so as a dodgy but preferable kludge, we just\n    // let the browser do its native thing there, except on Android,\n    // where the editor is almost always composing.\n    if (view.composing && !android)\n        return;\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n        event.preventDefault();\n    else\n        capturePaste(view, event);\n};\nclass Dragging {\n    constructor(slice, move, node) {\n        this.slice = slice;\n        this.move = move;\n        this.node = node;\n    }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nfunction dragMoves(view, event) {\n    let copy;\n    view.someProp(\"dragCopies\", test => { copy = copy || test(event); });\n    return copy != null ? !copy : !event[dragCopyModifier];\n}\nhandlers.dragstart = (view, _event) => {\n    let event = _event;\n    let mouseDown = view.input.mouseDown;\n    if (mouseDown)\n        mouseDown.done();\n    if (!event.dataTransfer)\n        return;\n    let sel = view.state.selection;\n    let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n    let node;\n    if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n    else if (mouseDown && mouseDown.mightDrag) {\n        node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n    }\n    else if (event.target && event.target.nodeType == 1) {\n        let desc = view.docView.nearestDesc(event.target, true);\n        if (desc && desc.node.type.spec.draggable && desc != view.docView)\n            node = NodeSelection.create(view.state.doc, desc.posBefore);\n    }\n    let draggedSlice = (node || view.state.selection).content();\n    let { dom, text, slice } = serializeForClipboard(view, draggedSlice);\n    // Pre-120 Chrome versions clear files when calling `clearData` (#1472)\n    if (!event.dataTransfer.files.length || !chrome || chrome_version > 120)\n        event.dataTransfer.clearData();\n    event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n    // See https://code.haverbeke.berlin/prosemirror/prosemirror/issues/1156\n    event.dataTransfer.effectAllowed = \"copyMove\";\n    if (!brokenClipboardAPI)\n        event.dataTransfer.setData(\"text/plain\", text);\n    view.dragging = new Dragging(slice, dragMoves(view, event), node);\n};\nhandlers.dragend = view => {\n    let dragging = view.dragging;\n    window.setTimeout(() => {\n        if (view.dragging == dragging)\n            view.dragging = null;\n    }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, event) => {\n    try {\n        handleDrop(view, event, view.dragging);\n    }\n    finally {\n        view.dragging = null;\n    }\n};\nfunction handleDrop(view, event, dragging) {\n    if (!event.dataTransfer)\n        return;\n    let eventPos = view.posAtCoords(eventCoords(event));\n    if (!eventPos)\n        return;\n    let $mouse = view.state.doc.resolve(eventPos.pos);\n    let slice = dragging && dragging.slice;\n    if (slice) {\n        view.someProp(\"transformPasted\", f => { slice = f(slice, view, false); });\n    }\n    else {\n        slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n    }\n    let move = !!(dragging && dragMoves(view, event));\n    if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n        event.preventDefault();\n        return;\n    }\n    if (!slice)\n        return;\n    event.preventDefault();\n    let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n    if (insertPos == null)\n        insertPos = $mouse.pos;\n    let tr = view.state.tr;\n    if (move) {\n        let { node } = dragging;\n        if (node)\n            node.replace(tr);\n        else\n            tr.deleteSelection();\n    }\n    let pos = tr.mapping.map(insertPos);\n    let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n    let beforeInsert = tr.doc;\n    if (isNode)\n        tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n    else\n        tr.replaceRange(pos, pos, slice);\n    if (tr.doc.eq(beforeInsert))\n        return;\n    let $pos = tr.doc.resolve(pos);\n    if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n        $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n        tr.setSelection(new NodeSelection($pos));\n    }\n    else {\n        let end = tr.mapping.map(insertPos);\n        tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n        tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n    }\n    view.focus();\n    view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n}\nhandlers.focus = view => {\n    view.input.lastFocus = Date.now();\n    if (!view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.add(\"ProseMirror-focused\");\n        view.domObserver.start();\n        view.focused = true;\n        setTimeout(() => {\n            if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n                selectionToDOM(view);\n        }, 20);\n    }\n};\nhandlers.blur = (view, _event) => {\n    let event = _event;\n    if (view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.remove(\"ProseMirror-focused\");\n        view.domObserver.start();\n        if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n            view.domObserver.currentSelection.clear();\n        view.focused = false;\n    }\n};\nhandlers.beforeinput = (view, _event) => {\n    let event = _event;\n    // We should probably do more with beforeinput events, but support\n    // is so spotty that I'm still waiting to see where they are going.\n    // Very specific hack to deal with backspace sometimes failing on\n    // Chrome and Firefox Android when after an uneditable node.\n    if (android && event.inputType == \"deleteContentBackward\") {\n        view.domObserver.flushSoon();\n        let { domChangeCount } = view.input;\n        setTimeout(() => {\n            if (view.input.domChangeCount != domChangeCount)\n                return; // Event already had some effect\n            // This bug tends to close the virtual keyboard, so we refocus\n            view.dom.blur();\n            view.focus();\n            if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n                return;\n            let { $cursor } = view.state.selection;\n            // Crude approximation of backspace behavior when no command handled it\n            if ($cursor && $cursor.pos > 0)\n                view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n        }, 50);\n    }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n    handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n    if (a == b)\n        return true;\n    for (let p in a)\n        if (a[p] !== b[p])\n            return false;\n    for (let p in b)\n        if (!(p in a))\n            return false;\n    return true;\n}\nclass WidgetType {\n    constructor(toDOM, spec) {\n        this.toDOM = toDOM;\n        this.spec = spec || noSpec;\n        this.side = this.spec.side || 0;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n        return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n    }\n    valid() { return true; }\n    eq(other) {\n        return this == other ||\n            (other instanceof WidgetType &&\n                (this.spec.key && this.spec.key == other.spec.key ||\n                    this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n    }\n    destroy(node) {\n        if (this.spec.destroy)\n            this.spec.destroy(node);\n    }\n}\nclass InlineType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n        let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n        return from >= to ? null : new Decoration(from, to, this);\n    }\n    valid(_, span) { return span.from < span.to; }\n    eq(other) {\n        return this == other ||\n            (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    static is(span) { return span.type instanceof InlineType; }\n    destroy() { }\n}\nclass NodeType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.mapResult(span.from + oldOffset, 1);\n        if (from.deleted)\n            return null;\n        let to = mapping.mapResult(span.to + oldOffset, -1);\n        if (to.deleted || to.pos <= from.pos)\n            return null;\n        return new Decoration(from.pos - offset, to.pos - offset, this);\n    }\n    valid(node, span) {\n        let { index, offset } = node.content.findIndex(span.from), child;\n        return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n    }\n    eq(other) {\n        return this == other ||\n            (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The start position of the decoration.\n    */\n    from, \n    /**\n    The end position. Will be the same as `from` for [widget\n    decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n    */\n    to, \n    /**\n    @internal\n    */\n    type) {\n        this.from = from;\n        this.to = to;\n        this.type = type;\n    }\n    /**\n    @internal\n    */\n    copy(from, to) {\n        return new Decoration(from, to, this.type);\n    }\n    /**\n    @internal\n    */\n    eq(other, offset = 0) {\n        return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n    }\n    /**\n    @internal\n    */\n    map(mapping, offset, oldOffset) {\n        return this.type.map(mapping, this, offset, oldOffset);\n    }\n    /**\n    Creates a widget decoration, which is a DOM node that's shown in\n    the document at the given position. It is recommended that you\n    delay rendering the widget by passing a function that will be\n    called when the widget is actually drawn in a view, but you can\n    also directly pass a DOM node. `getPos` can be used to find the\n    widget's current document position.\n    */\n    static widget(pos, toDOM, spec) {\n        return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n    }\n    /**\n    Creates an inline decoration, which adds the given attributes to\n    each inline node between `from` and `to`.\n    */\n    static inline(from, to, attrs, spec) {\n        return new Decoration(from, to, new InlineType(attrs, spec));\n    }\n    /**\n    Creates a node decoration. `from` and `to` should point precisely\n    before and after a node in the document. That node, and only that\n    node, will receive the given attributes.\n    */\n    static node(from, to, attrs, spec) {\n        return new Decoration(from, to, new NodeType(attrs, spec));\n    }\n    /**\n    The spec provided when creating this decoration. Can be useful\n    if you've stored extra information in that object.\n    */\n    get spec() { return this.type.spec; }\n    /**\n    @internal\n    */\n    get inline() { return this.type instanceof InlineType; }\n    /**\n    @internal\n    */\n    get widget() { return this.type instanceof WidgetType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n    /**\n    @internal\n    */\n    constructor(local, children) {\n        this.local = local.length ? local : none;\n        this.children = children.length ? children : none;\n    }\n    /**\n    Create a set of decorations, using the structure of the given\n    document. This will consume (modify) the `decorations` array, so\n    you must make a copy if you want need to preserve that.\n    */\n    static create(doc, decorations) {\n        return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n    }\n    /**\n    Find all decorations in this set which touch the given range\n    (including decorations that start or end directly at the\n    boundaries) and match the given predicate on their spec. When\n    `start` and `end` are omitted, all decorations in the set are\n    considered. When `predicate` isn't given, all decorations are\n    assumed to match.\n    */\n    find(start, end, predicate) {\n        let result = [];\n        this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n        return result;\n    }\n    findInner(start, end, result, offset, predicate) {\n        for (let i = 0; i < this.local.length; i++) {\n            let span = this.local[i];\n            if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n                result.push(span.copy(span.from + offset, span.to + offset));\n        }\n        for (let i = 0; i < this.children.length; i += 3) {\n            if (this.children[i] < end && this.children[i + 1] > start) {\n                let childOff = this.children[i] + 1;\n                this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n            }\n        }\n    }\n    /**\n    Map the set of decorations in response to a change in the\n    document.\n    */\n    map(mapping, doc, options) {\n        if (this == empty || mapping.maps.length == 0)\n            return this;\n        return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n    }\n    /**\n    @internal\n    */\n    mapInner(mapping, node, offset, oldOffset, options) {\n        let newLocal;\n        for (let i = 0; i < this.local.length; i++) {\n            let mapped = this.local[i].map(mapping, offset, oldOffset);\n            if (mapped && mapped.type.valid(node, mapped))\n                (newLocal || (newLocal = [])).push(mapped);\n            else if (options.onRemove)\n                options.onRemove(this.local[i].spec);\n        }\n        if (this.children.length)\n            return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n        else\n            return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n    }\n    /**\n    Add the given array of decorations to the ones in the set,\n    producing a new set. Consumes the `decorations` array. Needs\n    access to the current document to create the appropriate tree\n    structure.\n    */\n    add(doc, decorations) {\n        if (!decorations.length)\n            return this;\n        if (this == empty)\n            return DecorationSet.create(doc, decorations);\n        return this.addInner(doc, decorations, 0);\n    }\n    addInner(doc, decorations, offset) {\n        let children, childIndex = 0;\n        doc.forEach((childNode, childOffset) => {\n            let baseOffset = childOffset + offset, found;\n            if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n                return;\n            if (!children)\n                children = this.children.slice();\n            while (childIndex < children.length && children[childIndex] < childOffset)\n                childIndex += 3;\n            if (children[childIndex] == childOffset)\n                children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n            else\n                children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n            childIndex += 3;\n        });\n        let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n        for (let i = 0; i < local.length; i++)\n            if (!local[i].type.valid(doc, local[i]))\n                local.splice(i--, 1);\n        return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n    }\n    /**\n    Create a new set that contains the decorations in this set, minus\n    the ones in the given array.\n    */\n    remove(decorations) {\n        if (decorations.length == 0 || this == empty)\n            return this;\n        return this.removeInner(decorations, 0);\n    }\n    removeInner(decorations, offset) {\n        let children = this.children, local = this.local;\n        for (let i = 0; i < children.length; i += 3) {\n            let found;\n            let from = children[i] + offset, to = children[i + 1] + offset;\n            for (let j = 0, span; j < decorations.length; j++)\n                if (span = decorations[j]) {\n                    if (span.from > from && span.to < to) {\n                        decorations[j] = null;\n                        (found || (found = [])).push(span);\n                    }\n                }\n            if (!found)\n                continue;\n            if (children == this.children)\n                children = this.children.slice();\n            let removed = children[i + 2].removeInner(found, from + 1);\n            if (removed != empty) {\n                children[i + 2] = removed;\n            }\n            else {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        }\n        if (local.length)\n            for (let i = 0, span; i < decorations.length; i++)\n                if (span = decorations[i]) {\n                    for (let j = 0; j < local.length; j++)\n                        if (local[j].eq(span, offset)) {\n                            if (local == this.local)\n                                local = this.local.slice();\n                            local.splice(j--, 1);\n                        }\n                }\n        if (children == this.children && local == this.local)\n            return this;\n        return local.length || children.length ? new DecorationSet(local, children) : empty;\n    }\n    forChild(offset, node) {\n        if (this == empty)\n            return this;\n        if (node.isLeaf)\n            return DecorationSet.empty;\n        let child, local;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] >= offset) {\n                if (this.children[i] == offset)\n                    child = this.children[i + 2];\n                break;\n            }\n        let start = offset + 1, end = start + node.content.size;\n        for (let i = 0; i < this.local.length; i++) {\n            let dec = this.local[i];\n            if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n                let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n                if (from < to)\n                    (local || (local = [])).push(dec.copy(from, to));\n            }\n        }\n        if (local) {\n            let localSet = new DecorationSet(local.sort(byPos), none);\n            return child ? new DecorationGroup([localSet, child]) : localSet;\n        }\n        return child || empty;\n    }\n    /**\n    @internal\n    */\n    eq(other) {\n        if (this == other)\n            return true;\n        if (!(other instanceof DecorationSet) ||\n            this.local.length != other.local.length ||\n            this.children.length != other.children.length)\n            return false;\n        for (let i = 0; i < this.local.length; i++)\n            if (!this.local[i].eq(other.local[i]))\n                return false;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] != other.children[i] ||\n                this.children[i + 1] != other.children[i + 1] ||\n                !this.children[i + 2].eq(other.children[i + 2]))\n                return false;\n        return true;\n    }\n    /**\n    @internal\n    */\n    locals(node) {\n        return removeOverlap(this.localsInner(node));\n    }\n    /**\n    @internal\n    */\n    localsInner(node) {\n        if (this == empty)\n            return none;\n        if (node.inlineContent || !this.local.some(InlineType.is))\n            return this.local;\n        let result = [];\n        for (let i = 0; i < this.local.length; i++) {\n            if (!(this.local[i].type instanceof InlineType))\n                result.push(this.local[i]);\n        }\n        return result;\n    }\n    forEachSet(f) { f(this); }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n    constructor(members) {\n        this.members = members;\n    }\n    map(mapping, doc) {\n        const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n        return DecorationGroup.from(mappedDecos);\n    }\n    forChild(offset, child) {\n        if (child.isLeaf)\n            return DecorationSet.empty;\n        let found = [];\n        for (let i = 0; i < this.members.length; i++) {\n            let result = this.members[i].forChild(offset, child);\n            if (result == empty)\n                continue;\n            if (result instanceof DecorationGroup)\n                found = found.concat(result.members);\n            else\n                found.push(result);\n        }\n        return DecorationGroup.from(found);\n    }\n    eq(other) {\n        if (!(other instanceof DecorationGroup) ||\n            other.members.length != this.members.length)\n            return false;\n        for (let i = 0; i < this.members.length; i++)\n            if (!this.members[i].eq(other.members[i]))\n                return false;\n        return true;\n    }\n    locals(node) {\n        let result, sorted = true;\n        for (let i = 0; i < this.members.length; i++) {\n            let locals = this.members[i].localsInner(node);\n            if (!locals.length)\n                continue;\n            if (!result) {\n                result = locals;\n            }\n            else {\n                if (sorted) {\n                    result = result.slice();\n                    sorted = false;\n                }\n                for (let j = 0; j < locals.length; j++)\n                    result.push(locals[j]);\n            }\n        }\n        return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n    }\n    // Create a group for the given array of decoration sets, or return\n    // a single set when possible.\n    static from(members) {\n        switch (members.length) {\n            case 0: return empty;\n            case 1: return members[0];\n            default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n                members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n        }\n    }\n    forEachSet(f) {\n        for (let i = 0; i < this.members.length; i++)\n            this.members[i].forEachSet(f);\n    }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n    let children = oldChildren.slice();\n    // Mark the children that are directly touched by changes, and\n    // move those that are after the changes.\n    for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n        let moved = 0;\n        mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n            let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n            for (let i = 0; i < children.length; i += 3) {\n                let end = children[i + 1];\n                if (end < 0 || oldStart > end + baseOffset - moved)\n                    continue;\n                let start = children[i] + baseOffset - moved;\n                if (oldEnd >= start) {\n                    children[i + 1] = oldStart <= start ? -2 : -1;\n                }\n                else if (oldStart >= baseOffset && dSize) {\n                    children[i] += dSize;\n                    children[i + 1] += dSize;\n                }\n            }\n            moved += dSize;\n        });\n        baseOffset = mapping.maps[i].map(baseOffset, -1);\n    }\n    // Find the child nodes that still correspond to a single node,\n    // recursively call mapInner on them and update their positions.\n    let mustRebuild = false;\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] < 0) { // Touched nodes\n            if (children[i + 1] == -2) {\n                mustRebuild = true;\n                children[i + 1] = -1;\n                continue;\n            }\n            let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n            if (fromLocal < 0 || fromLocal >= node.content.size) {\n                mustRebuild = true;\n                continue;\n            }\n            // Must read oldChildren because children was tagged with -1\n            let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n            let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n            let childNode = node.maybeChild(index);\n            if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n                let mapped = children[i + 2]\n                    .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n                if (mapped != empty) {\n                    children[i] = fromLocal;\n                    children[i + 1] = toLocal;\n                    children[i + 2] = mapped;\n                }\n                else {\n                    children[i + 1] = -2;\n                    mustRebuild = true;\n                }\n            }\n            else {\n                mustRebuild = true;\n            }\n        }\n    // Remaining children must be collected and rebuilt into the appropriate structure\n    if (mustRebuild) {\n        let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n        let built = buildTree(decorations, node, 0, options);\n        newLocal = built.local;\n        for (let i = 0; i < children.length; i += 3)\n            if (children[i + 1] < 0) {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        for (let i = 0, j = 0; i < built.children.length; i += 3) {\n            let from = built.children[i];\n            while (j < children.length && children[j] < from)\n                j += 3;\n            children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n        }\n    }\n    return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n    if (!offset || !spans.length)\n        return spans;\n    let result = [];\n    for (let i = 0; i < spans.length; i++) {\n        let span = spans[i];\n        result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n    }\n    return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n    // Gather all decorations from the remaining marked children\n    function gather(set, oldOffset) {\n        for (let i = 0; i < set.local.length; i++) {\n            let mapped = set.local[i].map(mapping, offset, oldOffset);\n            if (mapped)\n                decorations.push(mapped);\n            else if (options.onRemove)\n                options.onRemove(set.local[i].spec);\n        }\n        for (let i = 0; i < set.children.length; i += 3)\n            gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n    }\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] == -1)\n            gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n    return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n    if (node.isLeaf)\n        return null;\n    let end = offset + node.nodeSize, found = null;\n    for (let i = 0, span; i < spans.length; i++) {\n        if ((span = spans[i]) && span.from > offset && span.to < end) {\n            (found || (found = [])).push(span);\n            spans[i] = null;\n        }\n    }\n    return found;\n}\nfunction withoutNulls(array) {\n    let result = [];\n    for (let i = 0; i < array.length; i++)\n        if (array[i] != null)\n            result.push(array[i]);\n    return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n    let children = [], hasNulls = false;\n    node.forEach((childNode, localStart) => {\n        let found = takeSpansForNode(spans, childNode, localStart + offset);\n        if (found) {\n            hasNulls = true;\n            let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n            if (subtree != empty)\n                children.push(localStart, localStart + childNode.nodeSize, subtree);\n        }\n    });\n    let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n    for (let i = 0; i < locals.length; i++)\n        if (!locals[i].type.valid(node, locals[i])) {\n            if (options.onRemove)\n                options.onRemove(locals[i].spec);\n            locals.splice(i--, 1);\n        }\n    return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n    return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n    let working = spans;\n    for (let i = 0; i < working.length - 1; i++) {\n        let span = working[i];\n        if (span.from != span.to)\n            for (let j = i + 1; j < working.length; j++) {\n                let next = working[j];\n                if (next.from == span.from) {\n                    if (next.to != span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // Followed by a partially overlapping larger span. Split that\n                        // span.\n                        working[j] = next.copy(next.from, span.to);\n                        insertAhead(working, j + 1, next.copy(span.to, next.to));\n                    }\n                    continue;\n                }\n                else {\n                    if (next.from < span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // The end of this one overlaps with a subsequent span. Split\n                        // this one.\n                        working[i] = span.copy(span.from, next.from);\n                        insertAhead(working, j, span.copy(next.from, span.to));\n                    }\n                    break;\n                }\n            }\n    }\n    return working;\n}\nfunction insertAhead(array, i, deco) {\n    while (i < array.length && byPos(deco, array[i]) > 0)\n        i++;\n    array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n    let found = [];\n    view.someProp(\"decorations\", f => {\n        let result = f(view.state);\n        if (result && result != empty)\n            found.push(result);\n    });\n    if (view.cursorWrapper)\n        found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n    return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n    childList: true,\n    characterData: true,\n    characterDataOldValue: true,\n    attributes: true,\n    attributeOldValue: true,\n    subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n    constructor() {\n        this.anchorNode = null;\n        this.anchorOffset = 0;\n        this.focusNode = null;\n        this.focusOffset = 0;\n    }\n    set(sel) {\n        this.anchorNode = sel.anchorNode;\n        this.anchorOffset = sel.anchorOffset;\n        this.focusNode = sel.focusNode;\n        this.focusOffset = sel.focusOffset;\n    }\n    clear() {\n        this.anchorNode = this.focusNode = null;\n    }\n    eq(sel) {\n        return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n            sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n    }\n}\nclass DOMObserver {\n    constructor(view, handleDOMChange) {\n        this.view = view;\n        this.handleDOMChange = handleDOMChange;\n        this.queue = [];\n        this.flushingSoon = -1;\n        this.observer = null;\n        this.currentSelection = new SelectionState;\n        this.onCharData = null;\n        this.suppressingSelectionUpdates = false;\n        this.lastChangedTextNode = null;\n        this.observer = window.MutationObserver &&\n            new window.MutationObserver(mutations => {\n                for (let i = 0; i < mutations.length; i++)\n                    this.queue.push(mutations[i]);\n                if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n                    m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length)) {\n                    // IE11 will sometimes (on backspacing out a single character\n                    // text node after a BR node) call the observer callback\n                    // before actually updating the DOM, which will cause\n                    // ProseMirror to miss the change (see #930)\n                    this.flushSoon();\n                }\n                else if (safari && view.composing && mutations.some(m => m.type == \"childList\" && m.target.nodeName == \"TR\")) {\n                    // Safari does weird stuff when finishing a composition in a\n                    // table cell, which tends to involve inserting inappropriate\n                    // nodes in the table row.\n                    view.input.badSafariComposition = true;\n                    this.flushSoon();\n                }\n                else {\n                    this.flush();\n                }\n            });\n        if (useCharData) {\n            this.onCharData = e => {\n                this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n                this.flushSoon();\n            };\n        }\n        this.onSelectionChange = this.onSelectionChange.bind(this);\n    }\n    flushSoon() {\n        if (this.flushingSoon < 0)\n            this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n    }\n    forceFlush() {\n        if (this.flushingSoon > -1) {\n            window.clearTimeout(this.flushingSoon);\n            this.flushingSoon = -1;\n            this.flush();\n        }\n    }\n    start() {\n        if (this.observer) {\n            this.observer.takeRecords();\n            this.observer.observe(this.view.dom, observeOptions);\n        }\n        if (this.onCharData)\n            this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.connectSelection();\n    }\n    stop() {\n        if (this.observer) {\n            let take = this.observer.takeRecords();\n            if (take.length) {\n                for (let i = 0; i < take.length; i++)\n                    this.queue.push(take[i]);\n                window.setTimeout(() => this.flush(), 20);\n            }\n            this.observer.disconnect();\n        }\n        if (this.onCharData)\n            this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.disconnectSelection();\n    }\n    connectSelection() {\n        this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    disconnectSelection() {\n        this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    suppressSelectionUpdates() {\n        this.suppressingSelectionUpdates = true;\n        setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n    }\n    onSelectionChange() {\n        if (!hasFocusAndSelection(this.view))\n            return;\n        if (this.suppressingSelectionUpdates)\n            return selectionToDOM(this.view);\n        // Deletions on IE11 fire their events in the wrong order, giving\n        // us a selection change event before the DOM changes are\n        // reported.\n        if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n            let sel = this.view.domSelectionRange();\n            // Selection.isCollapsed isn't reliable on IE\n            if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n                return this.flushSoon();\n        }\n        this.flush();\n    }\n    setCurSelection() {\n        this.currentSelection.set(this.view.domSelectionRange());\n    }\n    ignoreSelectionChange(sel) {\n        if (!sel.focusNode)\n            return true;\n        let ancestors = new Set, container;\n        for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n            ancestors.add(scan);\n        for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n            if (ancestors.has(scan)) {\n                container = scan;\n                break;\n            }\n        let desc = container && this.view.docView.nearestDesc(container);\n        if (desc && desc.ignoreMutation({\n            type: \"selection\",\n            target: container.nodeType == 3 ? container.parentNode : container\n        })) {\n            this.setCurSelection();\n            return true;\n        }\n    }\n    pendingRecords() {\n        if (this.observer)\n            for (let mut of this.observer.takeRecords())\n                this.queue.push(mut);\n        return this.queue;\n    }\n    flush() {\n        let { view } = this;\n        if (!view.docView || this.flushingSoon > -1)\n            return;\n        let mutations = this.pendingRecords();\n        if (mutations.length)\n            this.queue = [];\n        let sel = view.domSelectionRange();\n        let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n        let from = -1, to = -1, typeOver = false, added = [];\n        if (view.editable) {\n            for (let i = 0; i < mutations.length; i++) {\n                let result = this.registerMutation(mutations[i], added);\n                if (result) {\n                    from = from < 0 ? result.from : Math.min(result.from, from);\n                    to = to < 0 ? result.to : Math.max(result.to, to);\n                    if (result.typeOver)\n                        typeOver = true;\n                }\n            }\n        }\n        if (added.some(n => n.nodeName == \"BR\") &&\n            (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46 ||\n                chrome && (view.composing || view.input.compositionEndedAt > Date.now() - 50) &&\n                    mutations.some(m => m.type == \"childList\" && m.removedNodes.length))) {\n            // Browsers sometimes insert a bogus break node if you\n            // backspace out the last bit of text before an inline-flex node (#1552)\n            for (let node of added)\n                if (node.nodeName == \"BR\" && node.parentNode) {\n                    let after = node.nextSibling;\n                    while (after && after.nodeType == 1) {\n                        if (after.contentEditable == \"false\") {\n                            node.parentNode.removeChild(node);\n                            break;\n                        }\n                        after = after.firstChild;\n                    }\n                }\n        }\n        else if (gecko && added.length) {\n            let brs = added.filter(n => n.nodeName == \"BR\");\n            if (brs.length == 2) {\n                let [a, b] = brs;\n                if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n                    b.remove();\n                else\n                    a.remove();\n            }\n            else {\n                let { focusNode } = this.currentSelection;\n                for (let br of brs) {\n                    let parent = br.parentNode;\n                    if (parent && parent.nodeName == \"LI\" && (!focusNode || blockParent(view, focusNode) != parent))\n                        br.remove();\n                }\n            }\n        }\n        let readSel = null;\n        // If it looks like the browser has reset the selection to the\n        // start of the document after focus, restore the selection from\n        // the state\n        if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n            Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n            selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n            readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n            view.input.lastFocus = 0;\n            selectionToDOM(view);\n            this.currentSelection.set(sel);\n            view.scrollToSelection();\n        }\n        else if (from > -1 || newSel) {\n            if (from > -1) {\n                view.docView.markDirty(from, to);\n                checkCSS(view);\n            }\n            if (view.input.badSafariComposition) {\n                view.input.badSafariComposition = false;\n                fixUpBadSafariComposition(view, added);\n            }\n            this.handleDOMChange(from, to, typeOver, added);\n            if (view.docView && view.docView.dirty)\n                view.updateState(view.state);\n            else if (!this.currentSelection.eq(sel))\n                selectionToDOM(view);\n            this.currentSelection.set(sel);\n        }\n    }\n    registerMutation(mut, added) {\n        // Ignore mutations inside nodes that were already noted as inserted\n        if (added.indexOf(mut.target) > -1)\n            return null;\n        let desc = this.view.docView.nearestDesc(mut.target);\n        if (mut.type == \"attributes\" &&\n            (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n                // Firefox sometimes fires spurious events for null/empty styles\n                (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n            return null;\n        if (!desc || desc.ignoreMutation(mut))\n            return null;\n        if (mut.type == \"childList\") {\n            for (let i = 0; i < mut.addedNodes.length; i++) {\n                let node = mut.addedNodes[i];\n                added.push(node);\n                if (node.nodeType == 3)\n                    this.lastChangedTextNode = node;\n            }\n            if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n                return { from: desc.posBefore, to: desc.posAfter };\n            let prev = mut.previousSibling, next = mut.nextSibling;\n            if (ie && ie_version <= 11 && mut.addedNodes.length) {\n                // IE11 gives us incorrect next/prev siblings for some\n                // insertions, so if there are added nodes, recompute those\n                for (let i = 0; i < mut.addedNodes.length; i++) {\n                    let { previousSibling, nextSibling } = mut.addedNodes[i];\n                    if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n                        prev = previousSibling;\n                    if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n                        next = nextSibling;\n                }\n            }\n            let fromOffset = prev && prev.parentNode == mut.target\n                ? domIndex(prev) + 1 : 0;\n            let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n            let toOffset = next && next.parentNode == mut.target\n                ? domIndex(next) : mut.target.childNodes.length;\n            let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n            return { from, to };\n        }\n        else if (mut.type == \"attributes\") {\n            return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n        }\n        else { // \"characterData\"\n            this.lastChangedTextNode = mut.target;\n            return {\n                from: desc.posAtStart,\n                to: desc.posAtEnd,\n                // An event was generated for a text change that didn't change\n                // any text. Mark the dom change to fall back to assuming the\n                // selection was typed over with an identical value if it can't\n                // find another change.\n                typeOver: mut.target.nodeValue == mut.oldValue\n            };\n        }\n    }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n    if (cssChecked.has(view))\n        return;\n    cssChecked.set(view, null);\n    if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n        view.requiresGeckoHackNode = gecko;\n        if (cssCheckWarned)\n            return;\n        console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n        cssCheckWarned = true;\n    }\n}\nfunction rangeToSelectionRange(view, range) {\n    let anchorNode = range.startContainer, anchorOffset = range.startOffset;\n    let focusNode = range.endContainer, focusOffset = range.endOffset;\n    let currentAnchor = view.domAtPos(view.state.selection.anchor);\n    // Since such a range doesn't distinguish between anchor and head,\n    // use a heuristic that flips it around if its end matches the\n    // current anchor.\n    if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n        [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n    return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view, selection) {\n    if (selection.getComposedRanges) {\n        let range = selection.getComposedRanges(view.root)[0];\n        if (range)\n            return rangeToSelectionRange(view, range);\n    }\n    let found;\n    function read(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        found = event.getTargetRanges()[0];\n    }\n    // Because Safari (at least in 2018-2022) doesn't provide regular\n    // access to the selection inside a shadowRoot, we have to perform a\n    // ridiculous hack to get at it—using `execCommand` to trigger a\n    // `beforeInput` event so that we can read the target range from the\n    // event.\n    view.dom.addEventListener(\"beforeinput\", read, true);\n    document.execCommand(\"indent\");\n    view.dom.removeEventListener(\"beforeinput\", read, true);\n    return found ? rangeToSelectionRange(view, found) : null;\n}\nfunction blockParent(view, node) {\n    for (let p = node.parentNode; p && p != view.dom; p = p.parentNode) {\n        let desc = view.docView.nearestDesc(p, true);\n        if (desc && desc.node.isBlock)\n            return p;\n    }\n    return null;\n}\n// Kludge for a Safari bug where, on ending a composition in an\n// otherwise empty table cell, it randomly moves the composed text\n// into the table row around that cell, greatly confusing everything\n// (#188).\nfunction fixUpBadSafariComposition(view, addedNodes) {\n    var _a;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    for (let node of addedNodes) {\n        if (((_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.nodeName) == \"TR\") {\n            let nextCell = node.nextSibling;\n            while (nextCell && (nextCell.nodeName != \"TD\" && nextCell.nodeName != \"TH\"))\n                nextCell = nextCell.nextSibling;\n            if (nextCell) {\n                let parent = nextCell;\n                for (;;) {\n                    let first = parent.firstChild;\n                    if (!first || first.nodeType != 1 || first.contentEditable == \"false\" ||\n                        /^(BR|IMG)$/.test(first.nodeName))\n                        break;\n                    parent = first;\n                }\n                parent.insertBefore(node, parent.firstChild);\n                if (focusNode == node)\n                    view.domSelection().collapse(node, focusOffset);\n            }\n            else {\n                node.parentNode.removeChild(node);\n            }\n        }\n    }\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_, addedNodes) {\n    let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n    let domSel = view.domSelectionRange();\n    let find;\n    let anchor = domSel.anchorNode;\n    if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n        find = [{ node: anchor, offset: domSel.anchorOffset }];\n        if (!selectionCollapsed(domSel))\n            find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n    }\n    // Work around issue in Chrome where backspacing sometimes replaces\n    // the deleted content with a random BR node (issues #799, #831)\n    if (chrome && view.input.lastKeyCode === 8) {\n        for (let off = toOffset; off > fromOffset; off--) {\n            let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n            if (node.nodeName == \"BR\" && !desc) {\n                toOffset = off;\n                break;\n            }\n            if (!desc || desc.size)\n                break;\n        }\n    }\n    let startDoc = view.state.doc;\n    let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n    let $from = startDoc.resolve(from);\n    let sel = null, doc = parser.parse(parent, {\n        topNode: $from.parent,\n        topMatch: $from.parent.contentMatchAt($from.index()),\n        topOpen: true,\n        from: fromOffset,\n        to: toOffset,\n        preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n        findPositions: find,\n        ruleFromNode: ruleFromNode(addedNodes),\n        context: $from\n    });\n    if (find && find[0].pos != null) {\n        let anchor = find[0].pos, head = find[1] && find[1].pos;\n        if (head == null)\n            head = anchor;\n        sel = { anchor: anchor + from, head: head + from };\n    }\n    return { doc, sel, from, to };\n}\nconst ruleFromNode = (added) => (dom) => {\n    let desc = dom.pmViewDesc;\n    if (desc) {\n        return desc.parseRule(added);\n    }\n    else if (dom.nodeName == \"BR\" && dom.parentNode) {\n        // Safari replaces the list item or table cell with a BR\n        // directly in the list node (?!) if you delete the last\n        // character in a list item or table cell (#708, #862)\n        if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n            let skip = document.createElement(\"div\");\n            skip.appendChild(document.createElement(\"li\"));\n            return { skip };\n        }\n        else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n            return { ignore: true };\n        }\n    }\n    else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n        return { ignore: true };\n    }\n    return null;\n};\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|img|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n    let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n    view.input.compositionPendingChanges = 0;\n    if (from < 0) {\n        let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n        let newSel = selectionFromDOM(view, origin);\n        if (newSel && !view.state.selection.eq(newSel)) {\n            if (chrome && android &&\n                view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n                return;\n            let tr = view.state.tr.setSelection(newSel);\n            if (origin == \"pointer\")\n                tr.setMeta(\"pointer\", true);\n            else if (origin == \"key\")\n                tr.scrollIntoView();\n            if (compositionID)\n                tr.setMeta(\"composition\", compositionID);\n            view.dispatch(tr);\n        }\n        return;\n    }\n    let $before = view.state.doc.resolve(from);\n    let shared = $before.sharedDepth(to);\n    from = $before.before(shared + 1);\n    to = view.state.doc.resolve(to).after(shared + 1);\n    let sel = view.state.selection;\n    let parse = parseBetween(view, from, to, addedNodes);\n    let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n    let preferredPos, preferredSide;\n    // Prefer anchoring to end when Backspace is pressed\n    if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n        preferredPos = view.state.selection.to;\n        preferredSide = \"end\";\n    }\n    else {\n        preferredPos = view.state.selection.from;\n        preferredSide = \"start\";\n    }\n    view.input.lastKeyCode = null;\n    let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n    if (change)\n        view.input.domChangeCount++;\n    if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n        addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&\n        (!change || change.endA >= change.endB) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    if (!change) {\n        if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n            !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n            change = { start: sel.from, endA: sel.to, endB: sel.to };\n        }\n        else {\n            if (parse.sel) {\n                let sel = resolveSelection(view, view.state.doc, parse.sel);\n                if (sel && !sel.eq(view.state.selection)) {\n                    let tr = view.state.tr.setSelection(sel);\n                    if (compositionID)\n                        tr.setMeta(\"composition\", compositionID);\n                    view.dispatch(tr);\n                }\n            }\n            return;\n        }\n    }\n    // Handle the case where overwriting a selection by typing matches\n    // the start or end of the selected content, creating a change\n    // that's smaller than what was actually overwritten.\n    if (view.state.selection.from < view.state.selection.to &&\n        change.start == change.endB &&\n        view.state.selection instanceof TextSelection) {\n        if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n            view.state.selection.from >= parse.from) {\n            change.start = view.state.selection.from;\n        }\n        else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n            view.state.selection.to <= parse.to) {\n            change.endB += (view.state.selection.to - change.endA);\n            change.endA = view.state.selection.to;\n        }\n    }\n    // IE11 will insert a non-breaking space _ahead_ of the space after\n    // the cursor space when adding a space before another space. When\n    // that happened, adjust the change to cover the space instead.\n    if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n        change.endA == change.start && change.start > parse.from &&\n        parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n        change.start--;\n        change.endA--;\n        change.endB--;\n    }\n    let $from = parse.doc.resolveNoCache(change.start - parse.from);\n    let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n    let $fromA = doc.resolve(change.start);\n    let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n    // If this looks like the effect of pressing Enter (or was recorded\n    // as being an iOS enter press), just dispatch an Enter key instead.\n    if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n        (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n        (!inlineChange && $from.pos < parse.doc.content.size &&\n            (!$from.sameParent($to) || !$from.parent.inlineContent) &&\n            $from.pos < $to.pos && !/\\S/.test(parse.doc.textBetween($from.pos, $to.pos, \"\", \"\")))) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    // Same for backspace\n    if (view.state.selection.anchor > change.start &&\n        looksLikeBackspace(doc, change.start, change.endA, $from, $to) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n        if (android && chrome)\n            view.domObserver.suppressSelectionUpdates(); // #820\n        return;\n    }\n    // Chrome will occasionally, during composition, delete the\n    // entire composition and then immediately insert it again. This is\n    // used to detect that situation.\n    if (chrome && change.endB == change.start)\n        view.input.lastChromeDelete = Date.now();\n    // This tries to detect Android virtual keyboard\n    // enter-and-pick-suggestion action. That sometimes (see issue\n    // #1059) first fires a DOM mutation, before moving the selection to\n    // the newly created block. And then, because ProseMirror cleans up\n    // the DOM selection, it gives up moving the selection entirely,\n    // leaving the cursor in the wrong place. When that happens, we drop\n    // the new paragraph from the initial change, and fire a simulated\n    // enter key afterwards.\n    if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n        parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n        change.endB -= 2;\n        $to = parse.doc.resolveNoCache(change.endB - parse.from);\n        setTimeout(() => {\n            view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n        }, 20);\n    }\n    let chFrom = change.start, chTo = change.endA;\n    let mkTr = (base) => {\n        let tr = base || view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n        if (parse.sel) {\n            let sel = resolveSelection(view, tr.doc, parse.sel);\n            // Chrome will sometimes, during composition, report the\n            // selection in the wrong place. If it looks like that is\n            // happening, don't update the selection.\n            // Edge just doesn't move the cursor forward when you start typing\n            // in an empty block or between br nodes.\n            if (sel && !(chrome && view.composing && sel.empty &&\n                (change.start != change.endB || view.input.lastChromeDelete < Date.now() - 100) &&\n                (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n                ie && sel.empty && sel.head == chFrom))\n                tr.setSelection(sel);\n        }\n        if (compositionID)\n            tr.setMeta(\"composition\", compositionID);\n        return tr.scrollIntoView();\n    };\n    let markChange;\n    if (inlineChange) {\n        if ($from.pos == $to.pos) { // Deletion\n            // IE11 sometimes weirdly moves the DOM selection around after\n            // backspacing out the first element in a textblock\n            if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n                view.domObserver.suppressSelectionUpdates();\n                setTimeout(() => selectionToDOM(view), 20);\n            }\n            let tr = mkTr(view.state.tr.delete(chFrom, chTo));\n            let marks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n            if (marks)\n                tr.ensureMarks(marks);\n            view.dispatch(tr);\n        }\n        else if ( // Adding or removing a mark\n        change.endA == change.endB &&\n            (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n            let tr = mkTr(view.state.tr);\n            if (markChange.type == \"add\")\n                tr.addMark(chFrom, chTo, markChange.mark);\n            else\n                tr.removeMark(chFrom, chTo, markChange.mark);\n            view.dispatch(tr);\n        }\n        else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n            // Both positions in the same text node -- simply insert text\n            let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n            let deflt = () => mkTr(view.state.tr.insertText(text, chFrom, chTo));\n            if (!view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text, deflt)))\n                view.dispatch(deflt());\n        }\n        else {\n            view.dispatch(mkTr());\n        }\n    }\n    else {\n        view.dispatch(mkTr());\n    }\n}\nfunction resolveSelection(view, doc, parsedSel) {\n    if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n        return null;\n    return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n    let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n    let added = curMarks, removed = prevMarks, type, mark, update;\n    for (let i = 0; i < prevMarks.length; i++)\n        added = prevMarks[i].removeFromSet(added);\n    for (let i = 0; i < curMarks.length; i++)\n        removed = curMarks[i].removeFromSet(removed);\n    if (added.length == 1 && removed.length == 0) {\n        mark = added[0];\n        type = \"add\";\n        update = (node) => node.mark(mark.addToSet(node.marks));\n    }\n    else if (added.length == 0 && removed.length == 1) {\n        mark = removed[0];\n        type = \"remove\";\n        update = (node) => node.mark(mark.removeFromSet(node.marks));\n    }\n    else {\n        return null;\n    }\n    let updated = [];\n    for (let i = 0; i < prev.childCount; i++)\n        updated.push(update(prev.child(i)));\n    if (Fragment.from(updated).eq(cur))\n        return { mark, type };\n}\nfunction looksLikeBackspace(old, start, end, $newStart, $newEnd) {\n    if ( // The content must have shrunk\n    end - start <= $newEnd.pos - $newStart.pos ||\n        // newEnd must point directly at or after the end of the block that newStart points into\n        skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n        return false;\n    let $start = old.resolve(start);\n    // Handle the case where, rather than joining blocks, the change just removed an entire block\n    if (!$newStart.parent.isTextblock) {\n        let after = $start.nodeAfter;\n        return after != null && end == start + after.nodeSize;\n    }\n    // Start must be at the end of a block\n    if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n        return false;\n    let $next = old.resolve(skipClosingAndOpening($start, true, true));\n    // The next textblock must start before end and end near it\n    if (!$next.parent.isTextblock || $next.pos > end ||\n        skipClosingAndOpening($next, true, false) < end)\n        return false;\n    // The fragments after the join point must match\n    return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n    let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n    while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n        depth--;\n        end++;\n        fromEnd = false;\n    }\n    if (mayOpen) {\n        let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n        while (next && !next.isLeaf) {\n            next = next.firstChild;\n            end++;\n        }\n    }\n    return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n    let start = a.findDiffStart(b, pos), lenA = pos + a.size, lenB = pos + b.size;\n    if (start == null)\n        return null;\n    let { a: endA, b: endB } = a.findDiffEnd(b, lenA, lenB);\n    if (preferredSide == \"end\") {\n        let adjust = Math.max(0, start - Math.min(endA, endB));\n        preferredPos -= endA + adjust - start;\n    }\n    if (endA < start && lenA < lenB) {\n        let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n        start -= move;\n        endB = start + (endB - endA);\n        endA = start;\n    }\n    else if (endB < start) {\n        let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n        start -= move;\n        endA = start + (endA - endB);\n        endB = start;\n    }\n    return { start, endA, endB };\n}\n\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n    /**\n    Create a view. `place` may be a DOM node that the editor should\n    be appended to, a function that will place it into the document,\n    or an object whose `mount` property holds the node to use as the\n    document container. If it is `null`, the editor will not be\n    added to the document.\n    */\n    constructor(place, props) {\n        this._root = null;\n        /**\n        @internal\n        */\n        this.focused = false;\n        /**\n        Kludge used to work around a Chrome bug @internal\n        */\n        this.trackWrites = null;\n        this.mounted = false;\n        /**\n        @internal\n        */\n        this.markCursor = null;\n        /**\n        @internal\n        */\n        this.cursorWrapper = null;\n        /**\n        @internal\n        */\n        this.lastSelectedViewDesc = undefined;\n        /**\n        @internal\n        */\n        this.input = new InputState;\n        this.prevDirectPlugins = [];\n        this.pluginViews = [];\n        /**\n        Holds `true` when a hack node is needed in Firefox to prevent the\n        [space is eaten issue](https://code.haverbeke.berlin/prosemirror/prosemirror/issues/651)\n        @internal\n        */\n        this.requiresGeckoHackNode = false;\n        /**\n        When editor content is being dragged, this object contains\n        information about the dragged slice and whether it is being\n        copied or moved. At any other time, it is null.\n        */\n        this.dragging = null;\n        this._props = props;\n        this.state = props.state;\n        this.directPlugins = props.plugins || [];\n        this.directPlugins.forEach(checkStateComponent);\n        this.dispatch = this.dispatch.bind(this);\n        this.dom = (place && place.mount) || document.createElement(\"div\");\n        if (place) {\n            if (place.appendChild)\n                place.appendChild(this.dom);\n            else if (typeof place == \"function\")\n                place(this.dom);\n            else if (place.mount)\n                this.mounted = true;\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        this.nodeViews = buildNodeViews(this);\n        this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n        this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n        this.domObserver.start();\n        initInput(this);\n        this.updatePluginViews();\n    }\n    /**\n    Holds `true` when a\n    [composition](https://w3c.github.io/uievents/#events-compositionevents)\n    is active.\n    */\n    get composing() { return this.input.composing; }\n    /**\n    The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n    */\n    get props() {\n        if (this._props.state != this.state) {\n            let prev = this._props;\n            this._props = {};\n            for (let name in prev)\n                this._props[name] = prev[name];\n            this._props.state = this.state;\n        }\n        return this._props;\n    }\n    /**\n    Update the view's props. Will immediately cause an update to\n    the DOM.\n    */\n    update(props) {\n        if (props.handleDOMEvents != this._props.handleDOMEvents)\n            ensureListeners(this);\n        let prevProps = this._props;\n        this._props = props;\n        if (props.plugins) {\n            props.plugins.forEach(checkStateComponent);\n            this.directPlugins = props.plugins;\n        }\n        this.updateStateInner(props.state, prevProps);\n    }\n    /**\n    Update the view by updating existing props object with the object\n    given as argument. Equivalent to `view.update(Object.assign({},\n    view.props, props))`.\n    */\n    setProps(props) {\n        let updated = {};\n        for (let name in this._props)\n            updated[name] = this._props[name];\n        updated.state = this.state;\n        for (let name in props)\n            updated[name] = props[name];\n        this.update(updated);\n    }\n    /**\n    Update the editor's `state` prop, without touching any of the\n    other props.\n    */\n    updateState(state) {\n        this.updateStateInner(state, this._props);\n    }\n    updateStateInner(state, prevProps) {\n        var _a;\n        let prev = this.state, redraw = false, updateSel = false;\n        // When stored marks are added, stop composition, so that they can\n        // be displayed.\n        if (state.storedMarks && this.composing) {\n            clearComposition(this);\n            updateSel = true;\n        }\n        this.state = state;\n        let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n        if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n            let nodeViews = buildNodeViews(this);\n            if (changedNodeViews(nodeViews, this.nodeViews)) {\n                this.nodeViews = nodeViews;\n                redraw = true;\n            }\n        }\n        if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n            ensureListeners(this);\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n        let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n            : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n        let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n        if (updateDoc || !state.selection.eq(prev.selection))\n            updateSel = true;\n        let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n        if (updateSel) {\n            this.domObserver.stop();\n            // Work around an issue in Chrome, IE, and Edge where changing\n            // the DOM around an active selection puts it into a broken\n            // state where the thing the user sees differs from the\n            // selection reported by the Selection object (#710, #973,\n            // #1011, #1013, #1035).\n            let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n                !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n            if (updateDoc) {\n                // If the node that the selection points into is written to,\n                // Chrome sometimes starts misreporting the selection, so this\n                // tracks that and forces a selection reset when our update\n                // did write to the node.\n                let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n                if (this.composing)\n                    this.input.compositionNode = findCompositionNode(this);\n                if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n                    this.docView.updateOuterDeco(outerDeco);\n                    this.docView.destroy();\n                    this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n                }\n                if (chromeKludge && (!this.trackWrites || !this.dom.contains(this.trackWrites)))\n                    forceSelUpdate = true;\n            }\n            // Work around for an issue where an update arriving right between\n            // a DOM selection change and the \"selectionchange\" event for it\n            // can cause a spurious DOM selection update, disrupting mouse\n            // drag selection.\n            let mouseDown = this.input.mouseDown;\n            if (forceSelUpdate ||\n                !(mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n                    anchorInRightPlace(this) && mouseDown.delaySelUpdate())) {\n                selectionToDOM(this, forceSelUpdate);\n            }\n            else {\n                syncNodeSelection(this, state.selection);\n                this.domObserver.setCurSelection();\n            }\n            this.domObserver.start();\n        }\n        this.updatePluginViews(prev);\n        if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n            this.updateDraggedNode(this.dragging, prev);\n        if (scroll == \"reset\") {\n            this.dom.scrollTop = 0;\n        }\n        else if (scroll == \"to selection\") {\n            this.scrollToSelection();\n        }\n        else if (oldScrollPos) {\n            resetScrollPos(oldScrollPos);\n        }\n    }\n    /**\n    @internal\n    */\n    scrollToSelection() {\n        let startDOM = this.domSelectionRange().focusNode;\n        if (!startDOM || !this.dom.contains(startDOM.nodeType == 1 ? startDOM : startDOM.parentNode)) ;\n        else if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n        else if (this.state.selection instanceof NodeSelection) {\n            let target = this.docView.domAfterPos(this.state.selection.from);\n            if (target.nodeType == 1)\n                scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n        }\n        else {\n            scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n        }\n    }\n    destroyPluginViews() {\n        let view;\n        while (view = this.pluginViews.pop())\n            if (view.destroy)\n                view.destroy();\n    }\n    updatePluginViews(prevState) {\n        if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n            this.prevDirectPlugins = this.directPlugins;\n            this.destroyPluginViews();\n            for (let i = 0; i < this.directPlugins.length; i++) {\n                let plugin = this.directPlugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n            for (let i = 0; i < this.state.plugins.length; i++) {\n                let plugin = this.state.plugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n        }\n        else {\n            for (let i = 0; i < this.pluginViews.length; i++) {\n                let pluginView = this.pluginViews[i];\n                if (pluginView.update)\n                    pluginView.update(this, prevState);\n            }\n        }\n    }\n    updateDraggedNode(dragging, prev) {\n        let sel = dragging.node, found = -1;\n        if (sel.from < this.state.doc.content.size && this.state.doc.nodeAt(sel.from) == sel.node) {\n            found = sel.from;\n        }\n        else {\n            let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n            let moved = movedPos > 0 && movedPos < this.state.doc.content.size && this.state.doc.nodeAt(movedPos);\n            if (moved == sel.node)\n                found = movedPos;\n        }\n        this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : NodeSelection.create(this.state.doc, found));\n    }\n    someProp(propName, f) {\n        let prop = this._props && this._props[propName], value;\n        if (prop != null && (value = f ? f(prop) : prop))\n            return value;\n        for (let i = 0; i < this.directPlugins.length; i++) {\n            let prop = this.directPlugins[i].props[propName];\n            if (prop != null && (value = f ? f(prop) : prop))\n                return value;\n        }\n        let plugins = this.state.plugins;\n        if (plugins)\n            for (let i = 0; i < plugins.length; i++) {\n                let prop = plugins[i].props[propName];\n                if (prop != null && (value = f ? f(prop) : prop))\n                    return value;\n            }\n    }\n    /**\n    Query whether the view has focus.\n    */\n    hasFocus() {\n        // Work around IE not handling focus correctly if resize handles are shown.\n        // If the cursor is inside an element with resize handles, activeElement\n        // will be that element instead of this.dom.\n        if (ie) {\n            // If activeElement is within this.dom, and there are no other elements\n            // setting `contenteditable` to false in between, treat it as focused.\n            let node = this.root.activeElement;\n            if (node == this.dom)\n                return true;\n            if (!node || !this.dom.contains(node))\n                return false;\n            while (node && this.dom != node && this.dom.contains(node)) {\n                if (node.contentEditable == 'false')\n                    return false;\n                node = node.parentElement;\n            }\n            return true;\n        }\n        return this.root.activeElement == this.dom;\n    }\n    /**\n    Focus the editor.\n    */\n    focus() {\n        this.domObserver.stop();\n        if (this.editable)\n            focusPreventScroll(this.dom);\n        selectionToDOM(this);\n        this.domObserver.start();\n    }\n    /**\n    Get the document root in which the editor exists. This will\n    usually be the top-level `document`, but might be a [shadow\n    DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n    root if the editor is inside one.\n    */\n    get root() {\n        let cached = this._root;\n        if (cached == null)\n            for (let search = this.dom.parentNode; search; search = search.parentNode) {\n                if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n                    if (!search.getSelection)\n                        Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n                    return this._root = search;\n                }\n            }\n        return cached || document;\n    }\n    /**\n    When an existing editor view is moved to a new document or\n    shadow tree, call this to make it recompute its root.\n    */\n    updateRoot() {\n        this._root = null;\n    }\n    /**\n    Given a pair of viewport coordinates, return the document\n    position that corresponds to them. May return null if the given\n    coordinates aren't inside of the editor. When an object is\n    returned, its `pos` property is the position nearest to the\n    coordinates, and its `inside` property holds the position of the\n    inner node that the position falls inside of, or -1 if it is at\n    the top level, not in any node.\n    */\n    posAtCoords(coords) {\n        return posAtCoords(this, coords);\n    }\n    /**\n    Returns the viewport rectangle at a given document position.\n    `left` and `right` will be the same number, as this returns a\n    flat cursor-ish rectangle. If the position is between two things\n    that aren't directly adjacent, `side` determines which element\n    is used. When < 0, the element before the position is used,\n    otherwise the element after.\n    */\n    coordsAtPos(pos, side = 1) {\n        return coordsAtPos(this, pos, side);\n    }\n    /**\n    Find the DOM position that corresponds to the given document\n    position. When `side` is negative, find the position as close as\n    possible to the content before the position. When positive,\n    prefer positions close to the content after the position. When\n    zero, prefer as shallow a position as possible.\n    \n    Note that you should **not** mutate the editor's internal DOM,\n    only inspect it (and even that is usually not necessary).\n    */\n    domAtPos(pos, side = 0) {\n        return this.docView.domFromPos(pos, side);\n    }\n    /**\n    Find the DOM node that represents the document node after the\n    given position. May return `null` when the position doesn't point\n    in front of a node or if the node is inside an opaque node view.\n    \n    This is intended to be able to call things like\n    `getBoundingClientRect` on that DOM node. Do **not** mutate the\n    editor DOM directly, or add styling this way, since that will be\n    immediately overriden by the editor as it redraws the node.\n    */\n    nodeDOM(pos) {\n        let desc = this.docView.descAt(pos);\n        return desc ? desc.nodeDOM : null;\n    }\n    /**\n    Find the document position that corresponds to a given DOM\n    position. (Whenever possible, it is preferable to inspect the\n    document structure directly, rather than poking around in the\n    DOM, but sometimes—for example when interpreting an event\n    target—you don't have a choice.)\n    \n    The `bias` parameter can be used to influence which side of a DOM\n    node to use when the position is inside a leaf node.\n    */\n    posAtDOM(node, offset, bias = -1) {\n        let pos = this.docView.posFromDOM(node, offset, bias);\n        if (pos == null)\n            throw new RangeError(\"DOM position not inside the editor\");\n        return pos;\n    }\n    /**\n    Find out whether the selection is at the end of a textblock when\n    moving in a given direction. When, for example, given `\"left\"`,\n    it will return true if moving left from the current cursor\n    position would leave that position's parent textblock. Will apply\n    to the view's current state by default, but it is possible to\n    pass a different state.\n    */\n    endOfTextblock(dir, state) {\n        return endOfTextblock(this, state || this.state, dir);\n    }\n    /**\n    Run the editor's paste logic with the given HTML string. The\n    `event`, if given, will be passed to the\n    [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n    */\n    pasteHTML(html, event) {\n        return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Run the editor's paste logic with the given plain-text input.\n    */\n    pasteText(text, event) {\n        return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Serialize the given slice as it would be if it was copied from\n    this editor. Returns a DOM element that contains a\n    representation of the slice as its children, a textual\n    representation, and the transformed slice (which can be\n    different from the given input due to hooks like\n    [`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).\n    */\n    serializeForClipboard(slice) {\n        return serializeForClipboard(this, slice);\n    }\n    /**\n    Removes the editor from the DOM and destroys all [node\n    views](https://prosemirror.net/docs/ref/#view.NodeView).\n    */\n    destroy() {\n        if (!this.docView)\n            return;\n        destroyInput(this);\n        this.destroyPluginViews();\n        if (this.mounted) {\n            this.docView.update(this.state.doc, [], viewDecorations(this), this);\n            this.dom.textContent = \"\";\n        }\n        else if (this.dom.parentNode) {\n            this.dom.parentNode.removeChild(this.dom);\n        }\n        this.docView.destroy();\n        this.docView = null;\n        clearReusedRange();\n    }\n    /**\n    This is true when the view has been\n    [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n    used anymore).\n    */\n    get isDestroyed() {\n        return this.docView == null;\n    }\n    /**\n    Used for testing.\n    */\n    dispatchEvent(event) {\n        return dispatchEvent(this, event);\n    }\n    /**\n    @internal\n    */\n    domSelectionRange() {\n        let sel = this.domSelection();\n        if (!sel)\n            return { focusNode: null, focusOffset: 0, anchorNode: null, anchorOffset: 0 };\n        return safari && this.root.nodeType === 11 &&\n            deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;\n    }\n    /**\n    @internal\n    */\n    domSelection() {\n        return this.root.getSelection();\n    }\n}\nEditorView.prototype.dispatch = function (tr) {\n    let dispatchTransaction = this._props.dispatchTransaction;\n    if (dispatchTransaction)\n        dispatchTransaction.call(this, tr);\n    else\n        this.updateState(this.state.apply(tr));\n};\nfunction computeDocDeco(view) {\n    let attrs = Object.create(null);\n    attrs.class = \"ProseMirror\";\n    attrs.contenteditable = String(view.editable);\n    view.someProp(\"attributes\", value => {\n        if (typeof value == \"function\")\n            value = value(view.state);\n        if (value)\n            for (let attr in value) {\n                if (attr == \"class\")\n                    attrs.class += \" \" + value[attr];\n                else if (attr == \"style\")\n                    attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n                else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n                    attrs[attr] = String(value[attr]);\n            }\n    });\n    if (!attrs.translate)\n        attrs.translate = \"no\";\n    return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n    if (view.markCursor) {\n        let dom = document.createElement(\"img\");\n        dom.className = \"ProseMirror-separator\";\n        dom.setAttribute(\"mark-placeholder\", \"true\");\n        dom.setAttribute(\"alt\", \"\");\n        view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.from, dom, { raw: true, marks: view.markCursor }) };\n    }\n    else {\n        view.cursorWrapper = null;\n    }\n}\nfunction getEditable(view) {\n    return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n    let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n    return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n    let result = Object.create(null);\n    function add(obj) {\n        for (let prop in obj)\n            if (!Object.prototype.hasOwnProperty.call(result, prop))\n                result[prop] = obj[prop];\n    }\n    view.someProp(\"nodeViews\", add);\n    view.someProp(\"markViews\", add);\n    return result;\n}\nfunction changedNodeViews(a, b) {\n    let nA = 0, nB = 0;\n    for (let prop in a) {\n        if (a[prop] != b[prop])\n            return true;\n        nA++;\n    }\n    for (let _ in b)\n        nB++;\n    return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n    if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n        throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard };\n","/**\n * @module awareness-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as time from 'lib0/time'\nimport * as math from 'lib0/math'\nimport { Observable } from 'lib0/observable'\nimport * as f from 'lib0/function'\nimport * as Y from 'yjs' // eslint-disable-line\n\nexport const outdatedTimeout = 30000\n\n/**\n * @typedef {Object} MetaClientState\n * @property {number} MetaClientState.clock\n * @property {number} MetaClientState.lastUpdated unix timestamp\n */\n\n/**\n * The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information\n * (cursor, username, status, ..). Each client can update its own local state and listen to state changes of\n * remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline.\n *\n * Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override\n * its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is\n * applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that\n * a remote client is offline, it may propagate a message with\n * `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a\n * message is received, and the known clock of that client equals the received clock, it will override the state with `null`.\n *\n * Before a client disconnects, it should propagate a `null` state with an updated clock.\n *\n * Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state.\n *\n * @extends {Observable<string>}\n */\nexport class Awareness extends Observable {\n  /**\n   * @param {Y.Doc} doc\n   */\n  constructor (doc) {\n    super()\n    this.doc = doc\n    /**\n     * @type {number}\n     */\n    this.clientID = doc.clientID\n    /**\n     * Maps from client id to client state\n     * @type {Map<number, Object<string, any>>}\n     */\n    this.states = new Map()\n    /**\n     * @type {Map<number, MetaClientState>}\n     */\n    this.meta = new Map()\n    this._checkInterval = /** @type {any} */ (setInterval(() => {\n      const now = time.getUnixTime()\n      if (this.getLocalState() !== null && (outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ (this.meta.get(this.clientID)).lastUpdated)) {\n        // renew local clock\n        this.setLocalState(this.getLocalState())\n      }\n      /**\n       * @type {Array<number>}\n       */\n      const remove = []\n      this.meta.forEach((meta, clientid) => {\n        if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {\n          remove.push(clientid)\n        }\n      })\n      if (remove.length > 0) {\n        removeAwarenessStates(this, remove, 'timeout')\n      }\n    }, math.floor(outdatedTimeout / 10)))\n    doc.on('destroy', () => {\n      this.destroy()\n    })\n    this.setLocalState({})\n  }\n\n  destroy () {\n    this.emit('destroy', [this])\n    this.setLocalState(null)\n    super.destroy()\n    clearInterval(this._checkInterval)\n  }\n\n  /**\n   * @return {Object<string,any>|null}\n   */\n  getLocalState () {\n    return this.states.get(this.clientID) || null\n  }\n\n  /**\n   * @param {Object<string,any>|null} state\n   */\n  setLocalState (state) {\n    const clientID = this.clientID\n    const currLocalMeta = this.meta.get(clientID)\n    const clock = currLocalMeta === undefined ? 0 : currLocalMeta.clock + 1\n    const prevState = this.states.get(clientID)\n    if (state === null) {\n      this.states.delete(clientID)\n    } else {\n      this.states.set(clientID, state)\n    }\n    this.meta.set(clientID, {\n      clock,\n      lastUpdated: time.getUnixTime()\n    })\n    const added = []\n    const updated = []\n    const filteredUpdated = []\n    const removed = []\n    if (state === null) {\n      removed.push(clientID)\n    } else if (prevState == null) {\n      if (state != null) {\n        added.push(clientID)\n      }\n    } else {\n      updated.push(clientID)\n      if (!f.equalityDeep(prevState, state)) {\n        filteredUpdated.push(clientID)\n      }\n    }\n    if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n      this.emit('change', [{ added, updated: filteredUpdated, removed }, 'local'])\n    }\n    this.emit('update', [{ added, updated, removed }, 'local'])\n  }\n\n  /**\n   * @param {string} field\n   * @param {any} value\n   */\n  setLocalStateField (field, value) {\n    const state = this.getLocalState()\n    if (state !== null) {\n      this.setLocalState({\n        ...state,\n        [field]: value\n      })\n    }\n  }\n\n  /**\n   * @return {Map<number,Object<string,any>>}\n   */\n  getStates () {\n    return this.states\n  }\n}\n\n/**\n * Mark (remote) clients as inactive and remove them from the list of active peers.\n * This change will be propagated to remote clients.\n *\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @param {any} origin\n */\nexport const removeAwarenessStates = (awareness, clients, origin) => {\n  const removed = []\n  for (let i = 0; i < clients.length; i++) {\n    const clientID = clients[i]\n    if (awareness.states.has(clientID)) {\n      awareness.states.delete(clientID)\n      if (clientID === awareness.clientID) {\n        const curMeta = /** @type {MetaClientState} */ (awareness.meta.get(clientID))\n        awareness.meta.set(clientID, {\n          clock: curMeta.clock + 1,\n          lastUpdated: time.getUnixTime()\n        })\n      }\n      removed.push(clientID)\n    }\n  }\n  if (removed.length > 0) {\n    awareness.emit('change', [{ added: [], updated: [], removed }, origin])\n    awareness.emit('update', [{ added: [], updated: [], removed }, origin])\n  }\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @return {Uint8Array}\n */\nexport const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => {\n  const len = clients.length\n  const encoder = encoding.createEncoder()\n  encoding.writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    const clientID = clients[i]\n    const state = states.get(clientID) || null\n    const clock = /** @type {MetaClientState} */ (awareness.meta.get(clientID)).clock\n    encoding.writeVarUint(encoder, clientID)\n    encoding.writeVarUint(encoder, clock)\n    encoding.writeVarString(encoder, JSON.stringify(state))\n  }\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * Modify the content of an awareness update before re-encoding it to an awareness update.\n *\n * This might be useful when you have a central server that wants to ensure that clients\n * cant hijack somebody elses identity.\n *\n * @param {Uint8Array} update\n * @param {function(any):any} modify\n * @return {Uint8Array}\n */\nexport const modifyAwarenessUpdate = (update, modify) => {\n  const decoder = decoding.createDecoder(update)\n  const encoder = encoding.createEncoder()\n  const len = decoding.readVarUint(decoder)\n  encoding.writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    const clientID = decoding.readVarUint(decoder)\n    const clock = decoding.readVarUint(decoder)\n    const state = JSON.parse(decoding.readVarString(decoder))\n    const modifiedState = modify(state)\n    encoding.writeVarUint(encoder, clientID)\n    encoding.writeVarUint(encoder, clock)\n    encoding.writeVarString(encoder, JSON.stringify(modifiedState))\n  }\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Uint8Array} update\n * @param {any} origin This will be added to the emitted change event\n */\nexport const applyAwarenessUpdate = (awareness, update, origin) => {\n  const decoder = decoding.createDecoder(update)\n  const timestamp = time.getUnixTime()\n  const added = []\n  const updated = []\n  const filteredUpdated = []\n  const removed = []\n  const len = decoding.readVarUint(decoder)\n  for (let i = 0; i < len; i++) {\n    const clientID = decoding.readVarUint(decoder)\n    let clock = decoding.readVarUint(decoder)\n    const state = JSON.parse(decoding.readVarString(decoder))\n    const clientMeta = awareness.meta.get(clientID)\n    const prevState = awareness.states.get(clientID)\n    const currClock = clientMeta === undefined ? 0 : clientMeta.clock\n    if (currClock < clock || (currClock === clock && state === null && awareness.states.has(clientID))) {\n      if (state === null) {\n        // never let a remote client remove this local state\n        if (clientID === awareness.clientID && awareness.getLocalState() != null) {\n          // remote client removed the local state. Do not remote state. Broadcast a message indicating\n          // that this client still exists by increasing the clock\n          clock++\n        } else {\n          awareness.states.delete(clientID)\n        }\n      } else {\n        awareness.states.set(clientID, state)\n      }\n      awareness.meta.set(clientID, {\n        clock,\n        lastUpdated: timestamp\n      })\n      if (clientMeta === undefined && state !== null) {\n        added.push(clientID)\n      } else if (clientMeta !== undefined && state === null) {\n        removed.push(clientID)\n      } else if (state !== null) {\n        if (!f.equalityDeep(state, prevState)) {\n          filteredUpdated.push(clientID)\n        }\n        updated.push(clientID)\n      }\n    }\n  }\n  if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n    awareness.emit('change', [{\n      added, updated: filteredUpdated, removed\n    }, origin])\n  }\n  if (added.length > 0 || updated.length > 0 || removed.length > 0) {\n    awareness.emit('update', [{\n      added, updated, removed\n    }, origin])\n  }\n}\n","/**\n * Mutual exclude for JavaScript.\n *\n * @module mutex\n */\n\n/**\n * @callback mutex\n * @param {function():void} cb Only executed when this mutex is not in the current stack\n * @param {function():void} [elseCb] Executed when this mutex is in the current stack\n */\n\n/**\n * Creates a mutual exclude function with the following property:\n *\n * ```js\n * const mutex = createMutex()\n * mutex(() => {\n *   // This function is immediately executed\n *   mutex(() => {\n *     // This function is not executed, as the mutex is already active.\n *   })\n * })\n * ```\n *\n * @return {mutex} A mutual exclude function\n * @public\n */\nexport const createMutex = () => {\n  let token = true\n  return (f, g) => {\n    if (token) {\n      token = false\n      try {\n        f()\n      } finally {\n        token = true\n      }\n    } else if (g !== undefined) {\n      g()\n    }\n  }\n}\n","/**\n * Efficient diffs.\n *\n * @module diff\n */\n\nimport { equalityStrict } from './function.js'\n\n/**\n * A SimpleDiff describes a change on a String.\n *\n * ```js\n * console.log(a) // the old value\n * console.log(b) // the updated value\n * // Apply changes of diff (pseudocode)\n * a.remove(diff.index, diff.remove) // Remove `diff.remove` characters\n * a.insert(diff.index, diff.insert) // Insert `diff.insert`\n * a === b // values match\n * ```\n *\n * @template {string|Array<any>} T\n * @typedef {Object} SimpleDiff\n * @property {Number} index The index where changes were applied\n * @property {Number} remove The number of characters to delete starting\n *                                  at `index`.\n * @property {T} insert The new text to insert at `index` after applying\n */\n\nconst highSurrogateRegex = /[\\uD800-\\uDBFF]/\nconst lowSurrogateRegex = /[\\uDC00-\\uDFFF]/\n\n/**\n * Create a diff between two strings. This diff implementation is highly\n * efficient, but not very sophisticated.\n *\n * @function\n *\n * @param {string} a The old version of the string\n * @param {string} b The updated version of the string\n * @return {SimpleDiff<string>} The diff description.\n */\nexport const simpleDiffString = (a, b) => {\n  let left = 0 // number of same characters counting from left\n  let right = 0 // number of same characters counting from right\n  while (left < a.length && left < b.length && a[left] === b[left]) {\n    left++\n  }\n  // If the last same character is a high surrogate, we need to rollback to the previous character\n  if (left > 0 && highSurrogateRegex.test(a[left - 1])) left--\n  while (right + left < a.length && right + left < b.length && a[a.length - right - 1] === b[b.length - right - 1]) {\n    right++\n  }\n  // If the last same character is a low surrogate, we need to rollback to the previous character\n  if (right > 0 && lowSurrogateRegex.test(a[a.length - right])) right--\n  return {\n    index: left,\n    remove: a.length - left - right,\n    insert: b.slice(left, b.length - right)\n  }\n}\n\n/**\n * @todo Remove in favor of simpleDiffString\n * @deprecated\n */\nexport const simpleDiff = simpleDiffString\n\n/**\n * Create a diff between two arrays. This diff implementation is highly\n * efficient, but not very sophisticated.\n *\n * Note: This is basically the same function as above. Another function was created so that the runtime\n * can better optimize these function calls.\n *\n * @function\n * @template T\n *\n * @param {Array<T>} a The old version of the array\n * @param {Array<T>} b The updated version of the array\n * @param {function(T, T):boolean} [compare]\n * @return {SimpleDiff<Array<T>>} The diff description.\n */\nexport const simpleDiffArray = (a, b, compare = equalityStrict) => {\n  let left = 0 // number of same characters counting from left\n  let right = 0 // number of same characters counting from right\n  while (left < a.length && left < b.length && compare(a[left], b[left])) {\n    left++\n  }\n  while (right + left < a.length && right + left < b.length && compare(a[a.length - right - 1], b[b.length - right - 1])) {\n    right++\n  }\n  return {\n    index: left,\n    remove: a.length - left - right,\n    insert: b.slice(left, b.length - right)\n  }\n}\n\n/**\n * Diff text and try to diff at the current cursor position.\n *\n * @param {string} a\n * @param {string} b\n * @param {number} cursor This should refer to the current left cursor-range position\n */\nexport const simpleDiffStringWithCursor = (a, b, cursor) => {\n  let left = 0 // number of same characters counting from left\n  let right = 0 // number of same characters counting from right\n  // Iterate left to the right until we find a changed character\n  // First iteration considers the current cursor position\n  while (\n    left < a.length &&\n    left < b.length &&\n    a[left] === b[left] &&\n    left < cursor\n  ) {\n    left++\n  }\n  // If the last same character is a high surrogate, we need to rollback to the previous character\n  if (left > 0 && highSurrogateRegex.test(a[left - 1])) left--\n  // Iterate right to the left until we find a changed character\n  while (\n    right + left < a.length &&\n    right + left < b.length &&\n    a[a.length - right - 1] === b[b.length - right - 1]\n  ) {\n    right++\n  }\n  // If the last same character is a low surrogate, we need to rollback to the previous character\n  if (right > 0 && lowSurrogateRegex.test(a[a.length - right])) right--\n  // Try to iterate left further to the right without caring about the current cursor position\n  while (\n    right + left < a.length &&\n    right + left < b.length &&\n    a[left] === b[left]\n  ) {\n    left++\n  }\n  if (left > 0 && highSurrogateRegex.test(a[left - 1])) left--\n  return {\n    index: left,\n    remove: a.length - left - right,\n    insert: b.slice(left, b.length - right)\n  }\n}\n","/**\n * @module sha256\n * Spec: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf\n * Resources:\n * - https://web.archive.org/web/20150315061807/http://csrc.nist.gov/groups/STM/cavp/documents/shs/sha256-384-512.pdf\n */\n\nimport * as binary from '../binary.js'\n\n/**\n * @param {number} w - a 32bit uint\n * @param {number} shift\n */\nconst rotr = (w, shift) => (w >>> shift) | (w << (32 - shift))\n\n/**\n * Helper for SHA-224 & SHA-256. See 4.1.2.\n * @param {number} x\n */\nconst sum0to256 = x => rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22)\n\n/**\n * Helper for SHA-224 & SHA-256. See 4.1.2.\n * @param {number} x\n */\nconst sum1to256 = x => rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25)\n\n/**\n * Helper for SHA-224 & SHA-256. See 4.1.2.\n * @param {number} x\n */\nconst sigma0to256 = x => rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3\n\n/**\n * Helper for SHA-224 & SHA-256. See 4.1.2.\n * @param {number} x\n */\nconst sigma1to256 = x => rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10\n\n// @todo don't init these variables globally\n\n/**\n * See 4.2.2: Constant for sha256 & sha224\n * These words represent the first thirty-two bits of the fractional parts of\n * the cube roots of the first sixty-four prime numbers. In hex, these constant words are (from left to\n * right)\n */\nconst K = new Uint32Array([\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n])\n\n/**\n * See 5.3.3. Initial hash value.\n *\n * These words were obtained by taking the first thirty-two bits of the fractional parts of the\n * square roots of the first eight prime numbers.\n *\n * @todo shouldn't be a global variable\n */\nconst HINIT = new Uint32Array([\n  0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n])\n\n// time to beat: (large value < 4.35s)\n\nclass Hasher {\n  constructor () {\n    const buf = new ArrayBuffer(64 + 64 * 4)\n    // Init working variables using a single arraybuffer\n    this._H = new Uint32Array(buf, 0, 8)\n    this._H.set(HINIT)\n    // \"Message schedule\" - a working variable\n    this._W = new Uint32Array(buf, 64, 64)\n  }\n\n  _updateHash () {\n    const H = this._H\n    const W = this._W\n    for (let t = 16; t < 64; t++) {\n      W[t] = sigma1to256(W[t - 2]) + W[t - 7] + sigma0to256(W[t - 15]) + W[t - 16]\n    }\n    let a = H[0]\n    let b = H[1]\n    let c = H[2]\n    let d = H[3]\n    let e = H[4]\n    let f = H[5]\n    let g = H[6]\n    let h = H[7]\n    for (let tt = 0, T1, T2; tt < 64; tt++) {\n      T1 = (h + sum1to256(e) + ((e & f) ^ (~e & g)) + K[tt] + W[tt]) >>> 0\n      T2 = (sum0to256(a) + ((a & b) ^ (a & c) ^ (b & c))) >>> 0\n      h = g\n      g = f\n      f = e\n      e = (d + T1) >>> 0\n      d = c\n      c = b\n      b = a\n      a = (T1 + T2) >>> 0\n    }\n    H[0] += a\n    H[1] += b\n    H[2] += c\n    H[3] += d\n    H[4] += e\n    H[5] += f\n    H[6] += g\n    H[7] += h\n  }\n\n  /**\n   * Returns a 32-byte hash.\n   *\n   * @param {Uint8Array} data\n   */\n  digest (data) {\n    let i = 0\n    for (; i + 56 <= data.length;) {\n      // write data in big endianess\n      let j = 0\n      for (; j < 16 && i + 3 < data.length; j++) {\n        this._W[j] = data[i++] << 24 | data[i++] << 16 | data[i++] << 8 | data[i++]\n      }\n      if (i % 64 !== 0) { // there is still room to write partial content and the ending bit.\n        this._W.fill(0, j, 16)\n        while (i < data.length) {\n          this._W[j] |= data[i] << ((3 - (i % 4)) * 8)\n          i++\n        }\n        this._W[j] |= binary.BIT8 << ((3 - (i % 4)) * 8)\n      }\n      this._updateHash()\n    }\n    // same check as earlier - the ending bit has been written\n    const isPaddedWith1 = i % 64 !== 0\n    this._W.fill(0, 0, 16)\n    let j = 0\n    for (; i < data.length; j++) {\n      for (let ci = 3; ci >= 0 && i < data.length; ci--) {\n        this._W[j] |= data[i++] << (ci * 8)\n      }\n    }\n    // Write padding of the message. See 5.1.2.\n    if (!isPaddedWith1) {\n      this._W[j - (i % 4 === 0 ? 0 : 1)] |= binary.BIT8 << ((3 - (i % 4)) * 8)\n    }\n    // write length of message (size in bits) as 64 bit uint\n    // @todo test that this works correctly\n    this._W[14] = data.byteLength / binary.BIT30 // same as data.byteLength >>> 30 - but works on floats\n    this._W[15] = data.byteLength * 8\n    this._updateHash()\n    // correct H endianness to use big endiannes and return a Uint8Array\n    const dv = new Uint8Array(32)\n    for (let i = 0; i < this._H.length; i++) {\n      for (let ci = 0; ci < 4; ci++) {\n        dv[i * 4 + ci] = this._H[i] >>> (3 - ci) * 8\n      }\n    }\n    return dv\n  }\n}\n\n/**\n * Returns a 32-byte hash.\n *\n * @param {Uint8Array} data\n */\nexport const digest = data => new Hasher().digest(data)\n","import * as Y from 'yjs';\nimport { Item, ContentType, Text, XmlElement, UndoManager } from 'yjs';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { PluginKey, Plugin, TextSelection, AllSelection, NodeSelection, Selection } from 'prosemirror-state';\nimport 'y-protocols/awareness';\nimport { createMutex } from 'lib0/mutex';\nimport * as PModel from 'prosemirror-model';\nimport { Fragment, Node } from 'prosemirror-model';\nimport * as math from 'lib0/math';\nimport * as object from 'lib0/object';\nimport * as set from 'lib0/set';\nimport { simpleDiff } from 'lib0/diff';\nimport * as error from 'lib0/error';\nimport * as random from 'lib0/random';\nimport * as environment from 'lib0/environment';\nimport * as dom from 'lib0/dom';\nimport * as eventloop from 'lib0/eventloop';\nimport * as map from 'lib0/map';\nimport * as sha256 from 'lib0/hash/sha256';\nimport * as buf from 'lib0/buffer';\nimport { ReplaceStep } from 'prosemirror-transform';\n\n/**\n * The unique prosemirror plugin key for syncPlugin\n *\n * @public\n */\nconst ySyncPluginKey = new PluginKey('y-sync');\n\n/**\n * The unique prosemirror plugin key for undoPlugin\n *\n * @public\n */\nconst yUndoPluginKey = new PluginKey('y-undo');\n\n/**\n * The unique prosemirror plugin key for cursorPlugin\n *\n * @public\n */\nconst yCursorPluginKey = new PluginKey('yjs-cursor');\n\n/**\n * Custom function to transform sha256 hash to N byte\n *\n * @param {Uint8Array} digest\n */\nconst _convolute = digest => {\n  const N = 6;\n  for (let i = N; i < digest.length; i++) {\n    digest[i % N] = digest[i % N] ^ digest[i];\n  }\n  return digest.slice(0, N)\n};\n\n/**\n * @param {any} json\n */\nconst hashOfJSON = (json) => buf.toBase64(_convolute(sha256.digest(buf.encodeAny(json))));\n\n/**\n * @module bindings/prosemirror\n */\n\n/**\n * @typedef {Object} BindingMetadata\n * @property {ProsemirrorMapping} BindingMetadata.mapping\n * @property {Map<import('prosemirror-model').MarkType, boolean>} BindingMetadata.isOMark - is overlapping mark\n */\n\n/**\n * @return BindingMetadata\n */\nconst createEmptyMeta = () => ({\n  mapping: new Map(),\n  isOMark: new Map()\n});\n\n/**\n * @param {Y.Item} item\n * @param {Y.Snapshot} [snapshot]\n */\nconst isVisible = (item, snapshot) =>\n  snapshot === undefined\n    ? !item.deleted\n    : (snapshot.sv.has(item.id.client) && /** @type {number} */\n      (snapshot.sv.get(item.id.client)) > item.id.clock &&\n      !Y.isDeleted(snapshot.ds, item.id));\n\n/**\n * Either a node if type is YXmlElement or an Array of text nodes if YXmlText\n * @typedef {Map<Y.AbstractType<any>, PModel.Node | Array<PModel.Node>>} ProsemirrorMapping\n */\n\n/**\n * @typedef {Object} ColorDef\n * @property {string} ColorDef.light\n * @property {string} ColorDef.dark\n */\n\n/**\n * @typedef {Object} YSyncOpts\n * @property {Array<ColorDef>} [YSyncOpts.colors]\n * @property {Map<string,ColorDef>} [YSyncOpts.colorMapping]\n * @property {Y.PermanentUserData|null} [YSyncOpts.permanentUserData]\n * @property {ProsemirrorMapping} [YSyncOpts.mapping]\n * @property {function} [YSyncOpts.onFirstRender] Fired when the content from Yjs is initially rendered to ProseMirror\n */\n\n/**\n * @type {Array<ColorDef>}\n */\nconst defaultColors = [{ light: '#ecd44433', dark: '#ecd444' }];\n\n/**\n * @param {Map<string,ColorDef>} colorMapping\n * @param {Array<ColorDef>} colors\n * @param {string} user\n * @return {ColorDef}\n */\nconst getUserColor = (colorMapping, colors, user) => {\n  // @todo do not hit the same color twice if possible\n  if (!colorMapping.has(user)) {\n    if (colorMapping.size < colors.length) {\n      const usedColors = set.create();\n      colorMapping.forEach((color) => usedColors.add(color));\n      colors = colors.filter((color) => !usedColors.has(color));\n    }\n    colorMapping.set(user, random.oneOf(colors));\n  }\n  return /** @type {ColorDef} */ (colorMapping.get(user))\n};\n\n/**\n * This plugin listens to changes in prosemirror view and keeps yXmlState and view in sync.\n *\n * This plugin also keeps references to the type and the shared document so other plugins can access it.\n * @param {Y.XmlFragment} yXmlFragment\n * @param {YSyncOpts} opts\n * @return {any} Returns a prosemirror plugin that binds to this type\n */\nconst ySyncPlugin = (yXmlFragment, {\n  colors = defaultColors,\n  colorMapping = new Map(),\n  permanentUserData = null,\n  onFirstRender = () => {},\n  mapping\n} = {}) => {\n  let initialContentChanged = false;\n  const binding = new ProsemirrorBinding(yXmlFragment, mapping);\n  const plugin = new Plugin({\n    props: {\n      editable: (state) => {\n        const syncState = ySyncPluginKey.getState(state);\n        return syncState.snapshot == null && syncState.prevSnapshot == null\n      }\n    },\n    key: ySyncPluginKey,\n    state: {\n      /**\n       * @returns {any}\n       */\n      init: (_initargs, _state) => {\n        return {\n          type: yXmlFragment,\n          doc: yXmlFragment.doc,\n          binding,\n          snapshot: null,\n          prevSnapshot: null,\n          isChangeOrigin: false,\n          isUndoRedoOperation: false,\n          addToHistory: true,\n          colors,\n          colorMapping,\n          permanentUserData\n        }\n      },\n      apply: (tr, pluginState) => {\n        const change = tr.getMeta(ySyncPluginKey);\n        if (change !== undefined) {\n          pluginState = Object.assign({}, pluginState);\n          for (const key in change) {\n            pluginState[key] = change[key];\n          }\n        }\n        if (tr.docChanged) {\n          pluginState.addToHistory = tr.getMeta('addToHistory') !== false;\n        }\n        // always set isChangeOrigin. If undefined, this is not change origin.\n        pluginState.isChangeOrigin = change !== undefined &&\n          !!change.isChangeOrigin;\n        pluginState.isUndoRedoOperation = change !== undefined && !!change.isChangeOrigin && !!change.isUndoRedoOperation;\n        if (binding.prosemirrorView !== null) {\n          if (\n            change !== undefined &&\n            (change.snapshot != null || change.prevSnapshot != null)\n          ) {\n            // snapshot changed, rerender next\n            eventloop.timeout(0, () => {\n              if (binding.prosemirrorView == null) {\n                return\n              }\n              if (change.restore == null) {\n                binding._renderSnapshot(\n                  change.snapshot,\n                  change.prevSnapshot,\n                  pluginState\n                );\n              } else {\n                binding._renderSnapshot(\n                  change.snapshot,\n                  change.snapshot,\n                  pluginState\n                );\n                // reset to current prosemirror state\n                delete pluginState.restore;\n                delete pluginState.snapshot;\n                delete pluginState.prevSnapshot;\n                binding.mux(() => {\n                  binding._prosemirrorChanged(\n                    binding.prosemirrorView.state.doc\n                  );\n                });\n              }\n            });\n          }\n        }\n        return pluginState\n      }\n    },\n    view: (view) => {\n      binding.initView(view);\n      if (mapping == null) {\n        // force rerender to update the bindings mapping\n        binding._forceRerender();\n      }\n      onFirstRender();\n      return {\n        update: () => {\n          const pluginState = plugin.getState(view.state);\n          if (\n            pluginState.snapshot == null && pluginState.prevSnapshot == null\n          ) {\n            if (\n              // If the content doesn't change initially, we don't render anything to Yjs\n              // If the content was cleared by a user action, we want to catch the change and\n              // represent it in Yjs\n              initialContentChanged ||\n              view.state.doc.content.findDiffStart(\n                view.state.doc.type.createAndFill().content\n              ) !== null\n            ) {\n              initialContentChanged = true;\n              if (\n                pluginState.addToHistory === false &&\n                !pluginState.isChangeOrigin\n              ) {\n                const yUndoPluginState = yUndoPluginKey.getState(view.state);\n                /**\n                 * @type {Y.UndoManager}\n                 */\n                const um = yUndoPluginState && yUndoPluginState.undoManager;\n                if (um) {\n                  um.stopCapturing();\n                }\n              }\n              binding.mux(() => {\n                /** @type {Y.Doc} */ (pluginState.doc).transact((tr) => {\n                  tr.meta.set('addToHistory', pluginState.addToHistory);\n                  binding._prosemirrorChanged(view.state.doc);\n                }, ySyncPluginKey);\n              });\n            }\n          }\n        },\n        destroy: () => {\n          binding.destroy();\n        }\n      }\n    }\n  });\n  return plugin\n};\n\n/**\n * Resolves one text-selection endpoint after a remote update. Falls back to\n * content-based matching when the Yjs resolution is missing or lands in the\n * wrong block, and keeps the Yjs resolution when the fallback finds nothing.\n *\n * @param {import('prosemirror-model').Node} newDoc\n * @param {import('prosemirror-model').Node} oldDoc\n * @param {number|null|undefined} oldAbs\n * @param {number|null} resolved\n * @return {number|null}\n */\nconst recoverSelectionEndpoint = (newDoc, oldDoc, oldAbs, resolved) => {\n  if (oldAbs == null) {\n    return resolved\n  }\n  const misresolved = resolved === null ||\n    (oldAbs > 1 && resolved <= 1) ||\n    isMisresolvedAfterStructuralChange(oldDoc, newDoc, oldAbs, resolved);\n  if (!misresolved) {\n    return resolved\n  }\n  const recovered = findAbsolutePositionAfterStructuralChange(oldDoc, newDoc, oldAbs);\n  return recovered !== null ? recovered : resolved\n};\n\n/**\n * @param {import('prosemirror-state').Transaction} tr\n * @param {ReturnType<typeof getRelativeSelection>} relSel\n * @param {ProsemirrorBinding} binding\n * @param {import('prosemirror-model').Node} [oldDoc]\n */\nconst restoreRelativeSelection = (tr, relSel, binding, oldDoc) => {\n  if (relSel !== null && relSel.anchor !== null && relSel.head !== null) {\n    if (relSel.type === 'all') {\n      tr.setSelection(new AllSelection(tr.doc));\n    } else if (relSel.type === 'node') {\n      const anchor = relativePositionToAbsolutePosition(\n        binding.doc,\n        binding.type,\n        relSel.anchor,\n        binding.mapping\n      );\n      // anchor is null when the referenced node was deleted or moved out of\n      // binding.type by a remote update; resolving null would throw.\n      if (anchor !== null) {\n        tr.setSelection(createSafeNodeSelection(tr, anchor));\n      }\n    } else if (relSel.type === 'nodeRange') {\n      const anchor = relativePositionToAbsolutePosition(\n        binding.doc,\n        binding.type,\n        relSel.anchor,\n        binding.mapping\n      );\n      const head = relativePositionToAbsolutePosition(\n        binding.doc,\n        binding.type,\n        relSel.head,\n        binding.mapping\n      );\n      const selection = createSafeNodeRangeSelection(tr, anchor, head, relSel.depth);\n      if (selection !== null) {\n        tr.setSelection(selection);\n      }\n    } else {\n      let anchor = relativePositionToAbsolutePosition(\n        binding.doc,\n        binding.type,\n        relSel.anchor,\n        binding.mapping\n      );\n      let head = relativePositionToAbsolutePosition(\n        binding.doc,\n        binding.type,\n        relSel.head,\n        binding.mapping\n      );\n      if (oldDoc != null) {\n        anchor = recoverSelectionEndpoint(tr.doc, oldDoc, relSel.absAnchor, anchor);\n        head = recoverSelectionEndpoint(tr.doc, oldDoc, relSel.absHead, head);\n      }\n      // Collapse to the surviving endpoint instead of dropping the selection;\n      // an unset selection maps through the full-doc replace to the doc start.\n      if (anchor === null) {\n        anchor = head;\n      }\n      if (head === null) {\n        head = anchor;\n      }\n      if (anchor !== null && head !== null) {\n        tr.setSelection(TextSelection.between(tr.doc.resolve(anchor), tr.doc.resolve(head)));\n      }\n    }\n  }\n};\n\n/**\n * @param {import('prosemirror-state').Transaction} tr\n * @param {number} pos\n * @returns {import('prosemirror-state').Selection}\n *\n * Creates a NodeSelection if the position points to a valid node, otherwise\n * creates a TextSelection near the position.\n */\nconst createSafeNodeSelection = (tr, pos) => {\n  const $pos = tr.doc.resolve(pos);\n  if ($pos.nodeAfter) {\n    return NodeSelection.create(tr.doc, pos)\n  } else {\n    return TextSelection.near($pos)\n  }\n};\n\n/**\n * Safely reconstructs a NodeRangeSelection from resolved absolute positions.\n *\n * @param {import('prosemirror-state').Transaction} tr - The transaction whose document provides resolved positions.\n * @param {number|null} anchor - Absolute document position marking the start (boundary) of the node range.\n *        Use `relativePositionToAbsolutePosition` before calling this function.\n * @param {number|null} head - Absolute document position marking the end (boundary) of the node range.\n *        Use `relativePositionToAbsolutePosition` before calling this function.\n * @param {number|undefined} depth - The nesting depth at which the range operates (e.g. 0 for\n *        top-level blocks, 1 for blocks nested inside a wrapper). Passed through to\n *        `Selection.fromJSON`; ignored by `@tiptap/extension-node-range` < v2.29 but\n *        properly stored starting from that version.\n * @returns {import('prosemirror-state').Selection|null} Reconstructed selection, or null if\n *          anchor/head could not be resolved.\n */\nconst createSafeNodeRangeSelection = (tr, anchor, head, depth) => {\n  if (anchor === null || head === null) {\n    return null\n  }\n  const clampedAnchor = Math.min(Math.max(anchor, 0), tr.doc.content.size);\n  const clampedHead = Math.min(Math.max(head, 0), tr.doc.content.size);\n  try {\n    const selection = Selection.fromJSON(tr.doc, {\n      type: 'nodeRange',\n      anchor: clampedAnchor,\n      head: clampedHead,\n      depth\n    });\n    if (!selection.ranges.length) {\n      return TextSelection.near(tr.doc.resolve(clampedAnchor))\n    }\n    return selection\n  } catch (e) {\n    return TextSelection.near(tr.doc.resolve(clampedAnchor))\n  }\n};\n\n/**\n * @param {ProsemirrorBinding} pmbinding\n * @param {import('prosemirror-state').EditorState} state\n */\nconst getRelativeSelection = (pmbinding, state) => {\n  const type = /** @type {any} */ (state.selection).jsonID;\n  return {\n    type,\n    // `depth` is only meaningful for NodeRangeSelection; undefined for every other type.\n    depth: type === 'nodeRange' ? /** @type {any} */ (state.selection).depth : undefined,\n    anchor: absolutePositionToRelativePosition(\n      state.selection.anchor,\n      pmbinding.type,\n      pmbinding.mapping\n    ),\n    head: absolutePositionToRelativePosition(\n      state.selection.head,\n      pmbinding.type,\n      pmbinding.mapping\n    ),\n    absAnchor: state.selection.anchor,\n    absHead: state.selection.head\n  }\n};\n\n/**\n * Binding for prosemirror.\n *\n * @protected\n */\nclass ProsemirrorBinding {\n  /**\n   * @param {Y.XmlFragment} yXmlFragment The bind source\n   * @param {ProsemirrorMapping} mapping\n   */\n  constructor (yXmlFragment, mapping = new Map()) {\n    this.type = yXmlFragment;\n    /**\n     * this will be set once the view is created\n     * @type {any}\n     */\n    this.prosemirrorView = null;\n    this.mux = createMutex();\n    this.mapping = mapping;\n    /**\n     * Is overlapping mark - i.e. mark does not exclude itself.\n     *\n     * @type {Map<import('prosemirror-model').MarkType, boolean>}\n     */\n    this.isOMark = new Map();\n    this._observeFunction = this._typeChanged.bind(this);\n    /**\n     * @type {Y.Doc}\n     */\n    // @ts-ignore\n    this.doc = yXmlFragment.doc;\n    /**\n     * current selection as relative positions in the Yjs model\n     */\n    this.beforeTransactionSelection = null;\n    this.beforeAllTransactions = () => {\n      if (this.beforeTransactionSelection === null && this.prosemirrorView != null) {\n        this.beforeTransactionSelection = getRelativeSelection(\n          this,\n          this.prosemirrorView.state\n        );\n      }\n    };\n    this.afterAllTransactions = () => {\n      this.beforeTransactionSelection = null;\n    };\n    this._domSelectionInView = null;\n  }\n\n  /**\n   * Create a transaction for changing the prosemirror state.\n   *\n   * @returns\n   */\n  get _tr () {\n    return this.prosemirrorView.state.tr.setMeta('addToHistory', false)\n  }\n\n  _isLocalCursorInView () {\n    if (!this.prosemirrorView.hasFocus()) return false\n    if (environment.isBrowser && this._domSelectionInView === null) {\n      // Calculate the domSelectionInView and clear by next tick after all events are finished\n      eventloop.timeout(0, () => {\n        this._domSelectionInView = null;\n      });\n      this._domSelectionInView = this._isDomSelectionInView();\n    }\n    return this._domSelectionInView\n  }\n\n  _isDomSelectionInView () {\n    const selection = this.prosemirrorView._root.getSelection();\n\n    if (selection == null || selection.anchorNode == null) return false\n\n    const range = this.prosemirrorView._root.createRange();\n    range.setStart(selection.anchorNode, selection.anchorOffset);\n    range.setEnd(selection.focusNode, selection.focusOffset);\n\n    // This is a workaround for an edgecase where getBoundingClientRect will\n    // return zero values if the selection is collapsed at the start of a newline\n    // see reference here: https://stackoverflow.com/a/59780954\n    const rects = range.getClientRects();\n    if (rects.length === 0) {\n      // probably buggy newline behavior, explicitly select the node contents\n      if (range.startContainer && range.collapsed) {\n        range.selectNodeContents(range.startContainer);\n      }\n    }\n\n    const bounding = range.getBoundingClientRect();\n    const documentElement = dom.doc.documentElement;\n\n    return bounding.bottom >= 0 && bounding.right >= 0 &&\n      bounding.left <=\n        (window.innerWidth || documentElement.clientWidth || 0) &&\n      bounding.top <= (window.innerHeight || documentElement.clientHeight || 0)\n  }\n\n  /**\n   * @param {Y.Snapshot} snapshot\n   * @param {Y.Snapshot} prevSnapshot\n   */\n  renderSnapshot (snapshot, prevSnapshot) {\n    if (!prevSnapshot) {\n      prevSnapshot = Y.createSnapshot(Y.createDeleteSet(), new Map());\n    }\n    this.prosemirrorView.dispatch(\n      this._tr.setMeta(ySyncPluginKey, { snapshot, prevSnapshot })\n    );\n  }\n\n  unrenderSnapshot () {\n    this.mapping.clear();\n    this.mux(() => {\n      const fragmentContent = this.type.toArray().map((t) =>\n        createNodeFromYElement(\n          /** @type {Y.XmlElement} */ (t),\n          this.prosemirrorView.state.schema,\n          this\n        )\n      ).filter((n) => n !== null);\n      // @ts-ignore\n      const tr = this._tr.replace(\n        0,\n        this.prosemirrorView.state.doc.content.size,\n        new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n      );\n      tr.setMeta(ySyncPluginKey, { snapshot: null, prevSnapshot: null });\n      this.prosemirrorView.dispatch(tr);\n    });\n  }\n\n  _forceRerender () {\n    this.mapping.clear();\n    this.mux(() => {\n      // If this is a forced rerender, this might neither happen as a pm change nor within a Yjs\n      // transaction. Then the \"before selection\" doesn't exist. In this case, we need to create a\n      // relative position before replacing content. Fixes #126\n      const sel = this.beforeTransactionSelection !== null ? null : this.prosemirrorView.state.selection;\n      const fragmentContent = this.type.toArray().map((t) =>\n        createNodeFromYElement(\n          /** @type {Y.XmlElement} */ (t),\n          this.prosemirrorView.state.schema,\n          this\n        )\n      ).filter((n) => n !== null);\n      // @ts-ignore\n      const tr = this._tr.replace(\n        0,\n        this.prosemirrorView.state.doc.content.size,\n        new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n      );\n      if (sel) {\n        /**\n         * If the Prosemirror document we just created from this.type is\n         * smaller than the previous document, the selection might be\n         * out of bound, which would make Prosemirror throw an error.\n         */\n        const clampedAnchor = math.min(math.max(sel.anchor, 0), tr.doc.content.size);\n        const clampedHead = math.min(math.max(sel.head, 0), tr.doc.content.size);\n\n        tr.setSelection(TextSelection.create(tr.doc, clampedAnchor, clampedHead));\n      }\n      this.prosemirrorView.dispatch(\n        tr.setMeta(ySyncPluginKey, { isChangeOrigin: true, binding: this })\n      );\n    });\n  }\n\n  /**\n   * @param {Y.Snapshot|Uint8Array} snapshot\n   * @param {Y.Snapshot|Uint8Array} prevSnapshot\n   * @param {Object} pluginState\n   */\n  _renderSnapshot (snapshot, prevSnapshot, pluginState) {\n    /**\n     * The document that contains the full history of this document.\n     * @type {Y.Doc}\n     */\n    let historyDoc = this.doc;\n    let historyType = this.type;\n    if (!snapshot) {\n      snapshot = Y.snapshot(this.doc);\n    }\n    if (snapshot instanceof Uint8Array || prevSnapshot instanceof Uint8Array) {\n      if (!(snapshot instanceof Uint8Array) || !(prevSnapshot instanceof Uint8Array)) {\n        // expected both snapshots to be v2 updates\n        error.unexpectedCase();\n      }\n      historyDoc = new Y.Doc({ gc: false });\n      Y.applyUpdateV2(historyDoc, prevSnapshot);\n      prevSnapshot = Y.snapshot(historyDoc);\n      Y.applyUpdateV2(historyDoc, snapshot);\n      snapshot = Y.snapshot(historyDoc);\n      if (historyType._item === null) {\n        /**\n         * If is a root type, we need to find the root key in the initial document\n         * and use it to get the history type.\n         */\n        const rootKey = Array.from(this.doc.share.keys()).find(\n          (key) => this.doc.share.get(key) === this.type\n        );\n        historyType = historyDoc.getXmlFragment(rootKey);\n      } else {\n        /**\n         * If it is a sub type, we use the item id to find the history type.\n         */\n        const historyStructs =\n          historyDoc.store.clients.get(historyType._item.id.client) ?? [];\n        const itemIndex = Y.findIndexSS(\n          historyStructs,\n          historyType._item.id.clock\n        );\n        const item = /** @type {Y.Item} */ (historyStructs[itemIndex]);\n        const content = /** @type {Y.ContentType} */ (item.content);\n        historyType = /** @type {Y.XmlFragment} */ (content.type);\n      }\n    }\n    // clear mapping because we are going to rerender\n    this.mapping.clear();\n    this.mux(() => {\n      historyDoc.transact((transaction) => {\n        // before rendering, we are going to sanitize ops and split deleted ops\n        // if they were deleted by seperate users.\n        /**\n         * @type {Y.PermanentUserData}\n         */\n        const pud = pluginState.permanentUserData;\n        if (pud) {\n          pud.dss.forEach((ds) => {\n            Y.iterateDeletedStructs(transaction, ds, (_item) => {});\n          });\n        }\n        /**\n         * @param {'removed'|'added'} type\n         * @param {Y.ID} id\n         */\n        const computeYChange = (type, id) => {\n          const user = type === 'added'\n            ? pud.getUserByClientId(id.client)\n            : pud.getUserByDeletedId(id);\n          return {\n            user,\n            type,\n            color: getUserColor(\n              pluginState.colorMapping,\n              pluginState.colors,\n              user\n            )\n          }\n        };\n        // Create document fragment and render\n        const fragmentContent = Y.typeListToArraySnapshot(\n          historyType,\n          new Y.Snapshot(prevSnapshot.ds, snapshot.sv)\n        ).map((t) => {\n          if (\n            !t._item.deleted || isVisible(t._item, snapshot) ||\n            isVisible(t._item, prevSnapshot)\n          ) {\n            return createNodeFromYElement(\n              t,\n              this.prosemirrorView.state.schema,\n              { mapping: new Map(), isOMark: new Map() },\n              snapshot,\n              prevSnapshot,\n              computeYChange\n            )\n          } else {\n            // No need to render elements that are not visible by either snapshot.\n            // If a client adds and deletes content in the same snapshot the element is not visible by either snapshot.\n            return null\n          }\n        }).filter((n) => n !== null);\n        // @ts-ignore\n        const tr = this._tr.replace(\n          0,\n          this.prosemirrorView.state.doc.content.size,\n          new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n        );\n        this.prosemirrorView.dispatch(\n          tr.setMeta(ySyncPluginKey, { isChangeOrigin: true })\n        );\n      }, ySyncPluginKey);\n    });\n  }\n\n  /**\n   * @param {Array<Y.YEvent<any>>} events\n   * @param {Y.Transaction} transaction\n   */\n  _typeChanged (events, transaction) {\n    if (this.prosemirrorView == null) return\n    const syncState = ySyncPluginKey.getState(this.prosemirrorView.state);\n    if (\n      events.length === 0 || syncState.snapshot != null ||\n      syncState.prevSnapshot != null\n    ) {\n      // drop out if snapshot is active\n      this.renderSnapshot(syncState.snapshot, syncState.prevSnapshot);\n      return\n    }\n    this.mux(() => {\n      /**\n       * @param {any} _\n       * @param {Y.AbstractType<any>} type\n       */\n      const delType = (_, type) => this.mapping.delete(type);\n      Y.iterateDeletedStructs(\n        transaction,\n        transaction.deleteSet,\n        (struct) => {\n          if (struct.constructor === Y.Item) {\n            const type = /** @type {Y.ContentType} */ (/** @type {Y.Item} */ (struct).content).type;\n            type && this.mapping.delete(type);\n          }\n        }\n      );\n      transaction.changed.forEach(delType);\n      transaction.changedParentTypes.forEach(delType);\n      // Rebuild the full Y↔PM mapping so relative cursor positions resolve against\n      // current node sizes after structural changes (e.g. drag-and-drop block moves).\n      this.mapping.clear();\n      const fragmentContent = this.type.toArray().map((t) =>\n        createNodeIfNotExists(\n          /** @type {Y.XmlElement | Y.XmlHook} */ (t),\n          this.prosemirrorView.state.schema,\n          this\n        )\n      ).filter((n) => n !== null);\n      const oldDoc = this.prosemirrorView.state.doc;\n      // @ts-ignore\n      let tr = this._tr.replace(\n        0,\n        this.prosemirrorView.state.doc.content.size,\n        new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n      );\n      restoreRelativeSelection(tr, this.beforeTransactionSelection, this, oldDoc);\n      tr = tr.setMeta(ySyncPluginKey, { isChangeOrigin: true, isUndoRedoOperation: transaction.origin instanceof Y.UndoManager });\n      if (\n        this.beforeTransactionSelection !== null && this._isLocalCursorInView()\n      ) {\n        tr.scrollIntoView();\n      }\n      this.prosemirrorView.dispatch(tr);\n    });\n  }\n\n  /**\n   * @param {import('prosemirror-model').Node} doc\n   */\n  _prosemirrorChanged (doc) {\n    this.doc.transact(() => {\n      updateYFragment(this.doc, this.type, doc, this);\n      this.beforeTransactionSelection = getRelativeSelection(\n        this,\n        this.prosemirrorView.state\n      );\n    }, ySyncPluginKey);\n  }\n\n  /**\n   * View is ready to listen to changes. Register observers.\n   * @param {any} prosemirrorView\n   */\n  initView (prosemirrorView) {\n    if (this.prosemirrorView != null) this.destroy();\n    this.prosemirrorView = prosemirrorView;\n    this.doc.on('beforeAllTransactions', this.beforeAllTransactions);\n    this.doc.on('afterAllTransactions', this.afterAllTransactions);\n    this.type.observeDeep(this._observeFunction);\n  }\n\n  destroy () {\n    if (this.prosemirrorView == null) return\n    this.prosemirrorView = null;\n    this.type.unobserveDeep(this._observeFunction);\n    this.doc.off('beforeAllTransactions', this.beforeAllTransactions);\n    this.doc.off('afterAllTransactions', this.afterAllTransactions);\n  }\n}\n\n/**\n * @private\n * @param {Y.XmlElement | Y.XmlHook} el\n * @param {PModel.Schema} schema\n * @param {BindingMetadata} meta\n * @param {Y.Snapshot} [snapshot]\n * @param {Y.Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', Y.ID):any} [computeYChange]\n * @return {PModel.Node | null}\n */\nconst createNodeIfNotExists = (\n  el,\n  schema,\n  meta,\n  snapshot,\n  prevSnapshot,\n  computeYChange\n) => {\n  const node = /** @type {PModel.Node} */ (meta.mapping.get(el));\n  if (node === undefined) {\n    if (el instanceof Y.XmlElement) {\n      return createNodeFromYElement(\n        el,\n        schema,\n        meta,\n        snapshot,\n        prevSnapshot,\n        computeYChange\n      )\n    } else {\n      throw error.methodUnimplemented() // we are currently not handling hooks\n    }\n  }\n  return node\n};\n\n/**\n * @private\n * @param {Y.XmlElement} el\n * @param {any} schema\n * @param {BindingMetadata} meta\n * @param {Y.Snapshot} [snapshot]\n * @param {Y.Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', Y.ID):any} [computeYChange]\n * @return {PModel.Node | null} Returns node if node could be created. Otherwise it deletes the yjs type and returns null\n */\nconst createNodeFromYElement = (\n  el,\n  schema,\n  meta,\n  snapshot,\n  prevSnapshot,\n  computeYChange\n) => {\n  const children = [];\n  /**\n   * @param {Y.XmlElement | Y.XmlText} type\n   */\n  const createChildren = (type) => {\n    if (type instanceof Y.XmlElement) {\n      const n = createNodeIfNotExists(\n        type,\n        schema,\n        meta,\n        snapshot,\n        prevSnapshot,\n        computeYChange\n      );\n      if (n !== null) {\n        children.push(n);\n      }\n    } else {\n      // If the next ytext exists and was created by us, move the content to the current ytext.\n      // This is a fix for #160 -- duplication of characters when two Y.Text exist next to each\n      // other.\n      const nextytext = /** @type {Y.ContentType} */ (type._item.right?.content)?.type;\n      if (nextytext instanceof Y.Text && !nextytext._item.deleted && nextytext._item.id.client === nextytext.doc.clientID) {\n        type.applyDelta([\n          { retain: type.length },\n          ...nextytext.toDelta()\n        ]);\n        nextytext.doc.transact(tr => {\n          nextytext._item.delete(tr);\n        });\n      }\n      // now create the prosemirror text nodes\n      const ns = createTextNodesFromYText(\n        type,\n        schema,\n        meta,\n        snapshot,\n        prevSnapshot,\n        computeYChange\n      );\n      if (ns !== null) {\n        ns.forEach((textchild) => {\n          if (textchild !== null) {\n            children.push(textchild);\n          }\n        });\n      }\n    }\n  };\n  if (snapshot === undefined || prevSnapshot === undefined) {\n    el.toArray().forEach(createChildren);\n  } else {\n    Y.typeListToArraySnapshot(el, new Y.Snapshot(prevSnapshot.ds, snapshot.sv))\n      .forEach(createChildren);\n  }\n  try {\n    const attrs = el.getAttributes(snapshot);\n    if (snapshot !== undefined) {\n      if (!isVisible(/** @type {Y.Item} */ (el._item), snapshot)) {\n        attrs.ychange = computeYChange\n          ? computeYChange('removed', /** @type {Y.Item} */ (el._item).id)\n          : { type: 'removed' };\n      } else if (!isVisible(/** @type {Y.Item} */ (el._item), prevSnapshot)) {\n        attrs.ychange = computeYChange\n          ? computeYChange('added', /** @type {Y.Item} */ (el._item).id)\n          : { type: 'added' };\n      }\n    }\n    const node = schema.node(el.nodeName, attrs, children);\n    meta.mapping.set(el, node);\n    return node\n  } catch (e) {\n    // an error occured while creating the node. This is probably a result of a concurrent action.\n    /** @type {Y.Doc} */ (el.doc).transact((transaction) => {\n      /** @type {Y.Item} */ (el._item).delete(transaction);\n    }, ySyncPluginKey);\n    meta.mapping.delete(el);\n    return null\n  }\n};\n\n/**\n * @private\n * @param {Y.XmlText} text\n * @param {import('prosemirror-model').Schema} schema\n * @param {BindingMetadata} _meta\n * @param {Y.Snapshot} [snapshot]\n * @param {Y.Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', Y.ID):any} [computeYChange]\n * @return {Array<PModel.Node>|null}\n */\nconst createTextNodesFromYText = (\n  text,\n  schema,\n  _meta,\n  snapshot,\n  prevSnapshot,\n  computeYChange\n) => {\n  const nodes = [];\n  const deltas = text.toDelta(snapshot, prevSnapshot, computeYChange);\n  try {\n    for (let i = 0; i < deltas.length; i++) {\n      const delta = deltas[i];\n      nodes.push(schema.text(delta.insert, attributesToMarks(delta.attributes, schema)));\n    }\n  } catch (e) {\n    // an error occured while creating the node. This is probably a result of a concurrent action.\n    /** @type {Y.Doc} */ (text.doc).transact((transaction) => {\n      /** @type {Y.Item} */ (text._item).delete(transaction);\n    }, ySyncPluginKey);\n    return null\n  }\n  // @ts-ignore\n  return nodes\n};\n\n/**\n * @private\n * @param {Array<any>} nodes prosemirror node\n * @param {BindingMetadata} meta\n * @return {Y.XmlText}\n */\nconst createTypeFromTextNodes = (nodes, meta) => {\n  const type = new Y.XmlText();\n  const delta = nodes.map((node) => ({\n    // @ts-ignore\n    insert: node.text,\n    attributes: marksToAttributes(node.marks, meta)\n  }));\n  type.applyDelta(delta);\n  meta.mapping.set(type, nodes);\n  return type\n};\n\n/**\n * @private\n * @param {any} node prosemirror node\n * @param {BindingMetadata} meta\n * @return {Y.XmlElement}\n */\nconst createTypeFromElementNode = (node, meta) => {\n  const type = new Y.XmlElement(node.type.name);\n  for (const key in node.attrs) {\n    const val = node.attrs[key];\n    if (val !== null && key !== 'ychange') {\n      type.setAttribute(key, val);\n    }\n  }\n  type.insert(\n    0,\n    normalizePNodeContent(node).map((n) =>\n      createTypeFromTextOrElementNode(n, meta)\n    )\n  );\n  meta.mapping.set(type, node);\n  return type\n};\n\n/**\n * @private\n * @param {PModel.Node|Array<PModel.Node>} node prosemirror text node\n * @param {BindingMetadata} meta\n * @return {Y.XmlElement|Y.XmlText}\n */\nconst createTypeFromTextOrElementNode = (node, meta) =>\n  node instanceof Array\n    ? createTypeFromTextNodes(node, meta)\n    : createTypeFromElementNode(node, meta);\n\n/**\n * @param {any} val\n */\nconst isObject = (val) => typeof val === 'object' && val !== null;\n\n/**\n * @param {any} pattrs\n * @param {any} yattrs\n */\nconst equalAttrs = (pattrs, yattrs) => {\n  const keys = Object.keys(pattrs).filter((key) => pattrs[key] !== null);\n  let eq =\n    keys.length ===\n      Object.keys(yattrs).filter((key) => yattrs[key] !== null).length;\n  for (let i = 0; i < keys.length && eq; i++) {\n    const key = keys[i];\n    const l = pattrs[key];\n    const r = yattrs[key];\n    eq = key === 'ychange' || l === r ||\n      (isObject(l) && isObject(r) && equalAttrs(l, r));\n  }\n  return eq\n};\n\n/**\n * @typedef {Array<Array<PModel.Node>|PModel.Node>} NormalizedPNodeContent\n */\n\n/**\n * @param {any} pnode\n * @return {NormalizedPNodeContent}\n */\nconst normalizePNodeContent = (pnode) => {\n  const c = pnode.content.content;\n  const res = [];\n  for (let i = 0; i < c.length; i++) {\n    const n = c[i];\n    if (n.isText) {\n      const textNodes = [];\n      for (let tnode = c[i]; i < c.length && tnode.isText; tnode = c[++i]) {\n        textNodes.push(tnode);\n      }\n      i--;\n      res.push(textNodes);\n    } else {\n      res.push(n);\n    }\n  }\n  return res\n};\n\n/**\n * @param {Y.XmlText} ytext\n * @param {Array<any>} ptexts\n */\nconst equalYTextPText = (ytext, ptexts) => {\n  const delta = ytext.toDelta();\n  return delta.length === ptexts.length &&\n    delta.every(/** @type {(d:any,i:number) => boolean} */ (d, i) =>\n      d.insert === /** @type {any} */ (ptexts[i]).text &&\n      object.keys(d.attributes || {}).length === ptexts[i].marks.length &&\n      object.every(d.attributes, (attr, /** @type {string} */ yattrname) => {\n        const markname = yattr2markname(yattrname);\n        const pmarks = ptexts[i].marks;\n\n        const pmark = pmarks.find(/** @param {any} mark */ mark => mark.type.name === markname);\n\n        // Ensure the pmark is present in the ptexts before checking equality. When replacing a mark with another mark\n        // the pmark will be missing from the ptexts and the equalAttrs will throw an error.\n        if (!pmark) {\n          return false\n        }\n\n        return equalAttrs(attr, pmarks.find(/** @param {any} mark */ mark => mark.type.name === markname)?.attrs)\n      })\n    )\n};\n\n/**\n * @param {Y.XmlElement|Y.XmlText|Y.XmlHook} ytype\n * @param {any|Array<any>} pnode\n */\nconst equalYTypePNode = (ytype, pnode) => {\n  if (\n    ytype instanceof Y.XmlElement && !(pnode instanceof Array) &&\n    matchNodeName(ytype, pnode)\n  ) {\n    const normalizedContent = normalizePNodeContent(pnode);\n    return ytype._length === normalizedContent.length &&\n      equalAttrs(ytype.getAttributes(), pnode.attrs) &&\n      ytype.toArray().every((ychild, i) =>\n        equalYTypePNode(ychild, normalizedContent[i])\n      )\n  }\n  return ytype instanceof Y.XmlText && pnode instanceof Array &&\n    equalYTextPText(ytype, pnode)\n};\n\n/**\n * For a given Y type and ProseMirror node content, check if the ProseMirror node content is the same as the mapped ProseMirror node content.\n *\n * @param {PModel.Node | Array<PModel.Node> | undefined} mapped The ProseMirror node content that is mapped to the Y type.\n * @param {PModel.Node | Array<PModel.Node>} pcontent The ProseMirror node content to compare against the mapped content.\n * @returns {boolean} Returns true if the mapped content is the same as the ProseMirror node content, false otherwise.\n */\nconst mappedIdentity = (mapped, pcontent) =>\n  mapped === pcontent ||\n  (mapped instanceof Array && pcontent instanceof Array &&\n    mapped.length === pcontent.length && mapped.every((a, i) =>\n    pcontent[i] === a\n  ));\n\n/**\n * @typedef {{ yIndex: number, pIndex: number, yChild: Y.XmlElement | Y.XmlText | Y.XmlHook }} MappedChildAnchor\n */\n\n/**\n * Find mapped children that retain their relative order after a move.\n *\n * @param {Array<Y.XmlElement | Y.XmlText | Y.XmlHook>} yChildren\n * @param {NormalizedPNodeContent} pChildren\n * @param {BindingMetadata} meta\n * @return {Array<MappedChildAnchor>}\n */\nconst findMappedChildAnchors = (yChildren, pChildren, meta) => {\n  const pChildIndices = new Map();\n  pChildren.forEach((pChild, index) => {\n    if (!pChildIndices.has(pChild)) {\n      pChildIndices.set(pChild, index);\n    }\n  });\n  const candidates = [];\n\n  yChildren.forEach((yChild, yIndex) => {\n    const mapped = meta.mapping.get(yChild);\n    const pIndex = pChildIndices.get(mapped);\n    if (pIndex !== undefined && mappedIdentity(mapped, pChildren[pIndex])) {\n      candidates.push({ yIndex, pIndex, yChild });\n    }\n  });\n  if (candidates.length === 0) {\n    return []\n  }\n\n  const predecessors = new Array(candidates.length);\n  const tails = [];\n  for (let index = 0; index < candidates.length; index++) {\n    let low = 0;\n    let high = tails.length;\n    while (low < high) {\n      const middle = (low + high) >> 1;\n      if (candidates[tails[middle]].pIndex < candidates[index].pIndex) {\n        low = middle + 1;\n      } else {\n        high = middle;\n      }\n    }\n    predecessors[index] = low > 0 ? tails[low - 1] : -1;\n    tails[low] = index;\n  }\n\n  const anchors = [];\n  for (let index = tails[tails.length - 1]; index !== -1; index = predecessors[index]) {\n    anchors.push(candidates[index]);\n  }\n  return anchors.reverse()\n};\n\n/**\n * @param {Y.XmlFragment} yDomFragment\n * @param {number} index\n * @param {number} length\n * @param {BindingMetadata} meta\n */\nconst deleteYChildren = (yDomFragment, index, length, meta) => {\n  if (length > 0) {\n    yDomFragment.slice(index, index + length).forEach(type => meta.mapping.delete(type));\n    yDomFragment.delete(index, length);\n  }\n};\n\n/**\n * @param {Y.XmlFragment} yDomFragment\n * @param {number} index\n * @param {NormalizedPNodeContent} pChildren\n * @param {number} start\n * @param {number} end\n * @param {BindingMetadata} meta\n */\nconst insertPChildren = (yDomFragment, index, pChildren, start, end, meta) => {\n  if (start < end) {\n    const children = [];\n    for (let childIndex = start; childIndex < end; childIndex++) {\n      children.push(createTypeFromTextOrElementNode(pChildren[childIndex], meta));\n    }\n    yDomFragment.insert(index, children);\n  }\n};\n\n/**\n * Updates a Y child in place when it still lines up with the ProseMirror child.\n * Recreating it instead would drop concurrent remote edits on that child.\n *\n * @param {{ transact: Function }} y\n * @param {Y.XmlElement | Y.XmlText | Y.XmlHook} yChild\n * @param {PModel.Node | Array<PModel.Node>} pChild\n * @param {BindingMetadata} meta\n * @return {boolean}\n */\nconst updateMatchingYChild = (y, yChild, pChild, meta) => {\n  if (yChild instanceof Y.XmlText && pChild instanceof Array) {\n    if (equalYTextPText(yChild, pChild)) {\n      meta.mapping.set(yChild, pChild);\n    } else {\n      updateYText(yChild, pChild, meta);\n    }\n    return true\n  }\n  if (yChild instanceof Y.XmlElement && !(pChild instanceof Array) && matchNodeName(yChild, pChild)) {\n    if (equalYTypePNode(yChild, pChild)) {\n      meta.mapping.set(yChild, pChild);\n    } else {\n      updateYFragment(y, yChild, pChild, meta);\n    }\n    return true\n  }\n  return false\n};\n\n/**\n * Reconciles the children between two anchors by position, then deletes or\n * inserts to make up the length difference.\n *\n * @param {{ transact: Function }} y\n * @param {Y.XmlFragment} yDomFragment\n * @param {NormalizedPNodeContent} pChildren\n * @param {Array<Y.XmlElement | Y.XmlText | Y.XmlHook>} yChildren\n * @param {number} yStart\n * @param {number} yEnd\n * @param {number} pStart\n * @param {number} pEnd\n * @param {BindingMetadata} meta\n */\nconst reconcileUnanchoredChildren = (\n  y,\n  yDomFragment,\n  pChildren,\n  yChildren,\n  yStart,\n  yEnd,\n  pStart,\n  pEnd,\n  meta\n) => {\n  const matchingChildren = math.min(yEnd - yStart, pEnd - pStart);\n  for (let index = 0; index < matchingChildren; index++) {\n    const yChild = yChildren[yStart + index];\n    const pChild = pChildren[pStart + index];\n    if (!updateMatchingYChild(y, yChild, pChild, meta)) {\n      deleteYChildren(yDomFragment, pStart + index, 1, meta);\n      insertPChildren(yDomFragment, pStart + index, pChildren, pStart + index, pStart + index + 1, meta);\n    }\n  }\n  deleteYChildren(yDomFragment, pStart + matchingChildren, yEnd - yStart - matchingChildren, meta);\n  insertPChildren(yDomFragment, pStart + matchingChildren, pChildren, pStart + matchingChildren, pEnd, meta);\n};\n\n/**\n * Reconciles a fragment whose children were reordered, keeping the Y types of the\n * anchors. The left/right diff in `updateYFragment` mismatches on both ends after\n * a move, so it rebuilds the middle and drops text that is still being edited.\n *\n * @param {{ transact: Function }} y\n * @param {Y.XmlFragment} yDomFragment\n * @param {NormalizedPNodeContent} pChildren\n * @param {Array<Y.XmlElement | Y.XmlText | Y.XmlHook>} yChildren\n * @param {BindingMetadata} meta\n * @return {boolean}\n */\nconst reconcileMappedChildren = (y, yDomFragment, pChildren, yChildren, meta) => {\n  const anchors = findMappedChildAnchors(yChildren, pChildren, meta);\n  // A move needs two anchors with at least one of them at a new index; less than\n  // that is a plain edit. Mismatched kinds cannot be updated in place.\n  if (\n    anchors.length < 2 ||\n    !anchors.some(anchor => anchor.yIndex !== anchor.pIndex) ||\n    anchors.some(anchor => {\n      const pChild = pChildren[anchor.pIndex];\n      return !(\n        (anchor.yChild instanceof Y.XmlText && pChild instanceof Array) ||\n        (anchor.yChild instanceof Y.XmlElement && !(pChild instanceof Array))\n      )\n    })\n  ) {\n    return false\n  }\n\n  let yIndex = 0;\n  let pIndex = 0;\n  for (const anchor of anchors) {\n    reconcileUnanchoredChildren(\n      y,\n      yDomFragment,\n      pChildren,\n      yChildren,\n      yIndex,\n      anchor.yIndex,\n      pIndex,\n      anchor.pIndex,\n      meta\n    );\n\n    const pChild = pChildren[anchor.pIndex];\n    updateMatchingYChild(y, anchor.yChild, pChild, meta);\n    yIndex = anchor.yIndex + 1;\n    pIndex = anchor.pIndex + 1;\n  }\n\n  reconcileUnanchoredChildren(\n    y,\n    yDomFragment,\n    pChildren,\n    yChildren,\n    yIndex,\n    yChildren.length,\n    pIndex,\n    pChildren.length,\n    meta\n  );\n  return true\n};\n\n/**\n * @param {Y.XmlElement} ytype\n * @param {PModel.Node} pnode\n * @param {BindingMetadata} meta\n * @return {{ foundMappedChild: boolean, equalityFactor: number }}\n */\nconst computeChildEqualityFactor = (ytype, pnode, meta) => {\n  const yChildren = ytype.toArray();\n  const pChildren = normalizePNodeContent(pnode);\n  const pChildCnt = pChildren.length;\n  const yChildCnt = yChildren.length;\n  const minCnt = math.min(yChildCnt, pChildCnt);\n  let left = 0;\n  let right = 0;\n  let foundMappedChild = false;\n  for (; left < minCnt; left++) {\n    const leftY = yChildren[left];\n    const leftP = pChildren[left];\n    if (mappedIdentity(meta.mapping.get(leftY), leftP)) {\n      foundMappedChild = true; // definite (good) match!\n    } else if (!equalYTypePNode(leftY, leftP)) {\n      break\n    }\n  }\n  for (; left + right < minCnt; right++) {\n    const rightY = yChildren[yChildCnt - right - 1];\n    const rightP = pChildren[pChildCnt - right - 1];\n    if (mappedIdentity(meta.mapping.get(rightY), rightP)) {\n      foundMappedChild = true;\n    } else if (!equalYTypePNode(rightY, rightP)) {\n      break\n    }\n  }\n  return {\n    equalityFactor: left + right,\n    foundMappedChild\n  }\n};\n\n/**\n * @param {Y.Text} ytext\n */\nconst ytextTrans = (ytext) => {\n  let str = '';\n  /**\n   * @type {Y.Item|null}\n   */\n  let n = ytext._start;\n  const nAttrs = {};\n  while (n !== null) {\n    if (!n.deleted) {\n      if (n.countable && n.content instanceof Y.ContentString) {\n        str += n.content.str;\n      } else if (n.content instanceof Y.ContentFormat) {\n        nAttrs[n.content.key] = null;\n      }\n    }\n    n = n.right;\n  }\n  return {\n    str,\n    nAttrs\n  }\n};\n\n/**\n * @todo test this more\n *\n * @param {Y.Text} ytext\n * @param {Array<any>} ptexts\n * @param {BindingMetadata} meta\n */\nconst updateYText = (ytext, ptexts, meta) => {\n  meta.mapping.set(ytext, ptexts);\n  const { nAttrs, str } = ytextTrans(ytext);\n  const content = ptexts.map((p) => ({\n    insert: /** @type {any} */ (p).text,\n    attributes: Object.assign({}, nAttrs, marksToAttributes(p.marks, meta))\n  }));\n  const { insert, remove, index } = simpleDiff(\n    str,\n    content.map((c) => c.insert).join('')\n  );\n  ytext.delete(index, remove);\n  ytext.insert(index, insert);\n  ytext.applyDelta(\n    content.map((c) => ({ retain: c.insert.length, attributes: c.attributes }))\n  );\n};\n\nconst hashedMarkNameRegex = /(.*)(--[a-zA-Z0-9+/=]{8})$/;\n/**\n * @param {string} attrName\n */\nconst yattr2markname = attrName => hashedMarkNameRegex.exec(attrName)?.[1] ?? attrName;\n\n/**\n * @todo move this to markstoattributes\n *\n * @param {Object<string, any>} attrs\n * @param {import('prosemirror-model').Schema} schema\n */\nconst attributesToMarks = (attrs, schema) => {\n  /**\n   * @type {Array<import('prosemirror-model').Mark>}\n   */\n  const marks = [];\n  for (const markName in attrs) {\n    // remove hashes if necessary\n    marks.push(schema.mark(yattr2markname(markName), attrs[markName]));\n  }\n  return marks\n};\n\n/**\n * @param {Array<import('prosemirror-model').Mark>} marks\n * @param {BindingMetadata} meta\n */\nconst marksToAttributes = (marks, meta) => {\n  const pattrs = {};\n  marks.forEach((mark) => {\n    if (mark.type.name !== 'ychange') {\n      const isOverlapping = map.setIfUndefined(meta.isOMark, mark.type, () => !mark.type.excludes(mark.type));\n      pattrs[isOverlapping ? `${mark.type.name}--${hashOfJSON(mark.toJSON())}` : mark.type.name] = mark.attrs;\n    }\n  });\n  return pattrs\n};\n\n/**\n * Update a yDom node by syncing the current content of the prosemirror node.\n *\n * This is a y-prosemirror internal feature that you can use at your own risk.\n *\n * @private\n * @unstable\n *\n * @param {{transact: Function}} y\n * @param {Y.XmlFragment} yDomFragment\n * @param {any} pNode\n * @param {BindingMetadata} meta\n */\nconst updateYFragment = (y, yDomFragment, pNode, meta) => {\n  if (\n    yDomFragment instanceof Y.XmlElement &&\n    yDomFragment.nodeName !== pNode.type.name\n  ) {\n    throw new Error('node name mismatch!')\n  }\n  meta.mapping.set(yDomFragment, pNode);\n  // update attributes\n  if (yDomFragment instanceof Y.XmlElement) {\n    const yDomAttrs = yDomFragment.getAttributes();\n    const pAttrs = pNode.attrs;\n    for (const key in pAttrs) {\n      if (pAttrs[key] !== null) {\n        if (yDomAttrs[key] !== pAttrs[key] && key !== 'ychange') {\n          yDomFragment.setAttribute(key, pAttrs[key]);\n        }\n      } else {\n        yDomFragment.removeAttribute(key);\n      }\n    }\n    // remove all keys that are no longer in pAttrs\n    for (const key in yDomAttrs) {\n      if (pAttrs[key] === undefined) {\n        yDomFragment.removeAttribute(key);\n      }\n    }\n  }\n  // update children\n  const pChildren = normalizePNodeContent(pNode);\n  const pChildCnt = pChildren.length;\n  const yChildren = yDomFragment.toArray();\n  const yChildCnt = yChildren.length;\n  const minCnt = math.min(pChildCnt, yChildCnt);\n  if (reconcileMappedChildren(y, yDomFragment, pChildren, yChildren, meta)) {\n    return\n  }\n  let left = 0;\n  let right = 0;\n  // find number of matching elements from left\n  for (; left < minCnt; left++) {\n    const leftY = yChildren[left];\n    const leftP = pChildren[left];\n    if (!mappedIdentity(meta.mapping.get(leftY), leftP)) {\n      if (equalYTypePNode(leftY, leftP)) {\n        // update mapping\n        meta.mapping.set(leftY, leftP);\n      } else {\n        break\n      }\n    }\n  }\n  // find number of matching elements from right\n  for (; right + left + 1 < minCnt; right++) {\n    const rightY = yChildren[yChildCnt - right - 1];\n    const rightP = pChildren[pChildCnt - right - 1];\n    if (!mappedIdentity(meta.mapping.get(rightY), rightP)) {\n      if (equalYTypePNode(rightY, rightP)) {\n        // update mapping\n        meta.mapping.set(rightY, rightP);\n      } else {\n        break\n      }\n    }\n  }\n  y.transact(() => {\n    // try to compare and update\n    while (yChildCnt - left - right > 0 && pChildCnt - left - right > 0) {\n      const leftY = yChildren[left];\n      const leftP = pChildren[left];\n      const rightY = yChildren[yChildCnt - right - 1];\n      const rightP = pChildren[pChildCnt - right - 1];\n      if (leftY instanceof Y.XmlText && leftP instanceof Array) {\n        if (!equalYTextPText(leftY, leftP)) {\n          updateYText(leftY, leftP, meta);\n        }\n        left += 1;\n      } else {\n        let updateLeft = leftY instanceof Y.XmlElement &&\n          matchNodeName(leftY, leftP);\n        let updateRight = rightY instanceof Y.XmlElement &&\n          matchNodeName(rightY, rightP);\n        if (updateLeft && updateRight) {\n          // decide which which element to update\n          const equalityLeft = computeChildEqualityFactor(\n            /** @type {Y.XmlElement} */ (leftY),\n            /** @type {PModel.Node} */ (leftP),\n            meta\n          );\n          const equalityRight = computeChildEqualityFactor(\n            /** @type {Y.XmlElement} */ (rightY),\n            /** @type {PModel.Node} */ (rightP),\n            meta\n          );\n          if (\n            equalityLeft.foundMappedChild && !equalityRight.foundMappedChild\n          ) {\n            updateRight = false;\n          } else if (\n            !equalityLeft.foundMappedChild && equalityRight.foundMappedChild\n          ) {\n            updateLeft = false;\n          } else if (\n            equalityLeft.equalityFactor < equalityRight.equalityFactor\n          ) {\n            updateLeft = false;\n          } else {\n            updateRight = false;\n          }\n        }\n        if (updateLeft) {\n          updateYFragment(\n            y,\n            /** @type {Y.XmlFragment} */ (leftY),\n            /** @type {PModel.Node} */ (leftP),\n            meta\n          );\n          left += 1;\n        } else if (updateRight) {\n          updateYFragment(\n            y,\n            /** @type {Y.XmlFragment} */ (rightY),\n            /** @type {PModel.Node} */ (rightP),\n            meta\n          );\n          right += 1;\n        } else {\n          meta.mapping.delete(yDomFragment.get(left));\n          yDomFragment.delete(left, 1);\n          yDomFragment.insert(left, [\n            createTypeFromTextOrElementNode(leftP, meta)\n          ]);\n          left += 1;\n        }\n      }\n    }\n    const yDelLen = yChildCnt - left - right;\n    if (\n      yChildCnt === 1 && pChildCnt === 0 && yChildren[0] instanceof Y.XmlText\n    ) {\n      meta.mapping.delete(yChildren[0]);\n      // Edge case handling https://github.com/yjs/y-prosemirror/issues/108\n      // Only delete the content of the Y.Text to retain remote changes on the same Y.Text object\n      yChildren[0].delete(0, yChildren[0].length);\n    } else if (yDelLen > 0) {\n      yDomFragment.slice(left, left + yDelLen).forEach(type => meta.mapping.delete(type));\n      yDomFragment.delete(left, yDelLen);\n    }\n    if (left + right < pChildCnt) {\n      const ins = [];\n      for (let i = left; i < pChildCnt - right; i++) {\n        ins.push(createTypeFromTextOrElementNode(pChildren[i], meta));\n      }\n      yDomFragment.insert(left, ins);\n    }\n  }, ySyncPluginKey);\n};\n\n/**\n * @function\n * @param {Y.XmlElement} yElement\n * @param {any} pNode Prosemirror Node\n */\nconst matchNodeName = (yElement, pNode) =>\n  !(pNode instanceof Array) && yElement.nodeName === pNode.type.name;\n\n/**\n * Either a node if type is YXmlElement or an Array of text nodes if YXmlText\n * @typedef {Map<Y.AbstractType, Node | Array<Node>>} ProsemirrorMapping\n */\n\n/**\n * Is null if no timeout is in progress.\n * Is defined if a timeout is in progress.\n * Maps from view\n * @type {Map<EditorView, Map<any, any>>|null}\n */\nlet viewsToUpdate = null;\n\nclass MetaEntry {\n  /**\n   * @param {EditorView} view\n   * @param {any} key\n   * @param {any} value\n   */\n  constructor (view, key, value) {\n    this.view = view;\n    this.key = key;\n    this.value = value;\n  }\n\n  apply () {\n    const syncState = ySyncPluginKey.getState(this.view.state);\n    if (syncState && syncState.binding && !syncState.binding.isDestroyed) {\n      const tr = this.view.state.tr;\n      tr.setMeta(this.key, this.value);\n      this.view.dispatch(tr);\n    }\n  }\n}\n\nclass MetaEntriesQueue {\n  /**\n   * @param {Array<MetaEntry>} [entries=[]]\n   */\n  constructor (entries = []) {\n    this.entries = entries;\n  }\n\n  /**\n   * @return {MetaEntry|undefined}\n   */\n  getFirst () {\n    return this.entries[0]\n  }\n\n  /**\n   * @return {MetaEntry|undefined}\n   */\n  dequeueFirst () {\n    return this.entries.shift()\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isEmpty () {\n    return this.entries.length === 0\n  }\n\n  static fromViewsToUpdate () {\n    const ups = /** @type {Map<EditorView, Map<any, any>>} */ (viewsToUpdate);\n    viewsToUpdate = null;\n    const entries = [];\n    ups.forEach((metas, view) => {\n      metas.forEach((value, key) => {\n        entries.push(new MetaEntry(view, key, value));\n      });\n    });\n    return new MetaEntriesQueue(entries)\n  }\n}\n\n/**\n * Dispatch queued plugin metadata in order, retrying only the remaining\n * entries if a transaction becomes stale while the async queue is flushing.\n *\n * Cursor awareness updates are decoration-only refreshes. If a real document\n * transaction lands before one of these queued meta transactions is applied,\n * ProseMirror can reject it with a RangeError. In that case we reschedule the\n * remaining entries on the next tick. If the first remaining entry fails again\n * on retry, we drop that entry and continue with the rest of the queue instead\n * of retrying forever or crashing the editor.\n *\n * @param {MetaEntriesQueue} [metaEntries=MetaEntriesQueue.fromViewsToUpdate()]\n * @param {boolean} [isRetry=false]\n */\nconst updateMetas = (metaEntries = MetaEntriesQueue.fromViewsToUpdate(), isRetry = false) => {\n  let isFirst = true;\n  while (!metaEntries.isEmpty()) {\n    const metaEntry = metaEntries.getFirst();\n    try {\n      metaEntry.apply();\n    } catch (err) {\n      // ProseMirror throws a RangeError when this transaction was created from\n      // an older state and another transaction changed the document before this\n      // meta-only dispatch was applied (\"Applying a mismatched transaction\").\n      if (err instanceof RangeError) {\n        if (isRetry && isFirst) {\n          // Drop the repeatedly stale entry so the queue can continue flushing.\n          metaEntries.dequeueFirst();\n        }\n        if (!metaEntries.isEmpty()) {\n          eventloop.timeout(0, () => updateMetas(metaEntries, true));\n        }\n        return\n      }\n      throw err\n    }\n    isFirst = false;\n    metaEntries.dequeueFirst();\n  }\n};\n\nconst setMeta = (view, key, value) => {\n  if (!viewsToUpdate) {\n    viewsToUpdate = new Map();\n    // Awareness listeners can fire in bursts, so batch them into one tick.\n    eventloop.timeout(0, updateMetas);\n  }\n  map.setIfUndefined(viewsToUpdate, view, map.create).set(key, value);\n};\n\n/**\n * Transforms a Prosemirror based absolute position to a Yjs Cursor (relative position in the Yjs model).\n *\n * @param {number} pos\n * @param {Y.XmlFragment} type\n * @param {ProsemirrorMapping} mapping\n * @return {any} relative position\n */\nconst absolutePositionToRelativePosition = (pos, type, mapping) => {\n  if (pos === 0) {\n    return Y.createRelativePositionFromTypeIndex(type, 0, -1)\n  }\n  /**\n   * @type {any}\n   */\n  let n = type._first === null ? null : /** @type {Y.ContentType} */ (type._first.content).type;\n  while (n !== null && type !== n) {\n    if (n instanceof Y.XmlText) {\n      if (n._length >= pos) {\n        return Y.createRelativePositionFromTypeIndex(n, pos, -1)\n      } else {\n        pos -= n._length;\n      }\n      if (n._item !== null && n._item.next !== null) {\n        n = /** @type {Y.ContentType} */ (n._item.next.content).type;\n      } else {\n        do {\n          n = n._item === null ? null : n._item.parent;\n          pos--;\n        } while (n !== type && n !== null && n._item !== null && n._item.next === null)\n        if (n !== null && n !== type) {\n          // @ts-gnore we know that n.next !== null because of above loop conditition\n          n = n._item === null ? null : /** @type {Y.ContentType} */ (/** @type Y.Item */ (n._item.next).content).type;\n        }\n      }\n    } else {\n      const pNodeSize = /** @type {any} */ (mapping.get(n) || { nodeSize: 0 }).nodeSize;\n      if (n._first !== null && pos < pNodeSize) {\n        n = /** @type {Y.ContentType} */ (n._first.content).type;\n        pos--;\n      } else {\n        if (pos === 1 && n._length === 0 && pNodeSize > 1) {\n          // edge case, should end in this paragraph\n          return new Y.RelativePosition(n._item === null ? null : n._item.id, n._item === null ? Y.findRootTypeKey(n) : null, null)\n        }\n        pos -= pNodeSize;\n        if (n._item !== null && n._item.next !== null) {\n          n = /** @type {Y.ContentType} */ (n._item.next.content).type;\n        } else {\n          if (pos === 0) {\n            // set to end of n.parent\n            n = n._item === null ? n : n._item.parent;\n            return new Y.RelativePosition(n._item === null ? null : n._item.id, n._item === null ? Y.findRootTypeKey(n) : null, null)\n          }\n          do {\n            n = /** @type {Y.Item} */ (n._item).parent;\n            pos--;\n          } while (n !== type && /** @type {Y.Item} */ (n._item).next === null)\n          // if n is null at this point, we have an unexpected case\n          if (n !== type) {\n            // We know that n._item.next is defined because of above loop condition\n            n = /** @type {Y.ContentType} */ (/** @type {Y.Item} */ (/** @type {Y.Item} */ (n._item).next).content).type;\n          }\n        }\n      }\n    }\n    if (n === null) {\n      throw error.unexpectedCase()\n    }\n    if (pos === 0 && n.constructor !== Y.XmlText && n !== type) { // TODO: set to <= 0\n      return createRelativePosition(n._item.parent, n._item)\n    }\n  }\n  return Y.createRelativePositionFromTypeIndex(type, type._length, -1)\n};\n\n/**\n * Item-id based relative positions can misresolve to the document start after\n * block reorder during collaborative drag-and-drop.\n *\n * @param {Y.Doc} y\n * @param {Y.RelativePosition} relPos\n * @param {number|null} absPos\n * @return {boolean}\n */\nconst isMisresolvedTextPosition = (y, relPos, absPos) => {\n  if (absPos === null) {\n    return false\n  }\n  const decoded = Y.createAbsolutePositionFromRelativePosition(relPos, y);\n  return decoded !== null &&\n    decoded.type instanceof Y.XmlText &&\n    relPos.item !== null &&\n    absPos <= 1\n};\n\nconst createRelativePosition = (type, item) => {\n  let typeid = null;\n  let tname = null;\n  if (type._item === null) {\n    tname = Y.findRootTypeKey(type);\n  } else {\n    typeid = Y.createID(type._item.id.client, type._item.id.clock);\n  }\n  return new Y.RelativePosition(typeid, tname, item.id)\n};\n\n/**\n * @param {Y.Doc} y\n * @param {Y.XmlFragment} documentType Top level type that is bound to pView\n * @param {any} relPos Encoded Yjs based relative position\n * @param {ProsemirrorMapping} mapping\n * @return {null|number}\n */\nconst relativePositionToAbsolutePosition = (y, documentType, relPos, mapping) => {\n  const decodedPos = Y.createAbsolutePositionFromRelativePosition(relPos, y);\n  if (decodedPos === null || (decodedPos.type !== documentType && !Y.isParentOf(documentType, decodedPos.type._item))) {\n    return null\n  }\n  let type = decodedPos.type;\n  let pos = 0;\n  if (type.constructor === Y.XmlText) {\n    pos = decodedPos.index;\n  } else if (type._item === null || !type._item.deleted) {\n    let n = type._first;\n    let i = 0;\n    while (i < type._length && i < decodedPos.index && n !== null) {\n      if (!n.deleted) {\n        const t = /** @type {Y.ContentType} */ (n.content).type;\n        i++;\n        if (t instanceof Y.XmlText) {\n          pos += t._length;\n        } else {\n          const mapped = mapping.get(t);\n          if (mapped == null) {\n            return null\n          }\n          pos += /** @type {any} */ (mapped).nodeSize;\n        }\n      }\n      n = /** @type {Y.Item} */ (n.right);\n    }\n    pos += 1; // increase because we go out of n\n  }\n  while (type !== documentType && type._item !== null) {\n    // @ts-ignore\n    const parent = type._item.parent;\n    // @ts-ignore\n    if (parent._item === null || !parent._item.deleted) {\n      pos += 1; // the start tag\n      let n = /** @type {Y.AbstractType} */ (parent)._first;\n      // now iterate until we found type\n      while (n !== null) {\n        const contentType = /** @type {Y.ContentType} */ (n.content).type;\n        if (contentType === type) {\n          break\n        }\n        if (!n.deleted) {\n          if (contentType instanceof Y.XmlText) {\n            pos += contentType._length;\n          } else {\n            const mapped = mapping.get(contentType);\n            if (mapped == null) {\n              return null\n            }\n            pos += /** @type {any} */ (mapped).nodeSize;\n          }\n        }\n        n = n.right;\n      }\n    }\n    type = /** @type {Y.AbstractType} */ (parent);\n  }\n  const absPos = pos - 1; // we don't count the most outer tag, because it is a fragment\n  if (isMisresolvedTextPosition(y, relPos, absPos)) {\n    return null\n  }\n  return absPos\n};\n\n/**\n * Shallow attrs comparison. Attr values are primitives in most schemas;\n * non-primitive values fail the check and callers fall back to text matching.\n *\n * @param {Object<string, any>} a\n * @param {Object<string, any>} b\n * @return {boolean}\n */\nconst attrsEqual = (a, b) => {\n  if (a === b) {\n    return true\n  }\n  const aKeys = Object.keys(a);\n  return aKeys.length === Object.keys(b).length && aKeys.every((k) => a[k] === b[k])\n};\n\n/**\n * Returns true when any attr deviates from its spec default or has none.\n * Default-only attrs cannot tell same-type siblings apart.\n *\n * @param {import('prosemirror-model').Node} node\n * @return {boolean}\n */\nconst hasDistinctiveAttrs = (node) => {\n  const specAttrs = node.type.spec.attrs || {};\n  return Object.keys(node.attrs).some((key) => {\n    const spec = specAttrs[key];\n    return spec == null ||\n      !Object.prototype.hasOwnProperty.call(spec, 'default') ||\n      spec.default !== node.attrs[key]\n  })\n};\n\n/**\n * Remaps a position into a matched block by walking the same child-index path\n * it had in the old block. A raw byte offset would overshoot into a sibling\n * inner textblock when the old block contains local keystrokes that are not\n * yet part of the rebuilt document.\n *\n * @param {import('prosemirror-model').ResolvedPos} $oldPos\n * @param {number} newBlockStart\n * @param {import('prosemirror-model').Node} newBlock\n * @return {number|null}\n */\nconst remapIntoBlock = ($oldPos, newBlockStart, newBlock) => {\n  let pos = newBlockStart + 1;\n  let node = newBlock;\n  for (let depth = 1; depth < $oldPos.depth; depth++) {\n    const idx = $oldPos.index(depth);\n    if (idx >= node.childCount) {\n      return null\n    }\n    for (let i = 0; i < idx; i++) {\n      pos += node.child(i).nodeSize;\n    }\n    pos += 1;\n    node = node.child(idx);\n    if (node.type !== $oldPos.node(depth + 1).type) {\n      return null\n    }\n  }\n  if (!node.isTextblock) {\n    return null\n  }\n  return pos + Math.min($oldPos.parentOffset, node.content.size)\n};\n\n/**\n * @param {import('prosemirror-model').Node} oldDoc\n * @param {import('prosemirror-model').Node} newDoc\n * @param {number} absPos\n * @return {number|null}\n */\nconst findAbsolutePositionAfterStructuralChange = (oldDoc, newDoc, absPos) => {\n  let pos = 0;\n  let targetIdx = 0;\n  for (; targetIdx < oldDoc.childCount; targetIdx++) {\n    const child = oldDoc.child(targetIdx);\n    if (pos + child.nodeSize > absPos) {\n      break\n    }\n    pos += child.nodeSize;\n  }\n  if (targetIdx >= oldDoc.childCount) {\n    return null\n  }\n  const targetChild = oldDoc.child(targetIdx);\n  const $oldPos = oldDoc.resolve(absPos);\n\n  /**\n   * @param {number} newBlockStart\n   * @param {import('prosemirror-model').Node} newBlock\n   * @return {number|null}\n   */\n  const place = (newBlockStart, newBlock) => {\n    // Positions between top-level blocks carry no inner path; clamp them just\n    // inside the matched block like the previous raw-offset remap did.\n    if ($oldPos.depth === 0) {\n      const remapped = newBlockStart + (absPos - pos);\n      const contentStart = newBlockStart + 1;\n      const contentEnd = newBlockStart + newBlock.nodeSize - 1;\n      return Math.max(contentStart, Math.min(remapped, contentEnd))\n    }\n    return remapIntoBlock($oldPos, newBlockStart, newBlock)\n  };\n\n  /**\n   * Finds the Nth block in newDoc matching `pred`, where N is the number of\n   * matching blocks in oldDoc up to and including the target block.\n   *\n   * @param {function(import('prosemirror-model').Node): boolean} pred\n   * @param {boolean} requireUnique\n   * @return {number|null}\n   */\n  const findByPredicate = (pred, requireUnique = false) => {\n    let occurrence = 0;\n    for (let i = 0; i <= targetIdx; i++) {\n      if (pred(oldDoc.child(i))) {\n        occurrence++;\n      }\n    }\n    let matchCount = 0;\n    let matchStart = -1;\n    let matchBlock = null;\n    let newPos = 0;\n    for (let i = 0; i < newDoc.childCount; i++) {\n      const child = newDoc.child(i);\n      if (pred(child)) {\n        matchCount++;\n        if (matchCount === occurrence) {\n          matchStart = newPos;\n          matchBlock = child;\n        }\n      }\n      newPos += child.nodeSize;\n    }\n    if (matchBlock === null || (requireUnique && (occurrence !== 1 || matchCount !== 1))) {\n      return null\n    }\n    return place(matchStart, matchBlock)\n  };\n\n  /**\n   * @param {import('prosemirror-model').Node} child\n   * @return {boolean}\n   */\n  const sameTypeAndAttrs = (child) =>\n    child.type === targetChild.type && attrsEqual(child.attrs, targetChild.attrs);\n  const oldText = targetChild.textContent;\n\n  const byAll = findByPredicate((child) => sameTypeAndAttrs(child) && child.textContent === oldText);\n  if (byAll !== null) {\n    return byAll\n  }\n\n  // Text must be matched before attrs: after a remote attr-only edit, the\n  // attrs pass would steer the cursor into a sibling that kept the old attrs.\n  const byText = findByPredicate(\n    (child) => child.type === targetChild.type && child.textContent === oldText\n  );\n  if (byText !== null) {\n    return byText\n  }\n\n  // In-flight local typing diverges the text between both docs. Distinctive\n  // attrs still identify the block; default-only attrs match every sibling.\n  if (hasDistinctiveAttrs(targetChild)) {\n    const byAttrs = findByPredicate(sameTypeAndAttrs, true);\n    if (byAttrs !== null) {\n      return byAttrs\n    }\n  }\n\n  // Trailing in-flight keystrokes leave a prefix relation between old and new\n  // text. Empty text is a prefix of everything and must never match.\n  return findByPredicate(\n    (child) => sameTypeAndAttrs(child) &&\n      oldText !== '' && child.textContent !== '' &&\n      (oldText.startsWith(child.textContent) || child.textContent.startsWith(oldText)),\n    true\n  )\n};\n\n/**\n * Returns true when a transaction changes block structure rather than only\n * editing inline content inside existing blocks.\n *\n * @param {import('prosemirror-state').Transaction} tr\n * @param {import('prosemirror-model').Node} oldDoc\n * @return {boolean}\n */\nconst isStructuralTransaction = (tr, oldDoc) => {\n  if (!tr.docChanged) {\n    return false\n  }\n  if (tr.doc.childCount !== oldDoc.childCount) {\n    return true\n  }\n  for (const step of tr.steps) {\n    if (step instanceof ReplaceStep) {\n      if (step.from === 0 && step.to === oldDoc.content.size) {\n        return true\n      }\n      if (step.slice.content.size > 0) {\n        let hasBlock = false;\n        step.slice.content.forEach((node) => {\n          if (node.isBlock) {\n            hasBlock = true;\n          }\n        });\n        if (hasBlock) {\n          return true\n        }\n      } else if (step.to > step.from) {\n        const $from = oldDoc.resolve(step.from);\n        const $to = oldDoc.resolve(step.to);\n        if ($from.depth === 0 && $to.depth === 0 && $from.index() !== $to.index()) {\n          return true\n        }\n      }\n    }\n  }\n  return false\n};\n\n/**\n * Detect stale relative positions after structural changes that resolve to the\n * wrong text block or to the start of the correct block.\n *\n * @param {import('prosemirror-model').Node} oldDoc\n * @param {import('prosemirror-model').Node} newDoc\n * @param {number} oldAbs\n * @param {number|null} resolvedAbs\n * @return {boolean}\n */\nconst isMisresolvedAfterStructuralChange = (oldDoc, newDoc, oldAbs, resolvedAbs) => {\n  if (resolvedAbs === null) {\n    return false\n  }\n  const $old = oldDoc.resolve(oldAbs);\n  const $new = newDoc.resolve(resolvedAbs);\n  if (!$old.parent.isTextblock) {\n    return false\n  }\n  // A textblock cursor cannot legitimately resolve into a non-textblock;\n  // a structural reorder replaced the block via delete + insert.\n  if (!$new.parent.isTextblock) {\n    return true\n  }\n  if ($old.parent.textContent !== $new.parent.textContent) {\n    return true\n  }\n  if ($old.parentOffset !== 0 && $new.parentOffset === 0) {\n    return true\n  }\n  const bothAtStart = $old.parentOffset === 0 && $new.parentOffset === 0;\n  // A changed offset, type or attrs hints at a same-text sibling. When all\n  // of them agree there is no signal left and the Yjs resolution must win.\n  const suspicious = $old.parentOffset !== $new.parentOffset ||\n    $old.parent.type !== $new.parent.type ||\n    !attrsEqual($old.parent.attrs, $new.parent.attrs);\n  if (bothAtStart || suspicious) {\n    const expected = findAbsolutePositionAfterStructuralChange(oldDoc, newDoc, oldAbs);\n    return expected !== null && expected !== resolvedAbs\n  }\n  return false\n};\n\n/**\n * Utility function for converting an Y.Fragment to a ProseMirror fragment.\n *\n * @param {Y.XmlFragment} yXmlFragment\n * @param {Schema} schema\n */\nconst yXmlFragmentToProseMirrorFragment = (yXmlFragment, schema) => {\n  const fragmentContent = yXmlFragment.toArray().map((t) =>\n    createNodeFromYElement(\n      /** @type {Y.XmlElement} */ (t),\n      schema,\n      createEmptyMeta()\n    )\n  ).filter((n) => n !== null);\n  return Fragment.fromArray(fragmentContent)\n};\n\n/**\n * Utility function for converting an Y.Fragment to a ProseMirror node.\n *\n * @param {Y.XmlFragment} yXmlFragment\n * @param {Schema} schema\n */\nconst yXmlFragmentToProseMirrorRootNode = (yXmlFragment, schema) =>\n  schema.topNodeType.create(null, yXmlFragmentToProseMirrorFragment(yXmlFragment, schema));\n\n/**\n * The initial ProseMirror content should be supplied by Yjs. This function transforms a Y.Fragment\n * to a ProseMirror Doc node and creates a mapping that is used by the sync plugin.\n *\n * @param {Y.XmlFragment} yXmlFragment\n * @param {Schema} schema\n *\n * @todo deprecate mapping property\n */\nconst initProseMirrorDoc = (yXmlFragment, schema) => {\n  const meta = createEmptyMeta();\n  const fragmentContent = yXmlFragment.toArray().map((t) =>\n    createNodeFromYElement(\n      /** @type {Y.XmlElement} */ (t),\n      schema,\n      meta\n    )\n  ).filter((n) => n !== null);\n  const doc = schema.topNodeType.create(null, Fragment.fromArray(fragmentContent));\n  return { doc, meta, mapping: meta.mapping }\n};\n\n/**\n * Utility method to convert a Prosemirror Doc Node into a Y.Doc.\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * @param {Node} doc\n * @param {string} xmlFragment\n * @return {Y.Doc}\n */\nfunction prosemirrorToYDoc (doc, xmlFragment = 'prosemirror') {\n  const ydoc = new Y.Doc();\n  const type = /** @type {Y.XmlFragment} */ (ydoc.get(xmlFragment, Y.XmlFragment));\n  if (!type.doc) {\n    return ydoc\n  }\n\n  prosemirrorToYXmlFragment(doc, type);\n  return type.doc\n}\n\n/**\n * Utility method to update an empty Y.XmlFragment with content from a Prosemirror Doc Node.\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * Note: The Y.XmlFragment does not need to be part of a Y.Doc document at the time that this\n * method is called, but it must be added before any other operations are performed on it.\n *\n * @param {Node} doc prosemirror document.\n * @param {Y.XmlFragment} [xmlFragment] If supplied, an xml fragment to be\n *   populated from the prosemirror state; otherwise a new XmlFragment will be created.\n * @return {Y.XmlFragment}\n */\nfunction prosemirrorToYXmlFragment (doc, xmlFragment) {\n  const type = xmlFragment || new Y.XmlFragment();\n  const ydoc = type.doc ? type.doc : { transact: (transaction) => transaction(undefined) };\n  updateYFragment(ydoc, type, doc, { mapping: new Map(), isOMark: new Map() });\n  return type\n}\n\n/**\n * Utility method to convert Prosemirror compatible JSON into a Y.Doc.\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * @param {Schema} schema\n * @param {any} state\n * @param {string} xmlFragment\n * @return {Y.Doc}\n */\nfunction prosemirrorJSONToYDoc (schema, state, xmlFragment = 'prosemirror') {\n  const doc = Node.fromJSON(schema, state);\n  return prosemirrorToYDoc(doc, xmlFragment)\n}\n\n/**\n * Utility method to convert Prosemirror compatible JSON to a Y.XmlFragment\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * @param {Schema} schema\n * @param {any} state\n * @param {Y.XmlFragment} [xmlFragment] If supplied, an xml fragment to be\n *   populated from the prosemirror state; otherwise a new XmlFragment will be created.\n * @return {Y.XmlFragment}\n */\nfunction prosemirrorJSONToYXmlFragment (schema, state, xmlFragment) {\n  const doc = Node.fromJSON(schema, state);\n  return prosemirrorToYXmlFragment(doc, xmlFragment)\n}\n\n/**\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.Doc to a Prosemirror Doc node.\n *\n * @param {Schema} schema\n * @param {Y.Doc} ydoc\n * @return {Node}\n */\nfunction yDocToProsemirror (schema, ydoc) {\n  const state = yDocToProsemirrorJSON(ydoc);\n  return Node.fromJSON(schema, state)\n}\n\n/**\n *\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.XmlFragment to a Prosemirror Doc node.\n *\n * @param {Schema} schema\n * @param {Y.XmlFragment} xmlFragment\n * @return {Node}\n */\nfunction yXmlFragmentToProsemirror (schema, xmlFragment) {\n  const state = yXmlFragmentToProsemirrorJSON(xmlFragment);\n  return Node.fromJSON(schema, state)\n}\n\n/**\n *\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.Doc to Prosemirror compatible JSON.\n *\n * @param {Y.Doc} ydoc\n * @param {string} xmlFragment\n * @return {Record<string, any>}\n */\nfunction yDocToProsemirrorJSON (\n  ydoc,\n  xmlFragment = 'prosemirror'\n) {\n  return yXmlFragmentToProsemirrorJSON(ydoc.getXmlFragment(xmlFragment))\n}\n\n/**\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.Doc to Prosemirror compatible JSON.\n *\n * @param {Y.XmlFragment} xmlFragment The fragment, which must be part of a Y.Doc.\n * @return {Record<string, any>}\n */\nfunction yXmlFragmentToProsemirrorJSON (xmlFragment) {\n  const items = xmlFragment.toArray();\n\n  /**\n   * @param {Y.AbstractType} item\n   */\n  const serialize = item => {\n    /**\n     * @type {Object} NodeObject\n     * @property {string} NodeObject.type\n     * @property {Record<string, string>=} NodeObject.attrs\n     * @property {Array<NodeObject>=} NodeObject.content\n     */\n    let response;\n\n    // TODO: Must be a better way to detect text nodes than this\n    if (item instanceof Y.XmlText) {\n      const delta = item.toDelta();\n      response = delta.map(/** @param {any} d */ (d) => {\n        const text = {\n          type: 'text',\n          text: d.insert\n        };\n        if (d.attributes) {\n          text.marks = Object.keys(d.attributes).map((type_) => {\n            const attrs = d.attributes[type_];\n            const type = yattr2markname(type_);\n            const mark = {\n              type\n            };\n            if (Object.keys(attrs)) {\n              mark.attrs = attrs;\n            }\n            return mark\n          });\n        }\n        return text\n      });\n    } else if (item instanceof Y.XmlElement) {\n      response = {\n        type: item.nodeName\n      };\n\n      const attrs = item.getAttributes();\n      if (Object.keys(attrs).length) {\n        response.attrs = attrs;\n      }\n\n      const children = item.toArray();\n      if (children.length) {\n        response.content = children.map(serialize).flat();\n      }\n    } else {\n      // expected either Y.XmlElement or Y.XmlText\n      error.unexpectedCase();\n    }\n\n    return response\n  };\n\n  return {\n    type: 'doc',\n    content: items.map(serialize)\n  }\n}\n\n/**\n * Default awareness state filter\n *\n * @param {number} currentClientId current client id\n * @param {number} userClientId user client id\n * @param {any} _user user data\n * @return {boolean}\n */\nconst defaultAwarenessStateFilter = (\n  currentClientId,\n  userClientId,\n  _user\n) => currentClientId !== userClientId;\n\n/**\n * Default generator for a cursor element\n *\n * @param {any} user user data\n * @return {HTMLElement}\n */\nconst defaultCursorBuilder = (user) => {\n  const cursor = document.createElement('span');\n  cursor.classList.add('ProseMirror-yjs-cursor');\n  cursor.setAttribute('style', `border-color: ${user.color}`);\n  const userDiv = document.createElement('div');\n  userDiv.setAttribute('style', `background-color: ${user.color}`);\n  userDiv.insertBefore(document.createTextNode(user.name), null);\n  const nonbreakingSpace1 = document.createTextNode('\\u2060');\n  const nonbreakingSpace2 = document.createTextNode('\\u2060');\n  cursor.insertBefore(nonbreakingSpace1, null);\n  cursor.insertBefore(userDiv, null);\n  cursor.insertBefore(nonbreakingSpace2, null);\n  return cursor\n};\n\n/**\n * Default generator for the selection attributes\n *\n * @param {any} user user data\n * @return {import('prosemirror-view').DecorationAttrs}\n */\nconst defaultSelectionBuilder = (user) => {\n  return {\n    style: `background-color: ${user.color}70`,\n    class: 'ProseMirror-yjs-selection'\n  }\n};\n\nconst rxValidColor = /^#[0-9a-fA-F]{6}$/;\n\n/**\n * @param {any} state\n * @param {Awareness} awareness\n * @param {function(number, number, any):boolean} awarenessFilter\n * @param {(user: { name: string, color: string }, clientId: number) => Element} createCursor\n * @param {(user: { name: string, color: string }, clientId: number) => import('prosemirror-view').DecorationAttrs} createSelection\n * @return {any} DecorationSet\n */\nconst createDecorations = (\n  state,\n  awareness,\n  awarenessFilter,\n  createCursor,\n  createSelection\n) => {\n  const ystate = ySyncPluginKey.getState(state);\n  if (ystate == null || ystate.doc == null || ystate.binding == null) {\n    return DecorationSet.create(state.doc, [])\n  }\n  const y = ystate.doc;\n  const decorations = [];\n  if (\n    ystate.snapshot != null ||\n    ystate.prevSnapshot != null ||\n    ystate.binding.mapping.size === 0\n  ) {\n    // do not render cursors while snapshot is active\n    return DecorationSet.create(state.doc, [])\n  }\n  awareness.getStates().forEach((aw, clientId) => {\n    if (!awarenessFilter(y.clientID, clientId, aw)) {\n      return\n    }\n\n    // `aw` can be null when a client disconnects, so we guard against it\n    // before reading `cursor` to avoid a TypeError.\n    if (aw && aw.cursor != null) {\n      const user = aw.user || {};\n      if (user.color == null) {\n        user.color = '#ffa500';\n      } else if (!rxValidColor.test(user.color)) {\n        // We only support 6-digit RGB colors in y-prosemirror\n        console.warn('A user uses an unsupported color format', user);\n      }\n      if (user.name == null) {\n        user.name = `User: ${clientId}`;\n      }\n      let anchor = relativePositionToAbsolutePosition(\n        y,\n        ystate.type,\n        Y.createRelativePositionFromJSON(aw.cursor.anchor),\n        ystate.binding.mapping\n      );\n      let head = relativePositionToAbsolutePosition(\n        y,\n        ystate.type,\n        Y.createRelativePositionFromJSON(aw.cursor.head),\n        ystate.binding.mapping\n      );\n      if (anchor !== null && head !== null) {\n        const maxsize = math.max(state.doc.content.size - 1, 0);\n        anchor = math.min(anchor, maxsize);\n        head = math.min(head, maxsize);\n        decorations.push(\n          Decoration.widget(head, () => createCursor(user, clientId), {\n            key: clientId + '',\n            side: 10\n          })\n        );\n        const from = math.min(anchor, head);\n        const to = math.max(anchor, head);\n        decorations.push(\n          Decoration.inline(from, to, createSelection(user, clientId), {\n            inclusiveEnd: true,\n            inclusiveStart: false\n          })\n        );\n      }\n    }\n  });\n  return DecorationSet.create(state.doc, decorations)\n};\n\n/**\n * A prosemirror plugin that listens to awareness information on Yjs.\n * This requires that a `prosemirrorPlugin` is also bound to the prosemirror.\n *\n * @public\n * @param {Awareness} awareness\n * @param {object} opts\n * @param {function(any, any, any):boolean} [opts.awarenessStateFilter]\n * @param {(user: any, clientId: number) => HTMLElement} [opts.cursorBuilder]\n * @param {(user: any, clientId: number) => import('prosemirror-view').DecorationAttrs} [opts.selectionBuilder]\n * @param {function(any):any} [opts.getSelection]\n * @param {string} [cursorStateField] By default all editor bindings use the awareness 'cursor' field to propagate cursor information.\n * @return {any}\n */\nconst yCursorPlugin = (\n  awareness,\n  {\n    awarenessStateFilter = defaultAwarenessStateFilter,\n    cursorBuilder = defaultCursorBuilder,\n    selectionBuilder = defaultSelectionBuilder,\n    getSelection = (state) => state.selection\n  } = {},\n  cursorStateField = 'cursor'\n) =>\n  new Plugin({\n    key: yCursorPluginKey,\n    state: {\n      init (_, state) {\n        return createDecorations(\n          state,\n          awareness,\n          awarenessStateFilter,\n          cursorBuilder,\n          selectionBuilder\n        )\n      },\n      apply (tr, prevState, oldState, newState) {\n        const ystate = ySyncPluginKey.getState(newState);\n        const yCursorState = tr.getMeta(yCursorPluginKey);\n        const isRemoteChange = ystate && ystate.isChangeOrigin;\n        if (\n          tr.docChanged &&\n          !isRemoteChange &&\n          isStructuralTransaction(tr, oldState.doc)\n        ) {\n          // The ProseMirror document leads the Yjs mapping during local moves.\n          // Hide stale awareness until the collaborator publishes its new cursor.\n          return DecorationSet.empty\n        }\n        if (\n          isRemoteChange ||\n          (yCursorState && yCursorState.awarenessUpdated)\n        ) {\n          return createDecorations(\n            newState,\n            awareness,\n            awarenessStateFilter,\n            cursorBuilder,\n            selectionBuilder\n          )\n        }\n        if (tr.docChanged) {\n          return prevState.map(tr.mapping, tr.doc)\n        }\n        return prevState\n      }\n    },\n    props: {\n      decorations: (state) => {\n        return yCursorPluginKey.getState(state)\n      }\n    },\n    view: (view) => {\n      const awarenessListener = () => {\n        // @ts-ignore\n        if (view.docView) {\n          setMeta(view, yCursorPluginKey, { awarenessUpdated: true });\n        }\n      };\n      /**\n       * @param {import('prosemirror-view').EditorView} editorView\n       * @param {{ force?: boolean }} [opts]\n       */\n      const updateCursorInfo = (editorView, opts = {}) => {\n        const ystate = ySyncPluginKey.getState(editorView.state);\n        // `ystate` is undefined during sync-plugin init and Y.Doc transitions;\n        // reading from it here would throw and break cursor tracking for the view.\n        if (!ystate || !ystate.binding) return\n        // @note We make implicit checks when checking for the cursor property\n        const current = awareness.getLocalState() || {};\n        if (editorView.hasFocus()) {\n          const selection = getSelection(editorView.state);\n          /**\n           * @type {Y.RelativePosition}\n           */\n          const anchor = absolutePositionToRelativePosition(\n            selection.anchor,\n            ystate.type,\n            ystate.binding.mapping\n          );\n          /**\n           * @type {Y.RelativePosition}\n           */\n          const head = absolutePositionToRelativePosition(\n            selection.head,\n            ystate.type,\n            ystate.binding.mapping\n          );\n          if (\n            opts.force ||\n            current.cursor == null ||\n            !Y.compareRelativePositions(\n              Y.createRelativePositionFromJSON(current.cursor.anchor),\n              anchor\n            ) ||\n            !Y.compareRelativePositions(\n              Y.createRelativePositionFromJSON(current.cursor.head),\n              head\n            )\n          ) {\n            awareness.setLocalStateField(cursorStateField, {\n              anchor,\n              head\n            });\n          }\n        } else if (\n          current.cursor != null &&\n          relativePositionToAbsolutePosition(\n            ystate.doc,\n            ystate.type,\n            Y.createRelativePositionFromJSON(current.cursor.anchor),\n            ystate.binding.mapping\n          ) !== null\n        ) {\n          // delete cursor information if current cursor information is owned by this editor binding\n          awareness.setLocalStateField(cursorStateField, null);\n        }\n      };\n      const onFocusChange = () => updateCursorInfo(view);\n      awareness.on('change', awarenessListener);\n      view.dom.addEventListener('focusin', onFocusChange);\n      view.dom.addEventListener('focusout', onFocusChange);\n      return {\n        update: (editorView, prevState) => {\n          const ystate = ySyncPluginKey.getState(editorView.state);\n          const forceAwarenessUpdate = !!(\n            ystate?.isChangeOrigin &&\n            prevState?.doc &&\n            !prevState.doc.eq(editorView.state.doc)\n          );\n          updateCursorInfo(editorView, { force: forceAwarenessUpdate });\n        },\n        destroy: () => {\n          view.dom.removeEventListener('focusin', onFocusChange);\n          view.dom.removeEventListener('focusout', onFocusChange);\n          awareness.off('change', awarenessListener);\n          awareness.setLocalStateField(cursorStateField, null);\n        }\n      }\n    }\n  });\n\nconst undo = state => {\n  const undoManager = yUndoPluginKey.getState(state).undoManager;\n  if (undoManager != null) {\n    undoManager.undo();\n    return true\n  }\n};\n\nconst redo = state => {\n  const undoManager = yUndoPluginKey.getState(state).undoManager;\n  if (undoManager != null) {\n    undoManager.redo();\n    return true\n  }\n};\n\nconst defaultProtectedNodes = new Set(['paragraph']);\n\nconst defaultDeleteFilter = (item, protectedNodes) => !(item instanceof Item) ||\n!(item.content instanceof ContentType) ||\n!(item.content.type instanceof Text ||\n  (item.content.type instanceof XmlElement && protectedNodes.has(item.content.type.nodeName))) ||\nitem.content.type._length === 0;\n\nconst yUndoPlugin = ({ protectedNodes = defaultProtectedNodes, trackedOrigins = [], undoManager = null } = {}) => new Plugin({\n  key: yUndoPluginKey,\n  state: {\n    init: (initargs, state) => {\n      // TODO: check if plugin order matches and fix\n      const ystate = ySyncPluginKey.getState(state);\n      let _undoManager = undoManager;\n      if (!_undoManager) {\n        // Y.UndoManager registers a `doc.on('destroy', …)` listener in its\n        // constructor that UndoManager.destroy() never removes. When the doc\n        // outlives the editor (e.g. several editors sharing one provider), that\n        // listener keeps the UndoManager — and everything it references —\n        // reachable from the doc, leaking memory on every editor destroy.\n        // We only own the lifecycle of a manager we create here, so capture the\n        // listener(s) it adds and remove them when the plugin view is destroyed.\n        const doc = ystate.doc;\n        const destroyListenersBefore = new Set(doc ? doc._observers.get('destroy') : []);\n        _undoManager = new UndoManager(ystate.type, {\n          trackedOrigins: new Set([ySyncPluginKey].concat(trackedOrigins)),\n          deleteFilter: (item) => defaultDeleteFilter(item, protectedNodes),\n          captureTransaction: tr => tr.meta.get('addToHistory') !== false\n        });\n        const destroyListenersAfter = doc ? doc._observers.get('destroy') : new Set();\n        _undoManager._yTiptapDocDestroyListeners = Array.from(destroyListenersAfter || [])\n          .filter(listener => !destroyListenersBefore.has(listener));\n      }\n      return {\n        undoManager: _undoManager,\n        prevSel: null,\n        hasUndoOps: _undoManager.undoStack.length > 0,\n        hasRedoOps: _undoManager.redoStack.length > 0\n      }\n    },\n    /**\n     * @returns {any}\n     */\n    apply: (tr, val, oldState, state) => {\n      const binding = ySyncPluginKey.getState(state).binding;\n      const undoManager = val.undoManager;\n      const hasUndoOps = undoManager.undoStack.length > 0;\n      const hasRedoOps = undoManager.redoStack.length > 0;\n      if (binding) {\n        return {\n          undoManager,\n          prevSel: getRelativeSelection(binding, oldState),\n          hasUndoOps,\n          hasRedoOps\n        }\n      } else {\n        if (hasUndoOps !== val.hasUndoOps || hasRedoOps !== val.hasRedoOps) {\n          return Object.assign({}, val, {\n            hasUndoOps: undoManager.undoStack.length > 0,\n            hasRedoOps: undoManager.redoStack.length > 0\n          })\n        } else { // nothing changed\n          return val\n        }\n      }\n    }\n  },\n  view: view => {\n    const ystate = ySyncPluginKey.getState(view.state);\n    const undoManager = yUndoPluginKey.getState(view.state).undoManager;\n    undoManager.on('stack-item-added', ({ stackItem }) => {\n      const binding = ystate.binding;\n      if (binding) {\n        stackItem.meta.set(binding, yUndoPluginKey.getState(view.state).prevSel);\n      }\n    });\n    undoManager.on('stack-item-popped', ({ stackItem }) => {\n      const binding = ystate.binding;\n      if (binding) {\n        binding.beforeTransactionSelection = stackItem.meta.get(binding) || binding.beforeTransactionSelection;\n      }\n    });\n    return {\n      destroy: () => {\n        undoManager.destroy();\n        // Remove the doc 'destroy' listener Y.UndoManager fails to clean up\n        // (only for managers we created — see state.init above).\n        const leakedDestroyListeners = undoManager._yTiptapDocDestroyListeners;\n        if (leakedDestroyListeners && undoManager.doc) {\n          leakedDestroyListeners.forEach(listener => undoManager.doc.off('destroy', listener));\n          undoManager._yTiptapDocDestroyListeners = null;\n        }\n      }\n    }\n  }\n});\n\nexport { ProsemirrorBinding, absolutePositionToRelativePosition, createDecorations, defaultAwarenessStateFilter, defaultCursorBuilder, defaultDeleteFilter, defaultProtectedNodes, defaultSelectionBuilder, findAbsolutePositionAfterStructuralChange, getRelativeSelection, initProseMirrorDoc, isMisresolvedAfterStructuralChange, isMisresolvedTextPosition, isStructuralTransaction, isVisible, prosemirrorJSONToYDoc, prosemirrorJSONToYXmlFragment, prosemirrorToYDoc, prosemirrorToYXmlFragment, redo, relativePositionToAbsolutePosition, setMeta, undo, updateYFragment, yCursorPlugin, yCursorPluginKey, yDocToProsemirror, yDocToProsemirrorJSON, ySyncPlugin, ySyncPluginKey, yUndoPlugin, yUndoPluginKey, yXmlFragmentToProseMirrorFragment, yXmlFragmentToProseMirrorRootNode, yXmlFragmentToProsemirror, yXmlFragmentToProsemirrorJSON };\n//# sourceMappingURL=y-tiptap.js.map\n","import type { PastyConfig } from './types'\n\nconst FALLBACK: PastyConfig = {\n  user: { is_authenticated: false },\n  doc: null,\n  api: { documents: '/api/documents', preferences: '/api/preferences' },\n  urls: { home: '/', doc_base: '/d/', login: '/login', signup: '/signup' },\n  csrf_header: 'X-CSRFToken',\n  prefs: { vim_mode: false },\n}\n\n/**\n * Read the payload Django rendered with `json_script`.\n *\n * Falls back to anonymous defaults so `frontend/index.html` can run the editor\n * under `vite dev` without a server.\n */\nexport function readConfig(): PastyConfig {\n  const node = document.getElementById('pasty-config')\n  if (!node?.textContent) {\n    return FALLBACK\n  }\n  try {\n    return { ...FALLBACK, ...(JSON.parse(node.textContent) as PastyConfig) }\n  } catch {\n    console.warn('[pasty] Could not read the page configuration; continuing anonymously.')\n    return FALLBACK\n  }\n}\n\nexport function readCookie(name: string): string | null {\n  const prefix = `${name}=`\n  for (const part of document.cookie.split(';')) {\n    const cookie = part.trim()\n    if (cookie.startsWith(prefix)) {\n      return decodeURIComponent(cookie.slice(prefix.length))\n    }\n  }\n  return null\n}\n","/**\n * The document API client.\n *\n * Same-origin fetch with the session cookie; the CSRF token is read from the\n * cookie on every call so a rotated token (a fresh login in another tab) is\n * picked up without a reload.\n */\n\nimport { readCookie } from './bootstrap'\nimport type {\n  ConflictDocument,\n  DocumentSummary,\n  JoinRequest,\n  JoinResponse,\n  PastyConfig,\n  PastyDocument,\n  PastyPrefs,\n  SyncRequest,\n  SyncResponse,\n} from './types'\n\nexport interface ApiErrorBody {\n  code: string\n  message: string\n  fields?: Record<string, string>\n}\n\nexport class ApiError extends Error {\n  readonly status: number\n  readonly code: string\n  readonly fields?: Record<string, string>\n  /**\n   * The version that won, on a 409. A conflict the client cannot see is one it\n   * cannot offer a choice about, so the refusal carries the document with it\n   * rather than making the loser fetch it and race again.\n   */\n  readonly document?: ConflictDocument\n\n  constructor(status: number, body?: ApiErrorBody, document?: ConflictDocument) {\n    super(body?.message ?? `Request failed with status ${status}`)\n    this.name = 'ApiError'\n    this.status = status\n    this.code = body?.code ?? 'unknown'\n    this.fields = body?.fields\n    this.document = document\n  }\n}\n\nexport interface DocumentInput {\n  title?: string\n  markdown?: string\n}\n\n/** A write, and the revision it was built on. Never optional: see `autosave.ts`. */\nexport interface UpdateInput extends DocumentInput {\n  revision: number\n  /** `Keep mine`: overwrite the conflict, and archive what was displaced. */\n  force?: boolean\n}\n\n/** `id` and `editable` are owner-only; a guest is told neither. */\nexport interface UpdateResult {\n  id?: string\n  revision: number\n  updated_at: string\n  editable?: boolean\n}\n\n/**\n * What autosave needs from a place to save to.\n *\n * Three implementations satisfy it: the owner's documents API, a guest's\n * token-addressed one, and the live provider, which writes through the sync\n * request instead of a PATCH. Autosave does not know which it has.\n */\nexport interface DocumentWriter {\n  update(id: string | null, input: UpdateInput, options?: RequestOptions): Promise<UpdateResult>\n  /** Only the documents API can make a row that does not exist yet. */\n  create?(input: DocumentInput, options?: RequestOptions): Promise<PastyDocument>\n}\n\nexport interface RequestOptions {\n  keepalive?: boolean\n}\n\n/**\n * One same-origin JSON request, shared by every client below.\n *\n * The CSRF token is read from the cookie on every call rather than captured\n * once, so a rotated token (a fresh login in another tab) is picked up without\n * a reload.\n */\nasync function apiRequest<T>(\n  method: string,\n  url: string,\n  body: unknown,\n  csrfHeader: string,\n  options: RequestOptions = {},\n): Promise<T> {\n  const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n  const token = readCookie('csrftoken')\n  if (token) {\n    headers[csrfHeader] = token\n  }\n\n  const response = await fetch(url, {\n    method,\n    headers,\n    credentials: 'same-origin',\n    body: JSON.stringify(body),\n    // keepalive lets a save started during page hide actually finish.\n    keepalive: options.keepalive ?? false,\n  })\n\n  if (response.ok) {\n    return (await response.json()) as T\n  }\n\n  let error: ApiErrorBody | undefined\n  let conflict: ConflictDocument | undefined\n  try {\n    const body = (await response.json()) as {\n      error?: ApiErrorBody\n      document?: ConflictDocument\n    }\n    error = body.error\n    conflict = body.document\n  } catch {\n    /* a proxy or an HTML error page; the status is all we get */\n  }\n  throw new ApiError(response.status, error, conflict)\n}\n\n/** The live session's two endpoints, for one document. */\nexport interface CollabApi {\n  join(body: JoinRequest, options?: RequestOptions): Promise<JoinResponse>\n  sync(body: SyncRequest, options?: RequestOptions): Promise<SyncResponse>\n}\n\nexport class DocumentsApi {\n  private readonly endpoint: string\n  private readonly csrfHeader: string\n\n  constructor(config: PastyConfig) {\n    this.endpoint = config.api.documents\n    this.csrfHeader = config.csrf_header\n  }\n\n  create(input: DocumentInput, options: RequestOptions = {}): Promise<PastyDocument> {\n    return this.request<PastyDocument>('POST', this.endpoint, input, options)\n  }\n\n  /**\n   * Every document the account owns, most recent first, without their bodies.\n   * The server caps this; the palette filters what it gets rather than asking\n   * the server per keystroke.\n   */\n  list(): Promise<{ documents: DocumentSummary[] }> {\n    // `request` stringifies the body unconditionally, and JSON.stringify(undefined)\n    // is undefined, which fetch accepts. Passing `{}` here would throw: a GET\n    // cannot carry a body.\n    return this.request<{ documents: DocumentSummary[] }>('GET', this.endpoint, undefined)\n  }\n\n  update(id: string, input: UpdateInput, options: RequestOptions = {}): Promise<UpdateResult> {\n    return this.request('PATCH', `${this.endpoint}/${id}`, input, options)\n  }\n\n  /**\n   * Delete a document. For good, and for everyone holding one of its links.\n   *\n   * 200 with a body rather than 204 — `request` parses every OK response as\n   * JSON, and the server answers in kind. A 404 means it is already gone,\n   * which is the outcome the caller wanted.\n   */\n  delete(id: string): Promise<{ id: string; deleted: true }> {\n    return this.request('DELETE', `${this.endpoint}/${id}`, undefined)\n  }\n\n  /** Turn the view link on. Idempotent: an already-shared document answers\n      with the URL that is already in circulation. */\n  share(id: string): Promise<{ share_url: string; edit_url: string | null }> {\n    return this.request('POST', `${this.endpoint}/${id}/share`, undefined)\n  }\n\n  /** Stop sharing: the wide verb. Both links stop working immediately. */\n  unshare(id: string): Promise<{ share_url: null; edit_url: null }> {\n    return this.request('DELETE', `${this.endpoint}/${id}/share`, undefined)\n  }\n\n  /** Turn the edit link on. The view link, if any, is left exactly as it is. */\n  shareEdit(id: string): Promise<{ share_url: string | null; edit_url: string }> {\n    return this.request('POST', `${this.endpoint}/${id}/share/edit`, undefined)\n  }\n\n  /** Stop editing: the narrow verb. A view link keeps working. */\n  unshareEdit(id: string): Promise<{ share_url: string | null; edit_url: null }> {\n    return this.request('DELETE', `${this.endpoint}/${id}/share/edit`, undefined)\n  }\n\n  /** The live session for one document, over the owner's routes. */\n  collab(id: string): CollabApi {\n    const base = `${this.endpoint}/${id}/collab`\n    return {\n      join: (body, options) => this.request('POST', `${base}/join`, body, options),\n      sync: (body, options) => this.request('POST', `${base}/sync`, body, options),\n    }\n  }\n\n  private request<T>(\n    method: string,\n    url: string,\n    body: unknown,\n    options: RequestOptions = {},\n  ): Promise<T> {\n    return apiRequest<T>(method, url, body, this.csrfHeader, options)\n  }\n}\n\n/**\n * The guest's half of the document API.\n *\n * Addressed by the edit link rather than by an id, because a guest has no\n * business knowing one — and shaped like `DocumentWriter` so autosave cannot\n * tell the difference. `create` is deliberately absent: an edit link points at\n * a document that already exists.\n */\nexport class GuestDocumentApi implements DocumentWriter {\n  private readonly endpoint: string\n  private readonly csrfHeader: string\n\n  constructor(endpoint: string, csrfHeader: string) {\n    this.endpoint = endpoint\n    this.csrfHeader = csrfHeader\n  }\n\n  update(_id: string | null, input: UpdateInput, options: RequestOptions = {}) {\n    return apiRequest<UpdateResult>('PATCH', this.endpoint, input, this.csrfHeader, options)\n  }\n\n  collab(): CollabApi {\n    const base = `${this.endpoint}/collab`\n    return {\n      join: (body, options) =>\n        apiRequest<JoinResponse>('POST', `${base}/join`, body, this.csrfHeader, options),\n      sync: (body, options) =>\n        apiRequest<SyncResponse>('POST', `${base}/sync`, body, this.csrfHeader, options),\n    }\n  }\n}\n\nexport interface PreferencesInput {\n  vim_mode?: boolean\n}\n\n/**\n * Editor preferences for a signed-in account.\n *\n * Write-only on purpose: reads come with the page, in `config.prefs`. There is\n * no GET to race with, which is what lets the client treat a failed write as\n * \"the server didn't hear that\" rather than as a state it has to reconcile.\n */\nexport class PreferencesApi {\n  private readonly endpoint: string\n  private readonly csrfHeader: string\n\n  constructor(config: PastyConfig) {\n    this.endpoint = config.api.preferences\n    this.csrfHeader = config.csrf_header\n  }\n\n  update(input: PreferencesInput): Promise<{ prefs: PastyPrefs }> {\n    return apiRequest<{ prefs: PastyPrefs }>('PATCH', this.endpoint, input, this.csrfHeader)\n  }\n}\n","/** Small DOM helpers. Not a framework — just less noise at the call sites. */\n\ntype Attributes = Record<string, string | number | boolean | undefined | null>\ntype Child = Node | string | null | undefined | false\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n  tag: K,\n  attributes: Attributes = {},\n  ...children: Child[]\n): HTMLElementTagNameMap[K] {\n  const node = document.createElement(tag)\n\n  for (const [name, value] of Object.entries(attributes)) {\n    if (value === undefined || value === null || value === false) {\n      continue\n    }\n    if (name === 'class') {\n      node.className = String(value)\n    } else if (name === 'text') {\n      node.textContent = String(value)\n    } else {\n      node.setAttribute(name, value === true ? '' : String(value))\n    }\n  }\n\n  for (const child of children) {\n    if (child === null || child === undefined || child === false) {\n      continue\n    }\n    node.append(child)\n  }\n\n  return node\n}\n\n/**\n * An inline SVG icon. Markup is authored in icons.ts, never from user input.\n *\n * The stroke lives here rather than on each icon, which is what keeps the set\n * looking like one family: there is exactly one place to change its weight.\n */\nexport function icon(markup: string, size = 18): SVGElement {\n  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n  svg.setAttribute('viewBox', '0 0 24 24')\n  svg.setAttribute('width', String(size))\n  svg.setAttribute('height', String(size))\n  svg.setAttribute('fill', 'none')\n  svg.setAttribute('stroke', 'currentColor')\n  svg.setAttribute('stroke-width', '1.8')\n  svg.setAttribute('stroke-linecap', 'round')\n  svg.setAttribute('stroke-linejoin', 'round')\n  svg.setAttribute('aria-hidden', 'true')\n  svg.setAttribute('focusable', 'false')\n  svg.innerHTML = markup\n  return svg\n}\n\nexport function clear(node: Element): void {\n  while (node.firstChild) {\n    node.firstChild.remove()\n  }\n}\n","/**\n * Inline SVG icon bodies, drawn on a 24x24 grid. Keeping them here avoids an\n * icon dependency and a second network request for six kilobytes of glyphs.\n *\n * One family, one weight: every icon is a 1.8px stroke on the same geometry, so\n * the toolbar reads as one set rather than two. `icon()` in dom.ts owns the\n * stroke, fill and cap attributes — the bodies below are pure shape.\n */\n\nexport const ICONS = {\n  undo: '<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h10.5A5.5 5.5 0 0 1 14.5 20H11\"/>',\n  redo: '<path d=\"m15 14 5-5-5-5\"/><path d=\"M20 9H9.5A5.5 5.5 0 0 0 9.5 20H13\"/>',\n  bold: '<path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\"/>',\n  italic: '<path d=\"M19 4h-9M14 20H5M15 4 9 20\"/>',\n  link: '<path d=\"M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7\"/><path d=\"M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7\"/>',\n  unlink:\n    '<path d=\"M9 17H7A5 5 0 0 1 7 7h2\"/><path d=\"M15 7h2a5 5 0 0 1 3.9 8.1\"/><path d=\"M9 12h4\"/><path d=\"m3 3 18 18\"/>',\n  bulletList:\n    '<path d=\"M8.5 6h12M8.5 12h12M8.5 18h12\"/><path d=\"M4 6h.01M4 12h.01M4 18h.01\" stroke-width=\"2.4\"/>',\n  orderedList:\n    '<path d=\"M10 6h11M10 12h11M10 18h11\"/><path d=\"M4 6h1v4M3.6 10h2.6\"/><path d=\"M3.6 15.4a1.4 1.4 0 0 1 2.4 1c0 .9-2.4 1.7-2.4 2.6h2.6\"/>',\n  taskList:\n    '<rect x=\"3\" y=\"4.2\" width=\"6.4\" height=\"6.4\" rx=\"1.6\"/><path d=\"m4.8 7.4 1.4 1.4 2.3-2.6\"/><rect x=\"3\" y=\"13.4\" width=\"6.4\" height=\"6.4\" rx=\"1.6\"/><path d=\"M12.6 7.4H21M12.6 16.6H21\"/>',\n  // Two hooks: quotation marks. A bar-plus-lines glyph was more literal about\n  // what a blockquote renders as, and read as an alignment control.\n  quote:\n    '<path d=\"M8 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 2 2 0 0 1 2 2v1a2 2 0 0 1-2 2H7\"/><path d=\"M17 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 2 2 0 0 1 2 2v1a2 2 0 0 1-2 2h-1\"/>',\n  code: '<path d=\"m9 17-5-5 5-5M15 7l5 5-5 5\"/>',\n  codeBlock:\n    '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2.5\"/><path d=\"m9.6 9.8-2.2 2.2 2.2 2.2M14.4 9.8l2.2 2.2-2.2 2.2\"/>',\n  table: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2.5\"/><path d=\"M3 9.5h18M3 14.5h18M9.5 4v16\"/>',\n  rowAfter: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"6.5\" rx=\"1.6\"/><path d=\"M12 13.5v6M9 16.5h6\"/>',\n  rowDelete: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"6.5\" rx=\"1.6\"/><path d=\"M9 16.5h6\"/>',\n  columnAfter:\n    '<rect x=\"3.5\" y=\"4\" width=\"6.5\" height=\"16\" rx=\"1.6\"/><path d=\"M16.5 9v6M13.5 12h6\"/>',\n  columnDelete: '<rect x=\"3.5\" y=\"4\" width=\"6.5\" height=\"16\" rx=\"1.6\"/><path d=\"M13.5 12h6\"/>',\n  tableDelete: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2.5\"/><path d=\"m9.5 9.5 5 5M14.5 9.5l-5 5\"/>',\n  search: '<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.6-3.6\"/>',\n  check: '<path d=\"m5 12.5 4.5 4.5L19 7.5\"/>',\n  lock: '<rect x=\"4.5\" y=\"10\" width=\"15\" height=\"10.5\" rx=\"2.5\"/><path d=\"M8 10V6.9a4 4 0 0 1 8 0V10\"/>',\n  close: '<path d=\"M6 6 18 18M18 6 6 18\"/>',\n  chevronDown: '<path d=\"m6 9.5 6 6 6-6\"/>',\n} as const\n\nexport type IconName = keyof typeof ICONS\n","/**\n * Local storage.\n *\n * Two rules keep work from disappearing:\n *  - the anonymous document is only ever cleared after the server has confirmed\n *    a copy of it, and\n *  - nothing here throws. Private browsing and full quotas degrade to \"we\n *    couldn't save locally\", never to a broken editor.\n */\n\nimport type { StoredDocument } from './types'\n\nconst ANON_KEY = 'pasty.anon_doc.v1'\nconst BACKUP_PREFIX = 'pasty.doc_backup.'\n/**\n * The losing side of a conflict, kept where an ordinary save can never reach.\n *\n * `clearBackup` runs on every successful save; this namespace deliberately\n * sits outside it, because the whole promise of `Use latest` and `Keep mine` is\n * that neither version is destroyed — and the very next save after resolving is\n * what would otherwise destroy one.\n */\nconst CONFLICT_PREFIX = 'pasty.doc_conflict.'\nconst COLLAB_PENDING_PREFIX = 'pasty.collab_pending.'\n/** Above this, storing pending updates would be the thing that breaks the tab. */\nconst MAX_PENDING_BYTES = 1024 * 1024\nconst BANNER_DISMISSED_KEY = 'pasty.banner_dismissed'\n/** Mirrored byte-for-byte in the boot script; theme-boot.test.ts holds them together. */\nexport const THEME_KEY = 'pasty.theme'\n/** The anonymous half of the Vim preference; see `vim-controller.ts`. */\nexport const VIM_MODE_KEY = 'pasty.vim_mode'\n\nfunction readStore(): Storage | null {\n  try {\n    return window.localStorage\n  } catch {\n    return null\n  }\n}\n\nfunction readJson<T>(storage: Storage | null, key: string): T | null {\n  if (!storage) {\n    return null\n  }\n  try {\n    const raw = storage.getItem(key)\n    return raw ? (JSON.parse(raw) as T) : null\n  } catch {\n    return null\n  }\n}\n\nfunction writeJson(storage: Storage | null, key: string, value: unknown): boolean {\n  if (!storage) {\n    return false\n  }\n  try {\n    storage.setItem(key, JSON.stringify(value))\n    return true\n  } catch {\n    return false\n  }\n}\n\nfunction isStoredDocument(value: unknown): value is StoredDocument {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    typeof (value as StoredDocument).markdown === 'string' &&\n    // `title` is checked too, because everything downstream reads it as a\n    // string: `hasContent` below trims it, and the title field derives from it.\n    // A half-valid document that boots the editor and then throws is worse than\n    // one we decline to load.\n    typeof (value as StoredDocument).title === 'string'\n  )\n}\n\nexport function loadAnonDocument(): StoredDocument | null {\n  const stored = readJson<StoredDocument>(readStore(), ANON_KEY)\n  return isStoredDocument(stored) ? stored : null\n}\n\n/** Whether a stored document holds anything the user would miss. */\nexport function hasContent(document: StoredDocument | null): document is StoredDocument {\n  return !!document && (document.markdown.trim() !== '' || document.title.trim() !== '')\n}\n\nexport function saveAnonDocument(document: StoredDocument): boolean {\n  return writeJson(readStore(), ANON_KEY, document)\n}\n\nexport function clearAnonDocument(): void {\n  try {\n    readStore()?.removeItem(ANON_KEY)\n  } catch {\n    /* nothing we can do, and nothing that should break editing */\n  }\n}\n\n/**\n * A local copy of a document the server hasn't confirmed, keyed so it can be\n * recovered. Written *before* every request, not only after a failure: a save\n * that never returns — the tab closed, the laptop slept — leaves no error to\n * react to, and this is the copy the next boot offers to restore.\n */\nexport interface BackupDocument extends StoredDocument {\n  /** The base this save was built on. Absent in backups written before revisions. */\n  revision?: number\n}\n\nexport function saveBackup(id: string, document: BackupDocument): boolean {\n  return writeJson(readStore(), BACKUP_PREFIX + id, document)\n}\n\nexport function loadBackup(id: string): BackupDocument | null {\n  const stored = readJson<BackupDocument>(readStore(), BACKUP_PREFIX + id)\n  return isStoredDocument(stored) ? stored : null\n}\n\nexport function clearBackup(id: string): void {\n  try {\n    readStore()?.removeItem(BACKUP_PREFIX + id)\n  } catch {\n    /* see above */\n  }\n}\n\n/** The version a conflict displaced: which side it was, and when. */\nexport interface ConflictCopy {\n  /** `local` — this tab's text lost. `server` — this tab's text won. */\n  origin: 'local' | 'server'\n  document: StoredDocument\n  at: string\n}\n\n/**\n * Keep the version that lost.\n *\n * Written before either branch of the conflict notice acts, so `Use latest`\n * cannot be the click that loses somebody's paragraph. Nothing in the ordinary\n * save path ever clears these; they are cleared by being overwritten by the\n * next conflict on the same document.\n */\nexport function saveConflictCopy(id: string, copy: ConflictCopy): boolean {\n  return writeJson(readStore(), CONFLICT_PREFIX + id, copy)\n}\n\nexport function loadConflictCopy(id: string): ConflictCopy | null {\n  const stored = readJson<ConflictCopy>(readStore(), CONFLICT_PREFIX + id)\n  if (!stored || !isStoredDocument(stored.document)) {\n    return null\n  }\n  return stored.origin === 'local' || stored.origin === 'server' ? stored : null\n}\n\n/**\n * Updates that never reached the server, kept across a reload.\n *\n * The live layer's equivalent of the backup above: a failed sync means bytes\n * this browser holds and nobody else does, and a reload in that state would be\n * the thing that loses them. Replayed on the next successful join.\n */\nexport function savePendingUpdates(session: string, updates: string[]): boolean {\n  const serialized = JSON.stringify(updates)\n  if (serialized.length > MAX_PENDING_BYTES) {\n    // Better to keep nothing than to fill the quota and break every other\n    // write this module makes.\n    return false\n  }\n  const storage = readStore()\n  if (!storage) {\n    return false\n  }\n  try {\n    storage.setItem(COLLAB_PENDING_PREFIX + session, serialized)\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport function loadPendingUpdates(session: string): string[] {\n  const stored = readJson<string[]>(readStore(), COLLAB_PENDING_PREFIX + session)\n  if (!Array.isArray(stored)) {\n    return []\n  }\n  return stored.filter((item): item is string => typeof item === 'string')\n}\n\nexport function clearPendingUpdates(session: string): void {\n  try {\n    readStore()?.removeItem(COLLAB_PENDING_PREFIX + session)\n  } catch {\n    /* see above */\n  }\n}\n\nconst SHARE_INTENT_KEY = 'pasty.share_intent'\n\n/**\n * \"Reopen the Share popover once I'm signed in.\"\n *\n * Written when an anonymous visitor leaves the Share popover for signup/login,\n * read back on the first authenticated boot. sessionStorage like the banner\n * dismissal: an intent is per-visit, and a closed tab should take it along.\n */\nexport function markPostAuthShareIntent(): void {\n  try {\n    window.sessionStorage.setItem(SHARE_INTENT_KEY, '1')\n  } catch {\n    /* the popover just won't reopen itself */\n  }\n}\n\n/** One-shot: reading the intent always clears it, so it can never go stale. */\nexport function consumePostAuthShareIntent(): boolean {\n  try {\n    const marked = window.sessionStorage.getItem(SHARE_INTENT_KEY) === '1'\n    window.sessionStorage.removeItem(SHARE_INTENT_KEY)\n    return marked\n  } catch {\n    return false\n  }\n}\n\nconst SHARE_REOPEN_KEY = 'pasty.share_reopen'\n\n/**\n * \"Reopen the Share popover after this reload, and say this.\"\n *\n * Turning editing on or off reloads the page — the editor mode is fixed at page\n * load — and a reload that swallowed the confirmation would make the click look\n * like it did nothing. sessionStorage and one-shot, like the auth intent above.\n */\nexport function markShareReopen(note: string): void {\n  try {\n    window.sessionStorage.setItem(SHARE_REOPEN_KEY, note)\n  } catch {\n    /* the popover just won't reopen itself */\n  }\n}\n\n/** One-shot: reading the intent always clears it, so it can never go stale. */\nexport function consumeShareReopen(): string | null {\n  try {\n    const note = window.sessionStorage.getItem(SHARE_REOPEN_KEY)\n    window.sessionStorage.removeItem(SHARE_REOPEN_KEY)\n    return note\n  } catch {\n    return null\n  }\n}\n\nexport function isBannerDismissed(): boolean {\n  try {\n    return window.sessionStorage.getItem(BANNER_DISMISSED_KEY) === '1'\n  } catch {\n    return false\n  }\n}\n\nexport function dismissBanner(): void {\n  try {\n    window.sessionStorage.setItem(BANNER_DISMISSED_KEY, '1')\n  } catch {\n    /* dismissal just won't persist */\n  }\n}\n\n/**\n * The appearance preference. A scalar, so it skips the JSON helpers above, and\n * localStorage rather than the banner's sessionStorage: a theme is a setting,\n * not a per-visit dismissal. Validation lives in theme.ts — anything unexpected\n * resolves to System there.\n */\nexport function readThemePreference(): string | null {\n  try {\n    return readStore()?.getItem(THEME_KEY) ?? null\n  } catch {\n    return null\n  }\n}\n\nexport function writeThemePreference(value: string): boolean {\n  const storage = readStore()\n  if (!storage) {\n    return false\n  }\n  try {\n    storage.setItem(THEME_KEY, value)\n    return true\n  } catch {\n    return false\n  }\n}\n\n/**\n * The Vim preference, for visitors with no account to keep it on.\n *\n * Three states, not two: `'on'`, `'off'`, and **absent**. Absence means \"this\n * browser has no opinion\", which is what lets an anonymous visitor who never\n * touched the setting sign in and get their account's preference instead of\n * this browser's default. That is why turning Vim mode off writes `'off'`\n * rather than removing the key — the removal is reserved for reconciliation,\n * after the server has taken the value over.\n */\nexport function readVimPreference(): string | null {\n  try {\n    return readStore()?.getItem(VIM_MODE_KEY) ?? null\n  } catch {\n    return null\n  }\n}\n\nexport function writeVimPreference(value: string): boolean {\n  const storage = readStore()\n  if (!storage) {\n    return false\n  }\n  try {\n    storage.setItem(VIM_MODE_KEY, value)\n    return true\n  } catch {\n    return false\n  }\n}\n\nexport function clearVimPreference(): void {\n  try {\n    readStore()?.removeItem(VIM_MODE_KEY)\n  } catch {\n    /* the next boot reconciles again; nothing here should break editing */\n  }\n}\n\nexport function nowTimestamp(): string {\n  return new Date().toISOString()\n}\n","/** The quieter reminder that replaces the empty state once there's content. */\n\nimport { el, icon } from './dom'\nimport { ICONS } from './icons'\nimport { dismissBanner, isBannerDismissed } from './persistence'\n\nexport interface AnonBanner {\n  element: HTMLElement\n  update: (visible: boolean) => void\n}\n\nexport function createAnonBanner(urls: { login: string; signup: string }): AnonBanner {\n  const dismiss = el('button', {\n    type: 'button',\n    class: 'pasty-banner__dismiss',\n    'aria-label': 'Dismiss',\n  })\n  dismiss.append(icon(ICONS.close, 18))\n\n  const banner = el(\n    'div',\n    { class: 'pasty-banner', role: 'status' },\n    el('span', {}, \"You're editing anonymously.\"),\n    el('a', { href: urls.signup, text: 'Create an account' }),\n    el('span', { class: 'pasty-banner__or', text: 'or' }),\n    el('a', { href: urls.login, text: 'log in' }),\n    el('span', {}, 'to save this document.'),\n    dismiss,\n  )\n  banner.hidden = true\n\n  let dismissed = isBannerDismissed()\n\n  dismiss.addEventListener('click', () => {\n    dismissed = true\n    dismissBanner()\n    banner.hidden = true\n  })\n\n  return {\n    element: banner,\n    update: visible => {\n      banner.hidden = dismissed || !visible\n    },\n  }\n}\n","/**\n * Markdown escaping.\n *\n * Pasty's output is read by humans and by coding agents, so \"technically valid\"\n * isn't enough — it has to be clean. The upstream serializer escapes more than\n * CommonMark requires (`snake_case` becomes `snake\\_case`) and HTML-encodes\n * prose (`Tom & Jerry` becomes `Tom &amp; Jerry`). Both round-trip, and both\n * look wrong when pasted back into an agent.\n *\n * These helpers escape exactly what would otherwise change meaning, and nothing\n * else. The round-trip suite is what keeps that honest.\n */\n\nconst WORD_CHARACTER = /[\\p{L}\\p{N}]/u\n\n/** `&name;`, `&#123;` and `&#x1F;` all decode on re-parse, so they need escaping. */\nconst ENTITY_REFERENCE = /^&(?:[a-zA-Z][a-zA-Z0-9]{1,31}|#\\d{1,7}|#[xX][0-9a-fA-F]{1,6});/\n\n/** `<` only matters when it could open a tag or an autolink. */\nconst TAG_START = /[a-zA-Z/!?]/\n\nfunction isIntraword(text: string, index: number): boolean {\n  const before = text[index - 1]\n  const after = text[index + 1]\n  return (\n    before !== undefined &&\n    after !== undefined &&\n    WORD_CHARACTER.test(before) &&\n    WORD_CHARACTER.test(after)\n  )\n}\n\n/**\n * Escape inline Markdown syntax in a run of plain text.\n *\n * Callers must not apply this to code spans or code block content, where every\n * character is literal.\n */\nexport function escapeInlineMarkdown(text: string): string {\n  let result = ''\n\n  for (let index = 0; index < text.length; index += 1) {\n    const character = text[index]\n\n    switch (character) {\n      case '\\\\':\n      case '`':\n      case '*':\n      case '[':\n        result += `\\\\${character}`\n        break\n      case '_':\n        // Intraword underscores can't open emphasis in CommonMark, which is\n        // why `file_name_here` survives unescaped.\n        result += isIntraword(text, index) ? '_' : '\\\\_'\n        break\n      case '~':\n        result += text[index + 1] === '~' ? '\\\\~' : '~'\n        break\n      case '<':\n        result += TAG_START.test(text[index + 1] ?? '') ? '\\\\<' : '<'\n        break\n      case '&':\n        result += ENTITY_REFERENCE.test(text.slice(index)) ? '\\\\&' : '&'\n        break\n      default:\n        result += character\n    }\n  }\n\n  return result\n}\n\n/**\n * Escape block-level syntax at the start of a line of paragraph text.\n *\n * A paragraph whose text happens to begin `# `, `- `, `1. `, `> ` or `|` would\n * otherwise come back as a heading, a list, a quote or a table. Inline escaping\n * can't fix this: those characters are only structural in this one position.\n */\nexport function escapeLeadingBlockTokens(line: string): string {\n  const match = /^([ \\t]*)(.*)$/.exec(line)\n  if (!match) {\n    return line\n  }\n  const [, indent, rest] = match\n  if (rest === '') {\n    return line\n  }\n\n  const escaped = rest\n    .replace(/^(#{1,6})([ \\t]|$)/, '\\\\$1$2') // ATX heading\n    .replace(/^(-+|\\++)([ \\t]|$)/, '\\\\$1$2') // bullet, thematic break, setext underline\n    .replace(/^(\\d{1,9})([.)])([ \\t]|$)/, '$1\\\\$2$3') // ordered list\n    .replace(/^>/, '\\\\>') // blockquote\n    .replace(/^\\|/, '\\\\|') // table row\n    .replace(/^(=+)[ \\t]*$/, '\\\\$1') // setext underline\n\n  return indent + escaped\n}\n\n/** Apply {@link escapeLeadingBlockTokens} to every line of a rendered paragraph. */\nexport function escapeParagraphLines(markdown: string): string {\n  return markdown.split('\\n').map(escapeLeadingBlockTokens).join('\\n')\n}\n\n/**\n * Escape pipes so a cell stays one cell.\n *\n * GFM only recognises `\\|` as a literal pipe, and the parser converts it back\n * after splitting — including inside code spans, where the backslash disappears\n * too. Anything already escaped is left alone.\n */\nexport function escapeTableCell(text: string): string {\n  let result = ''\n  for (let index = 0; index < text.length; index += 1) {\n    const character = text[index]\n    if (character === '\\\\' && index + 1 < text.length) {\n      result += character + text[index + 1]\n      index += 1\n      continue\n    }\n    result += character === '|' ? '\\\\|' : character\n  }\n  return result\n}\n\n/**\n * Private-use markers standing in for code span delimiters during\n * serialization. See {@link repairCodeSpans}.\n */\nexport const CODE_SPAN_OPEN = '\\uE002'\nexport const CODE_SPAN_CLOSE = '\\uE003'\n\nconst CODE_SPAN_MARKERS = /[\\uE002\\uE003]/g\nconst CODE_SPAN = /\\uE002([\\s\\S]*?)\\uE003/g\nconst ADJACENT_SPANS = /\\uE003\\uE002/g\n\n/** Remove our delimiters from text that came from the user. */\nexport function stripCodeSpanMarkers(text: string): string {\n  return text.replace(CODE_SPAN_MARKERS, '')\n}\n\n/**\n * Turn the marked-up code spans into real ones.\n *\n * The serializer derives a mark's delimiters once, from a synthetic node, so a\n * code span's fence can't depend on its content — but CommonMark says it must:\n * `` a ` b `` needs a longer fence than `npm install`. The Code extension emits\n * private-use markers instead of backticks and this pass, which does see the\n * content, replaces them with a fence that fits.\n */\nexport function repairCodeSpans(markdown: string): string {\n  return markdown\n    .replace(ADJACENT_SPANS, '') // a span the serializer split and reopened\n    .replace(CODE_SPAN, (_match, content: string) => renderCodeSpan(content))\n    .replace(CODE_SPAN_MARKERS, '') // belt and braces: never leak a marker\n}\n\n/**\n * Wrap text in a code span using a fence long enough to contain it, padding\n * when the content would otherwise lose a character to CommonMark's stripping\n * rules.\n */\nexport function renderCodeSpan(content: string): string {\n  if (content === '') {\n    return ''\n  }\n\n  const runs = content.match(/`+/g) ?? []\n  const longestRun = runs.reduce((longest, run) => Math.max(longest, run.length), 0)\n  const fence = '`'.repeat(longestRun + 1)\n\n  const startsAwkward = content.startsWith('`') || content.startsWith(' ')\n  const endsAwkward = content.endsWith('`') || content.endsWith(' ')\n  const padding = startsAwkward || endsAwkward ? ' ' : ''\n\n  return `${fence}${padding}${content}${padding}${fence}`\n}\n","/**\n * The Markdown seam.\n *\n * Everything Pasty knows about turning Markdown into document structure and back\n * lives behind these functions. `editor.ts` installs the Markdown extension; no\n * other module imports `@tiptap/markdown` directly, so the implementation can be\n * swapped without touching the UI.\n */\n\nimport type { Editor, JSONContent } from '@tiptap/core'\nimport type { Slice } from '@tiptap/pm/model'\n\nimport { escapeInlineMarkdown, repairCodeSpans, stripCodeSpanMarkers } from './escapes'\n\n/** Thrown when non-empty input produced an empty document. */\nexport class MarkdownParseError extends Error {\n  constructor(message: string) {\n    super(message)\n    this.name = 'MarkdownParseError'\n  }\n}\n\nconst hardenedManagers = new WeakSet<object>()\n\n/**\n * Replace the serializer's text encoder.\n *\n * `@tiptap/markdown` renders text nodes inside the manager rather than through\n * the Text extension's `renderMarkdown` hook, so this is the only seam\n * available. Its default runs every non-code character through\n * `encodeHtmlEntities`, turning `Tom & Jerry` into `Tom &amp; Jerry` and\n * `a < b` into `a &lt; b`. That re-parses correctly and reads terribly, which\n * is the wrong trade for a tool whose output goes back to a coding agent.\n *\n * Pinned to @tiptap/markdown 3.30.5. If a future version drops the method the\n * patch no-ops back to upstream behavior (uglier, still correct) and\n * `markdown-escaping.test.ts` fails loudly.\n */\nfunction hardenManager(markdown: object): void {\n  const target = markdown as {\n    encodeTextForMarkdown?: (text: string, node: JSONContent, parent?: JSONContent) => string\n    codeTypes?: Set<string>\n  }\n\n  if (typeof target.encodeTextForMarkdown !== 'function') {\n    console.warn('[pasty] Markdown text encoder not found; falling back to default escaping.')\n    return\n  }\n\n  const codeTypes =\n    target.codeTypes instanceof Set ? target.codeTypes : new Set(['code', 'codeBlock'])\n\n  target.encodeTextForMarkdown = (rawText, node, parent) => {\n    // Strip our own delimiters out of user text so the repair pass can't be\n    // fooled by content that happens to contain them.\n    const text = stripCodeSpanMarkers(rawText)\n    const insideCode =\n      (parent?.type != null && codeTypes.has(parent.type)) ||\n      (node?.marks ?? []).some(mark => codeTypes.has(typeof mark === 'string' ? mark : mark.type))\n\n    return insideCode ? text : escapeInlineMarkdown(text)\n  }\n}\n\nfunction manager(editor: Editor) {\n  const markdown = editor.markdown\n  if (!markdown) {\n    throw new MarkdownParseError('The Markdown extension is not installed on this editor.')\n  }\n  if (!hardenedManagers.has(markdown)) {\n    hardenManager(markdown)\n    hardenedManagers.add(markdown)\n  }\n  return markdown\n}\n\nfunction isEmptyDoc(doc: JSONContent): boolean {\n  return !doc.content || doc.content.length === 0\n}\n\n/** Strip trailing blank lines. This is Pasty's canonical form. */\nfunction trimTrailingNewlines(markdown: string): string {\n  return markdown.replace(/[\\r\\n]+$/, '')\n}\n\n/**\n * Markdown -> ProseMirror JSON.\n *\n * Throws rather than returning an empty document, because callers have to be able\n * to fall back to inserting the raw text: silently swallowing a paste is the one\n * outcome the spec rules out.\n */\nexport function parseMarkdown(editor: Editor, markdown: string): JSONContent {\n  const doc = manager(editor).parse(stripCodeSpanMarkers(markdown))\n  if (isEmptyDoc(doc) && markdown.trim() !== '') {\n    throw new MarkdownParseError('Markdown parsed to an empty document.')\n  }\n  return doc\n}\n\n/** The signature that decides whether two neighbouring code marks can share a span. */\nfunction companionMarkSignature(marks: JSONContent['marks']): string {\n  return (marks ?? [])\n    .filter(mark => mark.type !== 'code')\n    .map(mark => `${mark.type}:${JSON.stringify(mark.attrs ?? {})}`)\n    .sort()\n    .join('|')\n}\n\nconst isCodeText = (node: JSONContent): boolean =>\n  node.type === 'text' && (node.marks ?? []).some(mark => mark.type === 'code')\n\n/**\n * Split code spans wherever the marks around them change.\n *\n * GFM cannot nest emphasis inside a code span, so a code run that is only\n * partly bold — reachable by selecting half a span and pressing ⌘B — has no\n * single-span rendering: the serializer would emit `` `make **release** now` ``\n * and the asterisks would re-parse as code text. What the format can say is\n * adjacent spans, `` `make `**`release`**` now` ``, which re-parses to this\n * exact document. The serializer closes and reopens a mark when its attrs\n * change, so tagging each segment's code mark with a serial number is enough\n * to make it split there; uniform runs (almost every document) are left\n * untouched. The tag never renders — code delimiters ignore attrs — and the\n * tagged copy exists only on the way into the serializer.\n */\nfunction splitCodeRunsAtMarkBoundaries(doc: JSONContent): JSONContent {\n  let segment = 0\n\n  const transform = (nodes: JSONContent[]): JSONContent[] => {\n    const out = nodes.map(node =>\n      Array.isArray(node.content) ? { ...node, content: transform(node.content) } : node,\n    )\n\n    for (let start = 0; start < out.length; ) {\n      if (!isCodeText(out[start])) {\n        start += 1\n        continue\n      }\n      let end = start\n      while (end + 1 < out.length && isCodeText(out[end + 1])) {\n        end += 1\n      }\n      const signatures = out\n        .slice(start, end + 1)\n        .map(node => companionMarkSignature(node.marks))\n      if (new Set(signatures).size > 1) {\n        for (let index = start; index <= end; index += 1) {\n          if (index > start && signatures[index - start] !== signatures[index - start - 1]) {\n            segment += 1\n          }\n          out[index] = {\n            ...out[index],\n            marks: out[index].marks!.map(mark =>\n              mark.type === 'code' ? { ...mark, attrs: { ...mark.attrs, segment } } : mark,\n            ),\n          }\n        }\n        segment += 1\n      }\n      start = end + 1\n    }\n\n    return out\n  }\n\n  return Array.isArray(doc.content) ? { ...doc, content: transform(doc.content) } : doc\n}\n\n/** ProseMirror JSON -> canonical Markdown (no trailing newline). */\nexport function serializeDocument(editor: Editor, doc: JSONContent): string {\n  return trimTrailingNewlines(\n    repairCodeSpans(manager(editor).serialize(splitCodeRunsAtMarkBoundaries(doc))),\n  )\n}\n\n/**\n * The whole document as Markdown, newline-terminated the way a file would be.\n * Used for persistence and the Copy Markdown command.\n */\nexport function serializeMarkdown(editor: Editor): string {\n  const markdown = serializeDocument(editor, editor.getJSON())\n  return markdown === '' ? '' : `${markdown}\\n`\n}\n\n/**\n * A selection as Markdown. Never throws: a clipboard hook that throws would break\n * copy entirely, so every failure path degrades to plain text.\n *\n * Open boundary nodes serialize as their own type, so a selection of\n * \"three **things**\" inside a paragraph yields exactly `three **things**`.\n */\nexport function serializeSelection(editor: Editor, slice: Slice): string {\n  try {\n    const fragment = slice.content\n\n    // A partial selection inside a single code block is raw text: nobody wants\n    // half a function body wrapped in fences.\n    if (fragment.childCount === 1 && slice.openStart > 0 && slice.openEnd > 0) {\n      const only = fragment.firstChild\n      if (only && only.type.spec.code) {\n        return only.textContent\n      }\n    }\n\n    const content = fragment.toJSON() as JSONContent[] | null\n    if (!content || content.length === 0) {\n      return ''\n    }\n    return serializeDocument(editor, { type: 'doc', content })\n  } catch {\n    try {\n      return slice.content.textBetween(0, slice.content.size, '\\n\\n')\n    } catch {\n      return ''\n    }\n  }\n}\n\nconst STRONG_SIGNALS: RegExp[] = [\n  /^ {0,3}(?:```|~~~)/m, // fenced code block\n  /^ {0,3}#{1,6}[ \\t]+\\S/m, // ATX heading\n  /^ {0,3}[-*+][ \\t]+\\[[ xX]\\](?:[ \\t]|$)/m, // task list item\n]\n\nconst TABLE_ROW = /^ {0,3}\\|.*\\|[ \\t]*$/\nconst TABLE_DELIMITER = /^ {0,3}\\|?[ \\t]*:?-{1,}:?[ \\t]*(?:\\|[ \\t]*:?-{1,}:?[ \\t]*)+\\|?[ \\t]*$/\n\nconst WEAK_SIGNALS: RegExp[] = [\n  /^ {0,3}[-*+][ \\t]+\\S/m, // bullet list\n  /^ {0,3}\\d{1,9}[.)][ \\t]+\\S/m, // ordered list\n  /^ {0,3}>[ \\t]?\\S/m, // blockquote\n  /(\\*\\*|__)(?!\\s)[^\\n]+?(?<!\\s)\\1/, // bold\n  /\\[[^\\]\\n]+\\]\\([^)\\s\\n]*\\)/, // link\n  /`[^`\\n]+`/, // inline code\n  /^ {0,3}(?:-{3,}|\\*{3,}|_{3,})[ \\t]*$/m, // thematic break\n]\n\n/**\n * Does this plain text look like Markdown?\n *\n * Deliberately biased toward Pasty's audience: agent and IDE output. One\n * unambiguous structural signal is enough; softer signals have to agree with\n * each other before prose gets reinterpreted as syntax.\n */\nexport function detectMarkdown(text: string): boolean {\n  if (!text.trim()) {\n    return false\n  }\n\n  if (STRONG_SIGNALS.some(pattern => pattern.test(text))) {\n    return true\n  }\n\n  if (hasTable(text)) {\n    return true\n  }\n\n  let weak = 0\n  for (const pattern of WEAK_SIGNALS) {\n    if (pattern.test(text)) {\n      weak += 1\n      if (weak >= 2) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\n/** A pipe row immediately followed by a delimiter row: unmistakably a GFM table. */\nfunction hasTable(text: string): boolean {\n  const lines = text.split(/\\r?\\n/)\n  for (let index = 0; index < lines.length - 1; index += 1) {\n    if (TABLE_ROW.test(lines[index]) && TABLE_DELIMITER.test(lines[index + 1])) {\n      return true\n    }\n  }\n  return false\n}\n","/**\n * Copying out.\n *\n * Ordinary Cmd+C runs through ProseMirror's `clipboardTextSerializer` (see\n * `editor.ts`), which covers copy, cut and drag in one place and still lets PM\n * write its own `text/html` — so pasting into Docs or Notion stays rich while\n * pasting into a terminal or an agent gives Markdown.\n *\n * This module owns the explicit copy actions — Copy Markdown, which ignores the\n * selection and takes the whole document, and the share link, whose text is\n * still on its way back from the server when the click happens.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport { serializeMarkdown } from './markdown'\n\n/**\n * Put text on the system clipboard, however this browser will let us.\n *\n * Exported because Vim's `\"+y` has to reach the same clipboard the Copy Markdown\n * button does, including the fallback for origins where the async API is absent.\n */\nexport async function writeClipboardText(text: string): Promise<boolean> {\n  if (navigator.clipboard?.writeText) {\n    try {\n      await navigator.clipboard.writeText(text)\n      return true\n    } catch {\n      // Permission denied, or a non-secure context. Fall through.\n    }\n  }\n  return legacyCopy(text)\n}\n\n/**\n * Put text on the clipboard when the text does not exist yet.\n *\n * Sharing is one click: the POST that mints the link and the clipboard write\n * are the same gesture, but the string only arrives a round trip later — and by\n * then WebKit has stopped believing a user asked for this. `ClipboardItem`\n * takes a *promise* of the payload, which is the platform's own escape hatch:\n * ask during the gesture, deliver when the server answers. It has to be called\n * synchronously from the handler, which is why this takes the promise rather\n * than being awaited.\n *\n * Engines without `ClipboardItem` fall back to waiting and then copying — which\n * works wherever a write outside a gesture is allowed, and reports false where\n * it isn't. Callers must handle false: the link is still created either way.\n */\nexport function writeClipboardTextFromPromise(text: Promise<string>): Promise<boolean> {\n  if (typeof ClipboardItem !== 'undefined' && navigator.clipboard?.write) {\n    const blob = text.then(value => new Blob([value], { type: 'text/plain' }))\n    // The clipboard consumes this rejection, but only once it has the item —\n    // and constructing the item can throw first. Marked handled either way.\n    blob.catch(() => {})\n    try {\n      return navigator.clipboard.write([new ClipboardItem({ 'text/plain': blob })]).then(\n        () => true,\n        () => false,\n      )\n    } catch {\n      // Fall through: this engine won't take a promise for this type.\n    }\n  }\n  return text.then(writeClipboardText, () => false)\n}\n\n/** Works without the async clipboard API (http:// origins, older Safari). */\nfunction legacyCopy(text: string): boolean {\n  const textarea = document.createElement('textarea')\n  textarea.value = text\n  textarea.setAttribute('readonly', '')\n  textarea.style.position = 'fixed'\n  textarea.style.top = '-1000px'\n  textarea.style.opacity = '0'\n  document.body.append(textarea)\n\n  const selection = document.getSelection()\n  const previous = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null\n\n  textarea.select()\n  let copied = false\n  try {\n    copied = document.execCommand('copy')\n  } catch {\n    copied = false\n  }\n\n  textarea.remove()\n  if (previous && selection) {\n    selection.removeAllRanges()\n    selection.addRange(previous)\n  }\n  return copied\n}\n\nexport function copyWholeDocument(editor: Editor): Promise<boolean> {\n  return writeClipboardText(serializeMarkdown(editor))\n}\n","/**\n * Autosave.\n *\n * One request in flight at a time, always carrying the latest state. If a save\n * fails the document is copied to localStorage and retried with backoff, and\n * the status line says so — the editor never blocks and nothing is discarded\n * until the server has confirmed it.\n *\n * **The base revision lives here and nowhere else.** Every write names the\n * revision it was built on; the server accepts only a match. That number is\n * assigned exclusively from server responses — the bootstrap at boot, every\n * accepted write, and `noteRevision` in collab mode — and never from a local\n * increment. A client that guesses its own next revision is a client that can\n * overwrite work it never saw.\n *\n * When the server refuses, this module does not resolve the conflict. It stops,\n * keeps accepting edits, keeps the backup fresh and hands both versions to\n * whoever is going to ask the user.\n */\n\nimport { ApiError, type DocumentWriter, type RequestOptions, type UpdateResult } from './api'\nimport { clearBackup, saveBackup } from './persistence'\nimport type { ConflictDocument, PastyDocument, SaveStatus, StoredDocument } from './types'\n\nconst DEBOUNCE_MS = 1000\nconst RETRY_BASE_MS = 2000\nconst RETRY_MAX_MS = 30000\n/**\n * A live save that another client's updates keep overtaking. Retrying is right —\n * the text is real and somebody has to persist it — but after this many in a row\n * the two clients are chasing each other, and a pause lets one of them win.\n */\nconst BEHIND_LIMIT = 20\nconst BEHIND_BACKOFF_MS = 2000\n/** How long a remote change waits before it is worth a durable write. */\nconst REMOTE_DEBOUNCE_MS = 6000\n\nexport interface ConflictSides {\n  /** The version the server holds, which this save was refused in favour of. */\n  server: ConflictDocument\n  /** The version this tab has, which the server has never seen. */\n  local: StoredDocument\n}\n\nexport interface AutosaveOptions {\n  api: DocumentWriter\n  documentId: string | null\n  /**\n   * Where the local backup lives, when the document id is not a usable name for\n   * it. A guest has no id — the edit link is the address — and a guest's\n   * unsaved work deserves the same safety net as anybody else's.\n   */\n  storageKey?: string\n  /** The revision this page was rendered from. Every later one is a response. */\n  revision: number\n  /** Writes ride on the live session, so a 409 means something different. */\n  collab?: boolean\n  getSnapshot: () => StoredDocument\n  onStatus: (status: SaveStatus) => void\n  onCreated: (document: PastyDocument) => void\n  onAuthLost: () => void\n  onProblem: (message: string | null) => void\n  /** The title is the owner's; a guest's writes carry Markdown only. */\n  sendTitle?: () => boolean\n  /** Both versions exist and only a person can choose. Saving is paused. */\n  onConflict?: (sides: ConflictSides) => void\n  /** The live session ended under us. Saving is paused; the page will reset. */\n  onSessionReset?: () => void\n  /** This document has an edit link now, and this tab is not running one. */\n  onModeChanged?: () => void\n}\n\nexport interface Autosave {\n  schedule: () => void\n  /** Resolves once the work in flight — and anything coalesced into it — lands. */\n  flush: () => Promise<void>\n  /**\n   * Give this document a row, even if it is empty, and answer with its id\n   * (null if the create failed). Sharing is the one caller that needs one:\n   * every other path is happy to wait for the first keystroke.\n   */\n  createIfMissing: () => Promise<string | null>\n  documentId: () => string | null\n  /** The base the next write will name. */\n  revision: () => number\n  /**\n   * A revision this tab learned from the live session rather than from its own\n   * write. Forward-only: an out-of-order poll must never walk the base back.\n   */\n  noteRevision: (revision: number) => void\n  /** `Use latest`: the server's version is the document now. Saving resumes. */\n  adopt: (server: ConflictDocument) => void\n  /** `Keep mine`: write over the conflict, and let the server archive what it\n      displaced. Saving resumes. */\n  keepMine: (server: ConflictDocument) => Promise<void>\n  /** A remote edit arrived. Worth persisting eventually, not immediately. */\n  scheduleRemote: () => void\n  stop: () => void\n}\n\n/** `create`: make a row even for an empty document. See `createIfMissing`. */\ninterface SaveConfig {\n  keepalive?: boolean\n  create?: boolean\n  force?: boolean\n}\n\nfunction isEmpty(snapshot: StoredDocument): boolean {\n  return snapshot.markdown.trim() === '' && snapshot.title.trim() === ''\n}\n\nfunction sameContent(a: StoredDocument, b: StoredDocument): boolean {\n  return a.markdown === b.markdown && a.title === b.title\n}\n\nexport function createAutosave(options: AutosaveOptions): Autosave {\n  let documentId = options.documentId\n  let revision = options.revision\n  let debounceTimer: number | undefined\n  let retryTimer: number | undefined\n  let retryDelay = RETRY_BASE_MS\n  let inFlight = false\n  /** The run in flight, so a caller can wait for it. See `save` and `flush`. */\n  let running: Promise<void> | null = null\n  let pending = false\n  let lastSaved: StoredDocument | null = null\n  let csrfRetried = false\n  let stopped = false\n  /**\n   * A conflict is on screen. Edits keep landing and the backup keeps being\n   * written; what stops is talking to the server, because there is nothing left\n   * to say until someone chooses.\n   */\n  let paused = false\n  let behindStreak = 0\n  /** Set when a coalesced caller asked for keepalive; consumed by the run loop. */\n  let pendingKeepalive = false\n\n  const setStatus = (status: SaveStatus) => options.onStatus(status)\n  const sendTitle = () => options.sendTitle?.() ?? true\n  /** The id under which this document's backup is kept; see `storageKey`. */\n  const backupKey = () => options.storageKey ?? documentId\n\n  const clearTimers = () => {\n    window.clearTimeout(debounceTimer)\n    window.clearTimeout(retryTimer)\n    debounceTimer = undefined\n    retryTimer = undefined\n  }\n\n  const schedule = () => {\n    if (stopped || paused) {\n      return\n    }\n    setStatus('unsaved')\n    window.clearTimeout(debounceTimer)\n    debounceTimer = window.setTimeout(fire, DEBOUNCE_MS)\n  }\n\n  /** Cleared on the way out, so `scheduleRemote` can tell \"armed\" from \"fired\". */\n  function fire(): void {\n    debounceTimer = undefined\n    void save()\n  }\n\n  /**\n   * Somebody else typed. The text is already safe in the CRDT and on its way to\n   * every other client, so this is only about the durable Markdown — and a\n   * gentler debounce, because a whole conversation of remote edits does not\n   * deserve a write per keystroke.\n   */\n  const scheduleRemote = () => {\n    // A local edit already pending beats this: it is the more urgent deadline,\n    // and it will write the remote text along with everything else.\n    if (stopped || paused || debounceTimer !== undefined) {\n      return\n    }\n    debounceTimer = window.setTimeout(fire, REMOTE_DEBOUNCE_MS)\n  }\n\n  /**\n   * Save now, and let the caller wait for it. Navigation used to be slow enough\n   * that fire-and-forget was fine; the command palette makes switching documents\n   * a keystroke, which is fast enough to outrun a save in flight.\n   */\n  const flush = (): Promise<void> => {\n    if (stopped || paused) {\n      // Paused means a person is being asked a question. Flushing past it would\n      // answer that question for them, in favour of whoever typed last.\n      return Promise.resolve()\n    }\n    window.clearTimeout(debounceTimer)\n    return save({ keepalive: true })\n  }\n\n  /**\n   * A row for a document that hasn't earned one yet.\n   *\n   * The rule below — an untouched blank document doesn't deserve a row — is\n   * about documents nobody asked to keep. Clicking Share *is* asking: if it is\n   * on screen, it can be shared, and an empty page is a legitimate thing to\n   * hand someone. So this is the one caller that passes `create`.\n   */\n  const createIfMissing = async (): Promise<string | null> => {\n    if (documentId === null) {\n      await save({ keepalive: true, create: true })\n    }\n    return documentId\n  }\n\n  const retryLater = (delay = retryDelay) => {\n    window.clearTimeout(retryTimer)\n    retryTimer = window.setTimeout(() => {\n      retryTimer = undefined\n      void save()\n    }, delay)\n    retryDelay = Math.min(retryDelay * 2, RETRY_MAX_MS)\n  }\n\n  /** Stop talking to the server, keep taking dictation. */\n  const pause = (status: SaveStatus) => {\n    paused = true\n    clearTimers()\n    setStatus(status)\n  }\n\n  function save(config: SaveConfig = {}): Promise<void> {\n    if (stopped || (paused && !config.force)) {\n      return Promise.resolve()\n    }\n    if (inFlight) {\n      // Coalesce: whatever changed during this request goes out in the next pass\n      // of the loop below. Returning that run's promise rather than nothing is\n      // what lets `flush()` mean \"my work has landed\" instead of \"I asked\".\n      pending = true\n      // A keepalive request is the last one this page will ever make; the run it\n      // coalesces into has to inherit that, or the follow-up dies with the tab.\n      if (config.keepalive) {\n        pendingKeepalive = true\n      }\n      return running ?? Promise.resolve()\n    }\n\n    inFlight = true\n    running = runSave(config).finally(() => {\n      inFlight = false\n      running = null\n    })\n    return running\n  }\n\n  async function runSave(config: SaveConfig): Promise<void> {\n    // `create` is this module's business, not the request's.\n    let keepalive = config.keepalive ?? false\n    let force = config.force ?? false\n\n    // A loop rather than recursion, so one run covers its own follow-ups: two\n    // concurrent creates would mean two documents, and a caller awaiting this\n    // run would otherwise only be awaiting the first request of it.\n    let again = true\n    while (again) {\n      again = false\n      keepalive = keepalive || pendingKeepalive\n      pendingKeepalive = false\n      const request: RequestOptions = { keepalive }\n      const snapshot = options.getSnapshot()\n\n      if (!force && lastSaved && sameContent(lastSaved, snapshot)) {\n        setStatus('saved')\n        break\n      }\n\n      // An untouched blank document doesn't deserve a row in the database —\n      // unless someone has asked for one by name (see createIfMissing).\n      if (!documentId && isEmpty(snapshot) && !config.create) {\n        setStatus('idle')\n        break\n      }\n\n      pending = false\n      setStatus('saving')\n      // Before the request, always: a save that never returns leaves no error\n      // to react to, and this is the copy the next boot offers back.\n      const key = backupKey()\n      if (key) {\n        saveBackup(key, { ...snapshot, revision })\n      }\n\n      try {\n        if (documentId || !options.api.create) {\n          const result = await options.api.update(\n            documentId,\n            {\n              ...(sendTitle() ? { title: snapshot.title } : {}),\n              markdown: snapshot.markdown,\n              revision,\n              ...(force ? { force: true } : {}),\n            },\n            request,\n          )\n          adoptResult(result)\n        } else {\n          const created = await options.api.create(\n            { title: snapshot.title, markdown: snapshot.markdown },\n            request,\n          )\n          documentId = created.id\n          revision = created.revision\n          options.onCreated(created)\n        }\n\n        force = false\n        lastSaved = snapshot\n        retryDelay = RETRY_BASE_MS\n        csrfRetried = false\n        behindStreak = 0\n        options.onProblem(null)\n        const saved = backupKey()\n        if (saved) {\n          clearBackup(saved)\n        }\n\n        const current = options.getSnapshot()\n        if (pending || !sameContent(current, snapshot)) {\n          again = true\n          continue\n        }\n        setStatus('saved')\n      } catch (error) {\n        again = handleFailure(error, snapshot)\n        force = false\n      }\n    }\n  }\n\n  /** What a successful write teaches this tab. */\n  function adoptResult(result: UpdateResult): void {\n    if (typeof result.revision === 'number') {\n      revision = result.revision\n    }\n    if (result.editable === true) {\n      // This document grew an edit link while this tab was running the plain\n      // editor. It cannot join the session in place; the page has to reload.\n      options.onModeChanged?.()\n    }\n  }\n\n  /** Returns true when the save should be retried straight away. */\n  function handleFailure(error: unknown, snapshot: StoredDocument): boolean {\n    const key = backupKey()\n    if (key) {\n      saveBackup(key, { ...snapshot, revision })\n    }\n\n    if (error instanceof ApiError) {\n      if (error.status === 401) {\n        stopped = true\n        clearTimers()\n        setStatus('unsaved')\n        options.onAuthLost()\n        return false\n      }\n\n      if (error.status === 403 && !csrfRetried) {\n        // A rotated CSRF token. api.ts re-reads the cookie on every request, so\n        // one immediate retry is all this needs.\n        csrfRetried = true\n        return true\n      }\n\n      if (error.status === 409) {\n        return handleConflict(error, snapshot)\n      }\n\n      if (error.status === 410) {\n        // The live session ended. Nothing is lost — the text is still here and\n        // still backed up — but this tab has to be rebuilt around a new one.\n        pause('unsaved')\n        options.onSessionReset?.()\n        return false\n      }\n\n      if (error.status === 413) {\n        setStatus('unsaved')\n        options.onProblem('This document is too large to save.')\n        return false\n      }\n\n      if (error.status === 400 && error.fields?.revision) {\n        // The client and the server disagree about what a revision even is,\n        // which no retry can fix.\n        setStatus('unsaved')\n        options.onProblem('This page is out of date. Reload to keep saving.')\n        return false\n      }\n\n      if (error.status >= 400 && error.status < 500) {\n        setStatus('unsaved')\n        options.onProblem(error.message)\n        return false\n      }\n    }\n\n    setStatus('offline')\n    options.onProblem(\"Couldn't reach the server. Retrying — your work is safe in this browser.\")\n    retryLater()\n    return false\n  }\n\n  /**\n   * A refusal, and the three quite different things it can mean.\n   */\n  function handleConflict(error: ApiError, snapshot: StoredDocument): boolean {\n    if (error.code === 'behind') {\n      // Live mode: somebody else's updates landed between the snapshot and the\n      // request. Nothing is wrong — re-derive from the merged document and try\n      // again. Two clients typing continuously can do this a lot, so a streak\n      // eventually buys everyone a pause.\n      behindStreak += 1\n      if (behindStreak < BEHIND_LIMIT) {\n        return true\n      }\n      behindStreak = 0\n      setStatus('unsaved')\n      retryLater(BEHIND_BACKOFF_MS)\n      return false\n    }\n\n    const server = error.document\n    if (server && server.markdown === snapshot.markdown && server.title === snapshot.title) {\n      // The server already holds exactly what this tab was trying to send —\n      // another tab of ours, or a retry whose first attempt actually landed.\n      // Nothing to ask anybody: adopt the revision and carry on.\n      revision = server.revision\n      lastSaved = snapshot\n      const key = backupKey()\n      if (key) {\n        clearBackup(key)\n      }\n      setStatus('saved')\n      return false\n    }\n\n    pause('conflict')\n    if (server) {\n      options.onConflict?.({ server, local: snapshot })\n    } else {\n      // A 409 with no document to show. Nothing can be offered, so say the\n      // truthful minimum rather than inventing a choice.\n      options.onProblem('This document changed somewhere else. Reload to keep saving.')\n    }\n    return false\n  }\n\n  return {\n    schedule,\n    scheduleRemote,\n    flush,\n    createIfMissing,\n    documentId: () => documentId,\n    revision: () => revision,\n    noteRevision: next => {\n      if (options.collab && next > revision) {\n        revision = next\n      }\n    },\n    adopt: server => {\n      // The caller has replaced the editor's content with the server's. From\n      // here that *is* the document, so it is both the base and the last saved\n      // state — anything else would make the very next keystroke a conflict.\n      revision = server.revision\n      lastSaved = { title: server.title, markdown: server.markdown, updated_at: server.updated_at }\n      paused = false\n      behindStreak = 0\n      const key = backupKey()\n      if (key) {\n        clearBackup(key)\n      }\n      setStatus('saved')\n    },\n    keepMine: server => {\n      revision = server.revision\n      lastSaved = null\n      paused = false\n      behindStreak = 0\n      window.clearTimeout(debounceTimer)\n      return save({ keepalive: true, force: true })\n    },\n    stop: () => {\n      stopped = true\n      clearTimers()\n    },\n  }\n}\n","/**\n * Base64 for the bytes Yjs speaks in.\n *\n * `btoa` takes a string, so every byte has to become a character first — and\n * `String.fromCharCode(...bytes)` on a whole document blows the argument limit\n * and throws. Hence the chunking: it is not an optimisation, it is the reason\n * this works on documents larger than a paragraph.\n */\n\nconst CHUNK = 0x8000\n\nexport function toBase64(bytes: Uint8Array): string {\n  let binary = ''\n  for (let index = 0; index < bytes.length; index += CHUNK) {\n    binary += String.fromCharCode(...bytes.subarray(index, index + CHUNK))\n  }\n  return btoa(binary)\n}\n\nexport function fromBase64(value: string): Uint8Array {\n  const binary = atob(value)\n  const bytes = new Uint8Array(binary.length)\n  for (let index = 0; index < binary.length; index += 1) {\n    bytes[index] = binary.charCodeAt(index)\n  }\n  return bytes\n}\n","/**\n * Seeding a shared document, deterministically.\n *\n * The hazard this exists to remove: two people open the same document at the\n * same moment, both find no session, and both seed one. If their seeds are two\n * different Yjs updates, the merge is the *union* of two copies of the text —\n * every paragraph twice — and nothing later can undo that.\n *\n * So the seed is made a function of the content and nothing else. Its client id\n * is a hash of the parsed ProseMirror JSON, which makes two clients seeding the\n * same Markdown produce byte-identical updates that Yjs deduplicates by\n * construction. Two clients seeding *different* content (a deploy changed the\n * parser mid-session, say) get different client ids, which cannot be confused\n * for each other either — the server's `seed_hash` catches that case and the\n * joiner rebuilds rather than merging.\n *\n * The JSON comes from parsing the bootstrap Markdown, never from live editor\n * state: editor state includes whatever the user has already typed, which is by\n * definition not what the other client is seeding from.\n */\n\nimport type { Schema } from '@tiptap/pm/model'\nimport { prosemirrorJSONToYXmlFragment } from '@tiptap/y-tiptap'\nimport * as Y from 'yjs'\n\n/** Applied with this so the seed is neither undoable nor pushed to the server. */\nexport const SEED_ORIGIN = Symbol('pasty:seed')\n\n/**\n * FNV-1a over the UTF-8 bytes. Not cryptographic and doesn't need to be: a\n * collision would mean two different documents seeding as the same client, and\n * the seed hash the server keeps is a sha256 that would catch it.\n */\nexport function hashToUint32(value: string): number {\n  const bytes = new TextEncoder().encode(value)\n  let hash = 0x811c9dc5\n  for (const byte of bytes) {\n    hash ^= byte\n    // >>> 0 keeps it an unsigned 32-bit value; Math.imul does the wrapping\n    // multiply that the algorithm is defined in terms of.\n    hash = Math.imul(hash, 0x01000193) >>> 0\n  }\n  return hash >>> 0\n}\n\nexport interface Seed {\n  bytes: Uint8Array\n  clientId: number\n  /** The clock this client id reached, so a joiner can look for it in a state vector. */\n  clock: number\n  /** The document revision this seed describes. */\n  revision: number\n}\n\n/** A seed carrying the digest the server stores, so the two can be compared. */\nexport interface HashedSeed extends Seed {\n  hashHex: string\n}\n\n/** An empty document still needs one paragraph, or the schema rejects it. */\nfunction seedContent(json: Record<string, unknown>): Record<string, unknown> {\n  const content = json.content as unknown[] | undefined\n  if (Array.isArray(content) && content.length > 0) {\n    return json\n  }\n  return { ...json, content: [{ type: 'paragraph' }] }\n}\n\nexport function buildSeed(\n  schema: Schema,\n  json: Record<string, unknown>,\n  revision: number,\n): Seed {\n  const content = seedContent(json)\n  const doc = new Y.Doc()\n  // Before the fragment is written, not after: the client id is stamped onto\n  // every item created from here on, and that stamping is what makes two\n  // identical seeds identical bytes. `|| 1` because 0 is a legal hash and an\n  // illegal client id.\n  doc.clientID = hashToUint32(JSON.stringify(content)) || 1\n  prosemirrorJSONToYXmlFragment(schema, content, doc.getXmlFragment('default'))\n\n  const bytes = Y.encodeStateAsUpdate(doc)\n  const clock = Y.decodeStateVector(Y.encodeStateVector(doc)).get(doc.clientID) ?? 0\n  const clientId = doc.clientID\n  doc.destroy()\n  return { bytes, clientId, clock, revision }\n}\n\n/** Hex sha256, to compare with the `seed_hash` the server stored. */\nexport async function sha256Hex(bytes: Uint8Array): Promise<string> {\n  const digest = await crypto.subtle.digest('SHA-256', bytes as unknown as ArrayBuffer)\n  return Array.from(new Uint8Array(digest))\n    .map(byte => byte.toString(16).padStart(2, '0'))\n    .join('')\n}\n\nexport async function hashSeed(seed: Seed): Promise<HashedSeed> {\n  return { ...seed, hashHex: await sha256Hex(seed.bytes) }\n}\n\n/**\n * Is this seed already inside that state?\n *\n * The state vector says how far each client id has got. If the session has\n * never heard of our seeding client — or has heard less of it than we hold —\n * then the session was built from something else, and merging ours in would\n * duplicate the document rather than join it.\n */\nexport function stateContainsSeed(state: Uint8Array, seed: Seed): boolean {\n  const doc = new Y.Doc()\n  try {\n    Y.applyUpdate(doc, state)\n    const vector = Y.decodeStateVector(Y.encodeStateVector(doc))\n    return (vector.get(seed.clientId) ?? 0) >= seed.clock\n  } catch {\n    return false\n  } finally {\n    doc.destroy()\n  }\n}\n","/**\n * The live session, over HTTP short polling.\n *\n * Polling, not WebSockets, because the deployment is one gunicorn WSGI replica\n * with three sync workers and no Redis: a socket would need a different server\n * and a different Dockerfile, and a long-poll would pin a worker per editor.\n * The cost is latency measured in a fraction of a second, and the whole of that\n * decision is contained in this file — swapping the transport later means\n * rewriting `join` and `tick` and nothing else.\n *\n * Three rules hold everywhere below:\n *\n * **Nothing is dropped because a request failed.** Updates that were in flight\n * go back on the queue and into localStorage, so a reload mid-outage still has\n * them. They are replayed on the next successful join.\n *\n * **Nothing is merged that should not be.** A session whose seed disagrees with\n * ours, or whose id changed under us, is not something to reconcile — it is a\n * different document, and joining it would interleave two copies of the text.\n * Those cases stop and ask the page to reset, visibly.\n *\n * **The cadence follows the room.** Alone, four seconds; with company, seven\n * hundred milliseconds; hidden, fifteen. A tab nobody is looking at should not\n * cost what a conversation costs.\n */\n\nimport { ApiError, type CollabApi, type UpdateResult } from '../api'\nimport {\n  clearPendingUpdates,\n  loadPendingUpdates,\n  savePendingUpdates,\n} from '../persistence'\nimport type { CollabBootstrap, CollabUser, CollabWrite, WriteResult } from '../types'\nimport { fromBase64, toBase64 } from './codec'\nimport { stateContainsSeed, type HashedSeed } from './seed'\n\nimport { applyAwarenessUpdate, encodeAwarenessUpdate, removeAwarenessStates } from 'y-protocols/awareness'\nimport type { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\n/** Ours, so `doc.on('update')` can tell what to send from what just arrived. */\nexport const PROVIDER_ORIGIN = Symbol('pasty:provider')\n/** The bootstrap state, applied before the editor exists. */\nexport const BOOTSTRAP_ORIGIN = Symbol('pasty:bootstrap')\n\n/** How long a local edit waits for its neighbours before it is sent. */\nconst PUSH_DELAY = 250\nconst AWARENESS_THROTTLE = 200\n/** Someone else is here: poll fast enough that typing feels shared. */\nconst POLL_PEERS = 700\n/** Alone: the session is a place to save to, not a conversation. */\nconst POLL_ALONE = 4000\n/** Hidden: still connected, still cheap. */\nconst POLL_HIDDEN = 15000\nconst BACKOFF_BASE = 1000\nconst BACKOFF_MAX = 15000\n/** How many times a join may fail before this page gives up on the live layer. */\nconst JOIN_ATTEMPTS = 4\n/**\n * Chromium's keepalive budget is 64 KiB across all in-flight requests. A\n * departing tab's last sync has to fit, so a large Markdown write is dropped\n * from it rather than taking the awareness cleanup down with it.\n */\nconst KEEPALIVE_BUDGET = 60 * 1024\n\nexport type ProviderStatus = 'connecting' | 'live' | 'reconnecting' | 'stopped'\nexport type ResetReason = 'session_gone' | 'seed_mismatch' | 'stale_revision'\n\nexport interface ProviderEvents {\n  status: ProviderStatus\n  revision: number\n  peers: number\n  identity: CollabUser\n  reset: { reason: ResetReason }\n  /** The edit link was revoked. There is nothing to reconnect to. */\n  gone: void\n  /** The live layer could not start. The page keeps editing without it. */\n  unavailable: void\n}\n\ntype Listener<K extends keyof ProviderEvents> = (payload: ProviderEvents[K]) => void\n\nexport interface Timers {\n  setTimeout: (handler: () => void, delay: number) => number\n  clearTimeout: (handle: number | undefined) => void\n}\n\nexport interface ProviderOptions {\n  doc: Y.Doc\n  awareness: Awareness\n  transport: CollabApi\n  bootstrap: CollabBootstrap\n  /** Present when this client built the seed; absent when it joined one. */\n  seed: HashedSeed | null\n  /** The document revision as this page understands it right now. */\n  revision: () => number\n  hidden?: () => boolean\n  timers?: Timers\n}\n\nexport interface PollingProvider {\n  start: () => void\n  stop: () => void\n  status: () => ProviderStatus\n  session: () => string | null\n  peers: () => number\n  /** Save Markdown through the session. Resolves when the server accepted it. */\n  write: (input: CollabWrite) => Promise<UpdateResult>\n  /** The page is going away: say goodbye, in one keepalive request. */\n  leave: () => void\n  /** The tab became hidden or visible; the cadence and presence follow. */\n  setHidden: (hidden: boolean) => void\n  on: <K extends keyof ProviderEvents>(event: K, listener: Listener<K>) => void\n  /** Testing and the Playwright bridge: stop trying and fall back now. */\n  giveUp: () => void\n}\n\n/**\n * A Markdown write waiting for the next sync, and everyone waiting on it.\n *\n * Waiters accumulate rather than superseding each other: a newer snapshot\n * replaces the older *text*, but the caller who asked first still deserves an\n * answer, and the newer write is a superset of what they wanted saved.\n */\ninterface PendingWrite {\n  input: CollabWrite\n  waiters: { resolve: (result: UpdateResult) => void; reject: (error: unknown) => void }[]\n}\n\nexport function createProvider(options: ProviderOptions): PollingProvider {\n  const timers: Timers = options.timers ?? {\n    setTimeout: (handler, delay) => window.setTimeout(handler, delay),\n    clearTimeout: handle => window.clearTimeout(handle),\n  }\n  const { doc, awareness, transport } = options\n\n  const listeners = new Map<keyof ProviderEvents, Listener<never>[]>()\n  let status: ProviderStatus = 'connecting'\n  let session: string | null = null\n  let seq = 0\n  let stopped = false\n  let hidden = options.hidden?.() ?? false\n  let inFlight = false\n  let timer: number | undefined\n  let backoff = BACKOFF_BASE\n  let joinFailures = 0\n  /** Local updates waiting for the next push, newest last. */\n  let outbox: Uint8Array[] = []\n  let pendingAwareness: Uint8Array | null = null\n  let awarenessTimer: number | undefined\n  /** Queued, not yet sent. */\n  let pendingWrite: PendingWrite | null = null\n  /** Sent, awaiting an answer. Kept apart so a write during flight queues cleanly. */\n  let sentWrite: PendingWrite | null = null\n  let peers = 0\n  let identity: CollabUser | null = null\n\n  const emit = <K extends keyof ProviderEvents>(event: K, payload: ProviderEvents[K]) => {\n    for (const listener of listeners.get(event) ?? []) {\n      ;(listener as Listener<K>)(payload)\n    }\n  }\n\n  const setStatus = (next: ProviderStatus) => {\n    if (status !== next) {\n      status = next\n      emit('status', next)\n    }\n  }\n\n  // --- the Yjs side --------------------------------------------------------\n\n  const onDocUpdate = (update: Uint8Array, origin: unknown) => {\n    // Anything we applied ourselves is already known to the server (or, for the\n    // seed, deliberately never sent as our own contribution).\n    if (origin === PROVIDER_ORIGIN || origin === BOOTSTRAP_ORIGIN) {\n      return\n    }\n    outbox.push(update)\n    schedule(PUSH_DELAY)\n  }\n\n  const onAwarenessUpdate = (\n    changes: { added: number[]; updated: number[]; removed: number[] },\n    origin: unknown,\n  ) => {\n    if (origin === PROVIDER_ORIGIN) {\n      return\n    }\n    const ids = [...changes.added, ...changes.updated, ...changes.removed]\n    pendingAwareness = encodeAwarenessUpdate(awareness, ids)\n    if (awarenessTimer === undefined) {\n      awarenessTimer = timers.setTimeout(() => {\n        awarenessTimer = undefined\n        schedule(0)\n      }, AWARENESS_THROTTLE)\n    }\n  }\n\n  const applyRemote = (updates: string[]) => {\n    for (const update of updates) {\n      Y.applyUpdate(doc, fromBase64(update), PROVIDER_ORIGIN)\n    }\n  }\n\n  const applyAwareness = (updates: string[]) => {\n    for (const update of updates) {\n      applyAwarenessUpdate(awareness, fromBase64(update), PROVIDER_ORIGIN)\n    }\n    const next = awareness.getStates().size - 1\n    if (next !== peers) {\n      peers = Math.max(next, 0)\n      emit('peers', peers)\n    }\n  }\n\n  // --- scheduling ----------------------------------------------------------\n\n  const cadence = (): number => {\n    if (hidden) {\n      return POLL_HIDDEN\n    }\n    return peers > 0 ? POLL_PEERS : POLL_ALONE\n  }\n\n  const schedule = (delay: number) => {\n    if (stopped) {\n      return\n    }\n    timers.clearTimeout(timer)\n    timer = timers.setTimeout(() => {\n      timer = undefined\n      // Without a session there is nothing to sync *to*: a retry after a failed\n      // join, or after a 410, has to be another join.\n      void (session === null ? join() : tick())\n    }, delay)\n  }\n\n  /** Everything queued, merged into one update. Yjs is happy to take them as\n      one and the server counts bytes, not intentions. */\n  const takeOutbox = (): string[] => {\n    if (outbox.length === 0) {\n      return []\n    }\n    const merged = outbox.length === 1 ? outbox[0] : Y.mergeUpdates(outbox)\n    outbox = []\n    return [toBase64(merged)]\n  }\n\n  /** A failed push goes back on the queue, and into storage in case of a reload. */\n  const requeue = (updates: string[]) => {\n    for (const update of updates.reverse()) {\n      outbox.unshift(fromBase64(update))\n    }\n    if (session) {\n      savePendingUpdates(session, outbox.map(toBase64))\n    }\n  }\n\n  // --- joining -------------------------------------------------------------\n\n  const join = async (): Promise<void> => {\n    const bootstrap = options.bootstrap\n    const seed = options.seed\n    try {\n      const response = await transport.join({\n        revision: options.revision(),\n        seed_revision: seed?.revision ?? options.revision(),\n        // A page that came with a session has no seed to offer, and the server\n        // ignores one anyway once a session exists.\n        seed: seed ? toBase64(seed.bytes) : null,\n        client_id: doc.clientID,\n        awareness: encodeLocalAwareness(),\n      })\n\n      if (bootstrap.session !== null && response.session !== bootstrap.session) {\n        // The session this page was rendered around is gone and another has\n        // taken its place. Our local document describes the old one.\n        return reset('session_gone')\n      }\n      if (seed && !seedMatches(response.seed_hash, response.state, seed)) {\n        // Somebody else seeded this session from different content. Merging\n        // would put two documents on top of each other; a visible reset would\n        // not.\n        return reset('seed_mismatch')\n      }\n\n      session = response.session\n      seq = response.seq\n      joinFailures = 0\n      backoff = BACKOFF_BASE\n      Y.applyUpdate(doc, fromBase64(response.state), PROVIDER_ORIGIN)\n      identity = response.you\n      awareness.setLocalStateField('user', response.you)\n      emit('identity', response.you)\n      emit('revision', response.revision)\n      applyAwareness(response.awareness)\n\n      // Bytes from a previous life of this tab that never reached the server.\n      const stranded = loadPendingUpdates(session)\n      if (stranded.length > 0) {\n        requeue(stranded)\n        clearPendingUpdates(session)\n      }\n\n      setStatus('live')\n      schedule(outbox.length > 0 ? 0 : cadence())\n    } catch (error) {\n      if (error instanceof ApiError) {\n        if (error.status === 409) {\n          // The document moved on without this page: its seed describes text\n          // the server has already replaced.\n          return reset('stale_revision')\n        }\n        if (error.status === 403 || error.status === 404) {\n          return gone()\n        }\n      }\n      joinFailures += 1\n      if (joinFailures >= JOIN_ATTEMPTS) {\n        return giveUp()\n      }\n      setStatus('reconnecting')\n      schedule(nextBackoff())\n    }\n  }\n\n  const seedMatches = (hash: string, state: string, seed: HashedSeed): boolean => {\n    // Two checks, because either alone can be fooled: the hash says the session\n    // was seeded from our bytes, and the state vector says those bytes are\n    // actually still in it.\n    return (\n      hash === seed.hashHex && stateContainsSeed(fromBase64(state), seed)\n    )\n  }\n\n  const encodeLocalAwareness = (): string | null => {\n    const local = awareness.getLocalState()\n    if (!local) {\n      return null\n    }\n    return toBase64(encodeAwarenessUpdate(awareness, [awareness.clientID]))\n  }\n\n  // --- syncing -------------------------------------------------------------\n\n  const tick = async (): Promise<void> => {\n    if (stopped || inFlight || session === null) {\n      return\n    }\n    inFlight = true\n    const updates = takeOutbox()\n    const write = pendingWrite\n    sentWrite = write\n    pendingWrite = null\n    const presence = pendingAwareness\n    pendingAwareness = null\n\n    try {\n      const response = await transport.sync({\n        session,\n        client_id: doc.clientID,\n        since: seq,\n        updates,\n        awareness: presence ? toBase64(presence) : null,\n        leaving: false,\n        ...(write ? { write: write.input } : {}),\n      })\n\n      seq = response.seq\n      if (response.state !== undefined) {\n        // This client fell out of the replay window; the whole document instead.\n        Y.applyUpdate(doc, fromBase64(response.state), PROVIDER_ORIGIN)\n      } else {\n        applyRemote(response.updates ?? [])\n      }\n      applyAwareness(response.awareness)\n      emit('revision', response.revision)\n      if (session) {\n        clearPendingUpdates(session)\n      }\n\n      if (write) {\n        sentWrite = null\n        settleWrite(write, response.write)\n      }\n      backoff = BACKOFF_BASE\n      setStatus('live')\n      schedule(outbox.length > 0 || pendingWrite !== null ? PUSH_DELAY : cadence())\n    } catch (error) {\n      requeue(updates)\n      if (presence) {\n        pendingAwareness = presence\n      }\n      sentWrite = null\n\n      if (error instanceof ApiError) {\n        if (error.status === 410) {\n          // The session ended. One rejoin with the same seed, because the\n          // ordinary cause is a session that was replaced a moment ago — and\n          // the write goes back in the queue for whatever session follows.\n          requeueWrite(write)\n          session = null\n          setStatus('connecting')\n          inFlight = false\n          return void join()\n        }\n        if (error.status === 403 || error.status === 404) {\n          // The edit link is gone. There is nothing to reconnect to and nothing\n          // this write can be sent through.\n          rejectWrite(write, error)\n          return gone()\n        }\n        if (error.status >= 400 && error.status < 500) {\n          // A body this client cannot fix by repeating it. Give the write back\n          // to autosave, which knows how to tell the user.\n          rejectWrite(write, error)\n          setStatus('reconnecting')\n          schedule(nextBackoff())\n          return\n        }\n      }\n      // A network failure or a 5xx: the request, not the content, is what\n      // failed. Keep the write and send it again.\n      requeueWrite(write)\n      setStatus('reconnecting')\n      schedule(nextBackoff())\n    } finally {\n      inFlight = false\n    }\n  }\n\n  const settleWrite = (write: PendingWrite, result: WriteResult | null) => {\n    if (result === null) {\n      rejectWrite(write, new Error('The server did not answer the write.'))\n      return\n    }\n    if (!result.accepted) {\n      // Somebody's updates landed between the snapshot and this request. Not an\n      // error: autosave re-derives the Markdown from the merged document and\n      // sends it again.\n      rejectWrite(\n        write,\n        new ApiError(409, { code: 'behind', message: 'Re-deriving from the merged document.' }),\n      )\n      return\n    }\n    for (const waiter of write.waiters) {\n      waiter.resolve({ revision: result.revision, updated_at: result.updated_at })\n    }\n  }\n\n  const rejectWrite = (write: PendingWrite | null, error: unknown) => {\n    for (const waiter of write?.waiters ?? []) {\n      waiter.reject(error)\n    }\n  }\n\n  /** A write whose request failed, back at the front of the queue. */\n  const requeueWrite = (write: PendingWrite | null) => {\n    if (!write) {\n      return\n    }\n    if (pendingWrite) {\n      // A newer snapshot arrived while this one was in flight. Its text wins —\n      // it is the later one — and this write's waiters ride along with it.\n      pendingWrite.waiters.unshift(...write.waiters)\n      return\n    }\n    pendingWrite = write\n  }\n\n  const nextBackoff = (): number => {\n    const delay = backoff\n    backoff = Math.min(backoff * 2, BACKOFF_MAX)\n    return delay\n  }\n\n  // --- ending --------------------------------------------------------------\n\n  const reset = (reason: ResetReason) => {\n    stop()\n    emit('reset', { reason })\n  }\n\n  const gone = () => {\n    stop()\n    emit('gone', undefined)\n  }\n\n  const giveUp = () => {\n    stop()\n    emit('unavailable', undefined)\n  }\n\n  function stop(): void {\n    if (stopped) {\n      return\n    }\n    stopped = true\n    timers.clearTimeout(timer)\n    timers.clearTimeout(awarenessTimer)\n    doc.off('update', onDocUpdate)\n    awareness.off('update', onAwarenessUpdate)\n    setStatus('stopped')\n  }\n\n  const leave = () => {\n    if (session === null || stopped) {\n      return\n    }\n    const target = session\n    // Locally first, so this tab's own chip disappears even if the request\n    // never lands.\n    removeAwarenessStates(awareness, [awareness.clientID], PROVIDER_ORIGIN)\n    const updates = takeOutbox()\n    // Saved before the request, not after: this page is going away, and a\n    // keepalive that does not make it must still leave the bytes behind.\n    if (updates.length > 0) {\n      savePendingUpdates(target, updates)\n    }\n    const write = (pendingWrite ?? sentWrite)?.input\n    const body = {\n      session: target,\n      client_id: doc.clientID,\n      since: seq,\n      updates,\n      awareness: toBase64(encodeAwarenessUpdate(awareness, [awareness.clientID])),\n      leaving: true,\n      ...(write ? { write } : {}),\n    }\n    const payload = JSON.stringify(body)\n    const send =\n      payload.length > KEEPALIVE_BUDGET && write\n        ? // Over the budget with the Markdown in it. The updates and the\n          // goodbye are what the other editors need; the Markdown is already\n          // safe in the session and the next client to sync will persist it.\n          { ...body, write: undefined }\n        : body\n    void transport.sync(send as typeof body, { keepalive: true }).catch(() => {\n      /* the page is leaving; there is nobody left to tell */\n    })\n    stop()\n  }\n\n  doc.on('update', onDocUpdate)\n  awareness.on('update', onAwarenessUpdate)\n\n  return {\n    start: () => {\n      setStatus('connecting')\n      void join()\n    },\n    stop,\n    status: () => status,\n    session: () => session,\n    peers: () => peers,\n    write: input =>\n      new Promise<UpdateResult>((resolve, reject) => {\n        if (stopped) {\n          reject(new ApiError(410, { code: 'session_gone', message: 'The live session ended.' }))\n          return\n        }\n        if (pendingWrite) {\n          // The newer text supersedes the older, which has not gone out yet;\n          // whoever was waiting on the older one waits on this instead.\n          pendingWrite.input = input\n          pendingWrite.waiters.push({ resolve, reject })\n        } else {\n          pendingWrite = { input, waiters: [{ resolve, reject }] }\n        }\n        schedule(PUSH_DELAY)\n      }),\n    leave,\n    setHidden: next => {\n      hidden = next\n      if (next) {\n        // Nobody is looking at this tab; its caret should stop hovering over\n        // somebody else's paragraph.\n        awareness.setLocalState(null)\n      } else if (identity) {\n        awareness.setLocalStateField('user', identity)\n      }\n      schedule(next ? POLL_HIDDEN : 0)\n    },\n    on: (event, listener) => {\n      const current = listeners.get(event) ?? []\n      current.push(listener as Listener<never>)\n      listeners.set(event, current)\n    },\n    giveUp,\n  }\n}\n","/**\n * Assembling the live layer: the Y document, the presence, and the provider.\n *\n * The order matters and is the reason this is a module rather than a few lines\n * in `main.ts`. The shared document has to exist and hold the bootstrap state\n * *before* the editor is constructed — the editor renders from it — while the\n * provider must not start until the editor exists, or a remote update could\n * arrive with nothing to apply it to.\n */\n\nimport { Awareness } from 'y-protocols/awareness'\nimport * as Y from 'yjs'\n\nimport type { CollabBootstrap } from '../types'\nimport { fromBase64 } from './codec'\nimport { BOOTSTRAP_ORIGIN } from './provider'\n\nexport interface LiveDocument {\n  doc: Y.Doc\n  awareness: Awareness\n  bootstrap: CollabBootstrap\n  destroy: () => void\n}\n\n/**\n * The shared document this page will edit, seeded from the page itself.\n *\n * `BOOTSTRAP_ORIGIN` on the apply, so the provider does not turn the state it\n * was just given back into an update to send: everything in it is already on\n * the server, by definition.\n */\nexport function createLiveDocument(bootstrap: CollabBootstrap): LiveDocument {\n  const doc = new Y.Doc()\n  const awareness = new Awareness(doc)\n  if (bootstrap.session !== null) {\n    Y.applyUpdate(doc, fromBase64(bootstrap.state), BOOTSTRAP_ORIGIN)\n  }\n  return {\n    doc,\n    awareness,\n    bootstrap,\n    destroy: () => {\n      awareness.destroy()\n      doc.destroy()\n    },\n  }\n}\n","/**\n * Who else is here, as chips in the header.\n *\n * Small, and deliberately so: presence is context, not content. It answers\n * \"am I alone?\" at a glance and disappears entirely when the answer is yes —\n * an empty row of nothing would be a permanent reminder that this feature\n * exists, which is not what the feature is for.\n *\n * Initials rather than names, because the header is a rail with a fixed budget\n * and `Guest 12` beside a title is a layout problem, not information. The full\n * name is in the tooltip and in the caret label inside the document, which is\n * where you actually need to know whose cursor that is.\n */\n\nimport { el } from '../dom'\nimport type { CollabUser } from '../types'\n\nimport type { Awareness } from 'y-protocols/awareness'\n\n/** `Guest 12` → `G12`; `Owner` → `O`. Short enough to fit in a 22px circle. */\nexport function initials(name: string): string {\n  const trimmed = name.trim()\n  if (!trimmed) {\n    return '?'\n  }\n  const match = /^(\\S)\\S*\\s+(\\d+)$/.exec(trimmed)\n  if (match) {\n    return `${match[1].toUpperCase()}${match[2]}`\n  }\n  return trimmed[0].toUpperCase()\n}\n\n/** Validated before it reaches a style attribute; see `editor.ts` for why. */\nfunction safeColor(value: unknown): string | null {\n  return typeof value === 'string' && /^#[0-9a-f]{6}$/i.test(value) ? value : null\n}\n\nfunction usersOf(awareness: Awareness): CollabUser[] {\n  const users: CollabUser[] = []\n  for (const [clientId, state] of awareness.getStates()) {\n    if (clientId === awareness.clientID) {\n      continue\n    }\n    const user = (state as { user?: unknown }).user as CollabUser | undefined\n    if (user && typeof user.name === 'string') {\n      users.push(user)\n    }\n  }\n  return users\n}\n\nexport interface Presence {\n  element: HTMLElement\n  destroy: () => void\n}\n\nexport function createPresence(awareness: Awareness): Presence {\n  const element = el('div', { class: 'presence', role: 'group' })\n  element.hidden = true\n\n  const render = () => {\n    const users = usersOf(awareness)\n    element.replaceChildren(\n      ...users.map(user => {\n        const chip = el('span', {\n          class: 'presence__peer',\n          title: user.name,\n          text: initials(user.name),\n        })\n        const color = safeColor(user.color)\n        if (color) {\n          chip.style.setProperty('--peer-color', color)\n        }\n        return chip\n      }),\n    )\n    // The group's name carries what the chips abbreviate, so a screen reader\n    // gets `Also here: Guest 1, Guest 2` rather than `G1 G2`.\n    element.setAttribute('aria-label', `Also here: ${users.map(user => user.name).join(', ')}`)\n    element.hidden = users.length === 0\n  }\n\n  const listener = () => render()\n  awareness.on('change', listener)\n  render()\n\n  return {\n    element,\n    destroy: () => awareness.off('change', listener),\n  }\n}\n","/**\n * The notice that appears when two versions of a document both exist.\n *\n * It is deliberately not a modal. Nothing autofocuses, typing carries on, and\n * the caret does not move — the document on screen is still the user's work,\n * and a dialog that seized the page would be claiming otherwise. It sits in the\n * `.pasty-overlays` lane beside the problem note, which is where this app puts\n * things that arrive and leave.\n *\n * Both buttons are quiet, and they are the same size. Neither choice is the\n * recommended one: only the person who typed both versions knows which matters,\n * and a primary button here would be the product guessing.\n */\n\nimport { el } from './dom'\n\nexport interface ConflictActions {\n  /** Take the other version. This tab's text is kept where it can be recovered. */\n  useLatest: () => void\n  /** Keep this tab's text. The other version is archived, never dropped. */\n  keepMine: () => void\n}\n\n/** What a particular conflict looks like: the words, and what the buttons say. */\nexport interface ConflictFace {\n  /** Only where `Keep mine` has a cost worth naming out loud. */\n  hint?: string\n  /** Take the other version. Default `Use latest`. */\n  latest?: string\n  /** Keep this tab's. Default `Keep mine`. */\n  mine?: string\n}\n\nexport interface ConflictNotice {\n  element: HTMLElement\n  /** Show it, saying what happened and what the two choices are called here. */\n  show: (text: string, face?: ConflictFace) => void\n  hide: () => void\n  visible: () => boolean\n}\n\n/** The three things that can go wrong, in the words the notice uses. */\nexport const CONFLICT_TEXT = {\n  /** Another tab or device saved over what this one was holding. */\n  changed: 'This document changed in another tab or device.',\n  /** A save from a previous visit never reached the server. */\n  restore: 'You have unsaved changes from last time.',\n  /** The live session was replaced while this tab held unsent edits. */\n  reset: 'Live editing restarted and this tab has unsaved edits.',\n} as const\n\n/** Only shown for the reset case, where `Keep mine` has a cost worth naming. */\nexport const DISCONNECT_HINT = 'Keep mine disconnects the other editors.'\n\n/**\n * The two faces this notice wears.\n *\n * A conflict is a choice between two versions that both exist; a restore is a\n * choice about work this browser is still holding. Same shape, same lane, same\n * absence of a recommended answer — different verbs, because \"Use latest\" is\n * not what you call throwing away your own unsent paragraph.\n */\nexport const CONFLICT_CHOICES: ConflictFace = { latest: 'Use latest', mine: 'Keep mine' }\nexport const RESTORE_CHOICES: ConflictFace = { latest: 'Discard', mine: 'Restore' }\n\nexport function createConflictNotice(actions: ConflictActions): ConflictNotice {\n  // role=status, not alert: this is not an emergency, and an assertive\n  // interruption mid-sentence would be exactly the wrong reading of it.\n  const text = el('p', { class: 'pasty-conflict__text', role: 'status' })\n  const latest = el('button', {\n    type: 'button',\n    class: 'btn btn--quiet pasty-conflict__latest',\n    text: 'Use latest',\n  })\n  const mine = el('button', {\n    type: 'button',\n    class: 'btn btn--quiet pasty-conflict__mine',\n    text: 'Keep mine',\n  })\n  const hint = el('p', { class: 'pasty-conflict__hint' })\n  const element = el(\n    'div',\n    { class: 'pasty-conflict' },\n    text,\n    el('div', { class: 'pasty-conflict__actions' }, latest, mine),\n    hint,\n  )\n  element.hidden = true\n\n  latest.addEventListener('click', () => actions.useLatest())\n  mine.addEventListener('click', () => actions.keepMine())\n\n  return {\n    element,\n    show: (message, face = CONFLICT_CHOICES) => {\n      text.textContent = message\n      latest.textContent = face.latest ?? 'Use latest'\n      mine.textContent = face.mine ?? 'Keep mine'\n      hint.textContent = face.hint ?? ''\n      hint.hidden = !face.hint\n      element.hidden = false\n    },\n    hide: () => {\n      element.hidden = true\n    },\n    visible: () => !element.hidden,\n  }\n}\n","/**\n * The /i/<id> handoff.\n *\n * The server rendered the editor with `import_doc` in the bootstrap; this\n * decides whether it becomes the anonymous document. Viewing did not consume\n * the server-side stash, so declining loses nothing. (To poke at this in the\n * dev harness, add an `\"import_doc\"` entry to index.html's embedded config.)\n */\n\nimport { hasContent, loadAnonDocument, nowTimestamp, saveAnonDocument } from './persistence'\nimport type { PastyConfig, StoredDocument } from './types'\n\nexport interface HandoffResult {\n  document: StoredDocument\n  /** False when localStorage was unavailable; the content is still on screen. */\n  storedLocally: boolean\n}\n\nconst REPLACE_PROMPT =\n  'Replace the draft in this browser with the imported document?\\n\\n' +\n  'Cancel keeps your draft. The import link keeps working, so you can come back to it.'\n\nexport function resolveImportDocument(config: PastyConfig): HandoffResult | null {\n  const imported = config.import_doc\n  if (!imported || config.user.is_authenticated) {\n    return null // authenticated guard is defense in depth; the server redirects them\n  }\n\n  // Whatever is decided, this page is the editor at its usual address, and a\n  // reload must not re-run the handoff against a stale bootstrap.\n  window.history.replaceState(null, '', config.urls.home)\n\n  const incoming: StoredDocument = {\n    title: imported.title, // all three StoredDocument fields: loadAnonDocument\n    markdown: imported.markdown, // only validates markdown, but boot reads title too\n    updated_at: nowTimestamp(),\n  }\n  return adoptAsAnonymousDraft(incoming, REPLACE_PROMPT)\n}\n\n/**\n * Make `incoming` this browser's draft, asking first if that displaces work.\n *\n * The rule every handoff shares — the CLI import above, and a docs page's\n * \"Edit a copy\": seed silently into an empty or identical draft, never\n * overwrite a differing one without consent, and never lose the incoming\n * content even when localStorage refuses it. The prompt is the caller's,\n * because what is being offered differs.\n */\nexport function adoptAsAnonymousDraft(\n  incoming: StoredDocument,\n  prompt: string,\n): HandoffResult | null {\n  const existing = loadAnonDocument()\n  const differs =\n    hasContent(existing) &&\n    (existing.markdown !== incoming.markdown ||\n      // An import that arrived without a title has nothing to say about the\n      // title, and the browser may have named the draft from its first line\n      // since. Comparing anyway would ask whether to replace a document with\n      // itself — and accepting would throw the name away.\n      (incoming.title !== '' && existing.title !== incoming.title))\n  if (differs && !window.confirm(prompt)) {\n    return null // chooseInitialDocument will load the kept draft as usual\n  }\n  return { document: incoming, storedLocally: saveAnonDocument(incoming) }\n}\n","/**\n * The appearance picker.\n *\n * Progressive enhancement over server-rendered rows: the markup is already in\n * the page (in the account menu when signed in, in its own small menu when\n * not), `menus.ts` already gives it click-outside, Escape and arrow keys, and\n * this only binds the choice and keeps `aria-checked` honest.\n */\n\nimport type { ThemeController, ThemePreference } from './theme'\n\nconst CHOICE = '[data-theme-choice]'\n\nexport function installAppearanceMenu(theme: ThemeController): void {\n  const rows = Array.from(document.querySelectorAll<HTMLElement>(CHOICE))\n  if (rows.length === 0) {\n    return\n  }\n\n  for (const row of rows) {\n    row.addEventListener('click', () => {\n      theme.set(row.dataset.themeChoice as ThemePreference)\n      row.closest('details')?.removeAttribute('open')\n    })\n  }\n\n  theme.subscribe(preference => {\n    for (const row of rows) {\n      row.setAttribute('aria-checked', String(row.dataset.themeChoice === preference))\n    }\n  })\n}\n","//#region \\0rolldown/runtime.js\nvar __defProp = Object.defineProperty;\nvar __exportAll = (all, no_symbols) => {\n\tlet target = {};\n\tfor (var name in all) __defProp(target, name, {\n\t\tget: all[name],\n\t\tenumerable: true\n\t});\n\tif (!no_symbols) __defProp(target, Symbol.toStringTag, { value: \"Module\" });\n\treturn target;\n};\n//#endregion\nexport { __exportAll as t };\n","import { liftTarget, replaceStep, ReplaceStep, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection, SelectionRange } from 'prosemirror-state';\n\n/**\nDelete the selection, if there is one.\n*/\nconst deleteSelection = (state, dispatch) => {\n    if (state.selection.empty)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.deleteSelection().scrollIntoView());\n    return true;\n};\nfunction atBlockStart(state, view) {\n    let { $cursor } = state.selection;\n    if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n        : $cursor.parentOffset > 0))\n        return null;\n    return $cursor;\n}\n/**\nIf the selection is empty and at the start of a textblock, try to\nreduce the distance between that block and the one before it—if\nthere's a block directly before it that can be joined, join them.\nIf not, try to move the selected block closer to the next one in\nthe document structure by lifting it out of its parent or moving it\ninto a parent of the previous block. Will use the view for accurate\n(bidi-aware) start-of-textblock detection if given.\n*/\nconst joinBackward = (state, dispatch, view) => {\n    let $cursor = atBlockStart(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutBefore($cursor);\n    // If there is no node before this, try to lift\n    if (!$cut) {\n        let range = $cursor.blockRange(), target = range && liftTarget(range);\n        if (target == null)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.lift(range, target).scrollIntoView());\n        return true;\n    }\n    let before = $cut.nodeBefore;\n    // Apply the joining algorithm\n    if (deleteBarrier(state, $cut, dispatch, -1))\n        return true;\n    // If the node below has no content and the node above is\n    // selectable, delete the node below and select the one above.\n    if ($cursor.parent.content.size == 0 &&\n        (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n        for (let depth = $cursor.depth;; depth--) {\n            let delStep = replaceStep(state.doc, $cursor.before(depth), $cursor.after(depth), Slice.empty);\n            if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n                if (dispatch) {\n                    let tr = state.tr.step(delStep);\n                    tr.setSelection(textblockAt(before, \"end\")\n                        ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n                        : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n                    dispatch(tr.scrollIntoView());\n                }\n                return true;\n            }\n            if (depth == 1 || $cursor.node(depth - 1).childCount > 1)\n                break;\n        }\n    }\n    // If the node before is an atom, delete it\n    if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n        if (dispatch)\n            dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView());\n        return true;\n    }\n    return false;\n};\n/**\nA more limited form of [`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward)\nthat only tries to join the current textblock to the one before\nit, if the cursor is at the start of a textblock.\n*/\nconst joinTextblockBackward = (state, dispatch, view) => {\n    let $cursor = atBlockStart(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutBefore($cursor);\n    return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n/**\nA more limited form of [`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward)\nthat only tries to join the current textblock to the one after\nit, if the cursor is at the end of a textblock.\n*/\nconst joinTextblockForward = (state, dispatch, view) => {\n    let $cursor = atBlockEnd(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutAfter($cursor);\n    return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nfunction joinTextblocksAround(state, $cut, dispatch) {\n    let before = $cut.nodeBefore, beforeText = before, beforePos = $cut.pos - 1;\n    for (; !beforeText.isTextblock; beforePos--) {\n        if (beforeText.type.spec.isolating)\n            return false;\n        let child = beforeText.lastChild;\n        if (!child)\n            return false;\n        beforeText = child;\n    }\n    let after = $cut.nodeAfter, afterText = after, afterPos = $cut.pos + 1;\n    for (; !afterText.isTextblock; afterPos++) {\n        if (afterText.type.spec.isolating)\n            return false;\n        let child = afterText.firstChild;\n        if (!child)\n            return false;\n        afterText = child;\n    }\n    let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty);\n    if (!step || step.from != beforePos ||\n        step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos)\n        return false;\n    if (dispatch) {\n        let tr = state.tr.step(step);\n        tr.setSelection(TextSelection.create(tr.doc, beforePos));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n}\nfunction textblockAt(node, side, only = false) {\n    for (let scan = node; scan; scan = (side == \"start\" ? scan.firstChild : scan.lastChild)) {\n        if (scan.isTextblock)\n            return true;\n        if (only && scan.childCount != 1)\n            return false;\n    }\n    return false;\n}\n/**\nWhen the selection is empty and at the start of a textblock, select\nthe node before that textblock, if possible. This is intended to be\nbound to keys like backspace, after\n[`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward) or other deleting\ncommands, as a fall-back behavior when the schema doesn't allow\ndeletion at the selected point.\n*/\nconst selectNodeBackward = (state, dispatch, view) => {\n    let { $head, empty } = state.selection, $cut = $head;\n    if (!empty)\n        return false;\n    if ($head.parent.isTextblock) {\n        if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0)\n            return false;\n        $cut = findCutBefore($head);\n    }\n    let node = $cut && $cut.nodeBefore;\n    if (!node || !NodeSelection.isSelectable(node))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView());\n    return true;\n};\nfunction findCutBefore($pos) {\n    if (!$pos.parent.type.spec.isolating)\n        for (let i = $pos.depth - 1; i >= 0; i--) {\n            if ($pos.index(i) > 0)\n                return $pos.doc.resolve($pos.before(i + 1));\n            if ($pos.node(i).type.spec.isolating)\n                break;\n        }\n    return null;\n}\nfunction atBlockEnd(state, view) {\n    let { $cursor } = state.selection;\n    if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n        : $cursor.parentOffset < $cursor.parent.content.size))\n        return null;\n    return $cursor;\n}\n/**\nIf the selection is empty and the cursor is at the end of a\ntextblock, try to reduce or remove the boundary between that block\nand the one after it, either by joining them or by moving the other\nblock closer to this one in the tree structure. Will use the view\nfor accurate start-of-textblock detection if given.\n*/\nconst joinForward = (state, dispatch, view) => {\n    let $cursor = atBlockEnd(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutAfter($cursor);\n    // If there is no node after this, there's nothing to do\n    if (!$cut)\n        return false;\n    let after = $cut.nodeAfter;\n    // Try the joining algorithm\n    if (deleteBarrier(state, $cut, dispatch, 1))\n        return true;\n    // If the node above has no content and the node below is\n    // selectable, delete the node above and select the one below.\n    if ($cursor.parent.content.size == 0 &&\n        (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n        let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n        if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n            if (dispatch) {\n                let tr = state.tr.step(delStep);\n                tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n                    : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    // If the next node is an atom, delete it\n    if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n        if (dispatch)\n            dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView());\n        return true;\n    }\n    return false;\n};\n/**\nWhen the selection is empty and at the end of a textblock, select\nthe node coming after that textblock, if possible. This is intended\nto be bound to keys like delete, after\n[`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward) and similar deleting\ncommands, to provide a fall-back behavior when the schema doesn't\nallow deletion at the selected point.\n*/\nconst selectNodeForward = (state, dispatch, view) => {\n    let { $head, empty } = state.selection, $cut = $head;\n    if (!empty)\n        return false;\n    if ($head.parent.isTextblock) {\n        if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n            return false;\n        $cut = findCutAfter($head);\n    }\n    let node = $cut && $cut.nodeAfter;\n    if (!node || !NodeSelection.isSelectable(node))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView());\n    return true;\n};\nfunction findCutAfter($pos) {\n    if (!$pos.parent.type.spec.isolating)\n        for (let i = $pos.depth - 1; i >= 0; i--) {\n            let parent = $pos.node(i);\n            if ($pos.index(i) + 1 < parent.childCount)\n                return $pos.doc.resolve($pos.after(i + 1));\n            if (parent.type.spec.isolating)\n                break;\n        }\n    return null;\n}\n/**\nJoin the selected block or, if there is a text selection, the\nclosest ancestor block of the selection that can be joined, with\nthe sibling above it.\n*/\nconst joinUp = (state, dispatch) => {\n    let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n    if (nodeSel) {\n        if (sel.node.isTextblock || !canJoin(state.doc, sel.from))\n            return false;\n        point = sel.from;\n    }\n    else {\n        point = joinPoint(state.doc, sel.from, -1);\n        if (point == null)\n            return false;\n    }\n    if (dispatch) {\n        let tr = state.tr.join(point);\n        if (nodeSel)\n            tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nJoin the selected block, or the closest ancestor of the selection\nthat can be joined, with the sibling after it.\n*/\nconst joinDown = (state, dispatch) => {\n    let sel = state.selection, point;\n    if (sel instanceof NodeSelection) {\n        if (sel.node.isTextblock || !canJoin(state.doc, sel.to))\n            return false;\n        point = sel.to;\n    }\n    else {\n        point = joinPoint(state.doc, sel.to, 1);\n        if (point == null)\n            return false;\n    }\n    if (dispatch)\n        dispatch(state.tr.join(point).scrollIntoView());\n    return true;\n};\n/**\nLift the selected block, or the closest ancestor block of the\nselection that can be lifted, out of its parent node.\n*/\nconst lift = (state, dispatch) => {\n    let { $from, $to } = state.selection;\n    let range = $from.blockRange($to), target = range && liftTarget(range);\n    if (target == null)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.lift(range, target).scrollIntoView());\n    return true;\n};\n/**\nIf the selection is in a node whose type has a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, replace the\nselection with a newline character.\n*/\nconst newlineInCode = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.insertText(\"\\n\").scrollIntoView());\n    return true;\n};\nfunction defaultBlockAt(match) {\n    for (let i = 0; i < match.edgeCount; i++) {\n        let { type } = match.edge(i);\n        if (type.isTextblock && !type.hasRequiredAttrs())\n            return type;\n    }\n    return null;\n}\n/**\nWhen the selection is in a node with a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, create a\ndefault block after the code block, and move the cursor there.\n*/\nconst exitCode = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n        return false;\n    let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n    if (!type || !above.canReplaceWith(after, after, type))\n        return false;\n    if (dispatch) {\n        let pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n        tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nIf a block node is selected, create an empty paragraph before (if\nit is its parent's first child) or after it.\n*/\nconst createParagraphNear = (state, dispatch) => {\n    let sel = state.selection, { $from, $to } = sel;\n    if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent)\n        return false;\n    let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n    if (!type || !type.isTextblock)\n        return false;\n    if (dispatch) {\n        let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n        let tr = state.tr.insert(side, type.createAndFill());\n        tr.setSelection(TextSelection.create(tr.doc, side + 1));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nIf the cursor is in an empty textblock that can be lifted, lift the\nblock.\n*/\nconst liftEmptyBlock = (state, dispatch) => {\n    let { $cursor } = state.selection;\n    if (!$cursor || $cursor.parent.content.size)\n        return false;\n    if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n        let before = $cursor.before();\n        if (canSplit(state.doc, before)) {\n            if (dispatch)\n                dispatch(state.tr.split(before).scrollIntoView());\n            return true;\n        }\n    }\n    let range = $cursor.blockRange(), target = range && liftTarget(range);\n    if (target == null)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.lift(range, target).scrollIntoView());\n    return true;\n};\n/**\nCreate a variant of [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock) that uses\na custom function to determine the type of the newly split off block.\n*/\nfunction splitBlockAs(splitNode) {\n    return (state, dispatch) => {\n        if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n            let { $from } = state.selection;\n            if (!$from.parentOffset || !canSplit(state.doc, $from.pos))\n                return false;\n            if (dispatch)\n                dispatch(state.tr.split($from.pos).scrollIntoView());\n            return true;\n        }\n        if (!state.selection.$from.depth)\n            return false;\n        let tr = state.tr;\n        if (!state.selection.empty && (state.selection instanceof TextSelection || state.selection instanceof AllSelection))\n            tr.deleteSelection();\n        let { $from } = tr.selection, mapFrom = tr.steps.length;\n        let types = [];\n        let splitDepth, deflt, atEnd = false, atStart = false;\n        for (let d = $from.depth;; d--) {\n            let node = $from.node(d);\n            if (node.isBlock) {\n                atEnd = $from.end(d) == $from.pos + ($from.depth - d);\n                atStart = $from.start(d) == $from.pos - ($from.depth - d);\n                deflt = defaultBlockAt($from.node(d - 1).contentMatchAt($from.indexAfter(d - 1)));\n                let splitType = splitNode && splitNode($from.parent, atEnd, $from);\n                types.unshift(splitType || (atEnd && deflt ? { type: deflt } : null));\n                splitDepth = d;\n                break;\n            }\n            else {\n                if (d == 1)\n                    return false;\n                types.unshift(null);\n            }\n        }\n        let splitPos = $from.pos;\n        let can = canSplit(tr.doc, splitPos, types.length, types);\n        if (!can) {\n            types[0] = deflt ? { type: deflt } : null;\n            can = canSplit(tr.doc, splitPos, types.length, types);\n        }\n        if (!can)\n            return false;\n        tr.split(splitPos, types.length, types);\n        if (!atEnd && atStart && $from.node(splitDepth).type != deflt) {\n            let mapping = tr.mapping.slice(mapFrom);\n            let first = mapping.map($from.before(splitDepth)), $first = tr.doc.resolve(first);\n            if (deflt && $from.node(splitDepth - 1).canReplaceWith($first.index(), $first.index() + 1, deflt))\n                tr.setNodeMarkup(mapping.map($from.before(splitDepth)), deflt);\n        }\n        if (dispatch)\n            dispatch(tr.scrollIntoView());\n        return true;\n    };\n}\n/**\nSplit the parent block of the selection. If the selection is a text\nselection, also delete its content.\n*/\nconst splitBlock = splitBlockAs();\n/**\nActs like [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock), but without\nresetting the set of active marks at the cursor.\n*/\nconst splitBlockKeepMarks = (state, dispatch) => {\n    return splitBlock(state, dispatch && (tr => {\n        let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n        if (marks)\n            tr.ensureMarks(marks);\n        dispatch(tr);\n    }));\n};\n/**\nMove the selection to the node wrapping the current selection, if\nany. (Will not select the document node.)\n*/\nconst selectParentNode = (state, dispatch) => {\n    let { $from, to } = state.selection, pos;\n    let same = $from.sharedDepth(to);\n    if (same == 0)\n        return false;\n    pos = $from.before(same);\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n    return true;\n};\n/**\nSelect the whole document.\n*/\nconst selectAll = (state, dispatch) => {\n    if (dispatch)\n        dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n    return true;\n};\nfunction joinMaybeClear(state, $pos, dispatch) {\n    let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n    if (!before || !after || !before.type.compatibleContent(after.type))\n        return false;\n    if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n        if (dispatch)\n            dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView());\n        return true;\n    }\n    if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.join($pos.pos).scrollIntoView());\n    return true;\n}\nfunction deleteBarrier(state, $cut, dispatch, dir) {\n    let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n    let isolated = before.type.spec.isolating || after.type.spec.isolating;\n    if (!isolated && joinMaybeClear(state, $cut, dispatch))\n        return true;\n    let canDelAfter = !isolated && $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n    if (canDelAfter &&\n        (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n        match.matchType(conn[0] || after.type).validEnd) {\n        if (dispatch) {\n            let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n            for (let i = conn.length - 1; i >= 0; i--)\n                wrap = Fragment.from(conn[i].create(null, wrap));\n            wrap = Fragment.from(before.copy(wrap));\n            let tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n            let $joinAt = tr.doc.resolve(end + 2 * conn.length);\n            if ($joinAt.nodeAfter && $joinAt.nodeAfter.type == before.type &&\n                canJoin(tr.doc, $joinAt.pos))\n                tr.join($joinAt.pos);\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    }\n    let selAfter = after.type.spec.isolating || (dir > 0 && isolated) ? null : Selection.findFrom($cut, 1);\n    let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n    if (target != null && target >= $cut.depth) {\n        if (dispatch)\n            dispatch(state.tr.lift(range, target).scrollIntoView());\n        return true;\n    }\n    if (canDelAfter && textblockAt(after, \"start\", true) && textblockAt(before, \"end\")) {\n        let at = before, wrap = [];\n        for (;;) {\n            wrap.push(at);\n            if (at.isTextblock)\n                break;\n            at = at.lastChild;\n        }\n        let afterText = after, afterDepth = 1;\n        for (; !afterText.isTextblock; afterText = afterText.firstChild)\n            afterDepth++;\n        if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n            if (dispatch) {\n                let end = Fragment.empty;\n                for (let i = wrap.length - 1; i >= 0; i--)\n                    end = Fragment.from(wrap[i].copy(end));\n                let tr = state.tr.step(new ReplaceAroundStep($cut.pos - wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end, wrap.length, 0), 0, true));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    return false;\n}\nfunction selectTextblockSide(side) {\n    return function (state, dispatch) {\n        let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n        let depth = $pos.depth;\n        while ($pos.node(depth).isInline) {\n            if (!depth)\n                return false;\n            depth--;\n        }\n        if (!$pos.node(depth).isTextblock)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth))));\n        return true;\n    };\n}\n/**\nMoves the cursor to the start of current text block.\n*/\nconst selectTextblockStart = selectTextblockSide(-1);\n/**\nMoves the cursor to the end of current text block.\n*/\nconst selectTextblockEnd = selectTextblockSide(1);\n// Parameterized commands\n/**\nWrap the selection in a node of the given type with the given\nattributes.\n*/\nfunction wrapIn(nodeType, attrs = null) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n        if (!wrapping)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.wrap(range, wrapping).scrollIntoView());\n        return true;\n    };\n}\n/**\nReturns a command that tries to set the selected textblocks to the\ngiven node type with the given attributes.\n*/\nfunction setBlockType(nodeType, attrs = null) {\n    return function (state, dispatch) {\n        let applicable = false;\n        for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n            let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n            state.doc.nodesBetween(from, to, (node, pos) => {\n                if (applicable)\n                    return false;\n                if (!node.isTextblock || node.hasMarkup(nodeType, attrs))\n                    return;\n                if (node.type == nodeType) {\n                    applicable = true;\n                }\n                else {\n                    let $pos = state.doc.resolve(pos), index = $pos.index();\n                    applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n                }\n            });\n        }\n        if (!applicable)\n            return false;\n        if (dispatch) {\n            let tr = state.tr;\n            for (let i = 0; i < state.selection.ranges.length; i++) {\n                let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n                tr.setBlockType(from, to, nodeType, attrs);\n            }\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    };\n}\nfunction markApplies(doc, ranges, type, enterAtoms) {\n    for (let i = 0; i < ranges.length; i++) {\n        let { $from, $to } = ranges[i];\n        let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;\n        doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n            if (can || !enterAtoms && node.isAtom && node.isInline && pos >= $from.pos && pos + node.nodeSize <= $to.pos)\n                return false;\n            can = node.inlineContent && node.type.allowsMarkType(type);\n        });\n        if (can)\n            return true;\n    }\n    return false;\n}\nfunction removeInlineAtoms(ranges) {\n    let result = [];\n    for (let i = 0; i < ranges.length; i++) {\n        let { $from, $to } = ranges[i];\n        $from.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n            if (node.isAtom && node.content.size && node.isInline && pos >= $from.pos && pos + node.nodeSize <= $to.pos) {\n                if (pos + 1 > $from.pos)\n                    result.push(new SelectionRange($from, $from.doc.resolve(pos + 1)));\n                $from = $from.doc.resolve(pos + 1 + node.content.size);\n                return false;\n            }\n        });\n        if ($from.pos < $to.pos)\n            result.push(new SelectionRange($from, $to));\n    }\n    return result;\n}\n/**\nCreate a command function that toggles the given mark with the\ngiven attributes. Will return `false` when the current selection\ndoesn't support that mark. This will remove the mark if any marks\nof that type exist in the selection, or add it otherwise. If the\nselection is empty, this applies to the [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks) instead of a range of the\ndocument.\n*/\nfunction toggleMark(markType, attrs = null, options) {\n    let removeWhenPresent = (options && options.removeWhenPresent) !== false;\n    let enterAtoms = (options && options.enterInlineAtoms) !== false;\n    let dropSpace = !(options && options.includeWhitespace);\n    return function (state, dispatch) {\n        let { empty, $cursor, ranges } = state.selection;\n        if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType, enterAtoms))\n            return false;\n        if (dispatch) {\n            if ($cursor) {\n                if (markType.isInSet(state.storedMarks || $cursor.marks()))\n                    dispatch(state.tr.removeStoredMark(markType));\n                else\n                    dispatch(state.tr.addStoredMark(markType.create(attrs)));\n            }\n            else {\n                let add, tr = state.tr;\n                if (!enterAtoms)\n                    ranges = removeInlineAtoms(ranges);\n                if (removeWhenPresent) {\n                    add = !ranges.some(r => state.doc.rangeHasMark(r.$from.pos, r.$to.pos, markType));\n                }\n                else {\n                    add = !ranges.every(r => {\n                        let missing = false;\n                        tr.doc.nodesBetween(r.$from.pos, r.$to.pos, (node, pos, parent) => {\n                            if (missing)\n                                return false;\n                            missing = !markType.isInSet(node.marks) && !!parent && parent.type.allowsMarkType(markType) &&\n                                !(node.isText && /^\\s*$/.test(node.textBetween(Math.max(0, r.$from.pos - pos), Math.min(node.nodeSize, r.$to.pos - pos))));\n                        });\n                        return !missing;\n                    });\n                }\n                for (let i = 0; i < ranges.length; i++) {\n                    let { $from, $to } = ranges[i];\n                    if (!add) {\n                        tr.removeMark($from.pos, $to.pos, markType);\n                    }\n                    else {\n                        let from = $from.pos, to = $to.pos, start = $from.nodeAfter, end = $to.nodeBefore;\n                        let spaceStart = dropSpace && start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n                        let spaceEnd = dropSpace && end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n                        if (from + spaceStart < to) {\n                            from += spaceStart;\n                            to -= spaceEnd;\n                        }\n                        tr.addMark(from, to, markType.create(attrs));\n                    }\n                }\n                dispatch(tr.scrollIntoView());\n            }\n        }\n        return true;\n    };\n}\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n    return (tr) => {\n        if (!tr.isGeneric)\n            return dispatch(tr);\n        let ranges = [];\n        for (let i = 0; i < tr.mapping.maps.length; i++) {\n            let map = tr.mapping.maps[i];\n            for (let j = 0; j < ranges.length; j++)\n                ranges[j] = map.map(ranges[j]);\n            map.forEach((_s, _e, from, to) => ranges.push(from, to));\n        }\n        // Figure out which joinable points exist inside those ranges,\n        // by checking all node boundaries in their parent nodes.\n        let joinable = [];\n        for (let i = 0; i < ranges.length; i += 2) {\n            let from = ranges[i], to = ranges[i + 1];\n            let $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n            for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n                let after = parent.maybeChild(index);\n                if (!after)\n                    break;\n                if (index && joinable.indexOf(pos) == -1) {\n                    let before = parent.child(index - 1);\n                    if (before.type == after.type && isJoinable(before, after))\n                        joinable.push(pos);\n                }\n                pos += after.nodeSize;\n            }\n        }\n        // Join the joinable points\n        joinable.sort((a, b) => a - b);\n        for (let i = joinable.length - 1; i >= 0; i--) {\n            if (canJoin(tr.doc, joinable[i]))\n                tr.join(joinable[i]);\n        }\n        dispatch(tr);\n    };\n}\n/**\nWrap a command so that, when it produces a transform that causes\ntwo joinable nodes to end up next to each other, those are joined.\nNodes are considered joinable when they are of the same type and\nwhen the `isJoinable` predicate returns true for them or, if an\narray of strings was passed, if their node type name is in that\narray.\n*/\nfunction autoJoin(command, isJoinable) {\n    let canJoin = Array.isArray(isJoinable) ? (node) => isJoinable.indexOf(node.type.name) > -1\n        : isJoinable;\n    return (state, dispatch, view) => command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view);\n}\n/**\nCombine a number of command functions into a single function (which\ncalls them one by one until one returns true).\n*/\nfunction chainCommands(...commands) {\n    return function (state, dispatch, view) {\n        for (let i = 0; i < commands.length; i++)\n            if (commands[i](state, dispatch, view))\n                return true;\n        return false;\n    };\n}\nlet backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nlet del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n/**\nA basic keymap containing bindings not specific to any schema.\nBinds the following keys (when multiple commands are listed, they\nare chained with [`chainCommands`](https://prosemirror.net/docs/ref/#commands.chainCommands)):\n\n* **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n* **Mod-Enter** to `exitCode`\n* **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n* **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-a** to `selectAll`\n*/\nconst pcBaseKeymap = {\n    \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n    \"Mod-Enter\": exitCode,\n    \"Backspace\": backspace,\n    \"Mod-Backspace\": backspace,\n    \"Shift-Backspace\": backspace,\n    \"Delete\": del,\n    \"Mod-Delete\": del,\n    \"Mod-a\": selectAll\n};\n/**\nA copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n**Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n**Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\nCtrl-Delete.\n*/\nconst macBaseKeymap = {\n    \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n    \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n    \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n    \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Ctrl-a\": selectTextblockStart,\n    \"Ctrl-e\": selectTextblockEnd\n};\nfor (let key in pcBaseKeymap)\n    macBaseKeymap[key] = pcBaseKeymap[key];\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform)\n    // @ts-ignore\n    : typeof os != \"undefined\" && os.platform ? os.platform() == \"darwin\" : false;\n/**\nDepending on the detected platform, this will hold\n[`pcBasekeymap`](https://prosemirror.net/docs/ref/#commands.pcBaseKeymap) or\n[`macBaseKeymap`](https://prosemirror.net/docs/ref/#commands.macBaseKeymap).\n*/\nconst baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, splitBlock, splitBlockAs, splitBlockKeepMarks, toggleMark, wrapIn };\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget, canJoin } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\n\nconst olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n/**\nAn ordered list [node spec](https://prosemirror.net/docs/ref/#model.NodeSpec). Has a single\nattribute, `order`, which determines the number at which the list\nstarts counting, and defaults to 1. Represented as an `<ol>`\nelement.\n*/\nconst orderedList = {\n    attrs: { order: { default: 1, validate: \"number\" } },\n    parseDOM: [{ tag: \"ol\", getAttrs(dom) {\n                return { order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1 };\n            } }],\n    toDOM(node) {\n        return node.attrs.order == 1 ? olDOM : [\"ol\", { start: node.attrs.order }, 0];\n    }\n};\n/**\nA bullet list node spec, represented in the DOM as `<ul>`.\n*/\nconst bulletList = {\n    parseDOM: [{ tag: \"ul\" }],\n    toDOM() { return ulDOM; }\n};\n/**\nA list item (`<li>`) spec.\n*/\nconst listItem = {\n    parseDOM: [{ tag: \"li\" }],\n    toDOM() { return liDOM; },\n    defining: true\n};\nfunction add(obj, props) {\n    let copy = {};\n    for (let prop in obj)\n        copy[prop] = obj[prop];\n    for (let prop in props)\n        copy[prop] = props[prop];\n    return copy;\n}\n/**\nConvenience function for adding list-related node types to a map\nspecifying the nodes for a schema. Adds\n[`orderedList`](https://prosemirror.net/docs/ref/#schema-list.orderedList) as `\"ordered_list\"`,\n[`bulletList`](https://prosemirror.net/docs/ref/#schema-list.bulletList) as `\"bullet_list\"`, and\n[`listItem`](https://prosemirror.net/docs/ref/#schema-list.listItem) as `\"list_item\"`.\n\n`itemContent` determines the content expression for the list items.\nIf you want the commands defined in this module to apply to your\nlist structure, it should have a shape like `\"paragraph block*\"` or\n`\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\ngiven to assign a group name to the list node types, for example\n`\"block\"`.\n*/\nfunction addListNodes(nodes, itemContent, listGroup) {\n    return nodes.append({\n        ordered_list: add(orderedList, { content: \"list_item+\", group: listGroup }),\n        bullet_list: add(bulletList, { content: \"list_item+\", group: listGroup }),\n        list_item: add(listItem, { content: itemContent })\n    });\n}\n/**\nReturns a command function that wraps the selection in a list with\nthe given type an attributes. If `dispatch` is null, only return a\nvalue to indicate whether this is possible, but don't actually\nperform the change.\n*/\nfunction wrapInList(listType, attrs = null) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to);\n        if (!range)\n            return false;\n        let tr = dispatch ? state.tr : null;\n        if (!wrapRangeInList(tr, range, listType, attrs))\n            return false;\n        if (dispatch)\n            dispatch(tr.scrollIntoView());\n        return true;\n    };\n}\n/**\nTry to wrap the given node range in a list of the given type.\nReturn `true` when this is possible, `false` otherwise. When `tr`\nis non-null, the wrapping is added to that transaction. When it is\n`null`, the function only queries whether the wrapping is\npossible.\n*/\nfunction wrapRangeInList(tr, range, listType, attrs = null) {\n    let doJoin = false, outerRange = range, doc = range.$from.doc;\n    // This is at the top of an existing list item\n    if (range.depth >= 2 && range.$from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n        // Don't do anything if this is the top of the list\n        if (range.$from.index(range.depth - 1) == 0)\n            return false;\n        let $insert = doc.resolve(range.start - 2);\n        outerRange = new NodeRange($insert, $insert, range.depth);\n        if (range.endIndex < range.parent.childCount)\n            range = new NodeRange(range.$from, doc.resolve(range.$to.end(range.depth)), range.depth);\n        doJoin = true;\n    }\n    let wrap = findWrapping(outerRange, listType, attrs, range);\n    if (!wrap)\n        return false;\n    if (tr)\n        doWrapInList(tr, range, wrap, doJoin, listType);\n    return true;\n}\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--)\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end, new Slice(content, 0, 0), wrappers.length, true));\n    let found = 0;\n    for (let i = 0; i < wrappers.length; i++)\n        if (wrappers[i].type == listType)\n            found = i + 1;\n    let splitDepth = wrappers.length - found;\n    let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n    for (let i = range.startIndex, e = range.endIndex, first = true; i < e; i++, first = false) {\n        if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n            tr.split(splitPos, splitDepth);\n            splitPos += 2 * splitDepth;\n        }\n        splitPos += parent.child(i).nodeSize;\n    }\n    return tr;\n}\n/**\nBuild a command that splits a non-empty textblock at the top level\nof a list item by also splitting that list item.\n*/\nfunction splitListItem(itemType, itemAttrs) {\n    return function (state, dispatch) {\n        let { $from, $to, node } = state.selection;\n        if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to))\n            return false;\n        let grandParent = $from.node(-1);\n        if (grandParent.type != itemType)\n            return false;\n        if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n            // In an empty block. If this is a nested list, the wrapping\n            // list item should be split. Otherwise, bail out and let next\n            // command handle lifting.\n            if ($from.depth == 3 || $from.node(-3).type != itemType ||\n                $from.index(-2) != $from.node(-2).childCount - 1)\n                return false;\n            if (dispatch) {\n                let wrap = Fragment.empty;\n                let depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n                // Build a fragment containing empty versions of the structure\n                // from the outer list item to the parent node of the cursor\n                for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d--)\n                    wrap = Fragment.from($from.node(d).copy(wrap));\n                let depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1\n                    : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n                // Add a second list item with an empty default start node\n                wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n                let start = $from.before($from.depth - (depthBefore - 1));\n                let tr = state.tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n                let sel = -1;\n                tr.doc.nodesBetween(start, tr.doc.content.size, (node, pos) => {\n                    if (sel > -1)\n                        return false;\n                    if (node.isTextblock && node.content.size == 0)\n                        sel = pos + 1;\n                });\n                if (sel > -1)\n                    tr.setSelection(Selection.near(tr.doc.resolve(sel)));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n        let nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n        let tr = state.tr.delete($from.pos, $to.pos);\n        let types = nextType ? [itemAttrs ? { type: itemType, attrs: itemAttrs } : null, { type: nextType }] : undefined;\n        if (!canSplit(tr.doc, $from.pos, 2, types))\n            return false;\n        if (dispatch)\n            dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n        return true;\n    };\n}\n/**\nActs like [`splitListItem`](https://prosemirror.net/docs/ref/#schema-list.splitListItem), but\nwithout resetting the set of active marks at the cursor.\n*/\nfunction splitListItemKeepMarks(itemType, itemAttrs) {\n    let split = splitListItem(itemType, itemAttrs);\n    return (state, dispatch) => {\n        return split(state, dispatch && (tr => {\n            let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n            if (marks)\n                tr.ensureMarks(marks);\n            dispatch(tr);\n        }));\n    };\n}\n/**\nCreate a command to lift the list item around the selection up into\na wrapping list.\n*/\nfunction liftListItem(itemType) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n        if (!range)\n            return false;\n        if (!dispatch)\n            return true;\n        if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n            return liftToOuterList(state, dispatch, itemType, range);\n        else // Outer list node\n            return liftOutOfList(state, dispatch, range);\n    };\n}\nfunction liftToOuterList(state, dispatch, itemType, range) {\n    let tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n    if (end < endOfList) {\n        // There are siblings after the lifted items, which must become\n        // children of the last item\n        tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList, new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n        range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n    }\n    const target = liftTarget(range);\n    if (target == null)\n        return false;\n    tr.lift(range, target);\n    let $after = tr.doc.resolve(tr.mapping.map(end, -1) - 1);\n    if (canJoin(tr.doc, $after.pos) && $after.nodeBefore.type == $after.nodeAfter.type)\n        tr.join($after.pos);\n    dispatch(tr.scrollIntoView());\n    return true;\n}\nfunction liftOutOfList(state, dispatch, range) {\n    let tr = state.tr, list = range.parent;\n    // Merge the list items into a single big item\n    for (let pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n        pos -= list.child(i).nodeSize;\n        tr.delete(pos - 1, pos + 1);\n    }\n    let $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n    if (tr.mapping.map(range.end) != range.start + $start.nodeAfter.nodeSize)\n        return false;\n    let atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n    let parent = $start.node(-1), indexBefore = $start.index(-1);\n    if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1, item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n        return false;\n    let start = $start.pos, end = start + item.nodeSize;\n    // Strip off the surrounding list. At the sides where we're not at\n    // the end of the list, the existing list is closed. At sides where\n    // this is the end, it is overwritten to its end.\n    tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1, new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n        .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))), atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n    dispatch(tr.scrollIntoView());\n    return true;\n}\n/**\nCreate a command to sink the list item around the selection down\ninto an inner list.\n*/\nfunction sinkListItem(itemType) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n        if (!range)\n            return false;\n        let startIndex = range.startIndex;\n        if (startIndex == 0)\n            return false;\n        let parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n        if (nodeBefore.type != itemType)\n            return false;\n        if (dispatch) {\n            let nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n            let inner = Fragment.from(nestedBefore ? itemType.create() : null);\n            let slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))), nestedBefore ? 3 : 1, 0);\n            let before = range.start, after = range.end;\n            dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice, 1, true))\n                .scrollIntoView());\n        }\n        return true;\n    };\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, splitListItemKeepMarks, wrapInList, wrapRangeInList };\n","export var base = {\n  8: \"Backspace\",\n  9: \"Tab\",\n  10: \"Enter\",\n  12: \"NumLock\",\n  13: \"Enter\",\n  16: \"Shift\",\n  17: \"Control\",\n  18: \"Alt\",\n  20: \"CapsLock\",\n  27: \"Escape\",\n  32: \" \",\n  33: \"PageUp\",\n  34: \"PageDown\",\n  35: \"End\",\n  36: \"Home\",\n  37: \"ArrowLeft\",\n  38: \"ArrowUp\",\n  39: \"ArrowRight\",\n  40: \"ArrowDown\",\n  44: \"PrintScreen\",\n  45: \"Insert\",\n  46: \"Delete\",\n  59: \";\",\n  61: \"=\",\n  91: \"Meta\",\n  92: \"Meta\",\n  106: \"*\",\n  107: \"+\",\n  108: \",\",\n  109: \"-\",\n  110: \".\",\n  111: \"/\",\n  144: \"NumLock\",\n  145: \"ScrollLock\",\n  160: \"Shift\",\n  161: \"Shift\",\n  162: \"Control\",\n  163: \"Control\",\n  164: \"Alt\",\n  165: \"Alt\",\n  173: \"-\",\n  186: \";\",\n  187: \"=\",\n  188: \",\",\n  189: \"-\",\n  190: \".\",\n  191: \"/\",\n  192: \"`\",\n  219: \"[\",\n  220: \"\\\\\",\n  221: \"]\",\n  222: \"'\"\n}\n\nexport var shift = {\n  48: \")\",\n  49: \"!\",\n  50: \"@\",\n  51: \"#\",\n  52: \"$\",\n  53: \"%\",\n  54: \"^\",\n  55: \"&\",\n  56: \"*\",\n  57: \"(\",\n  59: \":\",\n  61: \"+\",\n  173: \"_\",\n  186: \":\",\n  187: \"+\",\n  188: \"<\",\n  189: \"_\",\n  190: \">\",\n  191: \"?\",\n  192: \"~\",\n  219: \"{\",\n  220: \"|\",\n  221: \"}\",\n  222: \"\\\"\"\n}\n\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n  base[i] = String.fromCharCode(i + 32)\n  shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n  // On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.\n  // On IE, shift effect is never included in `.key`.\n  var ignoreKey = mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||\n      ie && event.shiftKey && event.key && event.key.length == 1 ||\n      event.key == \"Unidentified\"\n  var name = (!ignoreKey && event.key) ||\n    (event.shiftKey ? shift : base)[event.keyCode] ||\n    event.key || \"Unidentified\"\n  // Edge sometimes produces wrong names (Issue #3)\n  if (name == \"Esc\") name = \"Escape\"\n  if (name == \"Del\") name = \"Delete\"\n  // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n  if (name == \"Left\") name = \"ArrowLeft\"\n  if (name == \"Up\") name = \"ArrowUp\"\n  if (name == \"Right\") name = \"ArrowRight\"\n  if (name == \"Down\") name = \"ArrowDown\"\n  return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\nconst mac = typeof navigator != \"undefined\" && /Mac|iP(hone|[oa]d)/.test(navigator.platform);\nconst windows = typeof navigator != \"undefined\" && /Win/.test(navigator.platform);\nfunction normalizeKeyName(name) {\n    let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n    if (result == \"Space\")\n        result = \" \";\n    let alt, ctrl, shift, meta;\n    for (let i = 0; i < parts.length - 1; i++) {\n        let mod = parts[i];\n        if (/^(cmd|meta|m)$/i.test(mod))\n            meta = true;\n        else if (/^a(lt)?$/i.test(mod))\n            alt = true;\n        else if (/^(c|ctrl|control)$/i.test(mod))\n            ctrl = true;\n        else if (/^s(hift)?$/i.test(mod))\n            shift = true;\n        else if (/^mod$/i.test(mod)) {\n            if (mac)\n                meta = true;\n            else\n                ctrl = true;\n        }\n        else\n            throw new Error(\"Unrecognized modifier name: \" + mod);\n    }\n    if (alt)\n        result = \"Alt-\" + result;\n    if (ctrl)\n        result = \"Ctrl-\" + result;\n    if (meta)\n        result = \"Meta-\" + result;\n    if (shift)\n        result = \"Shift-\" + result;\n    return result;\n}\nfunction normalize(map) {\n    let copy = Object.create(null);\n    for (let prop in map)\n        copy[normalizeKeyName(prop)] = map[prop];\n    return copy;\n}\nfunction modifiers(name, event, shift = true) {\n    if (event.altKey)\n        name = \"Alt-\" + name;\n    if (event.ctrlKey)\n        name = \"Ctrl-\" + name;\n    if (event.metaKey)\n        name = \"Meta-\" + name;\n    if (shift && event.shiftKey)\n        name = \"Shift-\" + name;\n    return name;\n}\n/**\nCreate a keymap plugin for the given set of bindings.\n\nBindings should map key names to [command](https://prosemirror.net/docs/ref/#commands)-style\nfunctions, which will be called with `(EditorState, dispatch,\nEditorView)` arguments, and should return true when they've handled\nthe key. Note that the view argument isn't part of the command\nprotocol, but can be used as an escape hatch if a binding needs to\ndirectly interact with the UI.\n\nKey names may be strings like `\"Shift-Ctrl-Enter\"`—a key\nidentifier prefixed with zero or more modifiers. Key identifiers\nare based on the strings that can appear in\n[`KeyEvent.key`](https:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\nUse lowercase letters to refer to letter keys (or uppercase letters\nif you want shift to be held). You may use `\"Space\"` as an alias\nfor the `\" \"` name.\n\nModifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n`a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n`Meta-`) are recognized. For characters that are created by holding\nshift, the `Shift-` prefix is implied, and should not be added\nexplicitly.\n\nYou can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\nother platforms.\n\nYou can add multiple keymap plugins to an editor. The order in\nwhich they appear determines their precedence (the ones early in\nthe array get to dispatch first).\n*/\nfunction keymap(bindings) {\n    return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } });\n}\n/**\nGiven a set of bindings (using the same format as\n[`keymap`](https://prosemirror.net/docs/ref/#keymap.keymap)), return a [keydown\nhandler](https://prosemirror.net/docs/ref/#view.EditorProps.handleKeyDown) that handles them.\n*/\nfunction keydownHandler(bindings) {\n    let map = normalize(bindings);\n    return function (view, event) {\n        let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n        if (direct && direct(view.state, view.dispatch, view))\n            return true;\n        // A character key\n        if (name.length == 1 && name != \" \") {\n            if (event.shiftKey) {\n                // In case the name was already modified by shift, try looking\n                // it up without its shift modifier\n                let noShift = map[modifiers(name, event, false)];\n                if (noShift && noShift(view.state, view.dispatch, view))\n                    return true;\n            }\n            if ((event.altKey || event.metaKey || event.ctrlKey) &&\n                // Ctrl-Alt may be used for AltGr on Windows\n                !(windows && event.ctrlKey && event.altKey) &&\n                (baseName = base[event.keyCode]) && baseName != name) {\n                // Try falling back to the keyCode when there's a modifier\n                // active or the character produced isn't ASCII, and our table\n                // produces a different name from the the keyCode. See #668,\n                // #1060, #1529.\n                let fromCode = map[modifiers(baseName, event)];\n                if (fromCode && fromCode(view.state, view.dispatch, view))\n                    return true;\n            }\n        }\n        return false;\n    };\n}\n\nexport { keydownHandler, keymap };\n","import { t as __exportAll } from \"./rolldown-runtime-D7D4PA-g.js\";\nimport { RemoveMarkStep, ReplaceAroundStep, ReplaceStep, Transform, canJoin, canSplit, findWrapping, joinPoint, liftTarget } from \"@tiptap/pm/transform\";\nimport { createParagraphNear, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, newlineInCode, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, wrapIn } from \"@tiptap/pm/commands\";\nimport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, TextSelection } from \"@tiptap/pm/state\";\nimport { DOMParser, DOMSerializer, Fragment as Fragment$1, Node as Node$1, Schema, Slice } from \"@tiptap/pm/model\";\nimport { liftListItem, sinkListItem, wrapInList } from \"@tiptap/pm/schema-list\";\nimport { Decoration as Decoration$1, DecorationSet, EditorView } from \"@tiptap/pm/view\";\nimport { keymap } from \"@tiptap/pm/keymap\";\n//#region src/helpers/createChainableState.ts\n/**\n* Takes a Transaction & Editor State and turns it into a chainable state object\n* @param config The transaction and state to create the chainable state from\n* @returns A chainable Editor state object\n*/\nfunction createChainableState(config) {\n\tconst { state, transaction } = config;\n\tlet { selection } = transaction;\n\tlet { doc } = transaction;\n\tlet { storedMarks } = transaction;\n\treturn {\n\t\t...state,\n\t\tapply: state.apply.bind(state),\n\t\tapplyTransaction: state.applyTransaction.bind(state),\n\t\tplugins: state.plugins,\n\t\tschema: state.schema,\n\t\treconfigure: state.reconfigure.bind(state),\n\t\ttoJSON: state.toJSON.bind(state),\n\t\tget storedMarks() {\n\t\t\treturn storedMarks;\n\t\t},\n\t\tget selection() {\n\t\t\treturn selection;\n\t\t},\n\t\tget doc() {\n\t\t\treturn doc;\n\t\t},\n\t\tget tr() {\n\t\t\tselection = transaction.selection;\n\t\t\tdoc = transaction.doc;\n\t\t\tstoredMarks = transaction.storedMarks;\n\t\t\treturn transaction;\n\t\t}\n\t};\n}\n//#endregion\n//#region src/CommandManager.ts\nvar CommandManager = class CommandManager {\n\tconstructor(props) {\n\t\tthis.editor = props.editor;\n\t\tthis.rawCommands = this.editor.extensionManager.commands;\n\t\tthis.customState = props.state;\n\t}\n\tget hasCustomState() {\n\t\treturn !!this.customState;\n\t}\n\tget state() {\n\t\treturn this.customState || this.editor.state;\n\t}\n\tget commands() {\n\t\tconst { rawCommands, editor, state } = this;\n\t\tconst { view } = editor;\n\t\tconst { tr } = state;\n\t\tconst props = this.buildProps(tr);\n\t\treturn Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n\t\t\tconst method = (...args) => {\n\t\t\t\tconst callback = command(...args)(props);\n\t\t\t\tif (!tr.getMeta(\"preventDispatch\") && !this.hasCustomState) view.dispatch(tr);\n\t\t\t\treturn callback;\n\t\t\t};\n\t\t\treturn [name, method];\n\t\t}));\n\t}\n\tget chain() {\n\t\treturn () => this.createChain();\n\t}\n\tget can() {\n\t\treturn () => this.createCan();\n\t}\n\tcreateChain(startTr, shouldDispatch = true) {\n\t\tconst { rawCommands, editor, state } = this;\n\t\tconst { view } = editor;\n\t\tconst callbacks = [];\n\t\tconst hasStartTransaction = !!startTr;\n\t\tconst tr = startTr || state.tr;\n\t\tconst run = () => {\n\t\t\tif (!hasStartTransaction && shouldDispatch && !tr.getMeta(\"preventDispatch\") && !this.hasCustomState) view.dispatch(tr);\n\t\t\treturn callbacks.every((callback) => callback === true);\n\t\t};\n\t\tconst chain = {\n\t\t\t...Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n\t\t\t\tconst chainedCommand = (...args) => {\n\t\t\t\t\tconst props = this.buildProps(tr, shouldDispatch);\n\t\t\t\t\tconst callback = command(...args)(props);\n\t\t\t\t\tcallbacks.push(callback);\n\t\t\t\t\treturn chain;\n\t\t\t\t};\n\t\t\t\treturn [name, chainedCommand];\n\t\t\t})),\n\t\t\trun\n\t\t};\n\t\treturn chain;\n\t}\n\t/**\n\t* Creates a chain that safely returns `false` when run.\n\t* @returns A non-dispatching command chain.\n\t* @example\n\t* const chain = CommandManager.createFakeChain()\n\t* chain.focus().run() // false\n\t*/\n\tstatic createFakeChain() {\n\t\tconst chain = new Proxy({}, { get: (_target, property) => {\n\t\t\tif (property === \"then\") return;\n\t\t\tif (property === \"run\") return () => false;\n\t\t\treturn () => chain;\n\t\t} });\n\t\treturn chain;\n\t}\n\tcreateCan(startTr) {\n\t\tconst { rawCommands, state } = this;\n\t\tconst dispatch = false;\n\t\tconst tr = startTr || state.tr;\n\t\tconst props = this.buildProps(tr, dispatch);\n\t\treturn {\n\t\t\t...Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n\t\t\t\treturn [name, (...args) => command(...args)({\n\t\t\t\t\t...props,\n\t\t\t\t\tdispatch: void 0\n\t\t\t\t})];\n\t\t\t})),\n\t\t\tchain: () => this.createChain(tr, dispatch)\n\t\t};\n\t}\n\t/**\n\t* Creates capability checks that safely return `false`.\n\t* @returns A non-dispatching capability checker.\n\t* @example\n\t* const can = CommandManager.createFallbackCan()\n\t* can.focus() // false\n\t*/\n\tstatic createFallbackCan() {\n\t\tconst chain = CommandManager.createFakeChain();\n\t\treturn new Proxy({ chain: () => chain }, { get: (target, property) => {\n\t\t\tif (property === \"then\") return;\n\t\t\tif (property === \"chain\") return target.chain;\n\t\t\treturn () => false;\n\t\t} });\n\t}\n\tbuildProps(tr, shouldDispatch = true) {\n\t\tconst { rawCommands, editor, state } = this;\n\t\tconst { view } = editor;\n\t\tconst props = {\n\t\t\ttr,\n\t\t\teditor,\n\t\t\tview,\n\t\t\tstate: createChainableState({\n\t\t\t\tstate,\n\t\t\t\ttransaction: tr\n\t\t\t}),\n\t\t\tdispatch: shouldDispatch ? () => void 0 : void 0,\n\t\t\tchain: () => this.createChain(tr, shouldDispatch),\n\t\t\tcan: () => this.createCan(tr),\n\t\t\tget commands() {\n\t\t\t\treturn Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n\t\t\t\t\treturn [name, (...args) => command(...args)(props)];\n\t\t\t\t}));\n\t\t\t}\n\t\t};\n\t\treturn props;\n\t}\n};\n//#endregion\n//#region src/commands/blur.ts\nconst blur = () => ({ editor, view }) => {\n\trequestAnimationFrame(() => {\n\t\tif (!editor.isDestroyed) {\n\t\t\tvar _window;\n\t\t\tview.dom.blur();\n\t\t\t(_window = window) === null || _window === void 0 || (_window = _window.getSelection()) === null || _window === void 0 || _window.removeAllRanges();\n\t\t}\n\t});\n\treturn true;\n};\n//#endregion\n//#region src/commands/clearContent.ts\nconst clearContent = (emitUpdate = true) => ({ commands }) => {\n\treturn commands.setContent(\"\", { emitUpdate });\n};\n//#endregion\n//#region src/commands/clearNodes.ts\nconst clearNodes = () => ({ state, tr, dispatch }) => {\n\tconst { selection } = tr;\n\tconst { ranges } = selection;\n\tif (!dispatch) return true;\n\tranges.forEach(({ $from, $to }) => {\n\t\tstate.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n\t\t\tif (node.type.isText) return;\n\t\t\tconst { doc, mapping } = tr;\n\t\t\tconst $mappedFrom = doc.resolve(mapping.map(pos));\n\t\t\tconst $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize));\n\t\t\tconst nodeRange = $mappedFrom.blockRange($mappedTo);\n\t\t\tif (!nodeRange) return;\n\t\t\tconst targetLiftDepth = liftTarget(nodeRange);\n\t\t\tif (node.type.isTextblock) {\n\t\t\t\tconst { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index());\n\t\t\t\ttr.setNodeMarkup(nodeRange.start, defaultType);\n\t\t\t}\n\t\t\tif (targetLiftDepth || targetLiftDepth === 0) tr.lift(nodeRange, targetLiftDepth);\n\t\t});\n\t});\n\treturn true;\n};\n//#endregion\n//#region src/commands/command.ts\nconst command = (fn) => (props) => {\n\treturn fn(props);\n};\n//#endregion\n//#region src/commands/createParagraphNear.ts\nconst createParagraphNear$1 = () => ({ state, dispatch }) => {\n\treturn createParagraphNear(state, dispatch);\n};\n//#endregion\n//#region src/commands/cut.ts\nconst cut = (originRange, targetPos) => ({ editor, tr }) => {\n\tconst { state } = editor;\n\tconst contentSlice = state.doc.slice(originRange.from, originRange.to);\n\ttr.deleteRange(originRange.from, originRange.to);\n\tconst newPos = tr.mapping.map(targetPos);\n\ttr.insert(newPos, contentSlice.content);\n\ttr.setSelection(new TextSelection(tr.doc.resolve(Math.max(newPos - 1, 0))));\n\treturn true;\n};\n//#endregion\n//#region src/commands/deleteCurrentNode.ts\nconst deleteCurrentNode = () => ({ tr, dispatch }) => {\n\tconst { selection } = tr;\n\tconst currentNode = selection.$anchor.node();\n\tif (currentNode.content.size > 0) return false;\n\tconst $pos = tr.selection.$anchor;\n\tfor (let depth = $pos.depth; depth > 0; depth -= 1) if ($pos.node(depth).type === currentNode.type) {\n\t\tif (dispatch) {\n\t\t\tconst from = $pos.before(depth);\n\t\t\tconst to = $pos.after(depth);\n\t\t\ttr.delete(from, to).scrollIntoView();\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n};\n//#endregion\n//#region src/helpers/getNodeType.ts\nfunction getNodeType(nameOrType, schema) {\n\tif (typeof nameOrType === \"string\") {\n\t\tif (!schema.nodes[nameOrType]) throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`);\n\t\treturn schema.nodes[nameOrType];\n\t}\n\treturn nameOrType;\n}\n//#endregion\n//#region src/commands/deleteNode.ts\nconst deleteNode = (typeOrName) => ({ tr, state, dispatch }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\tconst $pos = tr.selection.$anchor;\n\tfor (let depth = $pos.depth; depth > 0; depth -= 1) if ($pos.node(depth).type === type) {\n\t\tif (dispatch) {\n\t\t\tconst from = $pos.before(depth);\n\t\t\tconst to = $pos.after(depth);\n\t\t\ttr.delete(from, to).scrollIntoView();\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n};\n//#endregion\n//#region src/commands/deleteRange.ts\nconst deleteRange = (range) => ({ tr, dispatch }) => {\n\tconst { from, to } = range;\n\tif (dispatch) tr.delete(from, to);\n\treturn true;\n};\n//#endregion\n//#region src/commands/deleteSelection.ts\n/**\n* Check if a node has text content based on its content specification.\n* Returns true if the node's content spec matches text* or text+ patterns.\n*/\nconst hasTextContent = (nodeSpec) => {\n\tif (!nodeSpec.content) return false;\n\treturn /^text(\\*|\\+)/.test(nodeSpec.content);\n};\n/**\n* Expand selection position for a specific side (left or right) to handle inline text nodes.\n* This function checks if the position is within an inline node with text content and\n* expands it to include the entire node boundaries for proper deletion.\n* @param $pos - The resolved position to expand\n* @param schema - The ProseMirror schema\n* @param side - Which side to expand ('left' or 'right')\n* @returns The expanded position for deletion\n*/\nconst expandSelectionForSide = ($pos, schema, side) => {\n\tif (!$pos.parent.isInline) return $pos.pos;\n\tif (side === \"left\" && $pos.pos > $pos.start() || side === \"right\" && $pos.pos < $pos.end()) return $pos.pos;\n\tconst parentContent = schema.nodes[$pos.parent.type.name].spec;\n\tif (!hasTextContent(parentContent)) return $pos.pos;\n\treturn side === \"left\" ? $pos.start() - 1 : $pos.end() + 1;\n};\n/**\n* Expand selection range to properly handle deletion of inline text nodes.\n* Inline text nodes don't collapse correctly when text inside is deleted,\n* so we need to expand the selection to include the entire node.\n* See: https://code.haverbeke.berlin/prosemirror/prosemirror/issues/1365\n*/\nconst expandSelectionForInlineText = ($from, $to, schema) => {\n\treturn {\n\t\tfrom: expandSelectionForSide($from, schema, \"left\"),\n\t\tto: expandSelectionForSide($to, schema, \"right\")\n\t};\n};\nconst deleteSelection = () => ({ state, dispatch }) => {\n\tif (state.selection.empty) return false;\n\tif (dispatch) {\n\t\tconst tr = state.tr;\n\t\tconst { ranges } = state.selection;\n\t\tconst mapFrom = tr.steps.length;\n\t\tranges.forEach((range) => {\n\t\t\tconst mapping = tr.mapping.slice(mapFrom);\n\t\t\tconst $from = tr.doc.resolve(mapping.map(range.$from.pos));\n\t\t\tconst $to = tr.doc.resolve(mapping.map(range.$to.pos));\n\t\t\tconst { from, to } = expandSelectionForInlineText($from, $to, state.schema);\n\t\t\ttr.deleteRange(from, to);\n\t\t});\n\t\tif (!tr.selection.empty) tr.setSelection(TextSelection.near(tr.doc.resolve(tr.selection.from)));\n\t\ttr.scrollIntoView();\n\t\tdispatch(tr);\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/enter.ts\nconst enter = () => ({ commands }) => {\n\treturn commands.keyboardShortcut(\"Enter\");\n};\n//#endregion\n//#region src/commands/exitCode.ts\nconst exitCode$1 = () => ({ state, dispatch }) => {\n\treturn exitCode(state, dispatch);\n};\n//#endregion\n//#region src/utilities/isRegExp.ts\nfunction isRegExp(value) {\n\treturn Object.prototype.toString.call(value) === \"[object RegExp]\";\n}\n//#endregion\n//#region src/utilities/objectIncludes.ts\n/**\n* Check if object1 includes object2\n* @param object1 Object\n* @param object2 Object\n*/\nfunction objectIncludes(object1, object2, options = { strict: true }) {\n\tconst keys = Object.keys(object2);\n\tif (!keys.length) return true;\n\treturn keys.every((key) => {\n\t\tif (options.strict) return object2[key] === object1[key];\n\t\tif (isRegExp(object2[key])) return object2[key].test(object1[key]);\n\t\treturn object2[key] === object1[key];\n\t});\n}\n//#endregion\n//#region src/helpers/getMarkRange.ts\nfunction findMarkInSet(marks, type, attributes = {}) {\n\treturn marks.find((item) => {\n\t\treturn item.type === type && objectIncludes(Object.fromEntries(Object.keys(attributes).map((k) => [k, item.attrs[k]])), attributes);\n\t});\n}\nfunction isMarkInSet(marks, type, attributes = {}) {\n\treturn !!findMarkInSet(marks, type, attributes);\n}\n/**\n* Get the range of a mark at a resolved position.\n*/\nfunction getMarkRange($pos, type, attributes) {\n\tif (!$pos || !type) return;\n\tlet start = $pos.parent.childAfter($pos.parentOffset);\n\tif (!start.node || !start.node.marks.some((mark) => mark.type === type)) start = $pos.parent.childBefore($pos.parentOffset);\n\tif (!start.node || !start.node.marks.some((mark) => mark.type === type)) return;\n\tif (!attributes) {\n\t\tconst firstMark = start.node.marks.find((mark) => mark.type === type);\n\t\tif (firstMark) attributes = firstMark.attrs;\n\t}\n\tif (!findMarkInSet([...start.node.marks], type, attributes)) return;\n\tlet startIndex = start.index;\n\tlet startPos = $pos.start() + start.offset;\n\tlet endIndex = startIndex + 1;\n\tlet endPos = startPos + start.node.nodeSize;\n\twhile (startIndex > 0 && isMarkInSet([...$pos.parent.child(startIndex - 1).marks], type, attributes)) {\n\t\tstartIndex -= 1;\n\t\tstartPos -= $pos.parent.child(startIndex).nodeSize;\n\t}\n\twhile (endIndex < $pos.parent.childCount && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)) {\n\t\tendPos += $pos.parent.child(endIndex).nodeSize;\n\t\tendIndex += 1;\n\t}\n\treturn {\n\t\tfrom: startPos,\n\t\tto: endPos\n\t};\n}\n//#endregion\n//#region src/helpers/getMarkType.ts\nfunction getMarkType(nameOrType, schema) {\n\tif (typeof nameOrType === \"string\") {\n\t\tif (!schema.marks[nameOrType]) throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`);\n\t\treturn schema.marks[nameOrType];\n\t}\n\treturn nameOrType;\n}\n//#endregion\n//#region src/commands/extendMarkRange.ts\nconst extendMarkRange = (typeOrName, attributes) => ({ tr, state, dispatch }) => {\n\tconst type = getMarkType(typeOrName, state.schema);\n\tconst { doc, selection } = tr;\n\tconst { $from, from, to } = selection;\n\tif (dispatch) {\n\t\tconst range = getMarkRange($from, type, attributes);\n\t\tif (range && range.from <= from && range.to >= to) {\n\t\t\tconst newSelection = TextSelection.create(doc, range.from, range.to);\n\t\t\ttr.setSelection(newSelection);\n\t\t}\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/first.ts\nconst first = (commands) => (props) => {\n\tconst items = typeof commands === \"function\" ? commands(props) : commands;\n\tfor (let i = 0; i < items.length; i += 1) if (items[i](props)) return true;\n\treturn false;\n};\n//#endregion\n//#region src/helpers/isTextSelection.ts\nfunction isTextSelection(value) {\n\treturn value instanceof TextSelection;\n}\n//#endregion\n//#region src/utilities/minMax.ts\nfunction minMax(value = 0, min = 0, max = 0) {\n\treturn Math.min(Math.max(value, min), max);\n}\n//#endregion\n//#region src/helpers/resolveFocusPosition.ts\nfunction resolveFocusPosition(doc, position = null) {\n\tif (!position) return null;\n\tconst selectionAtStart = Selection.atStart(doc);\n\tconst selectionAtEnd = Selection.atEnd(doc);\n\tif (position === \"start\" || position === true) return selectionAtStart;\n\tif (position === \"end\") return selectionAtEnd;\n\tconst minPos = selectionAtStart.from;\n\tconst maxPos = selectionAtEnd.to;\n\tif (position === \"all\") return TextSelection.create(doc, minMax(0, minPos, maxPos), minMax(doc.content.size, minPos, maxPos));\n\treturn TextSelection.create(doc, minMax(position, minPos, maxPos), minMax(position, minPos, maxPos));\n}\n//#endregion\n//#region src/utilities/isAndroid.ts\nfunction isAndroid() {\n\treturn [\"Android\"].includes(navigator.platform) || /android/i.test(navigator.userAgent);\n}\n//#endregion\n//#region src/utilities/isiOS.ts\nfunction isiOS() {\n\treturn [\n\t\t\"iPad Simulator\",\n\t\t\"iPhone Simulator\",\n\t\t\"iPod Simulator\",\n\t\t\"iPad\",\n\t\t\"iPhone\",\n\t\t\"iPod\"\n\t].includes(navigator.platform) || navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document;\n}\n//#endregion\n//#region src/utilities/isSafari.ts\n/**\n* Detects if the current browser is Safari (but not iOS Safari or Chrome).\n* @returns `true` if the browser is Safari, `false` otherwise.\n* @example\n* if (isSafari()) {\n*   // Safari-specific handling\n* }\n*/\nfunction isSafari() {\n\treturn typeof navigator !== \"undefined\" ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent) : false;\n}\n//#endregion\n//#region src/commands/focus.ts\nconst focus = (position = null, options = {}) => ({ editor, view, tr, dispatch }) => {\n\toptions = {\n\t\tscrollIntoView: true,\n\t\t...options\n\t};\n\tconst delayedFocus = () => {\n\t\tif (isiOS() || isAndroid()) view.dom.focus();\n\t\tif (isSafari() && !isiOS() && !isAndroid()) view.dom.focus({ preventScroll: true });\n\t\trequestAnimationFrame(() => {\n\t\t\tif (!editor.isDestroyed) {\n\t\t\t\tview.focus();\n\t\t\t\tif (options === null || options === void 0 ? void 0 : options.scrollIntoView) editor.commands.scrollIntoView();\n\t\t\t}\n\t\t});\n\t};\n\ttry {\n\t\tif (view.hasFocus() && position === null || position === false) return true;\n\t} catch {\n\t\treturn false;\n\t}\n\tif (dispatch && position === null && !isTextSelection(editor.state.selection)) {\n\t\tdelayedFocus();\n\t\treturn true;\n\t}\n\tconst selection = resolveFocusPosition(tr.doc, position) || editor.state.selection;\n\tconst isSameSelection = editor.state.selection.eq(selection);\n\tif (dispatch) {\n\t\tif (!isSameSelection) tr.setSelection(selection);\n\t\tif (isSameSelection && tr.storedMarks) tr.setStoredMarks(tr.storedMarks);\n\t\tdelayedFocus();\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/forEach.ts\nconst forEach = (items, fn) => (props) => {\n\treturn items.every((item, index) => fn(item, {\n\t\t...props,\n\t\tindex\n\t}));\n};\n//#endregion\n//#region src/commands/insertContent.ts\nconst insertContent = (value, options) => ({ tr, commands }) => {\n\treturn commands.insertContentAt({\n\t\tfrom: tr.selection.from,\n\t\tto: tr.selection.to\n\t}, value, options);\n};\n//#endregion\n//#region src/utilities/elementFromString.ts\nconst removeWhitespaces = (node) => {\n\tconst children = node.childNodes;\n\tfor (let i = children.length - 1; i >= 0; i -= 1) {\n\t\tconst child = children[i];\n\t\tif (child.nodeType === 3 && child.nodeValue && /^(\\n\\s\\s|\\n)$/.test(child.nodeValue)) node.removeChild(child);\n\t\telse if (child.nodeType === 1) removeWhitespaces(child);\n\t}\n\treturn node;\n};\nfunction elementFromString(value) {\n\tif (typeof window === \"undefined\") throw new Error(\"[tiptap error]: there is no window object available, so this function cannot be used\");\n\tconst wrappedValue = `<body>${value}</body>`;\n\tconst html = new window.DOMParser().parseFromString(wrappedValue, \"text/html\").body;\n\treturn removeWhitespaces(html);\n}\n//#endregion\n//#region src/helpers/isProseMirrorContent.ts\n/**\n* Checks whether a value is already a ProseMirror node or fragment. Looks for the\n* `nodesBetween` method, because `instanceof` fails when prosemirror-model is loaded twice.\n* @param value Any value that could be passed as content\n* @returns True for a node or a fragment, false for JSON, HTML and everything else\n* @example ```js\n* isProseMirrorContent(editor.state.doc)\n* ```\n*/\nfunction isProseMirrorContent(value) {\n\treturn typeof (value === null || value === void 0 ? void 0 : value.nodesBetween) === \"function\";\n}\n//#endregion\n//#region src/helpers/createNodeFromContent.ts\n/**\n* Takes a JSON or HTML content and creates a Prosemirror node or fragment from it.\n* @param content The JSON or HTML content to create the node from\n* @param schema The Prosemirror schema to use for the node\n* @param options Options for the parser\n* @returns The created Prosemirror node or fragment\n*/\nfunction createNodeFromContent(content, schema, options) {\n\tif (isProseMirrorContent(content)) return content;\n\tconst isJSONContent = typeof content === \"object\" && content !== null;\n\toptions = {\n\t\tslice: true,\n\t\tparseOptions: {},\n\t\t...options\n\t};\n\tconst isTextContent = typeof content === \"string\";\n\tif (isJSONContent) try {\n\t\tif (Array.isArray(content) && content.length > 0) return Fragment$1.fromArray(content.map((item) => schema.nodeFromJSON(item)));\n\t\tconst node = schema.nodeFromJSON(content);\n\t\tif (options.errorOnInvalidContent) node.check();\n\t\treturn node;\n\t} catch (error) {\n\t\tif (options.errorOnInvalidContent) throw new Error(\"[tiptap error]: Invalid JSON content\", { cause: error });\n\t\tconsole.warn(\"[tiptap warn]: Invalid content.\", \"Passed value:\", content, \"Error:\", error);\n\t\treturn createNodeFromContent(\"\", schema, options);\n\t}\n\tif (isTextContent) {\n\t\tif (options.errorOnInvalidContent) {\n\t\t\tlet hasInvalidContent = false;\n\t\t\tlet invalidContent = \"\";\n\t\t\tconst contentCheckSchema = new Schema({\n\t\t\t\ttopNode: schema.spec.topNode,\n\t\t\t\tmarks: schema.spec.marks,\n\t\t\t\tnodes: schema.spec.nodes.append({ __tiptap__private__unknown__catch__all__node: {\n\t\t\t\t\tcontent: \"inline*\",\n\t\t\t\t\tgroup: \"block\",\n\t\t\t\t\tparseDOM: [{\n\t\t\t\t\t\ttag: \"*\",\n\t\t\t\t\t\tgetAttrs: (e) => {\n\t\t\t\t\t\t\thasInvalidContent = true;\n\t\t\t\t\t\t\tinvalidContent = typeof e === \"string\" ? e : e.outerHTML;\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t} })\n\t\t\t});\n\t\t\tif (options.slice) DOMParser.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions);\n\t\t\telse DOMParser.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions);\n\t\t\tif (options.errorOnInvalidContent && hasInvalidContent) throw new Error(\"[tiptap error]: Invalid HTML content\", { cause: /* @__PURE__ */ new Error(`Invalid element found: ${invalidContent}`) });\n\t\t}\n\t\tconst parser = DOMParser.fromSchema(schema);\n\t\tif (options.slice) return parser.parseSlice(elementFromString(content), options.parseOptions).content;\n\t\treturn parser.parse(elementFromString(content), options.parseOptions);\n\t}\n\treturn createNodeFromContent(\"\", schema, options);\n}\n//#endregion\n//#region src/helpers/isFragment.ts\n/**\n* Checks whether a node or fragment is a fragment. Looks for a missing `type` field,\n* because `instanceof` fails when prosemirror-model is loaded twice.\n* @param nodeOrFragment A ProseMirror node or fragment\n* @returns True for a fragment, false for a node\n* @example ```js\n* isFragment(editor.state.doc.content)\n* ```\n*/\nfunction isFragment(nodeOrFragment) {\n\treturn !(\"type\" in nodeOrFragment);\n}\n//#endregion\n//#region src/helpers/selectionToInsertionEnd.ts\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n\tconst last = tr.steps.length - 1;\n\tif (last < startLen) return;\n\tconst step = tr.steps[last];\n\tif (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) return;\n\tconst map = tr.mapping.maps[last];\n\tlet end = 0;\n\tmap.forEach((_from, _to, _newFrom, newTo) => {\n\t\tif (end === 0) end = newTo;\n\t});\n\ttr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n//#endregion\n//#region src/commands/insertContentAt.ts\nconst insertContentAt = (position, value, options) => ({ tr, dispatch, editor }) => {\n\tif (dispatch) {\n\t\toptions = {\n\t\t\tparseOptions: editor.options.parseOptions,\n\t\t\tupdateSelection: true,\n\t\t\tapplyInputRules: false,\n\t\t\tapplyPasteRules: false,\n\t\t\t...options\n\t\t};\n\t\tlet content;\n\t\tconst emitContentError = (error) => {\n\t\t\teditor.emit(\"contentError\", {\n\t\t\t\teditor,\n\t\t\t\terror,\n\t\t\t\tdisableCollaboration: () => {\n\t\t\t\t\tif (\"collaboration\" in editor.storage && typeof editor.storage.collaboration === \"object\" && editor.storage.collaboration) editor.storage.collaboration.isDisabled = true;\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tconst parseOptions = {\n\t\t\tpreserveWhitespace: \"full\",\n\t\t\t...options.parseOptions\n\t\t};\n\t\tif (!options.errorOnInvalidContent && !editor.options.enableContentCheck && editor.options.emitContentError) try {\n\t\t\tcreateNodeFromContent(value, editor.schema, {\n\t\t\t\tparseOptions,\n\t\t\t\terrorOnInvalidContent: true\n\t\t\t});\n\t\t} catch (e) {\n\t\t\temitContentError(e);\n\t\t}\n\t\ttry {\n\t\t\tvar _options$errorOnInval;\n\t\t\tcontent = createNodeFromContent(value, editor.schema, {\n\t\t\t\tparseOptions,\n\t\t\t\terrorOnInvalidContent: (_options$errorOnInval = options.errorOnInvalidContent) !== null && _options$errorOnInval !== void 0 ? _options$errorOnInval : editor.options.enableContentCheck\n\t\t\t});\n\t\t} catch (e) {\n\t\t\temitContentError(e);\n\t\t\treturn false;\n\t\t}\n\t\tlet { from, to } = typeof position === \"number\" ? {\n\t\t\tfrom: position,\n\t\t\tto: position\n\t\t} : {\n\t\t\tfrom: position.from,\n\t\t\tto: position.to\n\t\t};\n\t\tlet isOnlyTextContent = true;\n\t\tlet isOnlyBlockContent = true;\n\t\tconst nodes = isFragment(content) ? content.content : [content];\n\t\tnodes.forEach((node) => {\n\t\t\tnode.check();\n\t\t\tisOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false;\n\t\t\tisOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false;\n\t\t});\n\t\tif (from === to && isOnlyBlockContent) {\n\t\t\tconst { parent } = tr.doc.resolve(from);\n\t\t\tif (parent.isTextblock && !parent.type.spec.code && !parent.childCount) {\n\t\t\t\tfrom -= 1;\n\t\t\t\tto += 1;\n\t\t\t}\n\t\t}\n\t\tlet newContent;\n\t\tif (isOnlyTextContent) {\n\t\t\tif (Array.isArray(value)) newContent = value.map((item) => item.text || \"\").join(\"\");\n\t\t\telse if (isProseMirrorContent(value)) newContent = nodes.map((node) => {\n\t\t\t\tvar _node$text;\n\t\t\t\treturn (_node$text = node.text) !== null && _node$text !== void 0 ? _node$text : \"\";\n\t\t\t}).join(\"\");\n\t\t\telse if (typeof value === \"object\" && !!value && !!value.text) newContent = value.text;\n\t\t\telse newContent = value;\n\t\t\ttr.insertText(newContent, from, to);\n\t\t} else {\n\t\t\tnewContent = Fragment$1.from(nodes);\n\t\t\tconst $from = tr.doc.resolve(from);\n\t\t\tconst $fromNode = $from.node();\n\t\t\tconst fromSelectionAtStart = $from.parentOffset === 0;\n\t\t\tconst isTextSelection = $fromNode.isText || $fromNode.isTextblock;\n\t\t\tconst hasContent = $fromNode.content.size > 0;\n\t\t\tif (fromSelectionAtStart && isTextSelection && hasContent && isOnlyBlockContent) from = Math.max(0, from - 1);\n\t\t\ttr.replaceWith(from, to, nodes);\n\t\t}\n\t\tif (options.updateSelection) selectionToInsertionEnd(tr, tr.steps.length - 1, -1);\n\t\tif (options.applyInputRules) tr.setMeta(\"applyInputRules\", {\n\t\t\tfrom,\n\t\t\ttext: newContent\n\t\t});\n\t\tif (options.applyPasteRules) tr.setMeta(\"applyPasteRules\", {\n\t\t\tfrom,\n\t\t\ttext: newContent\n\t\t});\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/helpers/defaultBlockAt.ts\n/**\n* Gets the default block type at a given match\n* @param match The content match to get the default block type from\n* @returns The default block type or null\n*/\nfunction defaultBlockAt(match) {\n\tfor (let i = 0; i < match.edgeCount; i += 1) {\n\t\tconst { type } = match.edge(i);\n\t\tif (type.isTextblock && !type.hasRequiredAttrs()) return type;\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/commands/insertDefaultBlock.ts\nconst insertDefaultBlock = (options = {}) => ({ tr, dispatch, editor }) => {\n\tconst { pos, attrs, content, updateSelection = true } = options;\n\tlet $pos;\n\tif (typeof pos === \"number\") $pos = tr.doc.resolve(pos);\n\telse if (pos) $pos = pos;\n\telse $pos = tr.selection.$from;\n\tconst defaultType = defaultBlockAt($pos.parent.contentMatchAt($pos.index()));\n\tif (!defaultType) return false;\n\tconst validAttrKeys = Object.keys(defaultType.spec.attrs || {});\n\tconst filteredAttrs = attrs ? Object.fromEntries(Object.entries(attrs).filter(([key]) => validAttrKeys.includes(key))) : {};\n\tlet node;\n\tif (content) {\n\t\tconst parsed = createNodeFromContent(content, editor.schema);\n\t\tnode = defaultType.createAndFill(filteredAttrs, parsed);\n\t} else node = defaultType.createAndFill(filteredAttrs);\n\tif (!node) return false;\n\tif (dispatch) {\n\t\ttr.insert($pos.pos, node);\n\t\tif (updateSelection) selectionToInsertionEnd(tr, tr.steps.length - 1, -1);\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/join.ts\nconst joinUp$1 = () => ({ state, dispatch }) => {\n\treturn joinUp(state, dispatch);\n};\nconst joinDown$1 = () => ({ state, dispatch }) => {\n\treturn joinDown(state, dispatch);\n};\nconst joinBackward$1 = () => ({ state, dispatch }) => {\n\treturn joinBackward(state, dispatch);\n};\nconst joinForward$1 = () => ({ state, dispatch }) => {\n\treturn joinForward(state, dispatch);\n};\n//#endregion\n//#region src/commands/joinItemBackward.ts\nconst joinItemBackward = () => ({ state, dispatch, tr }) => {\n\ttry {\n\t\tconst point = joinPoint(state.doc, state.selection.$from.pos, -1);\n\t\tif (point === null || point === void 0) return false;\n\t\ttr.join(point, 2);\n\t\tif (dispatch) dispatch(tr);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n//#endregion\n//#region src/commands/joinItemForward.ts\nconst joinItemForward = () => ({ state, dispatch, tr }) => {\n\ttry {\n\t\tconst point = joinPoint(state.doc, state.selection.$from.pos, 1);\n\t\tif (point === null || point === void 0) return false;\n\t\ttr.join(point, 2);\n\t\tif (dispatch) dispatch(tr);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n//#endregion\n//#region src/commands/joinTextblockBackward.ts\nconst joinTextblockBackward$1 = () => ({ state, dispatch }) => {\n\treturn joinTextblockBackward(state, dispatch);\n};\n//#endregion\n//#region src/commands/joinTextblockForward.ts\nconst joinTextblockForward$1 = () => ({ state, dispatch }) => {\n\treturn joinTextblockForward(state, dispatch);\n};\n//#endregion\n//#region src/utilities/isMacOS.ts\nfunction isMacOS() {\n\treturn typeof navigator !== \"undefined\" ? /Mac/.test(navigator.platform) : false;\n}\n//#endregion\n//#region src/commands/keyboardShortcut.ts\nfunction normalizeKeyName(name) {\n\tconst parts = name.split(/-(?!$)/);\n\tlet result = parts[parts.length - 1];\n\tif (result === \"Space\") result = \" \";\n\tlet alt;\n\tlet ctrl;\n\tlet shift;\n\tlet meta;\n\tfor (let i = 0; i < parts.length - 1; i += 1) {\n\t\tconst mod = parts[i];\n\t\tif (/^(cmd|meta|m)$/i.test(mod)) meta = true;\n\t\telse if (/^a(lt)?$/i.test(mod)) alt = true;\n\t\telse if (/^(c|ctrl|control)$/i.test(mod)) ctrl = true;\n\t\telse if (/^s(hift)?$/i.test(mod)) shift = true;\n\t\telse if (/^mod$/i.test(mod)) {\n\t\t\tif (isiOS() || isMacOS()) meta = true;\n\t\t\telse ctrl = true;\n\t\t} else throw new Error(`Unrecognized modifier name: ${mod}`);\n\t}\n\tif (alt) result = `Alt-${result}`;\n\tif (ctrl) result = `Ctrl-${result}`;\n\tif (meta) result = `Meta-${result}`;\n\tif (shift) result = `Shift-${result}`;\n\treturn result;\n}\nconst keyboardShortcut = (name) => ({ editor, view, tr, dispatch }) => {\n\tconst keys = normalizeKeyName(name).split(/-(?!$)/);\n\tconst key = keys.find((item) => ![\n\t\t\"Alt\",\n\t\t\"Ctrl\",\n\t\t\"Meta\",\n\t\t\"Shift\"\n\t].includes(item));\n\tconst event = new KeyboardEvent(\"keydown\", {\n\t\tkey: key === \"Space\" ? \" \" : key,\n\t\taltKey: keys.includes(\"Alt\"),\n\t\tctrlKey: keys.includes(\"Ctrl\"),\n\t\tmetaKey: keys.includes(\"Meta\"),\n\t\tshiftKey: keys.includes(\"Shift\"),\n\t\tbubbles: true,\n\t\tcancelable: true\n\t});\n\tconst capturedTransaction = editor.captureTransaction(() => {\n\t\tview.someProp(\"handleKeyDown\", (f) => f(view, event));\n\t});\n\tcapturedTransaction === null || capturedTransaction === void 0 || capturedTransaction.steps.forEach((step) => {\n\t\tconst newStep = step.map(tr.mapping);\n\t\tif (newStep && dispatch) tr.maybeStep(newStep);\n\t});\n\treturn true;\n};\n//#endregion\n//#region src/helpers/isNodeActive.ts\nfunction isNodeActive(state, typeOrName, attributes = {}) {\n\tconst { from, to, empty } = state.selection;\n\tconst type = typeOrName ? getNodeType(typeOrName, state.schema) : null;\n\tconst nodeRanges = [];\n\tstate.doc.nodesBetween(from, to, (node, pos) => {\n\t\tif (node.isText) return;\n\t\tconst relativeFrom = Math.max(from, pos);\n\t\tconst relativeTo = Math.min(to, pos + node.nodeSize);\n\t\tnodeRanges.push({\n\t\t\tnode,\n\t\t\tfrom: relativeFrom,\n\t\t\tto: relativeTo\n\t\t});\n\t});\n\tconst selectionRange = to - from;\n\tconst matchedNodeRanges = nodeRanges.filter((nodeRange) => {\n\t\tif (!type) return true;\n\t\treturn type.name === nodeRange.node.type.name;\n\t}).filter((nodeRange) => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }));\n\tif (empty) return !!matchedNodeRanges.length;\n\treturn matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0) >= selectionRange;\n}\n//#endregion\n//#region src/commands/lift.ts\nconst lift$1 = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n\tif (!isNodeActive(state, getNodeType(typeOrName, state.schema), attributes)) return false;\n\treturn lift(state, dispatch);\n};\n//#endregion\n//#region src/commands/liftEmptyBlock.ts\nconst liftEmptyBlock$1 = () => ({ state, dispatch }) => {\n\treturn liftEmptyBlock(state, dispatch);\n};\n//#endregion\n//#region src/commands/liftListItem.ts\nconst liftListItem$1 = (typeOrName) => ({ state, dispatch }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\treturn liftListItem(type)(state, dispatch);\n};\n//#endregion\n//#region src/commands/newlineInCode.ts\nconst newlineInCode$1 = () => ({ state, dispatch }) => {\n\treturn newlineInCode(state, dispatch);\n};\n//#endregion\n//#region src/helpers/getSchemaTypeNameByName.ts\n/**\n* Get the type of a schema item by its name.\n* @param name The name of the schema item\n* @param schema The Prosemiror schema to search in\n* @returns The type of the schema item (`node` or `mark`), or null if it doesn't exist\n*/\nfunction getSchemaTypeNameByName(name, schema) {\n\tif (schema.nodes[name]) return \"node\";\n\tif (schema.marks[name]) return \"mark\";\n\treturn null;\n}\n//#endregion\n//#region src/utilities/deleteProps.ts\n/**\n* Remove a property or an array of properties from an object\n* @param obj Object\n* @param key Key to remove\n*/\nfunction deleteProps(obj, propOrProps) {\n\tconst props = typeof propOrProps === \"string\" ? [propOrProps] : propOrProps;\n\treturn Object.keys(obj).reduce((newObj, prop) => {\n\t\tif (!props.includes(prop)) newObj[prop] = obj[prop];\n\t\treturn newObj;\n\t}, {});\n}\n//#endregion\n//#region src/commands/resetAttributes.ts\nconst resetAttributes = (typeOrName, attributes) => ({ tr, state, dispatch }) => {\n\tlet nodeType = null;\n\tlet markType = null;\n\tconst schemaType = getSchemaTypeNameByName(typeof typeOrName === \"string\" ? typeOrName : typeOrName.name, state.schema);\n\tif (!schemaType) return false;\n\tif (schemaType === \"node\") nodeType = getNodeType(typeOrName, state.schema);\n\tif (schemaType === \"mark\") markType = getMarkType(typeOrName, state.schema);\n\tlet canReset = false;\n\ttr.selection.ranges.forEach((range) => {\n\t\tstate.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n\t\t\tif (nodeType && nodeType === node.type) {\n\t\t\t\tcanReset = true;\n\t\t\t\tif (dispatch) tr.setNodeMarkup(pos, void 0, deleteProps(node.attrs, attributes));\n\t\t\t}\n\t\t\tif (markType && node.marks.length) node.marks.forEach((mark) => {\n\t\t\t\tif (markType === mark.type) {\n\t\t\t\t\tcanReset = true;\n\t\t\t\t\tif (dispatch) tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\treturn canReset;\n};\n//#endregion\n//#region src/commands/scrollIntoView.ts\nconst scrollIntoView = () => ({ tr, dispatch }) => {\n\tif (dispatch) tr.scrollIntoView();\n\treturn true;\n};\n//#endregion\n//#region src/commands/selectAll.ts\nconst selectAll = () => ({ tr, dispatch }) => {\n\tif (dispatch) {\n\t\tconst selection = new AllSelection(tr.doc);\n\t\ttr.setSelection(selection);\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/selectNodeBackward.ts\nconst selectNodeBackward$1 = () => ({ state, dispatch }) => {\n\treturn selectNodeBackward(state, dispatch);\n};\n//#endregion\n//#region src/commands/selectNodeForward.ts\nconst selectNodeForward$1 = () => ({ state, dispatch }) => {\n\treturn selectNodeForward(state, dispatch);\n};\n//#endregion\n//#region src/commands/selectParentNode.ts\nconst selectParentNode$1 = () => ({ state, dispatch }) => {\n\treturn selectParentNode(state, dispatch);\n};\n//#endregion\n//#region src/commands/selectTextblockEnd.ts\nconst selectTextblockEnd$1 = () => ({ state, dispatch }) => {\n\treturn selectTextblockEnd(state, dispatch);\n};\n//#endregion\n//#region src/commands/selectTextblockStart.ts\nconst selectTextblockStart$1 = () => ({ state, dispatch }) => {\n\treturn selectTextblockStart(state, dispatch);\n};\n//#endregion\n//#region src/helpers/createDocument.ts\n/**\n* Create a new Prosemirror document node from content.\n* @param content The JSON or HTML content to create the document from\n* @param schema The Prosemirror schema to use for the document\n* @param parseOptions Options for the parser\n* @returns The created Prosemirror document node\n*/\nfunction createDocument(content, schema, parseOptions = {}, options = {}) {\n\treturn createNodeFromContent(content, schema, {\n\t\tslice: false,\n\t\tparseOptions,\n\t\terrorOnInvalidContent: options.errorOnInvalidContent\n\t});\n}\n//#endregion\n//#region src/commands/setContent.ts\nconst setContent = (content, { errorOnInvalidContent, emitUpdate = true, parseOptions = {} } = {}) => ({ editor, tr, dispatch, commands }) => {\n\tconst { doc } = tr;\n\tif (parseOptions.preserveWhitespace !== \"full\") {\n\t\tconst document = createDocument(content, editor.schema, parseOptions, { errorOnInvalidContent: errorOnInvalidContent !== null && errorOnInvalidContent !== void 0 ? errorOnInvalidContent : editor.options.enableContentCheck });\n\t\tif (dispatch) {\n\t\t\tconst nodes = isFragment(document) ? document.content : [document];\n\t\t\ttr.replaceWith(0, doc.content.size, nodes).setMeta(\"preventUpdate\", !emitUpdate);\n\t\t}\n\t\treturn true;\n\t}\n\tif (dispatch) tr.setMeta(\"preventUpdate\", !emitUpdate);\n\treturn commands.insertContentAt({\n\t\tfrom: 0,\n\t\tto: doc.content.size\n\t}, content, {\n\t\tparseOptions,\n\t\terrorOnInvalidContent: errorOnInvalidContent !== null && errorOnInvalidContent !== void 0 ? errorOnInvalidContent : editor.options.enableContentCheck\n\t});\n};\n//#endregion\n//#region src/helpers/getMarkAttributes.ts\nfunction getMarkAttributes(state, typeOrName) {\n\tconst type = getMarkType(typeOrName, state.schema);\n\tconst { from, to, empty } = state.selection;\n\tconst marks = [];\n\tif (empty) {\n\t\tif (state.storedMarks) marks.push(...state.storedMarks);\n\t\tmarks.push(...state.selection.$head.marks());\n\t} else state.doc.nodesBetween(from, to, (node) => {\n\t\tmarks.push(...node.marks);\n\t});\n\tconst mark = marks.find((markItem) => markItem.type.name === type.name);\n\tif (!mark) return {};\n\treturn { ...mark.attrs };\n}\n//#endregion\n//#region src/helpers/combineTransactionSteps.ts\n/**\n* Returns a new `Transform` based on all steps of the passed transactions.\n* @param oldDoc The Prosemirror node to start from\n* @param transactions The transactions to combine\n* @returns A new `Transform` with all steps of the passed transactions\n*/\nfunction combineTransactionSteps(oldDoc, transactions) {\n\tconst transform = new Transform(oldDoc);\n\ttransactions.forEach((transaction) => {\n\t\ttransaction.steps.forEach((step) => {\n\t\t\ttransform.step(step);\n\t\t});\n\t});\n\treturn transform;\n}\n//#endregion\n//#region src/helpers/findChildren.ts\n/**\n* Find children inside a Prosemirror node that match a predicate.\n* @param node The Prosemirror node to search in\n* @param predicate The predicate to match\n* @returns An array of nodes with their positions\n*/\nfunction findChildren(node, predicate) {\n\tconst nodesWithPos = [];\n\tnode.descendants((child, pos) => {\n\t\tif (predicate(child)) nodesWithPos.push({\n\t\t\tnode: child,\n\t\t\tpos\n\t\t});\n\t});\n\treturn nodesWithPos;\n}\n//#endregion\n//#region src/helpers/findChildrenInRange.ts\n/**\n* Same as `findChildren` but searches only within a `range`.\n* @param node The Prosemirror node to search in\n* @param range The range to search in\n* @param predicate The predicate to match\n* @returns An array of nodes with their positions\n*/\nfunction findChildrenInRange(node, range, predicate) {\n\tconst nodesWithPos = [];\n\tnode.nodesBetween(range.from, range.to, (child, pos) => {\n\t\tif (predicate(child)) nodesWithPos.push({\n\t\t\tnode: child,\n\t\t\tpos\n\t\t});\n\t});\n\treturn nodesWithPos;\n}\n//#endregion\n//#region src/helpers/findParentNodeClosestToPos.ts\n/**\n* Finds the closest parent node to a resolved position that matches a predicate.\n* @param $pos The resolved position to search from\n* @param predicate The predicate to match\n* @returns The closest parent node to the resolved position that matches the predicate\n* @example ```js\n* findParentNodeClosestToPos($from, node => node.type.name === 'paragraph')\n* ```\n*/\nfunction findParentNodeClosestToPos($pos, predicate) {\n\tfor (let i = $pos.depth; i > 0; i -= 1) {\n\t\tconst node = $pos.node(i);\n\t\tif (predicate(node)) return {\n\t\t\tpos: i > 0 ? $pos.before(i) : 0,\n\t\t\tstart: $pos.start(i),\n\t\t\tdepth: i,\n\t\t\tnode\n\t\t};\n\t}\n}\n//#endregion\n//#region src/helpers/findParentNode.ts\n/**\n* Finds the closest parent node to the current selection that matches a predicate.\n* @param predicate The predicate to match\n* @returns A command that finds the closest parent node to the current selection that matches the predicate\n* @example ```js\n* findParentNode(node => node.type.name === 'paragraph')\n* ```\n*/\nfunction findParentNode(predicate) {\n\treturn (selection) => findParentNodeClosestToPos(selection.$from, predicate);\n}\n//#endregion\n//#region src/helpers/getExtensionField.ts\n/**\n* Returns a field from an extension\n* @param extension The Tiptap extension\n* @param field The field, for example `renderHTML` or `priority`\n* @param context The context object that should be passed as `this` into the function\n* @returns The field value\n*/\nfunction getExtensionField(extension, field, context) {\n\tif (extension.config[field] === void 0 && extension.parent) return getExtensionField(extension.parent, field, context);\n\tif (typeof extension.config[field] === \"function\") return extension.config[field].bind({\n\t\t...context,\n\t\tparent: extension.parent ? getExtensionField(extension.parent, field, context) : null\n\t});\n\treturn extension.config[field];\n}\n//#endregion\n//#region src/helpers/flattenExtensions.ts\n/**\n* Create a flattened array of extensions by traversing the `addExtensions` field.\n* @param extensions An array of Tiptap extensions\n* @returns A flattened array of Tiptap extensions\n*/\nfunction flattenExtensions(extensions) {\n\treturn extensions.map((extension) => {\n\t\tconst addExtensions = getExtensionField(extension, \"addExtensions\", {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage\n\t\t});\n\t\tif (addExtensions) return [extension, ...flattenExtensions(addExtensions())];\n\t\treturn extension;\n\t}).flat(10);\n}\n//#endregion\n//#region src/helpers/getHTMLFromFragment.ts\nfunction getHTMLFromFragment(fragment, schema) {\n\tconst documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment);\n\tconst container = document.implementation.createHTMLDocument().createElement(\"div\");\n\tcontainer.appendChild(documentFragment);\n\treturn container.innerHTML;\n}\n//#endregion\n//#region src/utilities/isFunction.ts\nfunction isFunction(value) {\n\treturn typeof value === \"function\";\n}\n//#endregion\n//#region src/utilities/callOrReturn.ts\n/**\n* Optionally calls `value` as a function.\n* Otherwise it is returned directly.\n* @param value Function or any value.\n* @param context Optional context to bind to function.\n* @param props Optional props to pass to function.\n*/\nfunction callOrReturn(value, context = void 0, ...props) {\n\tif (isFunction(value)) {\n\t\tif (context) return value.bind(context)(...props);\n\t\treturn value(...props);\n\t}\n\treturn value;\n}\n//#endregion\n//#region src/utilities/isEmptyObject.ts\nfunction isEmptyObject(value = {}) {\n\treturn Object.keys(value).length === 0 && value.constructor === Object;\n}\n//#endregion\n//#region src/helpers/splitExtensions.ts\nfunction splitExtensions(extensions) {\n\treturn {\n\t\tbaseExtensions: extensions.filter((extension) => extension.type === \"extension\"),\n\t\tnodeExtensions: extensions.filter((extension) => extension.type === \"node\"),\n\t\tmarkExtensions: extensions.filter((extension) => extension.type === \"mark\")\n\t};\n}\n//#endregion\n//#region src/helpers/getAttributesFromExtensions.ts\n/**\n* Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.\n* @param extensions List of extensions\n*/\nfunction getAttributesFromExtensions(extensions) {\n\tconst extensionAttributes = [];\n\tconst { nodeExtensions, markExtensions } = splitExtensions(extensions);\n\tconst nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions];\n\tconst defaultAttribute = {\n\t\tdefault: null,\n\t\tvalidate: void 0,\n\t\trendered: true,\n\t\trenderHTML: null,\n\t\tparseHTML: null,\n\t\tkeepOnSplit: true,\n\t\tisRequired: false\n\t};\n\tconst nodeExtensionTypes = nodeExtensions.filter((ext) => ext.name !== \"text\").map((ext) => ext.name);\n\tconst markExtensionTypes = markExtensions.map((ext) => ext.name);\n\tconst allExtensionTypes = [...nodeExtensionTypes, ...markExtensionTypes];\n\textensions.forEach((extension) => {\n\t\tconst addGlobalAttributes = getExtensionField(extension, \"addGlobalAttributes\", {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage,\n\t\t\textensions: nodeAndMarkExtensions\n\t\t});\n\t\tif (!addGlobalAttributes) return;\n\t\taddGlobalAttributes().forEach((globalAttribute) => {\n\t\t\tlet resolvedTypes;\n\t\t\tif (Array.isArray(globalAttribute.types)) resolvedTypes = globalAttribute.types;\n\t\t\telse if (globalAttribute.types === \"*\") resolvedTypes = allExtensionTypes;\n\t\t\telse if (globalAttribute.types === \"nodes\") resolvedTypes = nodeExtensionTypes;\n\t\t\telse if (globalAttribute.types === \"marks\") resolvedTypes = markExtensionTypes;\n\t\t\telse resolvedTypes = [];\n\t\t\tresolvedTypes.forEach((type) => {\n\t\t\t\tObject.entries(globalAttribute.attributes).forEach(([name, attribute]) => {\n\t\t\t\t\textensionAttributes.push({\n\t\t\t\t\t\ttype,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tattribute: {\n\t\t\t\t\t\t\t...defaultAttribute,\n\t\t\t\t\t\t\t...attribute\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\tnodeAndMarkExtensions.forEach((extension) => {\n\t\tconst addAttributes = getExtensionField(extension, \"addAttributes\", {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage\n\t\t});\n\t\tif (!addAttributes) return;\n\t\tconst attributes = addAttributes();\n\t\tObject.entries(attributes).forEach(([name, attribute]) => {\n\t\t\tconst mergedAttr = {\n\t\t\t\t...defaultAttribute,\n\t\t\t\t...attribute\n\t\t\t};\n\t\t\tif (typeof (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === \"function\") mergedAttr.default = mergedAttr.default();\n\t\t\tif ((mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.isRequired) && (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === void 0) delete mergedAttr.default;\n\t\t\textensionAttributes.push({\n\t\t\t\ttype: extension.name,\n\t\t\t\tname,\n\t\t\t\tattribute: mergedAttr\n\t\t\t});\n\t\t});\n\t});\n\treturn extensionAttributes;\n}\n//#endregion\n//#region src/utilities/mergeAttributes.ts\n/** Splits a CSS style string into declarations, ignoring semicolons inside quotes/parentheses. */\nfunction splitStyleDeclarations(styles) {\n\tconst result = [];\n\tlet current = \"\";\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet parenDepth = 0;\n\tconst length = styles.length;\n\tfor (let i = 0; i < length; i += 1) {\n\t\tconst char = styles[i];\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tcurrent += char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"\\\"\" && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tcurrent += char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === \"(\") {\n\t\t\t\tparenDepth += 1;\n\t\t\t\tcurrent += char;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \")\" && parenDepth > 0) {\n\t\t\t\tparenDepth -= 1;\n\t\t\t\tcurrent += char;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === \";\" && parenDepth === 0) {\n\t\t\t\tresult.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tcurrent += char;\n\t}\n\tif (current) result.push(current);\n\treturn result;\n}\n/** Yields property/value pairs from a style string. */\nfunction parseStyleEntries(styles) {\n\tconst pairs = [];\n\tconst declarations = splitStyleDeclarations(styles || \"\");\n\tconst numDeclarations = declarations.length;\n\tfor (let i = 0; i < numDeclarations; i += 1) {\n\t\tconst declaration = declarations[i];\n\t\tconst firstColonIndex = declaration.indexOf(\":\");\n\t\tif (firstColonIndex === -1) continue;\n\t\tconst property = declaration.slice(0, firstColonIndex).trim();\n\t\tconst value = declaration.slice(firstColonIndex + 1).trim();\n\t\tif (property && value) pairs.push([property, value]);\n\t}\n\treturn pairs;\n}\nfunction mergeAttributes(...objects) {\n\treturn objects.filter((item) => !!item).reduce((items, item) => {\n\t\tconst mergedAttributes = { ...items };\n\t\tObject.entries(item).forEach(([key, value]) => {\n\t\t\tif (key === \"__proto__\") {\n\t\t\t\tObject.defineProperty(mergedAttributes, key, {\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tvalue,\n\t\t\t\t\twritable: true\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!mergedAttributes[key]) {\n\t\t\t\tmergedAttributes[key] = value;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (key === \"class\") {\n\t\t\t\tconst valueClasses = value ? String(value).split(\" \") : [];\n\t\t\t\tconst existingClasses = mergedAttributes[key] ? mergedAttributes[key].split(\" \") : [];\n\t\t\t\tconst insertClasses = valueClasses.filter((valueClass) => !existingClasses.includes(valueClass));\n\t\t\t\tmergedAttributes[key] = [...existingClasses, ...insertClasses].join(\" \");\n\t\t\t} else if (key === \"style\") {\n\t\t\t\tconst styleMap = new Map([...parseStyleEntries(mergedAttributes[key]), ...parseStyleEntries(value)]);\n\t\t\t\tmergedAttributes[key] = Array.from(styleMap.entries()).map(([property, val]) => `${property}: ${val}`).join(\"; \");\n\t\t\t} else mergedAttributes[key] = value;\n\t\t});\n\t\treturn mergedAttributes;\n\t}, {});\n}\n//#endregion\n//#region src/helpers/getRenderedAttributes.ts\nfunction getRenderedAttributes(nodeOrMark, extensionAttributes) {\n\treturn extensionAttributes.filter((attribute) => attribute.type === nodeOrMark.type.name).filter((item) => item.attribute.rendered).map((item) => {\n\t\tif (!item.attribute.renderHTML) return { [item.name]: nodeOrMark.attrs[item.name] };\n\t\treturn item.attribute.renderHTML(nodeOrMark.attrs) || {};\n\t}).reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {});\n}\n//#endregion\n//#region src/utilities/fromString.ts\nfunction fromString(value) {\n\tif (typeof value !== \"string\") return value;\n\tif (value.match(/^[+-]?(?:\\d*\\.)?\\d+$/)) return Number(value);\n\tif (value === \"true\") return true;\n\tif (value === \"false\") return false;\n\treturn value;\n}\n//#endregion\n//#region src/helpers/injectExtensionAttributesToParseRule.ts\n/**\n* This function merges extension attributes into parserule attributes (`attrs` or `getAttrs`).\n* Cancels when `getAttrs` returned `false`.\n* @param parseRule ProseMirror ParseRule\n* @param extensionAttributes List of attributes to inject\n*/\nfunction injectExtensionAttributesToParseRule(parseRule, extensionAttributes) {\n\tif (\"style\" in parseRule) return parseRule;\n\treturn {\n\t\t...parseRule,\n\t\tgetAttrs: (node) => {\n\t\t\tconst oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs;\n\t\t\tif (oldAttributes === false) return false;\n\t\t\tconst newAttributes = extensionAttributes.reduce((items, item) => {\n\t\t\t\tconst value = item.attribute.parseHTML ? item.attribute.parseHTML(node) : fromString(node.getAttribute(item.name));\n\t\t\t\tif (value === null || value === void 0) return items;\n\t\t\t\treturn {\n\t\t\t\t\t...items,\n\t\t\t\t\t[item.name]: value\n\t\t\t\t};\n\t\t\t}, {});\n\t\t\treturn {\n\t\t\t\t...oldAttributes,\n\t\t\t\t...newAttributes\n\t\t\t};\n\t\t}\n\t};\n}\n//#endregion\n//#region src/helpers/getSchemaByResolvedExtensions.ts\nfunction cleanUpSchemaItem(data) {\n\treturn Object.fromEntries(Object.entries(data).filter(([key, value]) => {\n\t\tif (key === \"attrs\" && isEmptyObject(value)) return false;\n\t\treturn value !== null && value !== void 0;\n\t}));\n}\n/**\n* Builds an attribute spec tuple for ProseMirror schema from an extension attribute.\n* @param extensionAttribute The extension attribute to build the spec for\n* @returns A tuple of [attributeName, spec]\n*/\nfunction buildAttributeSpec(extensionAttribute) {\n\tvar _extensionAttribute$a, _extensionAttribute$a2;\n\tconst spec = {};\n\tif (!(extensionAttribute === null || extensionAttribute === void 0 || (_extensionAttribute$a = extensionAttribute.attribute) === null || _extensionAttribute$a === void 0 ? void 0 : _extensionAttribute$a.isRequired) && \"default\" in ((extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) || {})) spec.default = extensionAttribute.attribute.default;\n\tif ((extensionAttribute === null || extensionAttribute === void 0 || (_extensionAttribute$a2 = extensionAttribute.attribute) === null || _extensionAttribute$a2 === void 0 ? void 0 : _extensionAttribute$a2.validate) !== void 0) spec.validate = extensionAttribute.attribute.validate;\n\treturn [extensionAttribute.name, spec];\n}\n/**\n* Creates a new Prosemirror schema based on the given extensions.\n* @param extensions An array of Tiptap extensions\n* @param editor The editor instance\n* @returns A Prosemirror schema\n*/\nfunction getSchemaByResolvedExtensions(extensions, editor) {\n\tvar _nodeExtensions$find;\n\tconst allAttributes = getAttributesFromExtensions(extensions);\n\tconst { nodeExtensions, markExtensions } = splitExtensions(extensions);\n\tconst topNode = (_nodeExtensions$find = nodeExtensions.find((extension) => getExtensionField(extension, \"topNode\"))) === null || _nodeExtensions$find === void 0 ? void 0 : _nodeExtensions$find.name;\n\tconst nodes = Object.fromEntries(nodeExtensions.map((extension) => {\n\t\tconst extensionAttributes = allAttributes.filter((attribute) => attribute.type === extension.name);\n\t\tconst context = {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage,\n\t\t\teditor\n\t\t};\n\t\tconst schema = cleanUpSchemaItem({\n\t\t\t...extensions.reduce((fields, e) => {\n\t\t\t\tconst extendNodeSchema = getExtensionField(e, \"extendNodeSchema\", context);\n\t\t\t\treturn {\n\t\t\t\t\t...fields,\n\t\t\t\t\t...extendNodeSchema ? extendNodeSchema(extension) : {}\n\t\t\t\t};\n\t\t\t}, {}),\n\t\t\tcontent: callOrReturn(getExtensionField(extension, \"content\", context)),\n\t\t\tmarks: callOrReturn(getExtensionField(extension, \"marks\", context)),\n\t\t\tgroup: callOrReturn(getExtensionField(extension, \"group\", context)),\n\t\t\tinline: callOrReturn(getExtensionField(extension, \"inline\", context)),\n\t\t\tatom: callOrReturn(getExtensionField(extension, \"atom\", context)),\n\t\t\tselectable: callOrReturn(getExtensionField(extension, \"selectable\", context)),\n\t\t\tdraggable: callOrReturn(getExtensionField(extension, \"draggable\", context)),\n\t\t\tcode: callOrReturn(getExtensionField(extension, \"code\", context)),\n\t\t\twhitespace: callOrReturn(getExtensionField(extension, \"whitespace\", context)),\n\t\t\tlinebreakReplacement: callOrReturn(getExtensionField(extension, \"linebreakReplacement\", context)),\n\t\t\tdefining: callOrReturn(getExtensionField(extension, \"defining\", context)),\n\t\t\tisolating: callOrReturn(getExtensionField(extension, \"isolating\", context)),\n\t\t\tattrs: Object.fromEntries(extensionAttributes.map(buildAttributeSpec))\n\t\t});\n\t\tconst parseHTML = callOrReturn(getExtensionField(extension, \"parseHTML\", context));\n\t\tif (parseHTML) schema.parseDOM = parseHTML.map((parseRule) => injectExtensionAttributesToParseRule(parseRule, extensionAttributes));\n\t\tconst renderHTML = getExtensionField(extension, \"renderHTML\", context);\n\t\tif (renderHTML) schema.toDOM = (node) => renderHTML({\n\t\t\tnode,\n\t\t\tHTMLAttributes: getRenderedAttributes(node, extensionAttributes)\n\t\t});\n\t\tconst renderText = getExtensionField(extension, \"renderText\", context);\n\t\tif (renderText) schema.toText = renderText;\n\t\treturn [extension.name, schema];\n\t}));\n\tconst marks = Object.fromEntries(markExtensions.map((extension) => {\n\t\tconst extensionAttributes = allAttributes.filter((attribute) => attribute.type === extension.name);\n\t\tconst context = {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage,\n\t\t\teditor\n\t\t};\n\t\tconst schema = cleanUpSchemaItem({\n\t\t\t...extensions.reduce((fields, e) => {\n\t\t\t\tconst extendMarkSchema = getExtensionField(e, \"extendMarkSchema\", context);\n\t\t\t\treturn {\n\t\t\t\t\t...fields,\n\t\t\t\t\t...extendMarkSchema ? extendMarkSchema(extension) : {}\n\t\t\t\t};\n\t\t\t}, {}),\n\t\t\tinclusive: callOrReturn(getExtensionField(extension, \"inclusive\", context)),\n\t\t\texcludes: callOrReturn(getExtensionField(extension, \"excludes\", context)),\n\t\t\tgroup: callOrReturn(getExtensionField(extension, \"group\", context)),\n\t\t\tspanning: callOrReturn(getExtensionField(extension, \"spanning\", context)),\n\t\t\tcode: callOrReturn(getExtensionField(extension, \"code\", context)),\n\t\t\tattrs: Object.fromEntries(extensionAttributes.map(buildAttributeSpec))\n\t\t});\n\t\tconst parseHTML = callOrReturn(getExtensionField(extension, \"parseHTML\", context));\n\t\tif (parseHTML) schema.parseDOM = parseHTML.map((parseRule) => injectExtensionAttributesToParseRule(parseRule, extensionAttributes));\n\t\tconst renderHTML = getExtensionField(extension, \"renderHTML\", context);\n\t\tif (renderHTML) schema.toDOM = (mark) => renderHTML({\n\t\t\tmark,\n\t\t\tHTMLAttributes: getRenderedAttributes(mark, extensionAttributes)\n\t\t});\n\t\treturn [extension.name, schema];\n\t}));\n\treturn new Schema({\n\t\ttopNode,\n\t\tnodes,\n\t\tmarks\n\t});\n}\n//#endregion\n//#region src/utilities/findDuplicates.ts\n/**\n* Find duplicates in an array.\n*/\nfunction findDuplicates(items) {\n\tconst filtered = items.filter((el, index) => items.indexOf(el) !== index);\n\treturn Array.from(new Set(filtered));\n}\n//#endregion\n//#region src/helpers/sortExtensions.ts\n/**\n* Sort extensions by priority.\n* @param extensions An array of Tiptap extensions\n* @returns A sorted array of Tiptap extensions by priority\n*/\nfunction sortExtensions(extensions) {\n\tconst defaultPriority = 100;\n\treturn extensions.sort((a, b) => {\n\t\tconst priorityA = getExtensionField(a, \"priority\") || defaultPriority;\n\t\tconst priorityB = getExtensionField(b, \"priority\") || defaultPriority;\n\t\tif (priorityA > priorityB) return -1;\n\t\tif (priorityA < priorityB) return 1;\n\t\treturn 0;\n\t});\n}\n//#endregion\n//#region src/helpers/resolveExtensions.ts\n/**\n* Returns a flattened and sorted extension list while\n* also checking for duplicated extensions and warns the user.\n* @param extensions An array of Tiptap extensions\n* @returns An flattened and sorted array of Tiptap extensions\n*/\nfunction resolveExtensions(extensions) {\n\tconst resolvedExtensions = sortExtensions(flattenExtensions(extensions));\n\tconst duplicatedNames = findDuplicates(resolvedExtensions.map((extension) => extension.name));\n\tif (duplicatedNames.length) console.warn(`[tiptap warn]: Duplicate extension names found: [${duplicatedNames.map((item) => `'${item}'`).join(\", \")}]. This can lead to issues.`);\n\treturn resolvedExtensions;\n}\n//#endregion\n//#region src/helpers/getSchema.ts\nfunction getSchema(extensions, editor) {\n\treturn getSchemaByResolvedExtensions(resolveExtensions(extensions), editor);\n}\n//#endregion\n//#region src/helpers/generateHTML.ts\n/**\n* Generate HTML from a JSONContent\n* @param doc The JSONContent to generate HTML from\n* @param extensions The extensions to use for the schema\n* @returns The generated HTML\n*/\nfunction generateHTML(doc, extensions) {\n\tconst schema = getSchema(extensions);\n\treturn getHTMLFromFragment(Node$1.fromJSON(schema, doc).content, schema);\n}\n//#endregion\n//#region src/helpers/generateJSON.ts\n/**\n* Generate JSONContent from HTML\n* @param html The HTML to generate JSONContent from\n* @param extensions The extensions to use for the schema\n* @returns The generated JSONContent\n*/\nfunction generateJSON(html, extensions) {\n\tconst schema = getSchema(extensions);\n\tconst dom = elementFromString(html);\n\treturn DOMParser.fromSchema(schema).parse(dom).toJSON();\n}\n//#endregion\n//#region src/helpers/getTextBetween.ts\n/**\n* Gets the text between two positions in a Prosemirror node\n* and serializes it using the given text serializers and block separator (see getText)\n* @param startNode The Prosemirror node to start from\n* @param range The range of the text to get\n* @param options Options for the text serializer & block separator\n* @returns The text between the two positions\n*/\nfunction getTextBetween(startNode, range, options) {\n\tconst { from, to } = range;\n\tconst { blockSeparator = \"\\n\\n\", textSerializers = {} } = options || {};\n\tlet text = \"\";\n\tstartNode.nodesBetween(from, to, (node, pos, parent, index) => {\n\t\tif (node.isBlock && pos > from) text += blockSeparator;\n\t\tconst textSerializer = textSerializers === null || textSerializers === void 0 ? void 0 : textSerializers[node.type.name];\n\t\tif (textSerializer) {\n\t\t\tif (parent) text += textSerializer({\n\t\t\t\tnode,\n\t\t\t\tpos,\n\t\t\t\tparent,\n\t\t\t\tindex,\n\t\t\t\trange\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\tif (node.isText) {\n\t\t\tvar _node$text;\n\t\t\ttext += node === null || node === void 0 || (_node$text = node.text) === null || _node$text === void 0 ? void 0 : _node$text.slice(Math.max(from, pos) - pos, to - pos);\n\t\t}\n\t});\n\treturn text;\n}\n//#endregion\n//#region src/helpers/getText.ts\n/**\n* Gets the text of a Prosemirror node\n* @param node The Prosemirror node\n* @param options Options for the text serializer & block separator\n* @returns The text of the node\n* @example ```js\n* const text = getText(node, { blockSeparator: '\\n' })\n* ```\n*/\nfunction getText(node, options) {\n\treturn getTextBetween(node, {\n\t\tfrom: 0,\n\t\tto: node.content.size\n\t}, options);\n}\n//#endregion\n//#region src/helpers/getTextSerializersFromSchema.ts\n/**\n* Find text serializers `toText` in a Prosemirror schema\n* @param schema The Prosemirror schema to search in\n* @returns A record of text serializers by node name\n*/\nfunction getTextSerializersFromSchema(schema) {\n\treturn Object.fromEntries(Object.entries(schema.nodes).filter(([, node]) => node.spec.toText).map(([name, node]) => [name, node.spec.toText]));\n}\n//#endregion\n//#region src/helpers/generateText.ts\n/**\n* Generate raw text from a JSONContent\n* @param doc The JSONContent to generate text from\n* @param extensions The extensions to use for the schema\n* @param options Options for the text generation f.e. blockSeparator or textSerializers\n* @returns The generated text\n*/\nfunction generateText(doc, extensions, options) {\n\tconst { blockSeparator = \"\\n\\n\", textSerializers = {} } = options || {};\n\tconst schema = getSchema(extensions);\n\treturn getText(Node$1.fromJSON(schema, doc), {\n\t\tblockSeparator,\n\t\ttextSerializers: {\n\t\t\t...getTextSerializersFromSchema(schema),\n\t\t\t...textSerializers\n\t\t}\n\t});\n}\n//#endregion\n//#region src/helpers/getNodeAttributes.ts\nfunction getNodeAttributes(state, typeOrName) {\n\tconst type = getNodeType(typeOrName, state.schema);\n\tconst { from, to } = state.selection;\n\tconst nodes = [];\n\tstate.doc.nodesBetween(from, to, (node) => {\n\t\tnodes.push(node);\n\t});\n\tconst node = nodes.reverse().find((nodeItem) => nodeItem.type.name === type.name);\n\tif (!node) return {};\n\treturn { ...node.attrs };\n}\n//#endregion\n//#region src/helpers/getAttributes.ts\n/**\n* Get node or mark attributes by type or name on the current editor state\n* @param state The current editor state\n* @param typeOrName The node or mark type or name\n* @returns The attributes of the node or mark or an empty object\n*/\nfunction getAttributes(state, typeOrName) {\n\tconst schemaType = getSchemaTypeNameByName(typeof typeOrName === \"string\" ? typeOrName : typeOrName.name, state.schema);\n\tif (schemaType === \"node\") return getNodeAttributes(state, typeOrName);\n\tif (schemaType === \"mark\") return getMarkAttributes(state, typeOrName);\n\treturn {};\n}\n//#endregion\n//#region src/utilities/removeDuplicates.ts\n/**\n* Removes duplicated values within an array.\n* Supports numbers, strings and objects.\n*/\nfunction removeDuplicates(array, by = JSON.stringify) {\n\tconst seen = {};\n\treturn array.filter((item) => {\n\t\tconst key = by(item);\n\t\treturn Object.prototype.hasOwnProperty.call(seen, key) ? false : seen[key] = true;\n\t});\n}\n//#endregion\n//#region src/helpers/getChangedRanges.ts\n/**\n* Removes duplicated ranges and ranges that are\n* fully captured by other ranges.\n*/\nfunction simplifyChangedRanges(changes) {\n\tconst uniqueChanges = removeDuplicates(changes);\n\treturn uniqueChanges.length === 1 ? uniqueChanges : uniqueChanges.filter((change, index) => {\n\t\treturn !uniqueChanges.filter((_, i) => i !== index).some((otherChange) => {\n\t\t\treturn change.oldRange.from >= otherChange.oldRange.from && change.oldRange.to <= otherChange.oldRange.to && change.newRange.from >= otherChange.newRange.from && change.newRange.to <= otherChange.newRange.to;\n\t\t});\n\t});\n}\n/**\n* Returns a list of changed ranges\n* based on the first and last state of all steps.\n*/\nfunction getChangedRanges(transform) {\n\tconst { mapping, steps } = transform;\n\tconst changes = [];\n\tmapping.maps.forEach((stepMap, index) => {\n\t\tconst ranges = [];\n\t\tif (!stepMap.ranges.length) {\n\t\t\tconst { from, to } = steps[index];\n\t\t\tif (from === void 0 || to === void 0) return;\n\t\t\tranges.push({\n\t\t\t\tfrom,\n\t\t\t\tto\n\t\t\t});\n\t\t} else stepMap.forEach((from, to) => {\n\t\t\tranges.push({\n\t\t\t\tfrom,\n\t\t\t\tto\n\t\t\t});\n\t\t});\n\t\tranges.forEach(({ from, to }) => {\n\t\t\tconst newStart = mapping.slice(index).map(from, -1);\n\t\t\tconst newEnd = mapping.slice(index).map(to);\n\t\t\tconst oldStart = mapping.invert().map(newStart, -1);\n\t\t\tconst oldEnd = mapping.invert().map(newEnd);\n\t\t\tchanges.push({\n\t\t\t\toldRange: {\n\t\t\t\t\tfrom: oldStart,\n\t\t\t\t\tto: oldEnd\n\t\t\t\t},\n\t\t\t\tnewRange: {\n\t\t\t\t\tfrom: newStart,\n\t\t\t\t\tto: newEnd\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\treturn simplifyChangedRanges(changes);\n}\n//#endregion\n//#region src/helpers/getDebugJSON.ts\nfunction getDebugJSON(node, startOffset = 0) {\n\tconst increment = node.type === node.type.schema.topNodeType ? 0 : 1;\n\tconst from = startOffset;\n\tconst to = from + node.nodeSize;\n\tconst marks = node.marks.map((mark) => {\n\t\tconst output = { type: mark.type.name };\n\t\tif (Object.keys(mark.attrs).length) output.attrs = { ...mark.attrs };\n\t\treturn output;\n\t});\n\tconst attrs = { ...node.attrs };\n\tconst output = {\n\t\ttype: node.type.name,\n\t\tfrom,\n\t\tto\n\t};\n\tif (Object.keys(attrs).length) output.attrs = attrs;\n\tif (marks.length) output.marks = marks;\n\tif (node.content.childCount) {\n\t\toutput.content = [];\n\t\tnode.forEach((child, offset) => {\n\t\t\tvar _output$content;\n\t\t\t(_output$content = output.content) === null || _output$content === void 0 || _output$content.push(getDebugJSON(child, startOffset + offset + increment));\n\t\t});\n\t}\n\tif (node.text) output.text = node.text;\n\treturn output;\n}\n//#endregion\n//#region src/helpers/getMarksBetween.ts\nfunction getMarksBetween(from, to, doc) {\n\tconst marks = [];\n\tif (from === to) doc.resolve(from).marks().forEach((mark) => {\n\t\tconst range = getMarkRange(doc.resolve(from), mark.type);\n\t\tif (!range) return;\n\t\tmarks.push({\n\t\t\tmark,\n\t\t\t...range\n\t\t});\n\t});\n\telse doc.nodesBetween(from, to, (node, pos) => {\n\t\tif (!node || (node === null || node === void 0 ? void 0 : node.nodeSize) === void 0) return;\n\t\tmarks.push(...node.marks.map((mark) => ({\n\t\t\tfrom: pos,\n\t\t\tto: pos + node.nodeSize,\n\t\t\tmark\n\t\t})));\n\t});\n\treturn marks;\n}\n//#endregion\n//#region src/helpers/getNodeAtPosition.ts\n/**\n* Finds the first node of a given type or name in the current selection.\n* @param state The editor state.\n* @param typeOrName The node type or name.\n* @param pos The position to start searching from.\n* @param maxDepth The maximum depth to search.\n* @returns The node and the depth as an array.\n*/\nconst getNodeAtPosition = (state, typeOrName, pos, maxDepth = 20) => {\n\tconst $pos = state.doc.resolve(pos);\n\tlet currentDepth = maxDepth;\n\tlet node = null;\n\twhile (currentDepth > 0 && node === null) {\n\t\tconst currentNode = $pos.node(currentDepth);\n\t\tif ((currentNode === null || currentNode === void 0 ? void 0 : currentNode.type.name) === typeOrName) node = currentNode;\n\t\telse currentDepth -= 1;\n\t}\n\treturn [node, currentDepth];\n};\n//#endregion\n//#region src/helpers/getPreviousBlockSibling.ts\n/**\n* Returns the block-level sibling immediately before the cursor's textblock\n* (or null when the cursor is at the first child of its block parent).\n*\n* The position does not have to sit inside a textblock: for any resolved\n* position, the result is the sibling immediately before `$pos.parent`. At a\n* GapCursor position this is the sibling before the whole container, not the\n* node before the gap.\n*\n* @param $pos The resolved position to look around\n* @returns The previous block-level sibling, or null\n* @example ```js\n* // Cursor in a top-level paragraph after a list:\n* // <ul><li>A</li></ul><p>|B</p>\n* getPreviousBlockSibling($from) // <ul>\n*\n* // Cursor in the second paragraph of a list item:\n* // <ul><li><p>A</p><p>|B</p></li></ul>\n* getPreviousBlockSibling($from) // <p>A</p>\n*\n* // Cursor in the first child of its block parent:\n* // <doc><p>|A</p></doc>\n* getPreviousBlockSibling($from) // null\n* ```\n*/\nconst getPreviousBlockSibling = ($pos) => {\n\tconst parentDepth = $pos.depth - 1;\n\tif (parentDepth < 0) return null;\n\tconst index = $pos.index(parentDepth);\n\tif (index === 0) return null;\n\treturn $pos.node(parentDepth).child(index - 1);\n};\n//#endregion\n//#region src/helpers/getSchemaTypeByName.ts\n/**\n* Tries to get a node or mark type by its name.\n* @param name The name of the node or mark type\n* @param schema The Prosemiror schema to search in\n* @returns The node or mark type, or null if it doesn't exist\n*/\nfunction getSchemaTypeByName(name, schema) {\n\treturn schema.nodes[name] || schema.marks[name] || null;\n}\n//#endregion\n//#region src/helpers/getSplittedAttributes.ts\n/**\n* Return attributes of an extension that should be splitted by keepOnSplit flag\n* @param extensionAttributes Array of extension attributes\n* @param typeName The type of the extension\n* @param attributes The attributes of the extension\n* @returns The splitted attributes\n*/\nfunction getSplittedAttributes(extensionAttributes, typeName, attributes) {\n\treturn Object.fromEntries(Object.entries(attributes).filter(([name]) => {\n\t\tconst extensionAttribute = extensionAttributes.find((item) => {\n\t\t\treturn item.type === typeName && item.name === name;\n\t\t});\n\t\tif (!extensionAttribute) return false;\n\t\treturn extensionAttribute.attribute.keepOnSplit;\n\t}));\n}\n//#endregion\n//#region src/helpers/getTextContentFromNodes.ts\n/**\n* Returns the text content of a resolved prosemirror position\n* @param $from The resolved position to get the text content from\n* @param maxMatch The maximum number of characters to match\n* @returns The text content\n*/\nconst getTextContentFromNodes = ($from, maxMatch = 500) => {\n\tlet textBefore = \"\";\n\tconst sliceEndPos = $from.parentOffset;\n\t$from.parent.nodesBetween(Math.max(0, sliceEndPos - maxMatch), sliceEndPos, (node, pos, parent, index) => {\n\t\tvar _node$type$spec$toTex, _node$type$spec;\n\t\tconst chunk = ((_node$type$spec$toTex = (_node$type$spec = node.type.spec).toText) === null || _node$type$spec$toTex === void 0 ? void 0 : _node$type$spec$toTex.call(_node$type$spec, {\n\t\t\tnode,\n\t\t\tpos,\n\t\t\tparent,\n\t\t\tindex\n\t\t})) || node.textContent || \"%leaf%\";\n\t\ttextBefore += node.isAtom && !node.isText ? chunk : chunk.slice(0, Math.max(0, sliceEndPos - pos));\n\t});\n\treturn textBefore;\n};\n//#endregion\n//#region src/helpers/isMarkActive.ts\nfunction isMarkActive(state, typeOrName, attributes = {}) {\n\tconst { empty, ranges } = state.selection;\n\tconst type = typeOrName ? getMarkType(typeOrName, state.schema) : null;\n\tif (empty) return !!(state.storedMarks || state.selection.$from.marks()).filter((mark) => {\n\t\tif (!type) return true;\n\t\treturn type.name === mark.type.name;\n\t}).find((mark) => objectIncludes(mark.attrs, attributes, { strict: false }));\n\tlet selectionRange = 0;\n\tconst markRanges = [];\n\tranges.forEach(({ $from, $to }) => {\n\t\tconst from = $from.pos;\n\t\tconst to = $to.pos;\n\t\tstate.doc.nodesBetween(from, to, (node, pos) => {\n\t\t\tif (type && node.inlineContent && !node.type.allowsMarkType(type)) return false;\n\t\t\tif (!node.isText && !node.marks.length) return;\n\t\t\tconst relativeFrom = Math.max(from, pos);\n\t\t\tconst relativeTo = Math.min(to, pos + node.nodeSize);\n\t\t\tconst range = relativeTo - relativeFrom;\n\t\t\tselectionRange += range;\n\t\t\tmarkRanges.push(...node.marks.map((mark) => ({\n\t\t\t\tmark,\n\t\t\t\tfrom: relativeFrom,\n\t\t\t\tto: relativeTo\n\t\t\t})));\n\t\t});\n\t});\n\tif (selectionRange === 0) return false;\n\tconst matchedRange = markRanges.filter((markRange) => {\n\t\tif (!type) return true;\n\t\treturn type.name === markRange.mark.type.name;\n\t}).filter((markRange) => objectIncludes(markRange.mark.attrs, attributes, { strict: false })).reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\n\tconst excludedRange = markRanges.filter((markRange) => {\n\t\tif (!type) return true;\n\t\treturn markRange.mark.type !== type && markRange.mark.type.excludes(type);\n\t}).reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\n\treturn (matchedRange > 0 ? matchedRange + excludedRange : matchedRange) >= selectionRange;\n}\n//#endregion\n//#region src/helpers/isActive.ts\nfunction isActive(state, name, attributes = {}) {\n\tif (!name) return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes);\n\tconst schemaType = getSchemaTypeNameByName(name, state.schema);\n\tif (schemaType === \"node\") return isNodeActive(state, name, attributes);\n\tif (schemaType === \"mark\") return isMarkActive(state, name, attributes);\n\treturn false;\n}\n//#endregion\n//#region src/helpers/isAtEndOfNode.ts\nconst isAtEndOfNode = (state, nodeType) => {\n\tconst { $from, $to, $anchor } = state.selection;\n\tif (nodeType) {\n\t\tconst parentNode = findParentNode((node) => node.type.name === nodeType)(state.selection);\n\t\tif (!parentNode) return false;\n\t\tconst $parentPos = state.doc.resolve(parentNode.pos + 1);\n\t\tif ($anchor.pos + 1 === $parentPos.end()) return true;\n\t\treturn false;\n\t}\n\tif ($to.parentOffset < $to.parent.nodeSize - 2 || $from.pos !== $to.pos) return false;\n\treturn true;\n};\n//#endregion\n//#region src/helpers/isAtStartOfNode.ts\nconst isAtStartOfNode = (state) => {\n\tconst { $from, $to } = state.selection;\n\tif ($from.parentOffset > 0 || $from.pos !== $to.pos) return false;\n\treturn true;\n};\n//#endregion\n//#region src/helpers/isExtensionRulesEnabled.ts\nfunction isExtensionRulesEnabled(extension, enabled) {\n\tif (Array.isArray(enabled)) return enabled.some((enabledExtension) => {\n\t\treturn (typeof enabledExtension === \"string\" ? enabledExtension : enabledExtension.name) === extension.name;\n\t});\n\treturn enabled;\n}\n//#endregion\n//#region src/helpers/isList.ts\nfunction isList(name, extensions) {\n\tconst { nodeExtensions } = splitExtensions(extensions);\n\tconst extension = nodeExtensions.find((item) => item.name === name);\n\tif (!extension) return false;\n\tconst group = callOrReturn(getExtensionField(extension, \"group\", {\n\t\tname: extension.name,\n\t\toptions: extension.options,\n\t\tstorage: extension.storage\n\t}));\n\tif (typeof group !== \"string\") return false;\n\treturn group.split(\" \").includes(\"list\");\n}\n//#endregion\n//#region src/helpers/isNodeEmpty.ts\n/**\n* Returns true if the given prosemirror node is empty.\n*/\nfunction isNodeEmpty(node, { checkChildren = true, ignoreWhitespace = false } = {}) {\n\tif (ignoreWhitespace) {\n\t\tif (node.type.name === \"hardBreak\") return true;\n\t\tif (node.isText) {\n\t\t\tvar _node$text;\n\t\t\treturn !/\\S/.test((_node$text = node.text) !== null && _node$text !== void 0 ? _node$text : \"\");\n\t\t}\n\t}\n\tif (node.isText) return !node.text;\n\tif (node.isAtom || node.isLeaf) return false;\n\tif (node.content.childCount === 0) return true;\n\tif (checkChildren) {\n\t\tlet isContentEmpty = true;\n\t\tnode.content.forEach((childNode) => {\n\t\t\tif (isContentEmpty === false) return;\n\t\t\tif (!isNodeEmpty(childNode, {\n\t\t\t\tignoreWhitespace,\n\t\t\t\tcheckChildren\n\t\t\t})) isContentEmpty = false;\n\t\t});\n\t\treturn isContentEmpty;\n\t}\n\treturn false;\n}\n//#endregion\n//#region src/helpers/isNodeSelection.ts\nfunction isNodeSelection(value) {\n\treturn value instanceof NodeSelection;\n}\n//#endregion\n//#region src/helpers/isNodeViewSelected.ts\n/**\n* Determines whether a node view should be considered selected for the given\n* editor selection.\n*\n* A node is considered selected when the current selection fully covers it\n* (e.g. a `NodeSelection`). When `selectedOnTextSelection` is enabled, the\n* node is additionally considered selected if a `TextSelection` is fully\n* contained within the node's range.\n*\n* @param selection The current editor selection.\n* @param pos The start position of the node in the document.\n* @param nodeSize The size of the node.\n* @param selectedOnTextSelection When `true`, also treat selections inside the node as selected.\n* @returns `true` if the node view should render as selected.\n*/\nfunction isNodeViewSelected({ selection, pos, nodeSize, selectedOnTextSelection = false }) {\n\tconst { from, to } = selection;\n\tif (from <= pos && to >= pos + nodeSize) return true;\n\tif (selectedOnTextSelection && isTextSelection(selection) && from > pos && to < pos + nodeSize) return true;\n\treturn false;\n}\n//#endregion\n//#region src/helpers/isProseMirrorStep.ts\n/**\n* Checks if a value is a ProseMirror step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror Step\n* @example ```js\n* isProseMirrorStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (typeof step.apply !== \"function\" || typeof step.getMap !== \"function\" || typeof step.invert !== \"function\" || typeof step.map !== \"function\" || typeof step.merge !== \"function\" || typeof step.toJSON !== \"function\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorAddMarkStep.ts\n/**\n* Checks if a value is a ProseMirror add mark step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror AddMarkStep\n* @example ```js\n* isProseMirrorAddMarkStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorAddMarkStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"addMark\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorAddNodeMarkStep.ts\n/**\n* Checks if a value is a ProseMirror add node mark step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror AddNodeMarkStep\n* @example ```js\n* isProseMirrorAddNodeMarkStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorAddNodeMarkStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"addNodeMark\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorAttrStep.ts\n/**\n* Checks if a value is a ProseMirror attribute step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror AttrStep\n* @example ```js\n* isProseMirrorAttrStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorAttrStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"attr\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorCellSelection.ts\n/**\n* Check whether a selection provides the cell-iteration API.\n*\n* @param selection - Selection to inspect.\n* @returns Whether the selection is a table cell selection.\n* @example ```js\n* isProseMirrorCellSelection(editor.state.selection)\n* ```\n*/\nfunction isProseMirrorCellSelection(selection) {\n\tif (selection === null || typeof selection !== \"object\") return false;\n\treturn \"forEachCell\" in selection && typeof selection.forEachCell === \"function\";\n}\n//#endregion\n//#region src/helpers/isProseMirrorDocAttrStep.ts\n/**\n* Checks if a value is a ProseMirror document attribute step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror DocAttrStep\n* @example ```js\n* isProseMirrorDocAttrStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorDocAttrStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"docAttr\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorFragment.ts\n/**\n* Checks if a value is a ProseMirror fragment by inspecting it\n* @param value The value to check\n* @returns - A boolean, if true the value is a ProseMirror fragment\n* @example ```js\n* isProseMirrorFragment(editor.state.doc.content)\n* ```\n*/\nfunction isProseMirrorFragment(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst fragment = value;\n\tif (!Array.isArray(fragment.content) || typeof fragment.size !== \"number\" || typeof fragment.nodesBetween !== \"function\" || typeof fragment.descendants !== \"function\" || typeof fragment.textBetween !== \"function\" || typeof fragment.append !== \"function\" || typeof fragment.cut !== \"function\" || typeof fragment.eq !== \"function\" || typeof fragment.child !== \"function\" || typeof fragment.forEach !== \"function\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorNodeSelection.ts\n/**\n* Check whether a selection exposes a selected node.\n*\n* @param selection - Selection to inspect.\n* @returns Whether the selection is a node selection.\n* @example ```js\n* isProseMirrorNodeSelection(editor.state.selection)\n* ```\n*/\nfunction isProseMirrorNodeSelection(selection) {\n\tif (selection === null || typeof selection !== \"object\") return false;\n\treturn \"node\" in selection && selection.node != null;\n}\n//#endregion\n//#region src/helpers/isProseMirrorRemoveMarkStep.ts\n/**\n* Checks if a value is a ProseMirror remove mark step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror RemoveMarkStep\n* @example ```js\n* isProseMirrorRemoveMarkStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorRemoveMarkStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"removeMark\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorRemoveNodeMarkStep.ts\n/**\n* Checks if a value is a ProseMirror remove node mark step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror RemoveNodeMarkStep\n* @example ```js\n* isProseMirrorRemoveNodeMarkStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorRemoveNodeMarkStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"removeNodeMark\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorReplaceAroundStep.ts\n/**\n* Checks if a value is a ProseMirror replace around step\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror ReplaceAroundStep\n* @example ```js\n* isProseMirrorReplaceAroundStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorReplaceAroundStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"replaceAround\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorReplaceStep.ts\n/**\n* Checks if a value is a ProseMirror replace step result\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror ReplaceStep\n* @example ```js\n* isProseMirrorReplaceStep(transaction.steps[0])\n* ```\n*/\nfunction isProseMirrorReplaceStep(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst step = value;\n\tif (!isProseMirrorStep(step)) return false;\n\tconst json = step.toJSON();\n\tif (json === null || typeof json !== \"object\" || json.stepType !== \"replace\") return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorSlice.ts\n/**\n* Checks if a value is a ProseMirror slice by inspecting it\n* @param value The value to check\n* @returns - A boolean, if true the value is a ProseMirror slice\n* @example ```js\n* isProseMirrorSlice(editor.state.doc.content.slice(0, 10))\n* ```\n*/\nfunction isProseMirrorSlice(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst slice = value;\n\tconst openStartIsNumber = Number.isInteger(slice.openStart) && slice.openStart >= 0;\n\tconst openEndIsNumber = Number.isInteger(slice.openEnd) && slice.openEnd >= 0;\n\tconst sliceHasRequiredProperties = typeof slice.size === \"number\" && typeof slice.eq === \"function\" && typeof slice.toJSON === \"function\";\n\tif (!openStartIsNumber || !openEndIsNumber || !sliceHasRequiredProperties) return false;\n\tconst content = slice.content;\n\tif (content === null || typeof content !== \"object\") return false;\n\tif (!isProseMirrorFragment(content)) return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/isProseMirrorStepResult.ts\n/**\n* Checks if a value is a ProseMirror step result\n* @param value The value to check\n* @returns - A boolean, if the boolean is true the value is a ProseMirror StepResult\n* @example ```js\n* isProseMirrorStepResult(step.apply(editor.state.doc))\n* ```\n*/\nfunction isProseMirrorStepResult(value) {\n\tif (value === null || typeof value !== \"object\") return false;\n\tconst result = value;\n\tconst isValidDoc = result.doc !== null && typeof result.doc === \"object\" && result.failed === null;\n\tconst isValidFailed = typeof result.failed === \"string\" && result.doc === null;\n\tif (!isValidDoc && !isValidFailed) return false;\n\treturn true;\n}\n//#endregion\n//#region src/helpers/MappablePosition.ts\n/**\n* A class that represents a mappable position in the editor. It can be extended\n* by other extensions to add additional position mapping capabilities.\n*/\nvar MappablePosition = class MappablePosition {\n\tconstructor(position) {\n\t\tthis.position = position;\n\t}\n\t/**\n\t* Creates a MappablePosition from a JSON object.\n\t*/\n\tstatic fromJSON(json) {\n\t\treturn new MappablePosition(json.position);\n\t}\n\t/**\n\t* Converts the MappablePosition to a JSON object.\n\t*/\n\ttoJSON() {\n\t\treturn { position: this.position };\n\t}\n};\n/**\n* Calculates the new position after applying a transaction.\n*\n* @returns The new mappable position and the map result.\n*/\nfunction getUpdatedPosition(position, transaction) {\n\tconst mapResult = transaction.mapping.mapResult(position.position);\n\treturn {\n\t\tposition: new MappablePosition(mapResult.pos),\n\t\tmapResult\n\t};\n}\n/**\n* Creates a MappablePosition from a position number. This is the default\n* implementation for Tiptap core. It can be overridden by other Tiptap\n* extensions.\n*\n* @param position The position (as a number) where the MappablePosition will be created.\n* @returns A new MappablePosition instance at the given position.\n*/\nfunction createMappablePosition(position) {\n\treturn new MappablePosition(position);\n}\n//#endregion\n//#region src/helpers/posToDOMRect.ts\nfunction posToDOMRect(view, from, to) {\n\tconst minPos = 0;\n\tconst maxPos = view.state.doc.content.size;\n\tconst resolvedFrom = minMax(from, minPos, maxPos);\n\tconst resolvedEnd = minMax(to, minPos, maxPos);\n\tconst start = view.coordsAtPos(resolvedFrom);\n\tconst end = view.coordsAtPos(resolvedEnd, -1);\n\tconst top = Math.min(start.top, end.top);\n\tconst bottom = Math.max(start.bottom, end.bottom);\n\tconst left = Math.min(start.left, end.left);\n\tconst right = Math.max(start.right, end.right);\n\tconst data = {\n\t\ttop,\n\t\tbottom,\n\t\tleft,\n\t\tright,\n\t\twidth: right - left,\n\t\theight: bottom - top,\n\t\tx: left,\n\t\ty: top\n\t};\n\treturn {\n\t\t...data,\n\t\ttoJSON: () => data\n\t};\n}\n//#endregion\n//#region src/helpers/rewriteUnknownContent.ts\n/**\n* The actual implementation of the rewriteUnknownContent function\n*/\nfunction rewriteUnknownContentInner({ json, validMarks, validNodes, options, rewrittenContent = [] }) {\n\tif (json.marks && Array.isArray(json.marks)) json.marks = json.marks.filter((mark) => {\n\t\tif (mark === null || mark === void 0) return false;\n\t\tconst name = typeof mark === \"string\" ? mark : mark.type;\n\t\tif (validMarks.has(name)) return true;\n\t\trewrittenContent.push({\n\t\t\toriginal: JSON.parse(JSON.stringify(mark)),\n\t\t\tunsupported: name\n\t\t});\n\t\treturn false;\n\t});\n\tif (json.content && Array.isArray(json.content)) json.content = json.content.map((value) => {\n\t\tif (value === null || value === void 0) return null;\n\t\treturn rewriteUnknownContentInner({\n\t\t\tjson: value,\n\t\t\tvalidMarks,\n\t\t\tvalidNodes,\n\t\t\toptions,\n\t\t\trewrittenContent\n\t\t}).json;\n\t}).filter((a) => a !== null && a !== void 0);\n\tif (json.type && !validNodes.has(json.type)) {\n\t\trewrittenContent.push({\n\t\t\toriginal: JSON.parse(JSON.stringify(json)),\n\t\t\tunsupported: json.type\n\t\t});\n\t\tif (json.content && Array.isArray(json.content) && (options === null || options === void 0 ? void 0 : options.fallbackToParagraph) !== false) {\n\t\t\tjson.type = \"paragraph\";\n\t\t\treturn {\n\t\t\t\tjson,\n\t\t\t\trewrittenContent\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tjson: null,\n\t\t\trewrittenContent\n\t\t};\n\t}\n\treturn {\n\t\tjson,\n\t\trewrittenContent\n\t};\n}\n/**\n* Rewrite unknown nodes and marks within JSON content\n* Allowing for user within the editor\n*/\nfunction rewriteUnknownContent(json, schema, options) {\n\treturn rewriteUnknownContentInner({\n\t\tjson,\n\t\tvalidNodes: new Set(Object.keys(schema.nodes)),\n\t\tvalidMarks: new Set(Object.keys(schema.marks)),\n\t\toptions\n\t});\n}\n//#endregion\n//#region src/commands/setMark.ts\nfunction canSetMark(state, tr, newMarkType) {\n\tconst { selection } = tr;\n\tlet cursor = null;\n\tif (isTextSelection(selection)) cursor = selection.$cursor;\n\tif (cursor) {\n\t\tvar _state$storedMarks;\n\t\tconst currentMarks = (_state$storedMarks = state.storedMarks) !== null && _state$storedMarks !== void 0 ? _state$storedMarks : cursor.marks();\n\t\treturn cursor.parent.type.allowsMarkType(newMarkType) && (!!newMarkType.isInSet(currentMarks) || !currentMarks.some((mark) => mark.type.excludes(newMarkType)));\n\t}\n\tconst { ranges } = selection;\n\treturn ranges.some(({ $from, $to }) => {\n\t\tlet someNodeSupportsMark = $from.depth === 0 ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType) : false;\n\t\tstate.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\n\t\t\tif (someNodeSupportsMark) return false;\n\t\t\tif (node.isInline) {\n\t\t\t\tconst parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType);\n\t\t\t\tconst currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks) || !node.marks.some((otherMark) => otherMark.type.excludes(newMarkType));\n\t\t\t\tsomeNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType;\n\t\t\t}\n\t\t\treturn !someNodeSupportsMark;\n\t\t});\n\t\treturn someNodeSupportsMark;\n\t});\n}\nconst setMark = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n\tconst { selection } = tr;\n\tconst { empty, ranges } = selection;\n\tconst type = getMarkType(typeOrName, state.schema);\n\tif (dispatch) {\n\t\tif (empty) {\n\t\t\tconst oldAttributes = getMarkAttributes(state, type);\n\t\t\ttr.addStoredMark(type.create({\n\t\t\t\t...oldAttributes,\n\t\t\t\t...attributes\n\t\t\t}));\n\t\t} else ranges.forEach((range) => {\n\t\t\tconst from = range.$from.pos;\n\t\t\tconst to = range.$to.pos;\n\t\t\tstate.doc.nodesBetween(from, to, (node, pos) => {\n\t\t\t\tconst trimmedFrom = Math.max(pos, from);\n\t\t\t\tconst trimmedTo = Math.min(pos + node.nodeSize, to);\n\t\t\t\tif (node.marks.find((mark) => mark.type === type)) node.marks.forEach((mark) => {\n\t\t\t\t\tif (type === mark.type) tr.addMark(trimmedFrom, trimmedTo, type.create({\n\t\t\t\t\t\t...mark.attrs,\n\t\t\t\t\t\t...attributes\n\t\t\t\t\t}));\n\t\t\t\t});\n\t\t\t\telse tr.addMark(trimmedFrom, trimmedTo, type.create(attributes));\n\t\t\t});\n\t\t});\n\t}\n\treturn canSetMark(state, tr, type);\n};\n//#endregion\n//#region src/commands/setMeta.ts\nconst setMeta = (key, value) => ({ tr }) => {\n\ttr.setMeta(key, value);\n\treturn true;\n};\n//#endregion\n//#region src/commands/setNode.ts\nconst setNode = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\tlet attributesToCopy;\n\tif (state.selection.$anchor.sameParent(state.selection.$head)) attributesToCopy = state.selection.$anchor.parent.attrs;\n\tif (!type.isTextblock) {\n\t\tconsole.warn(\"[tiptap warn]: Currently \\\"setNode()\\\" only supports text block nodes.\");\n\t\treturn false;\n\t}\n\treturn chain().command(({ commands }) => {\n\t\tif (setBlockType(type, {\n\t\t\t...attributesToCopy,\n\t\t\t...attributes\n\t\t})(state)) return true;\n\t\treturn commands.clearNodes();\n\t}).command(({ state: updatedState }) => {\n\t\treturn setBlockType(type, {\n\t\t\t...attributesToCopy,\n\t\t\t...attributes\n\t\t})(updatedState, dispatch);\n\t}).run();\n};\n//#endregion\n//#region src/commands/setNodeSelection.ts\nconst setNodeSelection = (position) => ({ tr, dispatch }) => {\n\tif (dispatch) {\n\t\tconst { doc } = tr;\n\t\tconst from = minMax(position, 0, doc.content.size);\n\t\tconst selection = NodeSelection.create(doc, from);\n\t\ttr.setSelection(selection);\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/setTextDirection.ts\nconst setTextDirection = (direction, position) => ({ tr, state, dispatch }) => {\n\tconst { selection } = state;\n\tlet from;\n\tlet to;\n\tif (typeof position === \"number\") {\n\t\tfrom = position;\n\t\tto = position;\n\t} else if (position && \"from\" in position && \"to\" in position) {\n\t\tfrom = position.from;\n\t\tto = position.to;\n\t} else {\n\t\tfrom = selection.from;\n\t\tto = selection.to;\n\t}\n\tif (dispatch) tr.doc.nodesBetween(from, to, (node, pos) => {\n\t\tif (node.isText) return;\n\t\ttr.setNodeMarkup(pos, void 0, {\n\t\t\t...node.attrs,\n\t\t\tdir: direction\n\t\t});\n\t});\n\treturn true;\n};\n//#endregion\n//#region src/commands/setTextSelection.ts\nconst setTextSelection = (position) => ({ tr, dispatch }) => {\n\tif (dispatch) {\n\t\tconst { doc } = tr;\n\t\tconst { from, to } = typeof position === \"number\" ? {\n\t\t\tfrom: position,\n\t\t\tto: position\n\t\t} : position;\n\t\tconst minPos = TextSelection.atStart(doc).from;\n\t\tconst maxPos = TextSelection.atEnd(doc).to;\n\t\tconst resolvedFrom = minMax(from, minPos, maxPos);\n\t\tconst resolvedEnd = minMax(to, minPos, maxPos);\n\t\tconst selection = TextSelection.create(doc, resolvedFrom, resolvedEnd);\n\t\ttr.setSelection(selection);\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/sinkListItem.ts\nconst sinkListItem$1 = (typeOrName) => ({ state, dispatch }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\treturn sinkListItem(type)(state, dispatch);\n};\n//#endregion\n//#region src/commands/splitBlock.ts\nfunction ensureMarks(state, splittableMarks) {\n\tconst marks = state.storedMarks || state.selection.$to.parentOffset && state.selection.$from.marks();\n\tif (marks) {\n\t\tconst filteredMarks = marks.filter((mark) => splittableMarks === null || splittableMarks === void 0 ? void 0 : splittableMarks.includes(mark.type.name));\n\t\tstate.tr.ensureMarks(filteredMarks);\n\t}\n}\nconst splitBlock = ({ keepMarks = true } = {}) => ({ tr, state, dispatch, editor }) => {\n\tconst { selection, doc } = tr;\n\tconst { $from, $to } = selection;\n\tconst extensionAttributes = editor.extensionManager.attributes;\n\tconst newAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\n\tif (selection instanceof NodeSelection && selection.node.isBlock) {\n\t\tif (!$from.parentOffset || !canSplit(doc, $from.pos)) return false;\n\t\tif (dispatch) {\n\t\t\tif (keepMarks) ensureMarks(state, editor.extensionManager.splittableMarks);\n\t\t\ttr.split($from.pos).scrollIntoView();\n\t\t}\n\t\treturn true;\n\t}\n\tif (!$from.parent.isBlock) return false;\n\tconst atEnd = $to.parentOffset === $to.parent.content.size;\n\tconst deflt = $from.depth === 0 ? void 0 : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n\tlet types = atEnd && deflt ? [{\n\t\ttype: deflt,\n\t\tattrs: newAttributes\n\t}] : void 0;\n\tlet can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n\tif (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : void 0)) {\n\t\tcan = true;\n\t\ttypes = deflt ? [{\n\t\t\ttype: deflt,\n\t\t\tattrs: newAttributes\n\t\t}] : void 0;\n\t}\n\tif (dispatch) {\n\t\tif (can) {\n\t\t\tif (selection instanceof TextSelection) tr.deleteSelection();\n\t\t\ttr.split(tr.mapping.map($from.pos), 1, types);\n\t\t\tif (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\n\t\t\t\tconst first = tr.mapping.map($from.before());\n\t\t\t\tconst $first = tr.doc.resolve(first);\n\t\t\t\tif ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\n\t\t\t}\n\t\t}\n\t\tif (keepMarks) ensureMarks(state, editor.extensionManager.splittableMarks);\n\t\ttr.scrollIntoView();\n\t}\n\treturn can;\n};\n//#endregion\n//#region src/commands/splitListItem.ts\nconst splitListItem = (typeOrName, overrideAttrs = {}) => ({ tr, state, dispatch, editor }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\tconst { $from, $to } = state.selection;\n\tconst node = state.selection.node;\n\tif (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n\tconst grandParent = $from.node(-1);\n\tif (grandParent.type !== type) return false;\n\tconst extensionAttributes = editor.extensionManager.attributes;\n\tif ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\n\t\tif ($from.depth === 2 || $from.node(-3).type !== type || $from.index(-2) !== $from.node(-2).childCount - 1) return false;\n\t\tif (dispatch) {\n\t\t\tvar _type$contentMatch$de;\n\t\t\tlet wrap = Fragment$1.empty;\n\t\t\tconst depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n\t\t\tfor (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) wrap = Fragment$1.from($from.node(d).copy(wrap));\n\t\t\tconst depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n\t\t\tconst newNextTypeAttributes = {\n\t\t\t\t...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),\n\t\t\t\t...overrideAttrs\n\t\t\t};\n\t\t\tconst nextType = ((_type$contentMatch$de = type.contentMatch.defaultType) === null || _type$contentMatch$de === void 0 ? void 0 : _type$contentMatch$de.createAndFill(newNextTypeAttributes)) || void 0;\n\t\t\twrap = wrap.append(Fragment$1.from(type.createAndFill(null, nextType) || void 0));\n\t\t\tconst start = $from.before($from.depth - (depthBefore - 1));\n\t\t\ttr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n\t\t\tlet sel = -1;\n\t\t\ttr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\n\t\t\t\tif (sel > -1) return false;\n\t\t\t\tif (n.isTextblock && n.content.size === 0) sel = pos + 1;\n\t\t\t});\n\t\t\tif (sel > -1) tr.setSelection(TextSelection.near(tr.doc.resolve(sel)));\n\t\t\ttr.scrollIntoView();\n\t\t}\n\t\treturn true;\n\t}\n\tconst nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n\tconst newTypeAttributes = {\n\t\t...getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs),\n\t\t...overrideAttrs\n\t};\n\tconst newNextTypeAttributes = {\n\t\t...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),\n\t\t...overrideAttrs\n\t};\n\ttr.delete($from.pos, $to.pos);\n\tconst types = nextType ? [{\n\t\ttype,\n\t\tattrs: newTypeAttributes\n\t}, {\n\t\ttype: nextType,\n\t\tattrs: newNextTypeAttributes\n\t}] : [{\n\t\ttype,\n\t\tattrs: newTypeAttributes\n\t}];\n\tif (!canSplit(tr.doc, $from.pos, 2)) return false;\n\tif (dispatch) {\n\t\tconst { selection, storedMarks } = state;\n\t\tconst { splittableMarks } = editor.extensionManager;\n\t\tconst marks = storedMarks || selection.$to.parentOffset && selection.$from.marks();\n\t\ttr.split($from.pos, 2, types).scrollIntoView();\n\t\tif (!marks || !dispatch) return true;\n\t\tconst filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name));\n\t\ttr.ensureMarks(filteredMarks);\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/toggleList.ts\n/**\n* Normalise a list type attribute for comparison.\n* Treats null, undefined, and \"1\" as equivalent (the default numeric type).\n*/\nfunction normalizeListType(type) {\n\treturn !type || type === \"1\" ? null : type;\n}\n/**\n* Check if two list type attributes are compatible for joining.\n* Lists can only join when they have the same type (both default, or both the same non-default type).\n*/\nfunction areListTypesCompatible(typeA, typeB) {\n\treturn normalizeListType(typeA) === normalizeListType(typeB);\n}\nconst joinListBackwards = (tr, listType) => {\n\tconst list = findParentNode((node) => node.type === listType)(tr.selection);\n\tif (!list) return true;\n\tconst before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth);\n\tif (before === void 0) return true;\n\tconst nodeBefore = tr.doc.nodeAt(before);\n\tif (!(list.node.type === (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) && canJoin(tr.doc, list.pos))) return true;\n\tif (!areListTypesCompatible(list.node.attrs.type, nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.attrs.type)) return true;\n\ttr.join(list.pos);\n\treturn true;\n};\nconst joinListForwards = (tr, listType) => {\n\tconst list = findParentNode((node) => node.type === listType)(tr.selection);\n\tif (!list) return true;\n\tconst after = tr.doc.resolve(list.start).after(list.depth);\n\tif (after === void 0) return true;\n\tconst nodeAfter = tr.doc.nodeAt(after);\n\tif (!(list.node.type === (nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.type) && canJoin(tr.doc, after))) return true;\n\tif (!areListTypesCompatible(list.node.attrs.type, nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.attrs.type)) return true;\n\ttr.join(after);\n\treturn true;\n};\nfunction createInnerSelectionForWholeDocList(tr) {\n\tconst doc = tr.doc;\n\tconst list = doc.firstChild;\n\tif (!list) return null;\n\tconst $start = doc.resolve(1);\n\tconst $end = doc.resolve(list.nodeSize - 1);\n\treturn TextSelection.between($start, $end);\n}\nconst toggleList = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) => ({ editor, tr, state, dispatch, chain, commands, can }) => {\n\tconst { extensions, splittableMarks } = editor.extensionManager;\n\tconst listType = getNodeType(listTypeOrName, state.schema);\n\tconst itemType = getNodeType(itemTypeOrName, state.schema);\n\tconst { selection, storedMarks } = state;\n\tconst { $from, $to } = selection;\n\tconst range = $from.blockRange($to);\n\tconst marks = storedMarks || selection.$to.parentOffset && selection.$from.marks();\n\tif (!range) return false;\n\tconst parentList = findParentNode((node) => isList(node.type.name, extensions))(selection);\n\tconst isAllSelection = selection.from === 0 && selection.to === state.doc.content.size;\n\tconst topLevelNodes = state.doc.content.content;\n\tconst soleTopLevelNode = topLevelNodes.length === 1 ? topLevelNodes[0] : null;\n\tconst allSelectionList = isAllSelection && soleTopLevelNode && isList(soleTopLevelNode.type.name, extensions) ? {\n\t\tnode: soleTopLevelNode,\n\t\tpos: 0,\n\t\tdepth: 0\n\t} : null;\n\tconst currentList = parentList !== null && parentList !== void 0 ? parentList : allSelectionList;\n\tconst isInsideExistingList = !!parentList && range.depth >= 1 && range.depth - parentList.depth <= 1;\n\tconst hasWholeDocSelectedList = !!allSelectionList;\n\tif ((isInsideExistingList || hasWholeDocSelectedList) && currentList) {\n\t\tif (currentList.node.type === listType) {\n\t\t\tif (isAllSelection && hasWholeDocSelectedList) return chain().command(({ tr: trx, dispatch: disp }) => {\n\t\t\t\tconst nextSelection = createInnerSelectionForWholeDocList(trx);\n\t\t\t\tif (!nextSelection) return false;\n\t\t\t\ttrx.setSelection(nextSelection);\n\t\t\t\tif (disp) disp(trx);\n\t\t\t\treturn true;\n\t\t\t}).liftListItem(itemType).run();\n\t\t\treturn commands.liftListItem(itemType);\n\t\t}\n\t\tif (isList(currentList.node.type.name, extensions) && listType.validContent(currentList.node.content)) return chain().command(() => {\n\t\t\ttr.setNodeMarkup(currentList.pos, listType);\n\t\t\treturn true;\n\t\t}).command(() => joinListBackwards(tr, listType)).command(() => joinListForwards(tr, listType)).run();\n\t}\n\tif (!keepMarks || !marks || !dispatch) return chain().command(() => {\n\t\tif (can().wrapInList(listType, attributes)) return true;\n\t\treturn commands.clearNodes();\n\t}).wrapInList(listType, attributes).command(() => joinListBackwards(tr, listType)).command(() => joinListForwards(tr, listType)).run();\n\treturn chain().command(() => {\n\t\tconst canWrapInList = can().wrapInList(listType, attributes);\n\t\tconst filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name));\n\t\ttr.ensureMarks(filteredMarks);\n\t\tif (canWrapInList) return true;\n\t\treturn commands.clearNodes();\n\t}).wrapInList(listType, attributes).command(() => joinListBackwards(tr, listType)).command(() => joinListForwards(tr, listType)).run();\n};\n//#endregion\n//#region src/commands/toggleMark.ts\nconst toggleMark = (typeOrName, attributes = {}, options = {}) => ({ state, commands }) => {\n\tconst { extendEmptyMarkRange = false } = options;\n\tconst type = getMarkType(typeOrName, state.schema);\n\tif (isMarkActive(state, type, attributes)) return commands.unsetMark(type, { extendEmptyMarkRange });\n\treturn commands.setMark(type, attributes);\n};\n//#endregion\n//#region src/commands/toggleNode.ts\nconst toggleNode = (typeOrName, toggleTypeOrName, attributes = {}) => ({ state, commands }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\tconst toggleType = getNodeType(toggleTypeOrName, state.schema);\n\tconst isActive = isNodeActive(state, type, attributes);\n\tlet attributesToCopy;\n\tif (state.selection.$anchor.sameParent(state.selection.$head)) attributesToCopy = state.selection.$anchor.parent.attrs;\n\tif (isActive) return commands.setNode(toggleType, attributesToCopy);\n\treturn commands.setNode(type, {\n\t\t...attributesToCopy,\n\t\t...attributes\n\t});\n};\n//#endregion\n//#region src/commands/toggleWrap.ts\nconst toggleWrap = (typeOrName, attributes = {}) => ({ state, commands }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\tif (isNodeActive(state, type, attributes)) return commands.lift(type);\n\treturn commands.wrapIn(type, attributes);\n};\n//#endregion\n//#region src/commands/undoInputRule.ts\nconst undoInputRule = () => ({ state, dispatch }) => {\n\tconst plugins = state.plugins;\n\tfor (let i = 0; i < plugins.length; i += 1) {\n\t\tconst plugin = plugins[i];\n\t\tlet undoable;\n\t\tif (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n\t\t\tif (dispatch) {\n\t\t\t\tconst tr = state.tr;\n\t\t\t\tconst toUndo = undoable.transform;\n\t\t\t\tfor (let j = toUndo.steps.length - 1; j >= 0; j -= 1) tr.step(toUndo.steps[j].invert(toUndo.docs[j]));\n\t\t\t\tif (undoable.text) {\n\t\t\t\t\tconst marks = tr.doc.resolve(undoable.from).marks();\n\t\t\t\t\ttr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n\t\t\t\t} else tr.delete(undoable.from, undoable.to);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n//#endregion\n//#region src/commands/unsetAllMarks.ts\nconst unsetAllMarks = (options = {}) => ({ tr, dispatch, editor }) => {\n\tconst { ignoreClearable = false } = options;\n\tconst { selection } = tr;\n\tconst { empty, ranges } = selection;\n\tif (empty) return true;\n\tconst { nonClearableMarks } = editor.extensionManager;\n\tif (dispatch) {\n\t\tconst clearableMarkTypes = Object.values(editor.schema.marks).filter((markType) => ignoreClearable || !nonClearableMarks.includes(markType.name));\n\t\tranges.forEach((range) => {\n\t\t\tfor (const markType of clearableMarkTypes) tr.removeMark(range.$from.pos, range.$to.pos, markType);\n\t\t});\n\t}\n\treturn true;\n};\n//#endregion\n//#region src/commands/unsetMark.ts\nconst unsetMark = (typeOrName, options = {}) => ({ tr, state, dispatch }) => {\n\tconst { extendEmptyMarkRange = false } = options;\n\tconst { selection } = tr;\n\tconst type = getMarkType(typeOrName, state.schema);\n\tconst { $from, empty, ranges } = selection;\n\tif (!dispatch) return true;\n\tif (empty && extendEmptyMarkRange) {\n\t\tvar _$from$marks$find;\n\t\tlet { from, to } = selection;\n\t\tconst range = getMarkRange($from, type, (_$from$marks$find = $from.marks().find((mark) => mark.type === type)) === null || _$from$marks$find === void 0 ? void 0 : _$from$marks$find.attrs);\n\t\tif (range) {\n\t\t\tfrom = range.from;\n\t\t\tto = range.to;\n\t\t}\n\t\ttr.removeMark(from, to, type);\n\t} else ranges.forEach((range) => {\n\t\ttr.removeMark(range.$from.pos, range.$to.pos, type);\n\t});\n\ttr.removeStoredMark(type);\n\treturn true;\n};\n//#endregion\n//#region src/commands/unsetTextDirection.ts\nconst unsetTextDirection = (position) => ({ tr, state, dispatch }) => {\n\tconst { selection } = state;\n\tlet from;\n\tlet to;\n\tif (typeof position === \"number\") {\n\t\tfrom = position;\n\t\tto = position;\n\t} else if (position && \"from\" in position && \"to\" in position) {\n\t\tfrom = position.from;\n\t\tto = position.to;\n\t} else {\n\t\tfrom = selection.from;\n\t\tto = selection.to;\n\t}\n\tif (dispatch) tr.doc.nodesBetween(from, to, (node, pos) => {\n\t\tif (node.isText) return;\n\t\tconst newAttrs = { ...node.attrs };\n\t\tdelete newAttrs.dir;\n\t\ttr.setNodeMarkup(pos, void 0, newAttrs);\n\t});\n\treturn true;\n};\n//#endregion\n//#region src/commands/updateAttributes.ts\nconst updateAttributes = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n\tlet nodeType = null;\n\tlet markType = null;\n\tconst schemaType = getSchemaTypeNameByName(typeof typeOrName === \"string\" ? typeOrName : typeOrName.name, state.schema);\n\tif (!schemaType) return false;\n\tif (schemaType === \"node\") nodeType = getNodeType(typeOrName, state.schema);\n\tif (schemaType === \"mark\") markType = getMarkType(typeOrName, state.schema);\n\tlet canUpdate = false;\n\ttr.selection.ranges.forEach((range) => {\n\t\tconst from = range.$from.pos;\n\t\tconst to = range.$to.pos;\n\t\tlet lastPos;\n\t\tlet lastNode;\n\t\tlet trimmedFrom;\n\t\tlet trimmedTo;\n\t\tif (tr.selection.empty) state.doc.nodesBetween(from, to, (node, pos) => {\n\t\t\tif (nodeType && nodeType === node.type) {\n\t\t\t\tcanUpdate = true;\n\t\t\t\ttrimmedFrom = Math.max(pos, from);\n\t\t\t\ttrimmedTo = Math.min(pos + node.nodeSize, to);\n\t\t\t\tlastPos = pos;\n\t\t\t\tlastNode = node;\n\t\t\t}\n\t\t});\n\t\telse state.doc.nodesBetween(from, to, (node, pos) => {\n\t\t\tif (pos < from && nodeType && nodeType === node.type) {\n\t\t\t\tcanUpdate = true;\n\t\t\t\ttrimmedFrom = Math.max(pos, from);\n\t\t\t\ttrimmedTo = Math.min(pos + node.nodeSize, to);\n\t\t\t\tlastPos = pos;\n\t\t\t\tlastNode = node;\n\t\t\t}\n\t\t\tif (pos >= from && pos <= to) {\n\t\t\t\tif (nodeType && nodeType === node.type) {\n\t\t\t\t\tcanUpdate = true;\n\t\t\t\t\tif (dispatch) tr.setNodeMarkup(pos, void 0, {\n\t\t\t\t\t\t...node.attrs,\n\t\t\t\t\t\t...attributes\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (markType && node.marks.length) node.marks.forEach((mark) => {\n\t\t\t\t\tif (markType === mark.type) {\n\t\t\t\t\t\tcanUpdate = true;\n\t\t\t\t\t\tif (dispatch) {\n\t\t\t\t\t\t\tconst trimmedFrom2 = Math.max(pos, from);\n\t\t\t\t\t\t\tconst trimmedTo2 = Math.min(pos + node.nodeSize, to);\n\t\t\t\t\t\t\ttr.addMark(trimmedFrom2, trimmedTo2, markType.create({\n\t\t\t\t\t\t\t\t...mark.attrs,\n\t\t\t\t\t\t\t\t...attributes\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tif (lastNode) {\n\t\t\tif (lastPos !== void 0 && dispatch) tr.setNodeMarkup(lastPos, void 0, {\n\t\t\t\t...lastNode.attrs,\n\t\t\t\t...attributes\n\t\t\t});\n\t\t\tif (markType && lastNode.marks.length) lastNode.marks.forEach((mark) => {\n\t\t\t\tif (markType === mark.type && dispatch) tr.addMark(trimmedFrom, trimmedTo, markType.create({\n\t\t\t\t\t...mark.attrs,\n\t\t\t\t\t...attributes\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t});\n\treturn canUpdate;\n};\nconst DECORATION_MANAGER_PLUGIN_KEY = new PluginKey(\"__tiptap_decorations__\");\n//#endregion\n//#region src/commands/updateDecorations.ts\nconst updateDecorations = (extensionName) => ({ tr, dispatch }) => {\n\tif (dispatch) tr.setMeta(DECORATION_MANAGER_PLUGIN_KEY, {\n\t\ttype: \"force\",\n\t\tname: extensionName\n\t});\n\treturn true;\n};\n//#endregion\n//#region src/commands/wrapIn.ts\nconst wrapIn$1 = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\treturn wrapIn(type, attributes)(state, dispatch);\n};\n//#endregion\n//#region src/commands/wrapInList.ts\nconst wrapInList$1 = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n\tconst type = getNodeType(typeOrName, state.schema);\n\treturn wrapInList(type, attributes)(state, dispatch);\n};\n//#endregion\n//#region src/commands/index.ts\nvar commands_exports = /* @__PURE__ */ __exportAll({\n\tblur: () => blur,\n\tclearContent: () => clearContent,\n\tclearNodes: () => clearNodes,\n\tcommand: () => command,\n\tcreateParagraphNear: () => createParagraphNear$1,\n\tcut: () => cut,\n\tdeleteCurrentNode: () => deleteCurrentNode,\n\tdeleteNode: () => deleteNode,\n\tdeleteRange: () => deleteRange,\n\tdeleteSelection: () => deleteSelection,\n\tenter: () => enter,\n\texitCode: () => exitCode$1,\n\textendMarkRange: () => extendMarkRange,\n\tfirst: () => first,\n\tfocus: () => focus,\n\tforEach: () => forEach,\n\tinsertContent: () => insertContent,\n\tinsertContentAt: () => insertContentAt,\n\tinsertDefaultBlock: () => insertDefaultBlock,\n\tjoinBackward: () => joinBackward$1,\n\tjoinDown: () => joinDown$1,\n\tjoinForward: () => joinForward$1,\n\tjoinItemBackward: () => joinItemBackward,\n\tjoinItemForward: () => joinItemForward,\n\tjoinTextblockBackward: () => joinTextblockBackward$1,\n\tjoinTextblockForward: () => joinTextblockForward$1,\n\tjoinUp: () => joinUp$1,\n\tkeyboardShortcut: () => keyboardShortcut,\n\tlift: () => lift$1,\n\tliftEmptyBlock: () => liftEmptyBlock$1,\n\tliftListItem: () => liftListItem$1,\n\tnewlineInCode: () => newlineInCode$1,\n\tresetAttributes: () => resetAttributes,\n\tscrollIntoView: () => scrollIntoView,\n\tselectAll: () => selectAll,\n\tselectNodeBackward: () => selectNodeBackward$1,\n\tselectNodeForward: () => selectNodeForward$1,\n\tselectParentNode: () => selectParentNode$1,\n\tselectTextblockEnd: () => selectTextblockEnd$1,\n\tselectTextblockStart: () => selectTextblockStart$1,\n\tsetContent: () => setContent,\n\tsetMark: () => setMark,\n\tsetMeta: () => setMeta,\n\tsetNode: () => setNode,\n\tsetNodeSelection: () => setNodeSelection,\n\tsetTextDirection: () => setTextDirection,\n\tsetTextSelection: () => setTextSelection,\n\tsinkListItem: () => sinkListItem$1,\n\tsplitBlock: () => splitBlock,\n\tsplitListItem: () => splitListItem,\n\ttoggleList: () => toggleList,\n\ttoggleMark: () => toggleMark,\n\ttoggleNode: () => toggleNode,\n\ttoggleWrap: () => toggleWrap,\n\tundoInputRule: () => undoInputRule,\n\tunsetAllMarks: () => unsetAllMarks,\n\tunsetMark: () => unsetMark,\n\tunsetTextDirection: () => unsetTextDirection,\n\tupdateAttributes: () => updateAttributes,\n\tupdateDecorations: () => updateDecorations,\n\twrapIn: () => wrapIn$1,\n\twrapInList: () => wrapInList$1\n});\n//#endregion\n//#region src/decorations/decorationApplyScope.ts\n/**\n* Tracks which editors are running decoration create() callbacks inside state.apply,\n* using a private WeakMap to keep this off the public Editor surface.\n*/\nconst depthByEditor = /* @__PURE__ */ new WeakMap();\n/**\n* Marks callback as decoration-apply work for editor, so editor.state can warn\n* about stale reads. Counts depth to handle nested applies.\n*\n* @param editor The editor the decorations belong to\n* @param callback The work to run inside the scope\n* @returns Whatever `callback` returns\n* @example\n* runInDecorationApplyScope(editor, () => spec.create({ editor, state, view }))\n*/\nfunction runInDecorationApplyScope(editor, callback) {\n\tvar _depthByEditor$get;\n\tdepthByEditor.set(editor, ((_depthByEditor$get = depthByEditor.get(editor)) !== null && _depthByEditor$get !== void 0 ? _depthByEditor$get : 0) + 1);\n\ttry {\n\t\treturn callback();\n\t} finally {\n\t\tvar _depthByEditor$get2;\n\t\tconst remaining = ((_depthByEditor$get2 = depthByEditor.get(editor)) !== null && _depthByEditor$get2 !== void 0 ? _depthByEditor$get2 : 1) - 1;\n\t\tif (remaining > 0) depthByEditor.set(editor, remaining);\n\t\telse depthByEditor.delete(editor);\n\t}\n}\n/**\n* Whether the editor is currently inside a decoration apply scope.\n*\n* @param editor The editor to check\n* @returns `true` while decoration create() callbacks run\n* @example\n* if (isInDecorationApplyScope(editor)) {\n*   // reads of editor.state are stale here\n* }\n*/\nfunction isInDecorationApplyScope(editor) {\n\treturn depthByEditor.has(editor);\n}\n//#endregion\n//#region src/EventEmitter.ts\nvar EventEmitter = class {\n\tconstructor() {\n\t\tthis.callbacks = {};\n\t}\n\ton(event, fn) {\n\t\tif (!this.callbacks[event]) this.callbacks[event] = [];\n\t\tthis.callbacks[event].push(fn);\n\t\treturn this;\n\t}\n\temit(event, ...args) {\n\t\tconst callbacks = this.callbacks[event];\n\t\tif (callbacks) callbacks.forEach((callback) => callback.apply(this, args));\n\t\treturn this;\n\t}\n\toff(event, fn) {\n\t\tconst callbacks = this.callbacks[event];\n\t\tif (callbacks) {\n\t\t\tif (fn) this.callbacks[event] = callbacks.filter((callback) => callback !== fn);\n\t\t\telse delete this.callbacks[event];\n\t\t}\n\t\treturn this;\n\t}\n\tonce(event, fn) {\n\t\tconst onceFn = (...args) => {\n\t\t\tthis.off(event, onceFn);\n\t\t\tfn.apply(this, args);\n\t\t};\n\t\treturn this.on(event, onceFn);\n\t}\n\tremoveAllListeners() {\n\t\tthis.callbacks = {};\n\t}\n};\n//#endregion\n//#region src/utilities/isDev.ts\n/**\n* Whether the editor runs in a development build. Use it to guard warnings so\n* bundlers can drop them from production output.\n*/\nconst isDev = typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\";\n//#endregion\n//#region src/decorations/helpers/decorationsToPMDecorations.ts\nfunction isWidgetDecoration(decoration) {\n\treturn decoration.kind === \"widget\";\n}\n/**\n* Converts a list of decorations to ProseMirror decorations.\n* @param decorations The decorations to convert.\n* @param extensionName The name of the extension that created the decorations.\n* @returns The converted decorations and the widget keys.\n*/\nfunction decorationsToPMDecorations(decorations, extensionName) {\n\tconst pmDecorations = [];\n\tconst widgetKeys = /* @__PURE__ */ new Set();\n\tfor (const decoration of decorations) {\n\t\tif (decoration.kind === \"widget\") {\n\t\t\tif (isWidgetDecoration(decoration)) widgetKeys.add(decoration.key);\n\t\t}\n\t\tpmDecorations.push(decoration.toPMDecoration(extensionName));\n\t}\n\treturn {\n\t\tdecorations: pmDecorations,\n\t\twidgetKeys\n\t};\n}\n//#endregion\n//#region src/decorations/helpers/buildDecorationSet.ts\n/**\n* Builds a DecorationSet from a list of decorations.\n* @param doc The document to build the decoration set for.\n* @param decorations The decorations to build the set from.\n* @param extensionName The name of the extension that created the decorations.\n* @returns The built decoration set and the widget keys.\n*/\nfunction buildDecorationSet(doc, decorations, extensionName) {\n\tconst { decorations: pmDecorations, widgetKeys } = decorationsToPMDecorations(decorations, extensionName);\n\treturn {\n\t\tset: DecorationSet.create(doc, pmDecorations),\n\t\twidgetKeys\n\t};\n}\n//#endregion\n//#region src/decorations/helpers/rangeOwnsPosition.ts\n/**\n* Whether the block range `[from, to)` owns a decoration at `position`.\n*\n* `to` is the next block's start, so that block owns it. The last block is the\n* exception: nothing follows it, so it owns the end of the document.\n*\n* @param options The position, the range, and the document size.\n* @returns True when the range owns the position.\n* @example\n* // <p>foo</p><p>bar</p>, blocks [0, 5] and [5, 10]\n* rangeOwnsPosition({ position: 5, from: 0, to: 5, docSize: 10 }) // false, block 2 owns it\n* rangeOwnsPosition({ position: 5, from: 5, to: 10, docSize: 10 }) // true\n* rangeOwnsPosition({ position: 10, from: 5, to: 10, docSize: 10 }) // true, end of document\n*/\nfunction rangeOwnsPosition({ position, from, to, docSize }) {\n\tif (position < from) return false;\n\tif (position < to) return true;\n\treturn position === to && to === docSize;\n}\n//#endregion\n//#region src/decorations/helpers/filterOutOfRangeDecorations.ts\n/**\n* Filter decorations the block range `[from, to)` does not own.\n* Must match the stale sweep in `DecorationManager.rebuildRanges`.\n*\n* @param options The decorations, the range, and the warning bookkeeping.\n* @returns The filtered decorations.\n*/\nfunction filterOutOfRangeDecorations({ decorations, from, to, docSize, extensionName, warnedExtensions }) {\n\treturn decorations.filter((decoration) => {\n\t\tif (rangeOwnsPosition({\n\t\t\tposition: decoration.anchor,\n\t\t\tfrom,\n\t\t\tto,\n\t\t\tdocSize\n\t\t})) return true;\n\t\tif (decoration.anchor === to) return false;\n\t\tif (!warnedExtensions.has(extensionName)) {\n\t\t\twarnedExtensions.add(extensionName);\n\t\t\tconsole.warn(`[tiptap warn]: Extension \"${extensionName}\" returned a decoration outside the requested range [${from}, ${to}). It was ignored.`);\n\t\t}\n\t\treturn false;\n\t});\n}\n//#endregion\n//#region src/decorations/helpers/widgetKeyOf.ts\n/**\n* Extracts the widget key from a decoration spec.\n* @param decoration The decoration to extract the key from.\n* @returns The widget key, or undefined if the decoration has no key.\n*/\nfunction widgetKeyOf(decoration) {\n\tvar _decoration$spec;\n\tconst key = (_decoration$spec = decoration.spec) === null || _decoration$spec === void 0 ? void 0 : _decoration$spec.key;\n\treturn typeof key === \"string\" ? key : void 0;\n}\n//#endregion\n//#region src/decorations/helpers/findDuplicateWidgetKeys.ts\n/**\n* Finds widget keys which are still duplicated in the final decoration set.\n* @param decorationSet The merged decoration set to inspect.\n* @returns The duplicate keys and their producing extensions.\n*/\nfunction findDuplicateWidgetKeys(decorationSet) {\n\tconst extensionsByKey = /* @__PURE__ */ new Map();\n\tconst counts = /* @__PURE__ */ new Map();\n\tfor (const decoration of decorationSet.find()) {\n\t\tvar _extensionName, _extensionsByKey$get, _counts$get;\n\t\tconst key = widgetKeyOf(decoration);\n\t\tif (!key) continue;\n\t\tconst extension = (_extensionName = decoration.spec.extensionName) !== null && _extensionName !== void 0 ? _extensionName : \"unknown\";\n\t\tconst extensions = (_extensionsByKey$get = extensionsByKey.get(key)) !== null && _extensionsByKey$get !== void 0 ? _extensionsByKey$get : /* @__PURE__ */ new Set();\n\t\textensions.add(extension);\n\t\textensionsByKey.set(key, extensions);\n\t\tcounts.set(key, ((_counts$get = counts.get(key)) !== null && _counts$get !== void 0 ? _counts$get : 0) + 1);\n\t}\n\treturn Array.from(extensionsByKey, ([key, extensions]) => ({\n\t\tkey,\n\t\textensions\n\t})).filter(({ key }) => {\n\t\tvar _counts$get2;\n\t\treturn ((_counts$get2 = counts.get(key)) !== null && _counts$get2 !== void 0 ? _counts$get2 : 0) > 1;\n\t});\n}\n//#endregion\n//#region src/decorations/helpers/isAttrStep.ts\n/**\n* Whether a step only sets a node attribute.\n*\n* Matched by `jsonID` rather than `instanceof`, which fails when two copies of\n* prosemirror-transform are loaded.\n*\n* @param step The step to check.\n* @returns `true` for an `AttrStep`, which carries the target node's position.\n* @example\n* if (isAttrStep(step)) {\n*   rebuildBlockAt(step.pos)\n* }\n*/\nfunction isAttrStep(step) {\n\treturn step.jsonID === \"attr\";\n}\n//#endregion\n//#region src/decorations/helpers/hasResolvableChangedRange.ts\n/**\n* Check if a step has a resolvable changed range.\n* @param step The step to check.\n* @returns True if the step has a resolvable changed range, false otherwise.\n*/\nfunction hasResolvableChangedRange(step) {\n\tlet hasMappedRange = false;\n\tstep.getMap().forEach(() => {\n\t\thasMappedRange = true;\n\t});\n\tif (hasMappedRange || isAttrStep(step)) return true;\n\tconst positionalStep = step;\n\treturn typeof positionalStep.from === \"number\" && typeof positionalStep.to === \"number\";\n}\n//#endregion\n//#region src/decorations/helpers/getRebuildRanges.ts\n/**\n* Expands a changed range to the top-level blocks it touches. Blocks are\n* ordered, so the walk stops as soon as it passes the range.\n*/\nfunction blockRangeFor(doc, changed) {\n\tlet from = null;\n\tlet to = 0;\n\tlet nodeStart = 0;\n\tfor (let index = 0; index < doc.childCount; index += 1) {\n\t\tif (nodeStart > changed.to) break;\n\t\tconst nodeEnd = nodeStart + doc.child(index).nodeSize;\n\t\tif (nodeEnd >= changed.from) {\n\t\t\tif (from === null) from = nodeStart;\n\t\t\tto = nodeEnd;\n\t\t}\n\t\tnodeStart = nodeEnd;\n\t}\n\treturn from === null ? null : {\n\t\tfrom,\n\t\tto\n\t};\n}\n/**\n* Returns the top-level block ranges to recompute after a transaction,\n* or `{ type: 'full' }` when the whole document must be rebuilt.\n* @param tr The transaction to inspect.\n* @param doc The new document after the transaction.\n* @returns The block ranges to recompute, or a full-recompute signal.\n*/\nfunction getRebuildRanges(tr, doc) {\n\tif (tr.steps.some((step) => !hasResolvableChangedRange(step))) return { type: \"full\" };\n\tconst newRanges = getChangedRanges(tr).map(({ newRange }) => newRange);\n\ttr.steps.forEach((step, index) => {\n\t\tif (!isAttrStep(step)) return;\n\t\tconst mapping = tr.mapping.slice(index);\n\t\tnewRanges.push({\n\t\t\tfrom: mapping.map(step.pos, -1),\n\t\t\tto: mapping.map(step.pos + 1)\n\t\t});\n\t});\n\tconst ranges = [];\n\tfor (const newRange of newRanges) {\n\t\tconst blockRange = blockRangeFor(doc, newRange);\n\t\tif (blockRange) ranges.push(blockRange);\n\t}\n\tranges.sort((a, b) => a.from - b.from);\n\tconst merged = [];\n\tfor (const range of ranges) {\n\t\tconst last = merged[merged.length - 1];\n\t\tif (last && range.from <= last.to) last.to = Math.max(last.to, range.to);\n\t\telse merged.push({ ...range });\n\t}\n\treturn {\n\t\ttype: \"ranges\",\n\t\tranges: merged\n\t};\n}\n//#endregion\n//#region src/decorations/helpers/mapDecorationSet.ts\n/**\n* Maps a decoration set through a mapping and prunes the keys of any widget\n* dropped because its position was deleted.\n* @param set The decoration set to map.\n* @param mapping The mapping to use.\n* @param doc The document to map the set through.\n* @param widgetKeys The set of widget keys to prune.\n* @returns The mapped decoration set.\n*/\nfunction mapDecorationSet(set, mapping, doc, widgetKeys) {\n\treturn set.map(mapping, doc, { onRemove: (removedSpec) => {\n\t\tconst key = removedSpec === null || removedSpec === void 0 ? void 0 : removedSpec.key;\n\t\tif (typeof key === \"string\") widgetKeys.delete(key);\n\t} });\n}\n//#endregion\n//#region src/decorations/helpers/mapDecorations.ts\n/**\n* Moves an extension's existing decorations to their new positions after a\n* transaction, and prunes widget keys for any widget whose position was deleted.\n* @param name The name of the decoration extension.\n* @param previous The previous decoration manager state.\n* @param tr The transaction to map through.\n* @returns The updated decoration set and widget keys.\n*/\nfunction mapDecorations(name, previous, tr) {\n\tvar _previous$decorationS, _previous$widgetKeysB;\n\tconst previousSet = (_previous$decorationS = previous.decorationSetsByExtension[name]) !== null && _previous$decorationS !== void 0 ? _previous$decorationS : DecorationSet.empty;\n\tconst widgetKeys = new Set((_previous$widgetKeysB = previous.widgetKeysByExtension[name]) !== null && _previous$widgetKeysB !== void 0 ? _previous$widgetKeysB : []);\n\treturn {\n\t\tset: mapDecorationSet(previousSet, tr.mapping, tr.doc, widgetKeys),\n\t\twidgetKeys\n\t};\n}\n//#endregion\n//#region src/decorations/helpers/mergeDecorationSets.ts\n/**\n* Merges multiple decoration sets into a single decoration set.\n* @param doc The document to merge the decoration sets for.\n* @param decorationSetsByExtension The decoration sets to merge.\n* @returns The merged decoration set.\n*/\nfunction mergeDecorationSets(doc, decorationSetsByExtension) {\n\tconst allDecorations = Object.values(decorationSetsByExtension).flatMap((set) => set.find());\n\treturn DecorationSet.create(doc, allDecorations);\n}\n//#endregion\n//#region src/decorations/helpers/unionWidgetKeys.ts\n/**\n* Unions all widget keys from multiple extensions into a single set.\n* @param widgetKeysByExtension The widget keys to union.\n* @returns The unioned widget keys.\n*/\nfunction unionWidgetKeys(widgetKeysByExtension) {\n\tconst merged = /* @__PURE__ */ new Set();\n\tfor (const keys of Object.values(widgetKeysByExtension)) for (const key of keys) merged.add(key);\n\treturn merged;\n}\n//#endregion\n//#region src/decorations/helpers/validateDecorationSpec.ts\n/**\n* Validates a decoration spec to ensure it follows the correct pattern for its update strategy.\n* @param name The name of the extension.\n* @param spec The decoration spec to validate\n*/\nfunction validateDecorationSpec(name, spec) {\n\tvar _update;\n\tswitch ((_update = spec.update) !== null && _update !== void 0 ? _update : \"document\") {\n\t\tcase \"document\":\n\t\t\tif (spec.createInRange) throw new Error(`[tiptap error]: Extension \"${name}\" provides createInRange() but does not use the \"changedRanges\" decoration update strategy.`);\n\t\t\treturn;\n\t\tcase \"changedRanges\":\n\t\t\tif (!spec.createInRange) throw new Error(`[tiptap error]: Extension \"${name}\" uses the \"changedRanges\" decoration update strategy but does not provide createInRange().`);\n\t\t\treturn;\n\t\tcase \"manual\":\n\t\t\tif (spec.createInRange) throw new Error(`[tiptap error]: Extension \"${name}\" uses the \"manual\" decoration update strategy, which is not compatible with createInRange(). createInRange() requires the \"changedRanges\" strategy.`);\n\t\t\tif (spec.shouldUpdate) throw new Error(`[tiptap error]: Extension \"${name}\" cannot combine the \"manual\" decoration update strategy with shouldUpdate().`);\n\t\t\treturn;\n\t\tdefault: throw new Error(`[tiptap error]: Extension \"${name}\" uses an unknown decoration update strategy. Expected \"document\", \"changedRanges\", or \"manual\".`);\n\t}\n}\n//#endregion\n//#region src/decorations/helpers/shouldRecomputeDecoration.ts\n/**\n* Decides whether a decoration spec should be recomputed for a transaction.\n* @param spec The decoration spec to check.\n* @param props Properties containing editor, transaction, and state.\n* @param forced Whether recomputation was forced.\n* @returns `true` if the decoration should be recomputed.\n*/\nfunction shouldRecomputeDecoration(spec, props, forced) {\n\tif (forced) return true;\n\tif (spec.update === \"manual\") return false;\n\treturn spec.shouldUpdate ? spec.shouldUpdate(props) : props.tr.docChanged;\n}\n//#endregion\n//#region src/decorations/DecorationManager.ts\nconst EMPTY_KEYS = /* @__PURE__ */ new Set();\nfunction liveWidgetKeys(editor) {\n\tvar _editor$extensionMana, _editor$extensionMana2;\n\treturn (_editor$extensionMana = (_editor$extensionMana2 = editor.extensionManager) === null || _editor$extensionMana2 === void 0 || (_editor$extensionMana2 = _editor$extensionMana2.decorationManager) === null || _editor$extensionMana2 === void 0 ? void 0 : _editor$extensionMana2.liveWidgetKeys()) !== null && _editor$extensionMana !== void 0 ? _editor$extensionMana : EMPTY_KEYS;\n}\nvar DecorationManager = class {\n\tconstructor(options) {\n\t\tthis.warnedWidgetKeys = /* @__PURE__ */ new Set();\n\t\tthis.warnedOutOfRangeExtensions = /* @__PURE__ */ new Set();\n\t\tthis.handleBeforeTransaction = ({ nextState }) => {\n\t\t\tconst state = DECORATION_MANAGER_PLUGIN_KEY.getState(nextState);\n\t\t\tif (state) this.warnDuplicateWidgetKeys(state);\n\t\t};\n\t\tthis.editor = options.editor;\n\t\tthis.entries = this.resolveEntries(options.entries);\n\t\tthis.entries.forEach(({ name, spec }) => validateDecorationSpec(name, spec));\n\t\tthis.plugin = this.entries.length > 0 ? this.createPlugin() : null;\n\t\tthis.editor.on(\"beforeTransaction\", this.handleBeforeTransaction);\n\t}\n\tdestroy() {\n\t\tthis.editor.off(\"beforeTransaction\", this.handleBeforeTransaction);\n\t}\n\t/**\n\t* Returns the set of live widget keys from all decoration extensions.\n\t* @returns A readonly set of widget keys\n\t*/\n\tliveWidgetKeys() {\n\t\tvar _DECORATION_MANAGER_P, _DECORATION_MANAGER_P2;\n\t\treturn (_DECORATION_MANAGER_P = (_DECORATION_MANAGER_P2 = DECORATION_MANAGER_PLUGIN_KEY.getState(this.editor.state)) === null || _DECORATION_MANAGER_P2 === void 0 ? void 0 : _DECORATION_MANAGER_P2.widgetKeys) !== null && _DECORATION_MANAGER_P !== void 0 ? _DECORATION_MANAGER_P : EMPTY_KEYS;\n\t}\n\t/**\n\t* The mounted editor view, or `null` when destroyed. Decoration callbacks\n\t* must never receive the placeholder view `editor.view` falls back to.\n\t* @returns The mounted editor view, or `null`\n\t*/\n\tget mountedView() {\n\t\treturn this.editor.isDestroyed ? null : this.editor.view;\n\t}\n\t/**\n\t* Resolves decoration entries by calling the addDecorations function for each extension entry.\n\t* @param entries The decoration manager entries to resolve\n\t* @returns An array of resolved decoration entries\n\t*/\n\tresolveEntries(entries) {\n\t\tconst resolved = [];\n\t\tfor (const { name, addDecorations } of entries) {\n\t\t\tconst spec = addDecorations();\n\t\t\tif (spec) resolved.push({\n\t\t\t\tname,\n\t\t\t\tspec\n\t\t\t});\n\t\t}\n\t\treturn resolved;\n\t}\n\t/**\n\t* Creates the ProseMirror plugin for managing decorations.\n\t* @returns A ProseMirror plugin with state management\n\t*/\n\tcreatePlugin() {\n\t\tconst { editor, entries } = this;\n\t\treturn new Plugin({\n\t\t\tkey: DECORATION_MANAGER_PLUGIN_KEY,\n\t\t\tstate: {\n\t\t\t\tinit: (_config, state) => {\n\t\t\t\t\tconst decorationSetsByExtension = {};\n\t\t\t\t\tconst widgetKeysByExtension = {};\n\t\t\t\t\tfor (const { name, spec } of entries) {\n\t\t\t\t\t\tconst { set, widgetKeys } = this.buildFullSet(name, spec, state);\n\t\t\t\t\t\tdecorationSetsByExtension[name] = set;\n\t\t\t\t\t\twidgetKeysByExtension[name] = widgetKeys;\n\t\t\t\t\t}\n\t\t\t\t\tconst managerState = {\n\t\t\t\t\t\tdecorationSetsByExtension,\n\t\t\t\t\t\twidgetKeysByExtension,\n\t\t\t\t\t\tmergedDecorationSet: this.buildMergedSet(state.doc, decorationSetsByExtension),\n\t\t\t\t\t\twidgetKeys: unionWidgetKeys(widgetKeysByExtension)\n\t\t\t\t\t};\n\t\t\t\t\tthis.warnDuplicateWidgetKeys(managerState);\n\t\t\t\t\treturn managerState;\n\t\t\t\t},\n\t\t\t\tapply: (tr, previous, oldState, newState) => {\n\t\t\t\t\tconst meta = tr.getMeta(DECORATION_MANAGER_PLUGIN_KEY);\n\t\t\t\t\tconst forceAll = (meta === null || meta === void 0 ? void 0 : meta.type) === \"force\" && !meta.name;\n\t\t\t\t\tconst forceName = (meta === null || meta === void 0 ? void 0 : meta.type) === \"force\" ? meta.name : void 0;\n\t\t\t\t\tconst decorationSetsByExtension = {};\n\t\t\t\t\tconst widgetKeysByExtension = {};\n\t\t\t\t\tconst recomputedNames = /* @__PURE__ */ new Set();\n\t\t\t\t\trunInDecorationApplyScope(editor, () => {\n\t\t\t\t\t\tfor (const { name, spec } of entries) {\n\t\t\t\t\t\t\tconst forced = forceAll || forceName === name;\n\t\t\t\t\t\t\tif (!shouldRecomputeDecoration(spec, {\n\t\t\t\t\t\t\t\teditor,\n\t\t\t\t\t\t\t\ttr,\n\t\t\t\t\t\t\t\toldState,\n\t\t\t\t\t\t\t\tnewState\n\t\t\t\t\t\t\t}, forced)) {\n\t\t\t\t\t\t\t\tconst result = mapDecorations(name, previous, tr);\n\t\t\t\t\t\t\t\tdecorationSetsByExtension[name] = result.set;\n\t\t\t\t\t\t\t\twidgetKeysByExtension[name] = result.widgetKeys;\n\t\t\t\t\t\t\t} else if (spec.update === \"changedRanges\" && tr.docChanged && !forced) {\n\t\t\t\t\t\t\t\tconst result = this.applyChangedRangesRecompute(name, spec, previous, tr, newState);\n\t\t\t\t\t\t\t\tdecorationSetsByExtension[name] = result.set;\n\t\t\t\t\t\t\t\twidgetKeysByExtension[name] = result.widgetKeys;\n\t\t\t\t\t\t\t\trecomputedNames.add(name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst { set, widgetKeys } = this.buildFullSet(name, spec, newState);\n\t\t\t\t\t\t\t\tdecorationSetsByExtension[name] = set;\n\t\t\t\t\t\t\t\twidgetKeysByExtension[name] = widgetKeys;\n\t\t\t\t\t\t\t\trecomputedNames.add(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (recomputedNames.size === 0 && !tr.docChanged) return previous;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdecorationSetsByExtension,\n\t\t\t\t\t\twidgetKeysByExtension,\n\t\t\t\t\t\tmergedDecorationSet: this.mergeAfterApply({\n\t\t\t\t\t\t\tentries,\n\t\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t\ttr,\n\t\t\t\t\t\t\tdecorationSetsByExtension,\n\t\t\t\t\t\t\trecomputedNames\n\t\t\t\t\t\t}),\n\t\t\t\t\t\twidgetKeys: unionWidgetKeys(widgetKeysByExtension)\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\tprops: { decorations(state) {\n\t\t\t\tvar _DECORATION_MANAGER_P3, _DECORATION_MANAGER_P4;\n\t\t\t\treturn (_DECORATION_MANAGER_P3 = (_DECORATION_MANAGER_P4 = DECORATION_MANAGER_PLUGIN_KEY.getState(state)) === null || _DECORATION_MANAGER_P4 === void 0 ? void 0 : _DECORATION_MANAGER_P4.mergedDecorationSet) !== null && _DECORATION_MANAGER_P3 !== void 0 ? _DECORATION_MANAGER_P3 : DecorationSet.empty;\n\t\t\t} }\n\t\t});\n\t}\n\t/**\n\t* Applies changed ranges recomputation to a decoration set, dropping stale decorations and rebuilding only the touched blocks.\n\t* @param name The name of the decoration extension\n\t* @param spec The decoration spec\n\t* @param previous The previous decoration manager state\n\t* @param tr The transaction to apply\n\t* @param newState The new editor state\n\t* @returns The updated decoration set and widget keys\n\t*/\n\tapplyChangedRangesRecompute(name, spec, previous, tr, newState) {\n\t\tconst resolution = getRebuildRanges(tr, newState.doc);\n\t\tif (resolution.type === \"full\") return this.buildFullSet(name, spec, newState);\n\t\treturn this.rebuildRanges(name, spec, previous, tr, newState, resolution.ranges);\n\t}\n\t/**\n\t* Rebuilds decorations for the changed block ranges: maps the previous set\n\t* forward, then for each range removes stale decorations, calls\n\t* `createInRange`, and adds the new ones while syncing widget keys.\n\t* @param name The extension name.\n\t* @param spec The decoration spec.\n\t* @param previous The previous decoration manager state.\n\t* @param tr The transaction to apply.\n\t* @param newState The new editor state.\n\t* @param ranges The block ranges to rebuild.\n\t* @returns The updated decoration set and widget keys.\n\t*/\n\trebuildRanges(name, spec, previous, tr, newState, ranges) {\n\t\tvar _previous$decorationS, _previous$widgetKeysB;\n\t\tconst previousSet = (_previous$decorationS = previous.decorationSetsByExtension[name]) !== null && _previous$decorationS !== void 0 ? _previous$decorationS : DecorationSet.empty;\n\t\tconst widgetKeys = new Set((_previous$widgetKeysB = previous.widgetKeysByExtension[name]) !== null && _previous$widgetKeysB !== void 0 ? _previous$widgetKeysB : []);\n\t\tlet set = mapDecorationSet(previousSet, tr.mapping, tr.doc, widgetKeys);\n\t\tconst docSize = newState.doc.content.size;\n\t\tfor (const { from, to } of ranges) {\n\t\t\tconst stale = set.find(from, to).filter((decoration) => rangeOwnsPosition({\n\t\t\t\tposition: decoration.from,\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\tdocSize\n\t\t\t}));\n\t\t\tfor (const decoration of stale) {\n\t\t\t\tconst key = widgetKeyOf(decoration);\n\t\t\t\tif (key) widgetKeys.delete(key);\n\t\t\t}\n\t\t\tset = set.remove(stale);\n\t\t\tconst { decorations: pmDecorations, widgetKeys: addedKeys } = decorationsToPMDecorations(filterOutOfRangeDecorations({\n\t\t\t\tdecorations: this.runCreate(name, \"createInRange\", () => spec.createInRange({\n\t\t\t\t\teditor: this.editor,\n\t\t\t\t\tstate: newState,\n\t\t\t\t\tview: this.mountedView,\n\t\t\t\t\tfrom,\n\t\t\t\t\tto\n\t\t\t\t})),\n\t\t\t\tfrom,\n\t\t\t\tto,\n\t\t\t\tdocSize,\n\t\t\t\textensionName: name,\n\t\t\t\twarnedExtensions: this.warnedOutOfRangeExtensions\n\t\t\t}), name);\n\t\t\tset = set.add(newState.doc, pmDecorations);\n\t\t\tfor (const key of addedKeys) widgetKeys.add(key);\n\t\t}\n\t\treturn {\n\t\t\tset,\n\t\t\twidgetKeys\n\t\t};\n\t}\n\t/**\n\t* Builds a full decoration set for the entire document.\n\t* @param name The name of the decoration extension\n\t* @param spec The decoration spec\n\t* @param state The editor state\n\t* @returns The decoration set and widget keys\n\t*/\n\tbuildFullSet(name, spec, state) {\n\t\tconst decorations = this.runCreate(name, \"create\", () => spec.create({\n\t\t\teditor: this.editor,\n\t\t\tstate,\n\t\t\tview: this.mountedView\n\t\t}));\n\t\treturn buildDecorationSet(state.doc, decorations, name);\n\t}\n\t/**\n\t* Runs a decoration callback and swallows anything it throws. These run inside\n\t* `state.apply`, where an uncaught error would abort the whole transaction.\n\t* @param name The extension name.\n\t* @param method The callback name, used in the error message.\n\t* @param create The callback to run.\n\t* @returns The decorations, or an empty array if the callback threw.\n\t*/\n\trunCreate(name, method, create) {\n\t\ttry {\n\t\t\treturn create();\n\t\t} catch (error) {\n\t\t\tconsole.error(`[tiptap error]: Extension \"${name}\" threw in \\`addDecorations().${method}()\\`. Its decorations were dropped for this update.`, error);\n\t\t\treturn [];\n\t\t}\n\t}\n\twarnDuplicateWidgetKeys(state) {\n\t\tif (!isDev) return;\n\t\tif (state.widgetKeys.size === 0) {\n\t\t\tthis.warnedWidgetKeys.clear();\n\t\t\treturn;\n\t\t}\n\t\tconst duplicateKeys = findDuplicateWidgetKeys(state.mergedDecorationSet);\n\t\tconst nextWarningKeys = new Set(duplicateKeys.map(({ key }) => key));\n\t\tfor (const { key, extensions } of duplicateKeys) {\n\t\t\tif (this.warnedWidgetKeys.has(key)) continue;\n\t\t\tconst names = Array.from(extensions).map((name) => `\"${name}\"`).join(\", \");\n\t\t\tconsole.warn(`[tiptap warn]: Duplicate widget decoration key \"${key}\" in extension${extensions.size === 1 ? \"\" : \"s\"} ${names}. Widget decoration keys must be globally unique, otherwise ProseMirror misplaces the widget DOM. Use a stable, unique key (e.g. \\`comment-\\${id}\\`).`);\n\t\t}\n\t\tthis.warnedWidgetKeys = nextWarningKeys;\n\t}\n\t/**\n\t* Builds the merged DecorationSet during init. Skips the merge for a\n\t* single extension since its per-extension set is already correct.\n\t* @param doc The document to build the merged set for.\n\t* @param decorationSetsByExtension The per-extension decoration sets.\n\t* @returns The merged decoration set.\n\t*/\n\tbuildMergedSet(doc, decorationSetsByExtension) {\n\t\tconst names = Object.keys(decorationSetsByExtension);\n\t\tif (names.length === 1) return decorationSetsByExtension[names[0]];\n\t\treturn mergeDecorationSets(doc, decorationSetsByExtension);\n\t}\n\t/**\n\t* Computes the merged DecorationSet after apply. Single extension skips the\n\t* merge; nothing recomputed maps the previous merged set forward; otherwise\n\t* the merge is rebuilt from the per-extension sets.\n\t*/\n\tmergeAfterApply({ entries, previous, tr, decorationSetsByExtension, recomputedNames }) {\n\t\tif (entries.length === 1) return decorationSetsByExtension[entries[0].name];\n\t\tif (recomputedNames.size === 0) return previous.mergedDecorationSet.map(tr.mapping, tr.doc);\n\t\treturn mergeDecorationSets(tr.doc, decorationSetsByExtension);\n\t}\n};\n//#endregion\n//#region src/utilities/attrsEqual.ts\n/**\n* Compare two attribute objects for equality.\n* Handles null/undefined and asserts key presence in both objects so that\n* `{ foo: undefined }` and `{ bar: undefined }` are not treated as equal.\n*/\nfunction attrsEqual(a, b) {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\tconst keysA = Object.keys(a);\n\tconst keysB = Object.keys(b);\n\tif (keysA.length !== keysB.length) return false;\n\treturn keysA.every((key) => Object.prototype.hasOwnProperty.call(b, key) && Object.is(a[key], b[key]));\n}\n//#endregion\n//#region src/utilities/canInsertNode.ts\nfunction canInsertNode(state, nodeType) {\n\tconst { selection } = state;\n\tconst { $from } = selection;\n\tif (selection instanceof NodeSelection) {\n\t\tconst index = $from.index();\n\t\treturn $from.parent.canReplaceWith(index, index + 1, nodeType);\n\t}\n\tlet depth = $from.depth;\n\twhile (depth >= 0) {\n\t\tconst index = $from.index(depth);\n\t\tif ($from.node(depth).contentMatchAt(index).matchType(nodeType)) return true;\n\t\tdepth -= 1;\n\t}\n\treturn false;\n}\n//#endregion\n//#region src/utilities/createStyleTag.ts\nfunction createStyleTag(style, nonce, suffix) {\n\tconst tiptapStyleTag = document.querySelector(`style[data-tiptap-style${suffix ? `-${suffix}` : \"\"}]`);\n\tif (tiptapStyleTag !== null) return tiptapStyleTag;\n\tconst styleNode = document.createElement(\"style\");\n\tif (nonce) styleNode.setAttribute(\"nonce\", nonce);\n\tstyleNode.setAttribute(`data-tiptap-style${suffix ? `-${suffix}` : \"\"}`, \"\");\n\tstyleNode.innerHTML = style;\n\tdocument.getElementsByTagName(\"head\")[0].appendChild(styleNode);\n\treturn styleNode;\n}\n//#endregion\n//#region src/utilities/escapeForRegEx.ts\nfunction escapeForRegEx(string) {\n\treturn string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n//#endregion\n//#region src/utilities/getStyleProperty.ts\n/**\n* Read a CSS property value directly from an element's raw inline `style`\n* attribute, bypassing the CSSOM (e.g. `element.style.fontFamily`) which\n* canonicalizes values and can change formatting. The original format is\n* preserved (quotes, hex vs rgb, etc.).\n*\n* When a property is declared more than once, the last declaration wins —\n* this matches CSS cascade order and is useful when nested spans are merged\n* and the child's value should take priority.\n*\n* Property name comparison is case-insensitive.\n*\n* @param element - The element whose `style` attribute should be read.\n* @param propertyName - The CSS property name (e.g. `font-family`).\n* @returns The raw value string, or `null` if the property is not present.\n*\n* @example\n* ```ts\n* parseHTML: element => getStyleProperty(element, 'font-family')\n* ```\n*/\nfunction getStyleProperty(element, propertyName) {\n\tconst styleAttr = element.getAttribute(\"style\");\n\tif (!styleAttr) return null;\n\tconst decls = styleAttr.split(\";\").map((decl) => decl.trim()).filter(Boolean);\n\tconst target = propertyName.toLowerCase();\n\tfor (let i = decls.length - 1; i >= 0; i -= 1) {\n\t\tconst decl = decls[i];\n\t\tconst colonIndex = decl.indexOf(\":\");\n\t\tif (colonIndex === -1) continue;\n\t\tif (decl.slice(0, colonIndex).trim().toLowerCase() === target) return decl.slice(colonIndex + 1).trim();\n\t}\n\treturn null;\n}\n//#endregion\n//#region src/utilities/htmlEntities.ts\n/**\n* Decode common HTML entities in text content so they display as literal\n* characters inside the editor.  The decode order matters: `&amp;` must be\n* decoded **last** so that doubly-encoded sequences like `&amp;lt;` first\n* survive the `&lt;` pass and then correctly become `&lt;` (not `<`).\n*/\nfunction decodeHtmlEntities(text) {\n\treturn text.replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\").replace(/&quot;/g, \"\\\"\").replace(/&amp;/g, \"&\");\n}\n/**\n* Encode HTML special characters so they roundtrip safely through markdown.\n* `&` is encoded **first** to avoid double-encoding the ampersand in other\n* entities (e.g. `<` → `&lt;`, not `&amp;lt;`).\n*\n* Note: `\"` is intentionally NOT encoded here because double quotes are\n* ordinary characters in markdown and do not need escaping.  The decode\n* function still handles `&quot;` because the markdown tokenizer may emit it.\n*/\nfunction encodeHtmlEntities(text) {\n\treturn text.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n//#endregion\n//#region src/utilities/isFirefox.ts\n/**\n* Detects if the current browser is Firefox.\n* @returns `true` if the browser is Firefox, `false` otherwise.\n* @example\n* if (isFirefox()) {\n*   // Firefox-specific handling\n* }\n*/\nfunction isFirefox() {\n\treturn typeof navigator !== \"undefined\" ? /Firefox/.test(navigator.userAgent) : false;\n}\n//#endregion\n//#region src/utilities/isNumber.ts\nfunction isNumber(value) {\n\treturn typeof value === \"number\";\n}\n//#endregion\n//#region src/utilities/isPlainObject.ts\nfunction getType(value) {\n\treturn Object.prototype.toString.call(value).slice(8, -1);\n}\nfunction isPlainObject(value) {\n\tif (getType(value) !== \"Object\") return false;\n\treturn value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype;\n}\n//#endregion\n//#region src/utilities/isString.ts\nfunction isString(value) {\n\treturn typeof value === \"string\";\n}\n//#endregion\n//#region src/utilities/markdown/tokenizeAttributes.ts\nfunction isWhitespace(character) {\n\treturn /\\s/.test(character);\n}\nfunction isAsciiLetter(character) {\n\treturn /^[a-zA-Z]$/.test(character);\n}\nfunction isWordCharacter(character) {\n\treturn /^\\w$/.test(character);\n}\nfunction skipWhitespace(input, index) {\n\twhile (index < input.length && isWhitespace(input[index])) index += 1;\n\treturn index;\n}\nfunction skipToWhitespace(input, index) {\n\twhile (index < input.length && !isWhitespace(input[index])) index += 1;\n\treturn index;\n}\nfunction readName(input, index, allowHyphen) {\n\twhile (index < input.length && (isWordCharacter(input[index]) || allowHyphen && input[index] === \"-\")) index += 1;\n\treturn index;\n}\nfunction readShorthand(input, index) {\n\tconst prefix = input[index];\n\tconst nameStart = index + 1;\n\tconst nameEnd = readName(input, nameStart, true);\n\tif (nameEnd === nameStart) return { nextIndex: skipToWhitespace(input, nameEnd) };\n\treturn {\n\t\ttoken: {\n\t\t\ttype: prefix === \".\" ? \"class\" : \"id\",\n\t\t\tname: input.slice(nameStart, nameEnd)\n\t\t},\n\t\tnextIndex: skipToWhitespace(input, nameEnd)\n\t};\n}\nfunction readQuotedSegment(input, index) {\n\tconst closingQuote = input.indexOf(input[index], index + 1);\n\treturn { nextIndex: skipToWhitespace(input, closingQuote === -1 ? index : closingQuote + 1) };\n}\nfunction readKeyValue(input, name, index, allowWhitespace) {\n\tlet valueStart = allowWhitespace ? skipWhitespace(input, index) : index;\n\tif (input[valueStart] !== \"=\") return;\n\tvalueStart = allowWhitespace ? skipWhitespace(input, valueStart + 1) : valueStart + 1;\n\tconst quote = input[valueStart];\n\tif (quote !== \"\\\"\" && quote !== \"'\") return;\n\tconst valueEnd = input.indexOf(quote, valueStart + 1);\n\tif (valueEnd === -1) return;\n\treturn {\n\t\ttoken: {\n\t\t\ttype: \"keyValue\",\n\t\t\tname,\n\t\t\tvalue: input.slice(valueStart + 1, valueEnd)\n\t\t},\n\t\tnextIndex: skipToWhitespace(input, valueEnd + 1)\n\t};\n}\nfunction readNamedAttribute(input, index, syntax) {\n\tconst isPandoc = syntax === \"pandoc\";\n\tconst nameEnd = readName(input, index + 1, isPandoc);\n\tconst name = input.slice(index, nameEnd);\n\tconst keyValue = readKeyValue(input, name, nameEnd, isPandoc);\n\tif (keyValue) return keyValue;\n\tconst isStandalone = nameEnd === input.length || isWhitespace(input[nameEnd]);\n\treturn {\n\t\ttoken: isPandoc && isStandalone ? {\n\t\t\ttype: \"boolean\",\n\t\t\tname\n\t\t} : void 0,\n\t\tnextIndex: syntax === \"shortcode\" ? skipToWhitespace(input, nameEnd) : nameEnd\n\t};\n}\nfunction readAttribute(input, index, syntax) {\n\tconst prefix = input[index];\n\tif (syntax === \"pandoc\" && (prefix === \".\" || prefix === \"#\")) return readShorthand(input, index);\n\tif (prefix === \"\\\"\" || prefix === \"'\") return readQuotedSegment(input, index);\n\tif (syntax === \"pandoc\" ? isAsciiLetter(prefix) : isWordCharacter(prefix)) return readNamedAttribute(input, index, syntax);\n\treturn { nextIndex: skipToWhitespace(input, index) };\n}\nfunction tokenizeAttributes(input, syntax) {\n\tconst tokens = [];\n\tlet index = 0;\n\twhile (index < input.length) {\n\t\tindex = skipWhitespace(input, index);\n\t\tif (index >= input.length) break;\n\t\tconst result = readAttribute(input, index, syntax);\n\t\tif (result.token) tokens.push(result.token);\n\t\tindex = result.nextIndex;\n\t}\n\treturn tokens;\n}\n//#endregion\n//#region src/utilities/markdown/parseAttributes.ts\nfunction applyTokens(tokens) {\n\tconst attributes = {};\n\tconst classes = tokens.filter((token) => token.type === \"class\").map((token) => token.name);\n\tconst id = tokens.find((token) => token.type === \"id\");\n\tif (classes.length > 0) attributes.class = classes.join(\" \");\n\tif (id) attributes.id = id.name;\n\ttokens.forEach((token) => {\n\t\tif (token.type === \"keyValue\") attributes[token.name] = token.value;\n\t});\n\ttokens.forEach((token) => {\n\t\tif (token.type === \"boolean\") attributes[token.name] = true;\n\t});\n\treturn attributes;\n}\n/**\n* Parses a Pandoc-style attribute string into an object.\n*\n* @param attrString - The attribute string to parse\n* @returns Parsed attributes object\n*\n* @example\n* ```ts\n* parseAttributes('.btn #submit disabled type=\"button\"')\n* // { class: 'btn', id: 'submit', disabled: true, type: 'button' }\n* ```\n*/\nfunction parseAttributes(attrString) {\n\tif (!(attrString === null || attrString === void 0 ? void 0 : attrString.trim())) return {};\n\treturn applyTokens(tokenizeAttributes(attrString, \"pandoc\"));\n}\n//#endregion\n//#region src/utilities/markdown/serializeAttributes.ts\n/**\n* Serializes an attributes object to a Pandoc-style attribute string.\n*\n* @param attributes - The attributes object to serialize\n* @returns Serialized attribute string\n*\n* @example\n* ```ts\n* serializeAttributes({ class: 'btn primary', id: 'submit', disabled: true, type: 'button' })\n* // '.btn .primary #submit disabled type=\"button\"'\n* ```\n*/\nfunction serializeAttributes(attributes) {\n\tif (!attributes || Object.keys(attributes).length === 0) return \"\";\n\tconst parts = [];\n\tif (attributes.class) String(attributes.class).split(/\\s+/).filter(Boolean).forEach((className) => parts.push(`.${className}`));\n\tif (attributes.id) parts.push(`#${attributes.id}`);\n\tObject.entries(attributes).forEach(([key, value]) => {\n\t\tif (key === \"class\" || key === \"id\") return;\n\t\tif (value === true) parts.push(key);\n\t\telse if (value !== false && value != null) parts.push(`${key}=\"${String(value)}\"`);\n\t});\n\treturn parts.join(\" \");\n}\n//#endregion\n//#region src/utilities/markdown/createAtomBlockMarkdownSpec.ts\n/**\n* Creates a complete markdown spec for atomic block nodes using Pandoc syntax.\n*\n* The generated spec handles:\n* - Parsing self-closing blocks with `:::blockName {attributes}`\n* - Extracting and parsing attributes\n* - Validating required attributes\n* - Rendering blocks back to markdown\n*\n* @param options - Configuration for the atomic block markdown spec\n* @returns Complete markdown specification object\n*\n* @example\n* ```ts\n* const youtubeSpec = createAtomBlockMarkdownSpec({\n*   nodeName: 'youtube',\n*   requiredAttributes: ['src'],\n*   defaultAttributes: { start: 0 },\n*   allowedAttributes: ['src', 'start', 'width', 'height'] // Only these get rendered to markdown\n* })\n*\n* // Usage in extension:\n* export const Youtube = Node.create({\n*   // ... other config\n*   markdown: youtubeSpec\n* })\n* ```\n*/\nfunction createAtomBlockMarkdownSpec(options) {\n\tconst { nodeName, name: markdownName, parseAttributes: parseAttributes$2 = parseAttributes, serializeAttributes: serializeAttributes$2 = serializeAttributes, defaultAttributes = {}, requiredAttributes = [], allowedAttributes } = options;\n\tconst blockName = markdownName || nodeName;\n\tconst filterAttributes = (attrs) => {\n\t\tif (!allowedAttributes) return attrs;\n\t\tconst filtered = {};\n\t\tallowedAttributes.forEach((key) => {\n\t\t\tif (key in attrs) filtered[key] = attrs[key];\n\t\t});\n\t\treturn filtered;\n\t};\n\treturn {\n\t\tparseMarkdown: (token, h) => {\n\t\t\tconst attrs = {\n\t\t\t\t...defaultAttributes,\n\t\t\t\t...token.attributes\n\t\t\t};\n\t\t\treturn h.createNode(nodeName, attrs, []);\n\t\t},\n\t\tmarkdownTokenizer: {\n\t\t\tname: nodeName,\n\t\t\tlevel: \"block\",\n\t\t\tstart(src) {\n\t\t\t\tvar _src$match;\n\t\t\t\tconst regex = new RegExp(`^:::${blockName}(?:\\\\s|$)`, \"m\");\n\t\t\t\tconst index = (_src$match = src.match(regex)) === null || _src$match === void 0 ? void 0 : _src$match.index;\n\t\t\t\treturn index !== void 0 ? index : -1;\n\t\t\t},\n\t\t\ttokenize(src, _tokens, _lexer) {\n\t\t\t\tconst regex = new RegExp(`^:::${blockName}(?:\\\\s+\\\\{([^}]*)\\\\})?\\\\s*:::(?:\\\\n|$)`);\n\t\t\t\tconst match = src.match(regex);\n\t\t\t\tif (!match) return;\n\t\t\t\tconst attrString = match[1] || \"\";\n\t\t\t\tconst attributes = parseAttributes$2(attrString);\n\t\t\t\tif (requiredAttributes.find((required) => !(required in attributes))) return;\n\t\t\t\treturn {\n\t\t\t\t\ttype: nodeName,\n\t\t\t\t\traw: match[0],\n\t\t\t\t\tattributes\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\trenderMarkdown: (node) => {\n\t\t\tconst filteredAttrs = filterAttributes(node.attrs || {});\n\t\t\tconst attrs = serializeAttributes$2(filteredAttrs);\n\t\t\tconst attrString = attrs ? ` {${attrs}}` : \"\";\n\t\t\treturn `:::${blockName}${attrString} :::`;\n\t\t}\n\t};\n}\n//#endregion\n//#region src/utilities/markdown/createBlockMarkdownSpec.ts\n/**\n* Creates a complete markdown spec for block-level nodes using Pandoc syntax.\n*\n* The generated spec handles:\n* - Parsing blocks with `:::blockName {attributes}` syntax\n* - Extracting and parsing attributes\n* - Rendering blocks back to markdown with proper formatting\n* - Nested content support\n*\n* @param options - Configuration for the block markdown spec\n* @returns Complete markdown specification object\n*\n* @example\n* ```ts\n* const calloutSpec = createBlockMarkdownSpec({\n*   nodeName: 'callout',\n*   defaultAttributes: { type: 'info' },\n*   allowedAttributes: ['type', 'title'] // Only these get rendered to markdown\n* })\n*\n* // Usage in extension:\n* export const Callout = Node.create({\n*   // ... other config\n*   markdown: calloutSpec\n* })\n* ```\n*/\nfunction createBlockMarkdownSpec(options) {\n\tconst { nodeName, name: markdownName, getContent, parseAttributes: parseAttributes$1 = parseAttributes, serializeAttributes: serializeAttributes$1 = serializeAttributes, defaultAttributes = {}, content = \"block\", allowedAttributes } = options;\n\tconst blockName = markdownName || nodeName;\n\tconst filterAttributes = (attrs) => {\n\t\tif (!allowedAttributes) return attrs;\n\t\tconst filtered = {};\n\t\tallowedAttributes.forEach((key) => {\n\t\t\tif (key in attrs) filtered[key] = attrs[key];\n\t\t});\n\t\treturn filtered;\n\t};\n\treturn {\n\t\tparseMarkdown: (token, h) => {\n\t\t\tlet nodeContent;\n\t\t\tif (getContent) {\n\t\t\t\tconst contentResult = getContent(token);\n\t\t\t\tnodeContent = typeof contentResult === \"string\" ? [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: contentResult\n\t\t\t\t}] : contentResult;\n\t\t\t} else if (content === \"block\") nodeContent = h.parseChildren(token.tokens || []);\n\t\t\telse nodeContent = h.parseInline(token.tokens || []);\n\t\t\tconst attrs = {\n\t\t\t\t...defaultAttributes,\n\t\t\t\t...token.attributes\n\t\t\t};\n\t\t\treturn h.createNode(nodeName, attrs, nodeContent);\n\t\t},\n\t\tmarkdownTokenizer: {\n\t\t\tname: nodeName,\n\t\t\tlevel: \"block\",\n\t\t\tstart(src) {\n\t\t\t\tvar _src$match;\n\t\t\t\tconst regex = new RegExp(`^:::${blockName}`, \"m\");\n\t\t\t\tconst index = (_src$match = src.match(regex)) === null || _src$match === void 0 ? void 0 : _src$match.index;\n\t\t\t\treturn index !== void 0 ? index : -1;\n\t\t\t},\n\t\t\ttokenize(src, _tokens, lexer) {\n\t\t\t\tconst openingRegex = new RegExp(`^:::${blockName}(?:\\\\s+\\\\{([^}]*)\\\\})?\\\\s*\\\\n`);\n\t\t\t\tconst openingMatch = src.match(openingRegex);\n\t\t\t\tif (!openingMatch) return;\n\t\t\t\tconst [openingTag, attrString = \"\"] = openingMatch;\n\t\t\t\tconst attributes = parseAttributes$1(attrString);\n\t\t\t\tlet level = 1;\n\t\t\t\tconst position = openingTag.length;\n\t\t\t\tlet matchedContent = \"\";\n\t\t\t\tconst blockPattern = /^:::([\\w-]*)(\\s.*)?/gm;\n\t\t\t\tconst remaining = src.slice(position);\n\t\t\t\tblockPattern.lastIndex = 0;\n\t\t\t\tfor (;;) {\n\t\t\t\t\tvar _match$;\n\t\t\t\t\tconst match = blockPattern.exec(remaining);\n\t\t\t\t\tif (match === null) break;\n\t\t\t\t\tconst matchPos = match.index;\n\t\t\t\t\tconst blockType = match[1];\n\t\t\t\t\tif ((_match$ = match[2]) === null || _match$ === void 0 ? void 0 : _match$.endsWith(\":::\")) continue;\n\t\t\t\t\tif (blockType) level += 1;\n\t\t\t\t\telse {\n\t\t\t\t\t\tlevel -= 1;\n\t\t\t\t\t\tif (level === 0) {\n\t\t\t\t\t\t\tconst rawContent = remaining.slice(0, matchPos);\n\t\t\t\t\t\t\tmatchedContent = rawContent.trim();\n\t\t\t\t\t\t\tconst fullMatch = src.slice(0, position + matchPos + match[0].length);\n\t\t\t\t\t\t\tlet contentTokens = [];\n\t\t\t\t\t\t\tif (matchedContent) {\n\t\t\t\t\t\t\t\tif (content === \"block\") {\n\t\t\t\t\t\t\t\t\tcontentTokens = lexer.blockTokens(rawContent);\n\t\t\t\t\t\t\t\t\tcontentTokens.forEach((token) => {\n\t\t\t\t\t\t\t\t\t\tif (token.text && (!token.tokens || token.tokens.length === 0)) token.tokens = lexer.inlineTokens(token.text);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\twhile (contentTokens.length > 0) {\n\t\t\t\t\t\t\t\t\t\tconst lastToken = contentTokens[contentTokens.length - 1];\n\t\t\t\t\t\t\t\t\t\tif (lastToken.type === \"paragraph\" && (!lastToken.text || lastToken.text.trim() === \"\")) contentTokens.pop();\n\t\t\t\t\t\t\t\t\t\telse break;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else contentTokens = lexer.inlineTokens(matchedContent);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttype: nodeName,\n\t\t\t\t\t\t\t\traw: fullMatch,\n\t\t\t\t\t\t\t\tattributes,\n\t\t\t\t\t\t\t\tcontent: matchedContent,\n\t\t\t\t\t\t\t\ttokens: contentTokens\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\trenderMarkdown: (node, h) => {\n\t\t\tconst filteredAttrs = filterAttributes(node.attrs || {});\n\t\t\tconst attrs = serializeAttributes$1(filteredAttrs);\n\t\t\tconst attrString = attrs ? ` {${attrs}}` : \"\";\n\t\t\tconst renderedContent = h.renderChildren(node.content || [], \"\\n\\n\");\n\t\t\treturn `:::${blockName}${attrString}\\n\\n${renderedContent}\\n\\n:::`;\n\t\t}\n\t};\n}\n//#endregion\n//#region src/utilities/markdown/parseShortcodeAttributes.ts\nfunction parseShortcodeAttributes(attrString) {\n\tconst attributes = {};\n\ttokenizeAttributes(attrString, \"shortcode\").forEach((token) => {\n\t\tif (token.type === \"keyValue\") attributes[token.name] = token.value;\n\t});\n\treturn attributes;\n}\n//#endregion\n//#region src/utilities/markdown/createInlineMarkdownSpec.ts\n/**\n* Serialize attributes back to shortcode format\n* Always quotes all values with double quotes\n*/\nfunction serializeShortcodeAttributes(attrs) {\n\treturn Object.entries(attrs).filter(([, value]) => value !== void 0 && value !== null).map(([key, value]) => `${key}=\"${value}\"`).join(\" \");\n}\n/**\n* Creates a complete markdown spec for inline nodes using attribute syntax.\n*\n* The generated spec handles:\n* - Parsing shortcode syntax with `[nodeName attributes]content[/nodeName]` format\n* - Self-closing shortcodes like `[emoji name=party_popper]`\n* - Extracting and parsing attributes from the opening tag\n* - Rendering inline elements back to shortcode markdown\n* - Supporting both content-based and self-closing inline elements\n*\n* @param options - Configuration for the inline markdown spec\n* @returns Complete markdown specification object\n*\n* @example\n* ```ts\n* // Self-closing mention: [mention id=\"madonna\" label=\"Madonna\"]\n* const mentionSpec = createInlineMarkdownSpec({\n*   nodeName: 'mention',\n*   selfClosing: true,\n*   defaultAttributes: { type: 'user' },\n*   allowedAttributes: ['id', 'label'] // Only these get rendered to markdown\n* })\n*\n* // Self-closing emoji: [emoji name=\"party_popper\"]\n* const emojiSpec = createInlineMarkdownSpec({\n*   nodeName: 'emoji',\n*   selfClosing: true,\n*   allowedAttributes: ['name']\n* })\n*\n* // With content: [highlight color=\"yellow\"]text[/highlight]\n* const highlightSpec = createInlineMarkdownSpec({\n*   nodeName: 'highlight',\n*   selfClosing: false,\n*   allowedAttributes: ['color', 'style']\n* })\n*\n* // Usage in extension:\n* export const Mention = Node.create({\n*   name: 'mention', // Must match nodeName\n*   // ... other config\n*   markdown: mentionSpec\n* })\n* ```\n*/\nfunction createInlineMarkdownSpec(options) {\n\tconst { nodeName, name: shortcodeName, getContent, parseAttributes = parseShortcodeAttributes, serializeAttributes = serializeShortcodeAttributes, defaultAttributes = {}, selfClosing = false, allowedAttributes } = options;\n\tconst shortcode = shortcodeName || nodeName;\n\tconst filterAttributes = (attrs) => {\n\t\tif (!allowedAttributes) return attrs;\n\t\tconst filtered = {};\n\t\tallowedAttributes.forEach((attr) => {\n\t\t\tconst attrName = typeof attr === \"string\" ? attr : attr.name;\n\t\t\tconst skipIfDefault = typeof attr === \"string\" ? void 0 : attr.skipIfDefault;\n\t\t\tif (attrName in attrs) {\n\t\t\t\tconst value = attrs[attrName];\n\t\t\t\tif (skipIfDefault !== void 0 && value === skipIfDefault) return;\n\t\t\t\tfiltered[attrName] = value;\n\t\t\t}\n\t\t});\n\t\treturn filtered;\n\t};\n\tconst escapedShortcode = shortcode.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\treturn {\n\t\tparseMarkdown: (token, h) => {\n\t\t\tconst attrs = {\n\t\t\t\t...defaultAttributes,\n\t\t\t\t...token.attributes\n\t\t\t};\n\t\t\tif (selfClosing) return h.createNode(nodeName, attrs);\n\t\t\tconst content = getContent ? getContent(token) : token.content || \"\";\n\t\t\tif (content) return h.createNode(nodeName, attrs, [h.createTextNode(content)]);\n\t\t\treturn h.createNode(nodeName, attrs, []);\n\t\t},\n\t\tmarkdownTokenizer: {\n\t\t\tname: nodeName,\n\t\t\tlevel: \"inline\",\n\t\t\tstart(src) {\n\t\t\t\tconst startPattern = selfClosing ? new RegExp(`\\\\[${escapedShortcode}\\\\s*[^\\\\]]*\\\\]`) : new RegExp(`\\\\[${escapedShortcode}\\\\s*[^\\\\]]*\\\\][\\\\s\\\\S]*?\\\\[\\\\/${escapedShortcode}\\\\]`);\n\t\t\t\tconst match = src.match(startPattern);\n\t\t\t\tconst index = match === null || match === void 0 ? void 0 : match.index;\n\t\t\t\treturn index !== void 0 ? index : -1;\n\t\t\t},\n\t\t\ttokenize(src, _tokens, _lexer) {\n\t\t\t\tconst tokenPattern = selfClosing ? new RegExp(`^\\\\[${escapedShortcode}\\\\s*([^\\\\]]*)\\\\]`) : new RegExp(`^\\\\[${escapedShortcode}\\\\s*([^\\\\]]*)\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/${escapedShortcode}\\\\]`);\n\t\t\t\tconst match = src.match(tokenPattern);\n\t\t\t\tif (!match) return;\n\t\t\t\tlet content = \"\";\n\t\t\t\tlet attrString = \"\";\n\t\t\t\tif (selfClosing) {\n\t\t\t\t\tconst [, attrs] = match;\n\t\t\t\t\tattrString = attrs;\n\t\t\t\t} else {\n\t\t\t\t\tconst [, attrs, contentMatch] = match;\n\t\t\t\t\tattrString = attrs;\n\t\t\t\t\tcontent = contentMatch || \"\";\n\t\t\t\t}\n\t\t\t\tconst attributes = parseAttributes(attrString.trim());\n\t\t\t\treturn {\n\t\t\t\t\ttype: nodeName,\n\t\t\t\t\traw: match[0],\n\t\t\t\t\tcontent: content.trim(),\n\t\t\t\t\tattributes\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\trenderMarkdown: (node) => {\n\t\t\tlet content = \"\";\n\t\t\tif (getContent) content = getContent(node);\n\t\t\telse if (node.content && node.content.length > 0) content = node.content.filter((child) => child.type === \"text\").map((child) => child.text).join(\"\");\n\t\t\tconst filteredAttrs = filterAttributes(node.attrs || {});\n\t\t\tconst attrs = serializeAttributes(filteredAttrs);\n\t\t\tconst attrString = attrs ? ` ${attrs}` : \"\";\n\t\t\tif (selfClosing) return `[${shortcode}${attrString}]`;\n\t\t\treturn `[${shortcode}${attrString}]${content}[/${shortcode}]`;\n\t\t}\n\t};\n}\n//#endregion\n//#region src/utilities/markdown/parseIndentedBlocks.ts\n/**\n* Parses markdown text into hierarchical indented blocks with proper nesting.\n*\n* This utility handles:\n* - Line-by-line parsing with pattern matching\n* - Hierarchical nesting based on indentation levels\n* - Nested content collection and parsing\n* - Empty line handling\n* - Content dedenting for nested blocks\n*\n* The key difference from flat parsing is that this maintains the hierarchical\n* structure where nested items become `nestedTokens` of their parent items,\n* rather than being flattened into a single array.\n*\n* @param src - The markdown source text to parse\n* @param config - Configuration object defining how to parse and create tokens\n* @param lexer - Markdown lexer for parsing nested content\n* @returns Parsed result with hierarchical items, or undefined if no matches\n*\n* @example\n* ```ts\n* const result = parseIndentedBlocks(src, {\n*   itemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n*   extractItemData: (match) => ({\n*     indentLevel: match[1].length,\n*     mainContent: match[4],\n*     checked: match[3].toLowerCase() === 'x'\n*   }),\n*   createToken: (data, nestedTokens) => ({\n*     type: 'taskItem',\n*     checked: data.checked,\n*     text: data.mainContent,\n*     nestedTokens\n*   })\n* }, lexer)\n* ```\n*/\nfunction parseIndentedBlocks(src, config, lexer) {\n\tconst lines = src.split(\"\\n\");\n\tconst items = [];\n\tlet totalRaw = \"\";\n\tlet i = 0;\n\tconst baseIndentSize = config.baseIndentSize || 2;\n\twhile (i < lines.length) {\n\t\tconst currentLine = lines[i];\n\t\tconst itemMatch = currentLine.match(config.itemPattern);\n\t\tif (!itemMatch) {\n\t\t\tif (items.length > 0) break;\n\t\t\telse if (currentLine.trim() === \"\") {\n\t\t\t\ti += 1;\n\t\t\t\ttotalRaw = `${totalRaw}${currentLine}\\n`;\n\t\t\t\tcontinue;\n\t\t\t} else return;\n\t\t}\n\t\tconst itemData = config.extractItemData(itemMatch);\n\t\tconst { indentLevel, mainContent } = itemData;\n\t\ttotalRaw = `${totalRaw}${currentLine}\\n`;\n\t\tconst itemContent = [mainContent];\n\t\ti += 1;\n\t\twhile (i < lines.length) {\n\t\t\tvar _nextLine$match;\n\t\t\tconst nextLine = lines[i];\n\t\t\tif (nextLine.trim() === \"\") {\n\t\t\t\tvar _nextNonEmpty$match;\n\t\t\t\tconst nextNonEmptyIndex = lines.slice(i + 1).findIndex((l) => l.trim() !== \"\");\n\t\t\t\tif (nextNonEmptyIndex === -1) break;\n\t\t\t\tif ((((_nextNonEmpty$match = lines[i + 1 + nextNonEmptyIndex].match(/^(\\s*)/)) === null || _nextNonEmpty$match === void 0 || (_nextNonEmpty$match = _nextNonEmpty$match[1]) === null || _nextNonEmpty$match === void 0 ? void 0 : _nextNonEmpty$match.length) || 0) > indentLevel) {\n\t\t\t\t\titemContent.push(nextLine);\n\t\t\t\t\ttotalRaw = `${totalRaw}${nextLine}\\n`;\n\t\t\t\t\ti += 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else break;\n\t\t\t}\n\t\t\tif ((((_nextLine$match = nextLine.match(/^(\\s*)/)) === null || _nextLine$match === void 0 || (_nextLine$match = _nextLine$match[1]) === null || _nextLine$match === void 0 ? void 0 : _nextLine$match.length) || 0) > indentLevel) {\n\t\t\t\titemContent.push(nextLine);\n\t\t\t\ttotalRaw = `${totalRaw}${nextLine}\\n`;\n\t\t\t\ti += 1;\n\t\t\t} else break;\n\t\t}\n\t\tlet nestedTokens;\n\t\tconst nestedContent = itemContent.slice(1);\n\t\tif (nestedContent.length > 0) {\n\t\t\tconst dedentedNested = nestedContent.map((nestedLine) => nestedLine.slice(indentLevel + baseIndentSize)).join(\"\\n\");\n\t\t\tif (dedentedNested.trim()) {\n\t\t\t\tif (config.customNestedParser) nestedTokens = config.customNestedParser(dedentedNested);\n\t\t\t\telse nestedTokens = lexer.blockTokens(dedentedNested);\n\t\t\t}\n\t\t}\n\t\tconst token = config.createToken(itemData, nestedTokens);\n\t\titems.push(token);\n\t}\n\tif (items.length === 0) return;\n\treturn {\n\t\titems,\n\t\traw: totalRaw\n\t};\n}\n//#endregion\n//#region src/utilities/markdown/renderNestedMarkdownContent.ts\n/**\n* @fileoverview Utility functions for rendering nested content in markdown.\n*\n* This module provides reusable utilities for extensions that need to render\n* content with a prefix on the main line and properly indented nested content.\n*/\n/**\n* Utility function for rendering content with a main line prefix and nested indented content.\n*\n* This function handles the common pattern of rendering content with:\n* 1. A main line with a prefix (like \"- \" for lists, \"> \" for blockquotes, etc.)\n* 2. Nested content that gets indented properly\n*\n* @param node - The ProseMirror node representing the content\n* @param h - The markdown renderer helper\n* @param prefixOrGenerator - Either a string prefix or a function that generates the prefix from context\n* @param ctx - Optional context object (used when prefixOrGenerator is a function)\n* @returns The rendered markdown string\n*\n* @example\n* ```ts\n* // For a bullet list item with static prefix\n* return renderNestedMarkdownContent(node, h, '- ')\n*\n* // For a task item with static prefix\n* const prefix = `- [${node.attrs?.checked ? 'x' : ' '}] `\n* return renderNestedMarkdownContent(node, h, prefix)\n*\n* // For a blockquote with static prefix\n* return renderNestedMarkdownContent(node, h, '> ')\n*\n* // For content with dynamic prefix based on context\n* return renderNestedMarkdownContent(node, h, ctx => {\n*   if (ctx.parentType === 'orderedList') {\n*     return `${ctx.index + 1}. `\n*   }\n*   return '- '\n* }, ctx)\n*\n* // Custom extension example\n* const CustomContainer = Node.create({\n*   name: 'customContainer',\n*   // ... other config\n*   markdown: {\n*     render: (node, h) => {\n*       const type = node.attrs?.type || 'info'\n*       return renderNestedMarkdownContent(node, h, `[${type}] `)\n*     }\n*   }\n* })\n* ```\n*/\nfunction renderNestedMarkdownContent(node, h, prefixOrGenerator, ctx) {\n\tif (!node || !Array.isArray(node.content)) return \"\";\n\tconst prefix = typeof prefixOrGenerator === \"function\" ? prefixOrGenerator(ctx) : prefixOrGenerator;\n\tconst [content, ...children] = node.content;\n\tlet output = `${prefix}${h.renderChildren([content])}`;\n\tif (children && children.length > 0) children.forEach((child, index) => {\n\t\tvar _h$renderChild, _h$renderChild2;\n\t\tconst childContent = (_h$renderChild = (_h$renderChild2 = h.renderChild) === null || _h$renderChild2 === void 0 ? void 0 : _h$renderChild2.call(h, child, index + 1)) !== null && _h$renderChild !== void 0 ? _h$renderChild : h.renderChildren([child]);\n\t\tif (childContent !== void 0 && childContent !== null) {\n\t\t\tconst indentedChild = childContent.split(\"\\n\").map((line) => line ? h.indent(line) : h.indent(\"\")).join(\"\\n\");\n\t\t\toutput += child.type === \"paragraph\" ? `\\n\\n${indentedChild}` : `\\n${indentedChild}`;\n\t\t}\n\t});\n\treturn output;\n}\n//#endregion\n//#region src/utilities/markdown/index.ts\nvar markdown_exports = /* @__PURE__ */ __exportAll({\n\tcreateAtomBlockMarkdownSpec: () => createAtomBlockMarkdownSpec,\n\tcreateBlockMarkdownSpec: () => createBlockMarkdownSpec,\n\tcreateInlineMarkdownSpec: () => createInlineMarkdownSpec,\n\tparseAttributes: () => parseAttributes,\n\tparseIndentedBlocks: () => parseIndentedBlocks,\n\trenderNestedMarkdownContent: () => renderNestedMarkdownContent,\n\tserializeAttributes: () => serializeAttributes\n});\n//#endregion\n//#region src/utilities/marksEqual.ts\nfunction markTypeName(mark) {\n\treturn typeof mark.type === \"string\" ? mark.type : mark.type.name;\n}\n/**\n* Compare two arrays of mark objects for equality (order-insensitive).\n* Marks are matched by type name and attributes (via attrsEqual),\n* so key ordering in attrs does not matter, nor does mark array order.\n*/\nfunction marksEqual(a, b) {\n\tif (a.length !== b.length) return false;\n\tconst consumed = Array.from({ length: b.length }, () => false);\n\treturn a.every((markA) => {\n\t\tconst nameA = markTypeName(markA);\n\t\tconst idx = b.findIndex((markB, i) => !consumed[i] && nameA === markTypeName(markB) && attrsEqual(markA.attrs, markB.attrs));\n\t\tif (idx === -1) return false;\n\t\tconsumed[idx] = true;\n\t\treturn true;\n\t});\n}\n//#endregion\n//#region src/utilities/mergeDeep.ts\nfunction mergeDeep(target, source) {\n\tconst output = { ...target };\n\tif (isPlainObject(target) && isPlainObject(source)) Object.keys(source).forEach((key) => {\n\t\tif (isPlainObject(source[key]) && isPlainObject(target[key])) output[key] = mergeDeep(target[key], source[key]);\n\t\telse output[key] = source[key];\n\t});\n\treturn output;\n}\n//#endregion\n//#region src/MarkView.ts\nfunction updateMarkViewAttributes(checkMark, editor, attrs = {}) {\n\tconst { state } = editor;\n\tconst { doc, tr } = state;\n\tconst thisMark = checkMark;\n\tdoc.descendants((node, pos) => {\n\t\tconst from = tr.mapping.map(pos);\n\t\tconst to = tr.mapping.map(pos) + node.nodeSize;\n\t\tlet foundMark = null;\n\t\tnode.marks.forEach((mark) => {\n\t\t\tif (mark !== thisMark) return false;\n\t\t\tfoundMark = mark;\n\t\t});\n\t\tif (!foundMark) return;\n\t\tlet needsUpdate = false;\n\t\tObject.keys(attrs).forEach((k) => {\n\t\t\tif (attrs[k] !== foundMark.attrs[k]) needsUpdate = true;\n\t\t});\n\t\tif (needsUpdate) {\n\t\t\tconst updatedMark = checkMark.type.create({\n\t\t\t\t...checkMark.attrs,\n\t\t\t\t...attrs\n\t\t\t});\n\t\t\ttr.removeMark(from, to, checkMark.type);\n\t\t\ttr.addMark(from, to, updatedMark);\n\t\t}\n\t});\n\tif (tr.docChanged) editor.view.dispatch(tr);\n}\nvar MarkView = class {\n\tconstructor(component, props, options) {\n\t\tthis.component = component;\n\t\tthis.editor = props.editor;\n\t\tthis.options = { ...options };\n\t\tthis.mark = props.mark;\n\t\tthis.HTMLAttributes = props.HTMLAttributes;\n\t}\n\tget dom() {\n\t\treturn this.editor.view.dom;\n\t}\n\tget contentDOM() {\n\t\treturn null;\n\t}\n\t/**\n\t* Update the attributes of the mark in the document.\n\t* @param attrs The attributes to update.\n\t*/\n\tupdateAttributes(attrs, checkMark) {\n\t\tupdateMarkViewAttributes(checkMark || this.mark, this.editor, attrs);\n\t}\n\tignoreMutation(mutation) {\n\t\tif (!this.dom || !this.contentDOM) return true;\n\t\tif (typeof this.options.ignoreMutation === \"function\") return this.options.ignoreMutation({ mutation });\n\t\tif (mutation.type === \"selection\") return false;\n\t\tif (this.dom.contains(mutation.target) && mutation.type === \"childList\" && (isiOS() || isAndroid()) && this.editor.isFocused) {\n\t\t\tif ([...Array.from(mutation.addedNodes), ...Array.from(mutation.removedNodes)].every((node) => node.isContentEditable)) return false;\n\t\t}\n\t\tif (this.contentDOM === mutation.target && mutation.type === \"attributes\") return true;\n\t\tif (this.contentDOM.contains(mutation.target)) return false;\n\t\treturn true;\n\t}\n};\n//#endregion\n//#region src/InputRule.ts\nvar InputRule = class {\n\tconstructor(config) {\n\t\tvar _config$undoable;\n\t\tthis.find = config.find;\n\t\tthis.handler = config.handler;\n\t\tthis.undoable = (_config$undoable = config.undoable) !== null && _config$undoable !== void 0 ? _config$undoable : true;\n\t}\n};\nconst inputRuleMatcherHandler = (text, find) => {\n\tif (isRegExp(find)) return find.exec(text);\n\tconst inputRuleMatch = find(text);\n\tif (!inputRuleMatch) return null;\n\tconst result = [inputRuleMatch.text];\n\tresult.index = inputRuleMatch.index;\n\tresult.input = text;\n\tresult.data = inputRuleMatch.data;\n\tif (inputRuleMatch.replaceWith) {\n\t\tif (!inputRuleMatch.text.includes(inputRuleMatch.replaceWith)) console.warn(\"[tiptap warn]: \\\"inputRuleMatch.replaceWith\\\" must be part of \\\"inputRuleMatch.text\\\".\");\n\t\tresult.push(inputRuleMatch.replaceWith);\n\t}\n\treturn result;\n};\nfunction run$1(config) {\n\tvar _ref;\n\tconst { editor, from, to, text, rules, plugin } = config;\n\tconst { view } = editor;\n\tif (view.composing) return false;\n\tconst $from = view.state.doc.resolve(from);\n\tif ($from.parent.type.spec.code || !!((_ref = $from.nodeBefore || $from.nodeAfter) === null || _ref === void 0 ? void 0 : _ref.marks.find((mark) => mark.type.spec.code))) return false;\n\tlet matched = false;\n\tconst textBefore = getTextContentFromNodes($from) + text;\n\trules.forEach((rule) => {\n\t\tif (matched) return;\n\t\tconst match = inputRuleMatcherHandler(textBefore, rule.find);\n\t\tif (!match) return;\n\t\tconst matchedDocLength = match[0].length - text.length;\n\t\tif (matchedDocLength > 0) {\n\t\t\tconst matchStartOffset = $from.parentOffset - matchedDocLength;\n\t\t\tif (matchStartOffset < 0 || $from.parent.textBetween(matchStartOffset, $from.parentOffset) !== match[0].slice(0, matchedDocLength)) return;\n\t\t}\n\t\tconst tr = view.state.tr;\n\t\tconst state = createChainableState({\n\t\t\tstate: view.state,\n\t\t\ttransaction: tr\n\t\t});\n\t\tconst range = {\n\t\t\tfrom: from - (match[0].length - text.length),\n\t\t\tto\n\t\t};\n\t\tconst { commands, chain, can } = new CommandManager({\n\t\t\teditor,\n\t\t\tstate\n\t\t});\n\t\tif (rule.handler({\n\t\t\tstate,\n\t\t\trange,\n\t\t\tmatch,\n\t\t\tcommands,\n\t\t\tchain,\n\t\t\tcan\n\t\t}) === null || !tr.steps.length) return;\n\t\tif (rule.undoable) tr.setMeta(plugin, {\n\t\t\ttransform: tr,\n\t\t\tfrom,\n\t\t\tto,\n\t\t\ttext\n\t\t});\n\t\tview.dispatch(tr);\n\t\tmatched = true;\n\t});\n\treturn matched;\n}\n/**\n* Create an input rules plugin. When enabled, it will cause text\n* input that matches any of the given rules to trigger the rule’s\n* action.\n*/\nfunction inputRulesPlugin(props) {\n\tconst { editor, rules } = props;\n\tconst plugin = new Plugin({\n\t\tstate: {\n\t\t\tinit() {\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\tapply(tr, prev, state) {\n\t\t\t\tconst stored = tr.getMeta(plugin);\n\t\t\t\tif (stored) return stored;\n\t\t\t\tconst simulatedInputMeta = tr.getMeta(\"applyInputRules\");\n\t\t\t\tif (!!simulatedInputMeta) setTimeout(() => {\n\t\t\t\t\tlet { text } = simulatedInputMeta;\n\t\t\t\t\tif (typeof text === \"string\") text = text;\n\t\t\t\t\telse text = getHTMLFromFragment(Fragment$1.from(text), state.schema);\n\t\t\t\t\tconst { from } = simulatedInputMeta;\n\t\t\t\t\tconst to = from + text.length;\n\t\t\t\t\trun$1({\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tto,\n\t\t\t\t\t\ttext,\n\t\t\t\t\t\trules,\n\t\t\t\t\t\tplugin\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn tr.selectionSet || tr.docChanged ? null : prev;\n\t\t\t}\n\t\t},\n\t\tprops: {\n\t\t\thandleTextInput(view, from, to, text) {\n\t\t\t\treturn run$1({\n\t\t\t\t\teditor,\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t\ttext,\n\t\t\t\t\trules,\n\t\t\t\t\tplugin\n\t\t\t\t});\n\t\t\t},\n\t\t\thandleDOMEvents: { compositionend: (view) => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst { $cursor } = view.state.selection;\n\t\t\t\t\tif ($cursor) run$1({\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tfrom: $cursor.pos,\n\t\t\t\t\t\tto: $cursor.pos,\n\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\trules,\n\t\t\t\t\t\tplugin\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t} },\n\t\t\thandleKeyDown(view, event) {\n\t\t\t\tif (event.key !== \"Enter\") return false;\n\t\t\t\tconst { $cursor } = view.state.selection;\n\t\t\t\tif ($cursor) return run$1({\n\t\t\t\t\teditor,\n\t\t\t\t\tfrom: $cursor.pos,\n\t\t\t\t\tto: $cursor.pos,\n\t\t\t\t\ttext: \"\\n\",\n\t\t\t\t\trules,\n\t\t\t\t\tplugin\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tisInputRules: true\n\t});\n\treturn plugin;\n}\n//#endregion\n//#region src/Extendable.ts\nvar Extendable = class {\n\tconstructor(config = {}) {\n\t\tthis.type = \"extendable\";\n\t\tthis.parent = null;\n\t\tthis.child = null;\n\t\tthis.name = \"\";\n\t\tthis.config = { name: this.name };\n\t\tthis.config = {\n\t\t\t...this.config,\n\t\t\t...config\n\t\t};\n\t\tthis.name = this.config.name;\n\t}\n\tget options() {\n\t\treturn { ...callOrReturn(getExtensionField(this, \"addOptions\", { name: this.name })) };\n\t}\n\tget storage() {\n\t\treturn { ...callOrReturn(getExtensionField(this, \"addStorage\", {\n\t\t\tname: this.name,\n\t\t\toptions: this.options\n\t\t})) };\n\t}\n\tconfigure(options = {}) {\n\t\tconst extension = this.extend({\n\t\t\t...this.config,\n\t\t\taddOptions: () => {\n\t\t\t\treturn mergeDeep(this.options, options);\n\t\t\t}\n\t\t});\n\t\textension.name = this.name;\n\t\textension.parent = this.parent;\n\t\tthis.child = null;\n\t\treturn extension;\n\t}\n\textend(extendedConfig = {}) {\n\t\tconst extension = new this.constructor({\n\t\t\t...this.config,\n\t\t\t...extendedConfig\n\t\t});\n\t\textension.parent = this;\n\t\tthis.child = extension;\n\t\textension.name = \"name\" in extendedConfig ? extendedConfig.name : extension.parent.name;\n\t\treturn extension;\n\t}\n};\n//#endregion\n//#region src/Mark.ts\n/**\n* The Mark class is used to create custom mark extensions.\n* @see https://tiptap.dev/api/extensions#create-a-new-extension\n*/\nvar Mark = class Mark extends Extendable {\n\tconstructor(..._args) {\n\t\tsuper(..._args);\n\t\tthis.type = \"mark\";\n\t}\n\t/**\n\t* Create a new Mark instance\n\t* @param config - Mark configuration object or a function that returns a configuration object\n\t*/\n\tstatic create(config = {}) {\n\t\tconst resolvedConfig = typeof config === \"function\" ? config() : config;\n\t\treturn new Mark(resolvedConfig);\n\t}\n\tstatic handleExit({ editor, mark }) {\n\t\tconst { tr } = editor.state;\n\t\tconst currentPos = editor.state.selection.$from;\n\t\tif (currentPos.pos === currentPos.end()) {\n\t\t\tconst currentMarks = currentPos.marks();\n\t\t\tif (!!!currentMarks.find((m) => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name)) return false;\n\t\t\tconst removeMark = currentMarks.find((m) => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name);\n\t\t\tif (removeMark) tr.removeStoredMark(removeMark);\n\t\t\ttr.insertText(\" \", currentPos.pos);\n\t\t\teditor.view.dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tconfigure(options) {\n\t\treturn super.configure(options);\n\t}\n\textend(extendedConfig) {\n\t\tconst resolvedConfig = typeof extendedConfig === \"function\" ? extendedConfig() : extendedConfig;\n\t\treturn super.extend(resolvedConfig);\n\t}\n};\n//#endregion\n//#region src/PasteRule.ts\n/**\n* Paste rules are used to react to pasted content.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#paste-rules\n*/\nvar PasteRule = class {\n\tconstructor(config) {\n\t\tthis.find = config.find;\n\t\tthis.handler = config.handler;\n\t}\n};\nconst pasteRuleMatcherHandler = (text, find, event) => {\n\tif (isRegExp(find)) return [...text.matchAll(find)];\n\tconst matches = find(text, event);\n\tif (!matches) return [];\n\treturn matches.map((pasteRuleMatch) => {\n\t\tconst result = [pasteRuleMatch.text];\n\t\tresult.index = pasteRuleMatch.index;\n\t\tresult.input = text;\n\t\tresult.data = pasteRuleMatch.data;\n\t\tif (pasteRuleMatch.replaceWith) {\n\t\t\tif (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) console.warn(\"[tiptap warn]: \\\"pasteRuleMatch.replaceWith\\\" must be part of \\\"pasteRuleMatch.text\\\".\");\n\t\t\tresult.push(pasteRuleMatch.replaceWith);\n\t\t}\n\t\treturn result;\n\t});\n};\nfunction run(config) {\n\tconst { editor, state, from, to, rule, pasteEvent, dropEvent } = config;\n\tconst { commands, chain, can } = new CommandManager({\n\t\teditor,\n\t\tstate\n\t});\n\tconst handlers = [];\n\tstate.doc.nodesBetween(from, to, (node, pos) => {\n\t\tvar _node$type, _ref, _node$content$size, _node$content;\n\t\tif (((_node$type = node.type) === null || _node$type === void 0 || (_node$type = _node$type.spec) === null || _node$type === void 0 ? void 0 : _node$type.code) || !(node.isText || node.isTextblock || node.isInline)) return;\n\t\tconst contentSize = (_ref = (_node$content$size = (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.size) !== null && _node$content$size !== void 0 ? _node$content$size : node.nodeSize) !== null && _ref !== void 0 ? _ref : 0;\n\t\tconst resolvedFrom = Math.max(from, pos);\n\t\tconst resolvedTo = Math.min(to, pos + contentSize);\n\t\tif (resolvedFrom >= resolvedTo) return;\n\t\tconst textToMatch = node.isText ? node.text || \"\" : node.textBetween(resolvedFrom - pos, resolvedTo - pos, void 0, \"￼\");\n\t\tpasteRuleMatcherHandler(textToMatch, rule.find, pasteEvent).forEach((match) => {\n\t\t\tif (match.index === void 0) return;\n\t\t\tconst start = resolvedFrom + match.index + 1;\n\t\t\tconst end = start + match[0].length;\n\t\t\tconst range = {\n\t\t\t\tfrom: state.tr.mapping.map(start),\n\t\t\t\tto: state.tr.mapping.map(end)\n\t\t\t};\n\t\t\tconst handler = rule.handler({\n\t\t\t\tstate,\n\t\t\t\trange,\n\t\t\t\tmatch,\n\t\t\t\tcommands,\n\t\t\t\tchain,\n\t\t\t\tcan,\n\t\t\t\tpasteEvent,\n\t\t\t\tdropEvent\n\t\t\t});\n\t\t\thandlers.push(handler);\n\t\t});\n\t});\n\treturn handlers.every((handler) => handler !== null);\n}\nlet tiptapDragFromOtherEditor = null;\nconst createClipboardPasteEvent = (text) => {\n\tvar _event$clipboardData;\n\tconst event = new ClipboardEvent(\"paste\", { clipboardData: new DataTransfer() });\n\t(_event$clipboardData = event.clipboardData) === null || _event$clipboardData === void 0 || _event$clipboardData.setData(\"text/html\", text);\n\treturn event;\n};\n/**\n* Create an paste rules plugin. When enabled, it will cause pasted\n* text that matches any of the given rules to trigger the rule’s\n* action.\n*/\nfunction pasteRulesPlugin(props) {\n\tconst { editor, rules } = props;\n\tlet dragSourceElement = null;\n\tlet isPastedFromProseMirror = false;\n\tlet isDroppedFromProseMirror = false;\n\tlet pasteEvent = typeof ClipboardEvent !== \"undefined\" ? new ClipboardEvent(\"paste\") : null;\n\tlet dropEvent;\n\ttry {\n\t\tdropEvent = typeof DragEvent !== \"undefined\" ? new DragEvent(\"drop\") : null;\n\t} catch {\n\t\tdropEvent = null;\n\t}\n\tconst processEvent = ({ state, from, to, rule, pasteEvt }) => {\n\t\tconst tr = state.tr;\n\t\tconst chainableState = createChainableState({\n\t\t\tstate,\n\t\t\ttransaction: tr\n\t\t});\n\t\tif (!run({\n\t\t\teditor,\n\t\t\tstate: chainableState,\n\t\t\tfrom: Math.max(from - 1, 0),\n\t\t\tto: to.b - 1,\n\t\t\trule,\n\t\t\tpasteEvent: pasteEvt,\n\t\t\tdropEvent\n\t\t}) || !tr.steps.length) return;\n\t\ttry {\n\t\t\tdropEvent = typeof DragEvent !== \"undefined\" ? new DragEvent(\"drop\") : null;\n\t\t} catch {\n\t\t\tdropEvent = null;\n\t\t}\n\t\tpasteEvent = typeof ClipboardEvent !== \"undefined\" ? new ClipboardEvent(\"paste\") : null;\n\t\treturn tr;\n\t};\n\treturn rules.map((rule) => {\n\t\treturn new Plugin({\n\t\t\tview(view) {\n\t\t\t\tconst handleDragstart = (event) => {\n\t\t\t\t\tvar _view$dom$parentEleme;\n\t\t\t\t\tdragSourceElement = ((_view$dom$parentEleme = view.dom.parentElement) === null || _view$dom$parentEleme === void 0 ? void 0 : _view$dom$parentEleme.contains(event.target)) ? view.dom.parentElement : null;\n\t\t\t\t\tif (dragSourceElement) tiptapDragFromOtherEditor = editor;\n\t\t\t\t};\n\t\t\t\tconst handleDragend = () => {\n\t\t\t\t\tif (tiptapDragFromOtherEditor) tiptapDragFromOtherEditor = null;\n\t\t\t\t};\n\t\t\t\twindow.addEventListener(\"dragstart\", handleDragstart);\n\t\t\t\twindow.addEventListener(\"dragend\", handleDragend);\n\t\t\t\treturn { destroy() {\n\t\t\t\t\twindow.removeEventListener(\"dragstart\", handleDragstart);\n\t\t\t\t\twindow.removeEventListener(\"dragend\", handleDragend);\n\t\t\t\t} };\n\t\t\t},\n\t\t\tprops: { handleDOMEvents: {\n\t\t\t\tdrop: (view, event) => {\n\t\t\t\t\tisDroppedFromProseMirror = dragSourceElement === view.dom.parentElement;\n\t\t\t\t\tdropEvent = event;\n\t\t\t\t\tif (!isDroppedFromProseMirror) {\n\t\t\t\t\t\tconst dragFromOtherEditor = tiptapDragFromOtherEditor;\n\t\t\t\t\t\tif (dragFromOtherEditor === null || dragFromOtherEditor === void 0 ? void 0 : dragFromOtherEditor.isEditable) setTimeout(() => {\n\t\t\t\t\t\t\tconst selection = dragFromOtherEditor.state.selection;\n\t\t\t\t\t\t\tif (selection) dragFromOtherEditor.commands.deleteRange({\n\t\t\t\t\t\t\t\tfrom: selection.from,\n\t\t\t\t\t\t\t\tto: selection.to\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tpaste: (_view, event) => {\n\t\t\t\t\tvar _clipboardData;\n\t\t\t\t\tconst html = (_clipboardData = event.clipboardData) === null || _clipboardData === void 0 ? void 0 : _clipboardData.getData(\"text/html\");\n\t\t\t\t\tpasteEvent = event;\n\t\t\t\t\tisPastedFromProseMirror = !!(html === null || html === void 0 ? void 0 : html.includes(\"data-pm-slice\"));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} },\n\t\t\tappendTransaction: (transactions, oldState, state) => {\n\t\t\t\tconst transaction = transactions[0];\n\t\t\t\tconst isPaste = transaction.getMeta(\"uiEvent\") === \"paste\" && !isPastedFromProseMirror;\n\t\t\t\tconst isDrop = transaction.getMeta(\"uiEvent\") === \"drop\" && !isDroppedFromProseMirror;\n\t\t\t\tconst simulatedPasteMeta = transaction.getMeta(\"applyPasteRules\");\n\t\t\t\tconst isSimulatedPaste = !!simulatedPasteMeta;\n\t\t\t\tif (!isPaste && !isDrop && !isSimulatedPaste) return;\n\t\t\t\tif (isSimulatedPaste) {\n\t\t\t\t\tlet { text } = simulatedPasteMeta;\n\t\t\t\t\tif (typeof text === \"string\") text = text;\n\t\t\t\t\telse text = getHTMLFromFragment(Fragment$1.from(text), state.schema);\n\t\t\t\t\tconst { from } = simulatedPasteMeta;\n\t\t\t\t\tconst to = from + text.length;\n\t\t\t\t\tconst pasteEvt = createClipboardPasteEvent(text);\n\t\t\t\t\treturn processEvent({\n\t\t\t\t\t\trule,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tto: { b: to },\n\t\t\t\t\t\tpasteEvt\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst from = oldState.doc.content.findDiffStart(state.doc.content);\n\t\t\t\tconst to = oldState.doc.content.findDiffEnd(state.doc.content);\n\t\t\t\tif (!isNumber(from) || !to || from === to.b) return;\n\t\t\t\treturn processEvent({\n\t\t\t\t\trule,\n\t\t\t\t\tstate,\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t\tpasteEvt: pasteEvent\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n}\n//#endregion\n//#region src/ExtensionManager.ts\nvar ExtensionManager = class {\n\tconstructor(extensions, editor) {\n\t\tthis.splittableMarks = [];\n\t\tthis.nonClearableMarks = [];\n\t\tthis.decorationManager = null;\n\t\tthis.editor = editor;\n\t\tthis.baseExtensions = extensions;\n\t\tthis.extensions = resolveExtensions(extensions);\n\t\tthis.schema = getSchemaByResolvedExtensions(this.extensions, editor);\n\t\tthis.setupExtensions();\n\t}\n\t/**\n\t* Get all commands from the extensions.\n\t* @returns An object with all commands where the key is the command name and the value is the command function\n\t*/\n\tget commands() {\n\t\treturn this.extensions.reduce((commands, extension) => {\n\t\t\tconst addCommands = getExtensionField(extension, \"addCommands\", {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor: this.editor,\n\t\t\t\ttype: getSchemaTypeByName(extension.name, this.schema)\n\t\t\t});\n\t\t\tif (!addCommands) return commands;\n\t\t\treturn {\n\t\t\t\t...commands,\n\t\t\t\t...addCommands()\n\t\t\t};\n\t\t}, {});\n\t}\n\t/**\n\t* Get all registered Prosemirror plugins from the extensions.\n\t* @returns An array of Prosemirror plugins\n\t*/\n\tget plugins() {\n\t\tconst { editor } = this;\n\t\tconst allPlugins = sortExtensions([...this.extensions].reverse()).flatMap((extension) => {\n\t\t\tconst context = {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor,\n\t\t\t\ttype: getSchemaTypeByName(extension.name, this.schema)\n\t\t\t};\n\t\t\tconst plugins = [];\n\t\t\tconst addKeyboardShortcuts = getExtensionField(extension, \"addKeyboardShortcuts\", context);\n\t\t\tlet defaultBindings = {};\n\t\t\tif (extension.type === \"mark\" && getExtensionField(extension, \"exitable\", context)) defaultBindings.ArrowRight = () => Mark.handleExit({\n\t\t\t\teditor,\n\t\t\t\tmark: extension\n\t\t\t});\n\t\t\tif (addKeyboardShortcuts) {\n\t\t\t\tconst bindings = Object.fromEntries(Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => {\n\t\t\t\t\treturn [shortcut, () => method({ editor })];\n\t\t\t\t}));\n\t\t\t\tdefaultBindings = {\n\t\t\t\t\t...defaultBindings,\n\t\t\t\t\t...bindings\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst keyMapPlugin = keymap(defaultBindings);\n\t\t\tplugins.push(keyMapPlugin);\n\t\t\tconst addInputRules = getExtensionField(extension, \"addInputRules\", context);\n\t\t\tif (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) {\n\t\t\t\tconst rules = addInputRules();\n\t\t\t\tif (rules && rules.length) {\n\t\t\t\t\tconst inputResult = inputRulesPlugin({\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\trules\n\t\t\t\t\t});\n\t\t\t\t\tconst inputPlugins = Array.isArray(inputResult) ? inputResult : [inputResult];\n\t\t\t\t\tplugins.push(...inputPlugins);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst addPasteRules = getExtensionField(extension, \"addPasteRules\", context);\n\t\t\tif (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) {\n\t\t\t\tconst rules = addPasteRules();\n\t\t\t\tif (rules && rules.length) {\n\t\t\t\t\tconst pasteRules = pasteRulesPlugin({\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\trules\n\t\t\t\t\t});\n\t\t\t\t\tplugins.push(...pasteRules);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst addProseMirrorPlugins = getExtensionField(extension, \"addProseMirrorPlugins\", context);\n\t\t\tif (addProseMirrorPlugins) {\n\t\t\t\tconst proseMirrorPlugins = addProseMirrorPlugins();\n\t\t\t\tplugins.push(...proseMirrorPlugins);\n\t\t\t}\n\t\t\treturn plugins;\n\t\t});\n\t\tconst decorationPlugin = this.createDecorationPlugin();\n\t\tif (decorationPlugin) allPlugins.push(decorationPlugin);\n\t\treturn allPlugins;\n\t}\n\t/**\n\t* Aggregates decorations from extensions into a single plugin, or returns null\n\t* if none exist. Destroys the previous manager to avoid orphaned listeners.\n\t* @returns A ProseMirror plugin or `null`\n\t* @example\n\t* const plugin = editor.extensionManager.createDecorationPlugin()\n\t*/\n\tcreateDecorationPlugin() {\n\t\tvar _this$decorationManag;\n\t\tconst { editor } = this;\n\t\t(_this$decorationManag = this.decorationManager) === null || _this$decorationManag === void 0 || _this$decorationManag.destroy();\n\t\tconst entries = [];\n\t\tthis.extensions.forEach((extension) => {\n\t\t\tconst addDecorations = getExtensionField(extension, \"addDecorations\", {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor,\n\t\t\t\ttype: getSchemaTypeByName(extension.name, this.schema)\n\t\t\t});\n\t\t\tif (!addDecorations) return;\n\t\t\tentries.push({\n\t\t\t\tname: extension.name,\n\t\t\t\taddDecorations\n\t\t\t});\n\t\t});\n\t\tthis.decorationManager = new DecorationManager({\n\t\t\teditor,\n\t\t\tentries\n\t\t});\n\t\treturn this.decorationManager.plugin;\n\t}\n\t/**\n\t* Get all attributes from the extensions.\n\t* @returns An array of attributes\n\t*/\n\tget attributes() {\n\t\treturn getAttributesFromExtensions(this.extensions);\n\t}\n\t/**\n\t* Get all node views from the extensions.\n\t* @returns An object with all node views where the key is the node name and the value is the node view function\n\t*/\n\tget nodeViews() {\n\t\tconst { editor } = this;\n\t\tconst { nodeExtensions } = splitExtensions(this.extensions);\n\t\treturn Object.fromEntries(nodeExtensions.filter((extension) => !!getExtensionField(extension, \"addNodeView\")).map((extension) => {\n\t\t\tconst extensionAttributes = this.attributes.filter((attribute) => attribute.type === extension.name);\n\t\t\tconst addNodeView = getExtensionField(extension, \"addNodeView\", {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor,\n\t\t\t\ttype: getNodeType(extension.name, this.schema)\n\t\t\t});\n\t\t\tif (!addNodeView) return [];\n\t\t\tconst nodeViewResult = addNodeView();\n\t\t\tif (!nodeViewResult) return [];\n\t\t\tconst nodeview = (node, view, getPos, decorations, innerDecorations) => {\n\t\t\t\tconst HTMLAttributes = getRenderedAttributes(node, extensionAttributes);\n\t\t\t\treturn nodeViewResult({\n\t\t\t\t\tnode,\n\t\t\t\t\tview,\n\t\t\t\t\tgetPos,\n\t\t\t\t\tdecorations,\n\t\t\t\t\tinnerDecorations,\n\t\t\t\t\teditor,\n\t\t\t\t\textension,\n\t\t\t\t\tHTMLAttributes\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn [extension.name, nodeview];\n\t\t}));\n\t}\n\t/**\n\t* Get the composed dispatchTransaction function from all extensions.\n\t* @param baseDispatch The base dispatch function (e.g. from the editor or user props)\n\t* @returns A composed dispatch function\n\t*/\n\tdispatchTransaction(baseDispatch) {\n\t\tconst { editor } = this;\n\t\treturn sortExtensions([...this.extensions].reverse()).reduceRight((next, extension) => {\n\t\t\tconst context = {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor,\n\t\t\t\ttype: getSchemaTypeByName(extension.name, this.schema)\n\t\t\t};\n\t\t\tconst dispatchTransaction = getExtensionField(extension, \"dispatchTransaction\", context);\n\t\t\tif (!dispatchTransaction) return next;\n\t\t\treturn (transaction) => {\n\t\t\t\tdispatchTransaction.call(context, {\n\t\t\t\t\ttransaction,\n\t\t\t\t\tnext\n\t\t\t\t});\n\t\t\t};\n\t\t}, baseDispatch);\n\t}\n\t/**\n\t* Get the composed transformPastedHTML function from all extensions.\n\t* @param baseTransform The base transform function (e.g. from the editor props)\n\t* @returns A composed transform function that chains all extension transforms\n\t*/\n\ttransformPastedHTML(baseTransform) {\n\t\tconst { editor } = this;\n\t\treturn sortExtensions([...this.extensions]).reduce((transform, extension) => {\n\t\t\tconst context = {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor,\n\t\t\t\ttype: getSchemaTypeByName(extension.name, this.schema)\n\t\t\t};\n\t\t\tconst extensionTransform = getExtensionField(extension, \"transformPastedHTML\", context);\n\t\t\tif (!extensionTransform) return transform;\n\t\t\treturn (html, view) => {\n\t\t\t\tconst transformedHtml = transform(html, view);\n\t\t\t\treturn extensionTransform.call(context, transformedHtml);\n\t\t\t};\n\t\t}, baseTransform || ((html) => html));\n\t}\n\tget markViews() {\n\t\tconst { editor } = this;\n\t\tconst { markExtensions } = splitExtensions(this.extensions);\n\t\treturn Object.fromEntries(markExtensions.filter((extension) => !!getExtensionField(extension, \"addMarkView\")).map((extension) => {\n\t\t\tconst extensionAttributes = this.attributes.filter((attribute) => attribute.type === extension.name);\n\t\t\tconst addMarkView = getExtensionField(extension, \"addMarkView\", {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor,\n\t\t\t\ttype: getMarkType(extension.name, this.schema)\n\t\t\t});\n\t\t\tif (!addMarkView) return [];\n\t\t\tconst markView = (mark, view, inline) => {\n\t\t\t\tconst HTMLAttributes = getRenderedAttributes(mark, extensionAttributes);\n\t\t\t\treturn addMarkView()({\n\t\t\t\t\tmark,\n\t\t\t\t\tview,\n\t\t\t\t\tinline,\n\t\t\t\t\teditor,\n\t\t\t\t\textension,\n\t\t\t\t\tHTMLAttributes,\n\t\t\t\t\tupdateAttributes: (attrs) => {\n\t\t\t\t\t\tupdateMarkViewAttributes(mark, editor, attrs);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\treturn [extension.name, markView];\n\t\t}));\n\t}\n\t/**\n\t* Destroy the extension manager and clean up all extension references\n\t* to prevent memory leaks through parent/child extension chains.\n\t*\n\t* Walks each extension's full parent chain and nulls every forward\n\t* `parent.child → current` link where the parent still points to the\n\t* current node. This breaks the retention path from module-scope\n\t* singleton roots through deep extend() chains.\n\t*\n\t* Only ancestor `.child` links matching the current chain are cleared.\n\t* The `.parent` pointer on ancestors is never touched — extensions\n\t* may be shared across live editors, so their own backward references\n\t* and non-matching forward links must remain intact.\n\t*/\n\tdestroy() {\n\t\tvar _this$decorationManag2;\n\t\t(_this$decorationManag2 = this.decorationManager) === null || _this$decorationManag2 === void 0 || _this$decorationManag2.destroy();\n\t\tthis.extensions.forEach((extension) => {\n\t\t\tlet current = extension;\n\t\t\twhile (current.parent) {\n\t\t\t\tconst parent = current.parent;\n\t\t\t\tif (parent.child === current) parent.child = null;\n\t\t\t\tcurrent = parent;\n\t\t\t}\n\t\t});\n\t\tthis.extensions = [];\n\t\tthis.baseExtensions = [];\n\t\tthis.decorationManager = null;\n\t\tthis.schema = null;\n\t\tthis.editor = null;\n\t}\n\t/**\n\t* Go through all extensions, create extension storages & setup marks\n\t* & bind editor event listener.\n\t*/\n\tsetupExtensions() {\n\t\tconst extensions = this.extensions;\n\t\tthis.editor.extensionStorage = Object.fromEntries(extensions.map((extension) => [extension.name, extension.storage]));\n\t\textensions.forEach((extension) => {\n\t\t\tconst context = {\n\t\t\t\tname: extension.name,\n\t\t\t\toptions: extension.options,\n\t\t\t\tstorage: this.editor.extensionStorage[extension.name],\n\t\t\t\teditor: this.editor,\n\t\t\t\ttype: getSchemaTypeByName(extension.name, this.schema)\n\t\t\t};\n\t\t\tif (extension.type === \"mark\") {\n\t\t\t\tvar _callOrReturn, _callOrReturn2;\n\t\t\t\tif ((_callOrReturn = callOrReturn(getExtensionField(extension, \"keepOnSplit\", context))) !== null && _callOrReturn !== void 0 ? _callOrReturn : true) this.splittableMarks.push(extension.name);\n\t\t\t\tif (!((_callOrReturn2 = callOrReturn(getExtensionField(extension, \"clearable\", context))) !== null && _callOrReturn2 !== void 0 ? _callOrReturn2 : true)) this.nonClearableMarks.push(extension.name);\n\t\t\t}\n\t\t\tconst onBeforeCreate = getExtensionField(extension, \"onBeforeCreate\", context);\n\t\t\tconst onCreate = getExtensionField(extension, \"onCreate\", context);\n\t\t\tconst onUpdate = getExtensionField(extension, \"onUpdate\", context);\n\t\t\tconst onSelectionUpdate = getExtensionField(extension, \"onSelectionUpdate\", context);\n\t\t\tconst onTransaction = getExtensionField(extension, \"onTransaction\", context);\n\t\t\tconst onFocus = getExtensionField(extension, \"onFocus\", context);\n\t\t\tconst onBlur = getExtensionField(extension, \"onBlur\", context);\n\t\t\tconst onDestroy = getExtensionField(extension, \"onDestroy\", context);\n\t\t\tif (onBeforeCreate) this.editor.on(\"beforeCreate\", onBeforeCreate);\n\t\t\tif (onCreate) this.editor.on(\"create\", onCreate);\n\t\t\tif (onUpdate) this.editor.on(\"update\", onUpdate);\n\t\t\tif (onSelectionUpdate) this.editor.on(\"selectionUpdate\", onSelectionUpdate);\n\t\t\tif (onTransaction) this.editor.on(\"transaction\", onTransaction);\n\t\t\tif (onFocus) this.editor.on(\"focus\", onFocus);\n\t\t\tif (onBlur) this.editor.on(\"blur\", onBlur);\n\t\t\tif (onDestroy) this.editor.on(\"destroy\", onDestroy);\n\t\t});\n\t}\n};\nExtensionManager.resolve = resolveExtensions;\nExtensionManager.sort = sortExtensions;\nExtensionManager.flatten = flattenExtensions;\n//#endregion\n//#region src/Extension.ts\n/**\n* The Extension class is the base class for all extensions.\n* @see https://tiptap.dev/api/extensions#create-a-new-extension\n*/\nvar Extension = class Extension extends Extendable {\n\tconstructor(..._args) {\n\t\tsuper(..._args);\n\t\tthis.type = \"extension\";\n\t}\n\t/**\n\t* Create a new Extension instance\n\t* @param config - Extension configuration object or a function that returns a configuration object\n\t*/\n\tstatic create(config = {}) {\n\t\tconst resolvedConfig = typeof config === \"function\" ? config() : config;\n\t\treturn new Extension(resolvedConfig);\n\t}\n\tconfigure(options) {\n\t\treturn super.configure(options);\n\t}\n\textend(extendedConfig) {\n\t\tconst resolvedConfig = typeof extendedConfig === \"function\" ? extendedConfig() : extendedConfig;\n\t\treturn super.extend(resolvedConfig);\n\t}\n};\n//#endregion\n//#region src/extensions/clipboardTextSerializer.ts\nconst ClipboardTextSerializer = Extension.create({\n\tname: \"clipboardTextSerializer\",\n\taddOptions() {\n\t\treturn { blockSeparator: void 0 };\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"clipboardTextSerializer\"),\n\t\t\tprops: { clipboardTextSerializer: () => {\n\t\t\t\tconst { editor } = this;\n\t\t\t\tconst { state, schema } = editor;\n\t\t\t\tconst { doc, selection } = state;\n\t\t\t\tconst textSerializers = getTextSerializersFromSchema(schema);\n\t\t\t\tconst { blockSeparator } = this.options;\n\t\t\t\tconst options = {\n\t\t\t\t\t...blockSeparator !== void 0 ? { blockSeparator } : {},\n\t\t\t\t\ttextSerializers\n\t\t\t\t};\n\t\t\t\treturn [...selection.ranges].sort((a, b) => a.$from.pos - b.$from.pos).map(({ $from, $to }) => getTextBetween(doc, {\n\t\t\t\t\tfrom: $from.pos,\n\t\t\t\t\tto: $to.pos\n\t\t\t\t}, options)).join(blockSeparator !== null && blockSeparator !== void 0 ? blockSeparator : \"\\n\\n\");\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/commands.ts\nconst Commands = Extension.create({\n\tname: \"commands\",\n\taddCommands() {\n\t\treturn { ...commands_exports };\n\t}\n});\n//#endregion\n//#region src/extensions/delete.ts\n/**\n* This extension allows you to be notified when the user deletes content you are interested in.\n*/\nconst Delete = Extension.create({\n\tname: \"delete\",\n\tonUpdate({ transaction, appendedTransactions }) {\n\t\tvar _this$editor$options$4, _this$editor$options$5;\n\t\tconst callback = () => {\n\t\t\tvar _this$editor$options$, _this$editor$options$2, _this$editor$options$3;\n\t\t\tif ((_this$editor$options$ = (_this$editor$options$2 = this.editor.options.coreExtensionOptions) === null || _this$editor$options$2 === void 0 || (_this$editor$options$2 = _this$editor$options$2.delete) === null || _this$editor$options$2 === void 0 || (_this$editor$options$3 = _this$editor$options$2.filterTransaction) === null || _this$editor$options$3 === void 0 ? void 0 : _this$editor$options$3.call(_this$editor$options$2, transaction)) !== null && _this$editor$options$ !== void 0 ? _this$editor$options$ : transaction.getMeta(\"y-sync$\")) return;\n\t\t\tconst nextTransaction = combineTransactionSteps(transaction.before, [transaction, ...appendedTransactions]);\n\t\t\tgetChangedRanges(nextTransaction).forEach((change) => {\n\t\t\t\tif (nextTransaction.mapping.mapResult(change.oldRange.from).deletedAfter && nextTransaction.mapping.mapResult(change.oldRange.to).deletedBefore) nextTransaction.before.nodesBetween(change.oldRange.from, change.oldRange.to, (node, from) => {\n\t\t\t\t\tconst to = from + node.nodeSize - 2;\n\t\t\t\t\tconst isFullyWithinRange = change.oldRange.from <= from && to <= change.oldRange.to;\n\t\t\t\t\tthis.editor.emit(\"delete\", {\n\t\t\t\t\t\ttype: \"node\",\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tto,\n\t\t\t\t\t\tnewFrom: nextTransaction.mapping.map(from),\n\t\t\t\t\t\tnewTo: nextTransaction.mapping.map(to),\n\t\t\t\t\t\tdeletedRange: change.oldRange,\n\t\t\t\t\t\tnewRange: change.newRange,\n\t\t\t\t\t\tpartial: !isFullyWithinRange,\n\t\t\t\t\t\teditor: this.editor,\n\t\t\t\t\t\ttransaction,\n\t\t\t\t\t\tcombinedTransform: nextTransaction\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t\tconst mapping = nextTransaction.mapping;\n\t\t\tnextTransaction.steps.forEach((step, index) => {\n\t\t\t\tif (step instanceof RemoveMarkStep) {\n\t\t\t\t\tvar _nextTransaction$doc$, _nextTransaction$doc$2;\n\t\t\t\t\tconst newStart = mapping.slice(index).map(step.from, -1);\n\t\t\t\t\tconst newEnd = mapping.slice(index).map(step.to);\n\t\t\t\t\tconst oldStart = mapping.invert().map(newStart, -1);\n\t\t\t\t\tconst oldEnd = mapping.invert().map(newEnd);\n\t\t\t\t\tconst foundBeforeMark = newStart > 0 ? (_nextTransaction$doc$ = nextTransaction.doc.nodeAt(newStart - 1)) === null || _nextTransaction$doc$ === void 0 ? void 0 : _nextTransaction$doc$.marks.some((mark) => mark.eq(step.mark)) : false;\n\t\t\t\t\tconst foundAfterMark = (_nextTransaction$doc$2 = nextTransaction.doc.nodeAt(newEnd)) === null || _nextTransaction$doc$2 === void 0 ? void 0 : _nextTransaction$doc$2.marks.some((mark) => mark.eq(step.mark));\n\t\t\t\t\tthis.editor.emit(\"delete\", {\n\t\t\t\t\t\ttype: \"mark\",\n\t\t\t\t\t\tmark: step.mark,\n\t\t\t\t\t\tfrom: step.from,\n\t\t\t\t\t\tto: step.to,\n\t\t\t\t\t\tdeletedRange: {\n\t\t\t\t\t\t\tfrom: oldStart,\n\t\t\t\t\t\t\tto: oldEnd\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnewRange: {\n\t\t\t\t\t\t\tfrom: newStart,\n\t\t\t\t\t\t\tto: newEnd\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpartial: Boolean(foundAfterMark || foundBeforeMark),\n\t\t\t\t\t\teditor: this.editor,\n\t\t\t\t\t\ttransaction,\n\t\t\t\t\t\tcombinedTransform: nextTransaction\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tif ((_this$editor$options$4 = (_this$editor$options$5 = this.editor.options.coreExtensionOptions) === null || _this$editor$options$5 === void 0 || (_this$editor$options$5 = _this$editor$options$5.delete) === null || _this$editor$options$5 === void 0 ? void 0 : _this$editor$options$5.async) !== null && _this$editor$options$4 !== void 0 ? _this$editor$options$4 : true) setTimeout(callback, 0);\n\t\telse callback();\n\t}\n});\n//#endregion\n//#region src/extensions/drop.ts\nconst Drop = Extension.create({\n\tname: \"drop\",\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"tiptapDrop\"),\n\t\t\tprops: { handleDrop: (_, e, slice, moved) => {\n\t\t\t\tthis.editor.emit(\"drop\", {\n\t\t\t\t\teditor: this.editor,\n\t\t\t\t\tevent: e,\n\t\t\t\t\tslice,\n\t\t\t\t\tmoved\n\t\t\t\t});\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/editable.ts\nconst Editable = Extension.create({\n\tname: \"editable\",\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"editable\"),\n\t\t\tprops: { editable: () => this.editor.options.editable }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/focusEvents.ts\nconst focusEventsPluginKey = new PluginKey(\"focusEvents\");\nconst FocusEvents = Extension.create({\n\tname: \"focusEvents\",\n\taddProseMirrorPlugins() {\n\t\tconst { editor } = this;\n\t\treturn [new Plugin({\n\t\t\tkey: focusEventsPluginKey,\n\t\t\tprops: { handleDOMEvents: {\n\t\t\t\tfocus: (view, event) => {\n\t\t\t\t\teditor.isFocused = true;\n\t\t\t\t\tconst transaction = editor.state.tr.setMeta(\"focus\", { event }).setMeta(\"addToHistory\", false);\n\t\t\t\t\tview.dispatch(transaction);\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tblur: (view, event) => {\n\t\t\t\t\teditor.isFocused = false;\n\t\t\t\t\tconst transaction = editor.state.tr.setMeta(\"blur\", { event }).setMeta(\"addToHistory\", false);\n\t\t\t\t\tview.dispatch(transaction);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/keymap.ts\nconst Keymap = Extension.create({\n\tname: \"keymap\",\n\taddKeyboardShortcuts() {\n\t\tconst handleBackspace = () => this.editor.commands.first(({ commands }) => [\n\t\t\t() => commands.undoInputRule(),\n\t\t\t() => commands.command(({ tr }) => {\n\t\t\t\tconst { selection, doc } = tr;\n\t\t\t\tconst { empty, $anchor } = selection;\n\t\t\t\tconst { pos, parent } = $anchor;\n\t\t\t\tconst $parentPos = $anchor.parent.isTextblock && pos > 0 ? tr.doc.resolve(pos - 1) : $anchor;\n\t\t\t\tconst parentIsIsolating = $parentPos.parent.type.spec.isolating;\n\t\t\t\tconst parentPos = $anchor.pos - $anchor.parentOffset;\n\t\t\t\tconst isAtStart = parentIsIsolating && $parentPos.parent.childCount === 1 ? parentPos === $anchor.pos : Selection.atStart(doc).from === pos;\n\t\t\t\tif (!empty || !parent.type.isTextblock || parent.textContent.length || !isAtStart || isAtStart && $anchor.parent.type.name === \"paragraph\") return false;\n\t\t\t\treturn commands.clearNodes();\n\t\t\t}),\n\t\t\t() => commands.deleteSelection(),\n\t\t\t() => commands.joinBackward(),\n\t\t\t() => commands.selectNodeBackward()\n\t\t]);\n\t\tconst handleDelete = () => this.editor.commands.first(({ commands }) => [\n\t\t\t() => commands.deleteSelection(),\n\t\t\t() => commands.deleteCurrentNode(),\n\t\t\t() => commands.joinForward(),\n\t\t\t() => commands.selectNodeForward()\n\t\t]);\n\t\tconst handleEnter = () => this.editor.commands.first(({ commands }) => [\n\t\t\t() => commands.newlineInCode(),\n\t\t\t() => commands.createParagraphNear(),\n\t\t\t() => commands.liftEmptyBlock(),\n\t\t\t() => commands.splitBlock()\n\t\t]);\n\t\tconst baseKeymap = {\n\t\t\tEnter: handleEnter,\n\t\t\t\"Mod-Enter\": () => this.editor.commands.exitCode(),\n\t\t\tBackspace: handleBackspace,\n\t\t\t\"Mod-Backspace\": handleBackspace,\n\t\t\t\"Shift-Backspace\": handleBackspace,\n\t\t\tDelete: handleDelete,\n\t\t\t\"Mod-Delete\": handleDelete,\n\t\t\t\"Mod-a\": () => this.editor.commands.selectAll()\n\t\t};\n\t\tconst pcKeymap = { ...baseKeymap };\n\t\tconst macKeymap = {\n\t\t\t...baseKeymap,\n\t\t\t\"Ctrl-h\": handleBackspace,\n\t\t\t\"Alt-Backspace\": handleBackspace,\n\t\t\t\"Ctrl-d\": handleDelete,\n\t\t\t\"Ctrl-Alt-Backspace\": handleDelete,\n\t\t\t\"Alt-Delete\": handleDelete,\n\t\t\t\"Alt-d\": handleDelete,\n\t\t\t\"Ctrl-a\": () => this.editor.commands.selectTextblockStart(),\n\t\t\t\"Ctrl-e\": () => this.editor.commands.selectTextblockEnd()\n\t\t};\n\t\tif (isiOS() || isMacOS()) return macKeymap;\n\t\treturn pcKeymap;\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"clearDocument\"),\n\t\t\tappendTransaction: (transactions, oldState, newState) => {\n\t\t\t\tif (transactions.some((tr) => tr.getMeta(\"composition\"))) return;\n\t\t\t\tconst docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc);\n\t\t\t\tconst ignoreTr = transactions.some((transaction) => transaction.getMeta(\"preventClearDocument\"));\n\t\t\t\tif (!docChanges || ignoreTr) return;\n\t\t\t\tconst { empty, from, to } = oldState.selection;\n\t\t\t\tconst allFrom = Selection.atStart(oldState.doc).from;\n\t\t\t\tconst allEnd = Selection.atEnd(oldState.doc).to;\n\t\t\t\tif (empty || !(from === allFrom && to === allEnd)) return;\n\t\t\t\tif (!isNodeEmpty(newState.doc)) return;\n\t\t\t\tconst tr = newState.tr;\n\t\t\t\tconst state = createChainableState({\n\t\t\t\t\tstate: newState,\n\t\t\t\t\ttransaction: tr\n\t\t\t\t});\n\t\t\t\tconst { commands } = new CommandManager({\n\t\t\t\t\teditor: this.editor,\n\t\t\t\t\tstate\n\t\t\t\t});\n\t\t\t\tcommands.clearNodes();\n\t\t\t\tif (!tr.steps.length) return;\n\t\t\t\treturn tr;\n\t\t\t}\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/paste.ts\nconst Paste = Extension.create({\n\tname: \"paste\",\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"tiptapPaste\"),\n\t\t\tprops: { handlePaste: (_view, e, slice) => {\n\t\t\t\tthis.editor.emit(\"paste\", {\n\t\t\t\t\teditor: this.editor,\n\t\t\t\t\tevent: e,\n\t\t\t\t\tslice\n\t\t\t\t});\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/tabindex.ts\n/**\n* The Tabindex extension adds a configurable tabindex attribute to the editor.\n*\n* By default, the editor gets tabindex=\"0\" when editable. This can be customized\n* via coreExtensionOptions to support specific focus ordering requirements in forms\n* or to enable focusing on non-editable editors.\n*\n* @example\n* ```ts\n* new Editor({\n*   coreExtensionOptions: {\n*     tabindex: {\n*       value: '-1',\n*     },\n*   },\n* })\n* ```\n*/\nconst Tabindex = Extension.create({\n\tname: \"tabindex\",\n\taddOptions() {\n\t\treturn { value: void 0 };\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"tabindex\"),\n\t\t\tprops: { attributes: () => {\n\t\t\t\tvar _this$options$value;\n\t\t\t\tif (!this.editor.isEditable && this.options.value === void 0) return {};\n\t\t\t\treturn { tabindex: (_this$options$value = this.options.value) !== null && _this$options$value !== void 0 ? _this$options$value : \"0\" };\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/textDirection.ts\n/**\n* The TextDirection extension adds support for setting text direction (LTR/RTL/auto)\n* on all nodes in the editor.\n*\n* This extension adds a global `dir` attribute to all node types, which can be used\n* to control bidirectional text rendering. The direction can be set globally via\n* editor options or per-node using commands.\n*/\nconst TextDirection = Extension.create({\n\tname: \"textDirection\",\n\taddOptions() {\n\t\treturn { direction: void 0 };\n\t},\n\taddGlobalAttributes() {\n\t\tif (!this.options.direction) return [];\n\t\tconst { nodeExtensions } = splitExtensions(this.extensions);\n\t\treturn [{\n\t\t\ttypes: nodeExtensions.filter((extension) => extension.name !== \"text\").map((extension) => extension.name),\n\t\t\tattributes: { dir: {\n\t\t\t\tdefault: this.options.direction,\n\t\t\t\tparseHTML: (element) => {\n\t\t\t\t\tconst dir = element.getAttribute(\"dir\");\n\t\t\t\t\tif (dir && (dir === \"ltr\" || dir === \"rtl\" || dir === \"auto\")) return dir;\n\t\t\t\t\treturn this.options.direction;\n\t\t\t\t},\n\t\t\t\trenderHTML: (attributes) => {\n\t\t\t\t\tif (!attributes.dir) return {};\n\t\t\t\t\treturn { dir: attributes.dir };\n\t\t\t\t}\n\t\t\t} }\n\t\t}];\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"textDirection\"),\n\t\t\tprops: { attributes: () => {\n\t\t\t\tconst direction = this.options.direction;\n\t\t\t\tif (!direction) return {};\n\t\t\t\treturn { dir: direction };\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/extensions/index.ts\nvar extensions_exports = /* @__PURE__ */ __exportAll({\n\tClipboardTextSerializer: () => ClipboardTextSerializer,\n\tCommands: () => Commands,\n\tDelete: () => Delete,\n\tDrop: () => Drop,\n\tEditable: () => Editable,\n\tFocusEvents: () => FocusEvents,\n\tKeymap: () => Keymap,\n\tPaste: () => Paste,\n\tTabindex: () => Tabindex,\n\tTextDirection: () => TextDirection,\n\tfocusEventsPluginKey: () => focusEventsPluginKey\n});\n//#endregion\n//#region src/helpers/warnOnDuplicatedProseMirrorModel.ts\nlet hasChecked = false;\n/**\n* Warns once when prosemirror-model is loaded twice\n* @param schema The editor schema\n* @returns void\n* @example ```js\n* warnOnDuplicatedProseMirrorModel(editor.schema)\n* ```\n*/\nfunction warnOnDuplicatedProseMirrorModel(schema) {\n\tif (hasChecked) return;\n\thasChecked = true;\n\tlet content;\n\ttry {\n\t\tcontent = ReplaceStep.fromJSON(schema, {\n\t\t\tfrom: 0,\n\t\t\tto: 0\n\t\t}).slice.content;\n\t} catch {\n\t\treturn;\n\t}\n\tif (content instanceof Fragment$1) return;\n\tconsole.warn(\"[tiptap warn]: prosemirror-model is loaded more than once. Wrapping and splitting nodes will fail. Deduplicate it in your lock file, or alias it to a single copy in your bundler.\");\n}\n//#endregion\n//#region src/NodePos.ts\nvar NodePos = class NodePos {\n\tget name() {\n\t\treturn this.node.type.name;\n\t}\n\tconstructor(pos, editor, isBlock = false, node = null) {\n\t\tthis.currentNode = null;\n\t\tthis.actualDepth = null;\n\t\tthis.isBlock = isBlock;\n\t\tthis.resolvedPos = pos;\n\t\tthis.editor = editor;\n\t\tthis.currentNode = node;\n\t}\n\tget node() {\n\t\treturn this.currentNode || this.resolvedPos.node();\n\t}\n\tget element() {\n\t\treturn this.editor.view.domAtPos(this.pos).node;\n\t}\n\tget depth() {\n\t\tvar _this$actualDepth;\n\t\treturn (_this$actualDepth = this.actualDepth) !== null && _this$actualDepth !== void 0 ? _this$actualDepth : this.resolvedPos.depth;\n\t}\n\tget pos() {\n\t\treturn this.resolvedPos.pos;\n\t}\n\tget content() {\n\t\treturn this.node.content;\n\t}\n\tset content(content) {\n\t\tlet from = this.from;\n\t\tlet to = this.to;\n\t\tif (this.isBlock) {\n\t\t\tif (this.content.size === 0) {\n\t\t\t\tconsole.error(`You can’t set content on a block node. Tried to set content on ${this.name} at ${this.pos}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfrom = this.from + 1;\n\t\t\tto = this.to - 1;\n\t\t}\n\t\tthis.editor.commands.insertContentAt({\n\t\t\tfrom,\n\t\t\tto\n\t\t}, content);\n\t}\n\tget attributes() {\n\t\treturn this.node.attrs;\n\t}\n\tget textContent() {\n\t\treturn this.node.textContent;\n\t}\n\tget size() {\n\t\treturn this.node.nodeSize;\n\t}\n\tget from() {\n\t\tif (this.isBlock) return this.pos;\n\t\treturn this.resolvedPos.start(this.resolvedPos.depth);\n\t}\n\tget range() {\n\t\treturn {\n\t\t\tfrom: this.from,\n\t\t\tto: this.to\n\t\t};\n\t}\n\tget to() {\n\t\tif (this.isBlock) return this.pos + this.size;\n\t\treturn this.resolvedPos.end(this.resolvedPos.depth) + (this.node.isText ? 0 : 1);\n\t}\n\tget parent() {\n\t\tif (this.depth === 0) return null;\n\t\tconst parentPos = this.resolvedPos.start(this.resolvedPos.depth - 1);\n\t\tconst $pos = this.resolvedPos.doc.resolve(parentPos);\n\t\treturn new NodePos($pos, this.editor);\n\t}\n\tget before() {\n\t\tlet $pos = this.resolvedPos.doc.resolve(this.from - (this.isBlock ? 1 : 2));\n\t\tif ($pos.depth !== this.depth) $pos = this.resolvedPos.doc.resolve(this.from - 3);\n\t\treturn new NodePos($pos, this.editor);\n\t}\n\tget after() {\n\t\tlet $pos = this.resolvedPos.doc.resolve(this.to + (this.isBlock ? 2 : 1));\n\t\tif ($pos.depth !== this.depth) $pos = this.resolvedPos.doc.resolve(this.to + 3);\n\t\treturn new NodePos($pos, this.editor);\n\t}\n\tget children() {\n\t\tconst children = [];\n\t\tthis.node.content.forEach((node, offset) => {\n\t\t\tconst isBlock = node.isBlock && !node.isTextblock;\n\t\t\tconst isNonTextAtom = node.isAtom && !node.isText;\n\t\t\tconst isInline = node.isInline;\n\t\t\tconst targetPos = this.pos + offset + (isNonTextAtom ? 0 : 1);\n\t\t\tif (targetPos < 0 || targetPos > this.resolvedPos.doc.nodeSize - 2) return;\n\t\t\tconst $pos = this.resolvedPos.doc.resolve(targetPos);\n\t\t\tif (!isBlock && !isInline && $pos.depth <= this.depth) return;\n\t\t\tconst childNodePos = new NodePos($pos, this.editor, isBlock, isBlock || isInline ? node : null);\n\t\t\tif (isBlock) childNodePos.actualDepth = this.depth + 1;\n\t\t\tchildren.push(childNodePos);\n\t\t});\n\t\treturn children;\n\t}\n\tget firstChild() {\n\t\treturn this.children[0] || null;\n\t}\n\tget lastChild() {\n\t\tconst children = this.children;\n\t\treturn children[children.length - 1] || null;\n\t}\n\tclosest(selector, attributes = {}) {\n\t\tlet node = null;\n\t\tlet currentNode = this.parent;\n\t\twhile (currentNode && !node) {\n\t\t\tif (currentNode.node.type.name === selector) {\n\t\t\t\tif (Object.keys(attributes).length > 0) {\n\t\t\t\t\tconst nodeAttributes = currentNode.node.attrs;\n\t\t\t\t\tconst attrKeys = Object.keys(attributes);\n\t\t\t\t\tfor (let index = 0; index < attrKeys.length; index += 1) {\n\t\t\t\t\t\tconst key = attrKeys[index];\n\t\t\t\t\t\tif (nodeAttributes[key] !== attributes[key]) break;\n\t\t\t\t\t}\n\t\t\t\t} else node = currentNode;\n\t\t\t}\n\t\t\tcurrentNode = currentNode.parent;\n\t\t}\n\t\treturn node;\n\t}\n\tquerySelector(selector, attributes = {}) {\n\t\treturn this.querySelectorAll(selector, attributes, true)[0] || null;\n\t}\n\tquerySelectorAll(selector, attributes = {}, firstItemOnly = false) {\n\t\tlet nodes = [];\n\t\tif (!this.children || this.children.length === 0) return nodes;\n\t\tconst attrKeys = Object.keys(attributes);\n\t\t/**\n\t\t* Finds all children recursively that match the selector and attributes\n\t\t* If firstItemOnly is true, it will return the first item found\n\t\t*/\n\t\tthis.children.forEach((childPos) => {\n\t\t\tif (firstItemOnly && nodes.length > 0) return;\n\t\t\tif (childPos.node.type.name === selector) {\n\t\t\t\tif (attrKeys.every((key) => attributes[key] === childPos.node.attrs[key])) nodes.push(childPos);\n\t\t\t}\n\t\t\tif (firstItemOnly && nodes.length > 0) return;\n\t\t\tnodes = nodes.concat(childPos.querySelectorAll(selector, attributes, firstItemOnly));\n\t\t});\n\t\treturn nodes;\n\t}\n\tsetAttribute(attributes) {\n\t\tconst { tr } = this.editor.state;\n\t\ttr.setNodeMarkup(this.from, void 0, {\n\t\t\t...this.node.attrs,\n\t\t\t...attributes\n\t\t});\n\t\tthis.editor.view.dispatch(tr);\n\t}\n};\n//#endregion\n//#region src/style.ts\nconst style = `.ProseMirror {\n  position: relative;\n}\n\n.ProseMirror {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  white-space: break-spaces;\n  -webkit-font-variant-ligatures: none;\n  font-variant-ligatures: none;\n  font-feature-settings: \"liga\" 0; /* the above doesn't seem to work in Edge */\n}\n\n.ProseMirror [contenteditable=\"false\"] {\n  white-space: normal;\n}\n\n.ProseMirror [contenteditable=\"false\"] [contenteditable=\"true\"] {\n  white-space: pre-wrap;\n}\n\n.ProseMirror pre {\n  white-space: pre-wrap;\n}\n\nimg.ProseMirror-separator {\n  display: inline !important;\n  border: none !important;\n  margin: 0 !important;\n  width: 0 !important;\n  height: 0 !important;\n}\n\n.ProseMirror-gapcursor {\n  display: none;\n  pointer-events: none;\n  position: absolute;\n  margin: 0;\n}\n\n.ProseMirror-gapcursor:after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: -2px;\n  width: 20px;\n  border-top: 1px solid black;\n  animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;\n}\n\n@keyframes ProseMirror-cursor-blink {\n  to {\n    visibility: hidden;\n  }\n}\n\n.ProseMirror-hideselection *::selection {\n  background: transparent;\n}\n\n.ProseMirror-hideselection *::-moz-selection {\n  background: transparent;\n}\n\n.ProseMirror-hideselection * {\n  caret-color: transparent;\n}\n\n.ProseMirror-focused .ProseMirror-gapcursor {\n  display: block;\n}`;\n//#endregion\n//#region src/Editor.ts\nvar Editor = class extends EventEmitter {\n\tconstructor(options = {}) {\n\t\tsuper();\n\t\tthis.css = null;\n\t\tthis.className = \"tiptap\";\n\t\tthis.editorView = null;\n\t\tthis.isFocused = false;\n\t\tthis.destroyed = false;\n\t\tthis.isInitialized = false;\n\t\tthis.extensionStorage = {};\n\t\tthis.instanceId = Math.random().toString(36).slice(2, 9);\n\t\tthis.hasWarnedStaleDecorationRead = false;\n\t\tthis.options = {\n\t\t\telement: typeof document !== \"undefined\" ? document.createElement(\"div\") : null,\n\t\t\tcontent: \"\",\n\t\t\tinjectCSS: true,\n\t\t\tinjectNonce: void 0,\n\t\t\textensions: [],\n\t\t\tautofocus: false,\n\t\t\teditable: true,\n\t\t\ttextDirection: void 0,\n\t\t\teditorProps: {},\n\t\t\tparseOptions: {},\n\t\t\tcoreExtensionOptions: {},\n\t\t\tenableInputRules: true,\n\t\t\tenablePasteRules: true,\n\t\t\tenableCoreExtensions: true,\n\t\t\tenableContentCheck: false,\n\t\t\temitContentError: false,\n\t\t\tonBeforeCreate: () => null,\n\t\t\tonCreate: () => null,\n\t\t\tonMount: () => null,\n\t\t\tonUnmount: () => null,\n\t\t\tonUpdate: () => null,\n\t\t\tonSelectionUpdate: () => null,\n\t\t\tonTransaction: () => null,\n\t\t\tonFocus: () => null,\n\t\t\tonBlur: () => null,\n\t\t\tonDestroy: () => null,\n\t\t\tonContentError: ({ error }) => {\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t\tonPaste: () => null,\n\t\t\tonDrop: () => null,\n\t\t\tonDelete: () => null,\n\t\t\tenableExtensionDispatchTransaction: true\n\t\t};\n\t\tthis.isCapturingTransaction = false;\n\t\tthis.capturedTransaction = null;\n\t\tthis.utils = {\n\t\t\tgetUpdatedPosition,\n\t\t\tcreateMappablePosition\n\t\t};\n\t\tthis.setOptions(options);\n\t\tthis.createExtensionManager();\n\t\tthis.createCommandManager();\n\t\tthis.createSchema();\n\t\tthis.on(\"beforeCreate\", this.options.onBeforeCreate);\n\t\tthis.emit(\"beforeCreate\", { editor: this });\n\t\tthis.on(\"mount\", this.options.onMount);\n\t\tthis.on(\"unmount\", this.options.onUnmount);\n\t\tthis.on(\"contentError\", this.options.onContentError);\n\t\tthis.on(\"create\", this.options.onCreate);\n\t\tthis.on(\"update\", this.options.onUpdate);\n\t\tthis.on(\"selectionUpdate\", this.options.onSelectionUpdate);\n\t\tthis.on(\"transaction\", this.options.onTransaction);\n\t\tthis.on(\"focus\", this.options.onFocus);\n\t\tthis.on(\"blur\", this.options.onBlur);\n\t\tthis.on(\"destroy\", this.options.onDestroy);\n\t\tthis.on(\"drop\", ({ event, slice, moved }) => this.options.onDrop(event, slice, moved));\n\t\tthis.on(\"paste\", ({ event, slice }) => this.options.onPaste(event, slice));\n\t\tthis.on(\"delete\", this.options.onDelete);\n\t\tconst initialDoc = this.createDoc();\n\t\tif (!this.editorState) {\n\t\t\tconst selection = resolveFocusPosition(initialDoc, this.options.autofocus);\n\t\t\tthis.editorState = EditorState.create({\n\t\t\t\tdoc: initialDoc,\n\t\t\t\tschema: this.schema,\n\t\t\t\tselection: selection || void 0\n\t\t\t});\n\t\t}\n\t\twarnOnDuplicatedProseMirrorModel(this.schema);\n\t\tif (this.options.element) this.mount(this.options.element);\n\t}\n\t/**\n\t* Attach the editor to the DOM, creating a new editor view.\n\t*/\n\tmount(el) {\n\t\tif (typeof document === \"undefined\") throw new Error(`[tiptap error]: The editor cannot be mounted because there is no 'document' defined in this environment.`);\n\t\tthis.createView(el);\n\t\tthis.emit(\"mount\", { editor: this });\n\t\tif (this.css && !document.head.contains(this.css)) document.head.appendChild(this.css);\n\t\twindow.setTimeout(() => {\n\t\t\tif (this.isDestroyed) return;\n\t\t\tif (this.options.autofocus !== false && this.options.autofocus !== null) this.commands.focus(this.options.autofocus);\n\t\t\tthis.emit(\"create\", { editor: this });\n\t\t\tthis.isInitialized = true;\n\t\t}, 0);\n\t}\n\t/**\n\t* Remove the editor from the DOM, but still allow remounting at a different point in time\n\t*/\n\tunmount() {\n\t\tif (this.editorView) {\n\t\t\tthis.editorState = this.editorView.state;\n\t\t\tconst dom = this.editorView.dom;\n\t\t\tif (dom === null || dom === void 0 ? void 0 : dom.editor) delete dom.editor;\n\t\t\tthis.editorView.destroy();\n\t\t}\n\t\tthis.editorView = null;\n\t\tthis.isInitialized = false;\n\t\tif (this.css && !document.querySelectorAll(`.${this.className}`).length) try {\n\t\t\tif (typeof this.css.remove === \"function\") this.css.remove();\n\t\t\telse if (this.css.parentNode) this.css.parentNode.removeChild(this.css);\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Failed to remove CSS element:\", error);\n\t\t}\n\t\tthis.css = null;\n\t\tthis.emit(\"unmount\", { editor: this });\n\t}\n\t/**\n\t* Returns the editor storage.\n\t*/\n\tget storage() {\n\t\treturn this.extensionStorage;\n\t}\n\t/**\n\t* An object of all registered commands.\n\t*/\n\tget commands() {\n\t\treturn this.commandManager.commands;\n\t}\n\t/**\n\t* Create a command chain to call multiple commands at once.\n\t*/\n\tchain() {\n\t\tif (!this.commandManager) return CommandManager.createFakeChain();\n\t\treturn this.commandManager.chain();\n\t}\n\t/**\n\t* Check if a command or a command chain can be executed. Without executing it.\n\t*/\n\tcan() {\n\t\tif (!this.commandManager) return CommandManager.createFallbackCan();\n\t\treturn this.commandManager.can();\n\t}\n\t/**\n\t* Inject CSS styles.\n\t*/\n\tinjectCSS() {\n\t\tif (this.options.injectCSS && typeof document !== \"undefined\") this.css = createStyleTag(style, this.options.injectNonce);\n\t}\n\t/**\n\t* Update editor options.\n\t*\n\t* @param options A list of options\n\t*/\n\tsetOptions(options = {}) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t\tif (!this.editorView || !this.state || this.isDestroyed) return;\n\t\tif (this.options.editorProps) this.view.setProps(this.options.editorProps);\n\t\tthis.view.updateState(this.state);\n\t}\n\t/**\n\t* Update editable state of the editor.\n\t*/\n\tsetEditable(editable, emitUpdate = true) {\n\t\tthis.setOptions({ editable });\n\t\tif (emitUpdate) this.emit(\"update\", {\n\t\t\teditor: this,\n\t\t\ttransaction: this.state.tr,\n\t\t\tappendedTransactions: []\n\t\t});\n\t}\n\t/**\n\t* Returns whether the editor is editable.\n\t*/\n\tget isEditable() {\n\t\treturn this.options.editable && this.view && this.view.editable;\n\t}\n\t/**\n\t* Returns the editor view.\n\t*/\n\tget view() {\n\t\tif (this.editorView) return this.editorView;\n\t\treturn new Proxy({\n\t\t\tstate: this.editorState,\n\t\t\tupdateState: (state) => {\n\t\t\t\tthis.editorState = state;\n\t\t\t},\n\t\t\tdispatch: (tr) => {\n\t\t\t\tthis.dispatchTransaction(tr);\n\t\t\t},\n\t\t\tcomposing: false,\n\t\t\tdragging: null,\n\t\t\teditable: true,\n\t\t\tisDestroyed: false\n\t\t}, { get: (obj, key) => {\n\t\t\tif (this.editorView) return this.editorView[key];\n\t\t\tif (key === \"state\") return this.editorState;\n\t\t\tif (key in obj) return Reflect.get(obj, key);\n\t\t\tthrow new Error(`[tiptap error]: The editor view is not available. Cannot access view['${key}']. The editor may not be mounted yet.`);\n\t\t} });\n\t}\n\t/**\n\t* Returns the editor state.\n\t*/\n\tget state() {\n\t\tif (isDev && !this.hasWarnedStaleDecorationRead && isInDecorationApplyScope(this)) {\n\t\t\tthis.hasWarnedStaleDecorationRead = true;\n\t\t\tconsole.warn(\"[tiptap warn]: `editor.state` was read while decoration `create()` was running. It returns the pre-transaction document. Use the `state` argument passed to `create()` instead. Helpers like `editor.isActive()` read `editor.state` too, so pass `state` to their standalone versions instead of calling them on the editor.\");\n\t\t}\n\t\tif (this.editorView) this.editorState = this.view.state;\n\t\treturn this.editorState;\n\t}\n\t/**\n\t* Register a ProseMirror plugin.\n\t*\n\t* @param plugin A ProseMirror plugin\n\t* @param handlePlugins Control how to merge the plugin into the existing plugins.\n\t* @returns The new editor state\n\t*/\n\tregisterPlugin(plugin, handlePlugins) {\n\t\tconst plugins = isFunction(handlePlugins) ? handlePlugins(plugin, [...this.state.plugins]) : [...this.state.plugins, plugin];\n\t\tconst state = this.state.reconfigure({ plugins });\n\t\tthis.view.updateState(state);\n\t\treturn state;\n\t}\n\t/**\n\t* Unregister a ProseMirror plugin.\n\t*\n\t* @param nameOrPluginKeyToRemove The plugins name\n\t* @returns The new editor state or undefined if the editor is destroyed\n\t*/\n\tunregisterPlugin(nameOrPluginKeyToRemove) {\n\t\tif (this.isDestroyed) return;\n\t\tconst prevPlugins = this.state.plugins;\n\t\tlet plugins = prevPlugins;\n\t\t[].concat(nameOrPluginKeyToRemove).forEach((nameOrPluginKey) => {\n\t\t\tconst name = typeof nameOrPluginKey === \"string\" ? `${nameOrPluginKey}$` : nameOrPluginKey.key;\n\t\t\tplugins = plugins.filter((plugin) => !plugin.key.startsWith(name));\n\t\t});\n\t\tif (prevPlugins.length === plugins.length) return;\n\t\tconst state = this.state.reconfigure({ plugins });\n\t\tthis.view.updateState(state);\n\t\treturn state;\n\t}\n\t/**\n\t* Creates an extension manager.\n\t*/\n\tcreateExtensionManager() {\n\t\tvar _this$options$coreExt, _this$options$coreExt2;\n\t\tconst allExtensions = [...this.options.enableCoreExtensions ? [\n\t\t\tEditable,\n\t\t\tClipboardTextSerializer.configure({ blockSeparator: (_this$options$coreExt = this.options.coreExtensionOptions) === null || _this$options$coreExt === void 0 || (_this$options$coreExt = _this$options$coreExt.clipboardTextSerializer) === null || _this$options$coreExt === void 0 ? void 0 : _this$options$coreExt.blockSeparator }),\n\t\t\tCommands,\n\t\t\tFocusEvents,\n\t\t\tKeymap,\n\t\t\tTabindex.configure({ value: (_this$options$coreExt2 = this.options.coreExtensionOptions) === null || _this$options$coreExt2 === void 0 || (_this$options$coreExt2 = _this$options$coreExt2.tabindex) === null || _this$options$coreExt2 === void 0 ? void 0 : _this$options$coreExt2.value }),\n\t\t\tDrop,\n\t\t\tPaste,\n\t\t\tDelete,\n\t\t\tTextDirection.configure({ direction: this.options.textDirection })\n\t\t].filter((ext) => {\n\t\t\tif (typeof this.options.enableCoreExtensions === \"object\") return this.options.enableCoreExtensions[ext.name] !== false;\n\t\t\treturn true;\n\t\t}) : [], ...this.options.extensions].filter((extension) => {\n\t\t\treturn [\n\t\t\t\t\"extension\",\n\t\t\t\t\"node\",\n\t\t\t\t\"mark\"\n\t\t\t].includes(extension === null || extension === void 0 ? void 0 : extension.type);\n\t\t});\n\t\tthis.extensionManager = new ExtensionManager(allExtensions, this);\n\t}\n\t/**\n\t* Creates an command manager.\n\t*/\n\tcreateCommandManager() {\n\t\tthis.commandManager = new CommandManager({ editor: this });\n\t}\n\t/**\n\t* Creates a ProseMirror schema.\n\t*/\n\tcreateSchema() {\n\t\tthis.schema = this.extensionManager.schema;\n\t}\n\t/**\n\t* Creates the initial document.\n\t*/\n\tcreateDoc() {\n\t\tlet doc;\n\t\ttry {\n\t\t\tdoc = createDocument(this.options.content, this.schema, this.options.parseOptions, { errorOnInvalidContent: this.options.enableContentCheck });\n\t\t} catch (e) {\n\t\t\tif (!(e instanceof Error) || ![\"[tiptap error]: Invalid JSON content\", \"[tiptap error]: Invalid HTML content\"].includes(e.message)) throw e;\n\t\t\tconst fallbackDoc = createDocument(this.options.content, this.schema, this.options.parseOptions, { errorOnInvalidContent: false });\n\t\t\tthis.editorState = EditorState.create({\n\t\t\t\tdoc: fallbackDoc,\n\t\t\t\tschema: this.schema,\n\t\t\t\tselection: resolveFocusPosition(fallbackDoc, this.options.autofocus) || void 0\n\t\t\t});\n\t\t\tthis.emit(\"contentError\", {\n\t\t\t\teditor: this,\n\t\t\t\terror: e,\n\t\t\t\tdisableCollaboration: () => {\n\t\t\t\t\tif (\"collaboration\" in this.storage && typeof this.storage.collaboration === \"object\" && this.storage.collaboration) this.storage.collaboration.isDisabled = true;\n\t\t\t\t\tthis.options.extensions = this.options.extensions.filter((extension) => extension.name !== \"collaboration\");\n\t\t\t\t\tthis.createExtensionManager();\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn this.editorState.doc;\n\t\t}\n\t\treturn doc;\n\t}\n\t/**\n\t* Creates a ProseMirror view.\n\t*/\n\tcreateView(element) {\n\t\tconst { editorProps, enableExtensionDispatchTransaction } = this.options;\n\t\tconst baseDispatch = editorProps.dispatchTransaction || this.dispatchTransaction.bind(this);\n\t\tconst dispatch = enableExtensionDispatchTransaction ? this.extensionManager.dispatchTransaction(baseDispatch) : baseDispatch;\n\t\tconst baseTransformPastedHTML = editorProps.transformPastedHTML;\n\t\tconst transformPastedHTML = this.extensionManager.transformPastedHTML(baseTransformPastedHTML);\n\t\tthis.editorView = new EditorView(element, {\n\t\t\t...editorProps,\n\t\t\tattributes: {\n\t\t\t\trole: \"textbox\",\n\t\t\t\t...editorProps === null || editorProps === void 0 ? void 0 : editorProps.attributes\n\t\t\t},\n\t\t\tdispatchTransaction: dispatch,\n\t\t\ttransformPastedHTML,\n\t\t\tstate: this.editorState,\n\t\t\tmarkViews: this.extensionManager.markViews,\n\t\t\tnodeViews: this.extensionManager.nodeViews\n\t\t});\n\t\tconst newState = this.state.reconfigure({ plugins: this.extensionManager.plugins });\n\t\tthis.view.updateState(newState);\n\t\tthis.prependClass();\n\t\tthis.injectCSS();\n\t\tconst dom = this.view.dom;\n\t\tdom.editor = this;\n\t}\n\t/**\n\t* Creates all node and mark views.\n\t*/\n\tcreateNodeViews() {\n\t\tif (this.view.isDestroyed) return;\n\t\tthis.view.setProps({\n\t\t\tmarkViews: this.extensionManager.markViews,\n\t\t\tnodeViews: this.extensionManager.nodeViews\n\t\t});\n\t}\n\t/**\n\t* Prepend class name to element.\n\t*/\n\tprependClass() {\n\t\tthis.view.dom.className = `${this.className} ${this.view.dom.className}`;\n\t}\n\tcaptureTransaction(fn) {\n\t\tthis.isCapturingTransaction = true;\n\t\tfn();\n\t\tthis.isCapturingTransaction = false;\n\t\tconst tr = this.capturedTransaction;\n\t\tthis.capturedTransaction = null;\n\t\treturn tr;\n\t}\n\t/**\n\t* The callback over which to send transactions (state updates) produced by the view.\n\t*\n\t* @param transaction An editor state transaction\n\t*/\n\tdispatchTransaction(transaction) {\n\t\tif (this.view.isDestroyed) return;\n\t\tif (this.isCapturingTransaction) {\n\t\t\tif (!this.capturedTransaction) {\n\t\t\t\tthis.capturedTransaction = transaction;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttransaction.steps.forEach((step) => {\n\t\t\t\tvar _this$capturedTransac;\n\t\t\t\treturn (_this$capturedTransac = this.capturedTransaction) === null || _this$capturedTransac === void 0 ? void 0 : _this$capturedTransac.step(step);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tconst { state, transactions } = this.state.applyTransaction(transaction);\n\t\tconst selectionHasChanged = !this.state.selection.eq(state.selection);\n\t\tconst rootTrWasApplied = transactions.includes(transaction);\n\t\tconst prevState = this.state;\n\t\tthis.emit(\"beforeTransaction\", {\n\t\t\teditor: this,\n\t\t\ttransaction,\n\t\t\tnextState: state\n\t\t});\n\t\tif (!rootTrWasApplied) return;\n\t\tthis.view.updateState(state);\n\t\tthis.emit(\"transaction\", {\n\t\t\teditor: this,\n\t\t\ttransaction,\n\t\t\tappendedTransactions: transactions.slice(1)\n\t\t});\n\t\tif (selectionHasChanged) this.emit(\"selectionUpdate\", {\n\t\t\teditor: this,\n\t\t\ttransaction\n\t\t});\n\t\tconst mostRecentFocusTr = transactions.findLast((tr) => tr.getMeta(\"focus\") || tr.getMeta(\"blur\"));\n\t\tconst focus = mostRecentFocusTr === null || mostRecentFocusTr === void 0 ? void 0 : mostRecentFocusTr.getMeta(\"focus\");\n\t\tconst blur = mostRecentFocusTr === null || mostRecentFocusTr === void 0 ? void 0 : mostRecentFocusTr.getMeta(\"blur\");\n\t\tif (focus) this.emit(\"focus\", {\n\t\t\teditor: this,\n\t\t\tevent: focus.event,\n\t\t\ttransaction: mostRecentFocusTr\n\t\t});\n\t\tif (blur) this.emit(\"blur\", {\n\t\t\teditor: this,\n\t\t\tevent: blur.event,\n\t\t\ttransaction: mostRecentFocusTr\n\t\t});\n\t\tif (transaction.getMeta(\"preventUpdate\") || !transactions.some((tr) => tr.docChanged) || prevState.doc.eq(state.doc)) return;\n\t\tthis.emit(\"update\", {\n\t\t\teditor: this,\n\t\t\ttransaction,\n\t\t\tappendedTransactions: transactions.slice(1)\n\t\t});\n\t}\n\t/**\n\t* Get attributes of the currently selected node or mark.\n\t*/\n\tgetAttributes(nameOrType) {\n\t\treturn getAttributes(this.state, nameOrType);\n\t}\n\tisActive(nameOrAttributes, attributesOrUndefined) {\n\t\tconst name = typeof nameOrAttributes === \"string\" ? nameOrAttributes : null;\n\t\tconst attributes = typeof nameOrAttributes === \"string\" ? attributesOrUndefined : nameOrAttributes;\n\t\treturn isActive(this.state, name, attributes);\n\t}\n\t/**\n\t* Get the document as JSON.\n\t*/\n\tgetJSON() {\n\t\treturn this.state.doc.toJSON();\n\t}\n\t/**\n\t* Get the document as HTML.\n\t*/\n\tgetHTML() {\n\t\treturn getHTMLFromFragment(this.state.doc.content, this.schema);\n\t}\n\t/**\n\t* Get the document as text.\n\t*/\n\tgetText(options) {\n\t\tconst { blockSeparator = \"\\n\\n\", textSerializers = {} } = options || {};\n\t\treturn getText(this.state.doc, {\n\t\t\tblockSeparator,\n\t\t\ttextSerializers: {\n\t\t\t\t...getTextSerializersFromSchema(this.schema),\n\t\t\t\t...textSerializers\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* Check if there is no content.\n\t*/\n\tget isEmpty() {\n\t\treturn isNodeEmpty(this.state.doc);\n\t}\n\t/**\n\t* Destroy the editor.\n\t*/\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\t\tthis.destroyed = true;\n\t\tthis.emit(\"destroy\");\n\t\tthis.unmount();\n\t\tthis.removeAllListeners();\n\t\tthis.extensionManager.destroy();\n\t\tthis.extensionManager = null;\n\t\tthis.schema = null;\n\t\tthis.commandManager = null;\n\t\tthis.extensionStorage = {};\n\t}\n\t/**\n\t* Check if the editor is already destroyed.\n\t*/\n\tget isDestroyed() {\n\t\tvar _this$editorView$isDe, _this$editorView;\n\t\treturn (_this$editorView$isDe = (_this$editorView = this.editorView) === null || _this$editorView === void 0 ? void 0 : _this$editorView.isDestroyed) !== null && _this$editorView$isDe !== void 0 ? _this$editorView$isDe : true;\n\t}\n\t$node(selector, attributes) {\n\t\tvar _this$$doc;\n\t\treturn ((_this$$doc = this.$doc) === null || _this$$doc === void 0 ? void 0 : _this$$doc.querySelector(selector, attributes)) || null;\n\t}\n\t$nodes(selector, attributes) {\n\t\tvar _this$$doc2;\n\t\treturn ((_this$$doc2 = this.$doc) === null || _this$$doc2 === void 0 ? void 0 : _this$$doc2.querySelectorAll(selector, attributes)) || null;\n\t}\n\t$pos(pos) {\n\t\tconst $pos = this.state.doc.resolve(pos);\n\t\tconst node = pos > 0 && $pos.nodeAfter && !$pos.nodeAfter.isText && $pos.nodeAfter.isAtom ? $pos.nodeAfter : null;\n\t\treturn new NodePos($pos, this, false, node);\n\t}\n\tget $doc() {\n\t\treturn this.$pos(0);\n\t}\n};\n//#endregion\n//#region src/decorations/Decoration.ts\n/**\n* Base class for decorations built in `addDecorations()`. Shadows `Decoration`\n* from `@tiptap/pm/view`, like core's `Node` and `Mark` do, so alias one of them\n* in files that need both.\n*\n* @example\n* import { Decoration } from '@tiptap/core'\n* import { Decoration as PMDecoration } from '@tiptap/pm/view'\n*\n* const highlight = Decoration.Inline(1, 5, { class: 'highlight' })\n*/\nvar Decoration = class {\n\tstatic Inline(from, to, attrs = {}, spec) {\n\t\treturn new InlineDecoration(from, to, attrs, spec);\n\t}\n\tstatic Node(pos, to, attrs = {}, spec) {\n\t\treturn new NodeDecoration(pos, to, attrs, spec);\n\t}\n\t/**\n\t* Creates a widget decoration: a DOM node drawn at a document position.\n\t*\n\t* The `key` is the widget's identity. While it stays the same, ProseMirror\n\t* keeps the widget mounted and only its position tracks the document.\n\t* `render`, `side`, `destroy` and other options are fixed on first mount.\n\t* Change the key to remount with new options.\n\t*\n\t* @param pos The document position where the widget is drawn.\n\t* @param render Called once on first mount. Returns the DOM node.\n\t* @param options Must include a unique `key`. See `WidgetDecorationOptions`.\n\t* @returns The widget decoration.\n\t*/\n\tstatic Widget(pos, render, options) {\n\t\tconst { key, ...spec } = options;\n\t\treturn new WidgetDecoration(pos, render, key, spec);\n\t}\n};\n/**\n* Represents an inline decoration (text-level highlighting, etc.).\n*/\nvar InlineDecoration = class extends Decoration {\n\tconstructor(from, to, attrs = {}, spec) {\n\t\tsuper();\n\t\tthis.kind = \"inline\";\n\t\tthis.from = from;\n\t\tthis.to = to;\n\t\tthis.attrs = attrs;\n\t\tthis.spec = spec;\n\t}\n\tget anchor() {\n\t\treturn this.from;\n\t}\n\ttoPMDecoration(extensionName) {\n\t\tconst spec = extensionName ? {\n\t\t\t...this.spec,\n\t\t\textensionName\n\t\t} : this.spec;\n\t\treturn Decoration$1.inline(this.from, this.to, this.attrs, spec);\n\t}\n};\n/**\n* Represents a node-level decoration (block-level highlights, etc.).\n*/\nvar NodeDecoration = class extends Decoration {\n\tconstructor(pos, to, attrs = {}, spec) {\n\t\tsuper();\n\t\tthis.kind = \"node\";\n\t\tthis.from = pos;\n\t\tthis.to = to;\n\t\tthis.attrs = attrs;\n\t\tthis.spec = spec;\n\t}\n\tget anchor() {\n\t\treturn this.from;\n\t}\n\ttoPMDecoration(extensionName) {\n\t\tconst spec = extensionName ? {\n\t\t\t...this.spec,\n\t\t\textensionName\n\t\t} : this.spec;\n\t\treturn Decoration$1.node(this.from, this.to, this.attrs, spec);\n\t}\n};\n/**\n* Represents a widget decoration (inline widgets, etc.).\n*/\nvar WidgetDecoration = class extends Decoration {\n\tconstructor(pos, render, key, spec) {\n\t\tsuper();\n\t\tthis.kind = \"widget\";\n\t\tthis.pos = pos;\n\t\tthis.render = render;\n\t\tthis.key = key;\n\t\tthis.spec = spec;\n\t}\n\tget anchor() {\n\t\treturn this.pos;\n\t}\n\ttoPMDecoration(extensionName) {\n\t\tconst spec = extensionName ? {\n\t\t\t...this.spec,\n\t\t\tkey: this.key,\n\t\t\textensionName\n\t\t} : {\n\t\t\t...this.spec,\n\t\t\tkey: this.key\n\t\t};\n\t\treturn Decoration$1.widget(this.pos, this.render, spec);\n\t}\n};\n//#endregion\n//#region src/decorations/createWidgetDecoration.ts\nfunction getCache(editor, cacheKey) {\n\tconst host = editor;\n\tlet cache = host[cacheKey];\n\tif (!cache) {\n\t\tcache = {\n\t\t\trenderers: /* @__PURE__ */ new Map(),\n\t\t\tprops: /* @__PURE__ */ new Map(),\n\t\t\tpendingProps: /* @__PURE__ */ new Map(),\n\t\t\tflushScheduled: false\n\t\t};\n\t\thost[cacheKey] = cache;\n\t\tconst sweep = cache;\n\t\teditor.on(\"destroy\", () => {\n\t\t\tsweep.pendingProps.clear();\n\t\t\tsweep.renderers.forEach((renderer) => renderer.destroy());\n\t\t\tsweep.renderers.clear();\n\t\t\tsweep.props.clear();\n\t\t});\n\t}\n\treturn cache;\n}\nfunction flushPendingProps(cache) {\n\tcache.flushScheduled = false;\n\tfor (const [key, props] of cache.pendingProps) {\n\t\tconst renderer = cache.renderers.get(key);\n\t\tif (renderer) {\n\t\t\trenderer.updateProps(props);\n\t\t\tcache.props.set(key, { ...props });\n\t\t}\n\t}\n\tcache.pendingProps.clear();\n}\n/**\n* Builds a widget decoration backed by a framework component renderer.\n*\n* Owns everything that is not framework specific: the per-editor renderer\n* cache, prop diffing, the deferred prop flush, the key reassignment guard and\n* the ProseMirror option pass-through. Framework packages supply only `create`,\n* `context` and `materialize`.\n*\n* @param options The widget options plus the three framework hooks.\n* @returns The widget decoration to return from `addDecorations`.\n* @example\n* createWidgetDecoration<ReactRenderer>({\n*   editor, pos, key, props, cacheKey: WIDGET_CACHE,\n*   context: getPos => ({ editor, getPos }),\n*   create: renderProps => new ReactRenderer(component, { editor, props: renderProps }),\n*   materialize: renderer => renderer.element,\n* })\n*/\nfunction createWidgetDecoration(options) {\n\tconst { editor, pos, key, props, cacheKey, context, create, materialize, side, relaxedSide, marks, stopEvent, ignoreSelection, destroy } = options;\n\tconst cache = getCache(editor, cacheKey);\n\tif (cache.renderers.has(key)) {\n\t\tvar _cache$pendingProps$g;\n\t\tconst previous = (_cache$pendingProps$g = cache.pendingProps.get(key)) !== null && _cache$pendingProps$g !== void 0 ? _cache$pendingProps$g : cache.props.get(key);\n\t\tif (!previous || !attrsEqual(previous, props)) {\n\t\t\tcache.pendingProps.set(key, props);\n\t\t\tif (!cache.flushScheduled) {\n\t\t\t\tcache.flushScheduled = true;\n\t\t\t\tqueueMicrotask(() => flushPendingProps(cache));\n\t\t\t}\n\t\t}\n\t}\n\tconst render = (_view, getPos) => {\n\t\tconst renderProps = {\n\t\t\t...props,\n\t\t\t...context(getPos)\n\t\t};\n\t\tlet renderer = cache.renderers.get(key);\n\t\tif (renderer) renderer.updateProps(renderProps);\n\t\telse {\n\t\t\trenderer = create(renderProps);\n\t\t\tcache.renderers.set(key, renderer);\n\t\t\tcache.props.set(key, { ...props });\n\t\t}\n\t\treturn materialize(renderer);\n\t};\n\treturn Decoration.Widget(pos, render, {\n\t\tkey,\n\t\tside,\n\t\trelaxedSide,\n\t\tmarks,\n\t\tstopEvent,\n\t\tignoreSelection,\n\t\tdestroy: (rendererElement) => {\n\t\t\tif (liveWidgetKeys(editor).has(key)) return;\n\t\t\ttry {\n\t\t\t\tvar _cache$renderers$get;\n\t\t\t\t(_cache$renderers$get = cache.renderers.get(key)) === null || _cache$renderers$get === void 0 || _cache$renderers$get.destroy();\n\t\t\t\tcache.renderers.delete(key);\n\t\t\t\tcache.props.delete(key);\n\t\t\t\tcache.pendingProps.delete(key);\n\t\t\t} finally {\n\t\t\t\tdestroy === null || destroy === void 0 || destroy(rendererElement);\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\n//#region src/inputRules/markInputRule.ts\n/**\n* Build an input rule that adds a mark when the\n* matched text is typed into it.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#input-rules\n*/\nfunction markInputRule(config) {\n\treturn new InputRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match }) => {\n\t\t\tconst attributes = callOrReturn(config.getAttributes, void 0, match);\n\t\t\tif (attributes === false || attributes === null) return null;\n\t\t\tconst { tr } = state;\n\t\t\tconst captureGroup = match[match.length - 1];\n\t\t\tconst fullMatch = match[0];\n\t\t\tif (captureGroup) {\n\t\t\t\tconst startSpaces = fullMatch.search(/\\S/);\n\t\t\t\tconst textStart = range.from + fullMatch.indexOf(captureGroup);\n\t\t\t\tconst textEnd = textStart + captureGroup.length;\n\t\t\t\tif (getMarksBetween(range.from, range.to, state.doc).filter((item) => {\n\t\t\t\t\treturn item.mark.type.excluded.find((type) => type === config.type && type !== item.mark.type);\n\t\t\t\t}).filter((item) => item.to > textStart).length) return null;\n\t\t\t\tif (textEnd < range.to) tr.delete(textEnd, range.to);\n\t\t\t\tif (textStart > range.from) tr.delete(range.from + startSpaces, textStart);\n\t\t\t\tconst markEnd = range.from + startSpaces + captureGroup.length;\n\t\t\t\ttr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));\n\t\t\t\ttr.removeStoredMark(config.type);\n\t\t\t}\n\t\t},\n\t\tundoable: config.undoable\n\t});\n}\n//#endregion\n//#region src/inputRules/nodeInputRule.ts\n/**\n* Build an input rule that adds a node when the\n* matched text is typed into it.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#input-rules\n*/\nfunction nodeInputRule(config) {\n\treturn new InputRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match }) => {\n\t\t\tconst attributes = callOrReturn(config.getAttributes, void 0, match) || {};\n\t\t\tconst { tr } = state;\n\t\t\tconst start = range.from;\n\t\t\tlet end = range.to;\n\t\t\tconst newNode = config.type.create(attributes);\n\t\t\tif (match[1]) {\n\t\t\t\tlet matchStart = start + match[0].lastIndexOf(match[1]);\n\t\t\t\tif (matchStart > end) matchStart = end;\n\t\t\t\telse end = matchStart + match[1].length;\n\t\t\t\tconst lastChar = match[0][match[0].length - 1];\n\t\t\t\ttr.insertText(lastChar, start + match[0].length - 1);\n\t\t\t\ttr.replaceWith(matchStart, end, newNode);\n\t\t\t} else if (match[0]) {\n\t\t\t\tconst insertionStart = config.type.isInline ? start : start - 1;\n\t\t\t\ttr.insert(insertionStart, config.type.create(attributes)).delete(tr.mapping.map(start), tr.mapping.map(end));\n\t\t\t}\n\t\t\ttr.scrollIntoView();\n\t\t},\n\t\tundoable: config.undoable\n\t});\n}\n//#endregion\n//#region src/inputRules/textblockTypeInputRule.ts\n/**\n* Build an input rule that changes the type of a textblock when the\n* matched text is typed into it. When using a regular expresion you’ll\n* probably want the regexp to start with `^`, so that the pattern can\n* only occur at the start of a textblock.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#input-rules\n*/\nfunction textblockTypeInputRule(config) {\n\treturn new InputRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match }) => {\n\t\t\tconst $start = state.doc.resolve(range.from);\n\t\t\tconst attributes = callOrReturn(config.getAttributes, void 0, match) || {};\n\t\t\tif (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) return null;\n\t\t\tstate.tr.delete(range.from, range.to).setBlockType(range.from, range.from, config.type, attributes);\n\t\t},\n\t\tundoable: config.undoable\n\t});\n}\n//#endregion\n//#region src/inputRules/textInputRule.ts\n/**\n* Build an input rule that replaces text when the\n* matched text is typed into it.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#input-rules\n*/\nfunction textInputRule(config) {\n\treturn new InputRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match }) => {\n\t\t\tlet insert = config.replace;\n\t\t\tlet start = range.from;\n\t\t\tconst end = range.to;\n\t\t\tif (match[1]) {\n\t\t\t\tconst offset = match[0].lastIndexOf(match[1]);\n\t\t\t\tinsert += match[0].slice(offset + match[1].length);\n\t\t\t\tstart += offset;\n\t\t\t\tconst cutOff = start - end;\n\t\t\t\tif (cutOff > 0) {\n\t\t\t\t\tinsert = match[0].slice(offset - cutOff, offset) + insert;\n\t\t\t\t\tstart = end;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.tr.insertText(insert, start, end);\n\t\t},\n\t\tundoable: config.undoable\n\t});\n}\n//#endregion\n//#region src/inputRules/wrappingInputRule.ts\n/**\n* Build an input rule for automatically wrapping a textblock when a\n* given string is typed. When using a regular expresion you’ll\n* probably want the regexp to start with `^`, so that the pattern can\n* only occur at the start of a textblock.\n*\n* `type` is the type of node to wrap in.\n*\n* By default, if there’s a node with the same type above the newly\n* wrapped node, the rule will try to join those\n* two nodes. You can pass a join predicate, which takes a regular\n* expression match and the node before the wrapped node, and can\n* return a boolean to indicate whether a join should happen.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#input-rules\n*/\nfunction wrappingInputRule(config) {\n\treturn new InputRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match, chain }) => {\n\t\t\tconst attributes = callOrReturn(config.getAttributes, void 0, match) || {};\n\t\t\tconst tr = state.tr.delete(range.from, range.to);\n\t\t\tconst blockRange = tr.doc.resolve(range.from).blockRange();\n\t\t\tconst wrapping = blockRange && findWrapping(blockRange, config.type, attributes);\n\t\t\tif (!wrapping) return null;\n\t\t\ttr.wrap(blockRange, wrapping);\n\t\t\tif (config.keepMarks && config.editor) {\n\t\t\t\tconst { selection, storedMarks } = state;\n\t\t\t\tconst { splittableMarks } = config.editor.extensionManager;\n\t\t\t\tconst marks = storedMarks || selection.$to.parentOffset && selection.$from.marks();\n\t\t\t\tif (marks) {\n\t\t\t\t\tconst filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name));\n\t\t\t\t\ttr.ensureMarks(filteredMarks);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (config.keepAttributes) {\n\t\t\t\t/** If the nodeType is `bulletList` or `orderedList` set the `nodeType` as `listItem` */\n\t\t\t\tconst nodeType = config.type.name === \"bulletList\" || config.type.name === \"orderedList\" ? \"listItem\" : \"taskList\";\n\t\t\t\tchain().updateAttributes(nodeType, attributes).run();\n\t\t\t}\n\t\t\tconst before = tr.doc.resolve(range.from - 1).nodeBefore;\n\t\t\tif (before && before.type === config.type && canJoin(tr.doc, range.from - 1) && (!config.joinPredicate || config.joinPredicate(match, before))) tr.join(range.from - 1);\n\t\t},\n\t\tundoable: config.undoable\n\t});\n}\n//#endregion\n//#region src/jsx-runtime.ts\nconst jsxElements = /* @__PURE__ */ new WeakSet();\nconst jsxFragments = /* @__PURE__ */ new WeakSet();\n/** Create a new JSX element from the given spec */\nfunction createJSXElement(spec) {\n\tconst element = spec;\n\tjsxElements.add(element);\n\treturn element;\n}\n/** Check if a spec is a JSX element */\nfunction isJSXElement(value) {\n\treturn Array.isArray(value) && jsxElements.has(value);\n}\nfunction flattenFragmentChildren(children) {\n\treturn children.flatMap((child) => {\n\t\tif (child == null) return [];\n\t\tif (Array.isArray(child) && jsxFragments.has(child) && !isJSXElement(child)) return flattenFragmentChildren(child);\n\t\treturn [child];\n\t});\n}\nfunction Fragment(props) {\n\tjsxFragments.add(props.children);\n\treturn props.children;\n}\nfunction render(tag, attributes) {\n\tif (tag === \"slot\") return 0;\n\tif (tag instanceof Function) {\n\t\tconst result = tag(attributes);\n\t\tif (Array.isArray(result) && !isJSXElement(result) && !jsxFragments.has(result)) return createJSXElement(result);\n\t\treturn result;\n\t}\n\tconst { children, ...rest } = attributes !== null && attributes !== void 0 ? attributes : {};\n\tif (tag === \"svg\") throw new Error(\"SVG elements are not supported in the JSX syntax, use the array syntax instead\");\n\tif (Array.isArray(children)) {\n\t\tif (isJSXElement(children)) return createJSXElement([\n\t\t\ttag,\n\t\t\trest,\n\t\t\tchildren\n\t\t]);\n\t\tif (children.length === 0) return createJSXElement([tag, rest]);\n\t\tconst flattenedChildren = flattenFragmentChildren(children);\n\t\tif (flattenedChildren.length === 0) return createJSXElement([tag, rest]);\n\t\treturn createJSXElement([\n\t\t\ttag,\n\t\t\trest,\n\t\t\t...flattenedChildren\n\t\t]);\n\t}\n\tif (children !== void 0 && children !== null) return createJSXElement([\n\t\ttag,\n\t\trest,\n\t\tchildren\n\t]);\n\treturn createJSXElement([tag, rest]);\n}\nconst h = (tag, attributes) => render(tag, attributes);\n//#endregion\n//#region src/lib/ResizableNodeView.ts\nconst isTouchEvent = (e) => {\n\treturn \"touches\" in e;\n};\n/**\n* A NodeView implementation that adds resize handles to any DOM element.\n*\n* This class creates a resizable node view for Tiptap/ProseMirror editors.\n* It wraps your element with resize handles and manages the resize interaction,\n* including aspect ratio preservation, min/max constraints, and keyboard modifiers.\n*\n* @example\n* ```ts\n* // Basic usage in a Tiptap extension\n* addNodeView() {\n*   return ({ node, getPos }) => {\n*     const img = document.createElement('img')\n*     img.src = node.attrs.src\n*\n*     return new ResizableNodeView({\n*       element: img,\n*       node,\n*       getPos,\n*       onResize: (width, height) => {\n*         img.style.width = `${width}px`\n*         img.style.height = `${height}px`\n*       },\n*       onCommit: (width, height) => {\n*         this.editor.commands.updateAttributes('image', { width, height })\n*       },\n*       onUpdate: () => true,\n*       options: {\n*         min: { width: 100, height: 100 },\n*         preserveAspectRatio: true\n*       }\n*     })\n*   }\n* }\n* ```\n*/\nvar ResizableNodeView = class {\n\t/**\n\t* Creates a new ResizableNodeView instance.\n\t*\n\t* The constructor sets up the resize handles, applies initial sizing from\n\t* node attributes, and configures all resize behavior options.\n\t*\n\t* @param options - Configuration options for the resizable node view\n\t*/\n\tconstructor(options) {\n\t\tvar _options$options, _options$options2, _options$options3, _options$options4, _options$options5, _options$options6;\n\t\tthis.directions = [\n\t\t\t\"bottom-left\",\n\t\t\t\"bottom-right\",\n\t\t\t\"top-left\",\n\t\t\t\"top-right\"\n\t\t];\n\t\tthis.minSize = {\n\t\t\theight: 8,\n\t\t\twidth: 8\n\t\t};\n\t\tthis.preserveAspectRatio = false;\n\t\tthis.classNames = {\n\t\t\tcontainer: \"\",\n\t\t\twrapper: \"\",\n\t\t\thandle: \"\",\n\t\t\tresizing: \"\"\n\t\t};\n\t\tthis.initialWidth = 0;\n\t\tthis.initialHeight = 0;\n\t\tthis.aspectRatio = 1;\n\t\tthis.isResizing = false;\n\t\tthis.activeHandle = null;\n\t\tthis.startX = 0;\n\t\tthis.startY = 0;\n\t\tthis.startWidth = 0;\n\t\tthis.startHeight = 0;\n\t\tthis.isShiftKeyPressed = false;\n\t\tthis.lastEditableState = void 0;\n\t\tthis.handleMap = /* @__PURE__ */ new Map();\n\t\tthis.handleMouseMove = (event) => {\n\t\t\tif (!this.isResizing || !this.activeHandle) return;\n\t\t\tconst deltaX = event.clientX - this.startX;\n\t\t\tconst deltaY = event.clientY - this.startY;\n\t\t\tthis.handleResize(deltaX, deltaY);\n\t\t};\n\t\tthis.handleTouchMove = (event) => {\n\t\t\tif (!this.isResizing || !this.activeHandle) return;\n\t\t\tconst touch = event.touches[0];\n\t\t\tif (!touch) return;\n\t\t\tconst deltaX = touch.clientX - this.startX;\n\t\t\tconst deltaY = touch.clientY - this.startY;\n\t\t\tthis.handleResize(deltaX, deltaY);\n\t\t};\n\t\tthis.handleMouseUp = () => {\n\t\t\tif (!this.isResizing) return;\n\t\t\tconst finalWidth = this.element.offsetWidth;\n\t\t\tconst finalHeight = this.element.offsetHeight;\n\t\t\tthis.onCommit(finalWidth, finalHeight);\n\t\t\tthis.isResizing = false;\n\t\t\tthis.activeHandle = null;\n\t\t\tthis.container.dataset.resizeState = \"false\";\n\t\t\tif (this.classNames.resizing) this.container.classList.remove(this.classNames.resizing);\n\t\t\tdocument.removeEventListener(\"mousemove\", this.handleMouseMove);\n\t\t\tdocument.removeEventListener(\"mouseup\", this.handleMouseUp);\n\t\t\tdocument.removeEventListener(\"keydown\", this.handleKeyDown);\n\t\t\tdocument.removeEventListener(\"keyup\", this.handleKeyUp);\n\t\t};\n\t\tthis.handleKeyDown = (event) => {\n\t\t\tif (event.key === \"Shift\") this.isShiftKeyPressed = true;\n\t\t};\n\t\tthis.handleKeyUp = (event) => {\n\t\t\tif (event.key === \"Shift\") this.isShiftKeyPressed = false;\n\t\t};\n\t\tthis.node = options.node;\n\t\tthis.editor = options.editor;\n\t\tthis.element = options.element;\n\t\tthis.element.draggable = false;\n\t\tthis.contentElement = options.contentElement;\n\t\tthis.getPos = options.getPos;\n\t\tthis.onResize = options.onResize;\n\t\tthis.onCommit = options.onCommit;\n\t\tthis.onUpdate = options.onUpdate;\n\t\tif ((_options$options = options.options) === null || _options$options === void 0 ? void 0 : _options$options.min) this.minSize = {\n\t\t\t...this.minSize,\n\t\t\t...options.options.min\n\t\t};\n\t\tif ((_options$options2 = options.options) === null || _options$options2 === void 0 ? void 0 : _options$options2.max) this.maxSize = options.options.max;\n\t\tif (options === null || options === void 0 || (_options$options3 = options.options) === null || _options$options3 === void 0 ? void 0 : _options$options3.directions) this.directions = options.options.directions;\n\t\tif ((_options$options4 = options.options) === null || _options$options4 === void 0 ? void 0 : _options$options4.preserveAspectRatio) this.preserveAspectRatio = options.options.preserveAspectRatio;\n\t\tif ((_options$options5 = options.options) === null || _options$options5 === void 0 ? void 0 : _options$options5.className) this.classNames = {\n\t\t\tcontainer: options.options.className.container || \"\",\n\t\t\twrapper: options.options.className.wrapper || \"\",\n\t\t\thandle: options.options.className.handle || \"\",\n\t\t\tresizing: options.options.className.resizing || \"\"\n\t\t};\n\t\tif ((_options$options6 = options.options) === null || _options$options6 === void 0 ? void 0 : _options$options6.createCustomHandle) this.createCustomHandle = options.options.createCustomHandle;\n\t\tthis.wrapper = this.createWrapper();\n\t\tthis.container = this.createContainer();\n\t\tthis.applyInitialSize();\n\t\tthis.attachHandles();\n\t\tthis.editor.on(\"update\", this.handleEditorUpdate.bind(this));\n\t}\n\t/**\n\t* Returns the top-level DOM node that should be placed in the editor.\n\t*\n\t* This is required by the ProseMirror NodeView interface. The container\n\t* includes the wrapper, handles, and the actual content element.\n\t*\n\t* @returns The container element to be inserted into the editor\n\t*/\n\tget dom() {\n\t\treturn this.container;\n\t}\n\tget contentDOM() {\n\t\tvar _this$contentElement;\n\t\treturn (_this$contentElement = this.contentElement) !== null && _this$contentElement !== void 0 ? _this$contentElement : null;\n\t}\n\thandleEditorUpdate() {\n\t\tconst isEditable = this.editor.isEditable;\n\t\tif (isEditable === this.lastEditableState) return;\n\t\tthis.lastEditableState = isEditable;\n\t\tif (!isEditable) this.removeHandles();\n\t\telse if (isEditable && this.handleMap.size === 0) this.attachHandles();\n\t}\n\t/**\n\t* Called when the node's content or attributes change.\n\t*\n\t* Updates the internal node reference. If a custom `onUpdate` callback\n\t* was provided, it will be called to handle additional update logic.\n\t*\n\t* @param node - The new/updated node\n\t* @param decorations - Node decorations\n\t* @param innerDecorations - Inner decorations\n\t* @returns `false` if the node type has changed (requires full rebuild), otherwise the result of `onUpdate` or `true`\n\t*/\n\tupdate(node, decorations, innerDecorations) {\n\t\tif (node.type !== this.node.type) return false;\n\t\tthis.node = node;\n\t\tif (this.onUpdate) return this.onUpdate(node, decorations, innerDecorations);\n\t\treturn true;\n\t}\n\t/**\n\t* Cleanup method called when the node view is being removed.\n\t*\n\t* Removes all event listeners to prevent memory leaks. This is required\n\t* by the ProseMirror NodeView interface. If a resize is active when\n\t* destroy is called, it will be properly cancelled.\n\t*/\n\tdestroy() {\n\t\tif (this.isResizing) {\n\t\t\tthis.container.dataset.resizeState = \"false\";\n\t\t\tif (this.classNames.resizing) this.container.classList.remove(this.classNames.resizing);\n\t\t\tdocument.removeEventListener(\"mousemove\", this.handleMouseMove);\n\t\t\tdocument.removeEventListener(\"mouseup\", this.handleMouseUp);\n\t\t\tdocument.removeEventListener(\"keydown\", this.handleKeyDown);\n\t\t\tdocument.removeEventListener(\"keyup\", this.handleKeyUp);\n\t\t\tthis.isResizing = false;\n\t\t\tthis.activeHandle = null;\n\t\t}\n\t\tthis.editor.off(\"update\", this.handleEditorUpdate.bind(this));\n\t\tthis.container.remove();\n\t}\n\t/**\n\t* Creates the outer container element.\n\t*\n\t* The container is the top-level element returned by the NodeView and\n\t* wraps the entire resizable node. It's set up with flexbox to handle\n\t* alignment and includes data attributes for styling and identification.\n\t*\n\t* @returns The container element\n\t*/\n\tcreateContainer() {\n\t\tconst element = document.createElement(\"div\");\n\t\telement.dataset.resizeContainer = \"\";\n\t\telement.dataset.node = this.node.type.name;\n\t\telement.style.display = this.node.type.isInline ? \"inline-flex\" : \"flex\";\n\t\tif (this.classNames.container) element.className = this.classNames.container;\n\t\telement.appendChild(this.wrapper);\n\t\treturn element;\n\t}\n\t/**\n\t* Creates the wrapper element that contains the content and handles.\n\t*\n\t* The wrapper uses relative positioning so that resize handles can be\n\t* positioned absolutely within it. This is the direct parent of the\n\t* content element being made resizable.\n\t*\n\t* @returns The wrapper element\n\t*/\n\tcreateWrapper() {\n\t\tconst element = document.createElement(\"div\");\n\t\telement.style.position = \"relative\";\n\t\telement.style.display = \"block\";\n\t\telement.dataset.resizeWrapper = \"\";\n\t\tif (this.classNames.wrapper) element.className = this.classNames.wrapper;\n\t\telement.appendChild(this.element);\n\t\treturn element;\n\t}\n\t/**\n\t* Creates a resize handle element for a specific direction.\n\t*\n\t* Each handle is absolutely positioned and includes a data attribute\n\t* identifying its direction for styling purposes.\n\t*\n\t* @param direction - The resize direction for this handle\n\t* @returns The handle element\n\t*/\n\tcreateHandle(direction) {\n\t\tconst handle = document.createElement(\"div\");\n\t\thandle.dataset.resizeHandle = direction;\n\t\thandle.style.position = \"absolute\";\n\t\tif (this.classNames.handle) handle.className = this.classNames.handle;\n\t\treturn handle;\n\t}\n\t/**\n\t* Positions a handle element according to its direction.\n\t*\n\t* Corner handles (e.g., 'top-left') are positioned at the intersection\n\t* of two edges. Edge handles (e.g., 'top') span the full width or height.\n\t*\n\t* @param handle - The handle element to position\n\t* @param direction - The direction determining the position\n\t*/\n\tpositionHandle(handle, direction) {\n\t\tconst isTop = direction.includes(\"top\");\n\t\tconst isBottom = direction.includes(\"bottom\");\n\t\tconst isLeft = direction.includes(\"left\");\n\t\tconst isRight = direction.includes(\"right\");\n\t\tif (isTop) handle.style.top = \"0\";\n\t\tif (isBottom) handle.style.bottom = \"0\";\n\t\tif (isLeft) handle.style.left = \"0\";\n\t\tif (isRight) handle.style.right = \"0\";\n\t\tif (direction === \"top\" || direction === \"bottom\") {\n\t\t\thandle.style.left = \"0\";\n\t\t\thandle.style.right = \"0\";\n\t\t}\n\t\tif (direction === \"left\" || direction === \"right\") {\n\t\t\thandle.style.top = \"0\";\n\t\t\thandle.style.bottom = \"0\";\n\t\t}\n\t}\n\t/**\n\t* Creates and attaches all resize handles to the wrapper.\n\t*\n\t* Iterates through the configured directions, creates a handle for each,\n\t* positions it, attaches the mousedown listener, and appends it to the DOM.\n\t*/\n\tattachHandles() {\n\t\tthis.directions.forEach((direction) => {\n\t\t\tlet handle;\n\t\t\tif (this.createCustomHandle) handle = this.createCustomHandle(direction);\n\t\t\telse handle = this.createHandle(direction);\n\t\t\tif (!(handle instanceof HTMLElement)) {\n\t\t\t\tconsole.warn(`[ResizableNodeView] createCustomHandle(\"${direction}\") did not return an HTMLElement. Falling back to default handle.`);\n\t\t\t\thandle = this.createHandle(direction);\n\t\t\t}\n\t\t\tif (!this.createCustomHandle) this.positionHandle(handle, direction);\n\t\t\thandle.addEventListener(\"mousedown\", (event) => this.handleResizeStart(event, direction));\n\t\t\thandle.addEventListener(\"touchstart\", (event) => this.handleResizeStart(event, direction));\n\t\t\tthis.handleMap.set(direction, handle);\n\t\t\tthis.wrapper.appendChild(handle);\n\t\t});\n\t}\n\t/**\n\t* Removes all resize handles from the wrapper.\n\t*\n\t* Cleans up the handle map and removes each handle element from the DOM.\n\t*/\n\tremoveHandles() {\n\t\tthis.handleMap.forEach((el) => el.remove());\n\t\tthis.handleMap.clear();\n\t}\n\t/**\n\t* Applies initial sizing from node attributes to the element.\n\t*\n\t* If width/height attributes exist on the node, they're applied to the element.\n\t* Otherwise, the element's natural/current dimensions are measured. The aspect\n\t* ratio is calculated for later use in aspect-ratio-preserving resizes.\n\t*/\n\tapplyInitialSize() {\n\t\tconst width = this.node.attrs.width;\n\t\tconst height = this.node.attrs.height;\n\t\tif (width) {\n\t\t\tthis.element.style.width = `${width}px`;\n\t\t\tthis.initialWidth = width;\n\t\t} else this.initialWidth = this.element.offsetWidth;\n\t\tif (height) {\n\t\t\tthis.element.style.height = `${height}px`;\n\t\t\tthis.initialHeight = height;\n\t\t} else this.initialHeight = this.element.offsetHeight;\n\t\tif (this.initialWidth > 0 && this.initialHeight > 0) this.aspectRatio = this.initialWidth / this.initialHeight;\n\t}\n\t/**\n\t* Initiates a resize operation when a handle is clicked.\n\t*\n\t* Captures the starting mouse position and element dimensions, sets up\n\t* the resize state, adds the resizing class and state attribute, and\n\t* attaches document-level listeners for mouse movement and keyboard input.\n\t*\n\t* @param event - The mouse down event\n\t* @param direction - The direction of the handle being dragged\n\t*/\n\thandleResizeStart(event, direction) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tthis.isResizing = true;\n\t\tthis.activeHandle = direction;\n\t\tif (isTouchEvent(event)) {\n\t\t\tthis.startX = event.touches[0].clientX;\n\t\t\tthis.startY = event.touches[0].clientY;\n\t\t} else {\n\t\t\tthis.startX = event.clientX;\n\t\t\tthis.startY = event.clientY;\n\t\t}\n\t\tthis.startWidth = this.element.offsetWidth;\n\t\tthis.startHeight = this.element.offsetHeight;\n\t\tif (this.startWidth > 0 && this.startHeight > 0) this.aspectRatio = this.startWidth / this.startHeight;\n\t\tif (this.getPos() !== void 0) {}\n\t\tthis.container.dataset.resizeState = \"true\";\n\t\tif (this.classNames.resizing) this.container.classList.add(this.classNames.resizing);\n\t\tdocument.addEventListener(\"mousemove\", this.handleMouseMove);\n\t\tdocument.addEventListener(\"touchmove\", this.handleTouchMove);\n\t\tdocument.addEventListener(\"mouseup\", this.handleMouseUp);\n\t\tdocument.addEventListener(\"keydown\", this.handleKeyDown);\n\t\tdocument.addEventListener(\"keyup\", this.handleKeyUp);\n\t}\n\thandleResize(deltaX, deltaY) {\n\t\tif (!this.activeHandle) return;\n\t\tconst shouldPreserveAspectRatio = this.preserveAspectRatio || this.isShiftKeyPressed;\n\t\tconst { width, height } = this.calculateNewDimensions(this.activeHandle, deltaX, deltaY);\n\t\tconst constrained = this.applyConstraints(width, height, shouldPreserveAspectRatio);\n\t\tthis.element.style.width = `${constrained.width}px`;\n\t\tthis.element.style.height = `${constrained.height}px`;\n\t\tif (this.onResize) this.onResize(constrained.width, constrained.height);\n\t}\n\t/**\n\t* Calculates new dimensions based on mouse delta and resize direction.\n\t*\n\t* Takes the starting dimensions and applies the mouse movement delta\n\t* according to the handle direction. For corner handles, both dimensions\n\t* are affected. For edge handles, only one dimension changes. If aspect\n\t* ratio should be preserved, delegates to applyAspectRatio.\n\t*\n\t* @param direction - The active resize handle direction\n\t* @param deltaX - Horizontal mouse movement since resize start\n\t* @param deltaY - Vertical mouse movement since resize start\n\t* @returns The calculated width and height\n\t*/\n\tcalculateNewDimensions(direction, deltaX, deltaY) {\n\t\tlet newWidth = this.startWidth;\n\t\tlet newHeight = this.startHeight;\n\t\tconst isRight = direction.includes(\"right\");\n\t\tconst isLeft = direction.includes(\"left\");\n\t\tconst isBottom = direction.includes(\"bottom\");\n\t\tconst isTop = direction.includes(\"top\");\n\t\tif (isRight) newWidth = this.startWidth + deltaX;\n\t\telse if (isLeft) newWidth = this.startWidth - deltaX;\n\t\tif (isBottom) newHeight = this.startHeight + deltaY;\n\t\telse if (isTop) newHeight = this.startHeight - deltaY;\n\t\tif (direction === \"right\" || direction === \"left\") newWidth = this.startWidth + (isRight ? deltaX : -deltaX);\n\t\tif (direction === \"top\" || direction === \"bottom\") newHeight = this.startHeight + (isBottom ? deltaY : -deltaY);\n\t\tif (this.preserveAspectRatio || this.isShiftKeyPressed) return this.applyAspectRatio(newWidth, newHeight, direction);\n\t\treturn {\n\t\t\twidth: newWidth,\n\t\t\theight: newHeight\n\t\t};\n\t}\n\t/**\n\t* Applies min/max constraints to dimensions.\n\t*\n\t* When aspect ratio is NOT preserved, constraints are applied independently\n\t* to width and height. When aspect ratio IS preserved, constraints are\n\t* applied while maintaining the aspect ratio—if one dimension hits a limit,\n\t* the other is recalculated proportionally.\n\t*\n\t* This ensures that aspect ratio is never broken when constrained.\n\t*\n\t* @param width - The unconstrained width\n\t* @param height - The unconstrained height\n\t* @param preserveAspectRatio - Whether to maintain aspect ratio while constraining\n\t* @returns The constrained dimensions\n\t*/\n\tapplyConstraints(width, height, preserveAspectRatio) {\n\t\tvar _this$maxSize3, _this$maxSize4;\n\t\tif (!preserveAspectRatio) {\n\t\t\tvar _this$maxSize, _this$maxSize2;\n\t\t\tlet constrainedWidth = Math.max(this.minSize.width, width);\n\t\t\tlet constrainedHeight = Math.max(this.minSize.height, height);\n\t\t\tif ((_this$maxSize = this.maxSize) === null || _this$maxSize === void 0 ? void 0 : _this$maxSize.width) constrainedWidth = Math.min(this.maxSize.width, constrainedWidth);\n\t\t\tif ((_this$maxSize2 = this.maxSize) === null || _this$maxSize2 === void 0 ? void 0 : _this$maxSize2.height) constrainedHeight = Math.min(this.maxSize.height, constrainedHeight);\n\t\t\treturn {\n\t\t\t\twidth: constrainedWidth,\n\t\t\t\theight: constrainedHeight\n\t\t\t};\n\t\t}\n\t\tlet constrainedWidth = width;\n\t\tlet constrainedHeight = height;\n\t\tif (constrainedWidth < this.minSize.width) {\n\t\t\tconstrainedWidth = this.minSize.width;\n\t\t\tconstrainedHeight = constrainedWidth / this.aspectRatio;\n\t\t}\n\t\tif (constrainedHeight < this.minSize.height) {\n\t\t\tconstrainedHeight = this.minSize.height;\n\t\t\tconstrainedWidth = constrainedHeight * this.aspectRatio;\n\t\t}\n\t\tif (((_this$maxSize3 = this.maxSize) === null || _this$maxSize3 === void 0 ? void 0 : _this$maxSize3.width) && constrainedWidth > this.maxSize.width) {\n\t\t\tconstrainedWidth = this.maxSize.width;\n\t\t\tconstrainedHeight = constrainedWidth / this.aspectRatio;\n\t\t}\n\t\tif (((_this$maxSize4 = this.maxSize) === null || _this$maxSize4 === void 0 ? void 0 : _this$maxSize4.height) && constrainedHeight > this.maxSize.height) {\n\t\t\tconstrainedHeight = this.maxSize.height;\n\t\t\tconstrainedWidth = constrainedHeight * this.aspectRatio;\n\t\t}\n\t\treturn {\n\t\t\twidth: constrainedWidth,\n\t\t\theight: constrainedHeight\n\t\t};\n\t}\n\t/**\n\t* Adjusts dimensions to maintain the original aspect ratio.\n\t*\n\t* For horizontal handles (left/right), uses width as the primary dimension\n\t* and calculates height from it. For vertical handles (top/bottom), uses\n\t* height as primary and calculates width. For corner handles, uses width\n\t* as the primary dimension.\n\t*\n\t* @param width - The new width\n\t* @param height - The new height\n\t* @param direction - The active resize direction\n\t* @returns Dimensions adjusted to preserve aspect ratio\n\t*/\n\tapplyAspectRatio(width, height, direction) {\n\t\tconst isHorizontal = direction === \"left\" || direction === \"right\";\n\t\tconst isVertical = direction === \"top\" || direction === \"bottom\";\n\t\tif (isHorizontal) return {\n\t\t\twidth,\n\t\t\theight: width / this.aspectRatio\n\t\t};\n\t\tif (isVertical) return {\n\t\t\twidth: height * this.aspectRatio,\n\t\t\theight\n\t\t};\n\t\treturn {\n\t\t\twidth,\n\t\t\theight: width / this.aspectRatio\n\t\t};\n\t}\n};\n/**\n* Alias for ResizableNodeView to maintain consistent naming.\n* @deprecated Use ResizableNodeView instead - will be removed in future versions.\n*/\nconst ResizableNodeview = ResizableNodeView;\n//#endregion\n//#region src/Node.ts\n/**\n* The Node class is used to create custom node extensions.\n* @see https://tiptap.dev/api/extensions#create-a-new-extension\n*/\nvar Node = class Node extends Extendable {\n\tconstructor(..._args) {\n\t\tsuper(..._args);\n\t\tthis.type = \"node\";\n\t}\n\t/**\n\t* Create a new Node instance\n\t* @param config - Node configuration object or a function that returns a configuration object\n\t*/\n\tstatic create(config = {}) {\n\t\tconst resolvedConfig = typeof config === \"function\" ? config() : config;\n\t\treturn new Node(resolvedConfig);\n\t}\n\tconfigure(options) {\n\t\treturn super.configure(options);\n\t}\n\textend(extendedConfig) {\n\t\tconst resolvedConfig = typeof extendedConfig === \"function\" ? extendedConfig() : extendedConfig;\n\t\treturn super.extend(resolvedConfig);\n\t}\n};\n//#endregion\n//#region src/NodeView.ts\n/**\n* Node views are used to customize the rendered DOM structure of a node.\n* @see https://tiptap.dev/guide/node-views\n*/\nvar NodeView = class {\n\tconstructor(component, props, options) {\n\t\tthis.isDragging = false;\n\t\tthis.component = component;\n\t\tthis.editor = props.editor;\n\t\tthis.options = {\n\t\t\tstopEvent: null,\n\t\t\tignoreMutation: null,\n\t\t\t...options\n\t\t};\n\t\tthis.extension = props.extension;\n\t\tthis.node = props.node;\n\t\tthis.decorations = props.decorations;\n\t\tthis.innerDecorations = props.innerDecorations;\n\t\tthis.view = props.view;\n\t\tthis.HTMLAttributes = props.HTMLAttributes;\n\t\tthis.getPos = () => {\n\t\t\ttry {\n\t\t\t\treturn props.getPos();\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t};\n\t\tthis.mount();\n\t}\n\tmount() {}\n\tget dom() {\n\t\treturn this.editor.view.dom;\n\t}\n\tget contentDOM() {\n\t\treturn null;\n\t}\n\tonDragStart(event) {\n\t\tvar _target$parentElement, _this$contentDOM;\n\t\tconst { view } = this.editor;\n\t\tconst target = event.target;\n\t\tconst dragHandle = target.nodeType === 3 ? (_target$parentElement = target.parentElement) === null || _target$parentElement === void 0 ? void 0 : _target$parentElement.closest(\"[data-drag-handle]\") : target.closest(\"[data-drag-handle]\");\n\t\tif (!this.dom || ((_this$contentDOM = this.contentDOM) === null || _this$contentDOM === void 0 ? void 0 : _this$contentDOM.contains(target)) || !dragHandle) return;\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tif (this.dom !== dragHandle) {\n\t\t\tvar _event$offsetX, _nativeEvent, _event$offsetY, _nativeEvent2;\n\t\t\tconst domBox = this.dom.getBoundingClientRect();\n\t\t\tconst handleBox = dragHandle.getBoundingClientRect();\n\t\t\tconst offsetX = (_event$offsetX = event.offsetX) !== null && _event$offsetX !== void 0 ? _event$offsetX : (_nativeEvent = event.nativeEvent) === null || _nativeEvent === void 0 ? void 0 : _nativeEvent.offsetX;\n\t\t\tconst offsetY = (_event$offsetY = event.offsetY) !== null && _event$offsetY !== void 0 ? _event$offsetY : (_nativeEvent2 = event.nativeEvent) === null || _nativeEvent2 === void 0 ? void 0 : _nativeEvent2.offsetY;\n\t\t\tx = handleBox.x - domBox.x + offsetX;\n\t\t\ty = handleBox.y - domBox.y + offsetY;\n\t\t}\n\t\tconst clonedNode = this.dom.cloneNode(true);\n\t\ttry {\n\t\t\tconst domBox = this.dom.getBoundingClientRect();\n\t\t\tclonedNode.style.width = `${Math.round(domBox.width)}px`;\n\t\t\tclonedNode.style.height = `${Math.round(domBox.height)}px`;\n\t\t\tclonedNode.style.boxSizing = \"border-box\";\n\t\t\tclonedNode.style.pointerEvents = \"none\";\n\t\t} catch {}\n\t\tlet dragImageWrapper = null;\n\t\ttry {\n\t\t\tvar _event$dataTransfer;\n\t\t\tdragImageWrapper = document.createElement(\"div\");\n\t\t\tdragImageWrapper.style.position = \"absolute\";\n\t\t\tdragImageWrapper.style.top = \"-9999px\";\n\t\t\tdragImageWrapper.style.left = \"-9999px\";\n\t\t\tdragImageWrapper.style.pointerEvents = \"none\";\n\t\t\tdragImageWrapper.appendChild(clonedNode);\n\t\t\tdocument.body.appendChild(dragImageWrapper);\n\t\t\t(_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 || _event$dataTransfer.setDragImage(clonedNode, x, y);\n\t\t} finally {\n\t\t\tif (dragImageWrapper) setTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tdragImageWrapper === null || dragImageWrapper === void 0 || dragImageWrapper.remove();\n\t\t\t\t} catch {}\n\t\t\t}, 0);\n\t\t}\n\t\tconst pos = this.getPos();\n\t\tif (typeof pos !== \"number\") return;\n\t\tconst selection = NodeSelection.create(view.state.doc, pos);\n\t\tconst transaction = view.state.tr.setSelection(selection);\n\t\tview.dispatch(transaction);\n\t}\n\tstopEvent(event) {\n\t\tvar _this$contentDOM2;\n\t\tif (!this.dom) return false;\n\t\tif (typeof this.options.stopEvent === \"function\") return this.options.stopEvent({ event });\n\t\tconst target = event.target;\n\t\tif (!(this.dom.contains(target) && !((_this$contentDOM2 = this.contentDOM) === null || _this$contentDOM2 === void 0 ? void 0 : _this$contentDOM2.contains(target)))) return false;\n\t\tconst isDragEvent = event.type.startsWith(\"drag\");\n\t\tconst isDragOverEnterEvent = event.type === \"dragover\" || event.type === \"dragenter\";\n\t\tconst isDropEvent = event.type === \"drop\";\n\t\tif (([\n\t\t\t\"INPUT\",\n\t\t\t\"BUTTON\",\n\t\t\t\"SELECT\",\n\t\t\t\"TEXTAREA\"\n\t\t].includes(target.tagName) || target.isContentEditable) && !isDropEvent && !isDragEvent) return true;\n\t\tconst { isEditable } = this.editor;\n\t\tconst { isDragging } = this;\n\t\tconst isDraggable = !!this.node.type.spec.draggable;\n\t\tconst isSelectable = NodeSelection.isSelectable(this.node);\n\t\tconst isCopyEvent = event.type === \"copy\";\n\t\tconst isPasteEvent = event.type === \"paste\";\n\t\tconst isCutEvent = event.type === \"cut\";\n\t\tconst isClickEvent = event.type === \"mousedown\";\n\t\tif (!isDraggable && isSelectable && isDragEvent && event.target === this.dom) event.preventDefault();\n\t\tif (isDraggable && isDragEvent && !isDragging && event.target === this.dom) {\n\t\t\tevent.preventDefault();\n\t\t\treturn false;\n\t\t}\n\t\tif (isDraggable && isEditable && !isDragging && isClickEvent) {\n\t\t\tconst dragHandle = target.closest(\"[data-drag-handle]\");\n\t\t\tif (dragHandle && (this.dom === dragHandle || this.dom.contains(dragHandle))) {\n\t\t\t\tthis.isDragging = true;\n\t\t\t\tdocument.addEventListener(\"dragend\", () => {\n\t\t\t\t\tthis.isDragging = false;\n\t\t\t\t}, { once: true });\n\t\t\t\tdocument.addEventListener(\"drop\", () => {\n\t\t\t\t\tthis.isDragging = false;\n\t\t\t\t}, { once: true });\n\t\t\t\tdocument.addEventListener(\"mouseup\", () => {\n\t\t\t\t\tthis.isDragging = false;\n\t\t\t\t}, { once: true });\n\t\t\t}\n\t\t}\n\t\tif (isDragging || isDragOverEnterEvent || isDropEvent || isCopyEvent || isPasteEvent || isCutEvent || isClickEvent && isSelectable) return false;\n\t\treturn true;\n\t}\n\t/**\n\t* Called when a DOM [mutation](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) or a selection change happens within the view.\n\t* @return `false` if the editor should re-read the selection or re-parse the range around the mutation\n\t* @return `true` if it can safely be ignored.\n\t*/\n\tignoreMutation(mutation) {\n\t\tif (!this.dom || !this.contentDOM) return true;\n\t\tif (typeof this.options.ignoreMutation === \"function\") return this.options.ignoreMutation({ mutation });\n\t\tif (this.node.isLeaf || this.node.isAtom) return true;\n\t\tif (mutation.type === \"selection\") return false;\n\t\tif (this.dom.contains(mutation.target) && mutation.type === \"childList\" && (isiOS() || isAndroid()) && this.editor.isFocused) {\n\t\t\tif ([...Array.from(mutation.addedNodes), ...Array.from(mutation.removedNodes)].every((node) => node.isContentEditable)) return false;\n\t\t}\n\t\tif (this.contentDOM === mutation.target && mutation.type === \"attributes\") return true;\n\t\tif (this.contentDOM.contains(mutation.target)) return false;\n\t\treturn true;\n\t}\n\t/**\n\t* Update the attributes of the prosemirror node.\n\t*/\n\tupdateAttributes(attributes) {\n\t\tthis.editor.commands.command(({ tr }) => {\n\t\t\tconst pos = this.getPos();\n\t\t\tif (typeof pos !== \"number\") return false;\n\t\t\ttr.setNodeMarkup(pos, void 0, {\n\t\t\t\t...this.node.attrs,\n\t\t\t\t...attributes\n\t\t\t});\n\t\t\treturn true;\n\t\t});\n\t}\n\t/**\n\t* Delete the node.\n\t*/\n\tdeleteNode() {\n\t\tconst from = this.getPos();\n\t\tif (typeof from !== \"number\") return;\n\t\tconst to = from + this.node.nodeSize;\n\t\tthis.editor.commands.deleteRange({\n\t\t\tfrom,\n\t\t\tto\n\t\t});\n\t}\n};\n//#endregion\n//#region src/pasteRules/markPasteRule.ts\n/**\n* Build an paste rule that adds a mark when the\n* matched text is pasted into it.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#paste-rules\n*/\nfunction markPasteRule(config) {\n\treturn new PasteRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match, pasteEvent }) => {\n\t\t\tconst attributes = callOrReturn(config.getAttributes, void 0, match, pasteEvent);\n\t\t\tif (attributes === false || attributes === null) return null;\n\t\t\tconst { tr } = state;\n\t\t\tconst captureGroup = match[match.length - 1];\n\t\t\tconst fullMatch = match[0];\n\t\t\tlet markEnd = range.to;\n\t\t\tif (captureGroup) {\n\t\t\t\tconst startSpaces = fullMatch.search(/\\S/);\n\t\t\t\tconst textStart = range.from + fullMatch.indexOf(captureGroup);\n\t\t\t\tconst textEnd = textStart + captureGroup.length;\n\t\t\t\tif (getMarksBetween(range.from, range.to, state.doc).filter((item) => {\n\t\t\t\t\treturn item.mark.type.excluded.find((type) => type === config.type && type !== item.mark.type);\n\t\t\t\t}).filter((item) => item.to > textStart).length) return null;\n\t\t\t\tif (textEnd < range.to) tr.delete(textEnd, range.to);\n\t\t\t\tif (textStart > range.from) tr.delete(range.from + startSpaces, textStart);\n\t\t\t\tmarkEnd = range.from + startSpaces + captureGroup.length;\n\t\t\t\ttr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));\n\t\t\t\tif (!(match.index !== void 0 && match.input !== void 0 && match.index + match[0].length >= match.input.length)) tr.removeStoredMark(config.type);\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\n//#region src/pasteRules/nodePasteRule.ts\n/**\n* Build an paste rule that adds a node when the\n* matched text is pasted into it.\n* @see https://tiptap.dev/docs/editor/api/paste-rules\n*/\nfunction nodePasteRule(config) {\n\treturn new PasteRule({\n\t\tfind: config.find,\n\t\thandler({ match, chain, range, pasteEvent }) {\n\t\t\tconst attributes = callOrReturn(config.getAttributes, void 0, match, pasteEvent);\n\t\t\tconst content = callOrReturn(config.getContent, void 0, attributes);\n\t\t\tif (attributes === false || attributes === null) return null;\n\t\t\tconst node = {\n\t\t\t\ttype: config.type.name,\n\t\t\t\tattrs: attributes\n\t\t\t};\n\t\t\tif (content) node.content = content;\n\t\t\tif (match.input) chain().deleteRange(range).insertContentAt(range.from, node);\n\t\t}\n\t});\n}\n//#endregion\n//#region src/pasteRules/textPasteRule.ts\n/**\n* Build an paste rule that replaces text when the\n* matched text is pasted into it.\n* @see https://tiptap.dev/docs/editor/extensions/custom-extensions/extend-existing#paste-rules\n*/\nfunction textPasteRule(config) {\n\treturn new PasteRule({\n\t\tfind: config.find,\n\t\thandler: ({ state, range, match }) => {\n\t\t\tlet insert = config.replace;\n\t\t\tlet start = range.from;\n\t\t\tconst end = range.to;\n\t\t\tif (match[1]) {\n\t\t\t\tconst offset = match[0].lastIndexOf(match[1]);\n\t\t\t\tinsert += match[0].slice(offset + match[1].length);\n\t\t\t\tstart += offset;\n\t\t\t\tconst cutOff = start - end;\n\t\t\t\tif (cutOff > 0) {\n\t\t\t\t\tinsert = match[0].slice(offset - cutOff, offset) + insert;\n\t\t\t\t\tstart = end;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.tr.insertText(insert, start, end);\n\t\t}\n\t});\n}\n//#endregion\n//#region src/Tracker.ts\nvar Tracker = class {\n\tconstructor(transaction) {\n\t\tthis.transaction = transaction;\n\t\tthis.currentStep = this.transaction.steps.length;\n\t}\n\tmap(position) {\n\t\tlet deleted = false;\n\t\treturn {\n\t\t\tposition: this.transaction.steps.slice(this.currentStep).reduce((newPosition, step) => {\n\t\t\t\tconst mapResult = step.getMap().mapResult(newPosition);\n\t\t\t\tif (mapResult.deleted) deleted = true;\n\t\t\t\treturn mapResult.pos;\n\t\t\t}, position),\n\t\t\tdeleted\n\t\t};\n\t}\n};\n//#endregion\nexport { CommandManager, DECORATION_MANAGER_PLUGIN_KEY, Decoration, DecorationManager, Editor, Extendable, Extension, Fragment, InlineDecoration, InputRule, MappablePosition, Mark, MarkView, Node, NodeDecoration, NodePos, NodeView, PasteRule, ResizableNodeView, ResizableNodeview, Tracker, WidgetDecoration, attrsEqual, callOrReturn, canInsertNode, combineTransactionSteps, commands_exports as commands, createAtomBlockMarkdownSpec, createBlockMarkdownSpec, createChainableState, createDocument, h as createElement, h, createInlineMarkdownSpec, createMappablePosition, createNodeFromContent, createStyleTag, createWidgetDecoration, decodeHtmlEntities, defaultBlockAt, deleteProps, elementFromString, encodeHtmlEntities, escapeForRegEx, extensions_exports as extensions, findChildren, findChildrenInRange, findDuplicates, findParentNode, findParentNodeClosestToPos, flattenExtensions, fromString, generateHTML, generateJSON, generateText, getAttributes, getAttributesFromExtensions, getChangedRanges, getDebugJSON, getExtensionField, getHTMLFromFragment, getMarkAttributes, getMarkRange, getMarkType, getMarksBetween, getNodeAtPosition, getNodeAttributes, getNodeType, getPreviousBlockSibling, getRenderedAttributes, getSchema, getSchemaByResolvedExtensions, getSchemaTypeByName, getSchemaTypeNameByName, getSplittedAttributes, getStyleProperty, getText, getTextBetween, getTextContentFromNodes, getTextSerializersFromSchema, getUpdatedPosition, injectExtensionAttributesToParseRule, inputRulesPlugin, isActive, isAndroid, isAtEndOfNode, isAtStartOfNode, isEmptyObject, isExtensionRulesEnabled, isFirefox, isFunction, isList, isMacOS, isMarkActive, isNodeActive, isNodeEmpty, isNodeSelection, isNodeViewSelected, isNumber, isPlainObject, isProseMirrorAddMarkStep, isProseMirrorAddNodeMarkStep, isProseMirrorAttrStep, isProseMirrorCellSelection, isProseMirrorDocAttrStep, isProseMirrorFragment, isProseMirrorNodeSelection, isProseMirrorRemoveMarkStep, isProseMirrorRemoveNodeMarkStep, isProseMirrorReplaceAroundStep, isProseMirrorReplaceStep, isProseMirrorSlice, isProseMirrorStep, isProseMirrorStepResult, isRegExp, isSafari, isString, isTextSelection, isiOS, liveWidgetKeys, markInputRule, markPasteRule, markdown_exports as markdown, marksEqual, mergeAttributes, mergeDeep, minMax, nodeInputRule, nodePasteRule, objectIncludes, parseAttributes, parseIndentedBlocks, pasteRulesPlugin, posToDOMRect, removeDuplicates, renderNestedMarkdownContent, resolveExtensions, resolveFocusPosition, rewriteUnknownContent, selectionToInsertionEnd, serializeAttributes, sortExtensions, splitExtensions, textInputRule, textPasteRule, textblockTypeInputRule, updateMarkViewAttributes, wrappingInputRule };\n\n//# sourceMappingURL=index.js.map","import { Extension, MappablePosition, getUpdatedPosition as getUpdatedPosition$1 } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { absolutePositionToRelativePosition, redo, relativePositionToAbsolutePosition, undo, ySyncPlugin, ySyncPluginKey, yUndoPlugin, yUndoPluginKey } from \"@tiptap/y-tiptap\";\n//#region src/helpers/isChangeOrigin.ts\n/**\n* Checks if a transaction was originated from a Yjs change.\n* @param {Transaction} transaction - The transaction to check.\n* @returns {boolean} - True if the transaction was originated from a Yjs change, false otherwise.\n* @example\n* const transaction = new Transaction(doc)\n* const isOrigin = isChangeOrigin(transaction) // returns false\n*/\nfunction isChangeOrigin(transaction) {\n\treturn !!transaction.getMeta(ySyncPluginKey);\n}\n//#endregion\n//#region src/helpers/yRelativePosition.ts\n/**\n* Converts a Y.js relative position to a position in the Tiptap document.\n*/\nfunction getYAbsolutePosition(state, relativePos) {\n\tconst ystate = ySyncPluginKey.getState(state);\n\treturn relativePositionToAbsolutePosition(ystate.doc, ystate.type, relativePos, ystate.binding.mapping) || 0;\n}\n/**\n* Converts a position in the Tiptap document to a Y.js relative position.\n*/\nfunction getYRelativePosition(state, absolutePos) {\n\tconst ystate = ySyncPluginKey.getState(state);\n\treturn absolutePositionToRelativePosition(absolutePos, ystate.type, ystate.binding.mapping);\n}\n//#endregion\n//#region src/helpers/CollaborationMappablePosition.ts\n/**\n* A MappablePosition subclass that includes Y.js relative position information\n* to track positions in collaborative transactions.\n*/\nvar CollaborationMappablePosition = class CollaborationMappablePosition extends MappablePosition {\n\tconstructor(position, yRelativePosition) {\n\t\tsuper(position);\n\t\tthis.yRelativePosition = yRelativePosition;\n\t}\n\t/**\n\t* Creates a CollaborationMappablePosition from a JSON object.\n\t*/\n\tstatic fromJSON(json) {\n\t\treturn new CollaborationMappablePosition(json.position, json.yRelativePosition);\n\t}\n\t/**\n\t* Converts the CollaborationMappablePosition to a JSON object.\n\t*/\n\ttoJSON() {\n\t\treturn {\n\t\t\tposition: this.position,\n\t\t\tyRelativePosition: this.yRelativePosition\n\t\t};\n\t}\n};\n/**\n* Creates a MappablePosition from a position number.\n* This is the collaboration implementation that returns a CollaborationMappablePosition.\n*/\nfunction createMappablePosition(position, state) {\n\treturn new CollaborationMappablePosition(position, getYRelativePosition(state, position));\n}\n/**\n* Returns the new position after applying a transaction. Handles both Y.js\n* transactions and regular transactions.\n*/\nfunction getUpdatedPosition(position, transaction, state) {\n\tconst yRelativePosition = position instanceof CollaborationMappablePosition ? position.yRelativePosition : null;\n\tif (isChangeOrigin(transaction) && yRelativePosition) return {\n\t\tposition: new CollaborationMappablePosition(getYAbsolutePosition(state, yRelativePosition), yRelativePosition),\n\t\tmapResult: null\n\t};\n\tconst result = getUpdatedPosition$1(position, transaction);\n\tconst absolutePosition = result.position.position;\n\treturn {\n\t\tposition: new CollaborationMappablePosition(absolutePosition, yRelativePosition !== null && yRelativePosition !== void 0 ? yRelativePosition : getYRelativePosition(state, absolutePosition)),\n\t\tmapResult: result.mapResult\n\t};\n}\n//#endregion\n//#region src/collaboration.ts\n/**\n* This extension allows you to collaborate with others in real-time.\n* @see https://tiptap.dev/api/extensions/collaboration\n*/\nconst Collaboration = Extension.create({\n\tname: \"collaboration\",\n\tpriority: 1e3,\n\taddOptions() {\n\t\treturn {\n\t\t\tdocument: null,\n\t\t\tfield: \"default\",\n\t\t\tfragment: null,\n\t\t\tprovider: null\n\t\t};\n\t},\n\taddStorage() {\n\t\treturn { isDisabled: false };\n\t},\n\tonCreate() {\n\t\tif (this.editor.extensionManager.extensions.find((extension) => extension.name === \"undoRedo\")) console.warn(\"[tiptap warn]: \\\"@tiptap/extension-collaboration\\\" comes with its own history support and is not compatible with \\\"@tiptap/extension-undo-redo\\\".\");\n\t},\n\tonBeforeCreate() {\n\t\tthis.editor.utils.getUpdatedPosition = (position, transaction) => getUpdatedPosition(position, transaction, this.editor.state);\n\t\tthis.editor.utils.createMappablePosition = (position) => createMappablePosition(position, this.editor.state);\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tundo: () => ({ tr, state, dispatch }) => {\n\t\t\t\ttr.setMeta(\"preventDispatch\", true);\n\t\t\t\tif (yUndoPluginKey.getState(state).undoManager.undoStack.length === 0) return false;\n\t\t\t\tif (!dispatch) return true;\n\t\t\t\treturn undo(state);\n\t\t\t},\n\t\t\tredo: () => ({ tr, state, dispatch }) => {\n\t\t\t\ttr.setMeta(\"preventDispatch\", true);\n\t\t\t\tif (yUndoPluginKey.getState(state).undoManager.redoStack.length === 0) return false;\n\t\t\t\tif (!dispatch) return true;\n\t\t\t\treturn redo(state);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-z\": () => this.editor.commands.undo(),\n\t\t\t\"Mod-y\": () => this.editor.commands.redo(),\n\t\t\t\"Shift-Mod-z\": () => this.editor.commands.redo()\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\tconst fragment = this.options.fragment ? this.options.fragment : this.options.document.getXmlFragment(this.options.field);\n\t\tconst yUndoPluginInstance = yUndoPlugin(this.options.yUndoOptions);\n\t\tconst originalUndoPluginView = yUndoPluginInstance.spec.view;\n\t\tyUndoPluginInstance.spec.view = (view) => {\n\t\t\tconst { undoManager } = yUndoPluginKey.getState(view.state);\n\t\t\tif (undoManager.restore) {\n\t\t\t\tundoManager.restore();\n\t\t\t\tundoManager.restore = () => {};\n\t\t\t}\n\t\t\tconst viewRet = originalUndoPluginView ? originalUndoPluginView(view) : void 0;\n\t\t\treturn { destroy: () => {\n\t\t\t\tconst hasUndoManSelf = undoManager.trackedOrigins.has(undoManager);\n\t\t\t\tconst observers = undoManager._observers;\n\t\t\t\tundoManager.restore = () => {\n\t\t\t\t\tif (hasUndoManSelf) undoManager.trackedOrigins.add(undoManager);\n\t\t\t\t\tundoManager.doc.on(\"afterTransaction\", undoManager.afterTransactionHandler);\n\t\t\t\t\tundoManager._observers = observers;\n\t\t\t\t};\n\t\t\t\tif (viewRet === null || viewRet === void 0 ? void 0 : viewRet.destroy) viewRet.destroy();\n\t\t\t} };\n\t\t};\n\t\tconst ySyncPluginOptions = {\n\t\t\t...this.options.ySyncOptions,\n\t\t\tonFirstRender: this.options.onFirstRender\n\t\t};\n\t\treturn [\n\t\t\tySyncPlugin(fragment, ySyncPluginOptions),\n\t\t\tyUndoPluginInstance,\n\t\t\tthis.editor.options.enableContentCheck && new Plugin({\n\t\t\t\tkey: new PluginKey(\"filterInvalidContent\"),\n\t\t\t\tfilterTransaction: (transaction) => {\n\t\t\t\t\tif (!isChangeOrigin(transaction)) return true;\n\t\t\t\t\tif (this.storage.isDisabled) return false;\n\t\t\t\t\tif (!transaction.docChanged) return true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttransaction.doc.check();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.storage.isDisabled = true;\n\t\t\t\t\t\tthis.editor.emit(\"contentError\", {\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\teditor: this.editor,\n\t\t\t\t\t\t\tdisableCollaboration: () => {\n\t\t\t\t\t\t\t\tvar _fragment$doc;\n\t\t\t\t\t\t\t\t(_fragment$doc = fragment.doc) === null || _fragment$doc === void 0 || _fragment$doc.destroy();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t].filter(Boolean);\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Collaboration;\n//#endregion\nexport { Collaboration, CollaborationMappablePosition, createMappablePosition, src_default as default, getUpdatedPosition, isChangeOrigin };\n\n//# sourceMappingURL=index.js.map","import { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { defaultSelectionBuilder, yCursorPlugin } from \"@tiptap/y-tiptap\";\n//#region src/collaboration-caret.ts\nconst awarenessStatesToArray = (states) => {\n\treturn Array.from(states.entries()).map(([key, value]) => {\n\t\tif (value && value.user) return {\n\t\t\tclientId: key,\n\t\t\t...value.user\n\t\t};\n\t\treturn { clientId: key };\n\t});\n};\nconst defaultOnUpdate = () => null;\n/**\n* This extension allows you to add collaboration carets to your editor.\n* @see https://tiptap.dev/api/extensions/collaboration-caret\n*/\nconst CollaborationCaret = Extension.create({\n\tname: \"collaborationCaret\",\n\tpriority: 999,\n\taddOptions() {\n\t\treturn {\n\t\t\tprovider: null,\n\t\t\tuser: {\n\t\t\t\tname: null,\n\t\t\t\tcolor: null\n\t\t\t},\n\t\t\trender: (user) => {\n\t\t\t\tconst cursor = document.createElement(\"span\");\n\t\t\t\tcursor.classList.add(\"collaboration-carets__caret\");\n\t\t\t\tcursor.setAttribute(\"style\", `border-color: ${user.color}`);\n\t\t\t\tconst label = document.createElement(\"div\");\n\t\t\t\tlabel.classList.add(\"collaboration-carets__label\");\n\t\t\t\tlabel.setAttribute(\"style\", `background-color: ${user.color}`);\n\t\t\t\tlabel.insertBefore(document.createTextNode(user.name), null);\n\t\t\t\tcursor.insertBefore(label, null);\n\t\t\t\treturn cursor;\n\t\t\t},\n\t\t\tselectionRender: defaultSelectionBuilder,\n\t\t\tonUpdate: defaultOnUpdate\n\t\t};\n\t},\n\tonCreate() {\n\t\tif (this.options.onUpdate !== defaultOnUpdate) console.warn(\"[tiptap warn]: DEPRECATED: The \\\"onUpdate\\\" option is deprecated. Please use `editor.storage.collaborationCaret.users` instead. Read more: https://tiptap.dev/api/extensions/collaboration-caret\");\n\t\tif (!this.options.provider) throw new Error(\"The \\\"provider\\\" option is required for the CollaborationCaret extension\");\n\t},\n\taddStorage() {\n\t\treturn { users: [] };\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tupdateUser: (attributes) => () => {\n\t\t\t\tthis.options.provider.awareness.setLocalStateField(\"user\", attributes);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tuser: (attributes) => ({ editor }) => {\n\t\t\t\tconsole.warn(\"[tiptap warn]: DEPRECATED: The \\\"user\\\" command is deprecated. Please use \\\"updateUser\\\" instead. Read more: https://tiptap.dev/api/extensions/collaboration-caret\");\n\t\t\t\treturn editor.commands.updateUser(attributes);\n\t\t\t}\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\tconst { provider } = this.options;\n\t\tconst storage = this.storage;\n\t\tconst user = this.options.user;\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"collaborationCaretAwarenessListener\"),\n\t\t\tview: () => {\n\t\t\t\tconst onAwarenessUpdate = () => {\n\t\t\t\t\tstorage.users = awarenessStatesToArray(provider.awareness.states);\n\t\t\t\t};\n\t\t\t\tprovider.awareness.setLocalStateField(\"user\", user);\n\t\t\t\tstorage.users = awarenessStatesToArray(provider.awareness.states);\n\t\t\t\tprovider.awareness.on(\"update\", onAwarenessUpdate);\n\t\t\t\treturn { destroy: () => {\n\t\t\t\t\tprovider.awareness.off(\"update\", onAwarenessUpdate);\n\t\t\t\t\tstorage.users = [];\n\t\t\t\t} };\n\t\t\t}\n\t\t}), yCursorPlugin(provider.awareness, {\n\t\t\tcursorBuilder: this.options.render,\n\t\t\tselectionBuilder: this.options.selectionRender\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = CollaborationCaret;\n//#endregion\nexport { CollaborationCaret, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { t as __exportAll } from \"./rolldown-runtime-D7D4PA-g.js\";\nimport { Extension, Node, getNodeAtPosition, getNodeType, getPreviousBlockSibling, getRenderedAttributes, isAtEndOfNode, isAtStartOfNode, isNodeActive, mergeAttributes, parseIndentedBlocks, renderNestedMarkdownContent, wrappingInputRule } from \"@tiptap/core\";\nimport { Fragment } from \"@tiptap/pm/model\";\nimport { Plugin, TextSelection } from \"@tiptap/pm/state\";\n//#region src/bullet-list/bullet-list.ts\nconst ListItemName$1 = \"listItem\";\nconst TextStyleName$1 = \"textStyle\";\n/**\n* Matches a bullet list to a dash or asterisk.\n*/\nconst bulletListInputRegex = /^\\s*([-+*])\\s$/;\n/**\n* This extension allows you to create bullet lists.\n* This requires the ListItem extension\n* @see https://tiptap.dev/api/nodes/bullet-list\n* @see https://tiptap.dev/api/nodes/list-item.\n*/\nconst BulletList = Node.create({\n\tname: \"bulletList\",\n\taddOptions() {\n\t\treturn {\n\t\t\titemTypeName: \"listItem\",\n\t\t\tHTMLAttributes: {},\n\t\t\tkeepMarks: false,\n\t\t\tkeepAttributes: false\n\t\t};\n\t},\n\tgroup: \"block list\",\n\tcontent() {\n\t\treturn `${this.options.itemTypeName}+`;\n\t},\n\tparseHTML() {\n\t\treturn [{ tag: \"ul\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"ul\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tmarkdownTokenName: \"list\",\n\tparseMarkdown: (token, helpers) => {\n\t\tif (token.type !== \"list\" || token.ordered) return [];\n\t\treturn {\n\t\t\ttype: \"bulletList\",\n\t\t\tcontent: token.items ? helpers.parseChildren(token.items) : []\n\t\t};\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tif (!node.content) return \"\";\n\t\treturn h.renderChildren(node.content, \"\\n\");\n\t},\n\tmarkdownOptions: { indentsContent: true },\n\taddCommands() {\n\t\treturn { toggleBulletList: () => ({ commands, chain }) => {\n\t\t\tif (this.options.keepAttributes) return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItemName$1, this.editor.getAttributes(TextStyleName$1)).run();\n\t\t\treturn commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks);\n\t\t} };\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn { \"Mod-Shift-8\": () => this.editor.commands.toggleBulletList() };\n\t},\n\taddInputRules() {\n\t\tlet inputRule = wrappingInputRule({\n\t\t\tfind: bulletListInputRegex,\n\t\t\ttype: this.type\n\t\t});\n\t\tif (this.options.keepMarks || this.options.keepAttributes) inputRule = wrappingInputRule({\n\t\t\tfind: bulletListInputRegex,\n\t\t\ttype: this.type,\n\t\t\tkeepMarks: this.options.keepMarks,\n\t\t\tkeepAttributes: this.options.keepAttributes,\n\t\t\tgetAttributes: () => {\n\t\t\t\treturn this.editor.getAttributes(TextStyleName$1);\n\t\t\t},\n\t\t\teditor: this.editor\n\t\t});\n\t\treturn [inputRule];\n\t}\n});\n//#endregion\n//#region src/helpers/getBranchingNestedListAtCursor.ts\n/**\n* Resolves a branching nested list immediately after the cursor when the selection is\n* collapsed at the end of a textblock inside a list item.\n*\n* @param state - The editor state to inspect.\n* @param itemName - The list item node name (for example `listItem` or `taskItem`).\n* @param wrapperNames - List wrapper node names (for example `bulletList` and `orderedList`).\n* @returns Resolved positions and nodes for hoisting, or `null` when not applicable.\n*\n* @example\n* ```ts\n* const context = getBranchingNestedListAtCursor(editor.state, 'listItem', [\n*   'bulletList',\n*   'orderedList',\n* ])\n*\n* if (context) {\n*   // cursor is at the end of Item 1 before a branching nested sublist\n* }\n* ```\n*/\nconst getBranchingNestedListAtCursor = (state, itemName, wrapperNames) => {\n\tconst { selection } = state;\n\tif (!selection.empty) return null;\n\tconst { $from } = selection;\n\tif (!$from.parent.isTextblock) return null;\n\tif ($from.parentOffset !== $from.parent.content.size) return null;\n\tlet listItemDepth = -1;\n\tfor (let depth = $from.depth; depth > 0; depth -= 1) if ($from.node(depth).type.name === itemName) {\n\t\tlistItemDepth = depth;\n\t\tbreak;\n\t}\n\tif (listItemDepth < 0) return null;\n\tconst listItem = $from.node(listItemDepth);\n\tconst indexInListItem = $from.index(listItemDepth);\n\tif (indexInListItem + 1 >= listItem.childCount) return null;\n\tconst nextChild = listItem.child(indexInListItem + 1);\n\tif (!wrapperNames.includes(nextChild.type.name)) return null;\n\tconst itemType = state.schema.nodes[itemName];\n\tlet hasBranching = false;\n\tnextChild.forEach((child) => {\n\t\tif (child.type === itemType && child.childCount > 1) hasBranching = true;\n\t});\n\tif (!hasBranching) return null;\n\tconst nodeAfter = state.doc.resolve($from.after()).nodeAfter;\n\tif (!nodeAfter || !wrapperNames.includes(nodeAfter.type.name)) return null;\n\tconst items = [];\n\tnodeAfter.forEach((child) => {\n\t\titems.push(child);\n\t});\n\tif (items.length === 0) return null;\n\treturn {\n\t\tlistItemDepth,\n\t\tnestedList: nodeAfter,\n\t\tnestedListPos: $from.after(),\n\t\tinsertPos: $from.after(listItemDepth),\n\t\titems\n\t};\n};\n//#endregion\n//#region src/helpers/hoistBranchingNestedList.ts\n/**\n* Hoists all list items from a branching nested list after the cursor into the parent list.\n*\n* Use this when `joinForward` cannot restructure a nested list that contains list items\n* with sublists (see issue #6906).\n*\n* @param state - The editor state to transform.\n* @param dispatch - Optional dispatch function for the transaction.\n* @param itemName - The list item node name (for example `listItem` or `taskItem`).\n* @param wrapperNames - List wrapper node names (for example `bulletList` and `orderedList`).\n* @returns `true` when the nested list was hoisted, otherwise `false`.\n*\n* @example\n* ```ts\n* // Cursor at the end of \"Item 1\" before a nested list with branching items.\n* hoistBranchingNestedList(editor.state, editor.view.dispatch, 'listItem', [\n*   'bulletList',\n*   'orderedList',\n* ])\n* ```\n*/\nconst hoistBranchingNestedList = (state, dispatch, itemName, wrapperNames) => {\n\tconst context = getBranchingNestedListAtCursor(state, itemName, wrapperNames);\n\tif (!context) return false;\n\tconst { selection } = state;\n\tconst { nestedList, nestedListPos, insertPos, items } = context;\n\tconst tr = state.tr;\n\ttr.delete(nestedListPos, nestedListPos + nestedList.nodeSize);\n\tconst mappedInsertPos = tr.mapping.map(insertPos);\n\ttr.insert(mappedInsertPos, Fragment.from(items));\n\ttr.setSelection(selection.map(tr.doc, tr.mapping));\n\tif (dispatch) dispatch(tr);\n\treturn true;\n};\n//#endregion\n//#region src/helpers/handleDeleteBranchingNestedList.ts\n/**\n* Handles Delete for a list item when a branching nested sublist follows the cursor.\n*\n* @param editor - The editor instance whose state should be updated.\n* @param itemName - The list item node name (for example `listItem` or `taskItem`).\n* @param wrapperNames - List wrapper node names (for example `bulletList` and `orderedList`).\n* @returns `true` when the nested list was hoisted, otherwise `false`.\n*\n* @example\n* ```ts\n* Delete: () =>\n*   handleDeleteBranchingNestedList(editor, 'listItem', ['bulletList', 'orderedList']),\n* ```\n*/\nconst handleDeleteBranchingNestedList = (editor, itemName, wrapperNames) => {\n\treturn hoistBranchingNestedList(editor.state, editor.view.dispatch, itemName, wrapperNames);\n};\n//#endregion\n//#region src/helpers/createBranchingListDeleteKeymap.ts\n/**\n* Creates a high-priority keymap extension that handles Delete for branching nested lists.\n* Kept separate from the list item node so Enter/Tab shortcuts keep their default priority.\n*/\nconst createBranchingListDeleteKeymap = (itemName, wrapperNames) => {\n\treturn Extension.create({\n\t\tname: `${itemName}BranchingDeleteKeymap`,\n\t\tpriority: 101,\n\t\taddKeyboardShortcuts() {\n\t\t\tconst handleDelete = () => handleDeleteBranchingNestedList(this.editor, itemName, wrapperNames);\n\t\t\treturn {\n\t\t\t\tDelete: handleDelete,\n\t\t\t\t\"Mod-Delete\": handleDelete\n\t\t\t};\n\t\t}\n\t});\n};\n//#endregion\n//#region src/ordered-list/roman.ts\nconst ROMAN_NUMERALS = [\n\t[1e3, \"m\"],\n\t[900, \"cm\"],\n\t[500, \"d\"],\n\t[400, \"cd\"],\n\t[100, \"c\"],\n\t[90, \"xc\"],\n\t[50, \"l\"],\n\t[40, \"xl\"],\n\t[10, \"x\"],\n\t[9, \"ix\"],\n\t[5, \"v\"],\n\t[4, \"iv\"],\n\t[1, \"i\"]\n];\nconst ALPHA_NUMERALS = \"abcdefghijklmnopqrstuvwxyz\";\n/**\n* Marker segment for ordered list lines: numeric, roman, or 1–2 letter alpha.\n* Roman is matched before alpha so \"iii\" is roman; invalid romans like \"aa\" fall through to alpha.\n*/\nconst ORDERED_LIST_MARKER_PATTERN = String.raw`\\d+|[ivxlcdmIVXLCDM]+|${\"[a-zA-Z]{1,2}\"}`;\n/**\n* Convert a number to lowercase roman numerals.\n* @example toRoman(1) // 'i'\n* @example toRoman(4) // 'iv'\n*/\nfunction toRoman(num) {\n\tlet remaining = num;\n\tlet result = \"\";\n\tfor (const [value, numeral] of ROMAN_NUMERALS) while (remaining >= value) {\n\t\tresult += numeral;\n\t\tremaining -= value;\n\t}\n\treturn result;\n}\n/**\n* Convert a number to uppercase roman numerals.\n* @example toRomanUpper(1) // 'I'\n* @example toRomanUpper(4) // 'IV'\n*/\nfunction toRomanUpper(num) {\n\treturn toRoman(num).toUpperCase();\n}\nfunction fromRoman(roman) {\n\tconst lower = roman.toLowerCase();\n\tlet index = 0;\n\tlet result = 0;\n\twhile (index < lower.length) {\n\t\tlet matched = false;\n\t\tfor (const [value, numeral] of ROMAN_NUMERALS) if (lower.startsWith(numeral, index)) {\n\t\t\tresult += value;\n\t\t\tindex += numeral.length;\n\t\t\tmatched = true;\n\t\t\tbreak;\n\t\t}\n\t\tif (!matched) return 0;\n\t}\n\treturn result;\n}\nfunction isValidRoman(marker) {\n\tif (!/^[ivxlcdmIVXLCDM]+$/.test(marker)) return false;\n\tconst value = fromRoman(marker);\n\tif (value <= 0) return false;\n\treturn (marker === marker.toLowerCase() ? toRoman(value) : toRomanUpper(value)) === marker;\n}\nfunction fromAlpha(marker) {\n\tconst lower = marker.toLowerCase();\n\tif (lower.length === 1) return lower.charCodeAt(0) - \"a\".charCodeAt(0) + 1;\n\tif (lower.length === 2) {\n\t\tconst first = lower.charCodeAt(0) - \"a\".charCodeAt(0);\n\t\tconst second = lower.charCodeAt(1) - \"a\".charCodeAt(0);\n\t\treturn (first + 1) * 26 + second + 1;\n\t}\n\treturn 0;\n}\nfunction toRomanAlpha(num) {\n\tif (num <= 26) return ALPHA_NUMERALS[num - 1];\n\tconst first = Math.floor((num - 1) / 26) - 1;\n\tconst second = (num - 1) % 26;\n\tif (first < 0) return ALPHA_NUMERALS[second];\n\treturn ALPHA_NUMERALS[first] + ALPHA_NUMERALS[second];\n}\n/**\n* Extract the list marker type from a marker string.\n* Supports \"1\", \"a\", \"A\", \"i\", \"I\" marker styles.\n*\n* @param marker The text content of the list marker (e.g. \"a\", \"1\", \"iii\", \"b\")\n* @returns The normalized type string, or undefined for default numeric type\n*/\nfunction detectMarkerType(marker) {\n\tif (!marker || /^\\d+$/.test(marker)) return;\n\tif (isValidRoman(marker)) return marker === marker.toLowerCase() ? \"i\" : \"I\";\n\tif (/^[a-z]{1,2}$/.test(marker)) return \"a\";\n\tif (/^[A-Z]{1,2}$/.test(marker)) return \"A\";\n}\n/**\n* Convert a list marker string to its numeric start position.\n*\n* @param marker The text content of the list marker (e.g. \"3\", \"b\", \"II\")\n* @returns The 1-based start value for the ordered list\n*/\nfunction markerToStart(marker) {\n\tif (/^\\d+$/.test(marker)) return parseInt(marker, 10);\n\tconst type = detectMarkerType(marker);\n\tif (type === \"i\" || type === \"I\") return fromRoman(marker);\n\tif (type === \"a\" || type === \"A\") {\n\t\tconst start = fromAlpha(marker);\n\t\treturn start > 0 ? start : 1;\n\t}\n\tconst parsed = parseInt(marker, 10);\n\treturn Number.isNaN(parsed) ? 1 : parsed;\n}\nfunction startToMarker(type, start) {\n\tif (type === \"numeric\") return String(start);\n\tswitch (type) {\n\t\tcase \"a\": return toRomanAlpha(start);\n\t\tcase \"A\": return toRomanAlpha(start).toUpperCase();\n\t\tcase \"i\": return toRoman(start);\n\t\tcase \"I\": return toRomanUpper(start);\n\t\tdefault: return String(start);\n\t}\n}\n/**\n* Returns true when all markers share the same style and increment by 1.\n* Style is inferred from the first marker so ambiguous letters (e.g. \"c\", \"i\")\n* are not re-classified differently on later lines.\n*/\nfunction areOrderedListMarkersSequential(markers) {\n\tvar _detectMarkerType;\n\tif (markers.length === 0) return false;\n\tconst firstType = (_detectMarkerType = detectMarkerType(markers[0])) !== null && _detectMarkerType !== void 0 ? _detectMarkerType : \"numeric\";\n\tconst firstStart = markerToStart(markers[0]);\n\tif (firstStart < 1) return false;\n\tfor (let i = 0; i < markers.length; i++) {\n\t\tconst expected = startToMarker(firstType, firstStart + i);\n\t\tif (markers[i] !== expected) return false;\n\t}\n\treturn true;\n}\n/**\n* Parse a list marker into HTML ordered-list attrs (type + start).\n*/\nfunction parseListMarker(marker) {\n\treturn {\n\t\ttype: detectMarkerType(marker),\n\t\tstart: markerToStart(marker)\n\t};\n}\n/**\n* Build orderedList node attrs from the first list item marker.\n*/\nfunction buildOrderedListAttrsFromMarker(marker) {\n\tconst { type, start } = parseListMarker(marker);\n\tconst attrs = {};\n\tif (type) attrs.type = type;\n\tif (start !== 1) attrs.start = start;\n\treturn attrs;\n}\n/**\n* Returns the list marker prefix for a given item at a given index.\n*\n* @param type The list type attribute (e.g. \"a\", \"A\", \"i\", \"I\", null/undefined for default)\n* @param index The zero-based index of the list item\n* @param separator The separator to use (default: \". \")\n* @returns The marker string (e.g. \"a. \", \"I. \", \"1. \")\n*/\nfunction getListMarker(type, index, separator = \". \") {\n\tconst position = index + 1;\n\tif (!type || type === \"1\") return `${position}${separator}`;\n\tswitch (type) {\n\t\tcase \"a\": return `${toRomanAlpha(position)}${separator}`;\n\t\tcase \"A\": return `${toRomanAlpha(position).toUpperCase()}${separator}`;\n\t\tcase \"i\": return `${toRoman(position)}${separator}`;\n\t\tcase \"I\": return `${toRomanUpper(position)}${separator}`;\n\t\tdefault: return `${position}${separator}`;\n\t}\n}\n//#endregion\n//#region src/item/list-item.ts\nfunction isSameLineOrderedListToken(token) {\n\tvar _token$tokens, _token$tokens2;\n\tconst nestedToken = (_token$tokens = token.tokens) === null || _token$tokens === void 0 ? void 0 : _token$tokens[0];\n\treturn Boolean(token.text && ((_token$tokens2 = token.tokens) === null || _token$tokens2 === void 0 ? void 0 : _token$tokens2.length) === 1 && (nestedToken === null || nestedToken === void 0 ? void 0 : nestedToken.type) === \"list\" && nestedToken.ordered && nestedToken.raw === token.text);\n}\nfunction parseSameLineOrderedListText(text, helpers) {\n\tif (helpers.tokenizeInline) return helpers.parseInline(helpers.tokenizeInline(text));\n\treturn helpers.parseInline([{\n\t\ttype: \"text\",\n\t\traw: text,\n\t\ttext\n\t}]);\n}\n/**\n* This extension allows you to create list items.\n* @see https://www.tiptap.dev/api/nodes/list-item\n*/\nconst ListItem = Node.create({\n\tname: \"listItem\",\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t\tbulletListTypeName: \"bulletList\",\n\t\t\torderedListTypeName: \"orderedList\"\n\t\t};\n\t},\n\tcontent: \"paragraph block*\",\n\tdefining: true,\n\tparseHTML() {\n\t\treturn [{ tag: \"li\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"li\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tmarkdownTokenName: \"list_item\",\n\tparseMarkdown: (token, helpers) => {\n\t\tvar _helpers$parseBlockCh;\n\t\tif (token.type !== \"list_item\") return [];\n\t\tconst parseBlockChildren = (_helpers$parseBlockCh = helpers.parseBlockChildren) !== null && _helpers$parseBlockCh !== void 0 ? _helpers$parseBlockCh : helpers.parseChildren;\n\t\tlet content = [];\n\t\tif (token.tokens && token.tokens.length > 0) {\n\t\t\tif (isSameLineOrderedListToken(token)) return {\n\t\t\t\ttype: \"listItem\",\n\t\t\t\tcontent: [{\n\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\tcontent: parseSameLineOrderedListText(token.text || \"\", helpers)\n\t\t\t\t}]\n\t\t\t};\n\t\t\tif (token.tokens.some((t) => t.type === \"paragraph\")) content = parseBlockChildren(token.tokens);\n\t\t\telse {\n\t\t\t\tconst firstToken = token.tokens[0];\n\t\t\t\tif (firstToken && firstToken.type === \"text\" && firstToken.tokens && firstToken.tokens.length > 0) {\n\t\t\t\t\tcontent = [{\n\t\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\t\tcontent: helpers.parseInline(firstToken.tokens)\n\t\t\t\t\t}];\n\t\t\t\t\tif (token.tokens.length > 1) {\n\t\t\t\t\t\tconst additionalContent = parseBlockChildren(token.tokens.slice(1));\n\t\t\t\t\t\tcontent.push(...additionalContent);\n\t\t\t\t\t}\n\t\t\t\t} else content = parseBlockChildren(token.tokens);\n\t\t\t}\n\t\t}\n\t\tif (content.length === 0) content = [{\n\t\t\ttype: \"paragraph\",\n\t\t\tcontent: []\n\t\t}];\n\t\treturn {\n\t\t\ttype: \"listItem\",\n\t\t\tcontent\n\t\t};\n\t},\n\trenderMarkdown: (node, h, ctx) => {\n\t\treturn renderNestedMarkdownContent(node, h, (context) => {\n\t\t\tif (context.parentType === \"bulletList\") return \"- \";\n\t\t\tif (context.parentType === \"orderedList\") {\n\t\t\t\tvar _context$meta, _context$meta2;\n\t\t\t\tconst start = ((_context$meta = context.meta) === null || _context$meta === void 0 || (_context$meta = _context$meta.parentAttrs) === null || _context$meta === void 0 ? void 0 : _context$meta.start) || 1;\n\t\t\t\treturn getListMarker((_context$meta2 = context.meta) === null || _context$meta2 === void 0 || (_context$meta2 = _context$meta2.parentAttrs) === null || _context$meta2 === void 0 ? void 0 : _context$meta2.type, start - 1 + (context.index || 0), \". \");\n\t\t\t}\n\t\t\treturn \"- \";\n\t\t}, ctx);\n\t},\n\taddExtensions() {\n\t\treturn [createBranchingListDeleteKeymap(this.name, [this.options.bulletListTypeName, this.options.orderedListTypeName])];\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\tEnter: () => this.editor.commands.splitListItem(this.name),\n\t\t\tTab: () => this.editor.commands.sinkListItem(this.name),\n\t\t\t\"Shift-Tab\": () => this.editor.commands.liftListItem(this.name)\n\t\t};\n\t}\n});\n//#endregion\n//#region src/keymap/listHelpers/findListItemPos.ts\nconst findListItemPos = (typeOrName, state) => {\n\tconst { $from } = state.selection;\n\tconst nodeType = getNodeType(typeOrName, state.schema);\n\tlet currentNode = null;\n\tlet currentDepth = $from.depth;\n\tlet currentPos = $from.pos;\n\tlet targetDepth = null;\n\twhile (currentDepth > 0 && targetDepth === null) {\n\t\tcurrentNode = $from.node(currentDepth);\n\t\tif (currentNode.type === nodeType) targetDepth = currentDepth;\n\t\telse {\n\t\t\tcurrentDepth -= 1;\n\t\t\tcurrentPos -= 1;\n\t\t}\n\t}\n\tif (targetDepth === null) return null;\n\treturn {\n\t\t$pos: state.doc.resolve(currentPos),\n\t\tdepth: targetDepth\n\t};\n};\n//#endregion\n//#region src/keymap/listHelpers/getNextListDepth.ts\nconst getNextListDepth = (typeOrName, state) => {\n\tconst listItemPos = findListItemPos(typeOrName, state);\n\tif (!listItemPos) return false;\n\tconst [, depth] = getNodeAtPosition(state, typeOrName, listItemPos.$pos.pos + 4);\n\treturn depth;\n};\n//#endregion\n//#region src/keymap/listHelpers/hasListBefore.ts\nconst hasListBefore = (editorState, name, parentListTypes) => {\n\tconst { $anchor } = editorState.selection;\n\tconst previousNodePos = Math.max(0, $anchor.pos - 2);\n\tconst previousNode = editorState.doc.resolve(previousNodePos).node();\n\tif (!previousNode || !parentListTypes.includes(previousNode.type.name)) return false;\n\treturn true;\n};\n//#endregion\n//#region src/keymap/listHelpers/handleBackspace.ts\nconst handleBackspace = (editor, name, parentListTypes) => {\n\tif (editor.commands.undoInputRule()) return true;\n\tif (editor.state.selection.from !== editor.state.selection.to) return false;\n\tif (!isNodeActive(editor.state, name) && hasListBefore(editor.state, name, parentListTypes)) {\n\t\tconst { $anchor } = editor.state.selection;\n\t\tconst $listPos = editor.state.doc.resolve($anchor.before() - 1);\n\t\tconst listDescendants = [];\n\t\t$listPos.node().descendants((node, pos) => {\n\t\t\tif (node.type.name === name) listDescendants.push({\n\t\t\t\tnode,\n\t\t\t\tpos\n\t\t\t});\n\t\t});\n\t\tconst lastItem = listDescendants.at(-1);\n\t\tif (!lastItem) return false;\n\t\tconst $lastItemPos = editor.state.doc.resolve($listPos.start() + lastItem.pos + 1);\n\t\treturn editor.chain().cut({\n\t\t\tfrom: $anchor.start() - 1,\n\t\t\tto: $anchor.end() + 1\n\t\t}, $lastItemPos.end()).joinForward().run();\n\t}\n\tif (!isNodeActive(editor.state, name)) return false;\n\tif (!isAtStartOfNode(editor.state)) return false;\n\tconst { $from } = editor.state.selection;\n\tconst itemDepth = $from.depth - 1;\n\tif ($from.node(itemDepth).type !== editor.schema.nodes[name] || $from.index(itemDepth) !== 0) return false;\n\treturn editor.chain().liftListItem(name).run();\n};\n//#endregion\n//#region src/keymap/listHelpers/nextListIsDeeper.ts\nconst nextListIsDeeper = (typeOrName, state) => {\n\tconst listDepth = getNextListDepth(typeOrName, state);\n\tconst listItemPos = findListItemPos(typeOrName, state);\n\tif (!listItemPos || !listDepth) return false;\n\tif (listDepth > listItemPos.depth) return true;\n\treturn false;\n};\n//#endregion\n//#region src/keymap/listHelpers/nextListIsHigher.ts\nconst nextListIsHigher = (typeOrName, state) => {\n\tconst listDepth = getNextListDepth(typeOrName, state);\n\tconst listItemPos = findListItemPos(typeOrName, state);\n\tif (!listItemPos || !listDepth) return false;\n\tif (listDepth < listItemPos.depth) return true;\n\treturn false;\n};\n//#endregion\n//#region src/keymap/listHelpers/handleDelete.ts\nconst handleDelete = (editor, name) => {\n\tif (!isNodeActive(editor.state, name)) return false;\n\tif (!isAtEndOfNode(editor.state, name)) return false;\n\tconst { selection } = editor.state;\n\tconst { $from, $to } = selection;\n\tif (!selection.empty && $from.sameParent($to)) return false;\n\tif (nextListIsDeeper(name, editor.state)) return editor.chain().focus(editor.state.selection.from + 4).lift(name).joinBackward().run();\n\tif (nextListIsHigher(name, editor.state)) return editor.chain().joinForward().joinBackward().run();\n\treturn editor.commands.joinItemForward();\n};\n//#endregion\n//#region src/keymap/listHelpers/handleTab.ts\nconst handleTab = (editor, name, parentListTypes) => {\n\tconst { state } = editor;\n\tconst { selection } = state;\n\tif (!selection.empty) return false;\n\tconst { $from } = selection;\n\tif ($from.parentOffset !== 0) return false;\n\tif (!$from.parent.isTextblock) return false;\n\tif (isNodeActive(state, name)) return false;\n\tconst previous = getPreviousBlockSibling($from);\n\tif (!previous || !parentListTypes.includes(previous.type.name)) return false;\n\tconst lastItem = previous.lastChild;\n\tif (!lastItem || lastItem.type.name !== name) return false;\n\tconst block = $from.parent;\n\tif (!lastItem.canReplace(lastItem.childCount, lastItem.childCount, Fragment.from(block))) return false;\n\tconst blockStart = $from.before();\n\tconst blockEnd = $from.after();\n\tconst insideLastItemEnd = blockStart - 2;\n\treturn editor.commands.command(({ tr, dispatch }) => {\n\t\tif (dispatch) {\n\t\t\ttr.delete(blockStart, blockEnd).insert(insideLastItemEnd, Fragment.from(block));\n\t\t\ttr.setSelection(TextSelection.create(tr.doc, insideLastItemEnd + 1));\n\t\t\ttr.scrollIntoView();\n\t\t}\n\t\treturn true;\n\t});\n};\n//#endregion\n//#region src/keymap/listHelpers/hasListItemAfter.ts\nconst hasListItemAfter = (typeOrName, state) => {\n\tvar _$targetPos$nodeAfter;\n\tconst { $anchor } = state.selection;\n\tconst $targetPos = state.doc.resolve($anchor.pos - $anchor.parentOffset - 2);\n\tif ($targetPos.index() === $targetPos.parent.childCount - 1) return false;\n\tif (((_$targetPos$nodeAfter = $targetPos.nodeAfter) === null || _$targetPos$nodeAfter === void 0 ? void 0 : _$targetPos$nodeAfter.type.name) !== typeOrName) return false;\n\treturn true;\n};\n//#endregion\n//#region src/keymap/listHelpers/hasListItemBefore.ts\nconst hasListItemBefore = (typeOrName, state) => {\n\tvar _$targetPos$nodeBefor;\n\tconst { $anchor } = state.selection;\n\tconst $targetPos = state.doc.resolve($anchor.pos - 2);\n\tif ($targetPos.index() === 0) return false;\n\tif (((_$targetPos$nodeBefor = $targetPos.nodeBefore) === null || _$targetPos$nodeBefor === void 0 ? void 0 : _$targetPos$nodeBefor.type.name) !== typeOrName) return false;\n\treturn true;\n};\n//#endregion\n//#region src/keymap/listHelpers/listItemHasSubList.ts\nconst listItemHasSubList = (typeOrName, state, node) => {\n\tif (!node) return false;\n\tconst nodeType = getNodeType(typeOrName, state.schema);\n\tlet hasSubList = false;\n\tnode.descendants((child) => {\n\t\tif (child.type === nodeType) hasSubList = true;\n\t});\n\treturn hasSubList;\n};\n//#endregion\n//#region src/keymap/listHelpers/index.ts\nvar listHelpers_exports = /* @__PURE__ */ __exportAll({\n\tfindListItemPos: () => findListItemPos,\n\tgetNextListDepth: () => getNextListDepth,\n\thandleBackspace: () => handleBackspace,\n\thandleDelete: () => handleDelete,\n\thandleTab: () => handleTab,\n\thasListBefore: () => hasListBefore,\n\thasListItemAfter: () => hasListItemAfter,\n\thasListItemBefore: () => hasListItemBefore,\n\tlistItemHasSubList: () => listItemHasSubList,\n\tnextListIsDeeper: () => nextListIsDeeper,\n\tnextListIsHigher: () => nextListIsHigher\n});\n//#endregion\n//#region src/keymap/list-keymap.ts\n/**\n* This extension registers custom keymaps to change the behaviour of the backspace and delete keys.\n* By default Prosemirror keyhandling will always lift or sink items so paragraphs are joined into\n* the adjacent or previous list item. This extension will prevent this behaviour and instead will\n* try to join paragraphs from two list items into a single list item.\n* @see https://www.tiptap.dev/api/extensions/list-keymap\n*/\nconst ListKeymap = Extension.create({\n\tname: \"listKeymap\",\n\taddOptions() {\n\t\treturn { listTypes: [{\n\t\t\titemName: \"listItem\",\n\t\t\twrapperNames: [\"bulletList\", \"orderedList\"]\n\t\t}, {\n\t\t\titemName: \"taskItem\",\n\t\t\twrapperNames: [\"taskList\"]\n\t\t}] };\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\tDelete: ({ editor }) => {\n\t\t\t\tlet handled = false;\n\t\t\t\tthis.options.listTypes.forEach(({ itemName }) => {\n\t\t\t\t\tif (editor.state.schema.nodes[itemName] === void 0) return;\n\t\t\t\t\tif (handleDelete(editor, itemName)) handled = true;\n\t\t\t\t});\n\t\t\t\treturn handled;\n\t\t\t},\n\t\t\t\"Mod-Delete\": ({ editor }) => {\n\t\t\t\tlet handled = false;\n\t\t\t\tthis.options.listTypes.forEach(({ itemName }) => {\n\t\t\t\t\tif (editor.state.schema.nodes[itemName] === void 0) return;\n\t\t\t\t\tif (handleDelete(editor, itemName)) handled = true;\n\t\t\t\t});\n\t\t\t\treturn handled;\n\t\t\t},\n\t\t\tBackspace: ({ editor }) => {\n\t\t\t\tlet handled = false;\n\t\t\t\tthis.options.listTypes.forEach(({ itemName, wrapperNames }) => {\n\t\t\t\t\tif (editor.state.schema.nodes[itemName] === void 0) return;\n\t\t\t\t\tif (handleBackspace(editor, itemName, wrapperNames)) handled = true;\n\t\t\t\t});\n\t\t\t\treturn handled;\n\t\t\t},\n\t\t\t\"Mod-Backspace\": ({ editor }) => {\n\t\t\t\tlet handled = false;\n\t\t\t\tthis.options.listTypes.forEach(({ itemName, wrapperNames }) => {\n\t\t\t\t\tif (editor.state.schema.nodes[itemName] === void 0) return;\n\t\t\t\t\tif (handleBackspace(editor, itemName, wrapperNames)) handled = true;\n\t\t\t\t});\n\t\t\t\treturn handled;\n\t\t\t},\n\t\t\tTab: ({ editor }) => {\n\t\t\t\tfor (const { itemName, wrapperNames } of this.options.listTypes) {\n\t\t\t\t\tif (editor.state.schema.nodes[itemName] === void 0) continue;\n\t\t\t\t\tif (handleTab(editor, itemName, wrapperNames)) return true;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\t}\n});\n//#endregion\n//#region src/ordered-list/utils.ts\n/**\n* Matches an ordered list item line with optional leading whitespace.\n* Captures: (1) indentation spaces, (2) item marker (number, letter, or roman numeral),\n* (3) separator (. or )), (4) content after marker\n*\n* Examples: \"1. Item\", \"  a) Nested item\", \"    I. Roman item\", \"iii. Another\", \"aa. Item 27\"\n*/\nconst ORDERED_LIST_ITEM_REGEX = new RegExp(`^(\\\\s*)(${ORDERED_LIST_MARKER_PATTERN})([.)])\\\\s+(.*)$`);\n/**\n* Matches any line that starts with whitespace (indented content).\n* Used to identify continuation content that belongs to a list item.\n*/\nconst INDENTED_LINE_REGEX = /^\\s/;\n/**\n* This are blocks that can interrupt a paragraph, so a line starting with one of\n* them can never be lazy continuation text of a list item\n*/\nconst PARAGRAPH_INTERRUPTERS = {\n\theading: /^#{1,6}(?:\\s|$)/,\n\tbulletItem: /^[-+*]\\s+/,\n\tcodeFence: /^(?:```|~~~)/,\n\tblockMath: /^\\$\\$/,\n\tthematicBreak: /^(?:(?:-[ \\t]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})$/\n};\nfunction isOrderedListMarkerLine(line) {\n\treturn ORDERED_LIST_ITEM_REGEX.test(line.trimStart());\n}\nfunction isBlockContentLine(line) {\n\tconst trimmedLine = line.trimStart();\n\treturn PARAGRAPH_INTERRUPTERS.bulletItem.test(trimmedLine) || isOrderedListMarkerLine(trimmedLine) || PARAGRAPH_INTERRUPTERS.heading.test(trimmedLine) || PARAGRAPH_INTERRUPTERS.thematicBreak.test(trimmedLine) && !trimmedLine.startsWith(\"-\") || /^>\\s?/.test(trimmedLine) || PARAGRAPH_INTERRUPTERS.codeFence.test(trimmedLine) || PARAGRAPH_INTERRUPTERS.blockMath.test(trimmedLine);\n}\nfunction interruptsLazyContinuation(line) {\n\treturn Object.values(PARAGRAPH_INTERRUPTERS).some((pattern) => pattern.test(line));\n}\nfunction splitItemContent(contentLines) {\n\tconst paragraphLines = [];\n\tconst blockLines = [];\n\tlet reachedBlockBoundary = false;\n\tcontentLines.forEach((line) => {\n\t\tif (reachedBlockBoundary) {\n\t\t\tblockLines.push(line);\n\t\t\treturn;\n\t\t}\n\t\tif (line.trim() === \"\") {\n\t\t\treachedBlockBoundary = true;\n\t\t\tblockLines.push(line);\n\t\t\treturn;\n\t\t}\n\t\tif (paragraphLines.length > 0 && isBlockContentLine(line)) {\n\t\t\treachedBlockBoundary = true;\n\t\t\tblockLines.push(line);\n\t\t\treturn;\n\t\t}\n\t\tparagraphLines.push(line);\n\t});\n\treturn {\n\t\tparagraphLines,\n\t\tblockLines\n\t};\n}\n/**\n* Collects all ordered list items from lines, parsing them into a flat array\n* with indentation information. Stops collecting continuation content when\n* encountering nested list items, allowing them to be processed separately.\n*\n* @param lines - Array of source lines to parse\n* @returns Tuple of [listItems array, number of lines consumed]\n*/\nfunction collectOrderedListItems(lines) {\n\tconst listItems = [];\n\tlet currentLineIndex = 0;\n\tlet consumed = 0;\n\twhile (currentLineIndex < lines.length) {\n\t\tconst line = lines[currentLineIndex];\n\t\tconst match = line.match(ORDERED_LIST_ITEM_REGEX);\n\t\tif (!match) break;\n\t\tconst [, indent, marker, _separator, content] = match;\n\t\tconst indentLevel = indent.length;\n\t\tconst number = parseInt(marker, 10);\n\t\tconst markerType = isNaN(number) ? detectMarkerType(marker) : void 0;\n\t\tconst itemNumber = isNaN(number) ? markerToStart(marker) : number;\n\t\tconst itemContentLines = [content];\n\t\tlet nextLineIndex = currentLineIndex + 1;\n\t\tconst itemLines = [line];\n\t\tlet sawBlankLine = false;\n\t\twhile (nextLineIndex < lines.length) {\n\t\t\tconst nextLine = lines[nextLineIndex];\n\t\t\tif (nextLine.match(ORDERED_LIST_ITEM_REGEX)) break;\n\t\t\tif (nextLine.trim() === \"\") {\n\t\t\t\titemLines.push(nextLine);\n\t\t\t\titemContentLines.push(\"\");\n\t\t\t\tsawBlankLine = true;\n\t\t\t\tnextLineIndex += 1;\n\t\t\t} else if (nextLine.match(INDENTED_LINE_REGEX)) {\n\t\t\t\tconst leadingWhitespace = nextLine.length - nextLine.trimStart().length;\n\t\t\t\tconst contentIndent = indentLevel + marker.length + 1;\n\t\t\t\titemLines.push(nextLine);\n\t\t\t\titemContentLines.push(nextLine.slice(Math.min(leadingWhitespace, contentIndent)));\n\t\t\t\tnextLineIndex += 1;\n\t\t\t} else {\n\t\t\t\tif (sawBlankLine || interruptsLazyContinuation(nextLine)) break;\n\t\t\t\titemLines.push(nextLine);\n\t\t\t\titemContentLines.push(nextLine);\n\t\t\t\tnextLineIndex += 1;\n\t\t\t}\n\t\t}\n\t\tlistItems.push({\n\t\t\tindent: indentLevel,\n\t\t\tnumber: itemNumber,\n\t\t\ttype: markerType,\n\t\t\tcontent: itemContentLines.join(\"\\n\").trim(),\n\t\t\tcontentLines: itemContentLines,\n\t\t\traw: itemLines.join(\"\\n\")\n\t\t});\n\t\tconsumed = nextLineIndex;\n\t\tcurrentLineIndex = nextLineIndex;\n\t}\n\treturn [listItems, consumed];\n}\nconst PLAIN_TEXT_ORDERED_LIST_LINE_REGEX = new RegExp(`^(${ORDERED_LIST_MARKER_PATTERN})([.)])\\\\s+(.+)$`);\n/**\n* Parse plain-text pasted ordered list lines into JSONContent, or null if not a typed list.\n*/\nfunction parsePlainTextOrderedListPaste(text) {\n\tconst lines = text.split(\"\\n\").filter((l) => l.trim().length > 0);\n\tif (lines.length === 0) return null;\n\tconst parsedItems = [];\n\tfor (const line of lines) {\n\t\tconst match = line.trim().match(PLAIN_TEXT_ORDERED_LIST_LINE_REGEX);\n\t\tif (!match) return null;\n\t\tparsedItems.push({\n\t\t\tmarker: match[1],\n\t\t\tcontent: match[3]\n\t\t});\n\t}\n\tif (!areOrderedListMarkersSequential(parsedItems.map((item) => item.marker))) return null;\n\treturn {\n\t\ttype: \"orderedList\",\n\t\tattrs: buildOrderedListAttrsFromMarker(parsedItems[0].marker),\n\t\tcontent: parsedItems.map((item) => ({\n\t\t\ttype: \"listItem\",\n\t\t\tcontent: [{\n\t\t\t\ttype: \"paragraph\",\n\t\t\t\tcontent: [{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: item.content\n\t\t\t\t}]\n\t\t\t}]\n\t\t}))\n\t};\n}\n/**\n* Recursively builds a nested structure from a flat array of list items\n* based on their indentation levels. Creates proper markdown tokens with\n* nested lists where appropriate.\n*\n* @param items - Flat array of list items with indentation info\n* @param baseIndent - The indentation level to process at this recursion level\n* @param lexer - Markdown lexer for parsing inline and block content\n* @returns Array of list_item tokens with proper nesting\n*/\nfunction buildNestedStructure(items, baseIndent, lexer) {\n\tconst result = [];\n\tlet currentIndex = 0;\n\twhile (currentIndex < items.length) {\n\t\tconst item = items[currentIndex];\n\t\tif (item.indent === baseIndent) {\n\t\t\tconst { paragraphLines, blockLines } = splitItemContent(item.contentLines);\n\t\t\tconst mainText = paragraphLines.join(\"\\n\").trim();\n\t\t\tconst tokens = [];\n\t\t\tif (mainText) tokens.push({\n\t\t\t\ttype: \"paragraph\",\n\t\t\t\traw: mainText,\n\t\t\t\ttokens: lexer.inlineTokens(mainText)\n\t\t\t});\n\t\t\tconst additionalContent = blockLines.join(\"\\n\").trim();\n\t\t\tif (additionalContent) {\n\t\t\t\tconst blockTokens = lexer.blockTokens(additionalContent);\n\t\t\t\ttokens.push(...blockTokens);\n\t\t\t}\n\t\t\tlet lookAheadIndex = currentIndex + 1;\n\t\t\tconst nestedItems = [];\n\t\t\twhile (lookAheadIndex < items.length && items[lookAheadIndex].indent > baseIndent) {\n\t\t\t\tnestedItems.push(items[lookAheadIndex]);\n\t\t\t\tlookAheadIndex += 1;\n\t\t\t}\n\t\t\tif (nestedItems.length > 0) {\n\t\t\t\tconst nestedListItems = buildNestedStructure(nestedItems, Math.min(...nestedItems.map((nestedItem) => nestedItem.indent)), lexer);\n\t\t\t\ttokens.push({\n\t\t\t\t\ttype: \"list\",\n\t\t\t\t\tordered: true,\n\t\t\t\t\tstart: nestedItems[0].number,\n\t\t\t\t\ttypeMarker: nestedItems[0].type,\n\t\t\t\t\titems: nestedListItems,\n\t\t\t\t\traw: nestedItems.map((nestedItem) => nestedItem.raw).join(\"\\n\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tresult.push({\n\t\t\t\ttype: \"list_item\",\n\t\t\t\traw: item.raw,\n\t\t\t\ttokens\n\t\t\t});\n\t\t\tcurrentIndex = lookAheadIndex;\n\t\t} else currentIndex += 1;\n\t}\n\treturn result;\n}\n/**\n* Parses markdown list item tokens into Tiptap JSONContent structure,\n* ensuring text content is properly wrapped in paragraph nodes.\n*\n* @param items - Array of markdown tokens representing list items\n* @param helpers - Markdown parse helpers for recursive parsing\n* @returns Array of listItem JSONContent nodes\n*/\nfunction parseListItems(items, helpers) {\n\treturn items.map((item) => {\n\t\tif (item.type !== \"list_item\") return helpers.parseChildren([item])[0];\n\t\tconst content = [];\n\t\tif (item.tokens && item.tokens.length > 0) item.tokens.forEach((itemToken) => {\n\t\t\tif (itemToken.type === \"paragraph\" || itemToken.type === \"list\" || itemToken.type === \"blockquote\" || itemToken.type === \"code\") content.push(...helpers.parseChildren([itemToken]));\n\t\t\telse if (itemToken.type === \"text\" && itemToken.tokens) {\n\t\t\t\tconst inlineContent = helpers.parseChildren([itemToken]);\n\t\t\t\tcontent.push({\n\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\tcontent: inlineContent\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst parsed = helpers.parseChildren([itemToken]);\n\t\t\t\tif (parsed.length > 0) content.push(...parsed);\n\t\t\t}\n\t\t});\n\t\treturn {\n\t\t\ttype: \"listItem\",\n\t\t\tcontent\n\t\t};\n\t});\n}\n//#endregion\n//#region src/ordered-list/ordered-list.ts\nconst ListItemName = \"listItem\";\nconst TextStyleName = \"textStyle\";\n/**\n* Matches an ordered list to a 1. on input (or any number followed by a dot).\n*/\nconst orderedListInputRegex = /^(\\d+)\\.\\s$/;\n/**\n* Maps CSS list-style-type values to HTML type attribute values.\n* Google Docs and Word often use CSS instead of the HTML type attribute.\n*/\nfunction cssListStyleTypeToHtmlType(style) {\n\tconst match = style.match(/list-style-type\\s*:\\s*([^;]+)/i);\n\tif (!match) return null;\n\tswitch (match[1].trim().toLowerCase()) {\n\t\tcase \"upper-roman\": return \"I\";\n\t\tcase \"lower-roman\": return \"i\";\n\t\tcase \"upper-alpha\":\n\t\tcase \"upper-latin\": return \"A\";\n\t\tcase \"lower-alpha\":\n\t\tcase \"lower-latin\": return \"a\";\n\t\tdefault: return null;\n\t}\n}\n/**\n* This extension allows you to create ordered lists.\n* This requires the ListItem extension\n* @see https://www.tiptap.dev/api/nodes/ordered-list\n* @see https://www.tiptap.dev/api/nodes/list-item\n*/\nconst OrderedList = Node.create({\n\tname: \"orderedList\",\n\taddOptions() {\n\t\treturn {\n\t\t\titemTypeName: \"listItem\",\n\t\t\tHTMLAttributes: {},\n\t\t\tkeepMarks: false,\n\t\t\tkeepAttributes: false\n\t\t};\n\t},\n\tgroup: \"block list\",\n\tcontent() {\n\t\treturn `${this.options.itemTypeName}+`;\n\t},\n\taddAttributes() {\n\t\treturn {\n\t\t\tstart: {\n\t\t\t\tdefault: 1,\n\t\t\t\tparseHTML: (element) => {\n\t\t\t\t\treturn element.hasAttribute(\"start\") ? parseInt(element.getAttribute(\"start\") || \"\", 10) : 1;\n\t\t\t\t}\n\t\t\t},\n\t\t\ttype: {\n\t\t\t\tdefault: null,\n\t\t\t\tparseHTML: (element) => {\n\t\t\t\t\tconst htmlType = element.getAttribute(\"type\");\n\t\t\t\t\tif (htmlType) return htmlType;\n\t\t\t\t\tconst style = element.getAttribute(\"style\");\n\t\t\t\t\tif (style) {\n\t\t\t\t\t\tconst mappedFromOl = cssListStyleTypeToHtmlType(style);\n\t\t\t\t\t\tif (mappedFromOl) return mappedFromOl;\n\t\t\t\t\t}\n\t\t\t\t\tconst firstLi = element.querySelector(\"li\");\n\t\t\t\t\tif (firstLi) {\n\t\t\t\t\t\tconst liStyle = firstLi.getAttribute(\"style\");\n\t\t\t\t\t\tif (liStyle) {\n\t\t\t\t\t\t\tconst mappedFromLi = cssListStyleTypeToHtmlType(liStyle);\n\t\t\t\t\t\t\tif (mappedFromLi) return mappedFromLi;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t},\n\tparseHTML() {\n\t\treturn [{ tag: \"ol\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\tconst { start, type, ...attributesWithoutType } = HTMLAttributes;\n\t\tconst attrs = mergeAttributes(this.options.HTMLAttributes, attributesWithoutType);\n\t\tif (start !== 1) attrs.start = start;\n\t\tif (type && type !== \"1\") attrs.type = type;\n\t\treturn [\n\t\t\t\"ol\",\n\t\t\tattrs,\n\t\t\t0\n\t\t];\n\t},\n\tmarkdownTokenName: \"list\",\n\tparseMarkdown: (token, helpers) => {\n\t\tif (token.type !== \"list\" || !token.ordered) return [];\n\t\tconst startValue = token.start || 1;\n\t\tconst typeValue = token.typeMarker;\n\t\tconst content = token.items ? parseListItems(token.items, helpers) : [];\n\t\tconst attrs = {};\n\t\tif (startValue !== 1) attrs.start = startValue;\n\t\tif (typeValue) attrs.type = typeValue;\n\t\tif (Object.keys(attrs).length > 0) return {\n\t\t\ttype: \"orderedList\",\n\t\t\tattrs,\n\t\t\tcontent\n\t\t};\n\t\treturn {\n\t\t\ttype: \"orderedList\",\n\t\t\tcontent\n\t\t};\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tif (!node.content) return \"\";\n\t\treturn h.renderChildren(node.content, \"\\n\");\n\t},\n\tmarkdownTokenizer: {\n\t\tname: \"orderedList\",\n\t\tlevel: \"block\",\n\t\tstart: () => -1,\n\t\ttokenize: (src, _tokens, lexer) => {\n\t\t\tvar _listItems$, _listItems$2;\n\t\t\tconst lines = src.split(\"\\n\");\n\t\t\tconst [listItems, consumed] = collectOrderedListItems(lines);\n\t\t\tif (listItems.length === 0) return;\n\t\t\tconst items = buildNestedStructure(listItems, listItems[0].indent, lexer);\n\t\t\tif (items.length === 0) return;\n\t\t\treturn {\n\t\t\t\ttype: \"list\",\n\t\t\t\tordered: true,\n\t\t\t\tstart: ((_listItems$ = listItems[0]) === null || _listItems$ === void 0 ? void 0 : _listItems$.number) || 1,\n\t\t\t\ttypeMarker: (_listItems$2 = listItems[0]) === null || _listItems$2 === void 0 ? void 0 : _listItems$2.type,\n\t\t\t\titems,\n\t\t\t\traw: lines.slice(0, consumed).join(\"\\n\")\n\t\t\t};\n\t\t}\n\t},\n\tmarkdownOptions: { indentsContent: true },\n\taddCommands() {\n\t\treturn { toggleOrderedList: () => ({ commands, chain }) => {\n\t\t\tif (this.options.keepAttributes) return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItemName, this.editor.getAttributes(TextStyleName)).run();\n\t\t\treturn commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks);\n\t\t} };\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn { \"Mod-Shift-7\": () => this.editor.commands.toggleOrderedList() };\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({ props: { handlePaste: (view, event) => {\n\t\t\tvar _event$clipboardData, _event$clipboardData2;\n\t\t\tconst html = (_event$clipboardData = event.clipboardData) === null || _event$clipboardData === void 0 ? void 0 : _event$clipboardData.getData(\"text/html\");\n\t\t\tif (html === null || html === void 0 ? void 0 : html.trim()) return false;\n\t\t\tconst text = (_event$clipboardData2 = event.clipboardData) === null || _event$clipboardData2 === void 0 ? void 0 : _event$clipboardData2.getData(\"text/plain\");\n\t\t\tif (!text) return false;\n\t\t\tconst orderedListContent = parsePlainTextOrderedListPaste(text);\n\t\t\tif (!orderedListContent) return false;\n\t\t\ttry {\n\t\t\t\tconst orderedListNode = view.state.schema.nodeFromJSON(orderedListContent);\n\t\t\t\tconst tr = view.state.tr.replaceSelectionWith(orderedListNode);\n\t\t\t\tview.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} } })];\n\t},\n\taddInputRules() {\n\t\tconst joinPredicate = (match, node) => {\n\t\t\treturn (!node.attrs.type || node.attrs.type === \"1\") && node.childCount + node.attrs.start === +match[1];\n\t\t};\n\t\tlet inputRule = wrappingInputRule({\n\t\t\tfind: orderedListInputRegex,\n\t\t\ttype: this.type,\n\t\t\tgetAttributes: (match) => ({ start: +match[1] }),\n\t\t\tjoinPredicate\n\t\t});\n\t\tif (this.options.keepMarks || this.options.keepAttributes) inputRule = wrappingInputRule({\n\t\t\tfind: orderedListInputRegex,\n\t\t\ttype: this.type,\n\t\t\tkeepMarks: this.options.keepMarks,\n\t\t\tkeepAttributes: this.options.keepAttributes,\n\t\t\tgetAttributes: (match) => ({\n\t\t\t\tstart: +match[1],\n\t\t\t\t...this.editor.getAttributes(TextStyleName)\n\t\t\t}),\n\t\t\tjoinPredicate,\n\t\t\teditor: this.editor\n\t\t});\n\t\treturn [inputRule];\n\t}\n});\n//#endregion\n//#region src/task-item/task-item.ts\n/**\n* Matches a task item to a - [ ] on input.\n*/\nconst inputRegex = /^\\s*(\\[([( |x])?\\])\\s$/;\n/**\n* Hides the checkbox label visually while keeping it in the accessibility tree.\n*/\nconst visuallyHiddenStyle = \"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0\";\nconst getCheckboxLabel = (node, checked, a11y) => {\n\tvar _a11y$checkboxLabel;\n\treturn (a11y === null || a11y === void 0 || (_a11y$checkboxLabel = a11y.checkboxLabel) === null || _a11y$checkboxLabel === void 0 ? void 0 : _a11y$checkboxLabel.call(a11y, node, checked)) || `Task item checkbox for ${node.textContent || \"empty task item\"}`;\n};\n/**\n* This extension allows you to create task items.\n* @see https://www.tiptap.dev/api/nodes/task-item\n*/\nconst TaskItem = Node.create({\n\tname: \"taskItem\",\n\taddOptions() {\n\t\treturn {\n\t\t\tnested: false,\n\t\t\tHTMLAttributes: {},\n\t\t\ttaskListTypeName: \"taskList\",\n\t\t\ta11y: void 0\n\t\t};\n\t},\n\tcontent() {\n\t\treturn this.options.nested ? \"paragraph block*\" : \"paragraph+\";\n\t},\n\tdefining: true,\n\taddAttributes() {\n\t\treturn { checked: {\n\t\t\tdefault: false,\n\t\t\tkeepOnSplit: false,\n\t\t\tparseHTML: (element) => {\n\t\t\t\tconst dataChecked = element.getAttribute(\"data-checked\");\n\t\t\t\treturn dataChecked === \"\" || dataChecked === \"true\";\n\t\t\t},\n\t\t\trenderHTML: (attributes) => ({ \"data-checked\": attributes.checked })\n\t\t} };\n\t},\n\tparseHTML() {\n\t\treturn [{\n\t\t\ttag: `li[data-type=\"${this.name}\"]`,\n\t\t\tpriority: 51,\n\t\t\tcontentElement: (element) => {\n\t\t\t\tvar _element$querySelecto;\n\t\t\t\treturn (_element$querySelecto = element.querySelector(\"div\")) !== null && _element$querySelecto !== void 0 ? _element$querySelecto : element;\n\t\t\t}\n\t\t}];\n\t},\n\trenderHTML({ node, HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"li\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { \"data-type\": this.name }),\n\t\t\t[\n\t\t\t\t\"label\",\n\t\t\t\t[\"input\", {\n\t\t\t\t\ttype: \"checkbox\",\n\t\t\t\t\tchecked: node.attrs.checked ? \"checked\" : null\n\t\t\t\t}],\n\t\t\t\t[\"span\"]\n\t\t\t],\n\t\t\t[\"div\", 0]\n\t\t];\n\t},\n\tparseMarkdown: (token, h) => {\n\t\tconst content = [];\n\t\tif (token.tokens && token.tokens.length > 0) content.push(h.createNode(\"paragraph\", {}, h.parseInline(token.tokens)));\n\t\telse if (token.text) content.push(h.createNode(\"paragraph\", {}, [h.createNode(\"text\", { text: token.text })]));\n\t\telse content.push(h.createNode(\"paragraph\", {}, []));\n\t\tif (token.nestedTokens && token.nestedTokens.length > 0) {\n\t\t\tconst nestedContent = h.parseChildren(token.nestedTokens);\n\t\t\tcontent.push(...nestedContent);\n\t\t}\n\t\treturn h.createNode(\"taskItem\", { checked: token.checked || false }, content);\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tvar _node$attrs;\n\t\tconst prefix = `- [${((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.checked) ? \"x\" : \" \"}] `;\n\t\treturn renderNestedMarkdownContent(node, h, prefix);\n\t},\n\taddExtensions() {\n\t\tif (!this.options.nested) return [];\n\t\treturn [createBranchingListDeleteKeymap(this.name, [this.options.taskListTypeName])];\n\t},\n\taddKeyboardShortcuts() {\n\t\tconst shortcuts = {\n\t\t\tEnter: () => this.editor.commands.splitListItem(this.name),\n\t\t\t\"Shift-Tab\": () => this.editor.commands.liftListItem(this.name)\n\t\t};\n\t\tif (!this.options.nested) return shortcuts;\n\t\treturn {\n\t\t\t...shortcuts,\n\t\t\tTab: () => this.editor.commands.sinkListItem(this.name)\n\t\t};\n\t},\n\taddNodeView() {\n\t\treturn ({ node, HTMLAttributes, getPos, editor }) => {\n\t\t\tconst listItem = document.createElement(\"li\");\n\t\t\tconst checkboxWrapper = document.createElement(\"label\");\n\t\t\tconst checkboxStyler = document.createElement(\"span\");\n\t\t\tconst checkbox = document.createElement(\"input\");\n\t\t\tconst content = document.createElement(\"div\");\n\t\t\tcheckboxStyler.style.cssText = visuallyHiddenStyle;\n\t\t\tconst updateA11Y = (currentNode) => {\n\t\t\t\tconst label = getCheckboxLabel(currentNode, currentNode.attrs.checked, this.options.a11y);\n\t\t\t\tcheckbox.setAttribute(\"aria-label\", label);\n\t\t\t\tcheckboxStyler.textContent = label;\n\t\t\t};\n\t\t\tupdateA11Y(node);\n\t\t\tcheckboxWrapper.contentEditable = \"false\";\n\t\t\tcheckbox.type = \"checkbox\";\n\t\t\tcheckbox.addEventListener(\"mousedown\", (event) => event.preventDefault());\n\t\t\tcheckbox.addEventListener(\"change\", (event) => {\n\t\t\t\tif (!editor.isEditable && !this.options.onReadOnlyChecked) {\n\t\t\t\t\tcheckbox.checked = !checkbox.checked;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { checked } = event.target;\n\t\t\t\tif (editor.isEditable && typeof getPos === \"function\") editor.chain().focus(void 0, { scrollIntoView: false }).command(({ tr }) => {\n\t\t\t\t\tconst position = getPos();\n\t\t\t\t\tif (typeof position !== \"number\") return false;\n\t\t\t\t\tconst currentNode = tr.doc.nodeAt(position);\n\t\t\t\t\ttr.setNodeMarkup(position, void 0, {\n\t\t\t\t\t\t...currentNode === null || currentNode === void 0 ? void 0 : currentNode.attrs,\n\t\t\t\t\t\tchecked\n\t\t\t\t\t});\n\t\t\t\t\treturn true;\n\t\t\t\t}).run();\n\t\t\t\tif (!editor.isEditable && this.options.onReadOnlyChecked) {\n\t\t\t\t\tif (!this.options.onReadOnlyChecked(node, checked)) checkbox.checked = !checkbox.checked;\n\t\t\t\t}\n\t\t\t});\n\t\t\tObject.entries(this.options.HTMLAttributes).forEach(([key, value]) => {\n\t\t\t\tlistItem.setAttribute(key, value);\n\t\t\t});\n\t\t\tlistItem.dataset.checked = node.attrs.checked;\n\t\t\tcheckbox.checked = node.attrs.checked;\n\t\t\tcheckboxWrapper.append(checkbox, checkboxStyler);\n\t\t\tlistItem.append(checkboxWrapper, content);\n\t\t\tObject.entries(HTMLAttributes).forEach(([key, value]) => {\n\t\t\t\tlistItem.setAttribute(key, value);\n\t\t\t});\n\t\t\tlet prevRenderedAttributeKeys = new Set(Object.keys(HTMLAttributes));\n\t\t\treturn {\n\t\t\t\tdom: listItem,\n\t\t\t\tcontentDOM: content,\n\t\t\t\tupdate: (updatedNode) => {\n\t\t\t\t\tif (updatedNode.type !== this.type) return false;\n\t\t\t\t\tlistItem.dataset.checked = updatedNode.attrs.checked;\n\t\t\t\t\tcheckbox.checked = updatedNode.attrs.checked;\n\t\t\t\t\tupdateA11Y(updatedNode);\n\t\t\t\t\tconst extensionAttributes = editor.extensionManager.attributes;\n\t\t\t\t\tconst newHTMLAttributes = getRenderedAttributes(updatedNode, extensionAttributes);\n\t\t\t\t\tconst newKeys = new Set(Object.keys(newHTMLAttributes));\n\t\t\t\t\tconst staticAttrs = this.options.HTMLAttributes;\n\t\t\t\t\tprevRenderedAttributeKeys.forEach((key) => {\n\t\t\t\t\t\tif (!newKeys.has(key)) {\n\t\t\t\t\t\t\tif (key in staticAttrs) listItem.setAttribute(key, staticAttrs[key]);\n\t\t\t\t\t\t\telse listItem.removeAttribute(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tObject.entries(newHTMLAttributes).forEach(([key, value]) => {\n\t\t\t\t\t\tif (value === null || value === void 0) {\n\t\t\t\t\t\t\tif (key in staticAttrs) listItem.setAttribute(key, staticAttrs[key]);\n\t\t\t\t\t\t\telse listItem.removeAttribute(key);\n\t\t\t\t\t\t} else listItem.setAttribute(key, value);\n\t\t\t\t\t});\n\t\t\t\t\tprevRenderedAttributeKeys = newKeys;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t},\n\taddInputRules() {\n\t\treturn [wrappingInputRule({\n\t\t\tfind: inputRegex,\n\t\t\ttype: this.type,\n\t\t\tgetAttributes: (match) => ({ checked: match[match.length - 1] === \"x\" })\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/task-list/task-list.ts\n/**\n* This extension allows you to create task lists.\n* @see https://www.tiptap.dev/api/nodes/task-list\n*/\nconst TaskList = Node.create({\n\tname: \"taskList\",\n\taddOptions() {\n\t\treturn {\n\t\t\titemTypeName: \"taskItem\",\n\t\t\tHTMLAttributes: {}\n\t\t};\n\t},\n\tgroup: \"block list\",\n\tcontent() {\n\t\treturn `${this.options.itemTypeName}+`;\n\t},\n\tparseHTML() {\n\t\treturn [{\n\t\t\ttag: `ul[data-type=\"${this.name}\"]`,\n\t\t\tpriority: 51\n\t\t}];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"ul\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { \"data-type\": this.name }),\n\t\t\t0\n\t\t];\n\t},\n\tparseMarkdown: (token, h) => {\n\t\treturn h.createNode(\"taskList\", {}, h.parseChildren(token.items || []));\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tif (!node.content) return \"\";\n\t\treturn h.renderChildren(node.content, \"\\n\");\n\t},\n\tmarkdownTokenizer: {\n\t\tname: \"taskList\",\n\t\tlevel: \"block\",\n\t\tstart(src) {\n\t\t\tvar _src$match;\n\t\t\tconst index = (_src$match = src.match(/^\\s*[-+*]\\s+\\[([ xX])\\]\\s+/)) === null || _src$match === void 0 ? void 0 : _src$match.index;\n\t\t\treturn index !== void 0 ? index : -1;\n\t\t},\n\t\ttokenize(src, tokens, lexer) {\n\t\t\tconst parseTaskListContent = (content) => {\n\t\t\t\tconst nestedResult = parseIndentedBlocks(content, {\n\t\t\t\t\titemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n\t\t\t\t\textractItemData: (match) => ({\n\t\t\t\t\t\tindentLevel: match[1].length,\n\t\t\t\t\t\tmainContent: match[4],\n\t\t\t\t\t\tchecked: match[3].toLowerCase() === \"x\"\n\t\t\t\t\t}),\n\t\t\t\t\tcreateToken: (data, nestedTokens) => ({\n\t\t\t\t\t\ttype: \"taskItem\",\n\t\t\t\t\t\traw: \"\",\n\t\t\t\t\t\tmainContent: data.mainContent,\n\t\t\t\t\t\tindentLevel: data.indentLevel,\n\t\t\t\t\t\tchecked: data.checked,\n\t\t\t\t\t\ttext: data.mainContent,\n\t\t\t\t\t\ttokens: lexer.inlineTokens(data.mainContent),\n\t\t\t\t\t\tnestedTokens\n\t\t\t\t\t}),\n\t\t\t\t\tcustomNestedParser: parseTaskListContent\n\t\t\t\t}, lexer);\n\t\t\t\tif (nestedResult) {\n\t\t\t\t\tconst taskListToken = {\n\t\t\t\t\t\ttype: \"taskList\",\n\t\t\t\t\t\traw: nestedResult.raw,\n\t\t\t\t\t\titems: nestedResult.items\n\t\t\t\t\t};\n\t\t\t\t\tconst remainder = content.slice(nestedResult.raw.length);\n\t\t\t\t\tif (remainder.trim()) return [taskListToken, ...lexer.blockTokens(remainder)];\n\t\t\t\t\treturn [taskListToken];\n\t\t\t\t}\n\t\t\t\treturn lexer.blockTokens(content);\n\t\t\t};\n\t\t\tconst result = parseIndentedBlocks(src, {\n\t\t\t\titemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n\t\t\t\textractItemData: (match) => ({\n\t\t\t\t\tindentLevel: match[1].length,\n\t\t\t\t\tmainContent: match[4],\n\t\t\t\t\tchecked: match[3].toLowerCase() === \"x\"\n\t\t\t\t}),\n\t\t\t\tcreateToken: (data, nestedTokens) => ({\n\t\t\t\t\ttype: \"taskItem\",\n\t\t\t\t\traw: \"\",\n\t\t\t\t\tmainContent: data.mainContent,\n\t\t\t\t\tindentLevel: data.indentLevel,\n\t\t\t\t\tchecked: data.checked,\n\t\t\t\t\ttext: data.mainContent,\n\t\t\t\t\ttokens: lexer.inlineTokens(data.mainContent),\n\t\t\t\t\tnestedTokens\n\t\t\t\t}),\n\t\t\t\tcustomNestedParser: parseTaskListContent\n\t\t\t}, lexer);\n\t\t\tif (!result) return;\n\t\t\treturn {\n\t\t\t\ttype: \"taskList\",\n\t\t\t\traw: result.raw,\n\t\t\t\titems: result.items\n\t\t\t};\n\t\t}\n\t},\n\tmarkdownOptions: { indentsContent: true },\n\taddCommands() {\n\t\treturn { toggleTaskList: () => ({ commands }) => {\n\t\t\treturn commands.toggleList(this.name, this.options.itemTypeName);\n\t\t} };\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn { \"Mod-Shift-9\": () => this.editor.commands.toggleTaskList() };\n\t}\n});\n//#endregion\n//#region src/kit/index.ts\n/**\n* The table kit is a collection of table editor extensions.\n*\n* It’s a good starting point for building your own table in Tiptap.\n*/\nconst ListKit = Extension.create({\n\tname: \"listKit\",\n\taddExtensions() {\n\t\tconst extensions = [];\n\t\tif (this.options.bulletList !== false) extensions.push(BulletList.configure(this.options.bulletList));\n\t\tif (this.options.listItem !== false) extensions.push(ListItem.configure(this.options.listItem));\n\t\tif (this.options.listKeymap !== false) extensions.push(ListKeymap.configure(this.options.listKeymap));\n\t\tif (this.options.orderedList !== false) extensions.push(OrderedList.configure(this.options.orderedList));\n\t\tif (this.options.taskItem !== false) extensions.push(TaskItem.configure(this.options.taskItem));\n\t\tif (this.options.taskList !== false) extensions.push(TaskList.configure(this.options.taskList));\n\t\treturn extensions;\n\t}\n});\n//#endregion\nexport { BulletList, ListItem, ListKeymap, ListKit, ORDERED_LIST_MARKER_PATTERN, OrderedList, TaskItem, TaskList, areOrderedListMarkersSequential, buildOrderedListAttrsFromMarker, bulletListInputRegex, detectMarkerType, getListMarker, inputRegex, listHelpers_exports as listHelpers, markerToStart, orderedListInputRegex, parseListMarker, parsePlainTextOrderedListPaste, toRoman, toRomanUpper };\n\n//# sourceMappingURL=index.js.map","import { NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection } from \"prosemirror-state\";\nimport { Fragment, Slice } from \"prosemirror-model\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\nimport { keydownHandler } from \"prosemirror-keymap\";\nimport { Transform } from \"prosemirror-transform\";\n\n//#region src/tablemap.ts\nlet readFromCache;\nlet addToCache;\nif (typeof WeakMap != \"undefined\") {\n\tlet cache = /* @__PURE__ */ new WeakMap();\n\treadFromCache = (key) => cache.get(key);\n\taddToCache = (key, value) => {\n\t\tcache.set(key, value);\n\t\treturn value;\n\t};\n} else {\n\tconst cache = [];\n\tconst cacheSize = 10;\n\tlet cachePos = 0;\n\treadFromCache = (key) => {\n\t\tfor (let i = 0; i < cache.length; i += 2) if (cache[i] == key) return cache[i + 1];\n\t};\n\taddToCache = (key, value) => {\n\t\tif (cachePos == cacheSize) cachePos = 0;\n\t\tcache[cachePos++] = key;\n\t\treturn cache[cachePos++] = value;\n\t};\n}\n/**\n* A table map describes the structure of a given table. To avoid\n* recomputing them all the time, they are cached per table node. To\n* be able to do that, positions saved in the map are relative to the\n* start of the table, rather than the start of the document.\n*\n* @public\n*/\nvar TableMap = class {\n\tconstructor(width, height, map, problems) {\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.map = map;\n\t\tthis.problems = problems;\n\t}\n\tfindCell(pos) {\n\t\tfor (let i = 0; i < this.map.length; i++) {\n\t\t\tconst curPos = this.map[i];\n\t\t\tif (curPos != pos) continue;\n\t\t\tconst left = i % this.width;\n\t\t\tconst top = i / this.width | 0;\n\t\t\tlet right = left + 1;\n\t\t\tlet bottom = top + 1;\n\t\t\tfor (let j = 1; right < this.width && this.map[i + j] == curPos; j++) right++;\n\t\t\tfor (let j = 1; bottom < this.height && this.map[i + this.width * j] == curPos; j++) bottom++;\n\t\t\treturn {\n\t\t\t\tleft,\n\t\t\t\ttop,\n\t\t\t\tright,\n\t\t\t\tbottom\n\t\t\t};\n\t\t}\n\t\tthrow new RangeError(`No cell with offset ${pos} found`);\n\t}\n\tcolCount(pos) {\n\t\tfor (let i = 0; i < this.map.length; i++) if (this.map[i] == pos) return i % this.width;\n\t\tthrow new RangeError(`No cell with offset ${pos} found`);\n\t}\n\tnextCell(pos, axis, dir) {\n\t\tconst { left, right, top, bottom } = this.findCell(pos);\n\t\tif (axis == \"horiz\") {\n\t\t\tif (dir < 0 ? left == 0 : right == this.width) return null;\n\t\t\treturn this.map[top * this.width + (dir < 0 ? left - 1 : right)];\n\t\t} else {\n\t\t\tif (dir < 0 ? top == 0 : bottom == this.height) return null;\n\t\t\treturn this.map[left + this.width * (dir < 0 ? top - 1 : bottom)];\n\t\t}\n\t}\n\trectBetween(a, b) {\n\t\tconst { left: leftA, right: rightA, top: topA, bottom: bottomA } = this.findCell(a);\n\t\tconst { left: leftB, right: rightB, top: topB, bottom: bottomB } = this.findCell(b);\n\t\treturn {\n\t\t\tleft: Math.min(leftA, leftB),\n\t\t\ttop: Math.min(topA, topB),\n\t\t\tright: Math.max(rightA, rightB),\n\t\t\tbottom: Math.max(bottomA, bottomB)\n\t\t};\n\t}\n\tcellsInRect(rect) {\n\t\tconst result = [];\n\t\tconst seen = {};\n\t\tfor (let row = rect.top; row < rect.bottom; row++) for (let col = rect.left; col < rect.right; col++) {\n\t\t\tconst index = row * this.width + col;\n\t\t\tconst pos = this.map[index];\n\t\t\tif (seen[pos]) continue;\n\t\t\tseen[pos] = true;\n\t\t\tif (col == rect.left && col && this.map[index - 1] == pos || row == rect.top && row && this.map[index - this.width] == pos) continue;\n\t\t\tresult.push(pos);\n\t\t}\n\t\treturn result;\n\t}\n\tpositionAt(row, col, table) {\n\t\tfor (let i = 0, rowStart = 0;; i++) {\n\t\t\tconst rowEnd = rowStart + table.child(i).nodeSize;\n\t\t\tif (i == row) {\n\t\t\t\tlet index = col + row * this.width;\n\t\t\t\tconst rowEndIndex = (row + 1) * this.width;\n\t\t\t\twhile (index < rowEndIndex && this.map[index] < rowStart) index++;\n\t\t\t\treturn index == rowEndIndex ? rowEnd - 1 : this.map[index];\n\t\t\t}\n\t\t\trowStart = rowEnd;\n\t\t}\n\t}\n\tstatic get(table) {\n\t\treturn readFromCache(table) || addToCache(table, computeMap(table));\n\t}\n};\nfunction computeMap(table) {\n\tif (table.type.spec.tableRole != \"table\") throw new RangeError(\"Not a table node: \" + table.type.name);\n\tconst width = findWidth(table), height = table.childCount;\n\tconst map = [];\n\tlet mapPos = 0;\n\tlet problems = null;\n\tconst colWidths = [];\n\tfor (let i = 0, e = width * height; i < e; i++) map[i] = 0;\n\tfor (let row = 0, pos = 0; row < height; row++) {\n\t\tconst rowNode = table.child(row);\n\t\tpos++;\n\t\tfor (let i = 0;; i++) {\n\t\t\twhile (mapPos < map.length && map[mapPos] != 0) mapPos++;\n\t\t\tif (i == rowNode.childCount) break;\n\t\t\tconst cellNode = rowNode.child(i);\n\t\t\tconst { colspan, rowspan, colwidth } = cellNode.attrs;\n\t\t\tfor (let h = 0; h < rowspan; h++) {\n\t\t\t\tif (h + row >= height) {\n\t\t\t\t\t(problems || (problems = [])).push({\n\t\t\t\t\t\ttype: \"overlong_rowspan\",\n\t\t\t\t\t\tpos,\n\t\t\t\t\t\tn: rowspan - h\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst start = mapPos + h * width;\n\t\t\t\tfor (let w = 0; w < colspan; w++) {\n\t\t\t\t\tif (map[start + w] == 0) map[start + w] = pos;\n\t\t\t\t\telse (problems || (problems = [])).push({\n\t\t\t\t\t\ttype: \"collision\",\n\t\t\t\t\t\trow,\n\t\t\t\t\t\tpos,\n\t\t\t\t\t\tn: colspan - w\n\t\t\t\t\t});\n\t\t\t\t\tconst colW = colwidth && colwidth[w];\n\t\t\t\t\tif (colW) {\n\t\t\t\t\t\tconst widthIndex = (start + w) % width * 2, prev = colWidths[widthIndex];\n\t\t\t\t\t\tif (prev == null || prev != colW && colWidths[widthIndex + 1] == 1) {\n\t\t\t\t\t\t\tcolWidths[widthIndex] = colW;\n\t\t\t\t\t\t\tcolWidths[widthIndex + 1] = 1;\n\t\t\t\t\t\t} else if (prev == colW) colWidths[widthIndex + 1]++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmapPos += colspan;\n\t\t\tpos += cellNode.nodeSize;\n\t\t}\n\t\tconst expectedPos = (row + 1) * width;\n\t\tlet missing = 0;\n\t\twhile (mapPos < expectedPos) if (map[mapPos++] == 0) missing++;\n\t\tif (missing) (problems || (problems = [])).push({\n\t\t\ttype: \"missing\",\n\t\t\trow,\n\t\t\tn: missing\n\t\t});\n\t\tpos++;\n\t}\n\tif (width === 0 || height === 0) (problems || (problems = [])).push({ type: \"zero_sized\" });\n\tconst tableMap = new TableMap(width, height, map, problems);\n\tlet badWidths = false;\n\tfor (let i = 0; !badWidths && i < colWidths.length; i += 2) if (colWidths[i] != null && colWidths[i + 1] < height) badWidths = true;\n\tif (badWidths) findBadColWidths(tableMap, colWidths, table);\n\treturn tableMap;\n}\nfunction findWidth(table) {\n\tlet width = -1;\n\tlet hasRowSpan = false;\n\tfor (let row = 0; row < table.childCount; row++) {\n\t\tconst rowNode = table.child(row);\n\t\tlet rowWidth = 0;\n\t\tif (hasRowSpan) for (let j = 0; j < row; j++) {\n\t\t\tconst prevRow = table.child(j);\n\t\t\tfor (let i = 0; i < prevRow.childCount; i++) {\n\t\t\t\tconst cell = prevRow.child(i);\n\t\t\t\tif (j + cell.attrs.rowspan > row) rowWidth += cell.attrs.colspan;\n\t\t\t}\n\t\t}\n\t\tfor (let i = 0; i < rowNode.childCount; i++) {\n\t\t\tconst cell = rowNode.child(i);\n\t\t\trowWidth += cell.attrs.colspan;\n\t\t\tif (cell.attrs.rowspan > 1) hasRowSpan = true;\n\t\t}\n\t\tif (width == -1) width = rowWidth;\n\t\telse if (width != rowWidth) width = Math.max(width, rowWidth);\n\t}\n\treturn width;\n}\nfunction findBadColWidths(map, colWidths, table) {\n\tif (!map.problems) map.problems = [];\n\tconst seen = {};\n\tfor (let i = 0; i < map.map.length; i++) {\n\t\tconst pos = map.map[i];\n\t\tif (seen[pos]) continue;\n\t\tseen[pos] = true;\n\t\tconst node = table.nodeAt(pos);\n\t\tif (!node) throw new RangeError(`No cell with offset ${pos} found`);\n\t\tlet updated = null;\n\t\tconst attrs = node.attrs;\n\t\tfor (let j = 0; j < attrs.colspan; j++) {\n\t\t\tconst colWidth = colWidths[(i + j) % map.width * 2];\n\t\t\tif (colWidth != null && (!attrs.colwidth || attrs.colwidth[j] != colWidth)) (updated || (updated = freshColWidth(attrs)))[j] = colWidth;\n\t\t}\n\t\tif (updated) map.problems.unshift({\n\t\t\ttype: \"colwidth mismatch\",\n\t\t\tpos,\n\t\t\tcolwidth: updated\n\t\t});\n\t}\n}\nfunction freshColWidth(attrs) {\n\tif (attrs.colwidth) return attrs.colwidth.slice();\n\tconst result = [];\n\tfor (let i = 0; i < attrs.colspan; i++) result.push(0);\n\treturn result;\n}\n\n//#endregion\n//#region src/schema.ts\nfunction getCellAttrs(dom, extraAttrs) {\n\tif (typeof dom === \"string\") return {};\n\tconst widthAttr = dom.getAttribute(\"data-colwidth\");\n\tconst widths = widthAttr && /^\\d+(,\\d+)*$/.test(widthAttr) ? widthAttr.split(\",\").map((s) => Number(s)) : null;\n\tconst colspan = Number(dom.getAttribute(\"colspan\") || 1);\n\tconst result = {\n\t\tcolspan,\n\t\trowspan: Number(dom.getAttribute(\"rowspan\") || 1),\n\t\tcolwidth: widths && widths.length == colspan ? widths : null\n\t};\n\tfor (const prop in extraAttrs) {\n\t\tconst getter = extraAttrs[prop].getFromDOM;\n\t\tconst value = getter && getter(dom);\n\t\tif (value != null) result[prop] = value;\n\t}\n\treturn result;\n}\nfunction setCellAttrs(node, extraAttrs) {\n\tconst attrs = {};\n\tif (node.attrs.colspan != 1) attrs.colspan = node.attrs.colspan;\n\tif (node.attrs.rowspan != 1) attrs.rowspan = node.attrs.rowspan;\n\tif (node.attrs.colwidth) attrs[\"data-colwidth\"] = node.attrs.colwidth.join(\",\");\n\tfor (const prop in extraAttrs) {\n\t\tconst setter = extraAttrs[prop].setDOMAttr;\n\t\tif (setter) setter(node.attrs[prop], attrs);\n\t}\n\treturn attrs;\n}\nfunction validateColwidth(value) {\n\tif (value === null) return;\n\tif (!Array.isArray(value)) throw new TypeError(\"colwidth must be null or an array\");\n\tfor (const item of value) if (typeof item !== \"number\") throw new TypeError(\"colwidth must be null or an array of numbers\");\n}\n/**\n* This function creates a set of [node\n* specs](http://prosemirror.net/docs/ref/#model.SchemaSpec.nodes) for\n* `table`, `table_row`, and `table_cell` nodes types as used by this\n* module. The result can then be added to the set of nodes when\n* creating a schema.\n*\n* @public\n*/\nfunction tableNodes(options) {\n\tconst extraAttrs = options.cellAttributes || {};\n\tconst cellAttrs = {\n\t\tcolspan: {\n\t\t\tdefault: 1,\n\t\t\tvalidate: \"number\"\n\t\t},\n\t\trowspan: {\n\t\t\tdefault: 1,\n\t\t\tvalidate: \"number\"\n\t\t},\n\t\tcolwidth: {\n\t\t\tdefault: null,\n\t\t\tvalidate: validateColwidth\n\t\t}\n\t};\n\tfor (const prop in extraAttrs) cellAttrs[prop] = {\n\t\tdefault: extraAttrs[prop].default,\n\t\tvalidate: extraAttrs[prop].validate\n\t};\n\treturn {\n\t\ttable: {\n\t\t\tcontent: \"table_row+\",\n\t\t\ttableRole: \"table\",\n\t\t\tisolating: true,\n\t\t\tgroup: options.tableGroup,\n\t\t\tparseDOM: [{ tag: \"table\" }],\n\t\t\ttoDOM() {\n\t\t\t\treturn [\"table\", [\"tbody\", 0]];\n\t\t\t}\n\t\t},\n\t\ttable_row: {\n\t\t\tcontent: \"(table_cell | table_header)*\",\n\t\t\ttableRole: \"row\",\n\t\t\tparseDOM: [{ tag: \"tr\" }],\n\t\t\ttoDOM() {\n\t\t\t\treturn [\"tr\", 0];\n\t\t\t}\n\t\t},\n\t\ttable_cell: {\n\t\t\tcontent: options.cellContent,\n\t\t\tattrs: cellAttrs,\n\t\t\ttableRole: \"cell\",\n\t\t\tisolating: true,\n\t\t\tparseDOM: [{\n\t\t\t\ttag: \"td\",\n\t\t\t\tgetAttrs: (dom) => getCellAttrs(dom, extraAttrs)\n\t\t\t}],\n\t\t\ttoDOM(node) {\n\t\t\t\treturn [\n\t\t\t\t\t\"td\",\n\t\t\t\t\tsetCellAttrs(node, extraAttrs),\n\t\t\t\t\t0\n\t\t\t\t];\n\t\t\t}\n\t\t},\n\t\ttable_header: {\n\t\t\tcontent: options.cellContent,\n\t\t\tattrs: cellAttrs,\n\t\t\ttableRole: \"header_cell\",\n\t\t\tisolating: true,\n\t\t\tparseDOM: [{\n\t\t\t\ttag: \"th\",\n\t\t\t\tgetAttrs: (dom) => getCellAttrs(dom, extraAttrs)\n\t\t\t}],\n\t\t\ttoDOM(node) {\n\t\t\t\treturn [\n\t\t\t\t\t\"th\",\n\t\t\t\t\tsetCellAttrs(node, extraAttrs),\n\t\t\t\t\t0\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t};\n}\n/**\n* @public\n*/\nfunction tableNodeTypes(schema) {\n\tlet result = schema.cached.tableNodeTypes;\n\tif (!result) {\n\t\tresult = schema.cached.tableNodeTypes = {};\n\t\tfor (const name in schema.nodes) {\n\t\t\tconst type = schema.nodes[name], role = type.spec.tableRole;\n\t\t\tif (role) result[role] = type;\n\t\t}\n\t}\n\treturn result;\n}\n\n//#endregion\n//#region src/util.ts\n/**\n* @public\n*/\nconst tableEditingKey = new PluginKey(\"selectingCells\");\n/**\n* @public\n*/\nfunction cellAround($pos) {\n\tfor (let d = $pos.depth - 1; d > 0; d--) if ($pos.node(d).type.spec.tableRole == \"row\") return $pos.node(0).resolve($pos.before(d + 1));\n\treturn null;\n}\nfunction cellWrapping($pos) {\n\tfor (let d = $pos.depth; d > 0; d--) {\n\t\tconst role = $pos.node(d).type.spec.tableRole;\n\t\tif (role === \"cell\" || role === \"header_cell\") return $pos.node(d);\n\t}\n\treturn null;\n}\n/**\n* @public\n*/\nfunction isInTable(state) {\n\tconst $head = state.selection.$head;\n\tfor (let d = $head.depth; d > 0; d--) if ($head.node(d).type.spec.tableRole == \"row\") return true;\n\treturn false;\n}\n/**\n* @internal\n*/\nfunction selectionCell(state) {\n\tconst sel = state.selection;\n\tif (\"$anchorCell\" in sel && sel.$anchorCell) return sel.$anchorCell.pos > sel.$headCell.pos ? sel.$anchorCell : sel.$headCell;\n\telse if (\"node\" in sel && sel.node && sel.node.type.spec.tableRole == \"cell\") return sel.$anchor;\n\tconst $cell = cellAround(sel.$head) || cellNear(sel.$head);\n\tif ($cell) return $cell;\n\tthrow new RangeError(`No cell found around position ${sel.head}`);\n}\n/**\n* @public\n*/\nfunction cellNear($pos) {\n\tfor (let after = $pos.nodeAfter, pos = $pos.pos; after; after = after.firstChild, pos++) {\n\t\tconst role = after.type.spec.tableRole;\n\t\tif (role == \"cell\" || role == \"header_cell\") return $pos.doc.resolve(pos);\n\t}\n\tfor (let before = $pos.nodeBefore, pos = $pos.pos; before; before = before.lastChild, pos--) {\n\t\tconst role = before.type.spec.tableRole;\n\t\tif (role == \"cell\" || role == \"header_cell\") return $pos.doc.resolve(pos - before.nodeSize);\n\t}\n}\n/**\n* @public\n*/\nfunction pointsAtCell($pos) {\n\treturn $pos.parent.type.spec.tableRole == \"row\" && !!$pos.nodeAfter;\n}\n/**\n* @public\n*/\nfunction moveCellForward($pos) {\n\treturn $pos.node(0).resolve($pos.pos + $pos.nodeAfter.nodeSize);\n}\n/**\n* @internal\n*/\nfunction inSameTable($cellA, $cellB) {\n\treturn $cellA.depth == $cellB.depth && $cellA.pos >= $cellB.start(-1) && $cellA.pos <= $cellB.end(-1);\n}\n/**\n* @public\n*/\nfunction findCell($pos) {\n\treturn TableMap.get($pos.node(-1)).findCell($pos.pos - $pos.start(-1));\n}\n/**\n* @public\n*/\nfunction colCount($pos) {\n\treturn TableMap.get($pos.node(-1)).colCount($pos.pos - $pos.start(-1));\n}\n/**\n* @public\n*/\nfunction nextCell($pos, axis, dir) {\n\tconst table = $pos.node(-1);\n\tconst map = TableMap.get(table);\n\tconst tableStart = $pos.start(-1);\n\tconst moved = map.nextCell($pos.pos - tableStart, axis, dir);\n\treturn moved == null ? null : $pos.node(0).resolve(tableStart + moved);\n}\n/**\n* @public\n*/\nfunction removeColSpan(attrs, pos, n = 1) {\n\tconst result = {\n\t\t...attrs,\n\t\tcolspan: attrs.colspan - n\n\t};\n\tif (result.colwidth) {\n\t\tresult.colwidth = result.colwidth.slice();\n\t\tresult.colwidth.splice(pos, n);\n\t\tif (!result.colwidth.some((w) => w > 0)) result.colwidth = null;\n\t}\n\treturn result;\n}\n/**\n* @public\n*/\nfunction addColSpan(attrs, pos, n = 1) {\n\tconst result = {\n\t\t...attrs,\n\t\tcolspan: attrs.colspan + n\n\t};\n\tif (result.colwidth) {\n\t\tresult.colwidth = result.colwidth.slice();\n\t\tfor (let i = 0; i < n; i++) result.colwidth.splice(pos, 0, 0);\n\t}\n\treturn result;\n}\n/**\n* @public\n*/\nfunction columnIsHeader(map, table, col) {\n\tconst headerCell = tableNodeTypes(table.type.schema).header_cell;\n\tfor (let row = 0; row < map.height; row++) if (table.nodeAt(map.map[col + row * map.width]).type != headerCell) return false;\n\treturn true;\n}\n\n//#endregion\n//#region src/cellselection.ts\n/**\n* A [`Selection`](http://prosemirror.net/docs/ref/#state.Selection)\n* subclass that represents a cell selection spanning part of a table.\n* With the plugin enabled, these will be created when the user\n* selects across cells, and will be drawn by giving selected cells a\n* `selectedCell` CSS class.\n*\n* @public\n*/\nvar CellSelection = class CellSelection extends Selection {\n\tconstructor($anchorCell, $headCell = $anchorCell) {\n\t\tconst table = $anchorCell.node(-1);\n\t\tconst map = TableMap.get(table);\n\t\tconst tableStart = $anchorCell.start(-1);\n\t\tconst rect = map.rectBetween($anchorCell.pos - tableStart, $headCell.pos - tableStart);\n\t\tconst doc = $anchorCell.node(0);\n\t\tconst cells = map.cellsInRect(rect).filter((p) => p != $headCell.pos - tableStart);\n\t\tcells.unshift($headCell.pos - tableStart);\n\t\tconst ranges = cells.map((pos) => {\n\t\t\tconst cell = table.nodeAt(pos);\n\t\t\tif (!cell) throw new RangeError(`No cell with offset ${pos} found`);\n\t\t\tconst from = tableStart + pos + 1;\n\t\t\treturn new SelectionRange(doc.resolve(from), doc.resolve(from + cell.content.size));\n\t\t});\n\t\tsuper(ranges[0].$from, ranges[0].$to, ranges);\n\t\tthis.$anchorCell = $anchorCell;\n\t\tthis.$headCell = $headCell;\n\t}\n\tmap(doc, mapping) {\n\t\tconst $anchorCell = doc.resolve(mapping.map(this.$anchorCell.pos));\n\t\tconst $headCell = doc.resolve(mapping.map(this.$headCell.pos));\n\t\tif (pointsAtCell($anchorCell) && pointsAtCell($headCell) && inSameTable($anchorCell, $headCell)) {\n\t\t\tconst tableChanged = this.$anchorCell.node(-1) != $anchorCell.node(-1);\n\t\t\tif (tableChanged && this.isRowSelection()) return CellSelection.rowSelection($anchorCell, $headCell);\n\t\t\telse if (tableChanged && this.isColSelection()) return CellSelection.colSelection($anchorCell, $headCell);\n\t\t\telse return new CellSelection($anchorCell, $headCell);\n\t\t}\n\t\treturn TextSelection.between($anchorCell, $headCell);\n\t}\n\tcontent() {\n\t\tconst table = this.$anchorCell.node(-1);\n\t\tconst map = TableMap.get(table);\n\t\tconst tableStart = this.$anchorCell.start(-1);\n\t\tconst rect = map.rectBetween(this.$anchorCell.pos - tableStart, this.$headCell.pos - tableStart);\n\t\tconst seen = {};\n\t\tconst rows = [];\n\t\tfor (let row = rect.top; row < rect.bottom; row++) {\n\t\t\tconst rowContent = [];\n\t\t\tfor (let index = row * map.width + rect.left, col = rect.left; col < rect.right; col++, index++) {\n\t\t\t\tconst pos = map.map[index];\n\t\t\t\tif (seen[pos]) continue;\n\t\t\t\tseen[pos] = true;\n\t\t\t\tconst cellRect = map.findCell(pos);\n\t\t\t\tlet cell = table.nodeAt(pos);\n\t\t\t\tif (!cell) throw new RangeError(`No cell with offset ${pos} found`);\n\t\t\t\tconst extraLeft = rect.left - cellRect.left;\n\t\t\t\tconst extraRight = cellRect.right - rect.right;\n\t\t\t\tif (extraLeft > 0 || extraRight > 0) {\n\t\t\t\t\tlet attrs = cell.attrs;\n\t\t\t\t\tif (extraLeft > 0) attrs = removeColSpan(attrs, 0, extraLeft);\n\t\t\t\t\tif (extraRight > 0) attrs = removeColSpan(attrs, attrs.colspan - extraRight, extraRight);\n\t\t\t\t\tif (cellRect.left < rect.left) {\n\t\t\t\t\t\tcell = cell.type.createAndFill(attrs);\n\t\t\t\t\t\tif (!cell) throw new RangeError(`Could not create cell with attrs ${JSON.stringify(attrs)}`);\n\t\t\t\t\t} else cell = cell.type.create(attrs, cell.content);\n\t\t\t\t}\n\t\t\t\tif (cellRect.top < rect.top || cellRect.bottom > rect.bottom) {\n\t\t\t\t\tconst attrs = {\n\t\t\t\t\t\t...cell.attrs,\n\t\t\t\t\t\trowspan: Math.min(cellRect.bottom, rect.bottom) - Math.max(cellRect.top, rect.top)\n\t\t\t\t\t};\n\t\t\t\t\tif (cellRect.top < rect.top) cell = cell.type.createAndFill(attrs);\n\t\t\t\t\telse cell = cell.type.create(attrs, cell.content);\n\t\t\t\t}\n\t\t\t\trowContent.push(cell);\n\t\t\t}\n\t\t\trows.push(table.child(row).copy(Fragment.from(rowContent)));\n\t\t}\n\t\tconst fragment = this.isColSelection() && this.isRowSelection() ? table : rows;\n\t\treturn new Slice(Fragment.from(fragment), 1, 1);\n\t}\n\treplace(tr, content = Slice.empty) {\n\t\tconst mapFrom = tr.steps.length, ranges = this.ranges;\n\t\tfor (let i = 0; i < ranges.length; i++) {\n\t\t\tconst { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n\t\t\ttr.replace(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content);\n\t\t}\n\t\tconst sel = Selection.findFrom(tr.doc.resolve(tr.mapping.slice(mapFrom).map(this.to)), -1);\n\t\tif (sel) tr.setSelection(sel);\n\t}\n\treplaceWith(tr, node) {\n\t\tthis.replace(tr, new Slice(Fragment.from(node), 0, 0));\n\t}\n\tforEachCell(f) {\n\t\tconst table = this.$anchorCell.node(-1);\n\t\tconst map = TableMap.get(table);\n\t\tconst tableStart = this.$anchorCell.start(-1);\n\t\tconst cells = map.cellsInRect(map.rectBetween(this.$anchorCell.pos - tableStart, this.$headCell.pos - tableStart));\n\t\tfor (let i = 0; i < cells.length; i++) f(table.nodeAt(cells[i]), tableStart + cells[i]);\n\t}\n\tisColSelection() {\n\t\tconst anchorTop = this.$anchorCell.index(-1);\n\t\tconst headTop = this.$headCell.index(-1);\n\t\tif (Math.min(anchorTop, headTop) > 0) return false;\n\t\tconst anchorBottom = anchorTop + this.$anchorCell.nodeAfter.attrs.rowspan;\n\t\tconst headBottom = headTop + this.$headCell.nodeAfter.attrs.rowspan;\n\t\treturn Math.max(anchorBottom, headBottom) == this.$headCell.node(-1).childCount;\n\t}\n\tstatic colSelection($anchorCell, $headCell = $anchorCell) {\n\t\tconst table = $anchorCell.node(-1);\n\t\tconst map = TableMap.get(table);\n\t\tconst tableStart = $anchorCell.start(-1);\n\t\tconst anchorRect = map.findCell($anchorCell.pos - tableStart);\n\t\tconst headRect = map.findCell($headCell.pos - tableStart);\n\t\tconst doc = $anchorCell.node(0);\n\t\tif (anchorRect.top <= headRect.top) {\n\t\t\tif (anchorRect.top > 0) $anchorCell = doc.resolve(tableStart + map.map[anchorRect.left]);\n\t\t\tif (headRect.bottom < map.height) $headCell = doc.resolve(tableStart + map.map[map.width * (map.height - 1) + headRect.right - 1]);\n\t\t} else {\n\t\t\tif (headRect.top > 0) $headCell = doc.resolve(tableStart + map.map[headRect.left]);\n\t\t\tif (anchorRect.bottom < map.height) $anchorCell = doc.resolve(tableStart + map.map[map.width * (map.height - 1) + anchorRect.right - 1]);\n\t\t}\n\t\treturn new CellSelection($anchorCell, $headCell);\n\t}\n\tisRowSelection() {\n\t\tconst table = this.$anchorCell.node(-1);\n\t\tconst map = TableMap.get(table);\n\t\tconst tableStart = this.$anchorCell.start(-1);\n\t\tconst anchorLeft = map.colCount(this.$anchorCell.pos - tableStart);\n\t\tconst headLeft = map.colCount(this.$headCell.pos - tableStart);\n\t\tif (Math.min(anchorLeft, headLeft) > 0) return false;\n\t\tconst anchorRight = anchorLeft + this.$anchorCell.nodeAfter.attrs.colspan;\n\t\tconst headRight = headLeft + this.$headCell.nodeAfter.attrs.colspan;\n\t\treturn Math.max(anchorRight, headRight) == map.width;\n\t}\n\teq(other) {\n\t\treturn other instanceof CellSelection && other.$anchorCell.pos == this.$anchorCell.pos && other.$headCell.pos == this.$headCell.pos;\n\t}\n\tstatic rowSelection($anchorCell, $headCell = $anchorCell) {\n\t\tconst table = $anchorCell.node(-1);\n\t\tconst map = TableMap.get(table);\n\t\tconst tableStart = $anchorCell.start(-1);\n\t\tconst anchorRect = map.findCell($anchorCell.pos - tableStart);\n\t\tconst headRect = map.findCell($headCell.pos - tableStart);\n\t\tconst doc = $anchorCell.node(0);\n\t\tif (anchorRect.left <= headRect.left) {\n\t\t\tif (anchorRect.left > 0) $anchorCell = doc.resolve(tableStart + map.map[anchorRect.top * map.width]);\n\t\t\tif (headRect.right < map.width) $headCell = doc.resolve(tableStart + map.map[map.width * (headRect.top + 1) - 1]);\n\t\t} else {\n\t\t\tif (headRect.left > 0) $headCell = doc.resolve(tableStart + map.map[headRect.top * map.width]);\n\t\t\tif (anchorRect.right < map.width) $anchorCell = doc.resolve(tableStart + map.map[map.width * (anchorRect.top + 1) - 1]);\n\t\t}\n\t\treturn new CellSelection($anchorCell, $headCell);\n\t}\n\ttoJSON() {\n\t\treturn {\n\t\t\ttype: \"cell\",\n\t\t\tanchor: this.$anchorCell.pos,\n\t\t\thead: this.$headCell.pos\n\t\t};\n\t}\n\tstatic fromJSON(doc, json) {\n\t\treturn new CellSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n\t}\n\tstatic create(doc, anchorCell, headCell = anchorCell) {\n\t\treturn new CellSelection(doc.resolve(anchorCell), doc.resolve(headCell));\n\t}\n\tgetBookmark() {\n\t\treturn new CellBookmark(this.$anchorCell.pos, this.$headCell.pos);\n\t}\n};\nCellSelection.prototype.visible = false;\nSelection.jsonID(\"cell\", CellSelection);\n/**\n* @public\n*/\nvar CellBookmark = class CellBookmark {\n\tconstructor(anchor, head) {\n\t\tthis.anchor = anchor;\n\t\tthis.head = head;\n\t}\n\tmap(mapping) {\n\t\treturn new CellBookmark(mapping.map(this.anchor), mapping.map(this.head));\n\t}\n\tresolve(doc) {\n\t\tconst $anchorCell = doc.resolve(this.anchor), $headCell = doc.resolve(this.head);\n\t\tif ($anchorCell.parent.type.spec.tableRole == \"row\" && $headCell.parent.type.spec.tableRole == \"row\" && $anchorCell.index() < $anchorCell.parent.childCount && $headCell.index() < $headCell.parent.childCount && inSameTable($anchorCell, $headCell)) return new CellSelection($anchorCell, $headCell);\n\t\telse return Selection.near($headCell, 1);\n\t}\n};\nfunction drawCellSelection(state) {\n\tif (!(state.selection instanceof CellSelection)) return null;\n\tconst cells = [];\n\tstate.selection.forEachCell((node, pos) => {\n\t\tcells.push(Decoration.node(pos, pos + node.nodeSize, { class: \"selectedCell\" }));\n\t});\n\treturn DecorationSet.create(state.doc, cells);\n}\nfunction isCellBoundarySelection({ $from, $to }) {\n\tif ($from.pos == $to.pos || $from.pos < $to.pos - 6) return false;\n\tlet afterFrom = $from.pos;\n\tlet beforeTo = $to.pos;\n\tlet depth = $from.depth;\n\tfor (; depth >= 0; depth--, afterFrom++) if ($from.after(depth + 1) < $from.end(depth)) break;\n\tfor (let d = $to.depth; d >= 0; d--, beforeTo--) if ($to.before(d + 1) > $to.start(d)) break;\n\treturn afterFrom == beforeTo && /row|table/.test($from.node(depth).type.spec.tableRole);\n}\nfunction isTextSelectionAcrossCells({ $from, $to }) {\n\tlet fromCellBoundaryNode;\n\tlet toCellBoundaryNode;\n\tfor (let i = $from.depth; i > 0; i--) {\n\t\tconst node = $from.node(i);\n\t\tif (node.type.spec.tableRole === \"cell\" || node.type.spec.tableRole === \"header_cell\") {\n\t\t\tfromCellBoundaryNode = node;\n\t\t\tbreak;\n\t\t}\n\t}\n\tfor (let i = $to.depth; i > 0; i--) {\n\t\tconst node = $to.node(i);\n\t\tif (node.type.spec.tableRole === \"cell\" || node.type.spec.tableRole === \"header_cell\") {\n\t\t\ttoCellBoundaryNode = node;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn fromCellBoundaryNode !== toCellBoundaryNode && $to.parentOffset === 0;\n}\nfunction normalizeSelection(state, tr, allowTableNodeSelection) {\n\tconst sel = (tr || state).selection;\n\tconst doc = (tr || state).doc;\n\tlet normalize;\n\tlet role;\n\tif (sel instanceof NodeSelection && (role = sel.node.type.spec.tableRole)) {\n\t\tif (role == \"cell\" || role == \"header_cell\") normalize = CellSelection.create(doc, sel.from);\n\t\telse if (role == \"row\") {\n\t\t\tconst $cell = doc.resolve(sel.from + 1);\n\t\t\tnormalize = CellSelection.rowSelection($cell, $cell);\n\t\t} else if (!allowTableNodeSelection) {\n\t\t\tconst map = TableMap.get(sel.node);\n\t\t\tconst start = sel.from + 1;\n\t\t\tconst lastCell = start + map.map[map.width * map.height - 1];\n\t\t\tnormalize = CellSelection.create(doc, start + 1, lastCell);\n\t\t}\n\t} else if (sel instanceof TextSelection && isCellBoundarySelection(sel)) normalize = TextSelection.create(doc, sel.from);\n\telse if (sel instanceof TextSelection && isTextSelectionAcrossCells(sel)) normalize = TextSelection.create(doc, sel.$from.start(), sel.$from.end());\n\tif (normalize) (tr || (tr = state.tr)).setSelection(normalize);\n\treturn tr;\n}\n\n//#endregion\n//#region src/fixtables.ts\n/**\n* @public\n*/\nconst fixTablesKey = new PluginKey(\"fix-tables\");\n/**\n* Helper for iterating through the nodes in a document that changed\n* compared to the given previous document. Useful for avoiding\n* duplicate work on each transaction.\n*\n* @public\n*/\nfunction changedDescendants(old, cur, offset, f) {\n\tconst oldSize = old.childCount, curSize = cur.childCount;\n\touter: for (let i = 0, j = 0; i < curSize; i++) {\n\t\tconst child = cur.child(i);\n\t\tfor (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) if (old.child(scan) == child) {\n\t\t\tj = scan + 1;\n\t\t\toffset += child.nodeSize;\n\t\t\tcontinue outer;\n\t\t}\n\t\tf(child, offset);\n\t\tif (j < oldSize && old.child(j).sameMarkup(child)) changedDescendants(old.child(j), child, offset + 1, f);\n\t\telse child.nodesBetween(0, child.content.size, f, offset + 1);\n\t\toffset += child.nodeSize;\n\t}\n}\n/**\n* Inspect all tables in the given state's document and return a\n* transaction that fixes them, if necessary. If `oldState` was\n* provided, that is assumed to hold a previous, known-good state,\n* which will be used to avoid re-scanning unchanged parts of the\n* document.\n*\n* @public\n*/\nfunction fixTables(state, oldState) {\n\tlet tr;\n\tconst check = (node, pos) => {\n\t\tif (node.type.spec.tableRole == \"table\") tr = fixTable(state, node, pos, tr);\n\t};\n\tif (!oldState) state.doc.descendants(check);\n\telse if (oldState.doc != state.doc) changedDescendants(oldState.doc, state.doc, 0, check);\n\treturn tr;\n}\nfunction fixTable(state, table, tablePos, tr) {\n\tconst map = TableMap.get(table);\n\tif (!map.problems) return tr;\n\tif (!tr) tr = state.tr;\n\tconst mustAdd = [];\n\tfor (let i = 0; i < map.height; i++) mustAdd.push(0);\n\tfor (let i = 0; i < map.problems.length; i++) {\n\t\tconst prob = map.problems[i];\n\t\tif (prob.type == \"collision\") {\n\t\t\tconst cell = table.nodeAt(prob.pos);\n\t\t\tif (!cell) continue;\n\t\t\tconst attrs = cell.attrs;\n\t\t\tfor (let j = 0; j < attrs.rowspan; j++) mustAdd[prob.row + j] += prob.n;\n\t\t\ttr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, removeColSpan(attrs, attrs.colspan - prob.n, prob.n));\n\t\t} else if (prob.type == \"missing\") mustAdd[prob.row] += prob.n;\n\t\telse if (prob.type == \"overlong_rowspan\") {\n\t\t\tconst cell = table.nodeAt(prob.pos);\n\t\t\tif (!cell) continue;\n\t\t\ttr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, {\n\t\t\t\t...cell.attrs,\n\t\t\t\trowspan: cell.attrs.rowspan - prob.n\n\t\t\t});\n\t\t} else if (prob.type == \"colwidth mismatch\") {\n\t\t\tconst cell = table.nodeAt(prob.pos);\n\t\t\tif (!cell) continue;\n\t\t\ttr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, {\n\t\t\t\t...cell.attrs,\n\t\t\t\tcolwidth: prob.colwidth\n\t\t\t});\n\t\t} else if (prob.type == \"zero_sized\") {\n\t\t\tconst pos = tr.mapping.map(tablePos);\n\t\t\ttr.delete(pos, pos + table.nodeSize);\n\t\t}\n\t}\n\tlet first, last;\n\tfor (let i = 0; i < mustAdd.length; i++) if (mustAdd[i]) {\n\t\tif (first == null) first = i;\n\t\tlast = i;\n\t}\n\tfor (let i = 0, pos = tablePos + 1; i < map.height; i++) {\n\t\tconst row = table.child(i);\n\t\tconst end = pos + row.nodeSize;\n\t\tconst add = mustAdd[i];\n\t\tif (add > 0) {\n\t\t\tlet role = \"cell\";\n\t\t\tif (row.firstChild) role = row.firstChild.type.spec.tableRole;\n\t\t\tconst nodes = [];\n\t\t\tfor (let j = 0; j < add; j++) {\n\t\t\t\tconst node = tableNodeTypes(state.schema)[role].createAndFill();\n\t\t\t\tif (node) nodes.push(node);\n\t\t\t}\n\t\t\tconst side = (i == 0 || first == i - 1) && last == i ? pos + 1 : end - 1;\n\t\t\ttr.insert(tr.mapping.map(side), nodes);\n\t\t}\n\t\tpos = end;\n\t}\n\treturn tr.setMeta(fixTablesKey, { fixTables: true });\n}\n\n//#endregion\n//#region src/utils/convert.ts\n/**\n* This function will transform the table node into a matrix of rows and columns\n* respecting merged cells, for example this table:\n*\n* ```\n* ┌──────┬──────┬─────────────┐\n* │  A1  │  B1  │     C1      │\n* ├──────┼──────┴──────┬──────┤\n* │  A2  │     B2      │      │\n* ├──────┼─────────────┤  D1  │\n* │  A3  │  B3  │  C3  │      │\n* └──────┴──────┴──────┴──────┘\n* ```\n*\n* will be converted to the below:\n*\n* ```javascript\n* [\n*   [A1, B1, C1, null],\n*   [A2, B2, null, D1],\n*   [A3, B3, C3, null],\n* ]\n* ```\n* @internal\n*/\nfunction convertTableNodeToArrayOfRows(tableNode) {\n\tconst map = TableMap.get(tableNode);\n\tconst rows = [];\n\tconst rowCount = map.height;\n\tconst colCount$1 = map.width;\n\tfor (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n\t\tconst row = [];\n\t\tfor (let colIndex = 0; colIndex < colCount$1; colIndex++) {\n\t\t\tconst cellIndex = rowIndex * colCount$1 + colIndex;\n\t\t\tconst cellPos = map.map[cellIndex];\n\t\t\tif (rowIndex > 0) {\n\t\t\t\tconst topCellIndex = cellIndex - colCount$1;\n\t\t\t\tif (cellPos === map.map[topCellIndex]) {\n\t\t\t\t\trow.push(null);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (colIndex > 0) {\n\t\t\t\tconst leftCellIndex = cellIndex - 1;\n\t\t\t\tif (cellPos === map.map[leftCellIndex]) {\n\t\t\t\t\trow.push(null);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\trow.push(tableNode.nodeAt(cellPos));\n\t\t}\n\t\trows.push(row);\n\t}\n\treturn rows;\n}\n/**\n* Convert an array of rows to a table node.\n*\n* @internal\n*/\nfunction convertArrayOfRowsToTableNode(tableNode, arrayOfNodes) {\n\tconst newRows = [];\n\tconst map = TableMap.get(tableNode);\n\tconst rowCount = map.height;\n\tconst colCount$1 = map.width;\n\tfor (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n\t\tconst oldRow = tableNode.child(rowIndex);\n\t\tconst newCells = [];\n\t\tfor (let colIndex = 0; colIndex < colCount$1; colIndex++) {\n\t\t\tconst cell = arrayOfNodes[rowIndex][colIndex];\n\t\t\tif (!cell) continue;\n\t\t\tconst cellPos = map.map[rowIndex * map.width + colIndex];\n\t\t\tconst oldCell = tableNode.nodeAt(cellPos);\n\t\t\tif (!oldCell) continue;\n\t\t\tconst newCell = oldCell.type.createChecked(cell.attrs, cell.content, cell.marks);\n\t\t\tnewCells.push(newCell);\n\t\t}\n\t\tconst newRow = oldRow.type.createChecked(oldRow.attrs, newCells, oldRow.marks);\n\t\tnewRows.push(newRow);\n\t}\n\treturn tableNode.type.createChecked(tableNode.attrs, newRows, tableNode.marks);\n}\n\n//#endregion\n//#region src/utils/move-row-in-array-of-rows.ts\n/**\n* Move a row in an array of rows.\n*\n* @internal\n*/\nfunction moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, directionOverride) {\n\tconst direction = indexesOrigin[0] > indexesTarget[0] ? -1 : 1;\n\tconst rowsExtracted = rows.splice(indexesOrigin[0], indexesOrigin.length);\n\tconst positionOffset = rowsExtracted.length % 2 === 0 ? 1 : 0;\n\tlet target;\n\tif (directionOverride === -1 && direction === 1) target = indexesTarget[0] - 1;\n\telse if (directionOverride === 1 && direction === -1) target = indexesTarget[indexesTarget.length - 1] - positionOffset + 1;\n\telse target = direction === -1 ? indexesTarget[0] : indexesTarget[indexesTarget.length - 1] - positionOffset;\n\trows.splice(target, 0, ...rowsExtracted);\n\treturn rows;\n}\n\n//#endregion\n//#region src/utils/query.ts\n/**\n* Checks if the given object is a `CellSelection` instance.\n*\n* @internal\n*/\nfunction isCellSelection(value) {\n\treturn value instanceof CellSelection;\n}\n/**\n* Find the closest table node for a given position.\n*\n* @public\n*/\nfunction findTable($pos) {\n\treturn findParentNode((node) => node.type.spec.tableRole === \"table\", $pos);\n}\n/**\n* Try to find the anchor and head cell in the same table by using the given\n* anchor and head as hit points, or fallback to the selection's anchor and\n* head.\n*\n* @public\n*/\nfunction findCellRange(selection, anchorHit, headHit) {\n\tvar _ref, _ref2;\n\tif (anchorHit == null && headHit == null && isCellSelection(selection)) return [selection.$anchorCell, selection.$headCell];\n\tconst anchor = (_ref = anchorHit !== null && anchorHit !== void 0 ? anchorHit : headHit) !== null && _ref !== void 0 ? _ref : selection.anchor;\n\tconst head = (_ref2 = headHit !== null && headHit !== void 0 ? headHit : anchorHit) !== null && _ref2 !== void 0 ? _ref2 : selection.head;\n\tconst doc = selection.$head.doc;\n\tconst $anchorCell = findCellPos(doc, anchor);\n\tconst $headCell = findCellPos(doc, head);\n\tif ($anchorCell && $headCell && inSameTable($anchorCell, $headCell)) return [$anchorCell, $headCell];\n\treturn null;\n}\n/**\n* Try to find a resolved pos of a cell by using the given pos as a hit point.\n*\n* @public\n*/\nfunction findCellPos(doc, pos) {\n\tconst $pos = doc.resolve(pos);\n\treturn cellAround($pos) || cellNear($pos);\n}\n/**\n* Find the closest parent node that satisfies the predicate.\n*\n* @internal\n*/\nfunction findParentNode(predicate, $pos) {\n\tfor (let depth = $pos.depth; depth >= 0; depth -= 1) {\n\t\tconst node = $pos.node(depth);\n\t\tif (predicate(node)) return {\n\t\t\tnode,\n\t\t\tpos: depth === 0 ? 0 : $pos.before(depth),\n\t\t\tstart: $pos.start(depth),\n\t\t\tdepth\n\t\t};\n\t}\n\treturn null;\n}\n\n//#endregion\n//#region src/utils/get-cells.ts\n/**\n* Returns an array of cells in a column at the specified column index.\n*\n* @internal\n*/\nfunction getCellsInColumn(columnIndex, selection) {\n\tconst table = findTable(selection.$from);\n\tif (!table) return;\n\tconst map = TableMap.get(table.node);\n\tif (columnIndex < 0 || columnIndex > map.width - 1) return;\n\treturn map.cellsInRect({\n\t\tleft: columnIndex,\n\t\tright: columnIndex + 1,\n\t\ttop: 0,\n\t\tbottom: map.height\n\t}).map((nodePos) => {\n\t\tconst node = table.node.nodeAt(nodePos);\n\t\tconst pos = nodePos + table.start;\n\t\treturn {\n\t\t\tpos,\n\t\t\tstart: pos + 1,\n\t\t\tnode,\n\t\t\tdepth: table.depth + 2\n\t\t};\n\t});\n}\n/**\n* Returns an array of cells in a row at the specified row index.\n*\n* @internal\n*/\nfunction getCellsInRow(rowIndex, selection) {\n\tconst table = findTable(selection.$from);\n\tif (!table) return;\n\tconst map = TableMap.get(table.node);\n\tif (rowIndex < 0 || rowIndex > map.height - 1) return;\n\treturn map.cellsInRect({\n\t\tleft: 0,\n\t\tright: map.width,\n\t\ttop: rowIndex,\n\t\tbottom: rowIndex + 1\n\t}).map((nodePos) => {\n\t\tconst node = table.node.nodeAt(nodePos);\n\t\tconst pos = nodePos + table.start;\n\t\treturn {\n\t\t\tpos,\n\t\t\tstart: pos + 1,\n\t\t\tnode,\n\t\t\tdepth: table.depth + 2\n\t\t};\n\t});\n}\n\n//#endregion\n//#region src/utils/selection-range.ts\n/**\n* Returns a range of rectangular selection spanning all merged cells around a\n* column at index `columnIndex`.\n*\n* Original implementation from Atlassian (Apache License 2.0)\n*\n* https://bitbucket.org/atlassian/atlassian-frontend-mirror/src/5f91cb871e8248bc3bae5ddc30bb9fd9200fadbb/editor/editor-tables/src/utils/get-selection-range-in-column.ts#editor/editor-tables/src/utils/get-selection-range-in-column.ts\n*\n* @internal\n*/\nfunction getSelectionRangeInColumn(tr, startColIndex, endColIndex = startColIndex) {\n\tlet startIndex = startColIndex;\n\tlet endIndex = endColIndex;\n\tfor (let i = startColIndex; i >= 0; i--) {\n\t\tconst cells = getCellsInColumn(i, tr.selection);\n\t\tif (cells) cells.forEach((cell) => {\n\t\t\tconst maybeEndIndex = cell.node.attrs.colspan + i - 1;\n\t\t\tif (maybeEndIndex >= startIndex) startIndex = i;\n\t\t\tif (maybeEndIndex > endIndex) endIndex = maybeEndIndex;\n\t\t});\n\t}\n\tfor (let i = startColIndex; i <= endIndex; i++) {\n\t\tconst cells = getCellsInColumn(i, tr.selection);\n\t\tif (cells) cells.forEach((cell) => {\n\t\t\tconst maybeEndIndex = cell.node.attrs.colspan + i - 1;\n\t\t\tif (cell.node.attrs.colspan > 1 && maybeEndIndex > endIndex) endIndex = maybeEndIndex;\n\t\t});\n\t}\n\tconst indexes = [];\n\tfor (let i = startIndex; i <= endIndex; i++) {\n\t\tconst maybeCells = getCellsInColumn(i, tr.selection);\n\t\tif (maybeCells && maybeCells.length > 0) indexes.push(i);\n\t}\n\tstartIndex = indexes[0];\n\tendIndex = indexes[indexes.length - 1];\n\tconst firstSelectedColumnCells = getCellsInColumn(startIndex, tr.selection);\n\tconst firstRowCells = getCellsInRow(0, tr.selection);\n\tif (!firstSelectedColumnCells || !firstRowCells) return;\n\tconst $anchor = tr.doc.resolve(firstSelectedColumnCells[firstSelectedColumnCells.length - 1].pos);\n\tlet headCell;\n\tfor (let i = endIndex; i >= startIndex; i--) {\n\t\tconst columnCells = getCellsInColumn(i, tr.selection);\n\t\tif (columnCells && columnCells.length > 0) {\n\t\t\tfor (let j = firstRowCells.length - 1; j >= 0; j--) if (firstRowCells[j].pos === columnCells[0].pos) {\n\t\t\t\theadCell = columnCells[0];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (headCell) break;\n\t\t}\n\t}\n\tif (!headCell) return;\n\treturn {\n\t\t$anchor,\n\t\t$head: tr.doc.resolve(headCell.pos),\n\t\tindexes\n\t};\n}\n/**\n* Returns a range of rectangular selection spanning all merged cells around a\n* row at index `rowIndex`.\n*\n* Original implementation from Atlassian (Apache License 2.0)\n*\n* https://bitbucket.org/atlassian/atlassian-frontend-mirror/src/5f91cb871e8248bc3bae5ddc30bb9fd9200fadbb/editor/editor-tables/src/utils/get-selection-range-in-row.ts#editor/editor-tables/src/utils/get-selection-range-in-row.ts\n*\n* @internal\n*/\nfunction getSelectionRangeInRow(tr, startRowIndex, endRowIndex = startRowIndex) {\n\tlet startIndex = startRowIndex;\n\tlet endIndex = endRowIndex;\n\tfor (let i = startRowIndex; i >= 0; i--) {\n\t\tconst cells = getCellsInRow(i, tr.selection);\n\t\tif (cells) cells.forEach((cell) => {\n\t\t\tconst maybeEndIndex = cell.node.attrs.rowspan + i - 1;\n\t\t\tif (maybeEndIndex >= startIndex) startIndex = i;\n\t\t\tif (maybeEndIndex > endIndex) endIndex = maybeEndIndex;\n\t\t});\n\t}\n\tfor (let i = startRowIndex; i <= endIndex; i++) {\n\t\tconst cells = getCellsInRow(i, tr.selection);\n\t\tif (cells) cells.forEach((cell) => {\n\t\t\tconst maybeEndIndex = cell.node.attrs.rowspan + i - 1;\n\t\t\tif (cell.node.attrs.rowspan > 1 && maybeEndIndex > endIndex) endIndex = maybeEndIndex;\n\t\t});\n\t}\n\tconst indexes = [];\n\tfor (let i = startIndex; i <= endIndex; i++) {\n\t\tconst maybeCells = getCellsInRow(i, tr.selection);\n\t\tif (maybeCells && maybeCells.length > 0) indexes.push(i);\n\t}\n\tstartIndex = indexes[0];\n\tendIndex = indexes[indexes.length - 1];\n\tconst firstSelectedRowCells = getCellsInRow(startIndex, tr.selection);\n\tconst firstColumnCells = getCellsInColumn(0, tr.selection);\n\tif (!firstSelectedRowCells || !firstColumnCells) return;\n\tconst $anchor = tr.doc.resolve(firstSelectedRowCells[firstSelectedRowCells.length - 1].pos);\n\tlet headCell;\n\tfor (let i = endIndex; i >= startIndex; i--) {\n\t\tconst rowCells = getCellsInRow(i, tr.selection);\n\t\tif (rowCells && rowCells.length > 0) {\n\t\t\tfor (let j = firstColumnCells.length - 1; j >= 0; j--) if (firstColumnCells[j].pos === rowCells[0].pos) {\n\t\t\t\theadCell = rowCells[0];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (headCell) break;\n\t\t}\n\t}\n\tif (!headCell) return;\n\treturn {\n\t\t$anchor,\n\t\t$head: tr.doc.resolve(headCell.pos),\n\t\tindexes\n\t};\n}\n\n//#endregion\n//#region src/utils/transpose.ts\n/**\n* Transposes a 2D array by flipping columns to rows.\n*\n* Transposition is a familiar algebra concept where the matrix is flipped\n* along its diagonal. For more details, see:\n* https://en.wikipedia.org/wiki/Transpose\n*\n* @example\n* ```javascript\n* const arr = [\n*   ['a1', 'a2', 'a3'],\n*   ['b1', 'b2', 'b3'],\n*   ['c1', 'c2', 'c3'],\n*   ['d1', 'd2', 'd3'],\n* ];\n*\n* const result = transpose(arr);\n* result === [\n*   ['a1', 'b1', 'c1', 'd1'],\n*   ['a2', 'b2', 'c2', 'd2'],\n*   ['a3', 'b3', 'c3', 'd3'],\n* ]\n* ```\n*/\nfunction transpose(array) {\n\treturn array[0].map((_, i) => {\n\t\treturn array.map((column) => column[i]);\n\t});\n}\n\n//#endregion\n//#region src/utils/move-column.ts\n/**\n* Move a column from index `origin` to index `target`.\n*\n* @internal\n*/\nfunction moveColumn(moveColParams) {\n\tvar _getSelectionRangeInC, _getSelectionRangeInC2;\n\tconst { tr, originIndex, targetIndex, select, pos } = moveColParams;\n\tconst table = findTable(tr.doc.resolve(pos));\n\tif (!table) return false;\n\tconst indexesOriginColumn = (_getSelectionRangeInC = getSelectionRangeInColumn(tr, originIndex)) === null || _getSelectionRangeInC === void 0 ? void 0 : _getSelectionRangeInC.indexes;\n\tconst indexesTargetColumn = (_getSelectionRangeInC2 = getSelectionRangeInColumn(tr, targetIndex)) === null || _getSelectionRangeInC2 === void 0 ? void 0 : _getSelectionRangeInC2.indexes;\n\tif (!indexesOriginColumn || !indexesTargetColumn) return false;\n\tif (indexesOriginColumn.includes(targetIndex)) return false;\n\tconst newTable = moveTableColumn$1(table.node, indexesOriginColumn, indexesTargetColumn, 0);\n\ttr.replaceWith(table.pos, table.pos + table.node.nodeSize, newTable);\n\tif (!select) return true;\n\tconst map = TableMap.get(newTable);\n\tconst start = table.start;\n\tconst index = targetIndex;\n\tconst lastCell = map.positionAt(map.height - 1, index, newTable);\n\tconst $lastCell = tr.doc.resolve(start + lastCell);\n\tconst firstCell = map.positionAt(0, index, newTable);\n\tconst $firstCell = tr.doc.resolve(start + firstCell);\n\ttr.setSelection(CellSelection.colSelection($lastCell, $firstCell));\n\treturn true;\n}\nfunction moveTableColumn$1(table, indexesOrigin, indexesTarget, direction) {\n\tlet rows = transpose(convertTableNodeToArrayOfRows(table));\n\trows = moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, direction);\n\trows = transpose(rows);\n\treturn convertArrayOfRowsToTableNode(table, rows);\n}\n\n//#endregion\n//#region src/utils/move-row.ts\n/**\n* Move a row from index `origin` to index `target`.\n*\n* @internal\n*/\nfunction moveRow(moveRowParams) {\n\tvar _getSelectionRangeInR, _getSelectionRangeInR2;\n\tconst { tr, originIndex, targetIndex, select, pos } = moveRowParams;\n\tconst table = findTable(tr.doc.resolve(pos));\n\tif (!table) return false;\n\tconst indexesOriginRow = (_getSelectionRangeInR = getSelectionRangeInRow(tr, originIndex)) === null || _getSelectionRangeInR === void 0 ? void 0 : _getSelectionRangeInR.indexes;\n\tconst indexesTargetRow = (_getSelectionRangeInR2 = getSelectionRangeInRow(tr, targetIndex)) === null || _getSelectionRangeInR2 === void 0 ? void 0 : _getSelectionRangeInR2.indexes;\n\tif (!indexesOriginRow || !indexesTargetRow) return false;\n\tif (indexesOriginRow.includes(targetIndex)) return false;\n\tconst newTable = moveTableRow$1(table.node, indexesOriginRow, indexesTargetRow, 0);\n\ttr.replaceWith(table.pos, table.pos + table.node.nodeSize, newTable);\n\tif (!select) return true;\n\tconst map = TableMap.get(newTable);\n\tconst start = table.start;\n\tconst index = targetIndex;\n\tconst lastCell = map.positionAt(index, map.width - 1, newTable);\n\tconst $lastCell = tr.doc.resolve(start + lastCell);\n\tconst firstCell = map.positionAt(index, 0, newTable);\n\tconst $firstCell = tr.doc.resolve(start + firstCell);\n\ttr.setSelection(CellSelection.rowSelection($lastCell, $firstCell));\n\treturn true;\n}\nfunction moveTableRow$1(table, indexesOrigin, indexesTarget, direction) {\n\tlet rows = convertTableNodeToArrayOfRows(table);\n\trows = moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, direction);\n\treturn convertArrayOfRowsToTableNode(table, rows);\n}\n\n//#endregion\n//#region src/commands.ts\n/**\n* Helper to get the selected rectangle in a table, if any. Adds table\n* map, table node, and table start offset to the object for\n* convenience.\n*\n* @public\n*/\nfunction selectedRect(state) {\n\tconst sel = state.selection;\n\tconst $pos = selectionCell(state);\n\tconst table = $pos.node(-1);\n\tconst tableStart = $pos.start(-1);\n\tconst map = TableMap.get(table);\n\treturn {\n\t\t...sel instanceof CellSelection ? map.rectBetween(sel.$anchorCell.pos - tableStart, sel.$headCell.pos - tableStart) : map.findCell($pos.pos - tableStart),\n\t\ttableStart,\n\t\tmap,\n\t\ttable\n\t};\n}\n/**\n* Add a column at the given position in a table.\n*\n* @public\n*/\nfunction addColumn(tr, { map, tableStart, table }, col) {\n\tlet refColumn = col > 0 ? -1 : 0;\n\tif (columnIsHeader(map, table, col + refColumn)) refColumn = col == 0 || col == map.width ? null : 0;\n\tfor (let row = 0; row < map.height; row++) {\n\t\tconst index = row * map.width + col;\n\t\tif (col > 0 && col < map.width && map.map[index - 1] == map.map[index]) {\n\t\t\tconst pos = map.map[index];\n\t\t\tconst cell = table.nodeAt(pos);\n\t\t\ttr.setNodeMarkup(tr.mapping.map(tableStart + pos), null, addColSpan(cell.attrs, col - map.colCount(pos)));\n\t\t\trow += cell.attrs.rowspan - 1;\n\t\t} else {\n\t\t\tconst type = refColumn == null ? tableNodeTypes(table.type.schema).cell : table.nodeAt(map.map[index + refColumn]).type;\n\t\t\tconst pos = map.positionAt(row, col, table);\n\t\t\ttr.insert(tr.mapping.map(tableStart + pos), type.createAndFill());\n\t\t}\n\t}\n\treturn tr;\n}\n/**\n* Command to add a column before the column with the selection.\n*\n* @public\n*/\nfunction addColumnBefore(state, dispatch) {\n\tif (!isInTable(state)) return false;\n\tif (dispatch) {\n\t\tconst rect = selectedRect(state);\n\t\tdispatch(addColumn(state.tr, rect, rect.left));\n\t}\n\treturn true;\n}\n/**\n* Command to add a column after the column with the selection.\n*\n* @public\n*/\nfunction addColumnAfter(state, dispatch) {\n\tif (!isInTable(state)) return false;\n\tif (dispatch) {\n\t\tconst rect = selectedRect(state);\n\t\tdispatch(addColumn(state.tr, rect, rect.right));\n\t}\n\treturn true;\n}\n/**\n* @public\n*/\nfunction removeColumn(tr, { map, table, tableStart }, col) {\n\tconst mapStart = tr.mapping.maps.length;\n\tfor (let row = 0; row < map.height;) {\n\t\tconst index = row * map.width + col;\n\t\tconst pos = map.map[index];\n\t\tconst cell = table.nodeAt(pos);\n\t\tconst attrs = cell.attrs;\n\t\tif (col > 0 && map.map[index - 1] == pos || col < map.width - 1 && map.map[index + 1] == pos) tr.setNodeMarkup(tr.mapping.slice(mapStart).map(tableStart + pos), null, removeColSpan(attrs, col - map.colCount(pos)));\n\t\telse {\n\t\t\tconst start = tr.mapping.slice(mapStart).map(tableStart + pos);\n\t\t\ttr.delete(start, start + cell.nodeSize);\n\t\t}\n\t\trow += attrs.rowspan;\n\t}\n}\n/**\n* Command function that removes the selected columns from a table.\n*\n* @public\n*/\nfunction deleteColumn(state, dispatch) {\n\tif (!isInTable(state)) return false;\n\tif (dispatch) {\n\t\tconst rect = selectedRect(state);\n\t\tconst tr = state.tr;\n\t\tif (rect.left == 0 && rect.right == rect.map.width) return false;\n\t\tfor (let i = rect.right - 1;; i--) {\n\t\t\tremoveColumn(tr, rect, i);\n\t\t\tif (i == rect.left) break;\n\t\t\tconst table = rect.tableStart ? tr.doc.nodeAt(rect.tableStart - 1) : tr.doc;\n\t\t\tif (!table) throw new RangeError(\"No table found\");\n\t\t\trect.table = table;\n\t\t\trect.map = TableMap.get(table);\n\t\t}\n\t\tdispatch(tr);\n\t}\n\treturn true;\n}\n/**\n* @public\n*/\nfunction rowIsHeader(map, table, row) {\n\tvar _table$nodeAt;\n\tconst headerCell = tableNodeTypes(table.type.schema).header_cell;\n\tfor (let col = 0; col < map.width; col++) if (((_table$nodeAt = table.nodeAt(map.map[col + row * map.width])) === null || _table$nodeAt === void 0 ? void 0 : _table$nodeAt.type) != headerCell) return false;\n\treturn true;\n}\n/**\n* @public\n*/\nfunction addRow(tr, { map, tableStart, table }, row) {\n\tlet rowPos = tableStart;\n\tfor (let i = 0; i < row; i++) rowPos += table.child(i).nodeSize;\n\tconst cells = [];\n\tlet refRow = row > 0 ? -1 : 0;\n\tif (rowIsHeader(map, table, row + refRow)) refRow = row == 0 || row == map.height ? null : 0;\n\tfor (let col = 0, index = map.width * row; col < map.width; col++, index++) if (row > 0 && row < map.height && map.map[index] == map.map[index - map.width]) {\n\t\tconst pos = map.map[index];\n\t\tconst attrs = table.nodeAt(pos).attrs;\n\t\ttr.setNodeMarkup(tableStart + pos, null, {\n\t\t\t...attrs,\n\t\t\trowspan: attrs.rowspan + 1\n\t\t});\n\t\tcol += attrs.colspan - 1;\n\t} else {\n\t\tvar _table$nodeAt2;\n\t\tconst type = refRow == null ? tableNodeTypes(table.type.schema).cell : (_table$nodeAt2 = table.nodeAt(map.map[index + refRow * map.width])) === null || _table$nodeAt2 === void 0 ? void 0 : _table$nodeAt2.type;\n\t\tconst node = type === null || type === void 0 ? void 0 : type.createAndFill();\n\t\tif (node) cells.push(node);\n\t}\n\ttr.insert(rowPos, tableNodeTypes(table.type.schema).row.create(null, cells));\n\treturn tr;\n}\n/**\n* Add a table row before the selection.\n*\n* @public\n*/\nfunction addRowBefore(state, dispatch) {\n\tif (!isInTable(state)) return false;\n\tif (dispatch) {\n\t\tconst rect = selectedRect(state);\n\t\tdispatch(addRow(state.tr, rect, rect.top));\n\t}\n\treturn true;\n}\n/**\n* Add a table row after the selection.\n*\n* @public\n*/\nfunction addRowAfter(state, dispatch) {\n\tif (!isInTable(state)) return false;\n\tif (dispatch) {\n\t\tconst rect = selectedRect(state);\n\t\tdispatch(addRow(state.tr, rect, rect.bottom));\n\t}\n\treturn true;\n}\n/**\n* @public\n*/\nfunction removeRow(tr, { map, table, tableStart }, row) {\n\tlet rowPos = 0;\n\tfor (let i = 0; i < row; i++) rowPos += table.child(i).nodeSize;\n\tconst nextRow = rowPos + table.child(row).nodeSize;\n\tconst mapFrom = tr.mapping.maps.length;\n\ttr.delete(rowPos + tableStart, nextRow + tableStart);\n\tconst seen = /* @__PURE__ */ new Set();\n\tfor (let col = 0, index = row * map.width; col < map.width; col++, index++) {\n\t\tconst pos = map.map[index];\n\t\tif (seen.has(pos)) continue;\n\t\tseen.add(pos);\n\t\tif (row > 0 && pos == map.map[index - map.width]) {\n\t\t\tconst attrs = table.nodeAt(pos).attrs;\n\t\t\ttr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + tableStart), null, {\n\t\t\t\t...attrs,\n\t\t\t\trowspan: attrs.rowspan - 1\n\t\t\t});\n\t\t\tcol += attrs.colspan - 1;\n\t\t} else if (row < map.height && pos == map.map[index + map.width]) {\n\t\t\tconst cell = table.nodeAt(pos);\n\t\t\tconst attrs = cell.attrs;\n\t\t\tconst copy = cell.type.create({\n\t\t\t\t...attrs,\n\t\t\t\trowspan: cell.attrs.rowspan - 1\n\t\t\t}, cell.content);\n\t\t\tconst newPos = map.positionAt(row + 1, col, table);\n\t\t\ttr.insert(tr.mapping.slice(mapFrom).map(tableStart + newPos), copy);\n\t\t\tcol += attrs.colspan - 1;\n\t\t}\n\t}\n}\n/**\n* Remove the selected rows from a table.\n*\n* @public\n*/\nfunction deleteRow(state, dispatch) {\n\tif (!isInTable(state)) return false;\n\tif (dispatch) {\n\t\tconst rect = selectedRect(state), tr = state.tr;\n\t\tif (rect.top == 0 && rect.bottom == rect.map.height) return false;\n\t\tfor (let i = rect.bottom - 1;; i--) {\n\t\t\tremoveRow(tr, rect, i);\n\t\t\tif (i == rect.top) break;\n\t\t\tconst table = rect.tableStart ? tr.doc.nodeAt(rect.tableStart - 1) : tr.doc;\n\t\t\tif (!table) throw new RangeError(\"No table found\");\n\t\t\trect.table = table;\n\t\t\trect.map = TableMap.get(rect.table);\n\t\t}\n\t\tdispatch(tr);\n\t}\n\treturn true;\n}\nfunction isEmpty(cell) {\n\tconst c = cell.content;\n\treturn c.childCount == 1 && c.child(0).isTextblock && c.child(0).childCount == 0;\n}\nfunction cellsOverlapRectangle({ width, height, map }, rect) {\n\tlet indexTop = rect.top * width + rect.left, indexLeft = indexTop;\n\tlet indexBottom = (rect.bottom - 1) * width + rect.left, indexRight = indexTop + (rect.right - rect.left - 1);\n\tfor (let i = rect.top; i < rect.bottom; i++) {\n\t\tif (rect.left > 0 && map[indexLeft] == map[indexLeft - 1] || rect.right < width && map[indexRight] == map[indexRight + 1]) return true;\n\t\tindexLeft += width;\n\t\tindexRight += width;\n\t}\n\tfor (let i = rect.left; i < rect.right; i++) {\n\t\tif (rect.top > 0 && map[indexTop] == map[indexTop - width] || rect.bottom < height && map[indexBottom] == map[indexBottom + width]) return true;\n\t\tindexTop++;\n\t\tindexBottom++;\n\t}\n\treturn false;\n}\n/**\n* Merge the selected cells into a single cell. Only available when\n* the selected cells' outline forms a rectangle.\n*\n* @public\n*/\nfunction mergeCells(state, dispatch) {\n\tconst sel = state.selection;\n\tif (!(sel instanceof CellSelection) || sel.$anchorCell.pos == sel.$headCell.pos) return false;\n\tconst rect = selectedRect(state), { map } = rect;\n\tif (cellsOverlapRectangle(map, rect)) return false;\n\tif (dispatch) {\n\t\tconst tr = state.tr;\n\t\tconst seen = {};\n\t\tlet content = Fragment.empty;\n\t\tlet mergedPos;\n\t\tlet mergedCell;\n\t\tfor (let row = rect.top; row < rect.bottom; row++) for (let col = rect.left; col < rect.right; col++) {\n\t\t\tconst cellPos = map.map[row * map.width + col];\n\t\t\tconst cell = rect.table.nodeAt(cellPos);\n\t\t\tif (seen[cellPos] || !cell) continue;\n\t\t\tseen[cellPos] = true;\n\t\t\tif (mergedPos == null) {\n\t\t\t\tmergedPos = cellPos;\n\t\t\t\tmergedCell = cell;\n\t\t\t} else {\n\t\t\t\tif (!isEmpty(cell)) content = content.append(cell.content);\n\t\t\t\tconst mapped = tr.mapping.map(cellPos + rect.tableStart);\n\t\t\t\ttr.delete(mapped, mapped + cell.nodeSize);\n\t\t\t}\n\t\t}\n\t\tif (mergedPos == null || mergedCell == null) return true;\n\t\ttr.setNodeMarkup(mergedPos + rect.tableStart, null, {\n\t\t\t...addColSpan(mergedCell.attrs, mergedCell.attrs.colspan, rect.right - rect.left - mergedCell.attrs.colspan),\n\t\t\trowspan: rect.bottom - rect.top\n\t\t});\n\t\tif (content.size > 0) {\n\t\t\tconst end = mergedPos + 1 + mergedCell.content.size;\n\t\t\tconst start = isEmpty(mergedCell) ? mergedPos + 1 : end;\n\t\t\ttr.replaceWith(start + rect.tableStart, end + rect.tableStart, content);\n\t\t}\n\t\ttr.setSelection(new CellSelection(tr.doc.resolve(mergedPos + rect.tableStart)));\n\t\tdispatch(tr);\n\t}\n\treturn true;\n}\n/**\n* Split a selected cell, whose rowpan or colspan is greater than one,\n* into smaller cells. Use the first cell type for the new cells.\n*\n* @public\n*/\nfunction splitCell(state, dispatch) {\n\tconst nodeTypes = tableNodeTypes(state.schema);\n\treturn splitCellWithType(({ node }) => {\n\t\treturn nodeTypes[node.type.spec.tableRole];\n\t})(state, dispatch);\n}\n/**\n* Split a selected cell, whose rowpan or colspan is greater than one,\n* into smaller cells with the cell type (th, td) returned by getType function.\n*\n* @public\n*/\nfunction splitCellWithType(getCellType) {\n\treturn (state, dispatch) => {\n\t\tconst sel = state.selection;\n\t\tlet cellNode;\n\t\tlet cellPos;\n\t\tif (!(sel instanceof CellSelection)) {\n\t\t\tvar _cellAround;\n\t\t\tcellNode = cellWrapping(sel.$from);\n\t\t\tif (!cellNode) return false;\n\t\t\tcellPos = (_cellAround = cellAround(sel.$from)) === null || _cellAround === void 0 ? void 0 : _cellAround.pos;\n\t\t} else {\n\t\t\tif (sel.$anchorCell.pos != sel.$headCell.pos) return false;\n\t\t\tcellNode = sel.$anchorCell.nodeAfter;\n\t\t\tcellPos = sel.$anchorCell.pos;\n\t\t}\n\t\tif (cellNode == null || cellPos == null) return false;\n\t\tif (cellNode.attrs.colspan == 1 && cellNode.attrs.rowspan == 1) return false;\n\t\tif (dispatch) {\n\t\t\tlet baseAttrs = cellNode.attrs;\n\t\t\tconst attrs = [];\n\t\t\tconst colwidth = baseAttrs.colwidth;\n\t\t\tif (baseAttrs.rowspan > 1) baseAttrs = {\n\t\t\t\t...baseAttrs,\n\t\t\t\trowspan: 1\n\t\t\t};\n\t\t\tif (baseAttrs.colspan > 1) baseAttrs = {\n\t\t\t\t...baseAttrs,\n\t\t\t\tcolspan: 1\n\t\t\t};\n\t\t\tconst rect = selectedRect(state), tr = state.tr;\n\t\t\tfor (let i = 0; i < rect.right - rect.left; i++) attrs.push(colwidth ? {\n\t\t\t\t...baseAttrs,\n\t\t\t\tcolwidth: colwidth && colwidth[i] ? [colwidth[i]] : null\n\t\t\t} : baseAttrs);\n\t\t\tlet lastCell;\n\t\t\tfor (let row = rect.top; row < rect.bottom; row++) {\n\t\t\t\tlet pos = rect.map.positionAt(row, rect.left, rect.table);\n\t\t\t\tif (row == rect.top) pos += cellNode.nodeSize;\n\t\t\t\tfor (let col = rect.left, i = 0; col < rect.right; col++, i++) {\n\t\t\t\t\tif (col == rect.left && row == rect.top) continue;\n\t\t\t\t\ttr.insert(lastCell = tr.mapping.map(pos + rect.tableStart, 1), getCellType({\n\t\t\t\t\t\tnode: cellNode,\n\t\t\t\t\t\trow,\n\t\t\t\t\t\tcol\n\t\t\t\t\t}).createAndFill(attrs[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t\ttr.setNodeMarkup(cellPos, getCellType({\n\t\t\t\tnode: cellNode,\n\t\t\t\trow: rect.top,\n\t\t\t\tcol: rect.left\n\t\t\t}), attrs[0]);\n\t\t\tif (sel instanceof CellSelection) tr.setSelection(new CellSelection(tr.doc.resolve(sel.$anchorCell.pos), lastCell ? tr.doc.resolve(lastCell) : void 0));\n\t\t\tdispatch(tr);\n\t\t}\n\t\treturn true;\n\t};\n}\n/**\n* Returns a command that sets the given attribute to the given value,\n* and is only available when the currently selected cell doesn't\n* already have that attribute set to that value.\n*\n* @public\n*/\nfunction setCellAttr(name, value) {\n\treturn function(state, dispatch) {\n\t\tif (!isInTable(state)) return false;\n\t\tconst $cell = selectionCell(state);\n\t\tif ($cell.nodeAfter.attrs[name] === value) return false;\n\t\tif (dispatch) {\n\t\t\tconst tr = state.tr;\n\t\t\tif (state.selection instanceof CellSelection) state.selection.forEachCell((node, pos) => {\n\t\t\t\tif (node.attrs[name] !== value) tr.setNodeMarkup(pos, null, {\n\t\t\t\t\t...node.attrs,\n\t\t\t\t\t[name]: value\n\t\t\t\t});\n\t\t\t});\n\t\t\telse tr.setNodeMarkup($cell.pos, null, {\n\t\t\t\t...$cell.nodeAfter.attrs,\n\t\t\t\t[name]: value\n\t\t\t});\n\t\t\tdispatch(tr);\n\t\t}\n\t\treturn true;\n\t};\n}\nfunction deprecated_toggleHeader(type) {\n\treturn function(state, dispatch) {\n\t\tif (!isInTable(state)) return false;\n\t\tif (dispatch) {\n\t\t\tconst types = tableNodeTypes(state.schema);\n\t\t\tconst rect = selectedRect(state), tr = state.tr;\n\t\t\tconst cells = rect.map.cellsInRect(type == \"column\" ? {\n\t\t\t\tleft: rect.left,\n\t\t\t\ttop: 0,\n\t\t\t\tright: rect.right,\n\t\t\t\tbottom: rect.map.height\n\t\t\t} : type == \"row\" ? {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: rect.top,\n\t\t\t\tright: rect.map.width,\n\t\t\t\tbottom: rect.bottom\n\t\t\t} : rect);\n\t\t\tconst nodes = cells.map((pos) => rect.table.nodeAt(pos));\n\t\t\tfor (let i = 0; i < cells.length; i++) if (nodes[i].type == types.header_cell) tr.setNodeMarkup(rect.tableStart + cells[i], types.cell, nodes[i].attrs);\n\t\t\tif (tr.steps.length === 0) for (let i = 0; i < cells.length; i++) tr.setNodeMarkup(rect.tableStart + cells[i], types.header_cell, nodes[i].attrs);\n\t\t\tdispatch(tr);\n\t\t}\n\t\treturn true;\n\t};\n}\nfunction isHeaderEnabledByType(type, rect, types) {\n\tconst cellPositions = rect.map.cellsInRect({\n\t\tleft: 0,\n\t\ttop: 0,\n\t\tright: type == \"row\" ? rect.map.width : 1,\n\t\tbottom: type == \"column\" ? rect.map.height : 1\n\t});\n\tfor (let i = 0; i < cellPositions.length; i++) {\n\t\tconst cell = rect.table.nodeAt(cellPositions[i]);\n\t\tif (cell && cell.type !== types.header_cell) return false;\n\t}\n\treturn true;\n}\n/**\n* Toggles between row/column header and normal cells (Only applies to first row/column).\n* For deprecated behavior pass `useDeprecatedLogic` in options with true.\n*\n* @public\n*/\nfunction toggleHeader(type, options) {\n\toptions = options || { useDeprecatedLogic: false };\n\tif (options.useDeprecatedLogic) return deprecated_toggleHeader(type);\n\treturn function(state, dispatch) {\n\t\tif (!isInTable(state)) return false;\n\t\tif (dispatch) {\n\t\t\tconst types = tableNodeTypes(state.schema);\n\t\t\tconst rect = selectedRect(state), tr = state.tr;\n\t\t\tconst isHeaderRowEnabled = isHeaderEnabledByType(\"row\", rect, types);\n\t\t\tconst isHeaderColumnEnabled = isHeaderEnabledByType(\"column\", rect, types);\n\t\t\tconst selectionStartsAt = (type === \"column\" ? isHeaderRowEnabled : type === \"row\" ? isHeaderColumnEnabled : false) ? 1 : 0;\n\t\t\tconst cellsRect = type == \"column\" ? {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: selectionStartsAt,\n\t\t\t\tright: 1,\n\t\t\t\tbottom: rect.map.height\n\t\t\t} : type == \"row\" ? {\n\t\t\t\tleft: selectionStartsAt,\n\t\t\t\ttop: 0,\n\t\t\t\tright: rect.map.width,\n\t\t\t\tbottom: 1\n\t\t\t} : rect;\n\t\t\tconst newType = type == \"column\" ? isHeaderColumnEnabled ? types.cell : types.header_cell : type == \"row\" ? isHeaderRowEnabled ? types.cell : types.header_cell : types.cell;\n\t\t\trect.map.cellsInRect(cellsRect).forEach((relativeCellPos) => {\n\t\t\t\tconst cellPos = relativeCellPos + rect.tableStart;\n\t\t\t\tconst cell = tr.doc.nodeAt(cellPos);\n\t\t\t\tif (cell) tr.setNodeMarkup(cellPos, newType, cell.attrs);\n\t\t\t});\n\t\t\tdispatch(tr);\n\t\t}\n\t\treturn true;\n\t};\n}\n/**\n* Toggles whether the selected row contains header cells.\n*\n* @public\n*/\nconst toggleHeaderRow = toggleHeader(\"row\", { useDeprecatedLogic: true });\n/**\n* Toggles whether the selected column contains header cells.\n*\n* @public\n*/\nconst toggleHeaderColumn = toggleHeader(\"column\", { useDeprecatedLogic: true });\n/**\n* Toggles whether the selected cells are header cells.\n*\n* @public\n*/\nconst toggleHeaderCell = toggleHeader(\"cell\", { useDeprecatedLogic: true });\nfunction findNextCell($cell, dir) {\n\tif (dir < 0) {\n\t\tconst before = $cell.nodeBefore;\n\t\tif (before) return $cell.pos - before.nodeSize;\n\t\tfor (let row = $cell.index(-1) - 1, rowEnd = $cell.before(); row >= 0; row--) {\n\t\t\tconst rowNode = $cell.node(-1).child(row);\n\t\t\tconst lastChild = rowNode.lastChild;\n\t\t\tif (lastChild) return rowEnd - 1 - lastChild.nodeSize;\n\t\t\trowEnd -= rowNode.nodeSize;\n\t\t}\n\t} else {\n\t\tif ($cell.index() < $cell.parent.childCount - 1) return $cell.pos + $cell.nodeAfter.nodeSize;\n\t\tconst table = $cell.node(-1);\n\t\tfor (let row = $cell.indexAfter(-1), rowStart = $cell.after(); row < table.childCount; row++) {\n\t\t\tconst rowNode = table.child(row);\n\t\t\tif (rowNode.childCount) return rowStart + 1;\n\t\t\trowStart += rowNode.nodeSize;\n\t\t}\n\t}\n\treturn null;\n}\n/**\n* Returns a command for selecting the next (direction=1) or previous\n* (direction=-1) cell in a table.\n*\n* @public\n*/\nfunction goToNextCell(direction) {\n\treturn function(state, dispatch) {\n\t\tif (!isInTable(state)) return false;\n\t\tconst cell = findNextCell(selectionCell(state), direction);\n\t\tif (cell == null) return false;\n\t\tif (dispatch) {\n\t\t\tconst $cell = state.doc.resolve(cell);\n\t\t\tdispatch(state.tr.setSelection(TextSelection.between($cell, moveCellForward($cell))).scrollIntoView());\n\t\t}\n\t\treturn true;\n\t};\n}\n/**\n* Deletes the table around the selection, if any.\n*\n* @public\n*/\nfunction deleteTable(state, dispatch) {\n\tconst $pos = state.selection.$anchor;\n\tfor (let d = $pos.depth; d > 0; d--) if ($pos.node(d).type.spec.tableRole == \"table\") {\n\t\tif (dispatch) dispatch(state.tr.delete($pos.before(d), $pos.after(d)).scrollIntoView());\n\t\treturn true;\n\t}\n\treturn false;\n}\n/**\n* Deletes the content of the selected cells, if they are not empty.\n*\n* @public\n*/\nfunction deleteCellSelection(state, dispatch) {\n\tconst sel = state.selection;\n\tif (!(sel instanceof CellSelection)) return false;\n\tif (dispatch) {\n\t\tconst tr = state.tr;\n\t\tconst baseContent = tableNodeTypes(state.schema).cell.createAndFill().content;\n\t\tsel.forEachCell((cell, pos) => {\n\t\t\tif (!cell.content.eq(baseContent)) tr.replace(tr.mapping.map(pos + 1), tr.mapping.map(pos + cell.nodeSize - 1), new Slice(baseContent, 0, 0));\n\t\t});\n\t\tif (tr.docChanged) dispatch(tr);\n\t}\n\treturn true;\n}\n/**\n* Move a table row from index `from` to index `to`.\n*\n* @public\n*/\nfunction moveTableRow(options) {\n\treturn (state, dispatch) => {\n\t\tconst { from: originIndex, to: targetIndex, select = true, pos = state.selection.from } = options;\n\t\tconst tr = state.tr;\n\t\tif (moveRow({\n\t\t\ttr,\n\t\t\toriginIndex,\n\t\t\ttargetIndex,\n\t\t\tselect,\n\t\t\tpos\n\t\t})) {\n\t\t\tdispatch === null || dispatch === void 0 || dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n}\n/**\n* Move a table column from index `from` to index `to`.\n*\n* @public\n*/\nfunction moveTableColumn(options) {\n\treturn (state, dispatch) => {\n\t\tconst { from: originIndex, to: targetIndex, select = true, pos = state.selection.from } = options;\n\t\tconst tr = state.tr;\n\t\tif (moveColumn({\n\t\t\ttr,\n\t\t\toriginIndex,\n\t\t\ttargetIndex,\n\t\t\tselect,\n\t\t\tpos\n\t\t})) {\n\t\t\tdispatch === null || dispatch === void 0 || dispatch(tr);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n}\n\n//#endregion\n//#region src/copypaste.ts\n/**\n* Get a rectangular area of cells from a slice, or null if the outer\n* nodes of the slice aren't table cells or rows.\n*\n* @internal\n*/\nfunction pastedCells(slice) {\n\tif (slice.size === 0) return null;\n\tlet { content, openStart, openEnd } = slice;\n\twhile (content.childCount == 1 && (openStart > 0 && openEnd > 0 || content.child(0).type.spec.tableRole == \"table\")) {\n\t\topenStart--;\n\t\topenEnd--;\n\t\tcontent = content.child(0).content;\n\t}\n\tconst first = content.child(0);\n\tconst role = first.type.spec.tableRole;\n\tconst schema = first.type.schema, rows = [];\n\tif (role == \"row\") for (let i = 0; i < content.childCount; i++) {\n\t\tlet cells = content.child(i).content;\n\t\tconst left = i ? 0 : Math.max(0, openStart - 1);\n\t\tconst right = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1);\n\t\tif (left || right) cells = fitSlice(tableNodeTypes(schema).row, new Slice(cells, left, right)).content;\n\t\trows.push(cells);\n\t}\n\telse if (role == \"cell\" || role == \"header_cell\") rows.push(openStart || openEnd ? fitSlice(tableNodeTypes(schema).row, new Slice(content, openStart, openEnd)).content : content);\n\telse return null;\n\treturn ensureRectangular(schema, rows);\n}\nfunction ensureRectangular(schema, rows) {\n\tconst widths = [];\n\tfor (let i = 0; i < rows.length; i++) {\n\t\tconst row = rows[i];\n\t\tfor (let j = row.childCount - 1; j >= 0; j--) {\n\t\t\tconst { rowspan, colspan } = row.child(j).attrs;\n\t\t\tfor (let r = i; r < i + rowspan; r++) widths[r] = (widths[r] || 0) + colspan;\n\t\t}\n\t}\n\tlet width = 0;\n\tfor (let r = 0; r < widths.length; r++) width = Math.max(width, widths[r]);\n\tfor (let r = 0; r < widths.length; r++) {\n\t\tif (r >= rows.length) rows.push(Fragment.empty);\n\t\tif (widths[r] < width) {\n\t\t\tconst empty = tableNodeTypes(schema).cell.createAndFill();\n\t\t\tconst cells = [];\n\t\t\tfor (let i = widths[r]; i < width; i++) cells.push(empty);\n\t\t\trows[r] = rows[r].append(Fragment.from(cells));\n\t\t}\n\t}\n\treturn {\n\t\theight: rows.length,\n\t\twidth,\n\t\trows\n\t};\n}\nfunction fitSlice(nodeType, slice) {\n\tconst node = nodeType.createAndFill();\n\treturn new Transform(node).replace(0, node.content.size, slice).doc;\n}\n/**\n* Clip or extend (repeat) the given set of cells to cover the given\n* width and height. Will clip rowspan/colspan cells at the edges when\n* they stick out.\n*\n* @internal\n*/\nfunction clipCells({ width, height, rows }, newWidth, newHeight) {\n\tif (width != newWidth) {\n\t\tconst added = [];\n\t\tconst newRows = [];\n\t\tfor (let row = 0; row < rows.length; row++) {\n\t\t\tconst frag = rows[row], cells = [];\n\t\t\tfor (let col = added[row] || 0, i = 0; col < newWidth; i++) {\n\t\t\t\tlet cell = frag.child(i % frag.childCount);\n\t\t\t\tif (col + cell.attrs.colspan > newWidth) cell = cell.type.createChecked(removeColSpan(cell.attrs, cell.attrs.colspan, col + cell.attrs.colspan - newWidth), cell.content);\n\t\t\t\tcells.push(cell);\n\t\t\t\tcol += cell.attrs.colspan;\n\t\t\t\tfor (let j = 1; j < cell.attrs.rowspan; j++) added[row + j] = (added[row + j] || 0) + cell.attrs.colspan;\n\t\t\t}\n\t\t\tnewRows.push(Fragment.from(cells));\n\t\t}\n\t\trows = newRows;\n\t\twidth = newWidth;\n\t}\n\tif (height != newHeight) {\n\t\tconst newRows = [];\n\t\tfor (let row = 0, i = 0; row < newHeight; row++, i++) {\n\t\t\tconst cells = [], source = rows[i % height];\n\t\t\tfor (let j = 0; j < source.childCount; j++) {\n\t\t\t\tlet cell = source.child(j);\n\t\t\t\tif (row + cell.attrs.rowspan > newHeight) cell = cell.type.create({\n\t\t\t\t\t...cell.attrs,\n\t\t\t\t\trowspan: Math.max(1, newHeight - cell.attrs.rowspan)\n\t\t\t\t}, cell.content);\n\t\t\t\tcells.push(cell);\n\t\t\t}\n\t\t\tnewRows.push(Fragment.from(cells));\n\t\t}\n\t\trows = newRows;\n\t\theight = newHeight;\n\t}\n\treturn {\n\t\twidth,\n\t\theight,\n\t\trows\n\t};\n}\nfunction growTable(tr, map, table, start, width, height, mapFrom) {\n\tconst schema = tr.doc.type.schema;\n\tconst types = tableNodeTypes(schema);\n\tlet empty;\n\tlet emptyHead;\n\tif (width > map.width) for (let row = 0, rowEnd = 0; row < map.height; row++) {\n\t\tconst rowNode = table.child(row);\n\t\trowEnd += rowNode.nodeSize;\n\t\tconst cells = [];\n\t\tlet add;\n\t\tif (rowNode.lastChild == null || rowNode.lastChild.type == types.cell) add = empty || (empty = types.cell.createAndFill());\n\t\telse add = emptyHead || (emptyHead = types.header_cell.createAndFill());\n\t\tfor (let i = map.width; i < width; i++) cells.push(add);\n\t\ttr.insert(tr.mapping.slice(mapFrom).map(rowEnd - 1 + start), cells);\n\t}\n\tif (height > map.height) {\n\t\tconst cells = [];\n\t\tfor (let i = 0, start$1 = (map.height - 1) * map.width; i < Math.max(map.width, width); i++) {\n\t\t\tconst header = i >= map.width ? false : table.nodeAt(map.map[start$1 + i]).type == types.header_cell;\n\t\t\tcells.push(header ? emptyHead || (emptyHead = types.header_cell.createAndFill()) : empty || (empty = types.cell.createAndFill()));\n\t\t}\n\t\tconst emptyRow = types.row.create(null, Fragment.from(cells)), rows = [];\n\t\tfor (let i = map.height; i < height; i++) rows.push(emptyRow);\n\t\ttr.insert(tr.mapping.slice(mapFrom).map(start + table.nodeSize - 2), rows);\n\t}\n\treturn !!(empty || emptyHead);\n}\nfunction isolateHorizontal(tr, map, table, start, left, right, top, mapFrom) {\n\tif (top == 0 || top == map.height) return false;\n\tlet found = false;\n\tfor (let col = left; col < right; col++) {\n\t\tconst index = top * map.width + col, pos = map.map[index];\n\t\tif (map.map[index - map.width] == pos) {\n\t\t\tfound = true;\n\t\t\tconst cell = table.nodeAt(pos);\n\t\t\tconst { top: cellTop, left: cellLeft } = map.findCell(pos);\n\t\t\ttr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + start), null, {\n\t\t\t\t...cell.attrs,\n\t\t\t\trowspan: top - cellTop\n\t\t\t});\n\t\t\ttr.insert(tr.mapping.slice(mapFrom).map(map.positionAt(top, cellLeft, table)), cell.type.createAndFill({\n\t\t\t\t...cell.attrs,\n\t\t\t\trowspan: cellTop + cell.attrs.rowspan - top\n\t\t\t}));\n\t\t\tcol += cell.attrs.colspan - 1;\n\t\t}\n\t}\n\treturn found;\n}\nfunction isolateVertical(tr, map, table, start, top, bottom, left, mapFrom) {\n\tif (left == 0 || left == map.width) return false;\n\tlet found = false;\n\tfor (let row = top; row < bottom; row++) {\n\t\tconst index = row * map.width + left, pos = map.map[index];\n\t\tif (map.map[index - 1] == pos) {\n\t\t\tfound = true;\n\t\t\tconst cell = table.nodeAt(pos);\n\t\t\tconst cellLeft = map.colCount(pos);\n\t\t\tconst updatePos = tr.mapping.slice(mapFrom).map(pos + start);\n\t\t\ttr.setNodeMarkup(updatePos, null, removeColSpan(cell.attrs, left - cellLeft, cell.attrs.colspan - (left - cellLeft)));\n\t\t\ttr.insert(updatePos + cell.nodeSize, cell.type.createAndFill(removeColSpan(cell.attrs, 0, left - cellLeft)));\n\t\t\trow += cell.attrs.rowspan - 1;\n\t\t}\n\t}\n\treturn found;\n}\n/**\n* Insert the given set of cells (as returned by `pastedCells`) into a\n* table, at the position pointed at by rect.\n*\n* @internal\n*/\nfunction insertCells(state, dispatch, tableStart, rect, cells) {\n\tlet table = tableStart ? state.doc.nodeAt(tableStart - 1) : state.doc;\n\tif (!table) throw new Error(\"No table found\");\n\tlet map = TableMap.get(table);\n\tconst { top, left } = rect;\n\tconst right = left + cells.width, bottom = top + cells.height;\n\tconst tr = state.tr;\n\tlet mapFrom = 0;\n\tfunction recomp() {\n\t\ttable = tableStart ? tr.doc.nodeAt(tableStart - 1) : tr.doc;\n\t\tif (!table) throw new Error(\"No table found\");\n\t\tmap = TableMap.get(table);\n\t\tmapFrom = tr.mapping.maps.length;\n\t}\n\tif (growTable(tr, map, table, tableStart, right, bottom, mapFrom)) recomp();\n\tif (isolateHorizontal(tr, map, table, tableStart, left, right, top, mapFrom)) recomp();\n\tif (isolateHorizontal(tr, map, table, tableStart, left, right, bottom, mapFrom)) recomp();\n\tif (isolateVertical(tr, map, table, tableStart, top, bottom, left, mapFrom)) recomp();\n\tif (isolateVertical(tr, map, table, tableStart, top, bottom, right, mapFrom)) recomp();\n\tfor (let row = top; row < bottom; row++) {\n\t\tconst from = map.positionAt(row, left, table), to = map.positionAt(row, right, table);\n\t\ttr.replace(tr.mapping.slice(mapFrom).map(from + tableStart), tr.mapping.slice(mapFrom).map(to + tableStart), new Slice(cells.rows[row - top], 0, 0));\n\t}\n\trecomp();\n\ttr.setSelection(new CellSelection(tr.doc.resolve(tableStart + map.positionAt(top, left, table)), tr.doc.resolve(tableStart + map.positionAt(bottom - 1, right - 1, table))));\n\tdispatch(tr);\n}\n\n//#endregion\n//#region src/input.ts\nconst handleKeyDown = keydownHandler({\n\tArrowLeft: arrow(\"horiz\", -1),\n\tArrowRight: arrow(\"horiz\", 1),\n\tArrowUp: arrow(\"vert\", -1),\n\tArrowDown: arrow(\"vert\", 1),\n\t\"Shift-ArrowLeft\": shiftArrow(\"horiz\", -1),\n\t\"Shift-ArrowRight\": shiftArrow(\"horiz\", 1),\n\t\"Shift-ArrowUp\": shiftArrow(\"vert\", -1),\n\t\"Shift-ArrowDown\": shiftArrow(\"vert\", 1),\n\tBackspace: deleteCellSelection,\n\t\"Mod-Backspace\": deleteCellSelection,\n\tDelete: deleteCellSelection,\n\t\"Mod-Delete\": deleteCellSelection\n});\nfunction maybeSetSelection(state, dispatch, selection) {\n\tif (selection.eq(state.selection)) return false;\n\tif (dispatch) dispatch(state.tr.setSelection(selection).scrollIntoView());\n\treturn true;\n}\n/**\n* @internal\n*/\nfunction arrow(axis, dir) {\n\treturn (state, dispatch, view) => {\n\t\tif (!view) return false;\n\t\tconst sel = state.selection;\n\t\tif (sel instanceof CellSelection) return maybeSetSelection(state, dispatch, Selection.near(sel.$headCell, dir));\n\t\tif (axis != \"horiz\" && !sel.empty) return false;\n\t\tconst end = atEndOfCell(view, axis, dir);\n\t\tif (end == null) return false;\n\t\tif (axis == \"horiz\") return maybeSetSelection(state, dispatch, Selection.near(state.doc.resolve(sel.head + dir), dir));\n\t\telse {\n\t\t\tconst $cell = state.doc.resolve(end);\n\t\t\tconst $next = nextCell($cell, axis, dir);\n\t\t\tlet newSel;\n\t\t\tif ($next) newSel = Selection.near($next, 1);\n\t\t\telse if (dir < 0) newSel = Selection.near(state.doc.resolve($cell.before(-1)), -1);\n\t\t\telse newSel = Selection.near(state.doc.resolve($cell.after(-1)), 1);\n\t\t\treturn maybeSetSelection(state, dispatch, newSel);\n\t\t}\n\t};\n}\nfunction shiftArrow(axis, dir) {\n\treturn (state, dispatch, view) => {\n\t\tif (!view) return false;\n\t\tconst sel = state.selection;\n\t\tlet cellSel;\n\t\tif (sel instanceof CellSelection) cellSel = sel;\n\t\telse {\n\t\t\tconst end = atEndOfCell(view, axis, dir);\n\t\t\tif (end == null) return false;\n\t\t\tcellSel = new CellSelection(state.doc.resolve(end));\n\t\t}\n\t\tconst $head = nextCell(cellSel.$headCell, axis, dir);\n\t\tif (!$head) return false;\n\t\treturn maybeSetSelection(state, dispatch, new CellSelection(cellSel.$anchorCell, $head));\n\t};\n}\nfunction handleTripleClick(view, pos) {\n\tconst doc = view.state.doc, $cell = cellAround(doc.resolve(pos));\n\tif (!$cell) return false;\n\tview.dispatch(view.state.tr.setSelection(new CellSelection($cell)));\n\treturn true;\n}\n/**\n* @public\n*/\nfunction handlePaste(view, _, slice) {\n\tif (!isInTable(view.state)) return false;\n\tlet cells = pastedCells(slice);\n\tconst sel = view.state.selection;\n\tif (sel instanceof CellSelection) {\n\t\tif (!cells) cells = {\n\t\t\twidth: 1,\n\t\t\theight: 1,\n\t\t\trows: [Fragment.from(fitSlice(tableNodeTypes(view.state.schema).cell, slice))]\n\t\t};\n\t\tconst table = sel.$anchorCell.node(-1);\n\t\tconst start = sel.$anchorCell.start(-1);\n\t\tconst rect = TableMap.get(table).rectBetween(sel.$anchorCell.pos - start, sel.$headCell.pos - start);\n\t\tcells = clipCells(cells, rect.right - rect.left, rect.bottom - rect.top);\n\t\tinsertCells(view.state, view.dispatch, start, rect, cells);\n\t\treturn true;\n\t} else if (cells) {\n\t\tconst $cell = selectionCell(view.state);\n\t\tconst start = $cell.start(-1);\n\t\tinsertCells(view.state, view.dispatch, start, TableMap.get($cell.node(-1)).findCell($cell.pos - start), cells);\n\t\treturn true;\n\t} else return false;\n}\nfunction handleMouseDown$1(view, startEvent) {\n\tvar _cellUnderMouse;\n\tif (startEvent.button != 0) return;\n\tif (startEvent.ctrlKey || startEvent.metaKey) return;\n\tconst startDOMCell = domInCell(view, startEvent.target);\n\tlet $anchor;\n\tif (startEvent.shiftKey && view.state.selection instanceof CellSelection) {\n\t\tsetCellSelection(view.state.selection.$anchorCell, startEvent);\n\t\tstartEvent.preventDefault();\n\t} else if (startEvent.shiftKey && startDOMCell && ($anchor = cellAround(view.state.selection.$anchor)) != null && ((_cellUnderMouse = cellUnderMouse(view, startEvent)) === null || _cellUnderMouse === void 0 ? void 0 : _cellUnderMouse.pos) != $anchor.pos) {\n\t\tsetCellSelection($anchor, startEvent);\n\t\tstartEvent.preventDefault();\n\t} else if (!startDOMCell) return;\n\tfunction setCellSelection($anchor$1, event) {\n\t\tlet $head = cellUnderMouse(view, event);\n\t\tconst starting = tableEditingKey.getState(view.state) == null;\n\t\tif (!$head || !inSameTable($anchor$1, $head)) if (starting) $head = $anchor$1;\n\t\telse return;\n\t\tconst selection = new CellSelection($anchor$1, $head);\n\t\tif (starting || !view.state.selection.eq(selection)) {\n\t\t\tconst tr = view.state.tr.setSelection(selection);\n\t\t\tif (starting) tr.setMeta(tableEditingKey, $anchor$1.pos);\n\t\t\tview.dispatch(tr);\n\t\t}\n\t}\n\tfunction stop() {\n\t\tview.root.removeEventListener(\"mouseup\", stop);\n\t\tview.root.removeEventListener(\"dragstart\", stop);\n\t\tview.root.removeEventListener(\"mousemove\", move);\n\t\tif (tableEditingKey.getState(view.state) != null) view.dispatch(view.state.tr.setMeta(tableEditingKey, -1));\n\t}\n\tfunction move(_event) {\n\t\tconst event = _event;\n\t\tconst anchor = tableEditingKey.getState(view.state);\n\t\tlet $anchor$1;\n\t\tif (anchor != null) $anchor$1 = view.state.doc.resolve(anchor);\n\t\telse if (domInCell(view, event.target) != startDOMCell) {\n\t\t\t$anchor$1 = cellUnderMouse(view, startEvent);\n\t\t\tif (!$anchor$1) return stop();\n\t\t}\n\t\tif ($anchor$1) setCellSelection($anchor$1, event);\n\t}\n\tview.root.addEventListener(\"mouseup\", stop);\n\tview.root.addEventListener(\"dragstart\", stop);\n\tview.root.addEventListener(\"mousemove\", move);\n}\nfunction atEndOfCell(view, axis, dir) {\n\tif (!(view.state.selection instanceof TextSelection)) return null;\n\tconst { $head } = view.state.selection;\n\tfor (let d = $head.depth - 1; d >= 0; d--) {\n\t\tconst parent = $head.node(d);\n\t\tif ((dir < 0 ? $head.index(d) : $head.indexAfter(d)) != (dir < 0 ? 0 : parent.childCount)) return null;\n\t\tif (parent.type.spec.tableRole == \"cell\" || parent.type.spec.tableRole == \"header_cell\") {\n\t\t\tconst cellPos = $head.before(d);\n\t\t\tconst dirStr = axis == \"vert\" ? dir > 0 ? \"down\" : \"up\" : dir > 0 ? \"right\" : \"left\";\n\t\t\treturn view.endOfTextblock(dirStr) ? cellPos : null;\n\t\t}\n\t}\n\treturn null;\n}\nfunction domInCell(view, dom) {\n\tfor (; dom && dom != view.dom; dom = dom.parentNode) if (dom.nodeName == \"TD\" || dom.nodeName == \"TH\") return dom;\n\treturn null;\n}\nfunction cellUnderMouse(view, event) {\n\tconst mousePos = view.posAtCoords({\n\t\tleft: event.clientX,\n\t\ttop: event.clientY\n\t});\n\tif (!mousePos) return null;\n\tlet { inside, pos } = mousePos;\n\treturn inside >= 0 && cellAround(view.state.doc.resolve(inside)) || cellAround(view.state.doc.resolve(pos));\n}\n\n//#endregion\n//#region src/tableview.ts\n/**\n* @public\n*/\nvar TableView = class {\n\tconstructor(node, defaultCellMinWidth) {\n\t\tthis.node = node;\n\t\tthis.defaultCellMinWidth = defaultCellMinWidth;\n\t\tthis.dom = document.createElement(\"div\");\n\t\tthis.dom.className = \"tableWrapper\";\n\t\tthis.table = this.dom.appendChild(document.createElement(\"table\"));\n\t\tthis.table.style.setProperty(\"--default-cell-min-width\", `${defaultCellMinWidth}px`);\n\t\tthis.colgroup = this.table.appendChild(document.createElement(\"colgroup\"));\n\t\tupdateColumnsOnResize(node, this.colgroup, this.table, defaultCellMinWidth);\n\t\tthis.contentDOM = this.table.appendChild(document.createElement(\"tbody\"));\n\t}\n\tupdate(node) {\n\t\tif (node.type != this.node.type) return false;\n\t\tthis.node = node;\n\t\tupdateColumnsOnResize(node, this.colgroup, this.table, this.defaultCellMinWidth);\n\t\treturn true;\n\t}\n\tignoreMutation(record) {\n\t\treturn record.type == \"attributes\" && (record.target == this.table || this.colgroup.contains(record.target));\n\t}\n};\n/**\n* @public\n*/\nfunction updateColumnsOnResize(node, colgroup, table, defaultCellMinWidth, overrideCol, overrideValue) {\n\tlet totalWidth = 0;\n\tlet fixedWidth = true;\n\tlet nextDOM = colgroup.firstChild;\n\tconst row = node.firstChild;\n\tif (!row) return;\n\tfor (let i = 0, col = 0; i < row.childCount; i++) {\n\t\tconst { colspan, colwidth } = row.child(i).attrs;\n\t\tfor (let j = 0; j < colspan; j++, col++) {\n\t\t\tconst hasWidth = overrideCol == col ? overrideValue : colwidth && colwidth[j];\n\t\t\tconst cssWidth = hasWidth ? hasWidth + \"px\" : \"\";\n\t\t\ttotalWidth += hasWidth || defaultCellMinWidth;\n\t\t\tif (!hasWidth) fixedWidth = false;\n\t\t\tif (!nextDOM) {\n\t\t\t\tconst col$1 = document.createElement(\"col\");\n\t\t\t\tcol$1.style.width = cssWidth;\n\t\t\t\tcolgroup.appendChild(col$1);\n\t\t\t} else {\n\t\t\t\tif (nextDOM.style.width != cssWidth) nextDOM.style.width = cssWidth;\n\t\t\t\tnextDOM = nextDOM.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\twhile (nextDOM) {\n\t\tvar _nextDOM$parentNode;\n\t\tconst after = nextDOM.nextSibling;\n\t\t(_nextDOM$parentNode = nextDOM.parentNode) === null || _nextDOM$parentNode === void 0 || _nextDOM$parentNode.removeChild(nextDOM);\n\t\tnextDOM = after;\n\t}\n\tif (fixedWidth) {\n\t\ttable.style.width = totalWidth + \"px\";\n\t\ttable.style.minWidth = \"\";\n\t} else {\n\t\ttable.style.width = \"\";\n\t\ttable.style.minWidth = totalWidth + \"px\";\n\t}\n}\n\n//#endregion\n//#region src/columnresizing.ts\n/**\n* @public\n*/\nconst columnResizingPluginKey = new PluginKey(\"tableColumnResizing\");\n/**\n* @public\n*/\nfunction columnResizing({ handleWidth = 5, cellMinWidth = 25, defaultCellMinWidth = 100, View = TableView, lastColumnResizable = true } = {}) {\n\tconst plugin = new Plugin({\n\t\tkey: columnResizingPluginKey,\n\t\tstate: {\n\t\t\tinit(_, state) {\n\t\t\t\tvar _plugin$spec;\n\t\t\t\tconst nodeViews = (_plugin$spec = plugin.spec) === null || _plugin$spec === void 0 || (_plugin$spec = _plugin$spec.props) === null || _plugin$spec === void 0 ? void 0 : _plugin$spec.nodeViews;\n\t\t\t\tconst tableName = tableNodeTypes(state.schema).table.name;\n\t\t\t\tif (View && nodeViews) nodeViews[tableName] = (node, view) => {\n\t\t\t\t\treturn new View(node, defaultCellMinWidth, view);\n\t\t\t\t};\n\t\t\t\treturn new ResizeState(-1, false);\n\t\t\t},\n\t\t\tapply(tr, prev) {\n\t\t\t\treturn prev.apply(tr);\n\t\t\t}\n\t\t},\n\t\tprops: {\n\t\t\tattributes: (state) => {\n\t\t\t\tconst pluginState = columnResizingPluginKey.getState(state);\n\t\t\t\treturn pluginState && pluginState.activeHandle > -1 ? { class: \"resize-cursor\" } : {};\n\t\t\t},\n\t\t\thandleDOMEvents: {\n\t\t\t\tmousemove: (view, event) => {\n\t\t\t\t\thandleMouseMove(view, event, handleWidth, lastColumnResizable);\n\t\t\t\t},\n\t\t\t\tmouseleave: (view) => {\n\t\t\t\t\thandleMouseLeave(view);\n\t\t\t\t},\n\t\t\t\tmousedown: (view, event) => {\n\t\t\t\t\thandleMouseDown(view, event, cellMinWidth, defaultCellMinWidth);\n\t\t\t\t}\n\t\t\t},\n\t\t\tdecorations: (state) => {\n\t\t\t\tconst pluginState = columnResizingPluginKey.getState(state);\n\t\t\t\tif (pluginState && pluginState.activeHandle > -1) return handleDecorations(state, pluginState.activeHandle);\n\t\t\t},\n\t\t\tnodeViews: {}\n\t\t}\n\t});\n\treturn plugin;\n}\n/**\n* @public\n*/\nvar ResizeState = class ResizeState {\n\tconstructor(activeHandle, dragging) {\n\t\tthis.activeHandle = activeHandle;\n\t\tthis.dragging = dragging;\n\t}\n\tapply(tr) {\n\t\tconst state = this;\n\t\tconst action = tr.getMeta(columnResizingPluginKey);\n\t\tif (action && action.setHandle != null) return new ResizeState(action.setHandle, false);\n\t\tif (action && action.setDragging !== void 0) return new ResizeState(state.activeHandle, action.setDragging);\n\t\tif (state.activeHandle > -1 && tr.docChanged) {\n\t\t\tlet handle = tr.mapping.map(state.activeHandle, -1);\n\t\t\tif (!pointsAtCell(tr.doc.resolve(handle))) handle = -1;\n\t\t\treturn new ResizeState(handle, state.dragging);\n\t\t}\n\t\treturn state;\n\t}\n};\nfunction handleMouseMove(view, event, handleWidth, lastColumnResizable) {\n\tif (!view.editable) return;\n\tconst pluginState = columnResizingPluginKey.getState(view.state);\n\tif (!pluginState) return;\n\tif (!pluginState.dragging) {\n\t\tconst target = domCellAround(event.target);\n\t\tlet cell = -1;\n\t\tif (target) {\n\t\t\tconst { left, right } = target.getBoundingClientRect();\n\t\t\tif (event.clientX - left <= handleWidth) cell = edgeCell(view, event, \"left\", handleWidth);\n\t\t\telse if (right - event.clientX <= handleWidth) cell = edgeCell(view, event, \"right\", handleWidth);\n\t\t}\n\t\tif (cell != pluginState.activeHandle) {\n\t\t\tif (!lastColumnResizable && cell !== -1) {\n\t\t\t\tconst $cell = view.state.doc.resolve(cell);\n\t\t\t\tconst table = $cell.node(-1);\n\t\t\t\tconst map = TableMap.get(table);\n\t\t\t\tconst tableStart = $cell.start(-1);\n\t\t\t\tif (map.colCount($cell.pos - tableStart) + $cell.nodeAfter.attrs.colspan - 1 == map.width - 1) return;\n\t\t\t}\n\t\t\tupdateHandle(view, cell);\n\t\t}\n\t}\n}\nfunction handleMouseLeave(view) {\n\tif (!view.editable) return;\n\tconst pluginState = columnResizingPluginKey.getState(view.state);\n\tif (pluginState && pluginState.activeHandle > -1 && !pluginState.dragging) updateHandle(view, -1);\n}\nfunction handleMouseDown(view, event, cellMinWidth, defaultCellMinWidth) {\n\tvar _view$dom$ownerDocume;\n\tif (!view.editable) return false;\n\tconst win = (_view$dom$ownerDocume = view.dom.ownerDocument.defaultView) !== null && _view$dom$ownerDocume !== void 0 ? _view$dom$ownerDocume : window;\n\tconst pluginState = columnResizingPluginKey.getState(view.state);\n\tif (!pluginState || pluginState.activeHandle == -1 || pluginState.dragging) return false;\n\tconst cell = view.state.doc.nodeAt(pluginState.activeHandle);\n\tconst width = currentColWidth(view, pluginState.activeHandle, cell.attrs);\n\tview.dispatch(view.state.tr.setMeta(columnResizingPluginKey, { setDragging: {\n\t\tstartX: event.clientX,\n\t\tstartWidth: width\n\t} }));\n\tfunction finish(event$1) {\n\t\twin.removeEventListener(\"mouseup\", finish);\n\t\twin.removeEventListener(\"mousemove\", move);\n\t\tconst pluginState$1 = columnResizingPluginKey.getState(view.state);\n\t\tif (pluginState$1 === null || pluginState$1 === void 0 ? void 0 : pluginState$1.dragging) {\n\t\t\tupdateColumnWidth(view, pluginState$1.activeHandle, draggedWidth(pluginState$1.dragging, event$1, cellMinWidth));\n\t\t\tview.dispatch(view.state.tr.setMeta(columnResizingPluginKey, { setDragging: null }));\n\t\t}\n\t}\n\tfunction move(event$1) {\n\t\tif (!event$1.which) return finish(event$1);\n\t\tconst pluginState$1 = columnResizingPluginKey.getState(view.state);\n\t\tif (!pluginState$1) return;\n\t\tif (pluginState$1.dragging) {\n\t\t\tconst dragged = draggedWidth(pluginState$1.dragging, event$1, cellMinWidth);\n\t\t\tdisplayColumnWidth(view, pluginState$1.activeHandle, dragged, defaultCellMinWidth);\n\t\t}\n\t}\n\tdisplayColumnWidth(view, pluginState.activeHandle, width, defaultCellMinWidth);\n\twin.addEventListener(\"mouseup\", finish);\n\twin.addEventListener(\"mousemove\", move);\n\tevent.preventDefault();\n\treturn true;\n}\nfunction currentColWidth(view, cellPos, { colspan, colwidth }) {\n\tconst width = colwidth && colwidth[colwidth.length - 1];\n\tif (width) return width;\n\tconst dom = view.domAtPos(cellPos);\n\tlet domWidth = dom.node.childNodes[dom.offset].offsetWidth, parts = colspan;\n\tif (colwidth) {\n\t\tfor (let i = 0; i < colspan; i++) if (colwidth[i]) {\n\t\t\tdomWidth -= colwidth[i];\n\t\t\tparts--;\n\t\t}\n\t}\n\treturn domWidth / parts;\n}\nfunction domCellAround(target) {\n\twhile (target && target.nodeName != \"TD\" && target.nodeName != \"TH\") target = target.classList && target.classList.contains(\"ProseMirror\") ? null : target.parentNode;\n\treturn target;\n}\nfunction edgeCell(view, event, side, handleWidth) {\n\tconst offset = side == \"right\" ? -handleWidth : handleWidth;\n\tconst found = view.posAtCoords({\n\t\tleft: event.clientX + offset,\n\t\ttop: event.clientY\n\t});\n\tif (!found) return -1;\n\tconst { pos } = found;\n\tconst $cell = cellAround(view.state.doc.resolve(pos));\n\tif (!$cell) return -1;\n\tif (side == \"right\") return $cell.pos;\n\tconst map = TableMap.get($cell.node(-1)), start = $cell.start(-1);\n\tconst index = map.map.indexOf($cell.pos - start);\n\treturn index % map.width == 0 ? -1 : start + map.map[index - 1];\n}\nfunction draggedWidth(dragging, event, resizeMinWidth) {\n\tconst offset = event.clientX - dragging.startX;\n\treturn Math.max(resizeMinWidth, dragging.startWidth + offset);\n}\nfunction updateHandle(view, value) {\n\tview.dispatch(view.state.tr.setMeta(columnResizingPluginKey, { setHandle: value }));\n}\nfunction updateColumnWidth(view, cell, width) {\n\tconst $cell = view.state.doc.resolve(cell);\n\tconst table = $cell.node(-1), map = TableMap.get(table), start = $cell.start(-1);\n\tconst col = map.colCount($cell.pos - start) + $cell.nodeAfter.attrs.colspan - 1;\n\tconst tr = view.state.tr;\n\tfor (let row = 0; row < map.height; row++) {\n\t\tconst mapIndex = row * map.width + col;\n\t\tif (row && map.map[mapIndex] == map.map[mapIndex - map.width]) continue;\n\t\tconst pos = map.map[mapIndex];\n\t\tconst attrs = table.nodeAt(pos).attrs;\n\t\tconst index = attrs.colspan == 1 ? 0 : col - map.colCount(pos);\n\t\tif (attrs.colwidth && attrs.colwidth[index] == width) continue;\n\t\tconst colwidth = attrs.colwidth ? attrs.colwidth.slice() : zeroes(attrs.colspan);\n\t\tcolwidth[index] = width;\n\t\ttr.setNodeMarkup(start + pos, null, {\n\t\t\t...attrs,\n\t\t\tcolwidth\n\t\t});\n\t}\n\tif (tr.docChanged) view.dispatch(tr);\n}\nfunction displayColumnWidth(view, cell, width, defaultCellMinWidth) {\n\tconst $cell = view.state.doc.resolve(cell);\n\tconst table = $cell.node(-1), start = $cell.start(-1);\n\tconst col = TableMap.get(table).colCount($cell.pos - start) + $cell.nodeAfter.attrs.colspan - 1;\n\tlet dom = view.domAtPos($cell.start(-1)).node;\n\twhile (dom && dom.nodeName != \"TABLE\") dom = dom.parentNode;\n\tif (!dom) return;\n\tupdateColumnsOnResize(table, dom.firstChild, dom, defaultCellMinWidth, col, width);\n}\nfunction zeroes(n) {\n\treturn Array(n).fill(0);\n}\nfunction handleDecorations(state, cell) {\n\tconst decorations = [];\n\tconst $cell = state.doc.resolve(cell);\n\tconst table = $cell.node(-1);\n\tif (!table) return DecorationSet.empty;\n\tconst map = TableMap.get(table);\n\tconst start = $cell.start(-1);\n\tconst col = map.colCount($cell.pos - start) + $cell.nodeAfter.attrs.colspan - 1;\n\tfor (let row = 0; row < map.height; row++) {\n\t\tconst index = col + row * map.width;\n\t\tif ((col == map.width - 1 || map.map[index] != map.map[index + 1]) && (row == 0 || map.map[index] != map.map[index - map.width])) {\n\t\t\tvar _columnResizingPlugin;\n\t\t\tconst cellPos = map.map[index];\n\t\t\tconst pos = start + cellPos + table.nodeAt(cellPos).nodeSize - 1;\n\t\t\tconst dom = document.createElement(\"div\");\n\t\t\tdom.className = \"column-resize-handle\";\n\t\t\tif ((_columnResizingPlugin = columnResizingPluginKey.getState(state)) === null || _columnResizingPlugin === void 0 ? void 0 : _columnResizingPlugin.dragging) decorations.push(Decoration.node(start + cellPos, start + cellPos + table.nodeAt(cellPos).nodeSize, { class: \"column-resize-dragging\" }));\n\t\t\tdecorations.push(Decoration.widget(pos, dom));\n\t\t}\n\t}\n\treturn DecorationSet.create(state.doc, decorations);\n}\n\n//#endregion\n//#region src/index.ts\n/**\n* Creates a [plugin](http://prosemirror.net/docs/ref/#state.Plugin)\n* that, when added to an editor, enables cell-selection, handles\n* cell-based copy/paste, and makes sure tables stay well-formed (each\n* row has the same width, and cells don't overlap).\n*\n* You should probably put this plugin near the end of your array of\n* plugins, since it handles mouse and arrow key events in tables\n* rather broadly, and other plugins, like the gap cursor or the\n* column-width dragging plugin, might want to get a turn first to\n* perform more specific behavior.\n*\n* @public\n*/\nfunction tableEditing({ allowTableNodeSelection = false } = {}) {\n\treturn new Plugin({\n\t\tkey: tableEditingKey,\n\t\tstate: {\n\t\t\tinit() {\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\tapply(tr, cur) {\n\t\t\t\tconst set = tr.getMeta(tableEditingKey);\n\t\t\t\tif (set != null) return set == -1 ? null : set;\n\t\t\t\tif (cur == null || !tr.docChanged) return cur;\n\t\t\t\tconst { deleted, pos } = tr.mapping.mapResult(cur);\n\t\t\t\treturn deleted ? null : pos;\n\t\t\t}\n\t\t},\n\t\tprops: {\n\t\t\tdecorations: drawCellSelection,\n\t\t\thandleDOMEvents: { mousedown: handleMouseDown$1 },\n\t\t\tcreateSelectionBetween(view) {\n\t\t\t\treturn tableEditingKey.getState(view.state) != null ? view.state.selection : null;\n\t\t\t},\n\t\t\thandleTripleClick,\n\t\t\thandleKeyDown,\n\t\t\thandlePaste\n\t\t},\n\t\tappendTransaction(_, oldState, state) {\n\t\t\treturn normalizeSelection(state, fixTables(state, oldState), allowTableNodeSelection);\n\t\t}\n\t});\n}\n\n//#endregion\nexport { CellBookmark, CellSelection, ResizeState, TableMap, TableView, clipCells as __clipCells, insertCells as __insertCells, pastedCells as __pastedCells, addColSpan, addColumn, addColumnAfter, addColumnBefore, addRow, addRowAfter, addRowBefore, cellAround, cellNear, colCount, columnIsHeader, columnResizing, columnResizingPluginKey, deleteCellSelection, deleteColumn, deleteRow, deleteTable, findCell, findCellPos, findCellRange, findTable, fixTables, fixTablesKey, goToNextCell, handlePaste, inSameTable, isInTable, mergeCells, moveCellForward, moveTableColumn, moveTableRow, nextCell, pointsAtCell, removeColSpan, removeColumn, removeRow, rowIsHeader, selectedRect, selectionCell, setCellAttr, splitCell, splitCellWithType, tableEditing, tableEditingKey, tableNodeTypes, tableNodes, toggleHeader, toggleHeaderCell, toggleHeaderColumn, toggleHeaderRow, updateColumnsOnResize };\n//# sourceMappingURL=index.js.map","import { Extension, Node, callOrReturn, findParentNodeClosestToPos, getExtensionField, mergeAttributes } from \"@tiptap/core\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport { CellSelection, addColumnAfter, addColumnBefore, addRowAfter, addRowBefore, columnResizing, deleteColumn, deleteRow, deleteTable, fixTables, goToNextCell, mergeCells, setCellAttr, splitCell, tableEditing, toggleHeader, toggleHeaderCell } from \"@tiptap/pm/tables\";\n//#region src/utils/parseAlign.ts\n/**\n* Normalize unknown input into a supported table alignment\n*\n* @param value - A potential alignment value\n* @returns A valid TableCellAlign value or null\n*/\nfunction normalizeTableCellAlign(value) {\n\tif (value === \"left\" || value === \"right\" || value === \"center\") return value;\n\treturn null;\n}\n/**\n* Parse table cell alignment from an HTML element\n*\n* Prefers inline style (${\"`\"}text-align${\"`\"}) and falls back to the legacy\n* ${\"`\"}align${\"`\"} attribute.\n*\n* @param element - The table cell/header DOM element\n* @returns A valid TableCellAlign value or null\n*/\nfunction parseAlign(element) {\n\tconst styleAlign = (element.style.textAlign || \"\").trim().toLowerCase();\n\tconst attrAlign = (element.getAttribute(\"align\") || \"\").trim().toLowerCase();\n\treturn normalizeTableCellAlign(styleAlign || attrAlign);\n}\n/**\n* Normalize alignment from a generic attrs object that may include an align field\n*\n* @param attributes - A node attrs-like object with an optional align field\n* @returns A valid TableCellAlign value or null.\n*/\nfunction normalizeTableCellAlignFromAttributes(attributes) {\n\treturn normalizeTableCellAlign(attributes === null || attributes === void 0 ? void 0 : attributes.align);\n}\n/**\n* Create a reusable Tiptap attribute config for table alignment\n*\n* @returns A Tiptap Attribute definition that parses and renders table alignment\n*/\nfunction createAlignAttribute() {\n\treturn {\n\t\tdefault: null,\n\t\tparseHTML: (element) => parseAlign(element),\n\t\trenderHTML: (attributes) => {\n\t\t\tif (!attributes.align) return {};\n\t\t\treturn { style: `text-align: ${attributes.align}` };\n\t\t}\n\t};\n}\n//#endregion\n//#region src/utils/parseColwidth.ts\n/**\n* reads the width of the `<col>` element matching a cell's column from the table's `<colgroup>`\n*\n* @param element - The table cell/header DOM element\n* @returns - An array with the column width in pixels or null\n*/\nfunction parseColgroupWidth(element) {\n\tvar _table$querySelectorA;\n\tconst row = element.parentElement;\n\tconst table = element.closest(\"table\");\n\tif (!row || !table) return null;\n\tconst cellIndex = Array.from(row.children).indexOf(element);\n\tconst width = (_table$querySelectorA = table.querySelectorAll(\"colgroup > col\")[cellIndex]) === null || _table$querySelectorA === void 0 ? void 0 : _table$querySelectorA.getAttribute(\"width\");\n\treturn width ? [parseInt(width, 10)] : null;\n}\n/**\n* Parse the column width/s of a table cell/header from an HTML element.\n* it prefers the `colwidth` attribute and if not-provided falls back to the `width` attribute\n* of the matching `<col>` element in the table's `<colgroup>`.\n*\n* @param element - The table cell/header DOM element\n* @returns - An array of column widths in pixels or null\n*/\nfunction parseColwidth(element) {\n\tconst colwidth = element.getAttribute(\"colwidth\");\n\tif (colwidth) return colwidth.split(\",\").map((width) => parseInt(width, 10));\n\treturn parseColgroupWidth(element);\n}\n//#endregion\n//#region src/utils/fillEmptyCellContent.ts\nconst COLLAPSIBLE_WHITESPACE = /[ \\t\\r\\n\\f]+/g;\n/** Whether a cell/header element has no child elements and only collapsible whitespace. */\nfunction isEmptyCellElement(element) {\n\tvar _element$textContent;\n\tif (element.children.length > 0) return false;\n\treturn ((_element$textContent = element.textContent) !== null && _element$textContent !== void 0 ? _element$textContent : \"\").replace(COLLAPSIBLE_WHITESPACE, \"\") === \"\";\n}\n/** Builds a cell/header's minimal `block+` content, derived from the node type. */\nfunction fillEmptyCellContent(cellType) {\n\tconst filled = cellType.createAndFill();\n\tif (!filled) throw new Error(`[tiptap error]: \"${cellType.name}\" has no default content to backfill.`);\n\treturn filled.content;\n}\n//#endregion\n//#region src/cell/table-cell.ts\n/**\n* This extension allows you to create table cells.\n* @see https://www.tiptap.dev/api/nodes/table-cell\n*/\nconst TableCell = Node.create({\n\tname: \"tableCell\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tcontent: \"block+\",\n\taddAttributes() {\n\t\treturn {\n\t\t\tcolspan: { default: 1 },\n\t\t\trowspan: { default: 1 },\n\t\t\tcolwidth: {\n\t\t\t\tdefault: null,\n\t\t\t\tparseHTML: parseColwidth\n\t\t\t},\n\t\t\talign: createAlignAttribute()\n\t\t};\n\t},\n\ttableRole: \"cell\",\n\tisolating: true,\n\tparseHTML() {\n\t\treturn [{\n\t\t\ttag: \"td\",\n\t\t\tgetAttrs: (node) => isEmptyCellElement(node) ? {} : false,\n\t\t\tgetContent: (_node, schema) => fillEmptyCellContent(schema.nodes[this.name])\n\t\t}, { tag: \"td\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"td\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t}\n});\n//#endregion\n//#region src/header/table-header.ts\n/**\n* This extension allows you to create table headers.\n* @see https://www.tiptap.dev/api/nodes/table-header\n*/\nconst TableHeader = Node.create({\n\tname: \"tableHeader\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tcontent: \"block+\",\n\taddAttributes() {\n\t\treturn {\n\t\t\tcolspan: { default: 1 },\n\t\t\trowspan: { default: 1 },\n\t\t\tcolwidth: {\n\t\t\t\tdefault: null,\n\t\t\t\tparseHTML: parseColwidth\n\t\t\t},\n\t\t\talign: createAlignAttribute()\n\t\t};\n\t},\n\ttableRole: \"header_cell\",\n\tisolating: true,\n\tparseHTML() {\n\t\treturn [{\n\t\t\ttag: \"th\",\n\t\t\tgetAttrs: (node) => isEmptyCellElement(node) ? {} : false,\n\t\t\tgetContent: (_node, schema) => fillEmptyCellContent(schema.nodes[this.name])\n\t\t}, { tag: \"th\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"th\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t}\n});\n//#endregion\n//#region src/row/table-row.ts\n/**\n* This extension allows you to create table rows.\n* @see https://www.tiptap.dev/api/nodes/table-row\n*/\nconst TableRow = Node.create({\n\tname: \"tableRow\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tcontent: \"(tableCell | tableHeader)*\",\n\ttableRole: \"row\",\n\tparseHTML() {\n\t\treturn [{ tag: \"tr\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"tr\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t}\n});\n//#endregion\n//#region src/table/utilities/colStyle.ts\nfunction getColStyleDeclaration(minWidth, width) {\n\tif (width) return [\"width\", `${Math.max(width, minWidth)}px`];\n\treturn [\"min-width\", `${minWidth}px`];\n}\n//#endregion\n//#region src/table/TableView.ts\nfunction updateColumns(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) {\n\tlet totalWidth = 0;\n\tlet fixedWidth = true;\n\tlet nextDOM = colgroup.firstChild;\n\tconst row = node.firstChild;\n\tif (row !== null) for (let i = 0, col = 0; i < row.childCount; i += 1) {\n\t\tconst { colspan, colwidth } = row.child(i).attrs;\n\t\tfor (let j = 0; j < colspan; j += 1, col += 1) {\n\t\t\tconst hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j];\n\t\t\tconst cssWidth = hasWidth ? `${hasWidth}px` : \"\";\n\t\t\ttotalWidth += hasWidth || cellMinWidth;\n\t\t\tif (!hasWidth) fixedWidth = false;\n\t\t\tif (!nextDOM) {\n\t\t\t\tconst colElement = document.createElement(\"col\");\n\t\t\t\tconst [propertyKey, propertyValue] = getColStyleDeclaration(cellMinWidth, hasWidth);\n\t\t\t\tcolElement.style.setProperty(propertyKey, propertyValue);\n\t\t\t\tcolgroup.appendChild(colElement);\n\t\t\t} else {\n\t\t\t\tif (nextDOM.style.width !== cssWidth) {\n\t\t\t\t\tconst [propertyKey, propertyValue] = getColStyleDeclaration(cellMinWidth, hasWidth);\n\t\t\t\t\tnextDOM.style.setProperty(propertyKey, propertyValue);\n\t\t\t\t}\n\t\t\t\tnextDOM = nextDOM.nextSibling;\n\t\t\t}\n\t\t}\n\t}\n\twhile (nextDOM) {\n\t\tvar _nextDOM$parentNode;\n\t\tconst after = nextDOM.nextSibling;\n\t\t(_nextDOM$parentNode = nextDOM.parentNode) === null || _nextDOM$parentNode === void 0 || _nextDOM$parentNode.removeChild(nextDOM);\n\t\tnextDOM = after;\n\t}\n\tconst hasUserWidth = node.attrs.style && typeof node.attrs.style === \"string\" && /\\bwidth\\s*:/i.test(node.attrs.style);\n\tif (fixedWidth && !hasUserWidth) {\n\t\ttable.style.width = `${totalWidth}px`;\n\t\ttable.style.minWidth = \"\";\n\t} else {\n\t\ttable.style.width = \"\";\n\t\ttable.style.minWidth = `${totalWidth}px`;\n\t}\n}\nvar TableView = class {\n\tconstructor(node, cellMinWidth, _view, HTMLAttributes = {}) {\n\t\tthis.node = node;\n\t\tthis.cellMinWidth = cellMinWidth;\n\t\tthis.dom = document.createElement(\"div\");\n\t\tthis.dom.className = \"tableWrapper\";\n\t\tthis.table = this.dom.appendChild(document.createElement(\"table\"));\n\t\tfor (const [key, value] of Object.entries(HTMLAttributes)) if (value !== void 0 && value !== null) {\n\t\t\tif (key === \"style\") this.table.style.cssText = String(value);\n\t\t\telse this.table.setAttribute(key, String(value));\n\t\t}\n\t\tif (node.attrs.style) this.table.style.cssText = node.attrs.style;\n\t\tthis.colgroup = this.table.appendChild(document.createElement(\"colgroup\"));\n\t\tupdateColumns(node, this.colgroup, this.table, cellMinWidth);\n\t\tthis.contentDOM = this.table.appendChild(document.createElement(\"tbody\"));\n\t}\n\tupdate(node) {\n\t\tif (node.type !== this.node.type) return false;\n\t\tthis.node = node;\n\t\tupdateColumns(node, this.colgroup, this.table, this.cellMinWidth);\n\t\treturn true;\n\t}\n\tignoreMutation(mutation) {\n\t\tconst target = mutation.target;\n\t\tconst isInsideWrapper = this.dom.contains(target);\n\t\tconst isInsideContent = this.contentDOM.contains(target);\n\t\tif (isInsideWrapper && !isInsideContent) {\n\t\t\tif (mutation.type === \"attributes\" || mutation.type === \"childList\" || mutation.type === \"characterData\") return true;\n\t\t}\n\t\treturn false;\n\t}\n};\n//#endregion\n//#region src/table/utilities/createColGroup.ts\nfunction createColGroup(node, cellMinWidth, overrideCol, overrideValue) {\n\tlet totalWidth = 0;\n\tlet fixedWidth = true;\n\tconst cols = [];\n\tconst row = node.firstChild;\n\tif (!row) return {};\n\tfor (let i = 0, col = 0; i < row.childCount; i += 1) {\n\t\tconst { colspan, colwidth } = row.child(i).attrs;\n\t\tfor (let j = 0; j < colspan; j += 1, col += 1) {\n\t\t\tconst hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j];\n\t\t\ttotalWidth += hasWidth || cellMinWidth;\n\t\t\tif (!hasWidth) fixedWidth = false;\n\t\t\tconst [property, value] = getColStyleDeclaration(cellMinWidth, hasWidth);\n\t\t\tcols.push([\"col\", { style: `${property}: ${value}` }]);\n\t\t}\n\t}\n\tconst tableWidth = fixedWidth ? `${totalWidth}px` : \"\";\n\tconst tableMinWidth = fixedWidth ? \"\" : `${totalWidth}px`;\n\treturn {\n\t\tcolgroup: [\n\t\t\t\"colgroup\",\n\t\t\t{},\n\t\t\t...cols\n\t\t],\n\t\ttableWidth,\n\t\ttableMinWidth\n\t};\n}\n//#endregion\n//#region src/table/utilities/createCell.ts\nfunction createCell(cellType, cellContent) {\n\tif (cellContent) return cellType.createChecked(null, cellContent);\n\treturn cellType.createAndFill();\n}\n//#endregion\n//#region src/table/utilities/getTableNodeTypes.ts\nfunction getTableNodeTypes(schema) {\n\tif (schema.cached.tableNodeTypes) return schema.cached.tableNodeTypes;\n\tconst roles = {};\n\tObject.keys(schema.nodes).forEach((type) => {\n\t\tconst nodeType = schema.nodes[type];\n\t\tif (nodeType.spec.tableRole) roles[nodeType.spec.tableRole] = nodeType;\n\t});\n\tschema.cached.tableNodeTypes = roles;\n\treturn roles;\n}\n//#endregion\n//#region src/table/utilities/createTable.ts\nfunction createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {\n\tconst types = getTableNodeTypes(schema);\n\tconst headerCells = [];\n\tconst cells = [];\n\tfor (let index = 0; index < colsCount; index += 1) {\n\t\tconst cell = createCell(types.cell, cellContent);\n\t\tif (cell) cells.push(cell);\n\t\tif (withHeaderRow) {\n\t\t\tconst headerCell = createCell(types.header_cell, cellContent);\n\t\t\tif (headerCell) headerCells.push(headerCell);\n\t\t}\n\t}\n\tconst rows = [];\n\tfor (let index = 0; index < rowsCount; index += 1) rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));\n\treturn types.table.createChecked(null, rows);\n}\n//#endregion\n//#region src/table/utilities/isCellSelection.ts\nfunction isCellSelection(value) {\n\treturn value instanceof CellSelection;\n}\n//#endregion\n//#region src/table/utilities/deleteTableWhenAllCellsSelected.ts\nconst deleteTableWhenAllCellsSelected = ({ editor }) => {\n\tconst { selection } = editor.state;\n\tif (!isCellSelection(selection)) return false;\n\tlet cellCount = 0;\n\tconst table = findParentNodeClosestToPos(selection.ranges[0].$from, (node) => {\n\t\treturn node.type.name === \"table\";\n\t});\n\ttable === null || table === void 0 || table.node.descendants((node) => {\n\t\tif (node.type.name === \"table\") return false;\n\t\tif ([\"tableCell\", \"tableHeader\"].includes(node.type.name)) cellCount += 1;\n\t});\n\tif (!(cellCount === selection.ranges.length)) return false;\n\teditor.commands.deleteTable();\n\treturn true;\n};\n//#endregion\n//#region src/table/utilities/keepCursorInTable.ts\nfunction keepCursorInTable(tr, tablePos) {\n\tconst mappedTablePos = tr.mapping.map(tablePos);\n\tconst stillInTable = findParentNodeClosestToPos(tr.selection.$from, (node) => node.type.name === \"table\");\n\tif ((stillInTable === null || stillInTable === void 0 ? void 0 : stillInTable.pos) === mappedTablePos) return;\n\tconst tableNode = tr.doc.nodeAt(mappedTablePos);\n\tif (!tableNode) return;\n\tconst endOfTable = mappedTablePos + tableNode.nodeSize - 1;\n\ttr.setSelection(TextSelection.near(tr.doc.resolve(endOfTable), -1));\n}\n//#endregion\n//#region src/table/utilities/markdown.ts\nconst DEFAULT_CELL_LINE_SEPARATOR = \"\u001f\";\n/**\n* Walk a single table-row line and escape any `|` characters that appear\n* inside backtick code spans so marked's cell splitter ignores them.\n* Backslash escape sequences outside code spans are passed through untouched.\n* If a backtick run has no matching closer on the same line it is emitted\n* as-is — no over-escaping for malformed input.\n*/\nfunction escapeTableCellPipes(line) {\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tif (line[i] === \"\\\\\" && i + 1 < line.length) {\n\t\t\tresult += line[i] + line[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (line[i] !== \"`\") {\n\t\t\tresult += line[i++];\n\t\t\tcontinue;\n\t\t}\n\t\tlet runLen = 0;\n\t\twhile (i + runLen < line.length && line[i + runLen] === \"`\") runLen += 1;\n\t\tlet j = i + runLen;\n\t\tlet found = false;\n\t\twhile (j < line.length) {\n\t\t\tif (line[j] !== \"`\") {\n\t\t\t\tj += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet closeLen = 0;\n\t\t\twhile (j + closeLen < line.length && line[j + closeLen] === \"`\") closeLen += 1;\n\t\t\tif (closeLen === runLen) {\n\t\t\t\tconst spanContent = line.slice(i + runLen, j);\n\t\t\t\tresult += line.slice(i, i + runLen) + spanContent.replace(/\\\\\\||\\|/g, (match) => match === \"|\" ? \"\\\\|\" : match) + line.slice(j, j + runLen);\n\t\t\t\ti = j + runLen;\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tj += closeLen;\n\t\t}\n\t\tif (!found) {\n\t\t\tresult += line.slice(i, i + runLen);\n\t\t\ti += runLen;\n\t\t}\n\t}\n\treturn result;\n}\n/**\n* Escape pipe characters inside backtick code spans on table-row lines.\n* marked's `splitCells` only recognises backslash-escaped pipes (`\\|`) and\n* splits on every other `|`, so \\`a || b\\` in a table cell would be treated\n* as multiple column delimiters. Escaping them here lets `splitCells` skip\n* them; it already converts `\\|` → `|` after splitting, so the cell content\n* is restored correctly.\n*/\nfunction preprocessTablePipes(src) {\n\treturn src.split(\"\\n\").map((line) => {\n\t\tif (!line.includes(\"|\") || !line.includes(\"`\")) return line;\n\t\treturn escapeTableCellPipes(line);\n\t}).join(\"\\n\");\n}\nfunction collapseWhitespace(s) {\n\treturn (s || \"\").replace(/\\s+/g, \" \").trim();\n}\nfunction renderTableToMarkdown(node, h, options = {}) {\n\tvar _options$cellLineSepa;\n\tconst cellSep = (_options$cellLineSepa = options.cellLineSeparator) !== null && _options$cellLineSepa !== void 0 ? _options$cellLineSepa : \"\u001f\";\n\tif (!node || !node.content || node.content.length === 0) return \"\";\n\tconst rows = [];\n\tnode.content.forEach((rowNode) => {\n\t\tconst cells = [];\n\t\tif (rowNode.content) rowNode.content.forEach((cellNode) => {\n\t\t\tlet raw = \"\";\n\t\t\tif (cellNode.content && Array.isArray(cellNode.content) && cellNode.content.length > 1) raw = cellNode.content.map((child) => h.renderChildren(child)).join(cellSep);\n\t\t\telse raw = cellNode.content ? h.renderChildren(cellNode.content) : \"\";\n\t\t\tconst text = collapseWhitespace(raw.split(cellSep).join(\"\\n\").replace(/[ \\t]*\\r?\\n[ \\t]*/g, \"<br>\"));\n\t\t\tconst isHeader = cellNode.type === \"tableHeader\";\n\t\t\tconst align = normalizeTableCellAlignFromAttributes(cellNode.attrs);\n\t\t\tcells.push({\n\t\t\t\ttext,\n\t\t\t\tisHeader,\n\t\t\t\talign\n\t\t\t});\n\t\t});\n\t\trows.push(cells);\n\t});\n\tconst columnCount = rows.reduce((max, r) => Math.max(max, r.length), 0);\n\tif (columnCount === 0) return \"\";\n\tconst colWidths = Array.from({ length: columnCount }).fill(0);\n\trows.forEach((r) => {\n\t\tfor (let i = 0; i < columnCount; i += 1) {\n\t\t\tvar _r$i;\n\t\t\tconst len = (((_r$i = r[i]) === null || _r$i === void 0 ? void 0 : _r$i.text) || \"\").length;\n\t\t\tif (len > colWidths[i]) colWidths[i] = len;\n\t\t\tif (colWidths[i] < 3) colWidths[i] = 3;\n\t\t}\n\t});\n\tconst pad = (s, width) => s + \" \".repeat(Math.max(0, width - s.length));\n\tconst headerRow = rows[0];\n\tconst hasHeader = headerRow.some((c) => c.isHeader);\n\tconst colAlignments = Array.from({ length: columnCount }).fill(null);\n\trows.forEach((r) => {\n\t\tfor (let i = 0; i < columnCount; i += 1) {\n\t\t\tvar _r$i2;\n\t\t\tif (!colAlignments[i] && ((_r$i2 = r[i]) === null || _r$i2 === void 0 ? void 0 : _r$i2.align)) colAlignments[i] = r[i].align;\n\t\t}\n\t});\n\tlet out = \"\\n\";\n\tconst headerTexts = Array.from({ length: columnCount }).map((_, i) => hasHeader ? headerRow[i] && headerRow[i].text || \"\" : \"\");\n\tout += `| ${headerTexts.map((t, i) => pad(t, colWidths[i])).join(\" | \")} |\\n`;\n\tout += `| ${colWidths.map((w, index) => {\n\t\tconst dashCount = Math.max(3, w);\n\t\tconst alignment = colAlignments[index];\n\t\tif (alignment === \"left\") return `:${\"-\".repeat(dashCount)}`;\n\t\tif (alignment === \"right\") return `${\"-\".repeat(dashCount)}:`;\n\t\tif (alignment === \"center\") return `:${\"-\".repeat(dashCount)}:`;\n\t\treturn \"-\".repeat(dashCount);\n\t}).join(\" | \")} |\\n`;\n\t(hasHeader ? rows.slice(1) : rows).forEach((r) => {\n\t\tout += `| ${Array.from({ length: columnCount }).fill(0).map((_, i) => pad(r[i] && r[i].text || \"\", colWidths[i])).join(\" | \")} |\\n`;\n\t});\n\treturn out;\n}\n//#endregion\n//#region src/table/table.ts\n/**\n* This extension allows you to create tables.\n* @see https://www.tiptap.dev/api/nodes/table\n*/\nconst Table = Node.create({\n\tname: \"table\",\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t\tresizable: false,\n\t\t\trenderWrapper: false,\n\t\t\thandleWidth: 5,\n\t\t\tcellMinWidth: 25,\n\t\t\tView: TableView,\n\t\t\tlastColumnResizable: true,\n\t\t\tallowTableNodeSelection: false\n\t\t};\n\t},\n\tcontent: \"tableRow+\",\n\ttableRole: \"table\",\n\tisolating: true,\n\tgroup: \"block\",\n\tparseHTML() {\n\t\treturn [{ tag: \"table\" }];\n\t},\n\trenderHTML({ node, HTMLAttributes }) {\n\t\tconst { colgroup, tableWidth, tableMinWidth } = createColGroup(node, this.options.cellMinWidth);\n\t\tconst userStyles = HTMLAttributes.style;\n\t\tfunction getTableStyle() {\n\t\t\tif (userStyles) return userStyles;\n\t\t\treturn tableWidth ? `width: ${tableWidth}` : `min-width: ${tableMinWidth}`;\n\t\t}\n\t\tconst table = [\n\t\t\t\"table\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { style: getTableStyle() }),\n\t\t\tcolgroup,\n\t\t\t[\"tbody\", 0]\n\t\t];\n\t\treturn this.options.renderWrapper ? [\n\t\t\t\"div\",\n\t\t\t{ class: \"tableWrapper\" },\n\t\t\ttable\n\t\t] : table;\n\t},\n\tparseMarkdown: (token, h) => {\n\t\tconst rows = [];\n\t\tconst alignments = Array.isArray(token.align) ? token.align : [];\n\t\tif (token.header) {\n\t\t\tconst headerCells = [];\n\t\t\ttoken.header.forEach((cell, index) => {\n\t\t\t\tvar _alignments$index;\n\t\t\t\tconst align = normalizeTableCellAlign((_alignments$index = alignments[index]) !== null && _alignments$index !== void 0 ? _alignments$index : cell.align);\n\t\t\t\tconst attrs = align ? { align } : {};\n\t\t\t\theaderCells.push(h.createNode(\"tableHeader\", attrs, [{\n\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\tcontent: h.parseInline(cell.tokens)\n\t\t\t\t}]));\n\t\t\t});\n\t\t\trows.push(h.createNode(\"tableRow\", {}, headerCells));\n\t\t}\n\t\tif (token.rows) token.rows.forEach((row) => {\n\t\t\tconst bodyCells = [];\n\t\t\trow.forEach((cell, index) => {\n\t\t\t\tvar _alignments$index2;\n\t\t\t\tconst align = normalizeTableCellAlign((_alignments$index2 = alignments[index]) !== null && _alignments$index2 !== void 0 ? _alignments$index2 : cell.align);\n\t\t\t\tconst attrs = align ? { align } : {};\n\t\t\t\tbodyCells.push(h.createNode(\"tableCell\", attrs, [{\n\t\t\t\t\ttype: \"paragraph\",\n\t\t\t\t\tcontent: h.parseInline(cell.tokens)\n\t\t\t\t}]));\n\t\t\t});\n\t\t\trows.push(h.createNode(\"tableRow\", {}, bodyCells));\n\t\t});\n\t\treturn h.createNode(\"table\", void 0, rows);\n\t},\n\trenderMarkdown: (node, h) => {\n\t\treturn renderTableToMarkdown(node, h);\n\t},\n\tmarkdownTokenizer: {\n\t\tname: \"table\",\n\t\tlevel: \"block\",\n\t\tstart: (src) => {\n\t\t\tconst lines = src.split(\"\\n\");\n\t\t\tif (lines.length < 2) return -1;\n\t\t\tconst sep = lines[1];\n\t\t\tif (!/^[ \\t|:]*-[ \\t|:-]*$/.test(sep) || !sep.includes(\"|\")) return -1;\n\t\t\treturn lines[0].includes(\"|\") ? 0 : -1;\n\t\t},\n\t\ttokenize(src, _tokens, helper) {\n\t\t\tconst blankLineIndex = src.indexOf(\"\\n\\n\");\n\t\t\tconst candidate = blankLineIndex >= 0 ? src.slice(0, blankLineIndex) : src;\n\t\t\tconst candidateLines = candidate.split(\"\\n\");\n\t\t\tif (candidateLines.length < 2) return void 0;\n\t\t\tconst sep = candidateLines[1];\n\t\t\tif (!/^[ \\t|:]*-[ \\t|:-]*$/.test(sep) || !sep.includes(\"|\")) return void 0;\n\t\t\tconst preprocessed = preprocessTablePipes(candidate);\n\t\t\tif (preprocessed === candidate) return void 0;\n\t\t\tconst tableToken = helper.blockTokens(preprocessed)[0];\n\t\t\tif ((tableToken === null || tableToken === void 0 ? void 0 : tableToken.type) !== \"table\" || !tableToken.raw) return void 0;\n\t\t\tconst lineCount = tableToken.raw.split(\"\\n\").length;\n\t\t\tconst raw = src.split(\"\\n\").slice(0, lineCount).join(\"\\n\");\n\t\t\treturn {\n\t\t\t\t...tableToken,\n\t\t\t\traw\n\t\t\t};\n\t\t}\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tinsertTable: ({ rows = 3, cols = 3, withHeaderRow = true } = {}) => ({ tr, dispatch, editor }) => {\n\t\t\t\tconst node = createTable(editor.schema, rows, cols, withHeaderRow);\n\t\t\t\tif (dispatch) {\n\t\t\t\t\tconst offset = tr.selection.from + 1;\n\t\t\t\t\ttr.replaceSelectionWith(node).scrollIntoView().setSelection(TextSelection.near(tr.doc.resolve(offset)));\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\taddColumnBefore: () => ({ state, dispatch }) => {\n\t\t\t\treturn addColumnBefore(state, dispatch);\n\t\t\t},\n\t\t\taddColumnAfter: () => ({ state, dispatch }) => {\n\t\t\t\treturn addColumnAfter(state, dispatch);\n\t\t\t},\n\t\t\tdeleteColumn: () => ({ state, dispatch }) => {\n\t\t\t\tconst table = findParentNodeClosestToPos(state.selection.$from, (node) => node.type.name === \"table\");\n\t\t\t\treturn deleteColumn(state, dispatch && ((tr) => {\n\t\t\t\t\tif (table) keepCursorInTable(tr, table.pos);\n\t\t\t\t\tdispatch(tr);\n\t\t\t\t}));\n\t\t\t},\n\t\t\taddRowBefore: () => ({ state, dispatch }) => {\n\t\t\t\treturn addRowBefore(state, dispatch);\n\t\t\t},\n\t\t\taddRowAfter: () => ({ state, dispatch }) => {\n\t\t\t\treturn addRowAfter(state, dispatch);\n\t\t\t},\n\t\t\tdeleteRow: () => ({ state, dispatch }) => {\n\t\t\t\tconst table = findParentNodeClosestToPos(state.selection.$from, (node) => node.type.name === \"table\");\n\t\t\t\treturn deleteRow(state, dispatch && ((tr) => {\n\t\t\t\t\tif (table) keepCursorInTable(tr, table.pos);\n\t\t\t\t\tdispatch(tr);\n\t\t\t\t}));\n\t\t\t},\n\t\t\tdeleteTable: () => ({ state, dispatch }) => {\n\t\t\t\treturn deleteTable(state, dispatch);\n\t\t\t},\n\t\t\tmergeCells: () => ({ state, dispatch }) => {\n\t\t\t\treturn mergeCells(state, dispatch);\n\t\t\t},\n\t\t\tsplitCell: () => ({ state, dispatch }) => {\n\t\t\t\treturn splitCell(state, dispatch);\n\t\t\t},\n\t\t\ttoggleHeaderColumn: () => ({ state, dispatch }) => {\n\t\t\t\treturn toggleHeader(\"column\")(state, dispatch);\n\t\t\t},\n\t\t\ttoggleHeaderRow: () => ({ state, dispatch }) => {\n\t\t\t\treturn toggleHeader(\"row\")(state, dispatch);\n\t\t\t},\n\t\t\ttoggleHeaderCell: () => ({ state, dispatch }) => {\n\t\t\t\treturn toggleHeaderCell(state, dispatch);\n\t\t\t},\n\t\t\tmergeOrSplit: () => ({ state, dispatch }) => {\n\t\t\t\tif (mergeCells(state, dispatch)) return true;\n\t\t\t\treturn splitCell(state, dispatch);\n\t\t\t},\n\t\t\tsetCellAttribute: (name, value) => ({ state, dispatch }) => {\n\t\t\t\treturn setCellAttr(name, value)(state, dispatch);\n\t\t\t},\n\t\t\tgoToNextCell: () => ({ state, dispatch }) => {\n\t\t\t\treturn goToNextCell(1)(state, dispatch);\n\t\t\t},\n\t\t\tgoToPreviousCell: () => ({ state, dispatch }) => {\n\t\t\t\treturn goToNextCell(-1)(state, dispatch);\n\t\t\t},\n\t\t\tfixTables: () => ({ state, dispatch }) => {\n\t\t\t\tif (dispatch) fixTables(state);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tsetCellSelection: (position) => ({ tr, dispatch }) => {\n\t\t\t\tif (dispatch) {\n\t\t\t\t\tconst selection = CellSelection.create(tr.doc, position.anchorCell, position.headCell);\n\t\t\t\t\ttr.setSelection(selection);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\tTab: () => {\n\t\t\t\tif (this.editor.commands.goToNextCell()) return true;\n\t\t\t\tif (!this.editor.can().addRowAfter()) return false;\n\t\t\t\treturn this.editor.chain().addRowAfter().goToNextCell().run();\n\t\t\t},\n\t\t\t\"Shift-Tab\": () => this.editor.commands.goToPreviousCell(),\n\t\t\tBackspace: deleteTableWhenAllCellsSelected,\n\t\t\t\"Mod-Backspace\": deleteTableWhenAllCellsSelected,\n\t\t\tDelete: deleteTableWhenAllCellsSelected,\n\t\t\t\"Mod-Delete\": deleteTableWhenAllCellsSelected\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [...this.options.resizable && this.editor.isEditable ? [columnResizing({\n\t\t\thandleWidth: this.options.handleWidth,\n\t\t\tcellMinWidth: this.options.cellMinWidth,\n\t\t\tdefaultCellMinWidth: this.options.cellMinWidth,\n\t\t\tView: this.options.View,\n\t\t\tlastColumnResizable: this.options.lastColumnResizable\n\t\t})] : [], tableEditing({ allowTableNodeSelection: this.options.allowTableNodeSelection })];\n\t},\n\taddNodeView() {\n\t\tconst isResizable = this.options.resizable && this.editor.isEditable;\n\t\tconst View = this.options.View;\n\t\tif (isResizable || !View) return null;\n\t\treturn ({ node, view, HTMLAttributes }) => {\n\t\t\tconst mergedAttributes = mergeAttributes(this.options.HTMLAttributes, HTMLAttributes);\n\t\t\treturn new View(node, this.options.cellMinWidth, view, mergedAttributes);\n\t\t};\n\t},\n\textendNodeSchema(extension) {\n\t\tconst context = {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage\n\t\t};\n\t\treturn { tableRole: callOrReturn(getExtensionField(extension, \"tableRole\", context)) };\n\t}\n});\n//#endregion\n//#region src/kit/index.ts\n/**\n* The table kit is a collection of table editor extensions.\n*\n* It’s a good starting point for building your own table in Tiptap.\n*/\nconst TableKit = Extension.create({\n\tname: \"tableKit\",\n\taddExtensions() {\n\t\tconst extensions = [];\n\t\tif (this.options.table !== false) extensions.push(Table.configure(this.options.table));\n\t\tif (this.options.tableCell !== false) extensions.push(TableCell.configure(this.options.tableCell));\n\t\tif (this.options.tableHeader !== false) extensions.push(TableHeader.configure(this.options.tableHeader));\n\t\tif (this.options.tableRow !== false) extensions.push(TableRow.configure(this.options.tableRow));\n\t\treturn extensions;\n\t}\n});\n//#endregion\nexport { DEFAULT_CELL_LINE_SEPARATOR, Table, TableCell, TableHeader, TableKit, TableRow, TableView, createColGroup, createTable, escapeTableCellPipes, preprocessTablePipes, renderTableToMarkdown, updateColumns };\n\n//# sourceMappingURL=index.js.map","/**\n * marked v17.0.6 - a markdown parser\n * Copyright (c) 2018-2026, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction M(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var O=M();function G(u){O=u}var _={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var be=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\"),blockquoteBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}>`)},Re=/^(?:[ \\t]*(?:\\n|$))+/,Oe=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Te=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,C=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,we=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,Q=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,ie=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),ye=k(se).replace(/bull/g,Q).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),j=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,Pe=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Se=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),$e=k(/^(bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,Q).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",U=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,_e=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",U).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),oe=k(j).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),Le=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",oe).getRegex(),K={blockquote:Le,code:Oe,def:Se,fences:Te,heading:we,hr:C,html:_e,lheading:ie,list:$e,newline:Re,paragraph:oe,table:_,text:Pe},ne=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),Me={...K,lheading:ye,table:ne,paragraph:k(j).replace(\"hr\",C).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",ne).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)])[ \\\\t]\").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},ze={...K,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",U).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:_,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(j).replace(\"hr\",C).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",ie).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Ee=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Ie=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,ae=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,z=/[\\p{P}\\p{S}]/u,H=/[\\s\\p{P}\\p{S}]/u,W=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,H).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Be=/(?!~)[\\s\\p{P}\\p{S}]/u,De=/(?:[^\\s\\p{P}\\p{S}]|~)/u,qe=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",be?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,ve=k(ue,\"u\").replace(/punct/g,z).getRegex(),He=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",Ze=k(pe,\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Ge=k(pe,\"gu\").replace(/notPunctSpace/g,De).replace(/punctSpace/g,Be).replace(/punct/g,le).getRegex(),Ne=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Qe=k(/^~~?(?:((?!~)punct)|[^\\s~])/,\"u\").replace(/punct/g,z).getRegex(),je=\"^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)\",Fe=k(je,\"gu\").replace(/notPunctSpace/g,W).replace(/punctSpace/g,H).replace(/punct/g,z).getRegex(),Ue=k(/\\\\(punct)/,\"gu\").replace(/punct/g,z).getRegex(),Ke=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),We=k(U).replace(\"(?:-->|$)\",\"-->\").getRegex(),Xe=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",We).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/,Je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ve=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),re=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,X={_backpedal:_,anyPunctuation:Ue,autolink:Ke,blockSkip:qe,br:ae,code:Ie,del:_,delLDelim:_,delRDelim:_,emStrongLDelim:ve,emStrongRDelimAst:Ze,emStrongRDelimUnd:Ne,escape:Ee,link:Je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ve,tag:Xe,text:Ae,url:_},Ye={...X,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},N={...X,emStrongRDelimAst:Ge,emStrongLDelim:He,delLDelim:Qe,delRDelim:Fe,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",re).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",re).getRegex()},et={...N,br:k(ae).replace(\"{2,}\",\"*\").getRegex(),text:k(N.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},B={normal:K,gfm:Me,pedantic:ze},E={normal:X,gfm:N,breaks:et,pedantic:Ye};var tt={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ke=u=>tt[u];function T(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function J(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function V(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function I(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e=0){let t=e,n=\"\";for(let r of u)if(r===\"\t\"){let i=4-t%4;n+=\" \".repeat(i),t+=i}else n+=r,t++;return n}function fe(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function nt(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var w=class{options;rules;lexer;constructor(e){this.options=e||O}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:I(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=nt(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=I(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:I(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=I(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n    $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=d,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),S=this.blockquote(f);s[s.length-1]=S,r=r.substring(0,r.length-R.raw.length)+S.raw,i=i.substring(0,i.length-R.text.length)+S.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),S=this.list(f);s[s.length-1]=S,r=r.substring(0,r.length-h.raw.length)+S.raw,i=i.substring(0,i.length-R.raw.length)+S.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=ge(t[2].split(`\n`,1)[0],t[1].length),h=e.split(`\n`,1)[0],R=!d.trim(),f=0;if(this.options.pedantic?(f=2,c=d.trimStart()):R?f=t[1].length+1:(f=d.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=d.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let S=this.rules.other.nextBulletRegex(f),Y=this.rules.other.hrRegex(f),ee=this.rules.other.fencesBeginRegex(f),te=this.rules.other.headingBeginRegex(f),me=this.rules.other.htmlBeginRegex(f),xe=this.rules.other.blockquoteBeginRegex(f);for(;e;){let Z=e.split(`\n`,1)[0],A;if(h=Z,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\"  \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\"    \"),ee.test(h)||te.test(h)||me.test(h)||xe.test(h)||S.test(h)||Y.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||d.replace(this.rules.other.tabCharGlobal,\"    \").search(this.rules.other.nonSpaceChar)>=4||ee.test(d)||te.test(d)||Y.test(d))break;c+=`\n`+h}R=!h.trim(),p+=Z+`\n`,e=e.substring(Z.length+1),d=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0]?.type===\"text\"||l.tokens[0]?.type===\"paragraph\"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.checked,i.loose?l.tokens[0]&&[\"paragraph\",\"text\"].includes(l.tokens[0].type)&&\"tokens\"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(d=>d.type===\"space\"),c=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=c}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=V(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(V(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=I(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),fe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return fe(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[3]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!==null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let d=[...r[0]][0].length,h=e.slice(0,s+r.index+d+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e,t,n=\"\"){let r=this.rules.inline.delLDelim.exec(e);if(!r)return;if(!(r[1]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+s);(r=p.exec(t))!==null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a||(o=[...a].length,o!==s))continue;if(r[3]||r[4]){l+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l);let c=[...r[0]][0].length,d=e.slice(0,s+r.index+c+o),h=d.slice(s,-s);return{type:\"del\",raw:d,text:h,tokens:this.lexer.inlineTokens(h)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||O,this.options.tokenizer=this.options.tokenizer||new w,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:B.normal,inline:E.normal};this.options.pedantic?(t.block=B.pedantic,t.inline=E.pedantic):this.options.gfm&&(t.block=B.gfm,this.options.breaks?t.inline=E.breaks:t.inline=E.gfm),this.tokenizer.rules=t}static get rules(){return{block:B,inline:E}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\"    \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!==null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!==null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!==null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),d;this.options.extensions.startInline.forEach(h=>{d=h.call({lexer:this},c),typeof d==\"number\"&&d>=0&&(p=Math.min(p,d))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var y=class{options;parser;constructor(e){this.options=e||O}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+T(r)+'\">'+(n?i:T(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:T(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${T(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=J(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+T(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=J(e);if(i===null)return T(n);e=i;let s=`<img src=\"${e}\" alt=\"${T(n)}\"`;return t&&(s+=` title=\"${T(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:T(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||O,this.options.renderer=this.options.renderer||new y,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var P=class{options;block;constructor(e){this.options=e||O}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?x.lex:x.lexInline}provideParser(e=this.block){return e?b.parse:b.parseInline}};var D=class{defaults=M();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=y;TextRenderer=$;Lexer=x;Tokenizer=w;Hooks=P;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new y(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new w(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new P;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];P.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&P.passThroughHooksRespectAsync.has(s))return(async()=>{let d=await o.call(i,p);return l.call(i,d)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await o.apply(i,p);return d===!1&&(d=await l.apply(i,p)),d})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer(e):e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser(e):e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer(e):e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser(e):e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+T(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var L=new D;function g(u,e){return L.parse(u,e)}g.options=g.setOptions=function(u){return L.setOptions(u),g.defaults=L.defaults,G(g.defaults),g};g.getDefaults=M;g.defaults=O;g.use=function(...u){return L.use(...u),g.defaults=L.defaults,G(g.defaults),g};g.walkTokens=function(u,e){return L.walkTokens(u,e)};g.parseInline=L.parseInline;g.Parser=b;g.parser=b.parse;g.Renderer=y;g.TextRenderer=$;g.Lexer=x;g.lexer=x.lex;g.Tokenizer=w;g.Hooks=P;g.parse=g;var Qt=g.options,jt=g.setOptions,Ft=g.use,Ut=g.walkTokens,Kt=g.parseInline,Wt=g,Xt=b.parse,Jt=x.lex;export{P as Hooks,x as Lexer,D as Marked,b as Parser,y as Renderer,$ as TextRenderer,w as Tokenizer,O as defaults,M as getDefaults,Jt as lexer,g as marked,Qt as options,Wt as parse,Kt as parseInline,Xt as parser,jt as setOptions,Ft as use,Ut as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import { Extension, attrsEqual, callOrReturn, commands, decodeHtmlEntities, encodeHtmlEntities, flattenExtensions, generateJSON, getExtensionField, getSchema, marksEqual, sortExtensions } from \"@tiptap/core\";\nimport { marked } from \"marked\";\n//#region src/utils.ts\n/**\n* Matches a run of two or more consecutive line breaks (a blank line) at the\n* end of a string, allowing horizontal whitespace between the breaks.\n*\n* @example\n* TRAILING_BLANK_LINES.test('paragraph\\n  \\n')\n* // => true\n*/\nconst TRAILING_BLANK_LINES = /\\n[^\\S\\n]*(?:\\n[^\\S\\n]*)+$/;\n/**\n* Extracts blank lines absorbed into marked token `raw` back into explicit\n* `space` tokens so they're handled uniformly by the reconstruction path.\n* @param tokens The marked token stream to normalize.\n* @returns A new token array with absorbed blank lines as `space` tokens.\n*/\nfunction extractAbsorbedBlankLines(tokens) {\n\treturn tokens.flatMap((token, index) => {\n\t\tvar _tokens;\n\t\tif (token.type === \"space\" || ((_tokens = tokens[index + 1]) === null || _tokens === void 0 ? void 0 : _tokens.type) === \"space\") return [token];\n\t\tconst trailingBlankLines = (token.raw || \"\").match(TRAILING_BLANK_LINES);\n\t\tif (!trailingBlankLines) return [token];\n\t\treturn [{\n\t\t\t...token,\n\t\t\traw: (token.raw || \"\").slice(0, -trailingBlankLines[0].length)\n\t\t}, {\n\t\t\ttype: \"space\",\n\t\t\traw: trailingBlankLines[0]\n\t\t}];\n\t});\n}\n/**\n* Wraps each line of the content with the given prefix.\n* @param prefix The prefix to wrap each line with.\n* @param content The content to wrap.\n* @returns The content with each line wrapped with the prefix.\n*/\nfunction wrapInMarkdownBlock(prefix, content) {\n\tconst output = content.split(\"\\n\").flatMap((line) => [line, \"\"]).map((line) => `${prefix}${line}`).join(\"\\n\");\n\treturn output.slice(0, output.length - 1);\n}\n/**\n* Determines which marks to close based on the next node's marks,\n* treating same-type marks with different attributes as distinct.\n*/\nfunction findMarksToClose(currentMarks, nextNode) {\n\tconst marksToClose = [];\n\tArray.from(currentMarks.entries()).forEach(([markType, currentMark]) => {\n\t\tif (!nextNode) {\n\t\t\tmarksToClose.push(markType);\n\t\t\treturn;\n\t\t}\n\t\tif (!(nextNode.marks || []).find((mark) => mark.type === markType && attrsEqual(mark.attrs, currentMark.attrs))) marksToClose.push(markType);\n\t});\n\treturn marksToClose;\n}\n/**\n* Determines which marks need to open, treating same-type marks with\n* different attributes as distinct (close + reopen).\n*/\nfunction findMarksToOpen(activeMarks, currentMarks) {\n\tconst marksToOpen = [];\n\tArray.from(currentMarks.entries()).forEach(([markType, mark]) => {\n\t\tconst activeMark = activeMarks.get(markType);\n\t\tif (!activeMark || !attrsEqual(activeMark.attrs, mark.attrs)) marksToOpen.push({\n\t\t\ttype: markType,\n\t\t\tmark\n\t\t});\n\t});\n\treturn marksToOpen;\n}\n/**\n* Determines which marks to close at the node end, treating same-type marks\n* with different attributes as distinct (close + reopen).\n*/\nfunction findMarksToCloseAtEnd(activeMarks, currentMarks, nextNode, markSetsEqual) {\n\tconst isLastNode = !nextNode;\n\tconst nextNodeHasNoMarks = nextNode && (!nextNode.marks || nextNode.marks.length === 0);\n\tconst nextNodeHasDifferentMarks = nextNode && nextNode.marks && !markSetsEqual(currentMarks, new Map(nextNode.marks.map((mark) => [mark.type, mark])));\n\tconst marksToCloseAtEnd = [];\n\tif (isLastNode || nextNodeHasNoMarks || nextNodeHasDifferentMarks) {\n\t\tif (nextNode && nextNode.marks) Array.from(activeMarks.entries()).reverse().forEach(([markType, activeMark]) => {\n\t\t\tif (!nextNode.marks.find((m) => m.type === markType && attrsEqual(m.attrs, activeMark.attrs))) marksToCloseAtEnd.push(markType);\n\t\t});\n\t\telse if (isLastNode || nextNodeHasNoMarks) marksToCloseAtEnd.push(...Array.from(activeMarks.keys()).reverse());\n\t}\n\treturn marksToCloseAtEnd;\n}\n/**\n* Closes active marks before rendering a non-text node.\n* Returns the closing markdown syntax and clears the active marks.\n*/\nfunction closeMarksBeforeNode(activeMarks, getMarkClosing) {\n\tlet beforeMarkdown = \"\";\n\tArray.from(activeMarks.keys()).reverse().forEach((markType) => {\n\t\tconst closeMarkdown = getMarkClosing(markType, activeMarks.get(markType));\n\t\tif (closeMarkdown) beforeMarkdown = closeMarkdown + beforeMarkdown;\n\t});\n\tactiveMarks.clear();\n\treturn beforeMarkdown;\n}\n/**\n* Reopens marks after rendering a non-text node.\n* Returns the opening markdown syntax and updates the active marks.\n*/\nfunction reopenMarksAfterNode(marksToReopen, activeMarks, getMarkOpening) {\n\tlet afterMarkdown = \"\";\n\tArray.from(marksToReopen.entries()).forEach(([markType, mark]) => {\n\t\tconst openMarkdown = getMarkOpening(markType, mark);\n\t\tif (openMarkdown) afterMarkdown += openMarkdown;\n\t\tactiveMarks.set(markType, mark);\n\t});\n\treturn afterMarkdown;\n}\n/**\n* Check if a markdown list item token is a task item and extract its state.\n*\n* @param item The list item token to check\n* @returns Object containing isTask flag, checked state, and indentation level\n*\n* @example\n* ```ts\n* isTaskItem({ raw: '- [ ] Task' }) // { isTask: true, checked: false, indentLevel: 0 }\n* isTaskItem({ raw: '  - [x] Done' }) // { isTask: true, checked: true, indentLevel: 2 }\n* isTaskItem({ raw: '- Regular' }) // { isTask: false, indentLevel: 0 }\n* ```\n*/\nfunction isTaskItem(item) {\n\tconst match = (item.raw || item.text || \"\").match(/^(\\s*)[-+*]\\s+\\[([ xX])\\]\\s+/);\n\tif (match) return {\n\t\tisTask: true,\n\t\tchecked: match[2].toLowerCase() === \"x\",\n\t\tindentLevel: match[1].length\n\t};\n\treturn {\n\t\tisTask: false,\n\t\tindentLevel: 0\n\t};\n}\n/**\n* Assumes the content type based off the content.\n* @param content The content to assume the type for.\n* @param contentType The content type that should be prioritized.\n*/\nfunction assumeContentType(content, contentType) {\n\tif (typeof content !== \"string\") return \"json\";\n\treturn contentType;\n}\n//#endregion\n//#region src/utils/htmlTagDetection.ts\n/**\n* Standard HTML and common SVG element names. Used to tell apart real\n* (but possibly empty) elements like `<em></em>` from genuinely unknown\n* angle-bracket text such as `<enter foo bar>` so the latter can be\n* preserved as literal text.\n*\n* Non-hyphenated tags not in this set are treated as unknown unless\n* declared in the schema's parseDOM rules. This does not claim full\n* parity with browser `HTMLUnknownElement` classification across all\n* namespaces (e.g. rare SVG filter elements, MathML).\n*/\nconst STANDARD_HTML_TAGS = /* @__PURE__ */ new Set([\n\t\"a\",\n\t\"abbr\",\n\t\"address\",\n\t\"area\",\n\t\"article\",\n\t\"aside\",\n\t\"audio\",\n\t\"b\",\n\t\"base\",\n\t\"bdi\",\n\t\"bdo\",\n\t\"blockquote\",\n\t\"body\",\n\t\"br\",\n\t\"button\",\n\t\"canvas\",\n\t\"caption\",\n\t\"cite\",\n\t\"code\",\n\t\"col\",\n\t\"colgroup\",\n\t\"data\",\n\t\"datalist\",\n\t\"dd\",\n\t\"del\",\n\t\"details\",\n\t\"dfn\",\n\t\"dialog\",\n\t\"div\",\n\t\"dl\",\n\t\"dt\",\n\t\"em\",\n\t\"embed\",\n\t\"fieldset\",\n\t\"figcaption\",\n\t\"figure\",\n\t\"footer\",\n\t\"form\",\n\t\"h1\",\n\t\"h2\",\n\t\"h3\",\n\t\"h4\",\n\t\"h5\",\n\t\"h6\",\n\t\"head\",\n\t\"header\",\n\t\"hgroup\",\n\t\"hr\",\n\t\"html\",\n\t\"i\",\n\t\"iframe\",\n\t\"img\",\n\t\"input\",\n\t\"ins\",\n\t\"kbd\",\n\t\"label\",\n\t\"legend\",\n\t\"li\",\n\t\"link\",\n\t\"main\",\n\t\"map\",\n\t\"mark\",\n\t\"menu\",\n\t\"meta\",\n\t\"meter\",\n\t\"nav\",\n\t\"noscript\",\n\t\"object\",\n\t\"ol\",\n\t\"optgroup\",\n\t\"option\",\n\t\"output\",\n\t\"p\",\n\t\"param\",\n\t\"picture\",\n\t\"pre\",\n\t\"progress\",\n\t\"q\",\n\t\"rp\",\n\t\"rt\",\n\t\"ruby\",\n\t\"s\",\n\t\"samp\",\n\t\"script\",\n\t\"search\",\n\t\"section\",\n\t\"select\",\n\t\"slot\",\n\t\"small\",\n\t\"source\",\n\t\"span\",\n\t\"strong\",\n\t\"style\",\n\t\"sub\",\n\t\"summary\",\n\t\"sup\",\n\t\"svg\",\n\t\"circle\",\n\t\"clippath\",\n\t\"defs\",\n\t\"ellipse\",\n\t\"foreignobject\",\n\t\"g\",\n\t\"image\",\n\t\"line\",\n\t\"lineargradient\",\n\t\"mask\",\n\t\"path\",\n\t\"polygon\",\n\t\"polyline\",\n\t\"radialgradient\",\n\t\"rect\",\n\t\"stop\",\n\t\"switch\",\n\t\"symbol\",\n\t\"textpath\",\n\t\"tspan\",\n\t\"use\",\n\t\"table\",\n\t\"tbody\",\n\t\"td\",\n\t\"template\",\n\t\"textarea\",\n\t\"tfoot\",\n\t\"th\",\n\t\"thead\",\n\t\"time\",\n\t\"title\",\n\t\"tr\",\n\t\"track\",\n\t\"u\",\n\t\"ul\",\n\t\"var\",\n\t\"video\",\n\t\"wbr\"\n]);\nconst HTML_TAG_NAME_PATTERN = /<\\/?([a-zA-Z][\\w-]*)/g;\n/**\n* Extract lower-cased tag names from an HTML fragment (opening and closing tags).\n*/\nfunction extractHtmlTagNames(html) {\n\tconst tagNames = [];\n\tlet match;\n\twhile ((match = HTML_TAG_NAME_PATTERN.exec(html)) !== null) tagNames.push(match[1].toLowerCase());\n\treturn tagNames;\n}\n/**\n* Returns true when the tag name is non-hyphenated and not in the\n* STANDARD_HTML_TAGS allowlist (i.e. would be treated as unrecognized).\n*/\nfunction isHtmlUnknownTagName(tagName) {\n\tconst lower = tagName.toLowerCase();\n\tif (lower.includes(\"-\")) return false;\n\treturn !STANDARD_HTML_TAGS.has(lower);\n}\n/**\n* Returns true when the HTML contains a tag that is neither a standard HTML\n* element nor declared in the schema's parseDOM rules.\n*/\nfunction htmlContainsUnrecognizedTag(html, schemaTags) {\n\treturn extractHtmlTagNames(html).some((tagName) => {\n\t\tif (!isHtmlUnknownTagName(tagName)) return false;\n\t\treturn !schemaTags.has(tagName);\n\t});\n}\n//#endregion\n//#region src/MarkdownManager.ts\nvar MarkdownManager = class {\n\t/**\n\t* Create a MarkdownManager.\n\t* @param options.marked Optional marked instance to use (injected).\n\t* @param options.markedOptions Optional options to pass to marked.setOptions\n\t* @param options.indentation Indentation settings (style and size).\n\t* @param options.extensions An array of Tiptap extensions to register for markdown parsing and rendering.\n\t*/\n\tconstructor(options) {\n\t\tvar _options$marked, _options$indentation$, _options$indentation, _options$indentation$2, _options$indentation2;\n\t\tthis.activeParseLexer = null;\n\t\tthis.extensionRanks = /* @__PURE__ */ new Map();\n\t\tthis.baseExtensions = [];\n\t\tthis.extensions = [];\n\t\tthis.codeTypes = /* @__PURE__ */ new Set();\n\t\tthis.schemaParseDomTagsCache = null;\n\t\tthis.inlineNodeTypesCache = null;\n\t\tthis.lastParseResult = null;\n\t\tthis.markedInstance = (_options$marked = options === null || options === void 0 ? void 0 : options.marked) !== null && _options$marked !== void 0 ? _options$marked : marked;\n\t\tthis.indentStyle = (_options$indentation$ = options === null || options === void 0 || (_options$indentation = options.indentation) === null || _options$indentation === void 0 ? void 0 : _options$indentation.style) !== null && _options$indentation$ !== void 0 ? _options$indentation$ : \"space\";\n\t\tthis.indentSize = (_options$indentation$2 = options === null || options === void 0 || (_options$indentation2 = options.indentation) === null || _options$indentation2 === void 0 ? void 0 : _options$indentation2.size) !== null && _options$indentation$2 !== void 0 ? _options$indentation$2 : 2;\n\t\tthis.baseExtensions = (options === null || options === void 0 ? void 0 : options.extensions) || [];\n\t\tif ((options === null || options === void 0 ? void 0 : options.markedOptions) && typeof this.markedInstance.setOptions === \"function\") this.markedInstance.setOptions(options.markedOptions);\n\t\tthis.registry = /* @__PURE__ */ new Map();\n\t\tthis.nodeTypeRegistry = /* @__PURE__ */ new Map();\n\t\tif (options === null || options === void 0 ? void 0 : options.extensions) {\n\t\t\tthis.baseExtensions = options.extensions;\n\t\t\tsortExtensions(flattenExtensions(options.extensions)).forEach((ext) => this.registerExtension(ext));\n\t\t}\n\t}\n\t/** Returns the underlying marked instance. */\n\tget instance() {\n\t\treturn this.markedInstance;\n\t}\n\t/** Returns the correct indentCharacter (space or tab) */\n\tget indentCharacter() {\n\t\treturn this.indentStyle === \"space\" ? \" \" : \"\t\";\n\t}\n\t/** Returns the correct indentString repeated X times */\n\tget indentString() {\n\t\treturn this.indentCharacter.repeat(this.indentSize);\n\t}\n\t/** Helper to quickly check whether a marked instance is available. */\n\thasMarked() {\n\t\treturn !!this.markedInstance;\n\t}\n\t/**\n\t* Register a Tiptap extension (Node/Mark/Extension). This will read\n\t* `markdownName`, `parseMarkdown`, `renderMarkdown` and `priority` from the\n\t* extension config (using the same resolution used across the codebase).\n\t*/\n\tregisterExtension(extension) {\n\t\tvar _getExtensionField, _markdownCfg$indentsC;\n\t\tthis.extensions.push(extension);\n\t\tconst isCode = callOrReturn(getExtensionField(extension, \"code\"));\n\t\tconst name = extension.name;\n\t\tif (isCode) this.codeTypes.add(name);\n\t\tif (!this.extensionRanks.has(name)) this.extensionRanks.set(name, this.extensionRanks.size);\n\t\tconst tokenName = getExtensionField(extension, \"markdownTokenName\") || name;\n\t\tconst parseMarkdown = getExtensionField(extension, \"parseMarkdown\");\n\t\tconst renderMarkdown = getExtensionField(extension, \"renderMarkdown\");\n\t\tconst tokenizer = getExtensionField(extension, \"markdownTokenizer\");\n\t\tconst markdownCfg = (_getExtensionField = getExtensionField(extension, \"markdownOptions\")) !== null && _getExtensionField !== void 0 ? _getExtensionField : null;\n\t\tconst spec = {\n\t\t\ttokenName,\n\t\t\tnodeName: name,\n\t\t\tparseMarkdown,\n\t\t\trenderMarkdown,\n\t\t\tisIndenting: (_markdownCfg$indentsC = markdownCfg === null || markdownCfg === void 0 ? void 0 : markdownCfg.indentsContent) !== null && _markdownCfg$indentsC !== void 0 ? _markdownCfg$indentsC : false,\n\t\t\thtmlReopen: markdownCfg === null || markdownCfg === void 0 ? void 0 : markdownCfg.htmlReopen,\n\t\t\ttokenizer\n\t\t};\n\t\tif (tokenName && parseMarkdown) {\n\t\t\tconst parseExisting = this.registry.get(tokenName) || [];\n\t\t\tparseExisting.push(spec);\n\t\t\tthis.registry.set(tokenName, parseExisting);\n\t\t}\n\t\tif (renderMarkdown) {\n\t\t\tconst renderExisting = this.nodeTypeRegistry.get(name) || [];\n\t\t\trenderExisting.push(spec);\n\t\t\tthis.nodeTypeRegistry.set(name, renderExisting);\n\t\t}\n\t\tif (tokenizer && this.hasMarked()) this.registerTokenizer(tokenizer);\n\t}\n\tcreateLexer() {\n\t\treturn new this.markedInstance.Lexer(this.markedInstance.defaults);\n\t}\n\tcreateTokenizerHelpers(lexer) {\n\t\treturn {\n\t\t\tinlineTokens: (src) => lexer.inlineTokens(src),\n\t\t\tblockTokens: (src) => lexer.blockTokens(src)\n\t\t};\n\t}\n\ttokenizeInline(src) {\n\t\tvar _this$activeParseLexe;\n\t\treturn ((_this$activeParseLexe = this.activeParseLexer) !== null && _this$activeParseLexe !== void 0 ? _this$activeParseLexe : this.createLexer()).inlineTokens(src);\n\t}\n\t/**\n\t* Register a custom tokenizer with marked.js for parsing non-standard markdown syntax.\n\t*/\n\tregisterTokenizer(tokenizer) {\n\t\tif (!this.hasMarked()) return;\n\t\tconst { name, start, level = \"inline\", tokenize } = tokenizer;\n\t\tconst createTokenizerHelpers = this.createTokenizerHelpers.bind(this);\n\t\tconst createLexer = this.createLexer.bind(this);\n\t\tlet startCb;\n\t\tif (!start) startCb = (src) => {\n\t\t\tconst result = tokenize(src, [], this.createTokenizerHelpers(this.createLexer()));\n\t\t\tif (result && result.raw) return src.indexOf(result.raw);\n\t\t\treturn -1;\n\t\t};\n\t\telse startCb = typeof start === \"function\" ? start : (src) => src.indexOf(start);\n\t\tconst markedExtension = {\n\t\t\tname,\n\t\t\tlevel,\n\t\t\tstart: startCb,\n\t\t\ttokenizer(src, tokens) {\n\t\t\t\tconst helper = this.lexer ? createTokenizerHelpers(this.lexer) : createTokenizerHelpers(createLexer());\n\t\t\t\tconst result = tokenize(src, tokens, helper);\n\t\t\t\tif (result && result.type) return {\n\t\t\t\t\t...result,\n\t\t\t\t\ttype: result.type || name,\n\t\t\t\t\traw: result.raw || \"\",\n\t\t\t\t\ttokens: result.tokens || []\n\t\t\t\t};\n\t\t\t},\n\t\t\tchildTokens: []\n\t\t};\n\t\tthis.markedInstance.use({ extensions: [markedExtension] });\n\t}\n\t/** Get registered handlers for a token type and try each until one succeeds. */\n\tgetHandlersForToken(type) {\n\t\ttry {\n\t\t\treturn this.registry.get(type) || [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\t/** Get the first handler for a token type (for backwards compatibility). */\n\tgetHandlerForToken(type) {\n\t\tconst markdownHandlers = this.getHandlersForToken(type);\n\t\tif (markdownHandlers.length > 0) return markdownHandlers[0];\n\t\tconst nodeTypeHandlers = this.getHandlersForNodeType(type);\n\t\treturn nodeTypeHandlers.length > 0 ? nodeTypeHandlers[0] : void 0;\n\t}\n\t/** Get registered handlers for a node type (for rendering). */\n\tgetHandlersForNodeType(type) {\n\t\ttry {\n\t\t\treturn this.nodeTypeRegistry.get(type) || [];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\t/**\n\t* Serialize a ProseMirror-like JSON document (or node array) to a Markdown string\n\t* using registered renderers and fallback renderers.\n\t*/\n\tserialize(docOrContent) {\n\t\tif (!docOrContent) return \"\";\n\t\tconst result = this.renderNodes(docOrContent, docOrContent);\n\t\treturn this.isEmptyOutput(result) ? \"\" : result;\n\t}\n\t/**\n\t* Check if the markdown output represents an empty document.\n\t* Empty documents may contain only &nbsp; entities or non-breaking space characters\n\t* which are used by the Paragraph extension to preserve blank lines.\n\t*/\n\tisEmptyOutput(markdown) {\n\t\tif (!markdown || markdown.trim() === \"\") return true;\n\t\treturn markdown.replace(/&nbsp;/g, \"\").replace(/\\u00A0/g, \"\").trim() === \"\";\n\t}\n\t/**\n\t* Parse markdown string into Tiptap JSON document using registered extension handlers.\n\t*/\n\tparse(markdown) {\n\t\tif (!this.hasMarked()) throw new Error(\"No marked instance available for parsing\");\n\t\tconst previousParseLexer = this.activeParseLexer;\n\t\tconst parseLexer = this.createLexer();\n\t\tthis.activeParseLexer = parseLexer;\n\t\ttry {\n\t\t\tconst tokens = parseLexer.lex(markdown);\n\t\t\treturn {\n\t\t\t\ttype: \"doc\",\n\t\t\t\tcontent: this.parseTokens(tokens, true)\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.activeParseLexer = previousParseLexer;\n\t\t}\n\t}\n\t/**\n\t* Convert an array of marked tokens into Tiptap JSON nodes using registered extension handlers.\n\t*/\n\tparseTokens(tokens, parseImplicitEmptyParagraphs = false) {\n\t\tconst normalizedTokens = parseImplicitEmptyParagraphs ? extractAbsorbedBlankLines(tokens) : tokens;\n\t\tconst nonSpaceTokenIndexes = normalizedTokens.reduce((indexes, token, index) => {\n\t\t\tif (token.type !== \"space\") indexes.push(index);\n\t\t\treturn indexes;\n\t\t}, []);\n\t\tlet previousNonSpaceTokenIndex = -1;\n\t\tlet nextNonSpaceTokenPointer = 0;\n\t\treturn normalizedTokens.flatMap((token, index) => {\n\t\t\twhile (nextNonSpaceTokenPointer < nonSpaceTokenIndexes.length && nonSpaceTokenIndexes[nextNonSpaceTokenPointer] < index) {\n\t\t\t\tpreviousNonSpaceTokenIndex = nonSpaceTokenIndexes[nextNonSpaceTokenPointer];\n\t\t\t\tnextNonSpaceTokenPointer += 1;\n\t\t\t}\n\t\t\tif (parseImplicitEmptyParagraphs && token.type === \"space\") {\n\t\t\t\tvar _nonSpaceTokenIndexes;\n\t\t\t\tconst nextNonSpaceTokenIndex = (_nonSpaceTokenIndexes = nonSpaceTokenIndexes[nextNonSpaceTokenPointer]) !== null && _nonSpaceTokenIndexes !== void 0 ? _nonSpaceTokenIndexes : -1;\n\t\t\t\treturn this.createImplicitEmptyParagraphsFromSpace(token, previousNonSpaceTokenIndex, nextNonSpaceTokenIndex);\n\t\t\t}\n\t\t\tconst parsed = this.parseToken(token, parseImplicitEmptyParagraphs);\n\t\t\tif (parsed === null) return [];\n\t\t\treturn Array.isArray(parsed) ? parsed : [parsed];\n\t\t});\n\t}\n\tcreateImplicitEmptyParagraphsFromSpace(token, previousNonSpaceTokenIndex, nextNonSpaceTokenIndex) {\n\t\tconst separatorCount = this.countParagraphSeparators(token.raw || \"\");\n\t\tif (separatorCount === 0) return [];\n\t\tconst emptyParagraphCount = Math.max(separatorCount - (previousNonSpaceTokenIndex === -1 || nextNonSpaceTokenIndex === -1 ? 0 : 1), 0);\n\t\treturn Array.from({ length: emptyParagraphCount }, () => ({\n\t\t\ttype: \"paragraph\",\n\t\t\tcontent: []\n\t\t}));\n\t}\n\tcountParagraphSeparators(raw) {\n\t\treturn (raw.replace(/\\r\\n/g, \"\\n\").match(/\\n\\n/g) || []).length;\n\t}\n\t/**\n\t* Parse a single token into Tiptap JSON using the appropriate registered handler.\n\t*/\n\tparseToken(token, parseImplicitEmptyParagraphs = false) {\n\t\tif (!token.type) return null;\n\t\tif (token.type === \"list\") return this.parseListToken(token);\n\t\tconst handlers = this.getHandlersForToken(token.type);\n\t\tconst helpers = this.createParseHelpers();\n\t\tif (handlers.find((handler) => {\n\t\t\tif (!handler.parseMarkdown) return false;\n\t\t\tconst parseResult = handler.parseMarkdown(token, helpers);\n\t\t\tconst normalized = this.normalizeParseResult(parseResult);\n\t\t\tif (normalized && (!Array.isArray(normalized) || normalized.length > 0)) {\n\t\t\t\tthis.lastParseResult = normalized;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}) && this.lastParseResult) {\n\t\t\tconst toReturn = this.lastParseResult;\n\t\t\tthis.lastParseResult = null;\n\t\t\treturn toReturn;\n\t\t}\n\t\treturn this.parseFallbackToken(token, parseImplicitEmptyParagraphs);\n\t}\n\t/**\n\t* Parse a list token, handling mixed bullet and task list items by splitting them into separate lists.\n\t* This ensures that consecutive task items and bullet items are grouped and parsed as separate list nodes.\n\t*\n\t* @param token The list token to parse\n\t* @returns Array of parsed list nodes, or null if parsing fails\n\t*/\n\tparseListToken(token) {\n\t\tif (!token.items || token.items.length === 0) return this.parseTokenWithHandlers(token);\n\t\tconst hasTask = token.items.some((item) => isTaskItem(item).isTask);\n\t\tconst hasNonTask = token.items.some((item) => !isTaskItem(item).isTask);\n\t\tif (!hasTask || !hasNonTask || this.getHandlersForToken(\"taskList\").length === 0) return this.parseTokenWithHandlers(token);\n\t\tconst groups = [];\n\t\tlet currentGroup = [];\n\t\tlet currentType = null;\n\t\tfor (let i = 0; i < token.items.length; i += 1) {\n\t\t\tconst item = token.items[i];\n\t\t\tconst { isTask, checked, indentLevel } = isTaskItem(item);\n\t\t\tlet processedItem = item;\n\t\t\tif (isTask) {\n\t\t\t\tconst lines = (item.raw || item.text || \"\").split(\"\\n\");\n\t\t\t\tconst firstLineMatch = lines[0].match(/^\\s*[-+*]\\s+\\[([ xX])\\]\\s+(.*)$/);\n\t\t\t\tconst mainContent = firstLineMatch ? firstLineMatch[2] : \"\";\n\t\t\t\tlet nestedTokens = [];\n\t\t\t\tif (lines.length > 1) {\n\t\t\t\t\tif (lines.slice(1).join(\"\\n\").trim()) {\n\t\t\t\t\t\tconst nestedLines = lines.slice(1);\n\t\t\t\t\t\tconst nonEmptyLines = nestedLines.filter((line) => line.trim());\n\t\t\t\t\t\tif (nonEmptyLines.length > 0) {\n\t\t\t\t\t\t\tconst minIndent = Math.min(...nonEmptyLines.map((line) => line.length - line.trimStart().length));\n\t\t\t\t\t\t\tconst nestedContent = nestedLines.map((line) => {\n\t\t\t\t\t\t\t\tif (!line.trim()) return \"\";\n\t\t\t\t\t\t\t\treturn line.slice(minIndent);\n\t\t\t\t\t\t\t}).join(\"\\n\").trim();\n\t\t\t\t\t\t\tif (nestedContent) nestedTokens = this.markedInstance.lexer(`${nestedContent}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprocessedItem = {\n\t\t\t\t\ttype: \"taskItem\",\n\t\t\t\t\traw: \"\",\n\t\t\t\t\tmainContent,\n\t\t\t\t\tindentLevel,\n\t\t\t\t\tchecked: checked !== null && checked !== void 0 ? checked : false,\n\t\t\t\t\ttext: mainContent,\n\t\t\t\t\ttokens: this.tokenizeInline(mainContent),\n\t\t\t\t\tnestedTokens\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst itemType = isTask ? \"taskList\" : \"list\";\n\t\t\tif (currentType !== itemType) {\n\t\t\t\tif (currentGroup.length > 0) groups.push({\n\t\t\t\t\ttype: currentType,\n\t\t\t\t\titems: currentGroup\n\t\t\t\t});\n\t\t\t\tcurrentGroup = [processedItem];\n\t\t\t\tcurrentType = itemType;\n\t\t\t} else currentGroup.push(processedItem);\n\t\t}\n\t\tif (currentGroup.length > 0) groups.push({\n\t\t\ttype: currentType,\n\t\t\titems: currentGroup\n\t\t});\n\t\tconst results = [];\n\t\tfor (let i = 0; i < groups.length; i += 1) {\n\t\t\tconst group = groups[i];\n\t\t\tconst subToken = {\n\t\t\t\t...token,\n\t\t\t\ttype: group.type,\n\t\t\t\titems: group.items\n\t\t\t};\n\t\t\tconst parsed = this.parseToken(subToken);\n\t\t\tif (parsed) {\n\t\t\t\tif (Array.isArray(parsed)) results.push(...parsed);\n\t\t\t\telse results.push(parsed);\n\t\t\t}\n\t\t}\n\t\treturn results.length > 0 ? results : null;\n\t}\n\t/**\n\t* Parse a token using registered handlers (extracted for reuse).\n\t*/\n\tparseTokenWithHandlers(token) {\n\t\tif (!token.type) return null;\n\t\tconst handlers = this.getHandlersForToken(token.type);\n\t\tconst helpers = this.createParseHelpers();\n\t\tif (handlers.find((handler) => {\n\t\t\tif (!handler.parseMarkdown) return false;\n\t\t\tconst parseResult = handler.parseMarkdown(token, helpers);\n\t\t\tconst normalized = this.normalizeParseResult(parseResult);\n\t\t\tif (normalized && (!Array.isArray(normalized) || normalized.length > 0)) {\n\t\t\t\tthis.lastParseResult = normalized;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}) && this.lastParseResult) {\n\t\t\tconst toReturn = this.lastParseResult;\n\t\t\tthis.lastParseResult = null;\n\t\t\treturn toReturn;\n\t\t}\n\t\treturn this.parseFallbackToken(token);\n\t}\n\t/**\n\t* Creates helper functions for parsing markdown tokens.\n\t* @returns An object containing helper functions for parsing.\n\t*/\n\tcreateParseHelpers() {\n\t\treturn {\n\t\t\tparseInline: (tokens) => this.parseInlineTokens(tokens),\n\t\t\ttokenizeInline: (src) => this.tokenizeInline(src),\n\t\t\tparseChildren: (tokens) => this.parseTokens(tokens),\n\t\t\tparseBlockChildren: (tokens) => this.parseTokens(tokens, true),\n\t\t\tcreateTextNode: (text, marks) => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext,\n\t\t\t\t\tmarks: marks || void 0\n\t\t\t\t};\n\t\t\t},\n\t\t\tcreateNode: (type, attrs, content) => {\n\t\t\t\tconst node = {\n\t\t\t\t\ttype,\n\t\t\t\t\tattrs: attrs || void 0,\n\t\t\t\t\tcontent: content || void 0\n\t\t\t\t};\n\t\t\t\tif (!attrs || Object.keys(attrs).length === 0) delete node.attrs;\n\t\t\t\treturn node;\n\t\t\t},\n\t\t\tapplyMark: (markType, content, attrs) => ({\n\t\t\t\tmark: markType,\n\t\t\t\tcontent,\n\t\t\t\tattrs: attrs && Object.keys(attrs).length > 0 ? attrs : void 0\n\t\t\t})\n\t\t};\n\t}\n\t/**\n\t* Escape special regex characters in a string.\n\t*/\n\tescapeRegex(str) {\n\t\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t}\n\t/**\n\t* Parse inline tokens (bold, italic, links, etc.) into text nodes with marks.\n\t* This is the complex part that handles mark nesting and boundaries.\n\t*/\n\tparseInlineTokens(tokens) {\n\t\tconst result = [];\n\t\tfor (let i = 0; i < tokens.length; i += 1) {\n\t\t\tconst token = tokens[i];\n\t\t\tif (token.type === \"text\") result.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: decodeHtmlEntities(token.text || \"\")\n\t\t\t});\n\t\t\telse if (token.type === \"escape\") result.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: token.text || \"\"\n\t\t\t});\n\t\t\telse if (token.type === \"html\") {\n\t\t\t\tvar _ref, _token$raw;\n\t\t\t\tconst raw = ((_ref = (_token$raw = token.raw) !== null && _token$raw !== void 0 ? _token$raw : token.text) !== null && _ref !== void 0 ? _ref : \"\").toString();\n\t\t\t\tconst isClosing = /^<\\/[\\s]*[\\w-]+/i.test(raw);\n\t\t\t\tconst openMatch = raw.match(/^<[\\s]*([\\w-]+)(\\s|>|\\/|$)/i);\n\t\t\t\tif (!isClosing && openMatch && !/\\/>$/.test(raw)) {\n\t\t\t\t\tconst tagName = openMatch[1];\n\t\t\t\t\tconst escapedTagName = this.escapeRegex(tagName);\n\t\t\t\t\tconst closingRegex = new RegExp(`^<\\\\/\\\\s*${escapedTagName}\\\\b`, \"i\");\n\t\t\t\t\tlet foundIndex = -1;\n\t\t\t\t\tconst parts = [raw];\n\t\t\t\t\tfor (let j = i + 1; j < tokens.length; j += 1) {\n\t\t\t\t\t\tvar _ref2, _t$raw;\n\t\t\t\t\t\tconst t = tokens[j];\n\t\t\t\t\t\tconst tRaw = ((_ref2 = (_t$raw = t.raw) !== null && _t$raw !== void 0 ? _t$raw : t.text) !== null && _ref2 !== void 0 ? _ref2 : \"\").toString();\n\t\t\t\t\t\tparts.push(tRaw);\n\t\t\t\t\t\tif (t.type === \"html\" && closingRegex.test(tRaw)) {\n\t\t\t\t\t\t\tfoundIndex = j;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (foundIndex !== -1) {\n\t\t\t\t\t\tconst mergedRaw = parts.join(\"\");\n\t\t\t\t\t\tconst mergedToken = {\n\t\t\t\t\t\t\ttype: \"html\",\n\t\t\t\t\t\t\traw: mergedRaw,\n\t\t\t\t\t\t\ttext: mergedRaw,\n\t\t\t\t\t\t\tblock: false\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst parsed = this.parseHTMLToken(mergedToken);\n\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\tconst normalized = this.normalizeParseResult(parsed);\n\t\t\t\t\t\t\tif (Array.isArray(normalized)) result.push(...normalized);\n\t\t\t\t\t\t\telse if (normalized) result.push(normalized);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti = foundIndex;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst parsedSingle = this.parseHTMLToken(token);\n\t\t\t\tif (parsedSingle) {\n\t\t\t\t\tconst normalized = this.normalizeParseResult(parsedSingle);\n\t\t\t\t\tif (Array.isArray(normalized)) result.push(...normalized);\n\t\t\t\t\telse if (normalized) result.push(normalized);\n\t\t\t\t}\n\t\t\t} else if (token.type) {\n\t\t\t\tconst markHandler = this.getHandlerForToken(token.type);\n\t\t\t\tif (markHandler && markHandler.parseMarkdown) {\n\t\t\t\t\tconst helpers = this.createParseHelpers();\n\t\t\t\t\tconst parsed = markHandler.parseMarkdown(token, helpers);\n\t\t\t\t\tif (this.isMarkResult(parsed)) {\n\t\t\t\t\t\tconst markedContent = this.applyMarkToContent(parsed.mark, parsed.content, parsed.attrs);\n\t\t\t\t\t\tresult.push(...markedContent);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst normalized = this.normalizeParseResult(parsed);\n\t\t\t\t\t\tif (Array.isArray(normalized)) result.push(...normalized);\n\t\t\t\t\t\telse if (normalized) result.push(normalized);\n\t\t\t\t\t}\n\t\t\t\t} else if (token.tokens) result.push(...this.parseInlineTokens(token.tokens));\n\t\t\t}\n\t\t}\n\t\tfor (let i = result.length - 1; i > 0; i -= 1) {\n\t\t\tconst current = result[i];\n\t\t\tconst previous = result[i - 1];\n\t\t\tif (current.type === \"text\" && previous.type === \"text\") {\n\t\t\t\tconst currentMarks = current.marks || [];\n\t\t\t\tconst previousMarks = previous.marks || [];\n\t\t\t\tif (marksEqual(currentMarks, previousMarks)) {\n\t\t\t\t\tprevious.text = (previous.text || \"\") + (current.text || \"\");\n\t\t\t\t\tresult.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t/**\n\t* Apply a mark to content nodes.\n\t*/\n\tapplyMarkToContent(markType, content, attrs) {\n\t\treturn content.map((node) => {\n\t\t\tif (node.type === \"text\") {\n\t\t\t\tconst existingMarks = node.marks || [];\n\t\t\t\tconst newMark = attrs ? {\n\t\t\t\t\ttype: markType,\n\t\t\t\t\tattrs\n\t\t\t\t} : { type: markType };\n\t\t\t\treturn {\n\t\t\t\t\t...node,\n\t\t\t\t\tmarks: [...existingMarks, newMark]\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...node,\n\t\t\t\tcontent: node.content ? this.applyMarkToContent(markType, node.content, attrs) : void 0\n\t\t\t};\n\t\t});\n\t}\n\tisMarkResult(result) {\n\t\treturn result && typeof result === \"object\" && \"mark\" in result;\n\t}\n\t/**\n\t* Normalize parse results to ensure they're valid JSONContent.\n\t*/\n\tnormalizeParseResult(result) {\n\t\tif (!result) return null;\n\t\tif (this.isMarkResult(result)) return result.content;\n\t\treturn result;\n\t}\n\t/**\n\t* Fallback parsing for common tokens when no specific handler is registered.\n\t*/\n\tparseFallbackToken(token, parseImplicitEmptyParagraphs = false) {\n\t\tswitch (token.type) {\n\t\t\tcase \"paragraph\": return {\n\t\t\t\ttype: \"paragraph\",\n\t\t\t\tcontent: token.tokens ? this.parseInlineTokens(token.tokens) : []\n\t\t\t};\n\t\t\tcase \"heading\": return {\n\t\t\t\ttype: \"heading\",\n\t\t\t\tattrs: { level: token.depth || 1 },\n\t\t\t\tcontent: token.tokens ? this.parseInlineTokens(token.tokens) : []\n\t\t\t};\n\t\t\tcase \"text\": return {\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: decodeHtmlEntities(token.text || \"\")\n\t\t\t};\n\t\t\tcase \"html\": return this.parseHTMLToken(token);\n\t\t\tcase \"escape\": return {\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: token.text || \"\"\n\t\t\t};\n\t\t\tcase \"space\": return null;\n\t\t\tdefault:\n\t\t\t\tif (token.tokens) return this.parseTokens(token.tokens, parseImplicitEmptyParagraphs);\n\t\t\t\treturn null;\n\t\t}\n\t}\n\t/**\n\t* Parse an HTML token from marked into JSONContent using the registered\n\t* extensions' `parseHTML` rules. Falls back to literal text when the HTML\n\t* has nothing for the schema to keep.\n\t*\n\t* @param token Marked HTML token (block or inline).\n\t* @example\n\t*   parseHTMLToken({ type: 'html', raw: '<em>hi</em>', block: false })\n\t*   // → text node with an italic mark\n\t*/\n\tparseHTMLToken(token) {\n\t\tconst html = token.text || token.raw || \"\";\n\t\tif (!html.trim()) return null;\n\t\tif (this.isUnrecognizedHtml(html)) return this.htmlAsLiteralText(html, !!token.block);\n\t\tif (typeof window === \"undefined\" || typeof window.DOMParser === \"undefined\") return this.htmlAsLiteralText(html, !!token.block);\n\t\ttry {\n\t\t\tconst parsed = generateJSON(html, this.baseExtensions);\n\t\t\tif (parsed.type === \"doc\" && parsed.content) {\n\t\t\t\tif (token.block) return parsed.content;\n\t\t\t\tconst inlineContent = this.toInlineContent(parsed.content);\n\t\t\t\treturn inlineContent.length > 0 ? inlineContent : null;\n\t\t\t}\n\t\t\treturn parsed;\n\t\t} catch (error) {\n\t\t\tthrow new Error(`Failed to parse HTML in markdown: ${error}`);\n\t\t}\n\t}\n\t/**\n\t* Keep only the inline nodes of parsed HTML content, unwrapping the block\n\t* nodes around them. Inline HTML sits inside a textblock, where a block node\n\t* would make the document invalid for the schema.\n\t*\n\t* @param content Content array of a parsed HTML fragment.\n\t* @example\n\t*   toInlineContent([{ type: 'paragraph', content: [{ type: 'text', text: 'hi' }] }])\n\t*   // → [{ type: 'text', text: 'hi' }]\n\t*/\n\ttoInlineContent(content) {\n\t\tconst inlineTypes = this.getInlineNodeTypes();\n\t\treturn content.flatMap((node) => {\n\t\t\tif (node.type && inlineTypes.has(node.type)) return [node];\n\t\t\treturn node.content ? this.toInlineContent(node.content) : [];\n\t\t});\n\t}\n\t/**\n\t* Collect the names of the node types the schema treats as inline. Result is\n\t* cached for the lifetime of the manager since extensions don't change after\n\t* registration.\n\t*\n\t* @example\n\t*   getInlineNodeTypes().has('text') // → true\n\t*/\n\tgetInlineNodeTypes() {\n\t\tif (this.inlineNodeTypesCache) return this.inlineNodeTypesCache;\n\t\tconst types = /* @__PURE__ */ new Set([\"text\"]);\n\t\ttry {\n\t\t\tconst schema = getSchema(this.baseExtensions);\n\t\t\tObject.values(schema.nodes).forEach((type) => {\n\t\t\t\tif (type.isInline) types.add(type.name);\n\t\t\t});\n\t\t} catch {}\n\t\tthis.inlineNodeTypesCache = types;\n\t\treturn types;\n\t}\n\t/**\n\t* Returns true when the HTML contains a tag that is neither a standard\n\t* HTML/SVG element nor declared in a registered extension's parseDOM rules.\n\t*\n\t* Recognized but empty elements such as `<em></em>` or `<span></span>`,\n\t* and hyphenated custom elements like `<my-mention>`, are not considered\n\t* unrecognized.\n\t*\n\t* @param html Raw HTML string from a marked token.\n\t* @example\n\t*   isUnrecognizedHtml('<enter foo bar>')  // → true\n\t*   isUnrecognizedHtml('<em></em>')        // → false (empty, but real tag)\n\t*   isUnrecognizedHtml('<em>hi</em>')      // → false\n\t*   isUnrecognizedHtml('<my-el></my-el>')  // → false (valid custom element)\n\t*   isUnrecognizedHtml('<br>')             // → false\n\t*/\n\tisUnrecognizedHtml(html) {\n\t\treturn htmlContainsUnrecognizedTag(html, this.getSchemaParseDomTags());\n\t}\n\t/**\n\t* Collect the lower-cased tag names declared by the registered extensions'\n\t* parseDOM rules, so custom node/mark elements that use non-hyphenated,\n\t* non-standard tag names are treated as recognized HTML. Result is cached for the\n\t* lifetime of the manager since extensions don't change after registration.\n\t*\n\t* @example\n\t*   // After registering an extension with parseDOM [{ tag: 'something' }]\n\t*   getSchemaParseDomTags().has('something') // → true\n\t*/\n\tgetSchemaParseDomTags() {\n\t\tif (this.schemaParseDomTagsCache) return this.schemaParseDomTagsCache;\n\t\tconst tags = /* @__PURE__ */ new Set();\n\t\ttry {\n\t\t\tconst schema = getSchema(this.baseExtensions);\n\t\t\tconst collect = (spec) => {\n\t\t\t\tconst parseDOM = spec === null || spec === void 0 ? void 0 : spec.parseDOM;\n\t\t\t\tif (!Array.isArray(parseDOM)) return;\n\t\t\t\tparseDOM.forEach((rule) => {\n\t\t\t\t\tif (typeof (rule === null || rule === void 0 ? void 0 : rule.tag) === \"string\") {\n\t\t\t\t\t\tconst match = rule.tag.match(/^[a-zA-Z][\\w-]*/);\n\t\t\t\t\t\tif (match) tags.add(match[0].toLowerCase());\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\tObject.values(schema.nodes).forEach((type) => collect(type.spec));\n\t\t\tObject.values(schema.marks).forEach((type) => collect(type.spec));\n\t\t} catch {}\n\t\tthis.schemaParseDomTagsCache = tags;\n\t\treturn tags;\n\t}\n\t/**\n\t* Build a JSONContent that preserves the original HTML markup as literal\n\t* text. Used when the HTML would otherwise be silently dropped during\n\t* schema-aware parsing.\n\t*\n\t* @param html Raw HTML string to preserve verbatim.\n\t* @param isBlock Whether to wrap the text in a paragraph node (block tokens)\n\t*   or return it as a bare text node (inline tokens).\n\t* @example\n\t*   htmlAsLiteralText('<enter foo>', true)\n\t*   // → { type: 'paragraph', content: [{ type: 'text', text: '<enter foo>' }] }\n\t*/\n\thtmlAsLiteralText(html, isBlock) {\n\t\tconst text = html.replace(/\\s+$/, \"\");\n\t\tif (!text) return null;\n\t\tif (isBlock) return {\n\t\t\ttype: \"paragraph\",\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext\n\t\t\t}]\n\t\t};\n\t\treturn {\n\t\t\ttype: \"text\",\n\t\t\ttext\n\t\t};\n\t}\n\t/**\n\t* Encode HTML entities in text unless the node is inside a code context\n\t* (code mark or code-block parent) where literal characters should be preserved.\n\t* Also backslash-escape markdown-significant characters in non-code text to\n\t* prevent them from being misinterpreted as formatting delimiters.\n\t*/\n\tencodeTextForMarkdown(text, node, parentNode) {\n\t\tif ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.type) != null && this.codeTypes.has(parentNode.type) || (node.marks || []).some((m) => this.codeTypes.has(typeof m === \"string\" ? m : m.type))) return text;\n\t\treturn this.escapeMarkdownSyntax(encodeHtmlEntities(text));\n\t}\n\t/**\n\t* Backslash-escape characters that have special meaning in markdown inline\n\t* syntax. This prevents literal characters in text nodes from being\n\t* misinterpreted as formatting delimiters when the output is parsed again.\n\t*\n\t* The set covers the most common inline markdown syntax characters.\n\t* Characters inside code blocks/code marks are skipped by the caller\n\t* (`encodeTextForMarkdown`) via the existing `isInsideCode` guard.\n\t*/\n\tescapeMarkdownSyntax(text) {\n\t\treturn text.replace(/([\\\\`*_[\\]~])/g, \"\\\\$1\");\n\t}\n\trenderNodeToMarkdown(node, parentNode, index = 0, level = 0, meta = {}) {\n\t\tvar _handler$renderMarkdo;\n\t\tif (node.type === \"text\") return this.encodeTextForMarkdown(node.text || \"\", node, parentNode);\n\t\tif (!node.type) return \"\";\n\t\tconst handler = this.getHandlerForToken(node.type);\n\t\tif (!handler) return \"\";\n\t\tconst previousNode = Array.isArray(parentNode === null || parentNode === void 0 ? void 0 : parentNode.content) && index > 0 ? parentNode.content[index - 1] : void 0;\n\t\tconst helpers = {\n\t\t\trenderChildren: (nodes, separator) => {\n\t\t\t\tconst childLevel = handler.isIndenting ? level + 1 : level;\n\t\t\t\tif (!Array.isArray(nodes) && nodes.content) return this.renderNodes(nodes.content, node, separator || \"\", index, childLevel);\n\t\t\t\treturn this.renderNodes(nodes, node, separator || \"\", index, childLevel);\n\t\t\t},\n\t\t\trenderChild: (childNode, childIndex) => {\n\t\t\t\tconst childLevel = handler.isIndenting ? level + 1 : level;\n\t\t\t\treturn this.renderNodeToMarkdown(childNode, node, childIndex, childLevel);\n\t\t\t},\n\t\t\tindent: (content) => {\n\t\t\t\treturn this.indentString + content;\n\t\t\t},\n\t\t\twrapInBlock: wrapInMarkdownBlock\n\t\t};\n\t\tconst context = {\n\t\t\tindex,\n\t\t\tlevel,\n\t\t\tparentType: parentNode === null || parentNode === void 0 ? void 0 : parentNode.type,\n\t\t\tpreviousNode,\n\t\t\tmeta: {\n\t\t\t\tparentAttrs: parentNode === null || parentNode === void 0 ? void 0 : parentNode.attrs,\n\t\t\t\t...meta\n\t\t\t}\n\t\t};\n\t\treturn ((_handler$renderMarkdo = handler.renderMarkdown) === null || _handler$renderMarkdo === void 0 ? void 0 : _handler$renderMarkdo.call(handler, node, helpers, context)) || \"\";\n\t}\n\t/**\n\t* Render a node or an array of nodes. Parent type controls how children\n\t* are joined (which determines newline insertion between children).\n\t*/\n\trenderNodes(nodeOrNodes, parentNode, separator = \"\", index = 0, level = 0) {\n\t\tif (!Array.isArray(nodeOrNodes)) {\n\t\t\tif (!nodeOrNodes.type) return \"\";\n\t\t\treturn this.renderNodeToMarkdown(nodeOrNodes, parentNode, index, level);\n\t\t}\n\t\treturn this.renderNodesWithMarkBoundaries(nodeOrNodes, parentNode, separator, level);\n\t}\n\t/**\n\t* Render an array of nodes while properly tracking mark boundaries.\n\t* This handles cases where marks span across multiple text nodes.\n\t*/\n\trenderNodesWithMarkBoundaries(nodes, parentNode, separator = \"\", level = 0) {\n\t\tconst result = [];\n\t\tconst activeMarks = /* @__PURE__ */ new Map();\n\t\tconst reopenWithHtmlOnNextOpen = /* @__PURE__ */ new Set();\n\t\tconst markOpeningModes = /* @__PURE__ */ new Map();\n\t\tnodes.forEach((node, i) => {\n\t\t\tconst nextNode = i < nodes.length - 1 ? nodes[i + 1] : null;\n\t\t\tif (!node.type) return;\n\t\t\tif (node.type === \"text\") {\n\t\t\t\tlet textContent = this.encodeTextForMarkdown(node.text || \"\", node, parentNode);\n\t\t\t\tconst currentMarks = new Map((node.marks || []).map((mark) => [mark.type, mark]));\n\t\t\t\tconst marksToOpen = this.getMarksToOpenForSerialization(activeMarks, currentMarks, nextNode);\n\t\t\t\tconst marksToClose = findMarksToClose(currentMarks, nextNode);\n\t\t\t\tconst activeMarksClosingHere = marksToClose.filter((markType) => activeMarks.has(markType));\n\t\t\t\tconst hasCrossedBoundary = activeMarksClosingHere.length > 0 && marksToOpen.length > 0;\n\t\t\t\tlet middleTrailingWhitespace = \"\";\n\t\t\t\tif (marksToClose.length > 0 && !hasCrossedBoundary) {\n\t\t\t\t\tconst middleTrailingMatch = textContent.match(/(\\s+)$/);\n\t\t\t\t\tif (middleTrailingMatch) {\n\t\t\t\t\t\tmiddleTrailingWhitespace = middleTrailingMatch[1];\n\t\t\t\t\t\ttextContent = textContent.slice(0, -middleTrailingWhitespace.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!hasCrossedBoundary) marksToClose.slice().reverse().forEach((markType) => {\n\t\t\t\t\tif (!activeMarks.has(markType)) return;\n\t\t\t\t\tconst mark = currentMarks.get(markType);\n\t\t\t\t\tconst closeMarkdown = this.getMarkClosing(markType, mark, markOpeningModes.get(markType));\n\t\t\t\t\tif (closeMarkdown) textContent += closeMarkdown;\n\t\t\t\t\tif (activeMarks.has(markType)) {\n\t\t\t\t\t\tactiveMarks.delete(markType);\n\t\t\t\t\t\tmarkOpeningModes.delete(markType);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tlet leadingWhitespace = \"\";\n\t\t\t\tif (marksToOpen.length > 0) {\n\t\t\t\t\tconst leadingMatch = textContent.match(/^(\\s+)/);\n\t\t\t\t\tif (leadingMatch) {\n\t\t\t\t\t\tleadingWhitespace = leadingMatch[1];\n\t\t\t\t\t\ttextContent = textContent.slice(leadingWhitespace.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmarksToOpen.forEach(({ type, mark }) => {\n\t\t\t\t\tconst openingMode = reopenWithHtmlOnNextOpen.has(type) ? \"html\" : \"markdown\";\n\t\t\t\t\tconst openMarkdown = this.getMarkOpening(type, mark, openingMode);\n\t\t\t\t\tif (openMarkdown) textContent = openMarkdown + textContent;\n\t\t\t\t\tmarkOpeningModes.set(type, openingMode);\n\t\t\t\t\treopenWithHtmlOnNextOpen.delete(type);\n\t\t\t\t});\n\t\t\t\tif (!hasCrossedBoundary) marksToOpen.slice().reverse().forEach(({ type, mark }) => {\n\t\t\t\t\tactiveMarks.set(type, mark);\n\t\t\t\t});\n\t\t\t\ttextContent = leadingWhitespace + textContent;\n\t\t\t\tlet marksToCloseAtEnd;\n\t\t\t\tif (hasCrossedBoundary) {\n\t\t\t\t\tconst nextMarkTypes = new Set(((nextNode === null || nextNode === void 0 ? void 0 : nextNode.marks) || []).map((mark) => mark.type));\n\t\t\t\t\tmarksToOpen.forEach(({ type }) => {\n\t\t\t\t\t\tif (nextMarkTypes.has(type) && this.getHtmlReopenTags(type)) reopenWithHtmlOnNextOpen.add(type);\n\t\t\t\t\t});\n\t\t\t\t\tconst activeMarkKeys = Array.from(activeMarks.keys());\n\t\t\t\t\tconst activeMarksClosingHereLifo = activeMarksClosingHere.slice().sort((a, b) => activeMarkKeys.indexOf(b) - activeMarkKeys.indexOf(a));\n\t\t\t\t\tmarksToCloseAtEnd = [...marksToOpen.map((m) => m.type), ...activeMarksClosingHereLifo];\n\t\t\t\t} else marksToCloseAtEnd = findMarksToCloseAtEnd(activeMarks, currentMarks, nextNode, this.markSetsEqual.bind(this));\n\t\t\t\tlet trailingWhitespace = \"\";\n\t\t\t\tif (marksToCloseAtEnd.length > 0) {\n\t\t\t\t\tconst trailingMatch = textContent.match(/(\\s+)$/);\n\t\t\t\t\tif (trailingMatch) {\n\t\t\t\t\t\ttrailingWhitespace = trailingMatch[1];\n\t\t\t\t\t\ttextContent = textContent.slice(0, -trailingWhitespace.length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmarksToCloseAtEnd.forEach((markType) => {\n\t\t\t\t\tvar _activeMarks$get;\n\t\t\t\t\tconst mark = (_activeMarks$get = activeMarks.get(markType)) !== null && _activeMarks$get !== void 0 ? _activeMarks$get : currentMarks.get(markType);\n\t\t\t\t\tconst closeMarkdown = this.getMarkClosing(markType, mark, markOpeningModes.get(markType));\n\t\t\t\t\tif (closeMarkdown) textContent += closeMarkdown;\n\t\t\t\t\tactiveMarks.delete(markType);\n\t\t\t\t\tmarkOpeningModes.delete(markType);\n\t\t\t\t});\n\t\t\t\ttextContent += trailingWhitespace;\n\t\t\t\ttextContent += middleTrailingWhitespace;\n\t\t\t\tresult.push(textContent);\n\t\t\t} else {\n\t\t\t\tconst nodeMarkTypes = new Set((node.marks || []).map((mark) => mark.type));\n\t\t\t\tconst marksToReopen = /* @__PURE__ */ new Map();\n\t\t\t\tconst openingModesToReopen = /* @__PURE__ */ new Map();\n\t\t\t\tactiveMarks.forEach((mark, type) => {\n\t\t\t\t\tif (nodeMarkTypes.has(type)) {\n\t\t\t\t\t\tvar _markOpeningModes$get;\n\t\t\t\t\t\tmarksToReopen.set(type, mark);\n\t\t\t\t\t\topeningModesToReopen.set(type, (_markOpeningModes$get = markOpeningModes.get(type)) !== null && _markOpeningModes$get !== void 0 ? _markOpeningModes$get : \"markdown\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tconst beforeMarkdown = closeMarksBeforeNode(activeMarks, (markType, mark) => {\n\t\t\t\t\treturn this.getMarkClosing(markType, mark, markOpeningModes.get(markType));\n\t\t\t\t});\n\t\t\t\tmarkOpeningModes.clear();\n\t\t\t\tconst nodeContent = this.renderNodeToMarkdown(node, parentNode, i, level);\n\t\t\t\tconst afterMarkdown = node.type === \"hardBreak\" ? \"\" : reopenMarksAfterNode(marksToReopen, activeMarks, (markType, mark) => {\n\t\t\t\t\tvar _openingModesToReopen;\n\t\t\t\t\tconst openingMode = (_openingModesToReopen = openingModesToReopen.get(markType)) !== null && _openingModesToReopen !== void 0 ? _openingModesToReopen : \"markdown\";\n\t\t\t\t\tmarkOpeningModes.set(markType, openingMode);\n\t\t\t\t\treturn this.getMarkOpening(markType, mark, openingMode);\n\t\t\t\t});\n\t\t\t\tresult.push(beforeMarkdown + nodeContent + afterMarkdown);\n\t\t\t}\n\t\t});\n\t\treturn result.join(separator);\n\t}\n\t/**\n\t* Get the opening markdown syntax for a mark type.\n\t*/\n\tgetMarkOpening(markType, mark, openingMode = \"markdown\") {\n\t\tif (openingMode === \"html\") {\n\t\t\tvar _this$getHtmlReopenTa;\n\t\t\treturn ((_this$getHtmlReopenTa = this.getHtmlReopenTags(markType)) === null || _this$getHtmlReopenTa === void 0 ? void 0 : _this$getHtmlReopenTa.open) || \"\";\n\t\t}\n\t\tconst handlers = this.getHandlersForNodeType(markType);\n\t\tconst handler = handlers.length > 0 ? handlers[0] : void 0;\n\t\tif (!handler || !handler.renderMarkdown) return \"\";\n\t\tconst placeholder = \"__TIPTAP_MARKDOWN_PLACEHOLDER__\";\n\t\tconst syntheticNode = {\n\t\t\ttype: markType,\n\t\t\tattrs: mark.attrs || {},\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: placeholder\n\t\t\t}]\n\t\t};\n\t\ttry {\n\t\t\tconst rendered = handler.renderMarkdown(syntheticNode, {\n\t\t\t\trenderChildren: () => placeholder,\n\t\t\t\trenderChild: () => placeholder,\n\t\t\t\tindent: (content) => content,\n\t\t\t\twrapInBlock: (prefix, content) => prefix + content\n\t\t\t}, {\n\t\t\t\tindex: 0,\n\t\t\t\tlevel: 0,\n\t\t\t\tparentType: \"text\",\n\t\t\t\tmeta: {}\n\t\t\t});\n\t\t\tconst placeholderIndex = rendered.indexOf(placeholder);\n\t\t\treturn placeholderIndex >= 0 ? rendered.substring(0, placeholderIndex) : \"\";\n\t\t} catch (err) {\n\t\t\tthrow new Error(`Failed to get mark opening for ${markType}: ${err}`);\n\t\t}\n\t}\n\t/**\n\t* Get the closing markdown syntax for a mark type.\n\t*/\n\tgetMarkClosing(markType, mark, openingMode = \"markdown\") {\n\t\tif (openingMode === \"html\") {\n\t\t\tvar _this$getHtmlReopenTa2;\n\t\t\treturn ((_this$getHtmlReopenTa2 = this.getHtmlReopenTags(markType)) === null || _this$getHtmlReopenTa2 === void 0 ? void 0 : _this$getHtmlReopenTa2.close) || \"\";\n\t\t}\n\t\tconst handlers = this.getHandlersForNodeType(markType);\n\t\tconst handler = handlers.length > 0 ? handlers[0] : void 0;\n\t\tif (!handler || !handler.renderMarkdown) return \"\";\n\t\tconst placeholder = \"__TIPTAP_MARKDOWN_PLACEHOLDER__\";\n\t\tconst syntheticNode = {\n\t\t\ttype: markType,\n\t\t\tattrs: mark.attrs || {},\n\t\t\tcontent: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: placeholder\n\t\t\t}]\n\t\t};\n\t\ttry {\n\t\t\tconst rendered = handler.renderMarkdown(syntheticNode, {\n\t\t\t\trenderChildren: () => placeholder,\n\t\t\t\trenderChild: () => placeholder,\n\t\t\t\tindent: (content) => content,\n\t\t\t\twrapInBlock: (prefix, content) => prefix + content\n\t\t\t}, {\n\t\t\t\tindex: 0,\n\t\t\t\tlevel: 0,\n\t\t\t\tparentType: \"text\",\n\t\t\t\tmeta: {}\n\t\t\t});\n\t\t\tconst placeholderIndex = rendered.indexOf(placeholder);\n\t\t\tconst placeholderEnd = placeholderIndex + 33;\n\t\t\treturn placeholderIndex >= 0 ? rendered.substring(placeholderEnd) : \"\";\n\t\t} catch (err) {\n\t\t\tthrow new Error(`Failed to get mark closing for ${markType}: ${err}`);\n\t\t}\n\t}\n\t/**\n\t* Returns the inline HTML tags an extension exposes for overlap-boundary\n\t* reopen handling, if that mark explicitly opted into HTML reopen mode.\n\t*/\n\tgetHtmlReopenTags(markType) {\n\t\tconst handlers = this.getHandlersForNodeType(markType);\n\t\tconst handler = handlers.length > 0 ? handlers[0] : void 0;\n\t\treturn handler === null || handler === void 0 ? void 0 : handler.htmlReopen;\n\t}\n\t/**\n\t* Check if two mark sets are equal (same types and matching attributes).\n\t*/\n\tmarkSetsEqual(marks1, marks2) {\n\t\tif (marks1.size !== marks2.size) return false;\n\t\treturn Array.from(marks1.entries()).every(([type, mark]) => {\n\t\t\tconst otherMark = marks2.get(type);\n\t\t\treturn otherMark && attrsEqual(mark.attrs, otherMark.attrs);\n\t\t});\n\t}\n\t/**\n\t* Decide the order in which marks open on the current text node.\n\t*\n\t* The returned array is iterated head-first when prepending opening\n\t* delimiters, so the first entry becomes the innermost mark in the emitted\n\t* markdown and the last becomes the outermost. Two stable signals drive\n\t* the order — neither one inspects any rendered markdown:\n\t*\n\t*   1. Marks that end on this node must be inner relative to marks that\n\t*      continue into the next node, otherwise the delimiters interleave\n\t*      instead of nesting.\n\t*   2. Within each lifetime group, marks are sorted so that lower\n\t*      registration ranks (i.e. higher Tiptap extension priorities) end up\n\t*      outermost. ProseMirror assigns mark ranks in the same priority-aware\n\t*      order Tiptap uses when building the schema, so link (priority 1000)\n\t*      naturally wraps bold/italic without the serializer needing to peek\n\t*      at how any particular mark renders.\n\t*/\n\tgetMarksToOpenForSerialization(activeMarks, currentMarks, nextNode) {\n\t\tconst marksToOpen = findMarksToOpen(activeMarks, currentMarks);\n\t\tif (marksToOpen.length <= 1) return marksToOpen;\n\t\tconst nextMarks = (nextNode === null || nextNode === void 0 ? void 0 : nextNode.marks) || [];\n\t\tconst continuesInNextNode = (markType, attrs) => nextMarks.some((m) => m.type === markType && attrsEqual(m.attrs, attrs));\n\t\tconst byRankInnerFirst = (a, b) => {\n\t\t\tvar _this$extensionRanks$, _this$extensionRanks$2;\n\t\t\tconst rankA = (_this$extensionRanks$ = this.extensionRanks.get(a.type)) !== null && _this$extensionRanks$ !== void 0 ? _this$extensionRanks$ : Number.MAX_SAFE_INTEGER;\n\t\t\tconst rankB = (_this$extensionRanks$2 = this.extensionRanks.get(b.type)) !== null && _this$extensionRanks$2 !== void 0 ? _this$extensionRanks$2 : Number.MAX_SAFE_INTEGER;\n\t\t\tif (rankA !== rankB) return rankB - rankA;\n\t\t\treturn a.type.localeCompare(b.type);\n\t\t};\n\t\tconst endingHere = marksToOpen.filter((mark) => !continuesInNextNode(mark.type, mark.mark.attrs)).sort(byRankInnerFirst);\n\t\tconst continuing = marksToOpen.filter((mark) => continuesInNextNode(mark.type, mark.mark.attrs)).sort(byRankInnerFirst);\n\t\treturn [...endingHere, ...continuing];\n\t}\n};\n//#endregion\n//#region src/Extension.ts\nconst Markdown = Extension.create({\n\tname: \"markdown\",\n\taddOptions() {\n\t\treturn {\n\t\t\tindentation: {\n\t\t\t\tstyle: \"space\",\n\t\t\t\tsize: 2\n\t\t\t},\n\t\t\tmarked: void 0,\n\t\t\tmarkedOptions: {}\n\t\t};\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetContent: (content, options) => {\n\t\t\t\tif (!(options === null || options === void 0 ? void 0 : options.contentType)) return commands.setContent(content, options);\n\t\t\t\tif (assumeContentType(content, options === null || options === void 0 ? void 0 : options.contentType) !== \"markdown\" || !this.editor.markdown) return commands.setContent(content, options);\n\t\t\t\tconst mdContent = this.editor.markdown.parse(content);\n\t\t\t\treturn commands.setContent(mdContent, options);\n\t\t\t},\n\t\t\tinsertContent: (value, options) => {\n\t\t\t\tif (!(options === null || options === void 0 ? void 0 : options.contentType)) return commands.insertContent(value, options);\n\t\t\t\tif (assumeContentType(value, options === null || options === void 0 ? void 0 : options.contentType) !== \"markdown\" || !this.editor.markdown) return commands.insertContent(value, options);\n\t\t\t\tconst mdContent = this.editor.markdown.parse(value);\n\t\t\t\treturn commands.insertContent(mdContent, options);\n\t\t\t},\n\t\t\tinsertContentAt: (position, value, options) => {\n\t\t\t\tif (!(options === null || options === void 0 ? void 0 : options.contentType)) return commands.insertContentAt(position, value, options);\n\t\t\t\tif (assumeContentType(value, options === null || options === void 0 ? void 0 : options.contentType) !== \"markdown\" || !this.editor.markdown) return commands.insertContentAt(position, value, options);\n\t\t\t\tconst mdContent = this.editor.markdown.parse(value);\n\t\t\t\treturn commands.insertContentAt(position, mdContent, options);\n\t\t\t}\n\t\t};\n\t},\n\taddStorage() {\n\t\treturn { manager: new MarkdownManager({\n\t\t\tindentation: this.options.indentation,\n\t\t\tmarked: this.options.marked,\n\t\t\tmarkedOptions: this.options.markedOptions,\n\t\t\textensions: []\n\t\t}) };\n\t},\n\tonBeforeCreate() {\n\t\tvar _json$content;\n\t\tif (this.editor.markdown) {\n\t\t\tconsole.error(\"[tiptap][markdown]: There is already a `markdown` property on the editor instance. This might lead to unexpected behavior.\");\n\t\t\treturn;\n\t\t}\n\t\tthis.storage.manager = new MarkdownManager({\n\t\t\tindentation: this.options.indentation,\n\t\t\tmarked: this.options.marked,\n\t\t\tmarkedOptions: this.options.markedOptions,\n\t\t\textensions: this.editor.extensionManager.baseExtensions\n\t\t});\n\t\tthis.editor.markdown = this.storage.manager;\n\t\tthis.editor.getMarkdown = () => {\n\t\t\treturn this.storage.manager.serialize(this.editor.getJSON());\n\t\t};\n\t\tif (!this.editor.options.contentType) return;\n\t\tif (assumeContentType(this.editor.options.content, this.editor.options.contentType) !== \"markdown\") return;\n\t\tif (!this.editor.markdown) throw new Error(\"[tiptap][markdown]: The `contentType` option is set to \\\"markdown\\\", but the Markdown extension is not added to the editor. Please add the Markdown extension to use this feature.\");\n\t\tif (this.editor.options.content === void 0 || typeof this.editor.options.content !== \"string\") throw new Error(\"[tiptap][markdown]: The `contentType` option is set to \\\"markdown\\\", but the initial content is not a string. Please provide the initial content as a markdown string.\");\n\t\tconst json = this.editor.markdown.parse(this.editor.options.content);\n\t\tif ((_json$content = json.content) === null || _json$content === void 0 ? void 0 : _json$content.length) this.editor.options.content = json;\n\t}\n});\n//#endregion\nexport { Markdown, MarkdownManager, assumeContentType, closeMarksBeforeNode, extractAbsorbedBlankLines, findMarksToClose, findMarksToCloseAtEnd, findMarksToOpen, isTaskItem, reopenMarksAfterNode, wrapInMarkdownBlock };\n\n//# sourceMappingURL=index.js.map","//#region src/jsx-runtime.ts\nconst jsxElements = /* @__PURE__ */ new WeakSet();\nconst jsxFragments = /* @__PURE__ */ new WeakSet();\n/** Create a new JSX element from the given spec */\nfunction createJSXElement(spec) {\n\tconst element = spec;\n\tjsxElements.add(element);\n\treturn element;\n}\n/** Check if a spec is a JSX element */\nfunction isJSXElement(value) {\n\treturn Array.isArray(value) && jsxElements.has(value);\n}\nfunction flattenFragmentChildren(children) {\n\treturn children.flatMap((child) => {\n\t\tif (child == null) return [];\n\t\tif (Array.isArray(child) && jsxFragments.has(child) && !isJSXElement(child)) return flattenFragmentChildren(child);\n\t\treturn [child];\n\t});\n}\nfunction Fragment(props) {\n\tjsxFragments.add(props.children);\n\treturn props.children;\n}\nfunction render(tag, attributes) {\n\tif (tag === \"slot\") return 0;\n\tif (tag instanceof Function) {\n\t\tconst result = tag(attributes);\n\t\tif (Array.isArray(result) && !isJSXElement(result) && !jsxFragments.has(result)) return createJSXElement(result);\n\t\treturn result;\n\t}\n\tconst { children, ...rest } = attributes !== null && attributes !== void 0 ? attributes : {};\n\tif (tag === \"svg\") throw new Error(\"SVG elements are not supported in the JSX syntax, use the array syntax instead\");\n\tif (Array.isArray(children)) {\n\t\tif (isJSXElement(children)) return createJSXElement([\n\t\t\ttag,\n\t\t\trest,\n\t\t\tchildren\n\t\t]);\n\t\tif (children.length === 0) return createJSXElement([tag, rest]);\n\t\tconst flattenedChildren = flattenFragmentChildren(children);\n\t\tif (flattenedChildren.length === 0) return createJSXElement([tag, rest]);\n\t\treturn createJSXElement([\n\t\t\ttag,\n\t\t\trest,\n\t\t\t...flattenedChildren\n\t\t]);\n\t}\n\tif (children !== void 0 && children !== null) return createJSXElement([\n\t\ttag,\n\t\trest,\n\t\tchildren\n\t]);\n\treturn createJSXElement([tag, rest]);\n}\nconst h = (tag, attributes) => render(tag, attributes);\nconst jsxs = (tag, attributes) => render(tag, attributes);\nconst jsxDEV = (tag, attributes, _key, _isStaticChildren) => {\n\treturn render(tag, attributes);\n};\n//#endregion\nexport { Fragment, h as createElement, h, h as jsx, jsxDEV, jsxs };\n\n//# sourceMappingURL=jsx-runtime.js.map","import { Node, mergeAttributes, wrappingInputRule } from \"@tiptap/core\";\nimport { Slice } from \"@tiptap/pm/model\";\nimport { TextSelection } from \"@tiptap/pm/state\";\nimport { jsx } from \"@tiptap/core/jsx-runtime\";\n//#region src/handleBackspace.ts\n/**\n* Restructure the blockquote boundary at the caret.\n*\n* Two cases are handled in a single backspace:\n*\n* 1. Caret at the start of a non-first child of a blockquote — lift the\n*    current child out, splitting the blockquote around it.\n* 2. Caret at the start of a top-level textblock whose previous sibling is\n*    a blockquote with a textblock last child — merge the current\n*    textblock's inline content into the blockquote's last textblock\n*    instead of letting joinBackward pull the paragraph back inside.\n*\n* Returns true when the backspace was consumed.\n*/\nconst handleBackspace = (editor, type) => {\n\tvar _previous$lastChild;\n\tconst { state } = editor;\n\tconst { selection } = state;\n\tif (!selection.empty) return false;\n\tconst { $from } = selection;\n\tif ($from.parentOffset !== 0) return false;\n\tconst parentDepth = $from.depth - 1;\n\tif (parentDepth < 0) return false;\n\tconst parent = $from.node(parentDepth);\n\tconst index = $from.index(parentDepth);\n\tif (index === 0) return false;\n\tif (parent.type === type) return editor.commands.lift(type.name);\n\tconst previous = parent.child(index - 1);\n\tif (previous.type !== type || !((_previous$lastChild = previous.lastChild) === null || _previous$lastChild === void 0 ? void 0 : _previous$lastChild.isTextblock)) return false;\n\tconst targetPos = $from.before() - 1 - 1;\n\treturn editor.commands.command(({ tr, dispatch }) => {\n\t\tif (!dispatch) return true;\n\t\tconst content = $from.parent.content;\n\t\tconst slice = new Slice(content, 0, 0);\n\t\ttr.replace(targetPos, $from.after(), slice);\n\t\ttr.setSelection(TextSelection.create(tr.doc, targetPos + content.size));\n\t\ttr.scrollIntoView();\n\t\tdispatch(tr);\n\t\treturn true;\n\t});\n};\n//#endregion\n//#region src/blockquote.tsx\n/** @jsxImportSource @tiptap/core */\n/**\n* Matches a blockquote to a `>` as input.\n*/\nconst inputRegex = /^\\s*>\\s$/;\n/**\n* This extension allows you to create blockquotes.\n* @see https://tiptap.dev/api/nodes/blockquote\n*/\nconst Blockquote = Node.create({\n\tname: \"blockquote\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tcontent: \"block+\",\n\tgroup: \"block\",\n\tdefining: true,\n\tparseHTML() {\n\t\treturn [{ tag: \"blockquote\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn /* @__PURE__ */ jsx(\"blockquote\", {\n\t\t\t...mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\tchildren: /* @__PURE__ */ jsx(\"slot\", {})\n\t\t});\n\t},\n\tparseMarkdown: (token, helpers) => {\n\t\tvar _helpers$parseBlockCh;\n\t\tconst parseBlockChildren = (_helpers$parseBlockCh = helpers.parseBlockChildren) !== null && _helpers$parseBlockCh !== void 0 ? _helpers$parseBlockCh : helpers.parseChildren;\n\t\treturn helpers.createNode(\"blockquote\", void 0, parseBlockChildren(token.tokens || []));\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tif (!node.content) return \"\";\n\t\tconst prefix = \">\";\n\t\tconst result = [];\n\t\tnode.content.forEach((child, index) => {\n\t\t\tvar _h$renderChild, _h$renderChild2;\n\t\t\tconst linesWithPrefix = ((_h$renderChild = (_h$renderChild2 = h.renderChild) === null || _h$renderChild2 === void 0 ? void 0 : _h$renderChild2.call(h, child, index)) !== null && _h$renderChild !== void 0 ? _h$renderChild : h.renderChildren([child])).split(\"\\n\").map((line) => {\n\t\t\t\tif (line.trim() === \"\") return prefix;\n\t\t\t\treturn `${prefix} ${line}`;\n\t\t\t});\n\t\t\tresult.push(linesWithPrefix.join(\"\\n\"));\n\t\t});\n\t\treturn result.join(`\\n${prefix}\\n`);\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetBlockquote: () => ({ commands }) => {\n\t\t\t\treturn commands.wrapIn(this.name);\n\t\t\t},\n\t\t\ttoggleBlockquote: () => ({ commands }) => {\n\t\t\t\treturn commands.toggleWrap(this.name);\n\t\t\t},\n\t\t\tunsetBlockquote: () => ({ commands }) => {\n\t\t\t\treturn commands.lift(this.name);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-Shift-b\": () => this.editor.commands.toggleBlockquote(),\n\t\t\tBackspace: () => handleBackspace(this.editor, this.type)\n\t\t};\n\t},\n\taddInputRules() {\n\t\treturn [wrappingInputRule({\n\t\t\tfind: inputRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Blockquote;\n//#endregion\nexport { Blockquote, src_default as default, inputRegex };\n\n//# sourceMappingURL=index.js.map","import { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nimport { jsx } from \"@tiptap/core/jsx-runtime\";\n//#region src/bold.tsx\n/** @jsxImportSource @tiptap/core */\n/**\n* Matches bold text via `**` as input.\n*/\nconst starInputRegex = /(?:^|\\s)(\\*\\*(?!\\s+\\*\\*)((?:[^*]+))\\*\\*(?!\\s+\\*\\*))$/;\n/**\n* Matches bold text via `**` while pasting.\n*/\nconst starPasteRegex = /(?:^|\\s)(\\*\\*(?!\\s+\\*\\*)((?:[^*]+))\\*\\*(?!\\s+\\*\\*))/g;\n/**\n* Matches bold text via `__` as input.\n*/\nconst underscoreInputRegex = /(?:^|\\s)(__(?!\\s+__)((?:[^_]+))__(?!\\s+__))$/;\n/**\n* Matches bold text via `__` while pasting.\n*/\nconst underscorePasteRegex = /(?:^|\\s)(__(?!\\s+__)((?:[^_]+))__(?!\\s+__))/g;\n/**\n* This extension allows you to mark text as bold.\n* @see https://tiptap.dev/api/marks/bold\n*/\nconst Bold = Mark.create({\n\tname: \"bold\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tparseHTML() {\n\t\treturn [\n\t\t\t{ tag: \"strong\" },\n\t\t\t{\n\t\t\t\ttag: \"b\",\n\t\t\t\tgetAttrs: (node) => node.style.fontWeight !== \"normal\" && null\n\t\t\t},\n\t\t\t{\n\t\t\t\tstyle: \"font-weight=400\",\n\t\t\t\tclearMark: (mark) => mark.type.name === this.name\n\t\t\t},\n\t\t\t{\n\t\t\t\tstyle: \"font-weight\",\n\t\t\t\tgetAttrs: (value) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null\n\t\t\t}\n\t\t];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn /* @__PURE__ */ jsx(\"strong\", {\n\t\t\t...mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\tchildren: /* @__PURE__ */ jsx(\"slot\", {})\n\t\t});\n\t},\n\tmarkdownTokenName: \"strong\",\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.applyMark(\"bold\", helpers.parseInline(token.tokens || []));\n\t},\n\tmarkdownOptions: { htmlReopen: {\n\t\topen: \"<strong>\",\n\t\tclose: \"</strong>\"\n\t} },\n\trenderMarkdown: (node, h) => {\n\t\treturn `**${h.renderChildren(node)}**`;\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetBold: () => ({ commands }) => {\n\t\t\t\treturn commands.setMark(this.name);\n\t\t\t},\n\t\t\ttoggleBold: () => ({ commands }) => {\n\t\t\t\treturn commands.toggleMark(this.name);\n\t\t\t},\n\t\t\tunsetBold: () => ({ commands }) => {\n\t\t\t\treturn commands.unsetMark(this.name);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-b\": () => this.editor.commands.toggleBold(),\n\t\t\t\"Mod-B\": () => this.editor.commands.toggleBold()\n\t\t};\n\t},\n\taddInputRules() {\n\t\treturn [markInputRule({\n\t\t\tfind: starInputRegex,\n\t\t\ttype: this.type\n\t\t}), markInputRule({\n\t\t\tfind: underscoreInputRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t},\n\taddPasteRules() {\n\t\treturn [markPasteRule({\n\t\t\tfind: starPasteRegex,\n\t\t\ttype: this.type\n\t\t}), markPasteRule({\n\t\t\tfind: underscorePasteRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Bold;\n//#endregion\nexport { Bold, src_default as default, starInputRegex, starPasteRegex, underscoreInputRegex, underscorePasteRegex };\n\n//# sourceMappingURL=index.js.map","import { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\n//#region src/code.ts\n/**\n* The regular expression used for the inline code input rule.\n* @deprecated The extension now uses a function-based finder internally.\n* This regex is kept for backward compatibility.\n*/\nconst inputRegex = /(^|[^`])`([^`]+)`(?!`)$/;\n/**\n* The regular expression used for the inline code paste rule.\n* @deprecated The extension now uses a function-based finder internally.\n* This regex is kept for backward compatibility.\n*/\nconst pasteRegex = /(^|[^`])`([^`]+)`(?!`)/g;\n/**\n* A function-based finder for the inline code input rule.\n* Used internally by the extension to ensure the preceding character\n* is not consumed as part of the match, preventing it from being deleted.\n*/\nconst inputRegexMatch = (text) => {\n\tconst match = /`([^`]+)`(?!`)$/.exec(text);\n\tif (!match) return null;\n\tif (match.index > 0 && text[match.index - 1] === \"`\") return null;\n\treturn {\n\t\tindex: match.index,\n\t\ttext: match[0],\n\t\treplaceWith: match[1]\n\t};\n};\n/**\n* A function-based finder for the inline code paste rule.\n* Used internally by the extension to avoid consuming the preceding\n* character as part of the match.\n*/\nconst pasteRegexMatch = (text) => {\n\tconst regex = /`([^`]+)`(?!`)/g;\n\tconst matches = [];\n\tlet match;\n\twhile ((match = regex.exec(text)) !== null) {\n\t\tif (match.index > 0 && text[match.index - 1] === \"`\") continue;\n\t\tmatches.push({\n\t\t\tindex: match.index,\n\t\t\ttext: match[0],\n\t\t\treplaceWith: match[1]\n\t\t});\n\t}\n\treturn matches;\n};\n/**\n* This extension allows you to mark text as inline code.\n* @see https://tiptap.dev/api/marks/code\n*/\nconst Code = Mark.create({\n\tname: \"code\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\texcludes: \"_\",\n\tcode: true,\n\texitable: true,\n\tparseHTML() {\n\t\treturn [{ tag: \"code\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"code\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tmarkdownTokenName: \"codespan\",\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.applyMark(\"code\", [{\n\t\t\ttype: \"text\",\n\t\t\ttext: token.text || \"\"\n\t\t}]);\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tif (!node.content) return \"\";\n\t\treturn `\\`${h.renderChildren(node.content)}\\``;\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetCode: () => ({ commands }) => {\n\t\t\t\treturn commands.setMark(this.name);\n\t\t\t},\n\t\t\ttoggleCode: () => ({ commands }) => {\n\t\t\t\treturn commands.toggleMark(this.name);\n\t\t\t},\n\t\t\tunsetCode: () => ({ commands }) => {\n\t\t\t\treturn commands.unsetMark(this.name);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn { \"Mod-e\": () => this.editor.commands.toggleCode() };\n\t},\n\taddInputRules() {\n\t\treturn [markInputRule({\n\t\t\tfind: inputRegexMatch,\n\t\t\ttype: this.type\n\t\t})];\n\t},\n\taddPasteRules() {\n\t\treturn [markPasteRule({\n\t\t\tfind: pasteRegexMatch,\n\t\t\ttype: this.type\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Code;\n//#endregion\nexport { Code, src_default as default, inputRegex, inputRegexMatch, pasteRegex, pasteRegexMatch };\n\n//# sourceMappingURL=index.js.map","import { Node, mergeAttributes, textblockTypeInputRule } from \"@tiptap/core\";\nimport { Plugin, PluginKey, Selection, TextSelection } from \"@tiptap/pm/state\";\n//#region src/code-block.ts\nconst DEFAULT_TAB_SIZE = 4;\n/**\n* Matches a code block with backticks.\n*/\nconst backtickInputRegex = /^```([a-z]+)?[\\s\\n]$/;\n/**\n* Matches a code block with tildes.\n*/\nconst tildeInputRegex = /^~~~([a-z]+)?[\\s\\n]$/;\n/**\n* This extension allows you to create code blocks.\n* @see https://tiptap.dev/api/nodes/code-block\n*/\nconst CodeBlock = Node.create({\n\tname: \"codeBlock\",\n\taddOptions() {\n\t\treturn {\n\t\t\tlanguageClassPrefix: \"language-\",\n\t\t\texitOnTripleEnter: true,\n\t\t\texitOnArrowDown: true,\n\t\t\texitOnArrowUp: true,\n\t\t\tdefaultLanguage: null,\n\t\t\tenableTabIndentation: false,\n\t\t\ttabSize: DEFAULT_TAB_SIZE,\n\t\t\tHTMLAttributes: {}\n\t\t};\n\t},\n\tcontent: \"text*\",\n\tmarks: \"\",\n\tgroup: \"block\",\n\tcode: true,\n\tdefining: true,\n\taddAttributes() {\n\t\treturn { language: {\n\t\t\tdefault: this.options.defaultLanguage,\n\t\t\tparseHTML: (element) => {\n\t\t\t\tvar _element$firstElement;\n\t\t\t\tconst { languageClassPrefix } = this.options;\n\t\t\t\tif (!languageClassPrefix) return null;\n\t\t\t\tconst language = [...((_element$firstElement = element.firstElementChild) === null || _element$firstElement === void 0 ? void 0 : _element$firstElement.classList) || []].filter((className) => className.startsWith(languageClassPrefix)).map((className) => className.replace(languageClassPrefix, \"\"))[0];\n\t\t\t\tif (!language) return null;\n\t\t\t\treturn language;\n\t\t\t},\n\t\t\trendered: false\n\t\t} };\n\t},\n\tparseHTML() {\n\t\treturn [{\n\t\t\ttag: \"pre\",\n\t\t\tpreserveWhitespace: \"full\"\n\t\t}];\n\t},\n\trenderHTML({ node, HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"pre\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t[\n\t\t\t\t\"code\",\n\t\t\t\t{ class: node.attrs.language ? this.options.languageClassPrefix + node.attrs.language : null },\n\t\t\t\t0\n\t\t\t]\n\t\t];\n\t},\n\tmarkdownTokenName: \"code\",\n\tparseMarkdown: (token, helpers) => {\n\t\tvar _token$raw, _token$raw2;\n\t\tif (((_token$raw = token.raw) === null || _token$raw === void 0 ? void 0 : _token$raw.startsWith(\"```\")) === false && ((_token$raw2 = token.raw) === null || _token$raw2 === void 0 ? void 0 : _token$raw2.startsWith(\"~~~\")) === false && token.codeBlockStyle !== \"indented\") return [];\n\t\treturn helpers.createNode(\"codeBlock\", { language: token.lang || null }, token.text ? [helpers.createTextNode(token.text)] : []);\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tvar _node$attrs;\n\t\tlet output = \"\";\n\t\tconst language = ((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.language) || \"\";\n\t\tif (!node.content) output = `\\`\\`\\`${language}\\n\\n\\`\\`\\``;\n\t\telse output = [\n\t\t\t`\\`\\`\\`${language}`,\n\t\t\th.renderChildren(node.content),\n\t\t\t\"```\"\n\t\t].join(\"\\n\");\n\t\treturn output;\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetCodeBlock: (attributes) => ({ commands }) => {\n\t\t\t\treturn commands.setNode(this.name, attributes);\n\t\t\t},\n\t\t\ttoggleCodeBlock: (attributes) => ({ commands }) => {\n\t\t\t\treturn commands.toggleNode(this.name, \"paragraph\", attributes);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-Alt-c\": () => this.editor.commands.toggleCodeBlock(),\n\t\t\tBackspace: () => {\n\t\t\t\tconst { empty, $anchor } = this.editor.state.selection;\n\t\t\t\tconst isAtStart = $anchor.pos === 1;\n\t\t\t\tif (!empty || $anchor.parent.type.name !== this.name) return false;\n\t\t\t\tif (isAtStart || !$anchor.parent.textContent.length) return this.editor.commands.clearNodes();\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tTab: ({ editor }) => {\n\t\t\t\tvar _this$options$tabSize;\n\t\t\t\tif (!this.options.enableTabIndentation) return false;\n\t\t\t\tconst tabSize = (_this$options$tabSize = this.options.tabSize) !== null && _this$options$tabSize !== void 0 ? _this$options$tabSize : DEFAULT_TAB_SIZE;\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { selection } = state;\n\t\t\t\tconst { $from, empty } = selection;\n\t\t\t\tif ($from.parent.type !== this.type) return false;\n\t\t\t\tconst indent = \" \".repeat(tabSize);\n\t\t\t\tif (empty) return editor.commands.insertContent(indent);\n\t\t\t\treturn editor.commands.command(({ tr }) => {\n\t\t\t\t\tconst { from, to } = selection;\n\t\t\t\t\tconst indentedText = state.doc.textBetween(from, to, \"\\n\", \"\\n\").split(\"\\n\").map((line) => indent + line).join(\"\\n\");\n\t\t\t\t\ttr.replaceWith(from, to, state.schema.text(indentedText));\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"Shift-Tab\": ({ editor }) => {\n\t\t\t\tvar _this$options$tabSize2;\n\t\t\t\tif (!this.options.enableTabIndentation) return false;\n\t\t\t\tconst tabSize = (_this$options$tabSize2 = this.options.tabSize) !== null && _this$options$tabSize2 !== void 0 ? _this$options$tabSize2 : DEFAULT_TAB_SIZE;\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { selection } = state;\n\t\t\t\tconst { $from, empty } = selection;\n\t\t\t\tif ($from.parent.type !== this.type) return false;\n\t\t\t\tif (empty) return editor.commands.command(({ tr }) => {\n\t\t\t\t\tvar _currentLine$match;\n\t\t\t\t\tconst { pos } = $from;\n\t\t\t\t\tconst codeBlockStart = $from.start();\n\t\t\t\t\tconst codeBlockEnd = $from.end();\n\t\t\t\t\tconst lines = state.doc.textBetween(codeBlockStart, codeBlockEnd, \"\\n\", \"\\n\").split(\"\\n\");\n\t\t\t\t\tlet currentLineIndex = 0;\n\t\t\t\t\tlet charCount = 0;\n\t\t\t\t\tconst relativeCursorPos = pos - codeBlockStart;\n\t\t\t\t\tfor (let i = 0; i < lines.length; i += 1) {\n\t\t\t\t\t\tif (charCount + lines[i].length >= relativeCursorPos) {\n\t\t\t\t\t\t\tcurrentLineIndex = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcharCount += lines[i].length + 1;\n\t\t\t\t\t}\n\t\t\t\t\tconst leadingSpaces = ((_currentLine$match = lines[currentLineIndex].match(/^ */)) === null || _currentLine$match === void 0 ? void 0 : _currentLine$match[0]) || \"\";\n\t\t\t\t\tconst spacesToRemove = Math.min(leadingSpaces.length, tabSize);\n\t\t\t\t\tif (spacesToRemove === 0) return true;\n\t\t\t\t\tlet lineStartPos = codeBlockStart;\n\t\t\t\t\tfor (let i = 0; i < currentLineIndex; i += 1) lineStartPos += lines[i].length + 1;\n\t\t\t\t\ttr.delete(lineStartPos, lineStartPos + spacesToRemove);\n\t\t\t\t\tif (pos - lineStartPos <= spacesToRemove) tr.setSelection(TextSelection.create(tr.doc, lineStartPos));\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t\treturn editor.commands.command(({ tr }) => {\n\t\t\t\t\tconst { from, to } = selection;\n\t\t\t\t\tconst reverseIndentText = state.doc.textBetween(from, to, \"\\n\", \"\\n\").split(\"\\n\").map((line) => {\n\t\t\t\t\t\tvar _line$match;\n\t\t\t\t\t\tconst leadingSpaces = ((_line$match = line.match(/^ */)) === null || _line$match === void 0 ? void 0 : _line$match[0]) || \"\";\n\t\t\t\t\t\tconst spacesToRemove = Math.min(leadingSpaces.length, tabSize);\n\t\t\t\t\t\treturn line.slice(spacesToRemove);\n\t\t\t\t\t}).join(\"\\n\");\n\t\t\t\t\ttr.replaceWith(from, to, state.schema.text(reverseIndentText));\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t},\n\t\t\tEnter: ({ editor }) => {\n\t\t\t\tif (!this.options.exitOnTripleEnter) return false;\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { selection } = state;\n\t\t\t\tconst { $from, empty } = selection;\n\t\t\t\tif (!empty || $from.parent.type !== this.type) return false;\n\t\t\t\tconst isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2;\n\t\t\t\tconst endsWithDoubleNewline = $from.parent.textContent.endsWith(\"\\n\\n\");\n\t\t\t\tif (!isAtEnd || !endsWithDoubleNewline) return false;\n\t\t\t\treturn editor.chain().command(({ tr }) => {\n\t\t\t\t\ttr.delete($from.pos - 2, $from.pos);\n\t\t\t\t\treturn true;\n\t\t\t\t}).exitCode().run();\n\t\t\t},\n\t\t\tArrowUp: ({ editor }) => {\n\t\t\t\tif (!this.options.exitOnArrowUp) return false;\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { selection } = state;\n\t\t\t\tconst { $from, empty } = selection;\n\t\t\t\tif (!empty || $from.parent.type !== this.type) return false;\n\t\t\t\tif ($from.parentOffset !== 0) return false;\n\t\t\t\tconst before = $from.before();\n\t\t\t\tif (before > 0) return false;\n\t\t\t\treturn editor.commands.insertDefaultBlock({ pos: before });\n\t\t\t},\n\t\t\tArrowDown: ({ editor }) => {\n\t\t\t\tif (!this.options.exitOnArrowDown) return false;\n\t\t\t\tconst { state } = editor;\n\t\t\t\tconst { selection, doc } = state;\n\t\t\t\tconst { $from, empty } = selection;\n\t\t\t\tif (!empty || $from.parent.type !== this.type) return false;\n\t\t\t\tif (!($from.parentOffset === $from.parent.nodeSize - 2)) return false;\n\t\t\t\tconst after = $from.after();\n\t\t\t\tif (after === void 0) return false;\n\t\t\t\tif (doc.nodeAt(after)) return editor.commands.command(({ tr }) => {\n\t\t\t\t\ttr.setSelection(Selection.near(doc.resolve(after)));\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t\treturn editor.commands.exitCode();\n\t\t\t}\n\t\t};\n\t},\n\taddInputRules() {\n\t\treturn [textblockTypeInputRule({\n\t\t\tfind: backtickInputRegex,\n\t\t\ttype: this.type,\n\t\t\tgetAttributes: (match) => ({ language: match[1] })\n\t\t}), textblockTypeInputRule({\n\t\t\tfind: tildeInputRegex,\n\t\t\ttype: this.type,\n\t\t\tgetAttributes: (match) => ({ language: match[1] })\n\t\t})];\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"codeBlockVSCodeHandler\"),\n\t\t\tprops: { handlePaste: (view, event) => {\n\t\t\t\tif (!event.clipboardData) return false;\n\t\t\t\tif (this.editor.isActive(this.type.name)) return false;\n\t\t\t\tconst text = event.clipboardData.getData(\"text/plain\");\n\t\t\t\tconst vscode = event.clipboardData.getData(\"vscode-editor-data\");\n\t\t\t\tconst vscodeData = vscode ? JSON.parse(vscode) : void 0;\n\t\t\t\tconst language = vscodeData === null || vscodeData === void 0 ? void 0 : vscodeData.mode;\n\t\t\t\tif (!text || !language) return false;\n\t\t\t\tconst { tr, schema } = view.state;\n\t\t\t\tconst textNode = schema.text(text.replace(/\\r\\n?/g, \"\\n\"));\n\t\t\t\ttr.replaceSelectionWith(this.type.create({ language }, textNode));\n\t\t\t\tif (tr.selection.$from.parent.type !== this.type) tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, tr.selection.from - 2))));\n\t\t\t\ttr.setMeta(\"paste\", true);\n\t\t\t\tview.dispatch(tr);\n\t\t\t\treturn true;\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = CodeBlock;\n//#endregion\nexport { CodeBlock, backtickInputRegex, src_default as default, tildeInputRegex };\n\n//# sourceMappingURL=index.js.map","import { Node } from \"@tiptap/core\";\n//#region src/document.ts\n/**\n* The default document node which represents the top level node of the editor.\n* @see https://tiptap.dev/api/nodes/document\n*/\nconst Document = Node.create({\n\tname: \"doc\",\n\ttopNode: true,\n\tcontent: \"block+\",\n\trenderMarkdown: (node, h) => {\n\t\tif (!node.content) return \"\";\n\t\treturn h.renderChildren(node.content, \"\\n\\n\");\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Document;\n//#endregion\nexport { Document, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Node, mergeAttributes } from \"@tiptap/core\";\n//#region src/hard-break.ts\n/**\n* This extension allows you to insert hard breaks.\n* @see https://www.tiptap.dev/api/nodes/hard-break\n*/\nconst HardBreak = Node.create({\n\tname: \"hardBreak\",\n\tmarkdownTokenName: \"br\",\n\taddOptions() {\n\t\treturn {\n\t\t\tkeepMarks: true,\n\t\t\tHTMLAttributes: {}\n\t\t};\n\t},\n\tinline: true,\n\tgroup: \"inline\",\n\tselectable: false,\n\tlinebreakReplacement: true,\n\tparseHTML() {\n\t\treturn [{ tag: \"br\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\"br\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n\t},\n\trenderText() {\n\t\treturn \"\\n\";\n\t},\n\trenderMarkdown: () => `  \\n`,\n\tparseMarkdown: () => {\n\t\treturn { type: \"hardBreak\" };\n\t},\n\taddCommands() {\n\t\treturn { setHardBreak: () => ({ commands, chain, state, editor }) => {\n\t\t\treturn commands.first([() => commands.exitCode(), () => commands.command(() => {\n\t\t\t\tconst { selection, storedMarks } = state;\n\t\t\t\tif (selection.$from.parent.type.spec.isolating) return false;\n\t\t\t\tconst { keepMarks } = this.options;\n\t\t\t\tconst { splittableMarks } = editor.extensionManager;\n\t\t\t\tconst marks = storedMarks || selection.$to.parentOffset && selection.$from.marks();\n\t\t\t\treturn chain().insertContent({ type: this.name }).command(({ tr, dispatch }) => {\n\t\t\t\t\tif (dispatch && marks && keepMarks) {\n\t\t\t\t\t\tconst filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name));\n\t\t\t\t\t\ttr.ensureMarks(filteredMarks);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}).scrollIntoView().run();\n\t\t\t})]);\n\t\t} };\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-Enter\": () => this.editor.commands.setHardBreak(),\n\t\t\t\"Shift-Enter\": () => this.editor.commands.setHardBreak()\n\t\t};\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = HardBreak;\n//#endregion\nexport { HardBreak, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Node, mergeAttributes, textblockTypeInputRule } from \"@tiptap/core\";\n//#region src/heading.ts\n/**\n* This extension allows you to create headings.\n* @see https://www.tiptap.dev/api/nodes/heading\n*/\nconst Heading = Node.create({\n\tname: \"heading\",\n\taddOptions() {\n\t\treturn {\n\t\t\tlevels: [\n\t\t\t\t1,\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\t4,\n\t\t\t\t5,\n\t\t\t\t6\n\t\t\t],\n\t\t\tHTMLAttributes: {}\n\t\t};\n\t},\n\tcontent: \"inline*\",\n\tgroup: \"block\",\n\tdefining: true,\n\taddAttributes() {\n\t\treturn { level: {\n\t\t\tdefault: 1,\n\t\t\trendered: false\n\t\t} };\n\t},\n\tparseHTML() {\n\t\treturn this.options.levels.map((level) => ({\n\t\t\ttag: `h${level}`,\n\t\t\tattrs: { level }\n\t\t}));\n\t},\n\trenderHTML({ node, HTMLAttributes }) {\n\t\treturn [\n\t\t\t`h${this.options.levels.includes(node.attrs.level) ? node.attrs.level : this.options.levels[0]}`,\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.createNode(\"heading\", { level: token.depth || 1 }, helpers.parseInline(token.tokens || []));\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tvar _node$attrs;\n\t\tconst level = ((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.level) ? parseInt(node.attrs.level, 10) : 1;\n\t\tconst headingChars = \"#\".repeat(level);\n\t\tif (!node.content) return \"\";\n\t\treturn `${headingChars} ${h.renderChildren(node.content)}`;\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetHeading: (attributes) => ({ commands }) => {\n\t\t\t\tif (!this.options.levels.includes(attributes.level)) return false;\n\t\t\t\treturn commands.setNode(this.name, attributes);\n\t\t\t},\n\t\t\ttoggleHeading: (attributes) => ({ commands }) => {\n\t\t\t\tif (!this.options.levels.includes(attributes.level)) return false;\n\t\t\t\treturn commands.toggleNode(this.name, \"paragraph\", attributes);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn this.options.levels.reduce((items, level) => ({\n\t\t\t...items,\n\t\t\t[`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level })\n\t\t}), {});\n\t},\n\taddInputRules() {\n\t\treturn this.options.levels.map((level) => {\n\t\t\treturn textblockTypeInputRule({\n\t\t\t\tfind: new RegExp(`^(#{${Math.min(...this.options.levels)},${level}})\\\\s$`),\n\t\t\t\ttype: this.type,\n\t\t\t\tgetAttributes: { level }\n\t\t\t});\n\t\t});\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Heading;\n//#endregion\nexport { Heading, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Node, canInsertNode, isNodeSelection, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\";\n//#region src/horizontal-rule.ts\n/**\n* This extension allows you to insert horizontal rules.\n* @see https://www.tiptap.dev/api/nodes/horizontal-rule\n*/\nconst HorizontalRule = Node.create({\n\tname: \"horizontalRule\",\n\taddOptions() {\n\t\treturn {\n\t\t\tHTMLAttributes: {},\n\t\t\tnextNodeType: \"paragraph\"\n\t\t};\n\t},\n\tgroup: \"block\",\n\tparseHTML() {\n\t\treturn [{ tag: \"hr\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\"hr\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n\t},\n\tmarkdownTokenName: \"hr\",\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.createNode(\"horizontalRule\");\n\t},\n\trenderMarkdown: () => {\n\t\treturn \"---\";\n\t},\n\taddCommands() {\n\t\treturn { setHorizontalRule: () => ({ chain, state }) => {\n\t\t\tif (!canInsertNode(state, state.schema.nodes[this.name])) return false;\n\t\t\tconst { selection } = state;\n\t\t\tconst { $to: $originTo } = selection;\n\t\t\tconst currentChain = chain();\n\t\t\tif (isNodeSelection(selection)) currentChain.insertContentAt($originTo.pos, { type: this.name });\n\t\t\telse currentChain.insertContent({ type: this.name });\n\t\t\treturn currentChain.command(({ state: chainState, tr, dispatch }) => {\n\t\t\t\tif (dispatch) {\n\t\t\t\t\tconst { $to } = tr.selection;\n\t\t\t\t\tconst posAfter = $to.end();\n\t\t\t\t\tif ($to.nodeAfter) {\n\t\t\t\t\t\tif ($to.nodeAfter.isTextblock) tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1));\n\t\t\t\t\t\telse if ($to.nodeAfter.isBlock) tr.setSelection(NodeSelection.create(tr.doc, $to.pos));\n\t\t\t\t\t\telse tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst nodeType = chainState.schema.nodes[this.options.nextNodeType] || $to.parent.type.contentMatch.defaultType;\n\t\t\t\t\t\tconst node = nodeType === null || nodeType === void 0 ? void 0 : nodeType.create();\n\t\t\t\t\t\tif (node) {\n\t\t\t\t\t\t\ttr.insert(posAfter, node);\n\t\t\t\t\t\t\ttr.setSelection(TextSelection.create(tr.doc, posAfter + 1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttr.scrollIntoView();\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}).run();\n\t\t} };\n\t},\n\taddInputRules() {\n\t\treturn [nodeInputRule({\n\t\t\tfind: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n\t\t\ttype: this.type\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = HorizontalRule;\n//#endregion\nexport { HorizontalRule, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\n//#region src/italic.ts\n/**\n* Matches an italic to a *italic* on input.\n*/\nconst starInputRegex = /(?:^|\\s)(\\*(?!\\s+\\*)((?:[^*]+))\\*(?!\\s+\\*))$/;\n/**\n* Matches an italic to a *italic* on paste.\n*/\nconst starPasteRegex = /(?:^|\\s)(\\*(?!\\s+\\*)((?:[^*]+))\\*(?!\\s+\\*))/g;\n/**\n* Matches an italic to a _italic_ on input.\n*/\nconst underscoreInputRegex = /(?:^|\\s)(_(?!\\s+_)((?:[^_]+))_(?!\\s+_))$/;\n/**\n* Matches an italic to a _italic_ on paste.\n*/\nconst underscorePasteRegex = /(?:^|\\s)(_(?!\\s+_)((?:[^_]+))_(?!\\s+_))/g;\n/**\n* This extension allows you to create italic text.\n* @see https://www.tiptap.dev/api/marks/italic\n*/\nconst Italic = Mark.create({\n\tname: \"italic\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tparseHTML() {\n\t\treturn [\n\t\t\t{ tag: \"em\" },\n\t\t\t{\n\t\t\t\ttag: \"i\",\n\t\t\t\tgetAttrs: (node) => node.style.fontStyle !== \"normal\" && null\n\t\t\t},\n\t\t\t{\n\t\t\t\tstyle: \"font-style=normal\",\n\t\t\t\tclearMark: (mark) => mark.type.name === this.name\n\t\t\t},\n\t\t\t{ style: \"font-style=italic\" }\n\t\t];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"em\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetItalic: () => ({ commands }) => {\n\t\t\t\treturn commands.setMark(this.name);\n\t\t\t},\n\t\t\ttoggleItalic: () => ({ commands }) => {\n\t\t\t\treturn commands.toggleMark(this.name);\n\t\t\t},\n\t\t\tunsetItalic: () => ({ commands }) => {\n\t\t\t\treturn commands.unsetMark(this.name);\n\t\t\t}\n\t\t};\n\t},\n\tmarkdownTokenName: \"em\",\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.applyMark(\"italic\", helpers.parseInline(token.tokens || []));\n\t},\n\tmarkdownOptions: { htmlReopen: {\n\t\topen: \"<em>\",\n\t\tclose: \"</em>\"\n\t} },\n\trenderMarkdown: (node, h) => {\n\t\treturn `*${h.renderChildren(node)}*`;\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-i\": () => this.editor.commands.toggleItalic(),\n\t\t\t\"Mod-I\": () => this.editor.commands.toggleItalic()\n\t\t};\n\t},\n\taddInputRules() {\n\t\treturn [markInputRule({\n\t\t\tfind: starInputRegex,\n\t\t\ttype: this.type\n\t\t}), markInputRule({\n\t\t\tfind: underscoreInputRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t},\n\taddPasteRules() {\n\t\treturn [markPasteRule({\n\t\t\tfind: starPasteRegex,\n\t\t\ttype: this.type\n\t\t}), markPasteRule({\n\t\t\tfind: underscorePasteRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Italic;\n//#endregion\nexport { Italic, src_default as default, starInputRegex, starPasteRegex, underscoreInputRegex, underscorePasteRegex };\n\n//# sourceMappingURL=index.js.map","// THIS FILE IS AUTOMATICALLY GENERATED DO NOT EDIT DIRECTLY\n// See update-tlds.js for encoding/decoding format\n// https://data.iana.org/TLD/tlds-alpha-by-domain.txt\nconst encodedTlds = 'aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4w0s2x0a2z0ure5ba0by2idu3namex4d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dad1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2odyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3nd0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rck0msd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0axi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp3ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2oodside6rk0s2ld3w2s1tc1f3xbox3erox4ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2';\n// Internationalized domain names containing non-ASCII\nconst encodedUtlds = 'ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2';\n\n/**\n * Finite State Machine generation utilities\n */\n\n/**\n * @template T\n * @typedef {{ [group: string]: T[] }} Collections\n */\n\n/**\n * @typedef {{ [group: string]: true }} Flags\n */\n\n// Keys in scanner Collections instances\nconst numeric = 'numeric';\nconst ascii = 'ascii';\nconst alpha = 'alpha';\nconst asciinumeric = 'asciinumeric';\nconst alphanumeric = 'alphanumeric';\nconst domain = 'domain';\nconst emoji = 'emoji';\nconst scheme = 'scheme';\nconst slashscheme = 'slashscheme';\nconst whitespace = 'whitespace';\n\n/**\n * @template T\n * @param {string} name\n * @param {Collections<T>} groups to register in\n * @returns {T[]} Current list of tokens in the given collection\n */\nfunction registerGroup(name, groups) {\n  if (!(name in groups)) {\n    groups[name] = [];\n  }\n  return groups[name];\n}\n\n/**\n * @template T\n * @param {T} t token to add\n * @param {Collections<T>} groups\n * @param {Flags} flags\n */\nfunction addToGroups(t, flags, groups) {\n  if (flags[numeric]) {\n    flags[asciinumeric] = true;\n    flags[alphanumeric] = true;\n  }\n  if (flags[ascii]) {\n    flags[asciinumeric] = true;\n    flags[alpha] = true;\n  }\n  if (flags[asciinumeric]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alpha]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alphanumeric]) {\n    flags[domain] = true;\n  }\n  if (flags[emoji]) {\n    flags[domain] = true;\n  }\n  for (const k in flags) {\n    const group = registerGroup(k, groups);\n    if (group.indexOf(t) < 0) {\n      group.push(t);\n    }\n  }\n}\n\n/**\n * @template T\n * @param {T} t token to check\n * @param {Collections<T>} groups\n * @returns {Flags} group flags that contain this token\n */\nfunction flagsForToken(t, groups) {\n  const result = {};\n  for (const c in groups) {\n    if (groups[c].indexOf(t) >= 0) {\n      result[c] = true;\n    }\n  }\n  return result;\n}\n\n/**\n * @template T\n * @typedef {null | T } Transition\n */\n\n/**\n * Define a basic state machine state. j is the list of character transitions,\n * jr is the list of regex-match transitions, jd is the default state to\n * transition to t is the accepting token type, if any. If this is the terminal\n * state, then it does not emit a token.\n *\n * The template type T represents the type of the token this state accepts. This\n * should be a string (such as of the token exports in `text.js`) or a\n * MultiToken subclass (from `multi.js`)\n *\n * @template T\n * @param {T} [token] Token that this state emits\n */\nfunction State(token = null) {\n  // this.n = null; // DEBUG: State name\n  /** @type {{ [input: string]: State<T> }} j */\n  this.j = {}; // IMPLEMENTATION 1\n  // this.j = []; // IMPLEMENTATION 2\n  /** @type {[RegExp, State<T>][]} jr */\n  this.jr = [];\n  /** @type {?State<T>} jd */\n  this.jd = null;\n  /** @type {?T} t */\n  this.t = token;\n}\n\n/**\n * Scanner token groups\n * @type Collections<string>\n */\nState.groups = {};\nState.prototype = {\n  accepts() {\n    return !!this.t;\n  },\n  /**\n   * Follow an existing transition from the given input to the next state.\n   * Does not mutate.\n   * @param {string} input character or token type to transition on\n   * @returns {?State<T>} the next state, if any\n   */\n  go(input) {\n    const state = this;\n    const nextState = state.j[input];\n    if (nextState) {\n      return nextState;\n    }\n    for (let i = 0; i < state.jr.length; i++) {\n      const regex = state.jr[i][0];\n      const nextState = state.jr[i][1]; // note: might be empty to prevent default jump\n      if (nextState && regex.test(input)) {\n        return nextState;\n      }\n    }\n    // Nowhere left to jump! Return default, if any\n    return state.jd;\n  },\n  /**\n   * Whether the state has a transition for the given input. Set the second\n   * argument to true to only look for an exact match (and not a default or\n   * regular-expression-based transition)\n   * @param {string} input\n   * @param {boolean} exactOnly\n   */\n  has(input, exactOnly = false) {\n    return exactOnly ? input in this.j : !!this.go(input);\n  },\n  /**\n   * Short for \"transition all\"; create a transition from the array of items\n   * in the given list to the same final resulting state.\n   * @param {string | string[]} inputs Group of inputs to transition on\n   * @param {Transition<T> | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   */\n  ta(inputs, next, flags, groups) {\n    for (let i = 0; i < inputs.length; i++) {\n      this.tt(inputs[i], next, flags, groups);\n    }\n  },\n  /**\n   * Short for \"take regexp transition\"; defines a transition for this state\n   * when it encounters a token which matches the given regular expression\n   * @param {RegExp} regexp Regular expression transition (populate first)\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  tr(regexp, next, flags, groups) {\n    groups = groups || State.groups;\n    let nextState;\n    if (next && next.j) {\n      nextState = next;\n    } else {\n      // Token with maybe token groups\n      nextState = new State(next);\n      if (flags && groups) {\n        addToGroups(next, flags, groups);\n      }\n    }\n    this.jr.push([regexp, nextState]);\n    return nextState;\n  },\n  /**\n   * Short for \"take transitions\", will take as many sequential transitions as\n   * the length of the given input and returns the\n   * resulting final state.\n   * @param {string | string[]} input\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  ts(input, next, flags, groups) {\n    let state = this;\n    const len = input.length;\n    if (!len) {\n      return state;\n    }\n    for (let i = 0; i < len - 1; i++) {\n      state = state.tt(input[i]);\n    }\n    return state.tt(input[len - 1], next, flags, groups);\n  },\n  /**\n   * Short for \"take transition\", this is a method for building/working with\n   * state machines.\n   *\n   * If a state already exists for the given input, returns it.\n   *\n   * If a token is specified, that state will emit that token when reached by\n   * the linkify engine.\n   *\n   * If no state exists, it will be initialized with some default transitions\n   * that resemble existing default transitions.\n   *\n   * If a state is given for the second argument, that state will be\n   * transitioned to on the given input regardless of what that input\n   * previously did.\n   *\n   * Specify a token group flags to define groups that this token belongs to.\n   * The token will be added to corresponding entires in the given groups\n   * object.\n   *\n   * @param {string} input character, token type to transition on\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of groups\n   * @returns {State<T>} taken after the given input\n   */\n  tt(input, next, flags, groups) {\n    groups = groups || State.groups;\n    const state = this;\n\n    // Check if existing state given, just a basic transition\n    if (next && next.j) {\n      state.j[input] = next;\n      return next;\n    }\n    const t = next;\n\n    // Take the transition with the usual default mechanisms and use that as\n    // a template for creating the next state\n    let nextState,\n      templateState = state.go(input);\n    if (templateState) {\n      nextState = new State();\n      Object.assign(nextState.j, templateState.j);\n      nextState.jr.push.apply(nextState.jr, templateState.jr);\n      nextState.jd = templateState.jd;\n      nextState.t = templateState.t;\n    } else {\n      nextState = new State();\n    }\n    if (t) {\n      // Ensure newly token is in the same groups as the old token\n      if (groups) {\n        if (nextState.t && typeof nextState.t === 'string') {\n          const allFlags = Object.assign(flagsForToken(nextState.t, groups), flags);\n          addToGroups(t, allFlags, groups);\n        } else if (flags) {\n          addToGroups(t, flags, groups);\n        }\n      }\n      nextState.t = t; // overwrite anything that was previously there\n    }\n    state.j[input] = nextState;\n    return nextState;\n  }\n};\n\n// Helper functions to improve minification (not exported outside linkifyjs module)\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {RegExp} regexp\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string} input\n * @param {T | State<T>} [next]\n * @param {Collections<T>} [groups]\n * @param {Flags} [flags]\n */\nconst tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);\n\n/******************************************************************************\nText Tokens\nIdentifiers for token outputs from the regexp scanner\n******************************************************************************/\n\n// A valid web domain token\nconst WORD = 'WORD'; // only contains a-z\nconst UWORD = 'UWORD'; // contains letters other than a-z, used for IDN\nconst ASCIINUMERICAL = 'ASCIINUMERICAL'; // contains a-z, 0-9\nconst ALPHANUMERICAL = 'ALPHANUMERICAL'; // contains numbers and letters other than a-z, used for IDN\n\n// Special case of word\nconst LOCALHOST = 'LOCALHOST';\n\n// Valid top-level domain, special case of WORD (see tlds.js)\nconst TLD = 'TLD';\n\n// Valid IDN TLD, special case of UWORD (see tlds.js)\nconst UTLD = 'UTLD';\n\n// The scheme portion of a web URI protocol. Supported types include: `mailto`,\n// `file`, and user-defined custom protocols. Limited to schemes that contain\n// only letters\nconst SCHEME = 'SCHEME';\n\n// Similar to SCHEME, except makes distinction for schemes that must always be\n// followed by `://`, not just `:`. Supported types include `http`, `https`,\n// `ftp`, `ftps`\nconst SLASH_SCHEME = 'SLASH_SCHEME';\n\n// Any sequence of digits 0-9\nconst NUM = 'NUM';\n\n// Any number of consecutive whitespace characters that are not newline\nconst WS = 'WS';\n\n// New line (unix style)\nconst NL = 'NL'; // \\n\n\n// Opening/closing bracket classes\n// TODO: Rename OPEN -> LEFT and CLOSE -> RIGHT in v5 to fit with Unicode names\n// Also rename angle brackes to LESSTHAN and GREATER THAN\nconst OPENBRACE = 'OPENBRACE'; // {\nconst CLOSEBRACE = 'CLOSEBRACE'; // }\nconst OPENBRACKET = 'OPENBRACKET'; // [\nconst CLOSEBRACKET = 'CLOSEBRACKET'; // ]\nconst OPENPAREN = 'OPENPAREN'; // (\nconst CLOSEPAREN = 'CLOSEPAREN'; // )\nconst OPENANGLEBRACKET = 'OPENANGLEBRACKET'; // <\nconst CLOSEANGLEBRACKET = 'CLOSEANGLEBRACKET'; // >\nconst FULLWIDTHLEFTPAREN = 'FULLWIDTHLEFTPAREN'; // （\nconst FULLWIDTHRIGHTPAREN = 'FULLWIDTHRIGHTPAREN'; // ）\nconst LEFTCORNERBRACKET = 'LEFTCORNERBRACKET'; // 「\nconst RIGHTCORNERBRACKET = 'RIGHTCORNERBRACKET'; // 」\nconst LEFTWHITECORNERBRACKET = 'LEFTWHITECORNERBRACKET'; // 『\nconst RIGHTWHITECORNERBRACKET = 'RIGHTWHITECORNERBRACKET'; // 』\nconst FULLWIDTHLESSTHAN = 'FULLWIDTHLESSTHAN'; // ＜\nconst FULLWIDTHGREATERTHAN = 'FULLWIDTHGREATERTHAN'; // ＞\n\n// Various symbols\nconst AMPERSAND = 'AMPERSAND'; // &\nconst APOSTROPHE = 'APOSTROPHE'; // '\nconst ASTERISK = 'ASTERISK'; // *\nconst AT = 'AT'; // @\nconst BACKSLASH = 'BACKSLASH'; // \\\nconst BACKTICK = 'BACKTICK'; // `\nconst CARET = 'CARET'; // ^\nconst COLON = 'COLON'; // :\nconst COMMA = 'COMMA'; // ,\nconst DOLLAR = 'DOLLAR'; // $\nconst DOT = 'DOT'; // .\nconst EQUALS = 'EQUALS'; // =\nconst EXCLAMATION = 'EXCLAMATION'; // !\nconst HYPHEN = 'HYPHEN'; // -\nconst PERCENT = 'PERCENT'; // %\nconst PIPE = 'PIPE'; // |\nconst PLUS = 'PLUS'; // +\nconst POUND = 'POUND'; // #\nconst QUERY = 'QUERY'; // ?\nconst QUOTE = 'QUOTE'; // \"\nconst FULLWIDTHMIDDLEDOT = 'FULLWIDTHMIDDLEDOT'; // ・\n\nconst SEMI = 'SEMI'; // ;\nconst SLASH = 'SLASH'; // /\nconst TILDE = 'TILDE'; // ~\nconst UNDERSCORE = 'UNDERSCORE'; // _\n\n// Emoji symbol\nconst EMOJI$1 = 'EMOJI';\n\n// Default token - anything that is not one of the above\nconst SYM = 'SYM';\n\nvar tk = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tALPHANUMERICAL: ALPHANUMERICAL,\n\tAMPERSAND: AMPERSAND,\n\tAPOSTROPHE: APOSTROPHE,\n\tASCIINUMERICAL: ASCIINUMERICAL,\n\tASTERISK: ASTERISK,\n\tAT: AT,\n\tBACKSLASH: BACKSLASH,\n\tBACKTICK: BACKTICK,\n\tCARET: CARET,\n\tCLOSEANGLEBRACKET: CLOSEANGLEBRACKET,\n\tCLOSEBRACE: CLOSEBRACE,\n\tCLOSEBRACKET: CLOSEBRACKET,\n\tCLOSEPAREN: CLOSEPAREN,\n\tCOLON: COLON,\n\tCOMMA: COMMA,\n\tDOLLAR: DOLLAR,\n\tDOT: DOT,\n\tEMOJI: EMOJI$1,\n\tEQUALS: EQUALS,\n\tEXCLAMATION: EXCLAMATION,\n\tFULLWIDTHGREATERTHAN: FULLWIDTHGREATERTHAN,\n\tFULLWIDTHLEFTPAREN: FULLWIDTHLEFTPAREN,\n\tFULLWIDTHLESSTHAN: FULLWIDTHLESSTHAN,\n\tFULLWIDTHMIDDLEDOT: FULLWIDTHMIDDLEDOT,\n\tFULLWIDTHRIGHTPAREN: FULLWIDTHRIGHTPAREN,\n\tHYPHEN: HYPHEN,\n\tLEFTCORNERBRACKET: LEFTCORNERBRACKET,\n\tLEFTWHITECORNERBRACKET: LEFTWHITECORNERBRACKET,\n\tLOCALHOST: LOCALHOST,\n\tNL: NL,\n\tNUM: NUM,\n\tOPENANGLEBRACKET: OPENANGLEBRACKET,\n\tOPENBRACE: OPENBRACE,\n\tOPENBRACKET: OPENBRACKET,\n\tOPENPAREN: OPENPAREN,\n\tPERCENT: PERCENT,\n\tPIPE: PIPE,\n\tPLUS: PLUS,\n\tPOUND: POUND,\n\tQUERY: QUERY,\n\tQUOTE: QUOTE,\n\tRIGHTCORNERBRACKET: RIGHTCORNERBRACKET,\n\tRIGHTWHITECORNERBRACKET: RIGHTWHITECORNERBRACKET,\n\tSCHEME: SCHEME,\n\tSEMI: SEMI,\n\tSLASH: SLASH,\n\tSLASH_SCHEME: SLASH_SCHEME,\n\tSYM: SYM,\n\tTILDE: TILDE,\n\tTLD: TLD,\n\tUNDERSCORE: UNDERSCORE,\n\tUTLD: UTLD,\n\tUWORD: UWORD,\n\tWORD: WORD,\n\tWS: WS\n});\n\n// Note that these two Unicode ones expand into a really big one with Babel\nconst ASCII_LETTER = /[a-z]/;\nconst LETTER = /\\p{L}/u; // Any Unicode character with letter data type\nconst EMOJI = /\\p{Emoji}/u; // Any Unicode emoji character\nconst EMOJI_VARIATION$1 = /\\ufe0f/;\nconst DIGIT = /\\d/;\nconst SPACE = /\\s/;\n\nvar regexp = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tASCII_LETTER: ASCII_LETTER,\n\tDIGIT: DIGIT,\n\tEMOJI: EMOJI,\n\tEMOJI_VARIATION: EMOJI_VARIATION$1,\n\tLETTER: LETTER,\n\tSPACE: SPACE\n});\n\n/**\n\tThe scanner provides an interface that takes a string of text as input, and\n\toutputs an array of tokens instances that can be used for easy URL parsing.\n*/\n\nconst CR = '\\r'; // carriage-return character\nconst LF = '\\n'; // line-feed character\nconst EMOJI_VARIATION = '\\ufe0f'; // Variation selector, follows heart and others\nconst EMOJI_JOINER = '\\u200d'; // zero-width joiner\nconst OBJECT_REPLACEMENT = '\\ufffc'; // whitespace placeholder that sometimes appears in rich text editors\n\nlet tlds = null,\n  utlds = null; // don't change so only have to be computed once\n\n/**\n * Scanner output token:\n * - `t` is the token name (e.g., 'NUM', 'EMOJI', 'TLD')\n * - `v` is the value of the token (e.g., '123', '❤️', 'com')\n * - `s` is the start index of the token in the original string\n * - `e` is the end index of the token in the original string\n * @typedef {{t: string, v: string, s: number, e: number}} Token\n */\n\n/**\n * @template T\n * @typedef {{ [collection: string]: T[] }} Collections\n */\n\n/**\n * Initialize the scanner character-based state machine for the given start\n * state\n * @param {[string, boolean][]} customSchemes List of custom schemes, where each\n * item is a length-2 tuple with the first element set to the string scheme, and\n * the second element set to `true` if the `://` after the scheme is optional\n */\nfunction init$2(customSchemes = []) {\n  // Frequently used states (name argument removed during minification)\n  /** @type Collections<string> */\n  const groups = {}; // of tokens\n  State.groups = groups;\n  /** @type State<string> */\n  const Start = new State();\n  if (tlds == null) {\n    tlds = decodeTlds(encodedTlds);\n  }\n  if (utlds == null) {\n    utlds = decodeTlds(encodedUtlds);\n  }\n\n  // States for special URL symbols that accept immediately after start\n  tt(Start, \"'\", APOSTROPHE);\n  tt(Start, '{', OPENBRACE);\n  tt(Start, '}', CLOSEBRACE);\n  tt(Start, '[', OPENBRACKET);\n  tt(Start, ']', CLOSEBRACKET);\n  tt(Start, '(', OPENPAREN);\n  tt(Start, ')', CLOSEPAREN);\n  tt(Start, '<', OPENANGLEBRACKET);\n  tt(Start, '>', CLOSEANGLEBRACKET);\n  tt(Start, '（', FULLWIDTHLEFTPAREN);\n  tt(Start, '）', FULLWIDTHRIGHTPAREN);\n  tt(Start, '「', LEFTCORNERBRACKET);\n  tt(Start, '」', RIGHTCORNERBRACKET);\n  tt(Start, '『', LEFTWHITECORNERBRACKET);\n  tt(Start, '』', RIGHTWHITECORNERBRACKET);\n  tt(Start, '＜', FULLWIDTHLESSTHAN);\n  tt(Start, '＞', FULLWIDTHGREATERTHAN);\n  tt(Start, '&', AMPERSAND);\n  tt(Start, '*', ASTERISK);\n  tt(Start, '@', AT);\n  tt(Start, '`', BACKTICK);\n  tt(Start, '^', CARET);\n  tt(Start, ':', COLON);\n  tt(Start, ',', COMMA);\n  tt(Start, '$', DOLLAR);\n  tt(Start, '.', DOT);\n  tt(Start, '=', EQUALS);\n  tt(Start, '!', EXCLAMATION);\n  tt(Start, '-', HYPHEN);\n  tt(Start, '%', PERCENT);\n  tt(Start, '|', PIPE);\n  tt(Start, '+', PLUS);\n  tt(Start, '#', POUND);\n  tt(Start, '?', QUERY);\n  tt(Start, '\"', QUOTE);\n  tt(Start, '/', SLASH);\n  tt(Start, ';', SEMI);\n  tt(Start, '~', TILDE);\n  tt(Start, '_', UNDERSCORE);\n  tt(Start, '\\\\', BACKSLASH);\n  tt(Start, '・', FULLWIDTHMIDDLEDOT);\n  const Num = tr(Start, DIGIT, NUM, {\n    [numeric]: true\n  });\n  tr(Num, DIGIT, Num);\n  const Asciinumeric = tr(Num, ASCII_LETTER, ASCIINUMERICAL, {\n    [asciinumeric]: true\n  });\n  const Alphanumeric = tr(Num, LETTER, ALPHANUMERICAL, {\n    [alphanumeric]: true\n  });\n\n  // State which emits a word token\n  const Word = tr(Start, ASCII_LETTER, WORD, {\n    [ascii]: true\n  });\n  tr(Word, DIGIT, Asciinumeric);\n  tr(Word, ASCII_LETTER, Word);\n  tr(Asciinumeric, DIGIT, Asciinumeric);\n  tr(Asciinumeric, ASCII_LETTER, Asciinumeric);\n\n  // Same as previous, but specific to non-fsm.ascii alphabet words\n  const UWord = tr(Start, LETTER, UWORD, {\n    [alpha]: true\n  });\n  tr(UWord, ASCII_LETTER); // Non-accepting\n  tr(UWord, DIGIT, Alphanumeric);\n  tr(UWord, LETTER, UWord);\n  tr(Alphanumeric, DIGIT, Alphanumeric);\n  tr(Alphanumeric, ASCII_LETTER); // Non-accepting\n  tr(Alphanumeric, LETTER, Alphanumeric); // Non-accepting\n\n  // Whitespace jumps\n  // Tokens of only non-newline whitespace are arbitrarily long\n  // If any whitespace except newline, more whitespace!\n  const Nl = tt(Start, LF, NL, {\n    [whitespace]: true\n  });\n  const Cr = tt(Start, CR, WS, {\n    [whitespace]: true\n  });\n  const Ws = tr(Start, SPACE, WS, {\n    [whitespace]: true\n  });\n  tt(Start, OBJECT_REPLACEMENT, Ws);\n  tt(Cr, LF, Nl); // \\r\\n\n  tt(Cr, OBJECT_REPLACEMENT, Ws);\n  tr(Cr, SPACE, Ws);\n  tt(Ws, CR); // non-accepting state to avoid mixing whitespaces\n  tt(Ws, LF); // non-accepting state to avoid mixing whitespaces\n  tr(Ws, SPACE, Ws);\n  tt(Ws, OBJECT_REPLACEMENT, Ws);\n\n  // Emoji tokens. They are not grouped by the scanner except in cases where a\n  // zero-width joiner is present\n  const Emoji = tr(Start, EMOJI, EMOJI$1, {\n    [emoji]: true\n  });\n  tt(Emoji, '#'); // no transition, emoji regex seems to match #\n  tr(Emoji, EMOJI, Emoji);\n  tt(Emoji, EMOJI_VARIATION, Emoji);\n  // tt(Start, EMOJI_VARIATION, Emoji); // This one is sketchy\n\n  const EmojiJoiner = tt(Emoji, EMOJI_JOINER);\n  tt(EmojiJoiner, '#');\n  tr(EmojiJoiner, EMOJI, Emoji);\n  // tt(EmojiJoiner, EMOJI_VARIATION, Emoji); // also sketchy\n\n  // Generates states for top-level domains\n  // Note that this is most accurate when tlds are in alphabetical order\n  const wordjr = [[ASCII_LETTER, Word], [DIGIT, Asciinumeric]];\n  const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord], [DIGIT, Alphanumeric]];\n  for (let i = 0; i < tlds.length; i++) {\n    fastts(Start, tlds[i], TLD, WORD, wordjr);\n  }\n  for (let i = 0; i < utlds.length; i++) {\n    fastts(Start, utlds[i], UTLD, UWORD, uwordjr);\n  }\n  addToGroups(TLD, {\n    tld: true,\n    ascii: true\n  }, groups);\n  addToGroups(UTLD, {\n    utld: true,\n    alpha: true\n  }, groups);\n\n  // Collect the states generated by different protocols. NOTE: If any new TLDs\n  // get added that are also protocols, set the token to be the same as the\n  // protocol to ensure parsing works as expected.\n  fastts(Start, 'file', SCHEME, WORD, wordjr);\n  fastts(Start, 'mailto', SCHEME, WORD, wordjr);\n  fastts(Start, 'http', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'https', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftp', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftps', SLASH_SCHEME, WORD, wordjr);\n  addToGroups(SCHEME, {\n    scheme: true,\n    ascii: true\n  }, groups);\n  addToGroups(SLASH_SCHEME, {\n    slashscheme: true,\n    ascii: true\n  }, groups);\n\n  // Register custom schemes. Assumes each scheme is asciinumeric with hyphens\n  customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1);\n  for (let i = 0; i < customSchemes.length; i++) {\n    const sch = customSchemes[i][0];\n    const optionalSlashSlash = customSchemes[i][1];\n    const flags = optionalSlashSlash ? {\n      [scheme]: true\n    } : {\n      [slashscheme]: true\n    };\n    if (sch.indexOf('-') >= 0) {\n      flags[domain] = true;\n    } else if (!ASCII_LETTER.test(sch)) {\n      flags[numeric] = true; // numbers only\n    } else if (DIGIT.test(sch)) {\n      flags[asciinumeric] = true;\n    } else {\n      flags[ascii] = true;\n    }\n    ts(Start, sch, sch, flags);\n  }\n\n  // Localhost token\n  ts(Start, 'localhost', LOCALHOST, {\n    ascii: true\n  });\n\n  // Set default transition for start state (some symbol)\n  Start.jd = new State(SYM);\n  return {\n    start: Start,\n    tokens: Object.assign({\n      groups\n    }, tk)\n  };\n}\n\n/**\n\tGiven a string, returns an array of TOKEN instances representing the\n\tcomposition of that string.\n\n\t@method run\n\t@param {State<string>} start scanner starting state\n\t@param {string} str input string to scan\n\t@return {Token[]} list of tokens, each with a type and value\n*/\nfunction run$1(start, str) {\n  // State machine is not case sensitive, so input is tokenized in lowercased\n  // form (still returns regular case). Uses selective `toLowerCase` because\n  // lowercasing the entire string causes the length and character position to\n  // vary in some non-English strings with V8-based runtimes.\n  const iterable = stringToArray(str.replace(/[A-Z]/g, c => c.toLowerCase()));\n  const charCount = iterable.length; // <= len if there are emojis, etc\n  const tokens = []; // return value\n\n  // cursor through the string itself, accounting for characters that have\n  // width with length 2 such as emojis\n  let cursor = 0;\n\n  // Cursor through the array-representation of the string\n  let charCursor = 0;\n\n  // Tokenize the string\n  while (charCursor < charCount) {\n    let state = start;\n    let nextState = null;\n    let tokenLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    let charsSinceAccepts = -1;\n    while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) {\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        charsSinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts += iterable[charCursor].length;\n        charsSinceAccepts++;\n      }\n      tokenLength += iterable[charCursor].length;\n      cursor += iterable[charCursor].length;\n      charCursor++;\n    }\n\n    // Roll back to the latest accepting state\n    cursor -= sinceAccepts;\n    charCursor -= charsSinceAccepts;\n    tokenLength -= sinceAccepts;\n\n    // No more jumps, just make a new token from the last accepting one\n    tokens.push({\n      t: latestAccepting.t,\n      // token type/name\n      v: str.slice(cursor - tokenLength, cursor),\n      // string value\n      s: cursor - tokenLength,\n      // start index\n      e: cursor // end index (excluding)\n    });\n  }\n  return tokens;\n}\n\n/**\n * Convert a String to an Array of characters, taking into account that some\n * characters like emojis take up two string indexes.\n *\n * Adapted from core-js (MIT license)\n * https://github.com/zloirock/core-js/blob/2d69cf5f99ab3ea3463c395df81e5a15b68f49d9/packages/core-js/internals/string-multibyte.js\n *\n * @function stringToArray\n * @param {string} str\n * @returns {string[]}\n */\nfunction stringToArray(str) {\n  const result = [];\n  const len = str.length;\n  let index = 0;\n  while (index < len) {\n    let first = str.charCodeAt(index);\n    let second;\n    let char = first < 0xd800 || first > 0xdbff || index + 1 === len || (second = str.charCodeAt(index + 1)) < 0xdc00 || second > 0xdfff ? str[index] // single character\n    : str.slice(index, index + 2); // two-index characters\n    result.push(char);\n    index += char.length;\n  }\n  return result;\n}\n\n/**\n * Fast version of ts function for when transition defaults are well known\n * @param {State<string>} state\n * @param {string} input\n * @param {string} t\n * @param {string} defaultt\n * @param {[RegExp, State<string>][]} jr\n * @returns {State<string>}\n */\nfunction fastts(state, input, t, defaultt, jr) {\n  let next;\n  const len = input.length;\n  for (let i = 0; i < len - 1; i++) {\n    const char = input[i];\n    if (state.j[char]) {\n      next = state.j[char];\n    } else {\n      next = new State(defaultt);\n      next.jr = jr.slice();\n      state.j[char] = next;\n    }\n    state = next;\n  }\n  next = new State(t);\n  next.jr = jr.slice();\n  state.j[input[len - 1]] = next;\n  return next;\n}\n\n/**\n * Converts a string of Top-Level Domain names encoded in update-tlds.js back\n * into a list of strings.\n * @param {str} encoded encoded TLDs string\n * @returns {str[]} original TLDs list\n */\nfunction decodeTlds(encoded) {\n  const words = [];\n  const stack = [];\n  let i = 0;\n  let digits = '0123456789';\n  while (i < encoded.length) {\n    let popDigitCount = 0;\n    while (digits.indexOf(encoded[i + popDigitCount]) >= 0) {\n      popDigitCount++; // encountered some digits, have to pop to go one level up trie\n    }\n    if (popDigitCount > 0) {\n      words.push(stack.join('')); // whatever preceded the pop digits must be a word\n      for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) {\n        stack.pop();\n      }\n      i += popDigitCount;\n    } else {\n      stack.push(encoded[i]); // drop down a level into the trie\n      i++;\n    }\n  }\n  return words;\n}\n\n/**\n * An object where each key is a valid DOM Event Name such as `click` or `focus`\n * and each value is an event handler function.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element#events\n * @typedef {?{ [event: string]: Function }} EventListeners\n */\n\n/**\n * All formatted properties required to render a link, including `tagName`,\n * `attributes`, `content` and `eventListeners`.\n * @typedef {{ tagName: any, attributes: {[attr: string]: any}, content: string,\n * eventListeners: EventListeners }} IntermediateRepresentation\n */\n\n/**\n * Specify either an object described by the template type `O` or a function.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `O`\n * @template O\n * @typedef {O | ((value: string, type: string, token: MultiToken) => O)} OptObj\n */\n\n/**\n * Specify either a function described by template type `F` or an object.\n *\n * Each key in the object should be a link type (`'url'`, `'hashtag`', etc.). Each\n * value should be a function with template type `F` that is called when the\n * corresponding link type is encountered.\n * @template F\n * @typedef {F | { [type: string]: F}} OptFn\n */\n\n/**\n * Specify either a value with template type `V`, a function that returns `V` or\n * an object where each value resolves to `V`.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `V`\n *\n * For the object, each key should be a link type (`'url'`, `'hashtag`', etc.).\n * Each value should either have type `V` or a function that returns V. This\n * function similarly takes a string value and a token.\n *\n * Example valid types for `Opt<string>`:\n *\n * ```js\n * 'hello'\n * (value, type, token) => 'world'\n * { url: 'hello', email: (value, token) => 'world'}\n * ```\n * @template V\n * @typedef {V | ((value: string, type: string, token: MultiToken) => V) | { [type: string]: V | ((value: string, token: MultiToken) => V) }} Opt\n */\n\n/**\n * See available options: https://linkify.js.org/docs/options.html\n * @typedef {{\n * \tdefaultProtocol?: string,\n *  events?: OptObj<EventListeners>,\n * \tformat?: Opt<string>,\n * \tformatHref?: Opt<string>,\n * \tnl2br?: boolean,\n * \ttagName?: Opt<any>,\n * \ttarget?: Opt<string>,\n * \trel?: Opt<string>,\n * \tvalidate?: Opt<boolean>,\n * \ttruncate?: Opt<number>,\n * \tclassName?: Opt<string>,\n * \tattributes?: OptObj<({ [attr: string]: any })>,\n *  ignoreTags?: string[],\n * \trender?: OptFn<((ir: IntermediateRepresentation) => any)>\n * }} Opts\n */\n\n/**\n * @type Required<Opts>\n */\nconst defaults = {\n  defaultProtocol: 'http',\n  events: null,\n  format: noop,\n  formatHref: noop,\n  nl2br: false,\n  tagName: 'a',\n  target: null,\n  rel: null,\n  validate: true,\n  truncate: Infinity,\n  className: null,\n  attributes: null,\n  ignoreTags: [],\n  render: null\n};\n\n/**\n * Utility class for linkify interfaces to apply specified\n * {@link Opts formatting and rendering options}.\n *\n * @param {Opts | Options} [opts] Option value overrides.\n * @param {(ir: IntermediateRepresentation) => any} [defaultRender] (For\n *   internal use) default render function that determines how to generate an\n *   HTML element based on a link token's derived tagName, attributes and HTML.\n *   Similar to render option\n */\nfunction Options(opts, defaultRender = null) {\n  let o = Object.assign({}, defaults);\n  if (opts) {\n    o = Object.assign(o, opts instanceof Options ? opts.o : opts);\n  }\n\n  // Ensure all ignored tags are uppercase\n  const ignoredTags = o.ignoreTags;\n  const uppercaseIgnoredTags = [];\n  for (let i = 0; i < ignoredTags.length; i++) {\n    uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase());\n  }\n  /** @protected */\n  this.o = o;\n  if (defaultRender) {\n    this.defaultRender = defaultRender;\n  }\n  this.ignoreTags = uppercaseIgnoredTags;\n}\nOptions.prototype = {\n  o: defaults,\n  /**\n   * @type string[]\n   */\n  ignoreTags: [],\n  /**\n   * @param {IntermediateRepresentation} ir\n   * @returns {any}\n   */\n  defaultRender(ir) {\n    return ir;\n  },\n  /**\n   * Returns true or false based on whether a token should be displayed as a\n   * link based on the user options.\n   * @param {MultiToken} token\n   * @returns {boolean}\n   */\n  check(token) {\n    return this.get('validate', token.toString(), token);\n  },\n  // Private methods\n\n  /**\n   * Resolve an option's value based on the value of the option and the given\n   * params. If operator and token are specified and the target option is\n   * callable, automatically calls the function with the given argument.\n   * @template {keyof Opts} K\n   * @param {K} key Name of option to use\n   * @param {string} [operator] will be passed to the target option if it's a\n   * function. If not specified, RAW function value gets returned\n   * @param {MultiToken} [token] The token from linkify.tokenize\n   * @returns {Opts[K] | any}\n   */\n  get(key, operator, token) {\n    const isCallable = operator != null;\n    let option = this.o[key];\n    if (!option) {\n      return option;\n    }\n    if (typeof option === 'object') {\n      option = token.t in option ? option[token.t] : defaults[key];\n      if (typeof option === 'function' && isCallable) {\n        option = option(operator, token);\n      }\n    } else if (typeof option === 'function' && isCallable) {\n      option = option(operator, token.t, token);\n    }\n    return option;\n  },\n  /**\n   * @template {keyof Opts} L\n   * @param {L} key Name of options object to use\n   * @param {string} [operator]\n   * @param {MultiToken} [token]\n   * @returns {Opts[L] | any}\n   */\n  getObj(key, operator, token) {\n    let obj = this.o[key];\n    if (typeof obj === 'function' && operator != null) {\n      obj = obj(operator, token.t, token);\n    }\n    return obj;\n  },\n  /**\n   * Convert the given token to a rendered element that may be added to the\n   * calling-interface's DOM\n   * @param {MultiToken} token Token to render to an HTML element\n   * @returns {any} Render result; e.g., HTML string, DOM element, React\n   *   Component, etc.\n   */\n  render(token) {\n    const ir = token.render(this); // intermediate representation\n    const renderFn = this.get('render', null, token) || this.defaultRender;\n    return renderFn(ir, token.t, token);\n  }\n};\nfunction noop(val) {\n  return val;\n}\n\nvar options = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tOptions: Options,\n\tdefaults: defaults\n});\n\n/******************************************************************************\n\tMulti-Tokens\n\tTokens composed of arrays of TextTokens\n******************************************************************************/\n\n/**\n * @param {string} value\n * @param {Token[]} tokens\n */\nfunction MultiToken(value, tokens) {\n  this.t = 'token';\n  this.v = value;\n  this.tk = tokens;\n}\n\n/**\n * Abstract class used for manufacturing tokens of text tokens. That is rather\n * than the value for a token being a small string of text, it's value an array\n * of text tokens.\n *\n * Used for grouping together URLs, emails, hashtags, and other potential\n * creations.\n * @class MultiToken\n * @property {string} t\n * @property {string} v\n * @property {Token[]} tk\n * @abstract\n */\nMultiToken.prototype = {\n  isLink: false,\n  /**\n   * Return the string this token represents.\n   * @return {string}\n   */\n  toString() {\n    return this.v;\n  },\n  /**\n   * What should the value for this token be in the `href` HTML attribute?\n   * Returns the `.toString` value by default.\n   * @param {string} [scheme]\n   * @return {string}\n   */\n  toHref(scheme) {\n    return this.toString();\n  },\n  /**\n   * @param {Options} options Formatting options\n   * @returns {string}\n   */\n  toFormattedString(options) {\n    const val = this.toString();\n    const truncate = options.get('truncate', val, this);\n    const formatted = options.get('format', val, this);\n    return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + '…' : formatted;\n  },\n  /**\n   *\n   * @param {Options} options\n   * @returns {string}\n   */\n  toFormattedHref(options) {\n    return options.get('formatHref', this.toHref(options.get('defaultProtocol')), this);\n  },\n  /**\n   * The start index of this token in the original input string\n   * @returns {number}\n   */\n  startIndex() {\n    return this.tk[0].s;\n  },\n  /**\n   * The end index of this token in the original input string (up to this\n   * index but not including it)\n   * @returns {number}\n   */\n  endIndex() {\n    return this.tk[this.tk.length - 1].e;\n  },\n  /**\n  \tReturns an object  of relevant values for this token, which includes keys\n  \t* type - Kind of token ('url', 'email', etc.)\n  \t* value - Original text\n  \t* href - The value that should be added to the anchor tag's href\n  \t\tattribute\n  \t\t@method toObject\n  \t@param {string} [protocol] `'http'` by default\n  */\n  toObject(protocol = defaults.defaultProtocol) {\n    return {\n      type: this.t,\n      value: this.toString(),\n      isLink: this.isLink,\n      href: this.toHref(protocol),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   *\n   * @param {Options} options Formatting option\n   */\n  toFormattedObject(options) {\n    return {\n      type: this.t,\n      value: this.toFormattedString(options),\n      isLink: this.isLink,\n      href: this.toFormattedHref(options),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   * Whether this token should be rendered as a link according to the given options\n   * @param {Options} options\n   * @returns {boolean}\n   */\n  validate(options) {\n    return options.get('validate', this.toString(), this);\n  },\n  /**\n   * Return an object that represents how this link should be rendered.\n   * @param {Options} options Formattinng options\n   */\n  render(options) {\n    const token = this;\n    const href = this.toHref(options.get('defaultProtocol'));\n    const formattedHref = options.get('formatHref', href, this);\n    const tagName = options.get('tagName', href, token);\n    const content = this.toFormattedString(options);\n    const attributes = {};\n    const className = options.get('className', href, token);\n    const target = options.get('target', href, token);\n    const rel = options.get('rel', href, token);\n    const attrs = options.getObj('attributes', href, token);\n    const eventListeners = options.getObj('events', href, token);\n    attributes.href = formattedHref;\n    if (className) {\n      attributes.class = className;\n    }\n    if (target) {\n      attributes.target = target;\n    }\n    if (rel) {\n      attributes.rel = rel;\n    }\n    if (attrs) {\n      Object.assign(attributes, attrs);\n    }\n    return {\n      tagName,\n      attributes,\n      content,\n      eventListeners\n    };\n  }\n};\n\n/**\n * Create a new token that can be emitted by the parser state machine\n * @param {string} type readable type of the token\n * @param {object} props properties to assign or override, including isLink = true or false\n * @returns {new (value: string, tokens: Token[]) => MultiToken} new token class\n */\nfunction createTokenClass(type, props) {\n  class Token extends MultiToken {\n    constructor(value, tokens) {\n      super(value, tokens);\n      this.t = type;\n    }\n  }\n  for (const p in props) {\n    Token.prototype[p] = props[p];\n  }\n  Token.t = type;\n  return Token;\n}\n\n/**\n\tRepresents a list of tokens making up a valid email address\n*/\nconst Email = createTokenClass('email', {\n  isLink: true,\n  toHref() {\n    return 'mailto:' + this.toString();\n  }\n});\n\n/**\n\tRepresents some plain text\n*/\nconst Text = createTokenClass('text');\n\n/**\n\tMulti-linebreak token - represents a line break\n\t@class Nl\n*/\nconst Nl = createTokenClass('nl');\n\n/**\n\tRepresents a list of text tokens making up a valid URL\n\t@class Url\n*/\nconst Url = createTokenClass('url', {\n  isLink: true,\n  /**\n  \tLowercases relevant parts of the domain and adds the protocol if\n  \trequired. Note that this will not escape unsafe HTML characters in the\n  \tURL.\n  \t\t@param {string} [scheme] default scheme (e.g., 'https')\n  \t@return {string} the full href\n  */\n  toHref(scheme = defaults.defaultProtocol) {\n    // Check if already has a prefix scheme\n    return this.hasProtocol() ? this.v : `${scheme}://${this.v}`;\n  },\n  /**\n   * Check whether this URL token has a protocol\n   * @return {boolean}\n   */\n  hasProtocol() {\n    const tokens = this.tk;\n    return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON;\n  }\n});\n\nvar multi = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBase: MultiToken,\n\tEmail: Email,\n\tMultiToken: MultiToken,\n\tNl: Nl,\n\tText: Text,\n\tUrl: Url,\n\tcreateTokenClass: createTokenClass\n});\n\n/**\n\tNot exactly parser, more like the second-stage scanner (although we can\n\ttheoretically hotswap the code here with a real parser in the future... but\n\tfor a little URL-finding utility abstract syntax trees may be a little\n\toverkill).\n\n\tURL format: http://en.wikipedia.org/wiki/URI_scheme\n\tEmail format: http://en.wikipedia.org/wiki/EmailAddress (links to RFC in\n\treference)\n\n\t@module linkify\n\t@submodule parser\n\t@main run\n*/\n\nconst makeState = arg => new State(arg);\n\n/**\n * Generate the parser multi token-based state machine\n * @param {{ groups: Collections<string> }} tokens\n */\nfunction init$1({\n  groups\n}) {\n  // Types of characters the URL can definitely end in\n  const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]);\n\n  // Types of tokens that can follow a URL and be part of the query string\n  // but cannot be the very last characters\n  // Characters that cannot appear in the URL at all should be excluded\n  const qsNonAccepting = [APOSTROPHE, COLON, COMMA, DOT, EXCLAMATION, PERCENT, QUERY, QUOTE, SEMI, OPENANGLEBRACKET, CLOSEANGLEBRACKET, OPENBRACE, CLOSEBRACE, CLOSEBRACKET, OPENBRACKET, OPENPAREN, CLOSEPAREN, FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN, LEFTCORNERBRACKET, RIGHTCORNERBRACKET, LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET, FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN];\n\n  // For addresses without the mailto prefix\n  // Tokens allowed in the localpart of the email\n  const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE];\n\n  // The universal starting state.\n  /**\n   * @type State<Token>\n   */\n  const Start = makeState();\n  const Localpart = tt(Start, TILDE); // Local part of the email address\n  ta(Localpart, localpartAccepting, Localpart);\n  ta(Localpart, groups.domain, Localpart);\n  const Domain = makeState(),\n    Scheme = makeState(),\n    SlashScheme = makeState();\n  ta(Start, groups.domain, Domain); // parsed string ends with a potential domain name (A)\n  ta(Start, groups.scheme, Scheme); // e.g., 'mailto'\n  ta(Start, groups.slashscheme, SlashScheme); // e.g., 'http'\n\n  ta(Domain, localpartAccepting, Localpart);\n  ta(Domain, groups.domain, Domain);\n  const LocalpartAt = tt(Domain, AT); // Local part of the email address plus @\n\n  tt(Localpart, AT, LocalpartAt); // close to an email address now\n\n  // Local part of an email address can be e.g. 'http' or 'mailto'\n  tt(Scheme, AT, LocalpartAt);\n  tt(SlashScheme, AT, LocalpartAt);\n  const LocalpartDot = tt(Localpart, DOT); // Local part of the email address plus '.' (localpart cannot end in .)\n  ta(LocalpartDot, localpartAccepting, Localpart);\n  ta(LocalpartDot, groups.domain, Localpart);\n  const EmailDomain = makeState();\n  ta(LocalpartAt, groups.domain, EmailDomain); // parsed string starts with local email info + @ with a potential domain name\n  ta(EmailDomain, groups.domain, EmailDomain);\n  const EmailDomainDot = tt(EmailDomain, DOT); // domain followed by DOT\n  ta(EmailDomainDot, groups.domain, EmailDomain);\n  const Email$1 = makeState(Email); // Possible email address (could have more tlds)\n  ta(EmailDomainDot, groups.tld, Email$1);\n  ta(EmailDomainDot, groups.utld, Email$1);\n  tt(LocalpartAt, LOCALHOST, Email$1);\n\n  // Hyphen can jump back to a domain name\n  const EmailDomainHyphen = tt(EmailDomain, HYPHEN); // parsed string starts with local email info + @ with a potential domain name\n  tt(EmailDomainHyphen, HYPHEN, EmailDomainHyphen);\n  ta(EmailDomainHyphen, groups.domain, EmailDomain);\n  ta(Email$1, groups.domain, EmailDomain);\n  tt(Email$1, DOT, EmailDomainDot);\n  tt(Email$1, HYPHEN, EmailDomainHyphen);\n\n  // Account for dots and hyphens. Hyphens are usually parts of domain names\n  // (but not TLDs)\n  const DomainHyphen = tt(Domain, HYPHEN); // domain followed by hyphen\n  const DomainDot = tt(Domain, DOT); // domain followed by DOT\n  tt(DomainHyphen, HYPHEN, DomainHyphen);\n  ta(DomainHyphen, groups.domain, Domain);\n  ta(DomainDot, localpartAccepting, Localpart);\n  ta(DomainDot, groups.domain, Domain);\n  const DomainDotTld = makeState(Url); // Simplest possible URL with no query string\n  ta(DomainDot, groups.tld, DomainDotTld);\n  ta(DomainDot, groups.utld, DomainDotTld);\n  ta(DomainDotTld, groups.domain, Domain);\n  ta(DomainDotTld, localpartAccepting, Localpart);\n  tt(DomainDotTld, DOT, DomainDot);\n  tt(DomainDotTld, HYPHEN, DomainHyphen);\n  tt(DomainDotTld, AT, LocalpartAt);\n  const DomainDotTldColon = tt(DomainDotTld, COLON); // URL followed by colon (potential port number here)\n  const DomainDotTldColonPort = makeState(Url); // TLD followed by a port number\n  ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort);\n\n  // Long URL with optional port and maybe query string\n  const Url$1 = makeState(Url);\n\n  // URL with extra symbols at the end, followed by an opening bracket\n  const UrlNonaccept = makeState(); // URL followed by some symbols (will not be part of the final URL)\n\n  // Query strings\n  ta(Url$1, qsAccepting, Url$1);\n  ta(Url$1, qsNonAccepting, UrlNonaccept);\n  ta(UrlNonaccept, qsAccepting, Url$1);\n  ta(UrlNonaccept, qsNonAccepting, UrlNonaccept);\n\n  // Become real URLs after `SLASH` or `COLON NUM SLASH`\n  // Here works with or without scheme:// prefix\n  tt(DomainDotTld, SLASH, Url$1);\n  tt(DomainDotTldColonPort, SLASH, Url$1);\n\n  // Note that domains that begin with schemes are treated slighly differently\n  const SchemeColon = tt(Scheme, COLON); // e.g., 'mailto:'\n  const SlashSchemeColon = tt(SlashScheme, COLON); // e.g., 'http:'\n  const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH); // e.g., 'http:/'\n\n  const UriPrefix = tt(SlashSchemeColonSlash, SLASH); // e.g., 'http://'\n\n  // Scheme states can transition to domain states\n  ta(Scheme, groups.domain, Domain);\n  tt(Scheme, DOT, DomainDot);\n  tt(Scheme, HYPHEN, DomainHyphen);\n  ta(SlashScheme, groups.domain, Domain);\n  tt(SlashScheme, DOT, DomainDot);\n  tt(SlashScheme, HYPHEN, DomainHyphen);\n\n  // Force URL with scheme prefix followed by anything sane\n  ta(SchemeColon, groups.domain, Url$1);\n  tt(SchemeColon, SLASH, Url$1);\n  tt(SchemeColon, QUERY, Url$1);\n  ta(UriPrefix, groups.domain, Url$1);\n  ta(UriPrefix, qsAccepting, Url$1);\n  tt(UriPrefix, SLASH, Url$1);\n  const bracketPairs = [[OPENBRACE, CLOSEBRACE],\n  // {}\n  [OPENBRACKET, CLOSEBRACKET],\n  // []\n  [OPENPAREN, CLOSEPAREN],\n  // ()\n  [OPENANGLEBRACKET, CLOSEANGLEBRACKET],\n  // <>\n  [FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN],\n  // （）\n  [LEFTCORNERBRACKET, RIGHTCORNERBRACKET],\n  // 「」\n  [LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET],\n  // 『』\n  [FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN] // ＜＞\n  ];\n  for (let i = 0; i < bracketPairs.length; i++) {\n    const [OPEN, CLOSE] = bracketPairs[i];\n    const UrlOpen = tt(Url$1, OPEN); // URL followed by open bracket\n\n    // Continue not accepting for open brackets\n    tt(UrlNonaccept, OPEN, UrlOpen);\n\n    // URL that begins with an opening bracket, followed by a symbols.\n    // Note that the final state can still be `UrlOpen` (if the URL has a\n    // single opening bracket for some reason).\n    const UrlOpenQ = makeState(Url);\n    ta(UrlOpen, qsAccepting, UrlOpenQ);\n    const UrlOpenSyms = makeState(); // UrlOpen followed by some symbols it cannot end it\n    ta(UrlOpen, qsNonAccepting, UrlOpenSyms);\n\n    // Closing bracket component. This character WILL be included in the URL.\n    // Must come after qsNonAccepting (which includes all close-bracket tokens)\n    // so that CLOSE -> Url wins over CLOSE -> UrlOpenSyms.\n    tt(UrlOpen, CLOSE, Url$1);\n\n    // URL that begins with an opening bracket, followed by some symbols\n    ta(UrlOpenQ, qsAccepting, UrlOpenQ);\n    ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);\n    ta(UrlOpenSyms, qsAccepting, UrlOpenQ);\n    ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms);\n\n    // Close brace/bracket to become regular URL\n    tt(UrlOpenQ, CLOSE, Url$1);\n    tt(UrlOpenSyms, CLOSE, Url$1);\n  }\n  tt(Start, LOCALHOST, DomainDotTld); // localhost is a valid URL state\n  tt(Start, NL, Nl); // single new line\n\n  return {\n    start: Start,\n    tokens: tk\n  };\n}\n\n/**\n * Run the parser state machine on a list of scanned string-based tokens to\n * create a list of multi tokens, each of which represents a URL, email address,\n * plain text, etc.\n *\n * @param {State<MultiToken>} start parser start state\n * @param {string} input the original input used to generate the given tokens\n * @param {Token[]} tokens list of scanned tokens\n * @returns {MultiToken[]}\n */\nfunction run(start, input, tokens) {\n  let len = tokens.length;\n  let cursor = 0;\n  let multis = [];\n  let textTokens = [];\n  while (cursor < len) {\n    let state = start;\n    let secondState = null;\n    let nextState = null;\n    let multiLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    while (cursor < len && !(secondState = state.go(tokens[cursor].t))) {\n      // Starting tokens with nowhere to jump to.\n      // Consider these to be just plain text\n      textTokens.push(tokens[cursor++]);\n    }\n    while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) {\n      // Get the next state\n      secondState = null;\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts++;\n      }\n      cursor++;\n      multiLength++;\n    }\n    if (sinceAccepts < 0) {\n      // No accepting state was found, part of a regular text token add\n      // the first text token to the text tokens array and try again from\n      // the next\n      cursor -= multiLength;\n      if (cursor < len) {\n        textTokens.push(tokens[cursor]);\n        cursor++;\n      }\n    } else {\n      // Accepting state!\n      // First close off the textTokens (if available)\n      if (textTokens.length > 0) {\n        multis.push(initMultiToken(Text, input, textTokens));\n        textTokens = [];\n      }\n\n      // Roll back to the latest accepting state\n      cursor -= sinceAccepts;\n      multiLength -= sinceAccepts;\n\n      // Create a new multitoken\n      const Multi = latestAccepting.t;\n      const subtokens = tokens.slice(cursor - multiLength, cursor);\n      multis.push(initMultiToken(Multi, input, subtokens));\n    }\n  }\n\n  // Finally close off the textTokens (if available)\n  if (textTokens.length > 0) {\n    multis.push(initMultiToken(Text, input, textTokens));\n  }\n  return multis;\n}\n\n/**\n * Utility function for instantiating a new multitoken with all the relevant\n * fields during parsing.\n * @param {new (value: string, tokens: Token[]) => MultiToken} Multi class to instantiate\n * @param {string} input original input string\n * @param {Token[]} tokens consecutive tokens scanned from input string\n * @returns {MultiToken}\n */\nfunction initMultiToken(Multi, input, tokens) {\n  const startIdx = tokens[0].s;\n  const endIdx = tokens[tokens.length - 1].e;\n  const value = input.slice(startIdx, endIdx);\n  return new Multi(value, tokens);\n}\n\nconst warn = typeof console !== 'undefined' && console && console.warn || (() => {});\nconst warnAdvice = 'until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.';\n\n// Side-effect initialization state\nconst INIT = {\n  scanner: null,\n  parser: null,\n  tokenQueue: [],\n  pluginQueue: [],\n  customSchemes: [],\n  initialized: false\n};\n\n/**\n * @typedef {{\n * \tstart: State<string>,\n * \ttokens: { groups: Collections<string> } & typeof tk\n * }} ScannerInit\n */\n\n/**\n * @typedef {{\n * \tstart: State<MultiToken>,\n * \ttokens: typeof multi\n * }} ParserInit\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit }) => void} TokenPlugin\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit, parser: ParserInit }) => void} Plugin\n */\n\n/**\n * De-register all plugins and reset the internal state-machine. Used for\n * testing; not required in practice.\n * @private\n */\nfunction reset() {\n  State.groups = {};\n  INIT.scanner = null;\n  INIT.parser = null;\n  INIT.tokenQueue = [];\n  INIT.pluginQueue = [];\n  INIT.customSchemes = [];\n  INIT.initialized = false;\n  return INIT;\n}\n\n/**\n * Register a token plugin to allow the scanner to recognize additional token\n * types before the parser state machine is constructed from the results.\n * @param {string} name of plugin to register\n * @param {TokenPlugin} plugin function that accepts the scanner state machine\n * and available scanner tokens and collections and extends the state machine to\n * recognize additional tokens or groups.\n */\nfunction registerTokenPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid token plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    if (name === INIT.tokenQueue[i][0]) {\n      warn(`linkifyjs: token plugin \"${name}\" already registered - will be overwritten`);\n      INIT.tokenQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.tokenQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register token plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Register a linkify plugin\n * @param {string} name of plugin to register\n * @param {Plugin} plugin function that accepts the parser state machine and\n * extends the parser to recognize additional link types\n */\nfunction registerPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    if (name === INIT.pluginQueue[i][0]) {\n      warn(`linkifyjs: plugin \"${name}\" already registered - will be overwritten`);\n      INIT.pluginQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.pluginQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Detect URLs with the following additional protocol. Anything with format\n * \"protocol://...\" will be considered a link. If `optionalSlashSlash` is set to\n * `true`, anything with format \"protocol:...\" will be considered a link.\n * @param {string} scheme\n * @param {boolean} [optionalSlashSlash]\n */\nfunction registerCustomProtocol(scheme, optionalSlashSlash = false) {\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register custom scheme \"${scheme}\" ${warnAdvice}`);\n  }\n  if (!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(scheme)) {\n    throw new Error(`linkifyjs: incorrect scheme format.\n1. Must only contain digits, lowercase ASCII letters or \"-\"\n2. Cannot start or end with \"-\"\n3. \"-\" cannot repeat`);\n  }\n  INIT.customSchemes.push([scheme, optionalSlashSlash]);\n}\n\n/**\n * Initialize the linkify state machine. Called automatically the first time\n * linkify is called on a string, but may be called manually as well.\n */\nfunction init() {\n  // Initialize scanner state machine and plugins\n  INIT.scanner = init$2(INIT.customSchemes);\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    INIT.tokenQueue[i][1]({\n      scanner: INIT.scanner\n    });\n  }\n\n  // Initialize parser state machine and plugins\n  INIT.parser = init$1(INIT.scanner.tokens);\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    INIT.pluginQueue[i][1]({\n      scanner: INIT.scanner,\n      parser: INIT.parser\n    });\n  }\n  INIT.initialized = true;\n  return INIT;\n}\n\n/**\n * Parse a string into tokens that represent linkable and non-linkable sub-components\n * @param {string} str\n * @return {MultiToken[]} tokens\n */\nfunction tokenize(str) {\n  if (!INIT.initialized) {\n    init();\n  }\n  return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));\n}\ntokenize.scan = run$1; // for testing\n\n/**\n * Find a list of linkable items in the given string.\n * @param {string} str string to find links in\n * @param {string | Opts} [type] either formatting options or specific type of\n * links to find, e.g., 'url' or 'email'\n * @param {Opts} [opts] formatting options for final output. Cannot be specified\n * if opts already provided in `type` argument\n */\nfunction find(str, type = null, opts = null) {\n  if (type && typeof type === 'object') {\n    if (opts) {\n      throw Error(`linkifyjs: Invalid link type ${type}; must be a string`);\n    }\n    opts = type;\n    type = null;\n  }\n  const options = new Options(opts);\n  const tokens = tokenize(str);\n  const filtered = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.isLink && (!type || token.t === type) && options.check(token)) {\n      filtered.push(token.toFormattedObject(options));\n    }\n  }\n  return filtered;\n}\n\n/**\n * Is the given string valid linkable text of some sort. Note that this does not\n * trim the text for you.\n *\n * Optionally pass in a second `type` param, which is the type of link to test\n * for.\n *\n * For example,\n *\n *     linkify.test(str, 'email');\n *\n * Returns `true` if str is a valid email.\n * @param {string} str string to test for links\n * @param {string} [type] optional specific link type to look for\n * @returns boolean true/false\n */\nfunction test(str, type = null) {\n  const tokens = tokenize(str);\n  return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].t === type);\n}\n\nexport { MultiToken, Options, State, createTokenClass, find, init, multi, options, regexp, registerCustomProtocol, registerPlugin, registerTokenPlugin, reset, stringToArray, test, multi as text, tokenize };\n","import { InputRule, Mark, PasteRule, combineTransactionSteps, findChildrenInRange, getAttributes, getChangedRanges, getMarksBetween, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\nimport { find, registerCustomProtocol, reset, tokenize } from \"linkifyjs\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n//#region src/helpers/whitespace.ts\nconst UNICODE_WHITESPACE_PATTERN = \"[\\0- \\xA0 ᠎ -\\u2029 　]\";\nconst UNICODE_WHITESPACE_REGEX = new RegExp(UNICODE_WHITESPACE_PATTERN);\nconst UNICODE_WHITESPACE_REGEX_END = new RegExp(`${UNICODE_WHITESPACE_PATTERN}$`);\nconst UNICODE_WHITESPACE_REGEX_GLOBAL = new RegExp(UNICODE_WHITESPACE_PATTERN, \"g\");\n//#endregion\n//#region src/helpers/autolink.ts\n/**\n* Check if the provided tokens form a valid link structure, which can either be a single link token\n* or a link token surrounded by parentheses or square brackets.\n*\n* This ensures that only complete and valid text is hyperlinked, preventing cases where a valid\n* top-level domain (TLD) is immediately followed by an invalid character, like a number. For\n* example, with the `find` method from Linkify, entering `example.com1` would result in\n* `example.com` being linked and the trailing `1` left as plain text. By using the `tokenize`\n* method, we can perform more comprehensive validation on the input text.\n*/\nfunction isValidLinkStructure(tokens) {\n\tif (tokens.length === 1) return tokens[0].isLink;\n\tif (tokens.length === 3 && tokens[1].isLink) return [\"()\", \"[]\"].includes(tokens[0].value + tokens[2].value);\n\treturn false;\n}\n/**\n* This plugin allows you to automatically add links to your editor.\n* @param options The plugin options\n* @returns The plugin instance\n*/\nfunction autolink(options) {\n\treturn new Plugin({\n\t\tkey: new PluginKey(\"autolink\"),\n\t\tappendTransaction: (transactions, oldState, newState) => {\n\t\t\t/**\n\t\t\t* Does the transaction change the document?\n\t\t\t*/\n\t\t\tconst docChanges = transactions.some((transaction) => transaction.docChanged) && !oldState.doc.eq(newState.doc);\n\t\t\t/**\n\t\t\t* Prevent autolink if the transaction is not a document change or if the transaction has the meta `preventAutolink`.\n\t\t\t*/\n\t\t\tconst preventAutolink = transactions.some((transaction) => transaction.getMeta(\"preventAutolink\"));\n\t\t\t/**\n\t\t\t* Prevent autolink if the transaction is not a document change\n\t\t\t* or if the transaction has the meta `preventAutolink`.\n\t\t\t*/\n\t\t\tif (!docChanges || preventAutolink) return;\n\t\t\tconst { tr } = newState;\n\t\t\tconst transform = combineTransactionSteps(oldState.doc, [...transactions]);\n\t\t\tgetChangedRanges(transform).forEach(({ newRange }) => {\n\t\t\t\tconst nodesInChangedRanges = findChildrenInRange(newState.doc, newRange, (node) => node.isTextblock);\n\t\t\t\tlet textBlock;\n\t\t\t\tlet textBeforeWhitespace;\n\t\t\t\tif (nodesInChangedRanges.length > 1) {\n\t\t\t\t\ttextBlock = nodesInChangedRanges[0];\n\t\t\t\t\ttextBeforeWhitespace = newState.doc.textBetween(textBlock.pos, textBlock.pos + textBlock.node.nodeSize, void 0, \" \");\n\t\t\t\t} else if (nodesInChangedRanges.length) {\n\t\t\t\t\tconst endText = newState.doc.textBetween(newRange.from, newRange.to, \" \", \" \");\n\t\t\t\t\tif (!UNICODE_WHITESPACE_REGEX_END.test(endText)) return;\n\t\t\t\t\ttextBlock = nodesInChangedRanges[0];\n\t\t\t\t\ttextBeforeWhitespace = newState.doc.textBetween(textBlock.pos, newRange.to, void 0, \" \");\n\t\t\t\t}\n\t\t\t\tif (textBlock && textBeforeWhitespace) {\n\t\t\t\t\tconst wordsBeforeWhitespace = textBeforeWhitespace.split(UNICODE_WHITESPACE_REGEX).filter(Boolean);\n\t\t\t\t\tif (wordsBeforeWhitespace.length <= 0) return false;\n\t\t\t\t\tconst lastWordBeforeSpace = wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1];\n\t\t\t\t\tconst lastWordAndBlockOffset = textBlock.pos + textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace);\n\t\t\t\t\tif (!lastWordBeforeSpace) return false;\n\t\t\t\t\tconst linksBeforeSpace = tokenize(lastWordBeforeSpace).map((t) => t.toObject(options.defaultProtocol));\n\t\t\t\t\tif (!isValidLinkStructure(linksBeforeSpace)) return false;\n\t\t\t\t\tlinksBeforeSpace.filter((link) => link.isLink).map((link) => ({\n\t\t\t\t\t\t...link,\n\t\t\t\t\t\tfrom: lastWordAndBlockOffset + link.start + 1,\n\t\t\t\t\t\tto: lastWordAndBlockOffset + link.end + 1\n\t\t\t\t\t})).filter((link) => {\n\t\t\t\t\t\tif (!newState.schema.marks.code) return true;\n\t\t\t\t\t\treturn !newState.doc.rangeHasMark(link.from, link.to, newState.schema.marks.code);\n\t\t\t\t\t}).filter((link) => options.validate(link.value)).filter((link) => options.shouldAutoLink(link.value)).forEach((link) => {\n\t\t\t\t\t\tif (getMarksBetween(link.from, link.to, newState.doc).some((item) => item.mark.type === options.type)) return;\n\t\t\t\t\t\ttr.addMark(link.from, link.to, options.type.create({ href: link.href }));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (!tr.steps.length) return;\n\t\t\treturn tr;\n\t\t}\n\t});\n}\n//#endregion\n//#region src/helpers/clickHandler.ts\nfunction clickHandler(options) {\n\treturn new Plugin({\n\t\tkey: new PluginKey(\"handleClickLink\"),\n\t\tprops: { handleClick: (view, pos, event) => {\n\t\t\tif (event.button !== 0) return false;\n\t\t\tif (!view.editable) return false;\n\t\t\tlet link = null;\n\t\t\tif (event.target instanceof HTMLAnchorElement) link = event.target;\n\t\t\telse {\n\t\t\t\tconst target = event.target;\n\t\t\t\tif (!target) return false;\n\t\t\t\tconst root = options.editor.view.dom;\n\t\t\t\tlink = target.closest(\"a\");\n\t\t\t\tif (link && !root.contains(link)) link = null;\n\t\t\t}\n\t\t\tif (!link) return false;\n\t\t\tlet handled = false;\n\t\t\tif (options.enableClickSelection) handled = options.editor.commands.extendMarkRange(options.type.name);\n\t\t\tif (options.openOnClick) {\n\t\t\t\tvar _link$href, _link$target;\n\t\t\t\tconst attrs = getAttributes(view.state, options.type.name);\n\t\t\t\tconst href = (_link$href = link.href) !== null && _link$href !== void 0 ? _link$href : attrs.href;\n\t\t\t\tconst target = (_link$target = link.target) !== null && _link$target !== void 0 ? _link$target : attrs.target;\n\t\t\t\tif (href) {\n\t\t\t\t\twindow.open(href, target);\n\t\t\t\t\thandled = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn handled;\n\t\t} }\n\t});\n}\n//#endregion\n//#region src/helpers/markdownLink.ts\n/**\n* Matches a Markdown link with an optional quoted title.\n* for ex: [Tiptap](https://tiptap.dev) or [Tiptap](https://tiptap.dev \"some title\")\n* the URL may also contain one level of balanced parentheses, as in CommonMark\n* (titles accept curly quotes too, the Typography extension swaps them in while typing)\n* the title delimiters must come in matching pairs\n*/\nconst MARKDOWN_LINK_INPUT_REGEX = /\\[([^[\\]]+)\\]\\(((?:[^\\s()]|\\([^\\s()]*\\))+)(?:\\s+(?:([\"'])(.*?)\\3|“(.*?)”|‘(.*?)’))?\\)$/;\n/**\n* Same as the input regex but global, to find every Markdown link in pasted text.\n*/\nconst MARKDOWN_LINK_PASTE_REGEX = /\\[([^[\\]]+)\\]\\(((?:[^\\s()]|\\([^\\s()]*\\))+)(?:\\s+(?:([\"'])(.*?)\\3|“(.*?)”|‘(.*?)’))?\\)/g;\nfunction isEscaped(text, index) {\n\tlet backslashes = 0;\n\tfor (let position = index - 1; position >= 0 && text[position] === \"\\\\\"; position -= 1) backslashes += 1;\n\treturn backslashes % 2 === 1;\n}\n/**\n* Pairs the backtick runs before the match by length, as CommonMark does.\n* A run left open means the match sits in an unfinished code span.\n*/\nfunction isInsideCodeSpan(text, matchIndex) {\n\tlet openRunLength = 0;\n\tlet index = 0;\n\twhile (index < matchIndex) {\n\t\tif (text[index] !== \"`\") {\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (openRunLength === 0 && isEscaped(text, index)) {\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tlet runLength = 0;\n\t\twhile (index < matchIndex && text[index] === \"`\") {\n\t\t\trunLength += 1;\n\t\t\tindex += 1;\n\t\t}\n\t\tif (openRunLength === 0) openRunLength = runLength;\n\t\telse if (runLength === openRunLength) openRunLength = 0;\n\t}\n\treturn openRunLength > 0;\n}\nfunction isConvertibleLink(text, match, isAllowedHref) {\n\tvar _match$index, _match$index2;\n\tconst [, linkText, href] = match;\n\tif ((match.index ? text[match.index - 1] : void 0) === \"!\" || isEscaped(text, (_match$index = match.index) !== null && _match$index !== void 0 ? _match$index : 0)) return false;\n\tif (isInsideCodeSpan(text, (_match$index2 = match.index) !== null && _match$index2 !== void 0 ? _match$index2 : 0)) return false;\n\treturn !!linkText.trim() && isAllowedHref(href);\n}\nfunction toRuleMatch(match) {\n\tvar _ref, _match$index3;\n\tconst [linkSyntax, linkText, href, , straightQuotedTitle, curlyDoubleTitle, curlySingleTitle] = match;\n\tconst title = (_ref = straightQuotedTitle !== null && straightQuotedTitle !== void 0 ? straightQuotedTitle : curlyDoubleTitle) !== null && _ref !== void 0 ? _ref : curlySingleTitle;\n\treturn {\n\t\tindex: (_match$index3 = match.index) !== null && _match$index3 !== void 0 ? _match$index3 : 0,\n\t\ttext: linkSyntax,\n\t\treplaceWith: linkText,\n\t\tdata: {\n\t\t\thref,\n\t\t\ttitle: title || null,\n\t\t\tmarkdown: true\n\t\t}\n\t};\n}\nfunction matchesOverlap(a, b) {\n\treturn a.index < b.index + b.text.length && b.index < a.index + a.text.length;\n}\nfunction getMarkdownLinkAttributes(match) {\n\tvar _match$data, _match$data$title, _match$data2;\n\treturn {\n\t\thref: (_match$data = match.data) === null || _match$data === void 0 ? void 0 : _match$data.href,\n\t\ttitle: (_match$data$title = (_match$data2 = match.data) === null || _match$data2 === void 0 ? void 0 : _match$data2.title) !== null && _match$data$title !== void 0 ? _match$data$title : null\n\t};\n}\n/**\n* Turns typed Markdown link syntax into a link mark as soon as the closing `)` comes in.\n* The transaction gets flagged so autolink doesn't touch the converted text again.\n*/\nfunction markdownLinkInputRule(config) {\n\tconst rule = markInputRule({\n\t\tfind: (text) => {\n\t\t\tconst match = MARKDOWN_LINK_INPUT_REGEX.exec(text);\n\t\t\tif (!match || !isConvertibleLink(text, match, config.isAllowedHref)) return null;\n\t\t\treturn toRuleMatch(match);\n\t\t},\n\t\ttype: config.type,\n\t\tgetAttributes: getMarkdownLinkAttributes\n\t});\n\treturn new InputRule({\n\t\tfind: rule.find,\n\t\thandler: (props) => {\n\t\t\tconst result = rule.handler(props);\n\t\t\tif (result !== null && props.state.tr.steps.length) props.state.tr.setMeta(\"preventAutolink\", true);\n\t\t\treturn result;\n\t\t}\n\t});\n}\n/**\n* Same for pasting, converts every Markdown link found in the pasted text\n* and links the plain URLs from `findPlainUrls`.\n*/\nfunction markdownLinkPasteRule(config) {\n\tconst rule = markPasteRule({\n\t\tfind: (text) => {\n\t\t\tvar _config$findPlainUrls, _config$findPlainUrls2;\n\t\t\tconst markdownMatches = [];\n\t\t\tfor (const match of text.matchAll(MARKDOWN_LINK_PASTE_REGEX)) if (isConvertibleLink(text, match, config.isAllowedHref)) markdownMatches.push(toRuleMatch(match));\n\t\t\tconst plainUrlMatches = ((_config$findPlainUrls = (_config$findPlainUrls2 = config.findPlainUrls) === null || _config$findPlainUrls2 === void 0 ? void 0 : _config$findPlainUrls2.call(config, text)) !== null && _config$findPlainUrls !== void 0 ? _config$findPlainUrls : []).filter((urlMatch) => !markdownMatches.some((markdownMatch) => matchesOverlap(markdownMatch, urlMatch)));\n\t\t\treturn [...markdownMatches, ...plainUrlMatches];\n\t\t},\n\t\ttype: config.type,\n\t\tgetAttributes: getMarkdownLinkAttributes\n\t});\n\treturn new PasteRule({\n\t\tfind: rule.find,\n\t\thandler: (props) => {\n\t\t\tvar _props$match$data;\n\t\t\tconst result = rule.handler(props);\n\t\t\tif (result !== null && props.state.tr.steps.length && ((_props$match$data = props.match.data) === null || _props$match$data === void 0 ? void 0 : _props$match$data.markdown)) props.state.tr.setMeta(\"preventAutolink\", true);\n\t\t\treturn result;\n\t\t}\n\t});\n}\n//#endregion\n//#region src/helpers/pasteHandler.ts\nfunction pasteHandler(options) {\n\treturn new Plugin({\n\t\tkey: new PluginKey(\"handlePasteLink\"),\n\t\tprops: { handlePaste: (view, _event, slice) => {\n\t\t\tconst { shouldAutoLink } = options;\n\t\t\tconst { state } = view;\n\t\t\tconst { selection } = state;\n\t\t\tconst { empty } = selection;\n\t\t\tif (empty) return false;\n\t\t\tlet textContent = \"\";\n\t\t\tslice.content.forEach((node) => {\n\t\t\t\ttextContent += node.textContent;\n\t\t\t});\n\t\t\tconst link = find(textContent, { defaultProtocol: options.defaultProtocol }).find((item) => item.isLink && item.value === textContent);\n\t\t\tif (!textContent || !link || shouldAutoLink !== void 0 && !shouldAutoLink(link.value)) return false;\n\t\t\treturn options.editor.commands.setMark(options.type, { href: link.href });\n\t\t} }\n\t});\n}\n//#endregion\n//#region src/link.ts\nconst pasteRegex = /https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z]{2,}\\b(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)/gi;\nfunction isAllowedUri(uri, protocols) {\n\tconst allowedProtocols = [\n\t\t\"http\",\n\t\t\"https\",\n\t\t\"ftp\",\n\t\t\"ftps\",\n\t\t\"mailto\",\n\t\t\"tel\",\n\t\t\"callto\",\n\t\t\"sms\",\n\t\t\"cid\",\n\t\t\"xmpp\"\n\t];\n\tif (protocols) protocols.forEach((protocol) => {\n\t\tconst nextProtocol = typeof protocol === \"string\" ? protocol : protocol.scheme;\n\t\tif (nextProtocol) allowedProtocols.push(nextProtocol);\n\t});\n\treturn !uri || uri.replace(UNICODE_WHITESPACE_REGEX_GLOBAL, \"\").match(new RegExp(`^(?:(?:${allowedProtocols.map((protocol) => protocol.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\")).join(\"|\")}):|[^a-z]|[a-z0-9+.\\\\-]+(?:[^a-z+.\\\\-:]|$))`, \"i\"));\n}\n/**\n* This extension allows you to create links.\n* @see https://www.tiptap.dev/api/marks/link\n*/\nconst Link = Mark.create({\n\tname: \"link\",\n\tpriority: 1e3,\n\tkeepOnSplit: false,\n\texitable: true,\n\tonCreate() {\n\t\tif (this.options.validate && !this.options.shouldAutoLink) {\n\t\t\tthis.options.shouldAutoLink = this.options.validate;\n\t\t\tconsole.warn(\"The `validate` option is deprecated. Rename to the `shouldAutoLink` option instead.\");\n\t\t}\n\t\tthis.options.protocols.forEach((protocol) => {\n\t\t\tif (typeof protocol === \"string\") {\n\t\t\t\tregisterCustomProtocol(protocol);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tregisterCustomProtocol(protocol.scheme, protocol.optionalSlashes);\n\t\t});\n\t},\n\tonDestroy() {\n\t\treset();\n\t},\n\tinclusive() {\n\t\treturn this.options.autolink;\n\t},\n\taddOptions() {\n\t\treturn {\n\t\t\topenOnClick: true,\n\t\t\tenableClickSelection: false,\n\t\t\tlinkOnPaste: true,\n\t\t\tmarkdownLinks: false,\n\t\t\tautolink: true,\n\t\t\tprotocols: [],\n\t\t\tdefaultProtocol: \"http\",\n\t\t\tHTMLAttributes: {\n\t\t\t\ttarget: \"_blank\",\n\t\t\t\trel: \"noopener noreferrer nofollow\",\n\t\t\t\tclass: null\n\t\t\t},\n\t\t\tisAllowedUri: (url, ctx) => !!isAllowedUri(url, ctx.protocols),\n\t\t\tvalidate: (url) => !!url,\n\t\t\tshouldAutoLink: (url) => {\n\t\t\t\tconst hasProtocol = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(url);\n\t\t\t\tconst hasMaybeProtocol = /^[a-z][a-z0-9+.-]*:/i.test(url);\n\t\t\t\tif (hasProtocol || hasMaybeProtocol && !url.includes(\"@\")) return true;\n\t\t\t\tconst hostname = (url.includes(\"@\") ? url.split(\"@\").pop() : url).split(/[/?#:]/)[0];\n\t\t\t\tif (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(hostname)) return false;\n\t\t\t\tif (!/\\./.test(hostname)) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t},\n\taddAttributes() {\n\t\tvar _this$options$HTMLAtt, _this$options$HTMLAtt2, _this$options$HTMLAtt3;\n\t\treturn {\n\t\t\thref: {\n\t\t\t\tdefault: null,\n\t\t\t\tparseHTML(element) {\n\t\t\t\t\treturn element.getAttribute(\"href\");\n\t\t\t\t}\n\t\t\t},\n\t\t\ttarget: { default: (_this$options$HTMLAtt = this.options.HTMLAttributes.target) !== null && _this$options$HTMLAtt !== void 0 ? _this$options$HTMLAtt : null },\n\t\t\trel: { default: (_this$options$HTMLAtt2 = this.options.HTMLAttributes.rel) !== null && _this$options$HTMLAtt2 !== void 0 ? _this$options$HTMLAtt2 : null },\n\t\t\tclass: { default: (_this$options$HTMLAtt3 = this.options.HTMLAttributes.class) !== null && _this$options$HTMLAtt3 !== void 0 ? _this$options$HTMLAtt3 : null },\n\t\t\ttitle: { default: null }\n\t\t};\n\t},\n\tparseHTML() {\n\t\treturn [{\n\t\t\ttag: \"a[href]\",\n\t\t\tgetAttrs: (dom) => {\n\t\t\t\tconst href = dom.getAttribute(\"href\");\n\t\t\t\tif (!href || !this.options.isAllowedUri(href, {\n\t\t\t\t\tdefaultValidate: (url) => !!isAllowedUri(url, this.options.protocols),\n\t\t\t\t\tprotocols: this.options.protocols,\n\t\t\t\t\tdefaultProtocol: this.options.defaultProtocol\n\t\t\t\t})) return false;\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\tif (!this.options.isAllowedUri(HTMLAttributes.href, {\n\t\t\tdefaultValidate: (href) => !!isAllowedUri(href, this.options.protocols),\n\t\t\tprotocols: this.options.protocols,\n\t\t\tdefaultProtocol: this.options.defaultProtocol\n\t\t})) return [\n\t\t\t\"a\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, {\n\t\t\t\t...HTMLAttributes,\n\t\t\t\thref: \"\"\n\t\t\t}),\n\t\t\t0\n\t\t];\n\t\treturn [\n\t\t\t\"a\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tmarkdownTokenName: \"link\",\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.applyMark(\"link\", helpers.parseInline(token.tokens || []), {\n\t\t\thref: token.href,\n\t\t\ttitle: token.title || null\n\t\t});\n\t},\n\trenderMarkdown: (node, h) => {\n\t\tvar _node$attrs$href, _node$attrs, _node$attrs$title, _node$attrs2;\n\t\tconst href = (_node$attrs$href = (_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.href) !== null && _node$attrs$href !== void 0 ? _node$attrs$href : \"\";\n\t\tconst title = (_node$attrs$title = (_node$attrs2 = node.attrs) === null || _node$attrs2 === void 0 ? void 0 : _node$attrs2.title) !== null && _node$attrs$title !== void 0 ? _node$attrs$title : \"\";\n\t\tconst text = h.renderChildren(node);\n\t\treturn title ? `[${text}](${href} \"${title}\")` : `[${text}](${href})`;\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetLink: (attributes) => ({ chain }) => {\n\t\t\t\tconst { href } = attributes;\n\t\t\t\tif (!this.options.isAllowedUri(href, {\n\t\t\t\t\tdefaultValidate: (url) => !!isAllowedUri(url, this.options.protocols),\n\t\t\t\t\tprotocols: this.options.protocols,\n\t\t\t\t\tdefaultProtocol: this.options.defaultProtocol\n\t\t\t\t})) return false;\n\t\t\t\treturn chain().setMark(this.name, attributes).setMeta(\"preventAutolink\", true).run();\n\t\t\t},\n\t\t\ttoggleLink: (attributes) => ({ chain }) => {\n\t\t\t\tconst { href } = attributes || {};\n\t\t\t\tif (href && !this.options.isAllowedUri(href, {\n\t\t\t\t\tdefaultValidate: (url) => !!isAllowedUri(url, this.options.protocols),\n\t\t\t\t\tprotocols: this.options.protocols,\n\t\t\t\t\tdefaultProtocol: this.options.defaultProtocol\n\t\t\t\t})) return false;\n\t\t\t\treturn chain().toggleMark(this.name, attributes, { extendEmptyMarkRange: true }).setMeta(\"preventAutolink\", true).run();\n\t\t\t},\n\t\t\tunsetLink: () => ({ chain }) => {\n\t\t\t\treturn chain().unsetMark(this.name, { extendEmptyMarkRange: true }).setMeta(\"preventAutolink\", true).run();\n\t\t\t}\n\t\t};\n\t},\n\taddInputRules() {\n\t\tif (!this.options.markdownLinks) return [];\n\t\treturn [markdownLinkInputRule({\n\t\t\ttype: this.type,\n\t\t\tisAllowedHref: (href) => this.options.isAllowedUri(href, {\n\t\t\t\tdefaultValidate: (url) => !!isAllowedUri(url, this.options.protocols),\n\t\t\t\tprotocols: this.options.protocols,\n\t\t\t\tdefaultProtocol: this.options.defaultProtocol\n\t\t\t})\n\t\t})];\n\t},\n\taddPasteRules() {\n\t\tconst findPlainUrls = (text) => {\n\t\t\tconst foundLinks = [];\n\t\t\tif (text) {\n\t\t\t\tconst { protocols, defaultProtocol } = this.options;\n\t\t\t\tfind(text).filter((item) => item.isLink && this.options.isAllowedUri(item.value, {\n\t\t\t\t\tdefaultValidate: (href) => !!isAllowedUri(href, protocols),\n\t\t\t\t\tprotocols,\n\t\t\t\t\tdefaultProtocol\n\t\t\t\t})).forEach((link) => {\n\t\t\t\t\tif (!this.options.shouldAutoLink(link.value)) return;\n\t\t\t\t\tfoundLinks.push({\n\t\t\t\t\t\ttext: link.value,\n\t\t\t\t\t\tdata: { href: link.href },\n\t\t\t\t\t\tindex: link.start\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn foundLinks;\n\t\t};\n\t\tif (this.options.markdownLinks) return [markdownLinkPasteRule({\n\t\t\ttype: this.type,\n\t\t\tisAllowedHref: (href) => this.options.isAllowedUri(href, {\n\t\t\t\tdefaultValidate: (url) => !!isAllowedUri(url, this.options.protocols),\n\t\t\t\tprotocols: this.options.protocols,\n\t\t\t\tdefaultProtocol: this.options.defaultProtocol\n\t\t\t}),\n\t\t\tfindPlainUrls\n\t\t})];\n\t\treturn [markPasteRule({\n\t\t\tfind: findPlainUrls,\n\t\t\ttype: this.type,\n\t\t\tgetAttributes: (match) => {\n\t\t\t\tvar _match$data;\n\t\t\t\treturn { href: (_match$data = match.data) === null || _match$data === void 0 ? void 0 : _match$data.href };\n\t\t\t}\n\t\t})];\n\t},\n\taddProseMirrorPlugins() {\n\t\tconst plugins = [];\n\t\tconst { protocols, defaultProtocol } = this.options;\n\t\tif (this.options.autolink) plugins.push(autolink({\n\t\t\ttype: this.type,\n\t\t\tdefaultProtocol: this.options.defaultProtocol,\n\t\t\tvalidate: (url) => this.options.isAllowedUri(url, {\n\t\t\t\tdefaultValidate: (href) => !!isAllowedUri(href, protocols),\n\t\t\t\tprotocols,\n\t\t\t\tdefaultProtocol\n\t\t\t}),\n\t\t\tshouldAutoLink: this.options.shouldAutoLink\n\t\t}));\n\t\tplugins.push(clickHandler({\n\t\t\ttype: this.type,\n\t\t\teditor: this.editor,\n\t\t\topenOnClick: this.options.openOnClick === \"whenNotEditable\" ? true : this.options.openOnClick,\n\t\t\tenableClickSelection: this.options.enableClickSelection\n\t\t}));\n\t\tif (this.options.linkOnPaste) plugins.push(pasteHandler({\n\t\t\teditor: this.editor,\n\t\t\tdefaultProtocol: this.options.defaultProtocol,\n\t\t\ttype: this.type,\n\t\t\tshouldAutoLink: this.options.shouldAutoLink\n\t\t}));\n\t\treturn plugins;\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Link;\n//#endregion\nexport { Link, src_default as default, isAllowedUri, pasteRegex };\n\n//# sourceMappingURL=index.js.map","import { Node, mergeAttributes } from \"@tiptap/core\";\n//#region src/paragraph.ts\n/**\n* Markdown marker for empty paragraphs to preserve blank lines.\n* Using &nbsp; (non-breaking space HTML entity) ensures the paragraph\n* is not collapsed by markdown parsers while remaining human-readable.\n*/\nconst EMPTY_PARAGRAPH_MARKDOWN = \"&nbsp;\";\n/**\n* Unicode character for non-breaking space (U+00A0).\n* Some markdown parsers may convert &nbsp; entities to this literal character.\n*/\nconst NBSP_CHAR = \"\\xA0\";\n/**\n* This extension allows you to create paragraphs.\n* @see https://www.tiptap.dev/api/nodes/paragraph\n*/\nconst Paragraph = Node.create({\n\tname: \"paragraph\",\n\tpriority: 1e3,\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tgroup: \"block\",\n\tcontent: \"inline*\",\n\tparseHTML() {\n\t\treturn [{ tag: \"p\" }];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"p\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tparseMarkdown: (token, helpers) => {\n\t\tconst tokens = token.tokens || [];\n\t\tif (tokens.length === 1 && tokens[0].type === \"image\") return helpers.parseChildren([tokens[0]]);\n\t\tconst content = helpers.parseInline(tokens);\n\t\tif (tokens.length === 1 && tokens[0].type === \"text\" && (tokens[0].raw === EMPTY_PARAGRAPH_MARKDOWN || tokens[0].text === EMPTY_PARAGRAPH_MARKDOWN || tokens[0].raw === NBSP_CHAR || tokens[0].text === NBSP_CHAR) && content.length === 1 && content[0].type === \"text\" && (content[0].text === EMPTY_PARAGRAPH_MARKDOWN || content[0].text === NBSP_CHAR)) return helpers.createNode(\"paragraph\", void 0, []);\n\t\treturn helpers.createNode(\"paragraph\", void 0, content);\n\t},\n\trenderMarkdown: (node, h, ctx) => {\n\t\tif (!node) return \"\";\n\t\tconst content = Array.isArray(node.content) ? node.content : [];\n\t\tif (content.length === 0) {\n\t\t\tvar _ctx$previousNode, _ctx$previousNode2;\n\t\t\tconst previousContent = Array.isArray(ctx === null || ctx === void 0 || (_ctx$previousNode = ctx.previousNode) === null || _ctx$previousNode === void 0 ? void 0 : _ctx$previousNode.content) ? ctx.previousNode.content : [];\n\t\t\treturn (ctx === null || ctx === void 0 || (_ctx$previousNode2 = ctx.previousNode) === null || _ctx$previousNode2 === void 0 ? void 0 : _ctx$previousNode2.type) === \"paragraph\" && previousContent.length === 0 ? EMPTY_PARAGRAPH_MARKDOWN : \"\";\n\t\t}\n\t\treturn h.renderChildren(content);\n\t},\n\taddCommands() {\n\t\treturn { setParagraph: () => ({ commands }) => {\n\t\t\treturn commands.setNode(this.name);\n\t\t} };\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn { \"Mod-Alt-0\": () => this.editor.commands.setParagraph() };\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Paragraph;\n//#endregion\nexport { Paragraph, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Mark, markInputRule, markPasteRule, mergeAttributes } from \"@tiptap/core\";\n//#region src/strike.ts\n/**\n* Matches a strike to a ~~strike~~ on input.\n*/\nconst inputRegex = /(?:^|\\s)(~~(?!\\s+~~)((?:[^~]+))~~(?!\\s+~~))$/;\n/**\n* Matches a strike to a ~~strike~~ on paste.\n*/\nconst pasteRegex = /(?:^|\\s)(~~(?!\\s+~~)((?:[^~]+))~~(?!\\s+~~))/g;\n/**\n* This extension allows you to create strike text.\n* @see https://www.tiptap.dev/api/marks/strike\n*/\nconst Strike = Mark.create({\n\tname: \"strike\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tparseHTML() {\n\t\treturn [\n\t\t\t{ tag: \"s\" },\n\t\t\t{ tag: \"del\" },\n\t\t\t{ tag: \"strike\" },\n\t\t\t{\n\t\t\t\tstyle: \"text-decoration\",\n\t\t\t\tconsuming: false,\n\t\t\t\tgetAttrs: (style) => style.includes(\"line-through\") ? {} : false\n\t\t\t}\n\t\t];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"s\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tmarkdownTokenName: \"del\",\n\tparseMarkdown: (token, helpers) => {\n\t\treturn helpers.applyMark(\"strike\", helpers.parseInline(token.tokens || []));\n\t},\n\trenderMarkdown: (node, h) => {\n\t\treturn `~~${h.renderChildren(node)}~~`;\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetStrike: () => ({ commands }) => {\n\t\t\t\treturn commands.setMark(this.name);\n\t\t\t},\n\t\t\ttoggleStrike: () => ({ commands }) => {\n\t\t\t\treturn commands.toggleMark(this.name);\n\t\t\t},\n\t\t\tunsetStrike: () => ({ commands }) => {\n\t\t\t\treturn commands.unsetMark(this.name);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn { \"Mod-Shift-s\": () => this.editor.commands.toggleStrike() };\n\t},\n\taddInputRules() {\n\t\treturn [markInputRule({\n\t\t\tfind: inputRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t},\n\taddPasteRules() {\n\t\treturn [markPasteRule({\n\t\t\tfind: pasteRegex,\n\t\t\ttype: this.type\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Strike;\n//#endregion\nexport { Strike, src_default as default, inputRegex, pasteRegex };\n\n//# sourceMappingURL=index.js.map","import { Node } from \"@tiptap/core\";\n//#region src/text.ts\n/**\n* This extension allows you to create text nodes.\n* @see https://www.tiptap.dev/api/nodes/text\n*/\nconst Text = Node.create({\n\tname: \"text\",\n\tgroup: \"inline\",\n\tparseMarkdown: (token) => {\n\t\treturn {\n\t\t\ttype: \"text\",\n\t\t\ttext: token.text || \"\"\n\t\t};\n\t},\n\trenderMarkdown: (node) => node.text || \"\"\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Text;\n//#endregion\nexport { Text, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Mark, mergeAttributes } from \"@tiptap/core\";\n//#region src/underline.ts\n/**\n* This extension allows you to create underline text.\n* @see https://www.tiptap.dev/api/marks/underline\n*/\nconst Underline = Mark.create({\n\tname: \"underline\",\n\taddOptions() {\n\t\treturn { HTMLAttributes: {} };\n\t},\n\tparseHTML() {\n\t\treturn [{ tag: \"u\" }, {\n\t\t\tstyle: \"text-decoration\",\n\t\t\tconsuming: false,\n\t\t\tgetAttrs: (style) => style.includes(\"underline\") ? {} : false\n\t\t}];\n\t},\n\trenderHTML({ HTMLAttributes }) {\n\t\treturn [\n\t\t\t\"u\",\n\t\t\tmergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n\t\t\t0\n\t\t];\n\t},\n\tparseMarkdown(token, helpers) {\n\t\treturn helpers.applyMark(this.name || \"underline\", helpers.parseInline(token.tokens || []));\n\t},\n\trenderMarkdown(node, helpers) {\n\t\treturn `++${helpers.renderChildren(node)}++`;\n\t},\n\tmarkdownTokenizer: {\n\t\tname: \"underline\",\n\t\tlevel: \"inline\",\n\t\tstart(src) {\n\t\t\treturn src.indexOf(\"++\");\n\t\t},\n\t\ttokenize(src, _tokens, lexer) {\n\t\t\tconst match = /^(\\+\\+)([\\s\\S]+?)(\\+\\+)/.exec(src);\n\t\t\tif (!match) return;\n\t\t\tconst innerContent = match[2].trim();\n\t\t\treturn {\n\t\t\t\ttype: \"underline\",\n\t\t\t\traw: match[0],\n\t\t\t\ttext: innerContent,\n\t\t\t\ttokens: lexer.inlineTokens(innerContent)\n\t\t\t};\n\t\t}\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tsetUnderline: () => ({ commands }) => {\n\t\t\t\treturn commands.setMark(this.name);\n\t\t\t},\n\t\t\ttoggleUnderline: () => ({ commands }) => {\n\t\t\t\treturn commands.toggleMark(this.name);\n\t\t\t},\n\t\t\tunsetUnderline: () => ({ commands }) => {\n\t\t\t\treturn commands.unsetMark(this.name);\n\t\t\t}\n\t\t};\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-u\": () => this.editor.commands.toggleUnderline(),\n\t\t\t\"Mod-U\": () => this.editor.commands.toggleUnderline()\n\t\t};\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = Underline;\n//#endregion\nexport { Underline, src_default as default };\n\n//# sourceMappingURL=index.js.map","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n/**\nCreate a plugin that, when added to a ProseMirror instance,\ncauses a decoration to show up at the drop position when something\nis dragged over the editor.\n\nNodes may add a `disableDropCursor` property to their spec to\ncontrol the showing of a drop cursor inside them. This may be a\nboolean or a function, which will be called with a view and a\nposition, and should return a boolean.\n*/\nfunction dropCursor(options = {}) {\n    return new Plugin({\n        view(editorView) { return new DropCursorView(editorView, options); }\n    });\n}\nclass DropCursorView {\n    constructor(editorView, options) {\n        var _a;\n        this.editorView = editorView;\n        this.cursorPos = null;\n        this.element = null;\n        this.timeout = -1;\n        this.lastDragEvent = null;\n        this.width = (_a = options.width) !== null && _a !== void 0 ? _a : 1;\n        this.color = options.color === false ? undefined : (options.color || \"black\");\n        this.class = options.class;\n        this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(name => {\n            let handler = (e) => { this[name](e); };\n            editorView.dom.addEventListener(name, handler);\n            return { name, handler };\n        });\n    }\n    destroy() {\n        this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler));\n    }\n    update(editorView, prevState) {\n        if (this.cursorPos != null && prevState.doc != editorView.state.doc) {\n            // if we currently have an on-going drag event\n            // we need to update the cursor position again and update the overlay\n            if (this.lastDragEvent) {\n                let target = this.computeTarget(this.lastDragEvent);\n                if (target == this.cursorPos)\n                    this.updateOverlay();\n                else\n                    this.setCursor(target);\n            }\n            else {\n                this.updateOverlay();\n            }\n        }\n    }\n    setCursor(pos) {\n        if (pos == this.cursorPos)\n            return;\n        this.cursorPos = pos;\n        if (pos == null) {\n            this.element.parentNode.removeChild(this.element);\n            this.element = null;\n        }\n        else {\n            this.updateOverlay();\n        }\n    }\n    updateOverlay() {\n        let $pos = this.editorView.state.doc.resolve(this.cursorPos);\n        let isBlock = !$pos.parent.inlineContent, rect;\n        let editorDOM = this.editorView.dom, editorRect = editorDOM.getBoundingClientRect();\n        let scaleX = editorRect.width / editorDOM.offsetWidth, scaleY = editorRect.height / editorDOM.offsetHeight;\n        if (isBlock) {\n            let before = $pos.nodeBefore, after = $pos.nodeAfter;\n            if (before || after) {\n                let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0));\n                if (node) {\n                    let nodeRect = node.getBoundingClientRect();\n                    let top = before ? nodeRect.bottom : nodeRect.top;\n                    if (before && after)\n                        top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2;\n                    let halfWidth = (this.width / 2) * scaleY;\n                    rect = { left: nodeRect.left, right: nodeRect.right, top: top - halfWidth, bottom: top + halfWidth };\n                }\n            }\n        }\n        if (!rect) {\n            let coords = this.editorView.coordsAtPos(this.cursorPos);\n            let halfWidth = (this.width / 2) * scaleX;\n            rect = { left: coords.left - halfWidth, right: coords.left + halfWidth, top: coords.top, bottom: coords.bottom };\n        }\n        let parent = this.editorView.dom.offsetParent;\n        if (!this.element) {\n            this.element = parent.appendChild(document.createElement(\"div\"));\n            if (this.class)\n                this.element.className = this.class;\n            this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none;\";\n            if (this.color) {\n                this.element.style.backgroundColor = this.color;\n            }\n        }\n        this.element.classList.toggle(\"prosemirror-dropcursor-block\", isBlock);\n        this.element.classList.toggle(\"prosemirror-dropcursor-inline\", !isBlock);\n        let parentLeft, parentTop;\n        if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n            parentLeft = -pageXOffset;\n            parentTop = -pageYOffset;\n        }\n        else {\n            let rect = parent.getBoundingClientRect();\n            let parentScaleX = rect.width / parent.offsetWidth, parentScaleY = rect.height / parent.offsetHeight;\n            parentLeft = rect.left - parent.scrollLeft * parentScaleX;\n            parentTop = rect.top - parent.scrollTop * parentScaleY;\n        }\n        this.element.style.left = (rect.left - parentLeft) / scaleX + \"px\";\n        this.element.style.top = (rect.top - parentTop) / scaleY + \"px\";\n        this.element.style.width = (rect.right - rect.left) / scaleX + \"px\";\n        this.element.style.height = (rect.bottom - rect.top) / scaleY + \"px\";\n    }\n    scheduleRemoval(timeout) {\n        clearTimeout(this.timeout);\n        this.timeout = setTimeout(() => this.setCursor(null), timeout);\n    }\n    computeTarget(event) {\n        let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY });\n        let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside);\n        let disableDropCursor = node && node.type.spec.disableDropCursor;\n        let disabled = typeof disableDropCursor == \"function\"\n            ? disableDropCursor(this.editorView, pos, event)\n            : disableDropCursor;\n        if (!pos || disabled)\n            return null;\n        let target = pos.pos;\n        if (this.editorView.dragging && this.editorView.dragging.slice) {\n            let point = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n            if (point != null)\n                target = point;\n        }\n        return target;\n    }\n    dragover(event) {\n        if (!this.editorView.editable)\n            return;\n        this.lastDragEvent = event;\n        let target = this.computeTarget(event);\n        if (target != null) {\n            this.setCursor(target);\n            this.scheduleRemoval(5000);\n        }\n    }\n    dragend() {\n        this.scheduleRemoval(20);\n    }\n    drop() {\n        this.scheduleRemoval(20);\n    }\n    dragleave(event) {\n        if (!this.editorView.dom.contains(event.relatedTarget))\n            this.setCursor(null);\n    }\n}\n\nexport { dropCursor };\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { Selection, NodeSelection, TextSelection, Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\n\n/**\nGap cursor selections are represented using this class. Its\n`$anchor` and `$head` properties both point at the cursor position.\n*/\nclass GapCursor extends Selection {\n    /**\n    Create a gap cursor.\n    */\n    constructor($pos) {\n        super($pos, $pos);\n    }\n    map(doc, mapping) {\n        let $pos = doc.resolve(mapping.map(this.head));\n        return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n    }\n    content() { return Slice.empty; }\n    eq(other) {\n        return other instanceof GapCursor && other.head == this.head;\n    }\n    toJSON() {\n        return { type: \"gapcursor\", pos: this.head };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for GapCursor.fromJSON\");\n        return new GapCursor(doc.resolve(json.pos));\n    }\n    /**\n    @internal\n    */\n    getBookmark() { return new GapBookmark(this.anchor); }\n    /**\n    @internal\n    */\n    static valid($pos) {\n        let parent = $pos.parent;\n        if (parent.inlineContent || !closedBefore($pos) || !closedAfter($pos))\n            return false;\n        let override = parent.type.spec.allowGapCursor;\n        if (override != null)\n            return override;\n        let deflt = parent.contentMatchAt($pos.index()).defaultType;\n        return deflt && deflt.isTextblock;\n    }\n    /**\n    @internal\n    */\n    static findGapCursorFrom($pos, dir, mustMove = false) {\n        search: for (;;) {\n            if (!mustMove && GapCursor.valid($pos))\n                return $pos;\n            let pos = $pos.pos, next = null;\n            // Scan up from this position\n            for (let d = $pos.depth;; d--) {\n                let parent = $pos.node(d);\n                if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n                    next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n                    break;\n                }\n                else if (d == 0) {\n                    return null;\n                }\n                pos += dir;\n                let $cur = $pos.doc.resolve(pos);\n                if (GapCursor.valid($cur))\n                    return $cur;\n            }\n            // And then down into the next node\n            for (;;) {\n                let inside = dir > 0 ? next.firstChild : next.lastChild;\n                if (!inside) {\n                    if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n                        $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n                        mustMove = false;\n                        continue search;\n                    }\n                    break;\n                }\n                next = inside;\n                pos += dir;\n                let $cur = $pos.doc.resolve(pos);\n                if (GapCursor.valid($cur))\n                    return $cur;\n            }\n            return null;\n        }\n    }\n}\nGapCursor.prototype.visible = false;\nGapCursor.findFrom = GapCursor.findGapCursorFrom;\nSelection.jsonID(\"gapcursor\", GapCursor);\nclass GapBookmark {\n    constructor(pos) {\n        this.pos = pos;\n    }\n    map(mapping) {\n        return new GapBookmark(mapping.map(this.pos));\n    }\n    resolve(doc) {\n        let $pos = doc.resolve(this.pos);\n        return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n    }\n}\nfunction needsGap(type) {\n    return type.isAtom || type.spec.isolating || type.spec.createGapCursor;\n}\nfunction closedBefore($pos) {\n    for (let d = $pos.depth; d >= 0; d--) {\n        let index = $pos.index(d), parent = $pos.node(d);\n        // At the start of this parent, look at next one\n        if (index == 0) {\n            if (parent.type.spec.isolating)\n                return true;\n            continue;\n        }\n        // See if the node before (or its first ancestor) is closed\n        for (let before = parent.child(index - 1);; before = before.lastChild) {\n            if ((before.childCount == 0 && !before.inlineContent) || needsGap(before.type))\n                return true;\n            if (before.inlineContent)\n                return false;\n        }\n    }\n    // Hit start of document\n    return true;\n}\nfunction closedAfter($pos) {\n    for (let d = $pos.depth; d >= 0; d--) {\n        let index = $pos.indexAfter(d), parent = $pos.node(d);\n        if (index == parent.childCount) {\n            if (parent.type.spec.isolating)\n                return true;\n            continue;\n        }\n        for (let after = parent.child(index);; after = after.firstChild) {\n            if ((after.childCount == 0 && !after.inlineContent) || needsGap(after.type))\n                return true;\n            if (after.inlineContent)\n                return false;\n        }\n    }\n    return true;\n}\n\n/**\nCreate a gap cursor plugin. When enabled, this will capture clicks\nnear and arrow-key-motion past places that don't have a normally\nselectable position nearby, and create a gap cursor selection for\nthem. The cursor is drawn as an element with class\n`ProseMirror-gapcursor`. You can either include\n`style/gapcursor.css` from the package's directory or add your own\nstyles to make it visible.\n*/\nfunction gapCursor() {\n    return new Plugin({\n        props: {\n            decorations: drawGapCursor,\n            createSelectionBetween(_view, $anchor, $head) {\n                return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null;\n            },\n            handleClick,\n            handleKeyDown,\n            handleDOMEvents: { beforeinput: beforeinput }\n        }\n    });\n}\nconst handleKeyDown = keydownHandler({\n    \"ArrowLeft\": arrow(\"horiz\", -1),\n    \"ArrowRight\": arrow(\"horiz\", 1),\n    \"ArrowUp\": arrow(\"vert\", -1),\n    \"ArrowDown\": arrow(\"vert\", 1)\n});\nfunction arrow(axis, dir) {\n    const dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n    return function (state, dispatch, view) {\n        let sel = state.selection;\n        let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n        if (sel instanceof TextSelection) {\n            if (!view.endOfTextblock(dirStr) || $start.depth == 0)\n                return false;\n            mustMove = false;\n            $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n        }\n        let $found = GapCursor.findGapCursorFrom($start, dir, mustMove);\n        if (!$found)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.setSelection(new GapCursor($found)));\n        return true;\n    };\n}\nfunction handleClick(view, pos, event) {\n    if (!view || !view.editable)\n        return false;\n    let $pos = view.state.doc.resolve(pos);\n    if (!GapCursor.valid($pos))\n        return false;\n    let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY });\n    if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside)))\n        return false;\n    view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n    return true;\n}\n// This is a hack that, when a composition starts while a gap cursor\n// is active, quickly creates an inline context for the composition to\n// happen in, to avoid it being aborted by the DOM selection being\n// moved into a valid position.\nfunction beforeinput(view, event) {\n    if (event.inputType != \"insertCompositionText\" || !(view.state.selection instanceof GapCursor))\n        return false;\n    let { $from } = view.state.selection;\n    let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text);\n    if (!insert)\n        return false;\n    let frag = Fragment.empty;\n    for (let i = insert.length - 1; i >= 0; i--)\n        frag = Fragment.from(insert[i].createAndFill(null, frag));\n    let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0));\n    tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1)));\n    view.dispatch(tr);\n    return false;\n}\nfunction drawGapCursor(state) {\n    if (!(state.selection instanceof GapCursor))\n        return null;\n    let node = document.createElement(\"div\");\n    node.className = \"ProseMirror-gapcursor\";\n    return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: \"gapcursor\" })]);\n}\n\nexport { GapCursor, gapCursor };\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class<T> A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n  if (!other.length) { return this }\n  other = RopeSequence.from(other);\n\n  return (!this.length && other) ||\n    (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n    (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n    this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n  if (!other.length) { return this }\n  return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n  return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence<T>\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  if (from >= to) { return RopeSequence.empty }\n  return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n  if (i < 0 || i >= this.length) { return undefined }\n  return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  if (from <= to)\n    { this.forEachInner(f, from, to, 0); }\n  else\n    { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  var result = [];\n  this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n  return result\n};\n\n// :: (?union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n  if (values instanceof RopeSequence) { return values }\n  return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n  function Leaf(values) {\n    RopeSequence.call(this);\n    this.values = values;\n  }\n\n  if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n  Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n  Leaf.prototype.constructor = Leaf;\n\n  var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n  Leaf.prototype.flatten = function flatten () {\n    return this.values\n  };\n\n  Leaf.prototype.sliceInner = function sliceInner (from, to) {\n    if (from == 0 && to == this.length) { return this }\n    return new Leaf(this.values.slice(from, to))\n  };\n\n  Leaf.prototype.getInner = function getInner (i) {\n    return this.values[i]\n  };\n\n  Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n    for (var i = from; i < to; i++)\n      { if (f(this.values[i], start + i) === false) { return false } }\n  };\n\n  Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n    for (var i = from - 1; i >= to; i--)\n      { if (f(this.values[i], start + i) === false) { return false } }\n  };\n\n  Leaf.prototype.leafAppend = function leafAppend (other) {\n    if (this.length + other.length <= GOOD_LEAF_SIZE)\n      { return new Leaf(this.values.concat(other.flatten())) }\n  };\n\n  Leaf.prototype.leafPrepend = function leafPrepend (other) {\n    if (this.length + other.length <= GOOD_LEAF_SIZE)\n      { return new Leaf(other.flatten().concat(this.values)) }\n  };\n\n  prototypeAccessors.length.get = function () { return this.values.length };\n\n  prototypeAccessors.depth.get = function () { return 0 };\n\n  Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n  return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n  function Append(left, right) {\n    RopeSequence.call(this);\n    this.left = left;\n    this.right = right;\n    this.length = left.length + right.length;\n    this.depth = Math.max(left.depth, right.depth) + 1;\n  }\n\n  if ( RopeSequence ) Append.__proto__ = RopeSequence;\n  Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n  Append.prototype.constructor = Append;\n\n  Append.prototype.flatten = function flatten () {\n    return this.left.flatten().concat(this.right.flatten())\n  };\n\n  Append.prototype.getInner = function getInner (i) {\n    return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n  };\n\n  Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n    var leftLen = this.left.length;\n    if (from < leftLen &&\n        this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n      { return false }\n    if (to > leftLen &&\n        this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n      { return false }\n  };\n\n  Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n    var leftLen = this.left.length;\n    if (from > leftLen &&\n        this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n      { return false }\n    if (to < leftLen &&\n        this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n      { return false }\n  };\n\n  Append.prototype.sliceInner = function sliceInner (from, to) {\n    if (from == 0 && to == this.length) { return this }\n    var leftLen = this.left.length;\n    if (to <= leftLen) { return this.left.slice(from, to) }\n    if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n    return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n  };\n\n  Append.prototype.leafAppend = function leafAppend (other) {\n    var inner = this.right.leafAppend(other);\n    if (inner) { return new Append(this.left, inner) }\n  };\n\n  Append.prototype.leafPrepend = function leafPrepend (other) {\n    var inner = this.left.leafPrepend(other);\n    if (inner) { return new Append(inner, this.right) }\n  };\n\n  Append.prototype.appendInner = function appendInner (other) {\n    if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n      { return new Append(this.left, new Append(this.right, other)) }\n    return new Append(this, other)\n  };\n\n  return Append;\n}(RopeSequence));\n\nexport default RopeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n// Used to schedule history compression\nconst max_empty_items = 500;\nclass Branch {\n    constructor(items, eventCount) {\n        this.items = items;\n        this.eventCount = eventCount;\n    }\n    // Pop the latest event off the branch's history and apply it\n    // to a document transform.\n    popEvent(state, preserveItems) {\n        if (this.eventCount == 0)\n            return null;\n        let end = this.items.length;\n        for (;; end--) {\n            let next = this.items.get(end - 1);\n            if (next.selection) {\n                --end;\n                break;\n            }\n        }\n        let remap, mapFrom;\n        if (preserveItems) {\n            remap = this.remapping(end, this.items.length);\n            mapFrom = remap.maps.length;\n        }\n        let transform = state.tr;\n        let selection, remaining;\n        let addAfter = [], addBefore = [];\n        this.items.forEach((item, i) => {\n            if (!item.step) {\n                if (!remap) {\n                    remap = this.remapping(end, i + 1);\n                    mapFrom = remap.maps.length;\n                }\n                mapFrom--;\n                addBefore.push(item);\n                return;\n            }\n            if (remap) {\n                addBefore.push(new Item(item.map));\n                let step = item.step.map(remap.slice(mapFrom)), map;\n                if (step && transform.maybeStep(step).doc) {\n                    map = transform.mapping.maps[transform.mapping.maps.length - 1];\n                    addAfter.push(new Item(map, undefined, undefined, addAfter.length + addBefore.length));\n                }\n                mapFrom--;\n                if (map)\n                    remap.appendMap(map, mapFrom);\n            }\n            else {\n                transform.maybeStep(item.step);\n            }\n            if (item.selection) {\n                selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n                remaining = new Branch(this.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);\n                return false;\n            }\n        }, this.items.length, 0);\n        return { remaining: remaining, transform, selection: selection };\n    }\n    // Create a new branch with the given transform added.\n    addTransform(transform, selection, histOptions, preserveItems) {\n        let newItems = [], eventCount = this.eventCount;\n        let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n        for (let i = 0; i < transform.steps.length; i++) {\n            let step = transform.steps[i].invert(transform.docs[i]);\n            let item = new Item(transform.mapping.maps[i], step, selection), merged;\n            if (merged = lastItem && lastItem.merge(item)) {\n                item = merged;\n                if (i)\n                    newItems.pop();\n                else\n                    oldItems = oldItems.slice(0, oldItems.length - 1);\n            }\n            newItems.push(item);\n            if (selection) {\n                eventCount++;\n                selection = undefined;\n            }\n            if (!preserveItems)\n                lastItem = item;\n        }\n        let overflow = eventCount - histOptions.depth;\n        if (overflow > DEPTH_OVERFLOW) {\n            oldItems = cutOffEvents(oldItems, overflow);\n            eventCount -= overflow;\n        }\n        return new Branch(oldItems.append(newItems), eventCount);\n    }\n    remapping(from, to) {\n        let maps = new Mapping;\n        this.items.forEach((item, i) => {\n            let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n                ? maps.maps.length - item.mirrorOffset : undefined;\n            maps.appendMap(item.map, mirrorPos);\n        }, from, to);\n        return maps;\n    }\n    addMaps(array) {\n        if (this.eventCount == 0)\n            return this;\n        return new Branch(this.items.append(array.map(map => new Item(map))), this.eventCount);\n    }\n    // When the collab module receives remote changes, the history has\n    // to know about those, so that it can adjust the steps that were\n    // rebased on top of the remote changes, and include the position\n    // maps for the remote changes in its array of items.\n    rebased(rebasedTransform, rebasedCount) {\n        if (!this.eventCount)\n            return this;\n        let rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n        let mapping = rebasedTransform.mapping;\n        let newUntil = rebasedTransform.steps.length;\n        let eventCount = this.eventCount;\n        this.items.forEach(item => { if (item.selection)\n            eventCount--; }, start);\n        let iRebased = rebasedCount;\n        this.items.forEach(item => {\n            let pos = mapping.getMirror(--iRebased);\n            if (pos == null)\n                return;\n            newUntil = Math.min(newUntil, pos);\n            let map = mapping.maps[pos];\n            if (item.step) {\n                let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n                let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n                if (selection)\n                    eventCount++;\n                rebasedItems.push(new Item(map, step, selection));\n            }\n            else {\n                rebasedItems.push(new Item(map));\n            }\n        }, start);\n        let newMaps = [];\n        for (let i = rebasedCount; i < newUntil; i++)\n            newMaps.push(new Item(mapping.maps[i]));\n        let items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n        let branch = new Branch(items, eventCount);\n        if (branch.emptyItemCount() > max_empty_items)\n            branch = branch.compress(this.items.length - rebasedItems.length);\n        return branch;\n    }\n    emptyItemCount() {\n        let count = 0;\n        this.items.forEach(item => { if (!item.step)\n            count++; });\n        return count;\n    }\n    // Compressing a branch means rewriting it to push the air (map-only\n    // items) out. During collaboration, these naturally accumulate\n    // because each remote change adds one. The `upto` argument is used\n    // to ensure that only the items below a given level are compressed,\n    // because `rebased` relies on a clean, untouched set of items in\n    // order to associate old items with rebased steps.\n    compress(upto = this.items.length) {\n        let remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n        let items = [], events = 0;\n        this.items.forEach((item, i) => {\n            if (i >= upto) {\n                items.push(item);\n                if (item.selection)\n                    events++;\n            }\n            else if (item.step) {\n                let step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n                mapFrom--;\n                if (map)\n                    remap.appendMap(map, mapFrom);\n                if (step) {\n                    let selection = item.selection && item.selection.map(remap.slice(mapFrom));\n                    if (selection)\n                        events++;\n                    let newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n                    if (merged = items.length && items[last].merge(newItem))\n                        items[last] = merged;\n                    else\n                        items.push(newItem);\n                }\n            }\n            else if (item.map) {\n                mapFrom--;\n            }\n        }, this.items.length, 0);\n        return new Branch(RopeSequence.from(items.reverse()), events);\n    }\n}\nBranch.empty = new Branch(RopeSequence.empty, 0);\nfunction cutOffEvents(items, n) {\n    let cutPoint;\n    items.forEach((item, i) => {\n        if (item.selection && (n-- == 0)) {\n            cutPoint = i;\n            return false;\n        }\n    });\n    return items.slice(cutPoint);\n}\nclass Item {\n    constructor(\n    // The (forward) step map for this item.\n    map, \n    // The inverted step\n    step, \n    // If this is non-null, this item is the start of a group, and\n    // this selection is the starting selection for the group (the one\n    // that was active before the first step was applied)\n    selection, \n    // If this item is the inverse of a previous mapping on the stack,\n    // this points at the inverse's offset\n    mirrorOffset) {\n        this.map = map;\n        this.step = step;\n        this.selection = selection;\n        this.mirrorOffset = mirrorOffset;\n    }\n    merge(other) {\n        if (this.step && other.step && !other.selection) {\n            let step = other.step.merge(this.step);\n            if (step)\n                return new Item(step.getMap().invert(), step, this.selection);\n        }\n    }\n}\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nclass HistoryState {\n    constructor(done, undone, prevRanges, prevTime, prevComposition) {\n        this.done = done;\n        this.undone = undone;\n        this.prevRanges = prevRanges;\n        this.prevTime = prevTime;\n        this.prevComposition = prevComposition;\n    }\n}\nconst DEPTH_OVERFLOW = 20;\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n    let historyTr = tr.getMeta(historyKey), rebased;\n    if (historyTr)\n        return historyTr.historyState;\n    if (tr.getMeta(closeHistoryKey))\n        history = new HistoryState(history.done, history.undone, null, 0, -1);\n    let appended = tr.getMeta(\"appendedTransaction\");\n    if (tr.steps.length == 0) {\n        return history;\n    }\n    else if (appended && appended.getMeta(historyKey)) {\n        if (appended.getMeta(historyKey).redo)\n            return new HistoryState(history.done.addTransform(tr, undefined, options, mustPreserveItems(state)), history.undone, rangesFor(tr.mapping.maps), history.prevTime, history.prevComposition);\n        else\n            return new HistoryState(history.done, history.undone.addTransform(tr, undefined, options, mustPreserveItems(state)), null, history.prevTime, history.prevComposition);\n    }\n    else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n        // Group transforms that occur in quick succession into one event.\n        let composition = tr.getMeta(\"composition\");\n        let newGroup = history.prevTime == 0 ||\n            (!appended && history.prevComposition != composition &&\n                (history.prevTime < (tr.time || 0) - options.newGroupDelay || !isAdjacentTo(tr, history.prevRanges)));\n        let prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps);\n        return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : undefined, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time, composition == null ? history.prevComposition : composition);\n    }\n    else if (rebased = tr.getMeta(\"rebased\")) {\n        // Used by the collab module to tell the history that some of its\n        // content has been rebased.\n        return new HistoryState(history.done.rebased(tr, rebased), history.undone.rebased(tr, rebased), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n    }\n    else {\n        return new HistoryState(history.done.addMaps(tr.mapping.maps), history.undone.addMaps(tr.mapping.maps), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n    }\n}\nfunction isAdjacentTo(transform, prevRanges) {\n    if (!prevRanges)\n        return false;\n    if (!transform.docChanged)\n        return true;\n    let adjacent = false;\n    transform.mapping.maps[0].forEach((start, end) => {\n        for (let i = 0; i < prevRanges.length; i += 2)\n            if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n                adjacent = true;\n    });\n    return adjacent;\n}\nfunction rangesFor(maps) {\n    let result = [];\n    for (let i = maps.length - 1; i >= 0 && result.length == 0; i--)\n        maps[i].forEach((_from, _to, from, to) => result.push(from, to));\n    return result;\n}\nfunction mapRanges(ranges, mapping) {\n    if (!ranges)\n        return null;\n    let result = [];\n    for (let i = 0; i < ranges.length; i += 2) {\n        let from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n        if (from <= to)\n            result.push(from, to);\n    }\n    return result;\n}\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, redo) {\n    let preserveItems = mustPreserveItems(state);\n    let histOptions = historyKey.get(state).spec.config;\n    let pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n    if (!pop)\n        return null;\n    let selection = pop.selection.resolve(pop.transform.doc);\n    let added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);\n    let newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0, -1);\n    return pop.transform.setSelection(selection).setMeta(historyKey, { redo, historyState: newHist });\n}\nlet cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n    let plugins = state.plugins;\n    if (cachedPreserveItemsPlugins != plugins) {\n        cachedPreserveItems = false;\n        cachedPreserveItemsPlugins = plugins;\n        for (let i = 0; i < plugins.length; i++)\n            if (plugins[i].spec.historyPreserveItems) {\n                cachedPreserveItems = true;\n                break;\n            }\n    }\n    return cachedPreserveItems;\n}\n/**\nSet a flag on the given transaction that will prevent further steps\nfrom being appended to an existing history event (so that they\nrequire a separate undo command to undo).\n*/\nfunction closeHistory(tr) {\n    return tr.setMeta(closeHistoryKey, true);\n}\nconst historyKey = new PluginKey(\"history\");\nconst closeHistoryKey = new PluginKey(\"closeHistory\");\n/**\nReturns a plugin that enables the undo history for an editor. The\nplugin will track undo and redo stacks, which can be used with the\n[`undo`](https://prosemirror.net/docs/ref/#history.undo) and [`redo`](https://prosemirror.net/docs/ref/#history.redo) commands.\n\nYou can set an `\"addToHistory\"` [metadata\nproperty](https://prosemirror.net/docs/ref/#state.Transaction.setMeta) of `false` on a transaction\nto prevent it from being rolled back by undo.\n*/\nfunction history(config = {}) {\n    config = { depth: config.depth || 100,\n        newGroupDelay: config.newGroupDelay || 500 };\n    return new Plugin({\n        key: historyKey,\n        state: {\n            init() {\n                return new HistoryState(Branch.empty, Branch.empty, null, 0, -1);\n            },\n            apply(tr, hist, state) {\n                return applyTransaction(hist, state, tr, config);\n            }\n        },\n        config,\n        props: {\n            handleDOMEvents: {\n                beforeinput(view, e) {\n                    let inputType = e.inputType;\n                    let command = inputType == \"historyUndo\" ? undo : inputType == \"historyRedo\" ? redo : null;\n                    if (!command || !view.editable)\n                        return false;\n                    e.preventDefault();\n                    return command(view.state, view.dispatch);\n                }\n            }\n        }\n    });\n}\nfunction buildCommand(redo, scroll) {\n    return (state, dispatch) => {\n        let hist = historyKey.getState(state);\n        if (!hist || (redo ? hist.undone : hist.done).eventCount == 0)\n            return false;\n        if (dispatch) {\n            let tr = histTransaction(hist, state, redo);\n            if (tr)\n                dispatch(scroll ? tr.scrollIntoView() : tr);\n        }\n        return true;\n    };\n}\n/**\nA command function that undoes the last change, if any.\n*/\nconst undo = buildCommand(false, true);\n/**\nA command function that redoes the last undone change, if any.\n*/\nconst redo = buildCommand(true, true);\n/**\nA command function that undoes the last change. Don't scroll the\nselection into view.\n*/\nconst undoNoScroll = buildCommand(false, false);\n/**\nA command function that redoes the last undone change. Don't\nscroll the selection into view.\n*/\nconst redoNoScroll = buildCommand(true, false);\n/**\nThe amount of undoable events available in a given state.\n*/\nfunction undoDepth(state) {\n    let hist = historyKey.getState(state);\n    return hist ? hist.done.eventCount : 0;\n}\n/**\nThe amount of redoable events available in a given editor state.\n*/\nfunction redoDepth(state) {\n    let hist = historyKey.getState(state);\n    return hist ? hist.undone.eventCount : 0;\n}\n/**\nReturns true if the given transaction was generated by the history\nplugin.\n*/\nfunction isHistoryTransaction(tr) {\n    return tr.getMeta(historyKey) != null;\n}\n\nexport { closeHistory, history, isHistoryTransaction, redo, redoDepth, redoNoScroll, undo, undoDepth, undoNoScroll };\n","import { Extension, callOrReturn, getChangedRanges, getExtensionField, isNodeEmpty, isNodeSelection } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { dropCursor } from \"@tiptap/pm/dropcursor\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { gapCursor } from \"@tiptap/pm/gapcursor\";\nimport { history, redo, undo } from \"@tiptap/pm/history\";\n//#region src/character-count/character-count.ts\n/**\n* This extension allows you to count the characters and words of your document.\n* @see https://tiptap.dev/api/extensions/character-count\n*/\nconst CharacterCount = Extension.create({\n\tname: \"characterCount\",\n\taddOptions() {\n\t\treturn {\n\t\t\tlimit: null,\n\t\t\tautoTrim: true,\n\t\t\tmode: \"textSize\",\n\t\t\ttextCounter: (text) => text.length,\n\t\t\twordCounter: (text) => text.split(\" \").filter((word) => word !== \"\").length\n\t\t};\n\t},\n\taddStorage() {\n\t\treturn {\n\t\t\tcharacters: () => 0,\n\t\t\twords: () => 0\n\t\t};\n\t},\n\tonBeforeCreate() {\n\t\tthis.storage.characters = (options) => {\n\t\t\tconst node = (options === null || options === void 0 ? void 0 : options.node) || this.editor.state.doc;\n\t\t\tif (((options === null || options === void 0 ? void 0 : options.mode) || this.options.mode) === \"textSize\") {\n\t\t\t\tconst text = node.textBetween(0, node.content.size, void 0, \" \");\n\t\t\t\treturn this.options.textCounter(text);\n\t\t\t}\n\t\t\treturn node.nodeSize;\n\t\t};\n\t\tthis.storage.words = (options) => {\n\t\t\tconst node = (options === null || options === void 0 ? void 0 : options.node) || this.editor.state.doc;\n\t\t\tconst text = node.textBetween(0, node.content.size, \" \", \" \");\n\t\t\treturn this.options.wordCounter(text);\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\tlet initialEvaluationDone = false;\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"characterCount\"),\n\t\t\tappendTransaction: (transactions, oldState, newState) => {\n\t\t\t\tif (initialEvaluationDone) return;\n\t\t\t\tconst limit = this.options.limit;\n\t\t\t\tconst autoTrim = this.options.autoTrim;\n\t\t\t\tif (limit === null || limit === void 0 || limit === 0 || autoTrim === false) {\n\t\t\t\t\tinitialEvaluationDone = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst initialContentSize = this.storage.characters({ node: newState.doc });\n\t\t\t\tif (initialContentSize > limit) {\n\t\t\t\t\tconst over = initialContentSize - limit;\n\t\t\t\t\tconst from = 0;\n\t\t\t\t\tconst to = over;\n\t\t\t\t\tconsole.warn(`[CharacterCount] Initial content exceeded limit of ${limit} characters. Content was automatically trimmed.`);\n\t\t\t\t\tconst tr = newState.tr.deleteRange(from, to);\n\t\t\t\t\tinitialEvaluationDone = true;\n\t\t\t\t\treturn tr;\n\t\t\t\t}\n\t\t\t\tinitialEvaluationDone = true;\n\t\t\t},\n\t\t\tfilterTransaction: (transaction, state) => {\n\t\t\t\tconst limit = this.options.limit;\n\t\t\t\tif (!transaction.docChanged || limit === 0 || limit === null || limit === void 0) return true;\n\t\t\t\tconst oldSize = this.storage.characters({ node: state.doc });\n\t\t\t\tconst newSize = this.storage.characters({ node: transaction.doc });\n\t\t\t\tif (newSize <= limit) return true;\n\t\t\t\tif (oldSize > limit && newSize > limit && newSize <= oldSize) return true;\n\t\t\t\tif (oldSize > limit && newSize > limit && newSize > oldSize) return false;\n\t\t\t\tif (!transaction.getMeta(\"paste\")) return false;\n\t\t\t\tconst pos = transaction.selection.$head.pos;\n\t\t\t\tconst from = pos - (newSize - limit);\n\t\t\t\tconst to = pos;\n\t\t\t\ttransaction.deleteRange(from, to);\n\t\t\t\tif (this.storage.characters({ node: transaction.doc }) > limit) return false;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/drop-cursor/drop-cursor.ts\n/**\n* This extension allows you to add a drop cursor to your editor.\n* A drop cursor is a line that appears when you drag and drop content\n* in-between nodes.\n* @see https://tiptap.dev/api/extensions/dropcursor\n*/\nconst Dropcursor = Extension.create({\n\tname: \"dropCursor\",\n\taddOptions() {\n\t\treturn {\n\t\t\tcolor: \"currentColor\",\n\t\t\twidth: 1,\n\t\t\tclass: void 0\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [dropCursor(this.options)];\n\t}\n});\n//#endregion\n//#region src/focus/focus.ts\n/**\n* This extension allows you to add a class to the focused node.\n* @see https://www.tiptap.dev/api/extensions/focus\n*/\nconst Focus = Extension.create({\n\tname: \"focus\",\n\taddOptions() {\n\t\treturn {\n\t\t\tclassName: \"has-focus\",\n\t\t\tmode: \"all\"\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"focus\"),\n\t\t\tprops: { decorations: ({ doc, selection }) => {\n\t\t\t\tconst { isEditable, isFocused } = this.editor;\n\t\t\t\tconst { anchor } = selection;\n\t\t\t\tconst decorations = [];\n\t\t\t\tif (!isEditable || !isFocused) return DecorationSet.create(doc, []);\n\t\t\t\tlet maxLevels = 0;\n\t\t\t\tif (this.options.mode === \"deepest\") doc.descendants((node, pos) => {\n\t\t\t\t\tif (node.isText) return;\n\t\t\t\t\tif (!(anchor >= pos && anchor <= pos + node.nodeSize - 1)) return false;\n\t\t\t\t\tmaxLevels += 1;\n\t\t\t\t});\n\t\t\t\tlet currentLevel = 0;\n\t\t\t\tdoc.descendants((node, pos) => {\n\t\t\t\t\tif (node.isText) return false;\n\t\t\t\t\tif (!(anchor >= pos && anchor <= pos + node.nodeSize - 1)) return false;\n\t\t\t\t\tcurrentLevel += 1;\n\t\t\t\t\tif (this.options.mode === \"deepest\" && maxLevels - currentLevel > 0 || this.options.mode === \"shallowest\" && currentLevel > 1) return this.options.mode === \"deepest\";\n\t\t\t\t\tdecorations.push(Decoration.node(pos, pos + node.nodeSize, { class: this.options.className }));\n\t\t\t\t});\n\t\t\t\treturn DecorationSet.create(doc, decorations);\n\t\t\t} }\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/gap-cursor/gap-cursor.ts\n/**\n* This extension allows you to add a gap cursor to your editor.\n* A gap cursor is a cursor that appears when you click on a place\n* where no content is present, for example inbetween nodes.\n* @see https://tiptap.dev/api/extensions/gapcursor\n*/\nconst Gapcursor = Extension.create({\n\tname: \"gapCursor\",\n\taddProseMirrorPlugins() {\n\t\treturn [gapCursor()];\n\t},\n\textendNodeSchema(extension) {\n\t\tvar _callOrReturn;\n\t\tconst context = {\n\t\t\tname: extension.name,\n\t\t\toptions: extension.options,\n\t\t\tstorage: extension.storage\n\t\t};\n\t\treturn { allowGapCursor: (_callOrReturn = callOrReturn(getExtensionField(extension, \"allowGapCursor\", context))) !== null && _callOrReturn !== void 0 ? _callOrReturn : null };\n\t}\n});\n//#endregion\n//#region src/placeholder/constants.ts\n/** The default data attribute label */\nconst DEFAULT_DATA_ATTRIBUTE = \"placeholder\";\n/** The plugin key used to store and read the placeholder decoration set */\nconst PLUGIN_KEY = new PluginKey(\"tiptap__placeholder\");\n//#endregion\n//#region src/placeholder/utils/createPlaceholderDecoration.ts\n/**\n* Creates a ProseMirror node decoration that applies a placeholder\n* CSS class and data attribute to an empty node.\n* @param options.editor - The editor instance\n* @param options.pos - The position of the node in the document\n* @param options.node - The ProseMirror node\n* @param options.isEmptyDoc - Whether the entire document is empty\n* @param options.hasAnchor - Whether the selection anchor is within the node\n* @param options.dataAttribute - The data attribute name (e.g. `data-placeholder`)\n* @param options.classes - CSS classes for empty nodes and the empty editor\n* @param options.placeholder - The placeholder text or a function that returns it\n* @returns A ProseMirror node decoration with placeholder classes and data attribute\n*/\nfunction createPlaceholderDecoration(options) {\n\tconst { editor, placeholder, dataAttribute, pos, node, isEmptyDoc, hasAnchor, classes: { emptyNode, emptyEditor } } = options;\n\tconst classes = [emptyNode];\n\tif (isEmptyDoc) classes.push(emptyEditor);\n\treturn Decoration.node(pos, pos + node.nodeSize, {\n\t\tclass: classes.join(\" \"),\n\t\t[dataAttribute]: typeof placeholder === \"function\" ? placeholder({\n\t\t\teditor,\n\t\t\tnode,\n\t\t\tpos,\n\t\t\thasAnchor\n\t\t}) : placeholder\n\t});\n}\n//#endregion\n//#region src/placeholder/utils/buildPlaceholderDecorations.ts\nfunction resolveEmptyNodeClass(emptyNodeClass, props) {\n\treturn typeof emptyNodeClass === \"function\" ? emptyNodeClass(props) : emptyNodeClass;\n}\n/**\n* Scans a document range for empty textblocks that should receive placeholder\n* decorations. Used by the slow path and incremental state updates.\n*/\nfunction scanRangeForDecorations({ editor, options, dataAttribute, doc, selection, from, to }) {\n\tconst { anchor } = selection;\n\tconst decorations = [];\n\tconst isEmptyDoc = editor.isEmpty;\n\tdoc.nodesBetween(from, to, (node, pos) => {\n\t\tconst hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize;\n\t\tconst isEmpty = !node.isLeaf && isNodeEmpty(node);\n\t\tif (!node.type.isTextblock) return options.includeChildren;\n\t\tif ((hasAnchor || !options.showOnlyCurrent) && isEmpty) decorations.push(createPlaceholderDecoration({\n\t\t\teditor,\n\t\t\tisEmptyDoc,\n\t\t\tdataAttribute,\n\t\t\thasAnchor,\n\t\t\tplaceholder: options.placeholder,\n\t\t\tclasses: {\n\t\t\t\temptyEditor: options.emptyEditorClass,\n\t\t\t\temptyNode: resolveEmptyNodeClass(options.emptyNodeClass, {\n\t\t\t\t\teditor,\n\t\t\t\t\tnode,\n\t\t\t\t\tpos,\n\t\t\t\t\thasAnchor\n\t\t\t\t})\n\t\t\t},\n\t\t\tnode,\n\t\t\tpos\n\t\t}));\n\t\treturn options.includeChildren;\n\t});\n\treturn decorations;\n}\n/**\n* Builds the placeholder decorations for the current document state.\n* @param options.editor - The editor instance.\n* @param options.options - The resolved placeholder options.\n* @param options.dataAttribute - The prepared `data-*` attribute name.\n* @param options.doc - The current document node.\n* @param options.selection - The current selection.\n* @returns A decoration set, or `null` when no placeholders should be shown.\n*/\nfunction buildPlaceholderDecorations({ editor, options, dataAttribute, doc, selection }) {\n\tif (!(editor.isEditable || !options.showOnlyWhenEditable)) return null;\n\tconst { anchor } = selection;\n\tconst decorations = [];\n\tconst isEmptyDoc = editor.isEmpty;\n\tif (options.showOnlyCurrent && !options.includeChildren) {\n\t\tconst resolved = doc.resolve(anchor);\n\t\tconst node = resolved.depth > 0 ? resolved.node(1) : resolved.nodeAfter;\n\t\tconst nodeStart = resolved.depth > 0 ? resolved.before(1) : anchor;\n\t\tif (node && node.type.isTextblock && isNodeEmpty(node)) {\n\t\t\tconst hasAnchor = anchor >= nodeStart && anchor <= nodeStart + node.nodeSize;\n\t\t\tdecorations.push(createPlaceholderDecoration({\n\t\t\t\teditor,\n\t\t\t\tisEmptyDoc,\n\t\t\t\tdataAttribute,\n\t\t\t\thasAnchor,\n\t\t\t\tplaceholder: options.placeholder,\n\t\t\t\tclasses: {\n\t\t\t\t\temptyEditor: options.emptyEditorClass,\n\t\t\t\t\temptyNode: resolveEmptyNodeClass(options.emptyNodeClass, {\n\t\t\t\t\t\teditor,\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tpos: nodeStart,\n\t\t\t\t\t\thasAnchor\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tnode,\n\t\t\t\tpos: nodeStart\n\t\t\t}));\n\t\t}\n\t} else decorations.push(...scanRangeForDecorations({\n\t\teditor,\n\t\toptions,\n\t\tdataAttribute,\n\t\tdoc,\n\t\tselection,\n\t\tfrom: 0,\n\t\tto: doc.content.size\n\t}));\n\treturn DecorationSet.create(doc, decorations);\n}\n//#endregion\n//#region src/placeholder/utils/resolveTopLevelRange.ts\n/**\n* Resolves a document position to the `[from, to)` range of its containing\n* top-level block node in absolute document positions.\n*/\nfunction resolveTopLevelRange(doc, pos) {\n\tconst resolved = doc.resolve(pos);\n\tif (resolved.depth === 0) {\n\t\tvar _resolved$nodeAfter;\n\t\tconst node = (_resolved$nodeAfter = resolved.nodeAfter) !== null && _resolved$nodeAfter !== void 0 ? _resolved$nodeAfter : resolved.nodeBefore;\n\t\tif (!node) return {\n\t\t\tfrom: pos,\n\t\t\tto: pos\n\t\t};\n\t\tconst nodePos = resolved.nodeAfter ? pos : pos - node.nodeSize;\n\t\treturn {\n\t\t\tfrom: nodePos,\n\t\t\tto: nodePos + node.nodeSize\n\t\t};\n\t}\n\tconst topLevelPos = resolved.before(1);\n\treturn {\n\t\tfrom: topLevelPos,\n\t\tto: topLevelPos + resolved.node(1).nodeSize\n\t};\n}\n/**\n* Converts an absolute document range to content-relative positions used by\n* `Node#nodesBetween` and `Node#forEach` offsets.\n*/\nfunction toContentRelativeRange(doc, range) {\n\treturn {\n\t\tfrom: Math.max(0, range.from - 1),\n\t\tto: Math.min(doc.content.size, range.to - 1)\n\t};\n}\n/**\n* Returns the top-level block ranges that intersect a document change range.\n* Input `from`/`to` are absolute positions (e.g. from `getChangedRanges`).\n* Returned ranges are content-relative, matching `Node#forEach` offsets.\n*/\nfunction getTopLevelBlocksInRange(doc, from, to) {\n\tconst ranges = [];\n\tdoc.forEach((node, offset) => {\n\t\tconst nodeStart = offset;\n\t\tconst nodeEnd = nodeStart + node.nodeSize;\n\t\tconst absNodeStart = nodeStart + 1;\n\t\tconst absNodeEnd = nodeEnd + 1;\n\t\tif (absNodeStart < to && absNodeEnd > from) ranges.push({\n\t\t\tfrom: nodeStart,\n\t\t\tto: nodeEnd\n\t\t});\n\t});\n\treturn ranges;\n}\n/**\n* Sorts ranges by start position and merges overlapping or adjacent ranges.\n*/\nfunction mergeRanges(ranges) {\n\tif (ranges.length === 0) return [];\n\tconst sorted = [...ranges].sort((a, b) => a.from - b.from);\n\tconst merged = [{ ...sorted[0] }];\n\tfor (let i = 1; i < sorted.length; i += 1) {\n\t\tconst last = merged[merged.length - 1];\n\t\tconst current = sorted[i];\n\t\tif (current.from <= last.to) last.to = Math.max(last.to, current.to);\n\t\telse merged.push({ ...current });\n\t}\n\treturn merged;\n}\n//#endregion\n//#region src/placeholder/utils/placeholderStateField.ts\n/**\n* Expands a single changed range to the top-level blocks it touches.\n* Also resolves blocks at range boundaries so split/merge edits update\n* adjacent empty nodes (e.g. a new paragraph after Enter).\n*/\nfunction collectBlocksForChange(doc, change) {\n\tconst ranges = getTopLevelBlocksInRange(doc, change.from, change.to);\n\tranges.push(toContentRelativeRange(doc, resolveTopLevelRange(doc, change.from)));\n\tif (change.to > change.from) ranges.push(toContentRelativeRange(doc, resolveTopLevelRange(doc, Math.min(change.to, doc.content.size + 1) - 1)));\n\telse if (change.from < doc.content.size + 1) ranges.push(toContentRelativeRange(doc, resolveTopLevelRange(doc, Math.min(change.from + 1, doc.content.size))));\n\treturn ranges;\n}\n/**\n* Collects content-relative top-level block ranges that need placeholder\n* decorations recomputed after a transaction.\n*/\nfunction collectRescanRanges(tr, oldState, newState) {\n\tconst ranges = [];\n\tif (tr.docChanged) {\n\t\tconst changes = getChangedRanges(tr);\n\t\tfor (const change of changes) ranges.push(...collectBlocksForChange(newState.doc, change.newRange));\n\t}\n\tif (tr.selectionSet) {\n\t\tranges.push(toContentRelativeRange(newState.doc, resolveTopLevelRange(newState.doc, tr.mapping.map(oldState.selection.anchor))));\n\t\tranges.push(toContentRelativeRange(newState.doc, resolveTopLevelRange(newState.doc, newState.selection.anchor)));\n\t}\n\treturn mergeRanges(ranges);\n}\n/** Clamps a content-relative range to `[0, doc.content.size]`. */\nfunction clampRange(from, to, doc) {\n\tconst clampedFrom = Math.max(0, Math.min(from, doc.content.size));\n\treturn {\n\t\tfrom: clampedFrom,\n\t\tto: Math.max(clampedFrom, Math.min(to, doc.content.size))\n\t};\n}\n/**\n* Removes and rebuilds placeholder decorations within the given ranges.\n* Only drops decorations fully contained in a range so mapped decorations\n* on neighbouring blocks (e.g. at a block boundary) are kept intact.\n*/\nfunction updateDecorationsInRanges({ decorations, ranges, editor, options, dataAttribute, doc, selection }) {\n\tlet next = decorations;\n\tfor (const range of ranges) {\n\t\tconst { from, to } = clampRange(range.from, range.to, doc);\n\t\tconst existing = next.find(from, to).filter((decoration) => decoration.from >= from && decoration.to <= to);\n\t\tif (existing.length) next = next.remove(existing);\n\t\tconst newDecos = scanRangeForDecorations({\n\t\t\teditor,\n\t\t\toptions,\n\t\t\tdataAttribute,\n\t\t\tdoc,\n\t\t\tselection,\n\t\t\tfrom,\n\t\t\tto\n\t\t});\n\t\tif (newDecos.length) next = next.add(doc, newDecos);\n\t}\n\treturn next;\n}\n/**\n* Creates the incremental `StateField<DecorationSet>` used by the slow path\n* (`showOnlyCurrent: false` or `includeChildren: true`).\n*\n* Decorations are mapped through each transaction and only recomputed for\n* top-level blocks touched by document or selection changes.\n* @param options.editor - The editor instance.\n* @param options.options - The resolved placeholder options.\n* @param options.dataAttribute - The prepared `data-*` attribute name.\n* @returns A ProseMirror state field storing the placeholder decoration set.\n*/\nfunction createPlaceholderStateField({ editor, options, dataAttribute }) {\n\treturn {\n\t\tinit(_config, state) {\n\t\t\tconst decorations = buildPlaceholderDecorations({\n\t\t\t\teditor,\n\t\t\t\toptions,\n\t\t\t\tdataAttribute,\n\t\t\t\tdoc: state.doc,\n\t\t\t\tselection: state.selection\n\t\t\t});\n\t\t\treturn decorations !== null && decorations !== void 0 ? decorations : DecorationSet.empty;\n\t\t},\n\t\tapply(tr, prev, oldState, newState) {\n\t\t\tif (!tr.docChanged && !tr.selectionSet) return prev;\n\t\t\treturn updateDecorationsInRanges({\n\t\t\t\tdecorations: prev.map(tr.mapping, tr.doc),\n\t\t\t\tranges: collectRescanRanges(tr, oldState, newState),\n\t\t\t\teditor,\n\t\t\t\toptions,\n\t\t\t\tdataAttribute,\n\t\t\t\tdoc: newState.doc,\n\t\t\t\tselection: newState.selection\n\t\t\t});\n\t\t}\n\t};\n}\n//#endregion\n//#region src/placeholder/utils/preparePlaceholderAttribute.ts\n/**\n* Prepares the placeholder attribute by ensuring it is properly formatted.\n* @param attr - The placeholder attribute string.\n* @returns The prepared placeholder attribute string.\n*/\nfunction preparePlaceholderAttribute(attr) {\n\treturn attr.replace(/\\s+/g, \"-\").replace(/[^a-zA-Z0-9-]/g, \"\").replace(/^[0-9-]+/, \"\").replace(/^-+/, \"\").toLowerCase();\n}\n//#endregion\n//#region src/placeholder/plugins/PlaceholderPlugin.ts\n/**\n* Creates the ProseMirror plugin that renders placeholder decorations.\n* @param options.editor - The editor instance.\n* @param options.options - The resolved placeholder options.\n* @returns The configured placeholder plugin.\n*/\nfunction createPlaceholderPlugin({ editor, options }) {\n\tconst dataAttribute = options.dataAttribute ? `data-${preparePlaceholderAttribute(options.dataAttribute)}` : `data-${DEFAULT_DATA_ATTRIBUTE}`;\n\tconst useResolvedPath = options.showOnlyCurrent && !options.includeChildren;\n\treturn new Plugin({\n\t\tkey: PLUGIN_KEY,\n\t\t...useResolvedPath ? {} : { state: createPlaceholderStateField({\n\t\t\teditor,\n\t\t\toptions,\n\t\t\tdataAttribute\n\t\t}) },\n\t\tprops: { decorations: useResolvedPath ? ({ doc, selection }) => buildPlaceholderDecorations({\n\t\t\teditor,\n\t\t\toptions,\n\t\t\tdataAttribute,\n\t\t\tdoc,\n\t\t\tselection\n\t\t}) : (state) => {\n\t\t\tvar _PLUGIN_KEY$getState;\n\t\t\tif (options.showOnlyWhenEditable && !editor.isEditable) return DecorationSet.empty;\n\t\t\treturn (_PLUGIN_KEY$getState = PLUGIN_KEY.getState(state)) !== null && _PLUGIN_KEY$getState !== void 0 ? _PLUGIN_KEY$getState : DecorationSet.empty;\n\t\t} }\n\t});\n}\n//#endregion\n//#region src/placeholder/placeholder.ts\n/**\n* This extension allows you to add a placeholder to your editor.\n* A placeholder is a text that appears when the editor or a node is empty.\n* @see https://www.tiptap.dev/api/extensions/placeholder\n*/\nconst Placeholder = Extension.create({\n\tname: \"placeholder\",\n\taddOptions() {\n\t\treturn {\n\t\t\temptyEditorClass: \"is-editor-empty\",\n\t\t\temptyNodeClass: \"is-empty\",\n\t\t\tdataAttribute: DEFAULT_DATA_ATTRIBUTE,\n\t\t\tplaceholder: \"Write something …\",\n\t\t\tshowOnlyWhenEditable: true,\n\t\t\tshowOnlyCurrent: true,\n\t\t\tincludeChildren: false\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [createPlaceholderPlugin({\n\t\t\teditor: this.editor,\n\t\t\toptions: this.options\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/selection/selection.ts\n/**\n* Whether the native browser selection should be cleared on blur and restored on focus.\n* Only applies to non-empty text selections in an editable editor.\n*/\nfunction shouldSyncDomSelection(state, editor) {\n\treturn !state.selection.empty && !isNodeSelection(state.selection) && editor.isEditable;\n}\n/**\n* Whether the selection decoration should be rendered to keep the selection\n* visible while the editor is blurred (and not dragging).\n*/\nfunction shouldPreserveSelection(state, editor) {\n\treturn shouldSyncDomSelection(state, editor) && !editor.isFocused && !editor.view.dragging;\n}\nfunction clearDomSelection() {\n\tvar _window$getSelection;\n\t(_window$getSelection = window.getSelection()) === null || _window$getSelection === void 0 || _window$getSelection.removeAllRanges();\n}\n/**\n* Sync the native selection from the editor state.\n* @see https://prosemirror.net/docs/ref/#view.EditorView.focus\n*/\nfunction restoreDomSelection(view) {\n\tview.focus();\n}\n/**\n* This extension allows you to add a class to the selected text when the editor is blurred.\n* It clears the native browser selection on blur (so `::selection` styles do not overlap the\n* decoration) and restores it when the editor is focused again.\n* @see https://www.tiptap.dev/api/extensions/selection\n*/\nconst Selection = Extension.create({\n\tname: \"selection\",\n\taddOptions() {\n\t\treturn { className: \"selection\" };\n\t},\n\taddProseMirrorPlugins() {\n\t\tconst { editor, options } = this;\n\t\treturn [new Plugin({\n\t\t\tkey: new PluginKey(\"selection\"),\n\t\t\tprops: {\n\t\t\t\tdecorations(state) {\n\t\t\t\t\tif (!shouldPreserveSelection(state, editor)) return null;\n\t\t\t\t\treturn DecorationSet.create(state.doc, [Decoration.inline(state.selection.from, state.selection.to, { class: options.className })]);\n\t\t\t\t},\n\t\t\t\thandleDOMEvents: {\n\t\t\t\t\tblur(view) {\n\t\t\t\t\t\tif (!shouldSyncDomSelection(view.state, editor)) return false;\n\t\t\t\t\t\tclearDomSelection();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t},\n\t\t\t\t\tfocus(view) {\n\t\t\t\t\t\tif (!shouldSyncDomSelection(view.state, editor)) return false;\n\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\tif (!editor.isDestroyed && view.hasFocus()) restoreDomSelection(view);\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/trailing-node/trailing-node.ts\nconst skipTrailingNodeMeta = \"skipTrailingNode\";\nfunction nodeEqualsType({ types, node }) {\n\treturn node && Array.isArray(types) && types.includes(node.type) || (node === null || node === void 0 ? void 0 : node.type) === types;\n}\n/**\n* This extension allows you to add an extra node at the end of the document.\n* @see https://www.tiptap.dev/api/extensions/trailing-node\n*/\nconst TrailingNode = Extension.create({\n\tname: \"trailingNode\",\n\taddOptions() {\n\t\treturn {\n\t\t\tnode: void 0,\n\t\t\tnotAfter: []\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\tvar _this$editor$schema$t;\n\t\tconst plugin = new PluginKey(this.name);\n\t\tconst defaultNode = this.options.node || ((_this$editor$schema$t = this.editor.schema.topNodeType.contentMatch.defaultType) === null || _this$editor$schema$t === void 0 ? void 0 : _this$editor$schema$t.name) || \"paragraph\";\n\t\tconst disabledNodes = Object.entries(this.editor.schema.nodes).map(([, value]) => value).filter((node) => (this.options.notAfter || []).concat(defaultNode).includes(node.name));\n\t\treturn [new Plugin({\n\t\t\tkey: plugin,\n\t\t\tappendTransaction: (transactions, __, state) => {\n\t\t\t\tconst { doc, tr, schema } = state;\n\t\t\t\tconst shouldInsertNodeAtEnd = plugin.getState(state);\n\t\t\t\tconst endPosition = doc.content.size;\n\t\t\t\tconst type = schema.nodes[defaultNode];\n\t\t\t\tif (transactions.some((transaction) => transaction.getMeta(\"skipTrailingNode\"))) return;\n\t\t\t\tif (!shouldInsertNodeAtEnd) return;\n\t\t\t\treturn tr.insert(endPosition, type.create());\n\t\t\t},\n\t\t\tstate: {\n\t\t\t\tinit: (_, state) => {\n\t\t\t\t\tconst lastNode = state.tr.doc.lastChild;\n\t\t\t\t\treturn !nodeEqualsType({\n\t\t\t\t\t\tnode: lastNode,\n\t\t\t\t\t\ttypes: disabledNodes\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tapply: (tr, value) => {\n\t\t\t\t\tif (!tr.docChanged) return value;\n\t\t\t\t\tif (tr.getMeta(\"__uniqueIDTransaction\")) return value;\n\t\t\t\t\tconst lastNode = tr.doc.lastChild;\n\t\t\t\t\treturn !nodeEqualsType({\n\t\t\t\t\t\tnode: lastNode,\n\t\t\t\t\t\ttypes: disabledNodes\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t})];\n\t}\n});\n//#endregion\n//#region src/undo-redo/undo-redo.ts\n/**\n* This extension allows you to undo and redo recent changes.\n* @see https://www.tiptap.dev/api/extensions/undo-redo\n*\n* **Important**: If the `@tiptap/extension-collaboration` package is used, make sure to remove\n* the `undo-redo` extension, as it is not compatible with the `collaboration` extension.\n*\n* `@tiptap/extension-collaboration` uses its own history implementation.\n*/\nconst UndoRedo = Extension.create({\n\tname: \"undoRedo\",\n\taddOptions() {\n\t\treturn {\n\t\t\tdepth: 100,\n\t\t\tnewGroupDelay: 500\n\t\t};\n\t},\n\taddCommands() {\n\t\treturn {\n\t\t\tundo: () => ({ state, dispatch }) => {\n\t\t\t\treturn undo(state, dispatch);\n\t\t\t},\n\t\t\tredo: () => ({ state, dispatch }) => {\n\t\t\t\treturn redo(state, dispatch);\n\t\t\t}\n\t\t};\n\t},\n\taddProseMirrorPlugins() {\n\t\treturn [history(this.options)];\n\t},\n\taddKeyboardShortcuts() {\n\t\treturn {\n\t\t\t\"Mod-z\": () => this.editor.commands.undo(),\n\t\t\t\"Shift-Mod-z\": () => this.editor.commands.redo(),\n\t\t\t\"Mod-y\": () => this.editor.commands.redo(),\n\t\t\t\"Mod-я\": () => this.editor.commands.undo(),\n\t\t\t\"Shift-Mod-я\": () => this.editor.commands.redo()\n\t\t};\n\t}\n});\n//#endregion\nexport { CharacterCount, DEFAULT_DATA_ATTRIBUTE, Dropcursor, Focus, Gapcursor, PLUGIN_KEY, Placeholder, Selection, TrailingNode, UndoRedo, preparePlaceholderAttribute, skipTrailingNodeMeta };\n\n//# sourceMappingURL=index.js.map","import { Extension } from \"@tiptap/core\";\nimport { Blockquote } from \"@tiptap/extension-blockquote\";\nimport { Bold } from \"@tiptap/extension-bold\";\nimport { Code } from \"@tiptap/extension-code\";\nimport { CodeBlock } from \"@tiptap/extension-code-block\";\nimport { Document } from \"@tiptap/extension-document\";\nimport { HardBreak } from \"@tiptap/extension-hard-break\";\nimport { Heading } from \"@tiptap/extension-heading\";\nimport { HorizontalRule } from \"@tiptap/extension-horizontal-rule\";\nimport { Italic } from \"@tiptap/extension-italic\";\nimport { Link } from \"@tiptap/extension-link\";\nimport { BulletList, ListItem, ListKeymap, OrderedList } from \"@tiptap/extension-list\";\nimport { Paragraph } from \"@tiptap/extension-paragraph\";\nimport { Strike } from \"@tiptap/extension-strike\";\nimport { Text } from \"@tiptap/extension-text\";\nimport { Underline } from \"@tiptap/extension-underline\";\nimport { Dropcursor, Gapcursor, TrailingNode, UndoRedo } from \"@tiptap/extensions\";\n//#region src/starter-kit.ts\n/**\n* The starter kit is a collection of essential editor extensions.\n*\n* It’s a good starting point for building your own editor.\n*/\nconst StarterKit = Extension.create({\n\tname: \"starterKit\",\n\taddExtensions() {\n\t\tconst extensions = [];\n\t\tif (this.options.bold !== false) extensions.push(Bold.configure(this.options.bold));\n\t\tif (this.options.blockquote !== false) extensions.push(Blockquote.configure(this.options.blockquote));\n\t\tif (this.options.bulletList !== false) extensions.push(BulletList.configure(this.options.bulletList));\n\t\tif (this.options.code !== false) extensions.push(Code.configure(this.options.code));\n\t\tif (this.options.codeBlock !== false) extensions.push(CodeBlock.configure(this.options.codeBlock));\n\t\tif (this.options.document !== false) extensions.push(Document.configure(this.options.document));\n\t\tif (this.options.dropcursor !== false) extensions.push(Dropcursor.configure(this.options.dropcursor));\n\t\tif (this.options.gapcursor !== false) extensions.push(Gapcursor.configure(this.options.gapcursor));\n\t\tif (this.options.hardBreak !== false) extensions.push(HardBreak.configure(this.options.hardBreak));\n\t\tif (this.options.heading !== false) extensions.push(Heading.configure(this.options.heading));\n\t\tif (this.options.undoRedo !== false) extensions.push(UndoRedo.configure(this.options.undoRedo));\n\t\tif (this.options.horizontalRule !== false) extensions.push(HorizontalRule.configure(this.options.horizontalRule));\n\t\tif (this.options.italic !== false) extensions.push(Italic.configure(this.options.italic));\n\t\tif (this.options.listItem !== false) extensions.push(ListItem.configure(this.options.listItem));\n\t\tif (this.options.listKeymap !== false) {\n\t\t\tvar _this$options;\n\t\t\textensions.push(ListKeymap.configure((_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.listKeymap));\n\t\t}\n\t\tif (this.options.link !== false) {\n\t\t\tvar _this$options2;\n\t\t\textensions.push(Link.configure((_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.link));\n\t\t}\n\t\tif (this.options.orderedList !== false) extensions.push(OrderedList.configure(this.options.orderedList));\n\t\tif (this.options.paragraph !== false) extensions.push(Paragraph.configure(this.options.paragraph));\n\t\tif (this.options.strike !== false) extensions.push(Strike.configure(this.options.strike));\n\t\tif (this.options.text !== false) extensions.push(Text.configure(this.options.text));\n\t\tif (this.options.underline !== false) {\n\t\t\tvar _this$options3;\n\t\t\textensions.push(Underline.configure((_this$options3 = this.options) === null || _this$options3 === void 0 ? void 0 : _this$options3.underline));\n\t\t}\n\t\tif (this.options.trailingNode !== false) {\n\t\t\tvar _this$options4;\n\t\t\textensions.push(TrailingNode.configure((_this$options4 = this.options) === null || _this$options4 === void 0 ? void 0 : _this$options4.trailingNode));\n\t\t}\n\t\treturn extensions;\n\t}\n});\n//#endregion\n//#region src/index.ts\nvar src_default = StarterKit;\n//#endregion\nexport { StarterKit, src_default as default };\n\n//# sourceMappingURL=index.js.map","/**\n * Per-construct Markdown overrides.\n *\n * Tiptap exposes `renderMarkdown` on every extension, which is the sanctioned\n * place to correct serializer behavior. Each override here closes a gap that the\n * round-trip suite found; the fixture that proves it is named in the comment.\n */\n\nimport type { JSONContent, MarkdownRendererHelpers } from '@tiptap/core'\nimport { Code } from '@tiptap/extension-code'\nimport { Link } from '@tiptap/extension-link'\nimport { getListMarker, ListItem, TaskList } from '@tiptap/extension-list'\nimport { Paragraph } from '@tiptap/extension-paragraph'\nimport { Table } from '@tiptap/extension-table'\nimport type { MarkType, Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Plugin } from '@tiptap/pm/state'\n\nimport {\n  CODE_SPAN_CLOSE,\n  CODE_SPAN_OPEN,\n  escapeParagraphLines,\n  escapeTableCell,\n} from './escapes'\n\nconst EMPTY_PARAGRAPH_MARKDOWN = '&nbsp;'\n\n/** Cells are rendered block-by-block and rejoined; a separator nobody types. */\nconst CELL_LINE_SEPARATOR = '\\u001F'\n\n/**\n * escaping.md: text that merely starts with `# `, `- `, `1. `, `> ` or `|`\n * came back as a heading, a list, a quote or a table.\n */\nexport const PastyParagraph = Paragraph.extend({\n  renderMarkdown: (node: JSONContent, h: MarkdownRendererHelpers, ctx) => {\n    const content = Array.isArray(node?.content) ? node.content : []\n\n    if (content.length === 0) {\n      // Upstream behavior: the first empty paragraph in a run contributes only\n      // its blank line; later ones need a placeholder to survive.\n      const previous = ctx?.previousNode\n      const previousIsEmptyParagraph =\n        previous?.type === 'paragraph' && (previous.content?.length ?? 0) === 0\n      return previousIsEmptyParagraph ? EMPTY_PARAGRAPH_MARKDOWN : ''\n    }\n\n    return escapeParagraphLines(h.renderChildren(content))\n  },\n})\n\n/**\n * inline-code.md: a code span containing a backtick was emitted with single\n * backticks, so `` a ` b `` re-parsed as two spans and a stray backtick.\n *\n * Mark delimiters are derived from a synthetic node, so this hook can't see the\n * content it is wrapping. It emits markers; `repairCodeSpans` sizes the fence.\n *\n * code-in-emphasis.md: upstream Code has `excludes: '_'`, but GFM nests code\n * inside emphasis — `` **`x`** `` is ordinary agent output. The parser emits\n * those marks regardless of the schema, and the paste path is the one place\n * that validates (`insertContent` runs `check()`), so a document containing\n * one bold code span pasted entirely as plain text. Lifting the exclusion is\n * the whole fix: the serializer already keeps code innermost and round-trips\n * every emphasis/link/strike wrapping.\n */\nexport const PastyCode = Code.extend({\n  excludes: '',\n\n  renderMarkdown: (node: JSONContent, h: MarkdownRendererHelpers) => {\n    if (!node.content) {\n      return ''\n    }\n    return `${CODE_SPAN_OPEN}${h.renderChildren(node.content)}${CODE_SPAN_CLOSE}`\n  },\n})\n\n/**\n * Not a Markdown override, but the same kind of correction. Upstream makes a\n * link inclusive whenever autolink is on, so text typed at a link's end joined\n * it: link a word, keep typing, and the link ran on to the end of the line. A\n * link ends where it was drawn. The cost is autolink's: an autolinked address\n * edited at its end no longer grows to cover the new characters.\n */\nexport const PastyLink = Link.extend({\n  inclusive: false,\n\n  addProseMirrorPlugins() {\n    return [\n      ...(this.parent?.() ?? []),\n      new Plugin({\n        props: {\n          handleTextInput: (view, from, _to, text, deflt) => {\n            const { doc, schema } = view.state\n            if (!isSpaceAfterLinkEnd(doc, from, schema.marks.link) || /^\\s/.test(text)) {\n              return false\n            }\n            // Under `white-space: normal` (see editor.css) Chrome types a space\n            // at the end of a text node as a non-breaking one and swaps it back\n            // when the next character arrives in the same node. A link that\n            // doesn't extend puts that space in a node of its own, so the swap\n            // never happens and every link typed past left a U+00A0 in the\n            // Markdown. This does the swap Chrome would have done. Typing only,\n            // never a collaborator's edit: their editor has already done it.\n            const tr = deflt()\n            tr.insertText(' ', from - 1, from)\n            view.dispatch(tr)\n            return true\n          },\n        },\n      }),\n    ]\n  },\n})\n\n/** Whether the character just before `pos` is a non-breaking space directly after a link. */\nfunction isSpaceAfterLinkEnd(doc: ProseMirrorNode, pos: number, link: MarkType): boolean {\n  const $pos = doc.resolve(pos)\n  if (pos - 2 < $pos.start() || doc.textBetween(pos - 1, pos) !== '\\u00a0') {\n    return false\n  }\n  return doc.rangeHasMark(pos - 2, pos - 1, link) && !doc.rangeHasMark(pos - 1, pos, link)\n}\n\n/**\n * lists-nested.md: nested content was indented by a fixed two spaces, which is\n * short of the content column under any ordered marker (\"1. \" starts at column\n * 3). CommonMark parsers then read the nested list as a sibling and flatten it.\n *\n * Indenting by the width of this item's own marker is the rule the format\n * actually states: two spaces under a bullet, three under \"1. \", four under\n * \"10. \". A fixed four would nest correctly elsewhere but our own parser\n * over-nests siblings at that width, so the document would not survive a\n * reload.\n */\nexport const PastyListItem = ListItem.extend({\n  renderMarkdown: (node: JSONContent, h: MarkdownRendererHelpers, ctx) => {\n    const content = Array.isArray(node.content) ? node.content : []\n    if (content.length === 0) {\n      return ''\n    }\n\n    const marker = listMarker(ctx)\n    const indent = ' '.repeat(marker.length)\n    const [first, ...rest] = content\n\n    let output = `${marker}${h.renderChildren([first])}`\n\n    rest.forEach((child, index) => {\n      const rendered = h.renderChild?.(child, index + 1) ?? h.renderChildren([child])\n      const indented = rendered\n        .split('\\n')\n        .map(line => (line ? indent + line : line))\n        .join('\\n')\n      // A second paragraph in the same item needs a blank line; a nested list\n      // must stay adjacent or it becomes a separate list.\n      output += child.type === 'paragraph' ? `\\n\\n${indented}` : `\\n${indented}`\n    })\n\n    return output\n  },\n})\n\nfunction listMarker(\n  ctx: { parentType?: string | null; index?: number; meta?: any } | undefined,\n): string {\n  if (ctx?.parentType === 'orderedList') {\n    const attrs = ctx.meta?.parentAttrs ?? {}\n    const start: number = attrs.start || 1\n    return getListMarker(attrs.type, start - 1 + (ctx.index ?? 0), '. ')\n  }\n  return '- '\n}\n\ntype CellAlign = 'left' | 'center' | 'right' | null\n\ninterface RenderedCell {\n  text: string\n  isHeader: boolean\n  align: CellAlign\n}\n\nfunction normalizeAlign(value: unknown): CellAlign {\n  return value === 'left' || value === 'center' || value === 'right' ? value : null\n}\n\nfunction renderCell(cellNode: JSONContent, h: MarkdownRendererHelpers): RenderedCell {\n  const children = Array.isArray(cellNode.content) ? cellNode.content : []\n\n  // Render blocks separately so a multi-paragraph cell can be flattened to\n  // <br> afterwards: a cell has to stay on one line.\n  const raw =\n    children.length > 1\n      ? children\n          .map(child => h.renderChildren(child as unknown as JSONContent))\n          .join(CELL_LINE_SEPARATOR)\n      : h.renderChildren(children as unknown as JSONContent[])\n\n  const flattened = raw\n    .split(CELL_LINE_SEPARATOR)\n    .join('\\n')\n    .replace(/[ \\t]*\\r?\\n[ \\t]*/g, '<br>')\n    .replace(/\\s+/g, ' ')\n    .trim()\n\n  return {\n    text: escapeTableCell(flattened),\n    isHeader: cellNode.type === 'tableHeader',\n    align: normalizeAlign(cellNode.attrs?.align),\n  }\n}\n\nfunction delimiter(width: number, align: CellAlign): string {\n  // Keep the delimiter the same visual width as the column, colons included.\n  switch (align) {\n    case 'left':\n      return `:${'-'.repeat(Math.max(2, width - 1))}`\n    case 'right':\n      return `${'-'.repeat(Math.max(2, width - 1))}:`\n    case 'center':\n      return `:${'-'.repeat(Math.max(1, width - 2))}:`\n    default:\n      return '-'.repeat(width)\n  }\n}\n\n/**\n * tables.md: a literal pipe inside a cell was emitted unescaped, silently\n * splitting the row into an extra column.\n *\n * A header row is synthesized when the document has none, because GFM only\n * recognizes a table that has one — so the output always re-parses as a table.\n */\nexport const PastyTable = Table.extend({\n  renderMarkdown: (node: JSONContent, h: MarkdownRendererHelpers) => {\n    const rowNodes = Array.isArray(node?.content) ? node.content : []\n    if (rowNodes.length === 0) {\n      return ''\n    }\n\n    const rows = rowNodes.map(rowNode =>\n      (Array.isArray(rowNode.content) ? rowNode.content : []).map(cellNode =>\n        renderCell(cellNode, h),\n      ),\n    )\n\n    const columnCount = rows.reduce((max, row) => Math.max(max, row.length), 0)\n    if (columnCount === 0) {\n      return ''\n    }\n\n    const alignments: CellAlign[] = Array.from({ length: columnCount }, (_, column) => {\n      for (const row of rows) {\n        const align = row[column]?.align\n        if (align) {\n          return align\n        }\n      }\n      return null\n    })\n\n    const hasHeader = rows[0].some(cell => cell.isHeader)\n    const headerTexts = Array.from({ length: columnCount }, (_, column) =>\n      hasHeader ? (rows[0][column]?.text ?? '') : '',\n    )\n    const bodyRows = hasHeader ? rows.slice(1) : rows\n\n    const widths = Array.from({ length: columnCount }, (_, column) => {\n      const cellWidths = [\n        headerTexts[column].length,\n        ...bodyRows.map(row => (row[column]?.text ?? '').length),\n      ]\n      return Math.max(3, ...cellWidths)\n    })\n\n    const line = (cells: string[]) =>\n      `| ${cells.map((cell, column) => cell.padEnd(widths[column])).join(' | ')} |`\n\n    return [\n      line(headerTexts),\n      line(widths.map((width, column) => delimiter(width, alignments[column]))),\n      ...bodyRows.map(row =>\n        line(Array.from({ length: columnCount }, (_, column) => row[column]?.text ?? '')),\n      ),\n    ].join('\\n')\n  },\n})\n\n/**\n * tasks.md: a task list nested under an ordered item came back with its second\n * item swallowed as literal text.\n *\n * marked dedents an ordered item's first content line by the whole marker\n * (\"1. \" is three columns) and every later line by two, so\n * `1. Step\\n   - [ ] a\\n   - [x] b` reaches the task tokenizer as\n * `- [ ] a\\n - [x] b`. Upstream's `parseIndentedBlocks` reads *any* extra\n * indentation as nesting and then dedents it by a fixed two columns, which eats\n * the `- ` off the second item and leaves ` [x] b` behind as a paragraph.\n *\n * CommonMark's actual rule is that an item nests only once it reaches its\n * parent's content column — two columns under `- `. Snapping every task line to\n * that grid before the upstream tokenizer runs makes its fixed dedent correct by\n * construction, and makes ` - [x] b` the sibling GFM says it is.\n */\nconst TASK_ITEM_LINE = /^(\\s*)[-+*]\\s+\\[[ xX]\\]\\s+/\nconst TASK_NEST_COLUMNS = 2\n\nfunction shiftIndent(line: string, delta: number): string {\n  if (delta === 0) {\n    return line\n  }\n  if (delta > 0) {\n    return ' '.repeat(delta) + line\n  }\n  const leading = /^ */.exec(line)![0].length\n  return line.slice(Math.min(leading, -delta))\n}\n\n/** Re-indent a run of task lines onto a canonical two-column-per-level grid. */\nfunction snapTaskIndents(source: string): string {\n  const openLevels: number[] = []\n  let delta = 0\n\n  return source\n    .split('\\n')\n    .map(line => {\n      const match = TASK_ITEM_LINE.exec(line)\n      if (!match) {\n        // Continuation lines follow whatever their item did, or they detach.\n        return line.trim() === '' ? line : shiftIndent(line, delta)\n      }\n\n      const indent = match[1].length\n      while (\n        openLevels.length > 0 &&\n        indent < openLevels[openLevels.length - 1] + TASK_NEST_COLUMNS\n      ) {\n        openLevels.pop()\n      }\n      openLevels.push(indent)\n      delta = (openLevels.length - 1) * TASK_NEST_COLUMNS - indent\n      return shiftIndent(line, delta)\n    })\n    .join('\\n')\n}\n\nconst upstreamTaskTokenizer = TaskList.config.markdownTokenizer!\n\nexport const PastyTaskList = TaskList.extend({\n  markdownTokenizer: {\n    ...upstreamTaskTokenizer,\n    tokenize(source, tokens, lexer) {\n      // An indented code block is not a task list. The extension tokenizer runs\n      // before marked's own indented-code rule, and four columns at the top of a\n      // block means code — genuinely nested task lists arrive already dedented.\n      const firstLine = source.split('\\n').find(line => line.trim() !== '')\n      if (firstLine && /^ {4}/.test(firstLine) && TASK_ITEM_LINE.test(firstLine)) {\n        return undefined\n      }\n\n      const token = upstreamTaskTokenizer.tokenize?.call(this, snapTaskIndents(source), tokens, lexer)\n      if (!token?.raw) {\n        return token\n      }\n      // marked advances through the document by `raw.length`, so it has to be\n      // the original text. Snapping only rewrites leading whitespace, so the\n      // consumed line count is the same on both sides.\n      const consumed = token.raw.split('\\n').length - 1\n      return { ...token, raw: `${source.split('\\n').slice(0, consumed).join('\\n')}\\n` }\n    },\n  },\n})\n","/**\n * Undo, redo, and where the boundaries between steps go.\n *\n * Two histories can be under the editor. The plain one is ProseMirror's, which\n * undoes transactions. The collaborative one is Yjs's `UndoManager`, which\n * undoes *your* changes and leaves everybody else's alone — the only correct\n * behaviour when two people share a document, and the reason StarterKit's\n * history is switched off in collab mode.\n *\n * Everything that undoes anything goes through here, so no caller has to know\n * which of the two is installed. Vim's `u` and `Ctrl-r` are the main customers:\n * they used to import ProseMirror's history directly, which in a shared\n * document would have quietly undone a collaborator's sentence.\n */\n\nimport { Extension } from '@tiptap/core'\nimport {\n  closeHistory as pmCloseHistory,\n  redo as pmRedo,\n  undo as pmUndo,\n} from '@tiptap/pm/history'\nimport { Plugin, PluginKey, type EditorState, type Transaction } from '@tiptap/pm/state'\nimport { redo as yRedo, undo as yUndo, yUndoPluginKey } from '@tiptap/y-tiptap'\n\ntype Dispatch = ((tr: Transaction) => void) | undefined\n\n/** The Yjs undo manager, when one is installed under this editor. */\nfunction undoManagerOf(state: EditorState): { stopCapturing: () => void } | null {\n  // getState returns undefined when the plugin isn't there at all, which is the\n  // plain-editor case and not an error.\n  return yUndoPluginKey.getState(state)?.undoManager ?? null\n}\n\nexport function undo(state: EditorState, dispatch?: Dispatch): boolean {\n  // The Yjs undo manager applies its own change to the shared document rather\n  // than dispatching a transaction, so `dispatch` is deliberately unused there.\n  return undoManagerOf(state) ? yUndo(state) === true : pmUndo(state, dispatch)\n}\n\nexport function redo(state: EditorState, dispatch?: Dispatch): boolean {\n  return undoManagerOf(state) ? yRedo(state) === true : pmRedo(state, dispatch)\n}\n\n/**\n * \"The next change starts a new undo step.\"\n *\n * ProseMirror takes this as a transaction meta. Yjs's UndoManager groups by a\n * time window instead and needs `stopCapturing()`, which cannot be called on a\n * transaction that hasn't been dispatched yet — so the intent is recorded as\n * meta here and acted on by `HistoryBridge` once the transaction lands.\n */\nexport const CLOSE_META = 'pasty:closeHistory'\n\nexport function closeHistory<T extends Transaction>(tr: T): T {\n  pmCloseHistory(tr)\n  tr.setMeta(CLOSE_META, true)\n  return tr\n}\n\n/**\n * The other half of `closeHistory`, and always installed.\n *\n * Always, rather than only in collab mode, so the extension list — and the\n * schema every test builds from it — is identical either way. In the plain\n * editor there is no undo manager and this does nothing at all.\n *\n * `appendTransaction` and not `onTransaction`, and the difference is the whole\n * point: the sync plugin writes to the Y document *after* the new state exists,\n * so this runs before that write. `stopCapturing()` only affects the next\n * change, and calling it a moment later would be calling it a change too late.\n */\nexport const HistoryBridge = Extension.create({\n  name: 'pastyHistoryBridge',\n\n  addProseMirrorPlugins() {\n    return [\n      new Plugin({\n        key: new PluginKey('pastyHistoryBridge'),\n        appendTransaction: (transactions, _oldState, newState) => {\n          if (transactions.some(tr => tr.getMeta(CLOSE_META))) {\n            undoManagerOf(newState)?.stopCapturing()\n          }\n          return null\n        },\n      }),\n    ]\n  },\n})\n","/**\n * Touching lists of the same kind are one list.\n *\n * Since @tiptap/extension-list 3.25, Backspace at the start of a list item lifts\n * it out of its list, splitting the list around it. That is the right first\n * press — the bullet goes, the line stays — but deleting the line afterwards\n * leaves the two halves touching: two `<ul>`s with a list margin where an item\n * gap belongs, and a blank line between them in the Markdown. They could never\n * have stayed apart anyway. Pasty writes one marker per kind of list, so two\n * touching bullet lists re-parse as a single loose one.\n *\n * Merging after every change, rather than patching Backspace, also covers\n * Delete, paste, the toolbar and Vim operators — anything that leaves two lists\n * side by side.\n */\n\nimport { Extension } from '@tiptap/core'\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Plugin } from '@tiptap/pm/state'\nimport { canJoin } from '@tiptap/pm/transform'\nimport { ySyncPluginKey } from '@tiptap/y-tiptap'\n\nconst LIST_TYPES = new Set(['bulletList', 'orderedList', 'taskList'])\n\nfunction sameKindOfList(before: ProseMirrorNode | null, after: ProseMirrorNode): boolean {\n  if (!before || before.type !== after.type || !LIST_TYPES.has(before.type.name)) {\n    return false\n  }\n  // `1.` and `a.` are different lists in Markdown; a different `start` is not.\n  return before.type.name !== 'orderedList' || before.attrs.type === after.attrs.type\n}\n\n/** Positions between two touching lists of one kind, in document order. */\nfunction listSeams(doc: ProseMirrorNode): number[] {\n  const seams: number[] = []\n\n  const visit = (node: ProseMirrorNode, contentStart: number) => {\n    let previous: ProseMirrorNode | null = null\n    node.forEach((child, offset) => {\n      const pos = contentStart + offset\n      if (sameKindOfList(previous, child)) {\n        seams.push(pos)\n      }\n      if (!child.isTextblock && !child.isLeaf) {\n        visit(child, pos + 1)\n      }\n      previous = child\n    })\n  }\n\n  visit(doc, 0)\n  return seams\n}\n\nexport const PastyListJoin = Extension.create({\n  name: 'pastyListJoin',\n\n  addProseMirrorPlugins() {\n    return [\n      new Plugin({\n        // Appended, so the merge lands in the same undo step as the edit that\n        // caused it: ⌘Z never shows the split.\n        appendTransaction(transactions, _oldState, state) {\n          // A collaborator's edit arrives already merged: their editor ran this\n          // too. Joining the same lists again here would be a second, concurrent\n          // change to one spot, which Yjs is free to resolve as duplicated items.\n          const local = transactions.some(\n            tr => tr.docChanged && tr.getMeta(ySyncPluginKey)?.isChangeOrigin !== true,\n          )\n          if (!local) {\n            return null\n          }\n          const seams = listSeams(state.doc)\n          if (seams.length === 0) {\n            return null\n          }\n          const tr = state.tr\n          // Last first, so each join leaves the earlier positions where they were.\n          for (const pos of seams.reverse()) {\n            if (canJoin(tr.doc, pos)) {\n              tr.join(pos)\n            }\n          }\n          return tr.docChanged ? tr : null\n        },\n      }),\n    ]\n  },\n})\n","/**\n * Paste arbitration.\n *\n * Compute first, commit last: every path that isn't a confident Markdown parse\n * returns false and lets ProseMirror handle the paste, which cannot lose text.\n * The spec's hard rule is that content is never dropped.\n */\n\nimport type { Editor } from '@tiptap/core'\nimport type { EditorView } from '@tiptap/pm/view'\n\nimport { detectMarkdown, MarkdownParseError, parseMarkdown } from './markdown'\n\n/** Wrappers that carry no structure of their own. */\nconst WRAPPER_TAGS = new Set(['HTML', 'HEAD', 'BODY', 'META', 'STYLE', 'TITLE', 'SPAN', 'DIV', 'FONT'])\n\n/**\n * Does this HTML carry formatting worth keeping?\n *\n * Editors and terminals often attach a `<div><span style=...>` shell to plain\n * text. That's not formatting — it's a wrapper. A `<p>`, a `<table>` or a\n * `<strong>` is.\n */\nexport function hasRealHtml(html: string): boolean {\n  if (!html.trim()) {\n    return false\n  }\n  try {\n    const parsed = new DOMParser().parseFromString(html, 'text/html')\n    const elements = parsed.body?.querySelectorAll('*') ?? []\n    for (const element of Array.from(elements)) {\n      if (!WRAPPER_TAGS.has(element.tagName)) {\n        return true\n      }\n    }\n    return false\n  } catch {\n    return false\n  }\n}\n\nfunction selectionIsInCode(editor: Editor): boolean {\n  const { $from } = editor.state.selection\n  for (let depth = $from.depth; depth >= 0; depth -= 1) {\n    if ($from.node(depth).type.spec.code) {\n      return true\n    }\n  }\n  return false\n}\n\nexport function handleMarkdownPaste(\n  editor: Editor,\n  _view: EditorView,\n  event: ClipboardEvent,\n): boolean {\n  const clipboard = event.clipboardData\n  if (!clipboard) {\n    return false\n  }\n\n  // Inside a code block every character is literal. Pasting Markdown structure\n  // there would be exactly wrong.\n  if (selectionIsInCode(editor)) {\n    return false\n  }\n\n  const text = clipboard.getData('text/plain')\n  if (!text || !text.trim()) {\n    // Images and rich-only payloads: let ProseMirror decide.\n    return false\n  }\n\n  const html = clipboard.getData('text/html')\n  const textLooksLikeMarkdown = detectMarkdown(text)\n\n  // Real HTML and no Markdown signal: a web page or a Google Doc. Keep the\n  // rich paste. When both are present the Markdown wins — an IDE or an agent\n  // UI puts syntax-highlighted HTML next to the raw source, and for Pasty's\n  // audience the source is the point.\n  if (hasRealHtml(html) && !textLooksLikeMarkdown) {\n    return false\n  }\n\n  try {\n    const doc = parseMarkdown(editor, text)\n    editor.commands.insertContent(doc.content ?? [])\n    return true\n  } catch (error) {\n    if (!(error instanceof MarkdownParseError)) {\n      console.warn('[pasty] Markdown paste failed; inserting the text as-is.', error)\n    }\n    return false\n  }\n}\n","/**\n * Keyboard shortcuts, written once.\n *\n * Shortcuts are declared the way Tiptap registers them (\"Mod+Shift+K\") and\n * rendered the way the platform writes them: a Mac user reading \"Ctrl+K\" in a\n * tooltip learns something false about their own keyboard. The toolbar and the\n * command palette both display shortcuts, so the translation lives here rather\n * than in whichever of them happened to need it first.\n *\n * The same declaration is what the palette *matches* a keydown against, so a\n * chord can never be drawn one way and bound another.\n */\n\n/**\n * `platform` first, and deprecated though it is, because that is what\n * prosemirror-keymap tests to decide what `Mod-` means. Anything that disagrees\n * with the editor about which key is the modifier is worse than wrong — it is\n * wrong in only some of the product. `userAgent` is the fallback for browsers\n * that have finally dropped `platform`.\n */\nexport const IS_MAC =\n  typeof navigator !== 'undefined' &&\n  /Mac|iP(?:hone|ad|od)/.test(navigator.platform || navigator.userAgent)\n\nexport function shortcutHint(shortcut: string): string {\n  return IS_MAC\n    ? shortcut\n        .replace(/Mod\\+/g, '⌘')\n        .replace(/Shift\\+/g, '⇧')\n        .replace(/Alt\\+/g, '⌥')\n    : shortcut.replace(/Mod/g, 'Ctrl')\n}\n\n/**\n * The platform's own modifier on a mouse event: ⌘ on a Mac, Ctrl elsewhere.\n *\n * It cannot simply accept both. Ctrl-click *is* the context menu on macOS, so\n * treating it as the follow gesture there would fire on every right-click a\n * trackpad user makes.\n */\nexport function hasPrimaryModifier(event: MouseEvent): boolean {\n  return IS_MAC ? event.metaKey : event.ctrlKey\n}\n\n// ---------------------------------------------------------------------------\n// chords\n// ---------------------------------------------------------------------------\n\ninterface Chord {\n  shift: boolean\n  alt: boolean\n  /** A lowercase letter, a digit, or `,`. */\n  key: string\n}\n\nfunction parseShortcut(shortcut: string): Chord {\n  const parts = shortcut.split('+')\n  const modifiers = parts.slice(0, -1)\n  return {\n    shift: modifiers.includes('Shift'),\n    alt: modifiers.includes('Alt'),\n    key: parts[parts.length - 1].toLowerCase(),\n  }\n}\n\n/** Where the chord's character sits on a US keyboard, as `event.code` names it. */\nfunction codeFor(key: string): string | null {\n  if (/^[a-z]$/.test(key)) {\n    return `Key${key.toUpperCase()}`\n  }\n  if (/^[0-9]$/.test(key)) {\n    return `Digit${key}`\n  }\n  return key === ',' ? 'Comma' : null\n}\n\n/**\n * Whether a keydown is exactly this chord: the platform's own modifier, the\n * listed extras and no others.\n *\n * \"No others\" is the point. `Mod+1` must not answer `Mod+Alt+1`, which is a\n * heading, and `Mod+8` must not answer `Mod+Shift+8`, which is a list; and the\n * other platform's modifier is rejected outright, so Ctrl+⌘ chords stay the\n * platform's. `code` is tried before `key` so a Dvorak or non-Latin layout\n * still gets ⌘K, an AZERTY top row still gets ⌘1, and `Mod+Alt+N` survives\n * macOS reporting ⌥N as a dead key. AltGr arrives as Ctrl+Alt on Windows, and\n * someone typing ń has not asked for Ctrl+Alt+N — off macOS only, because a\n * Mac browser may report ⌥ itself as AltGraph whenever it changes the\n * character, and there ⌥ is exactly the key the chord asks for.\n */\nexport function matchesShortcut(event: KeyboardEvent, shortcut: string): boolean {\n  const chord = parseShortcut(shortcut)\n  const primary = IS_MAC ? event.metaKey : event.ctrlKey\n  const other = IS_MAC ? event.ctrlKey : event.metaKey\n  if (!primary || other || event.shiftKey !== chord.shift || event.altKey !== chord.alt) {\n    return false\n  }\n  if (!IS_MAC && typeof event.getModifierState === 'function' && event.getModifierState('AltGraph')) {\n    return false\n  }\n  const code = codeFor(chord.key)\n  return (code !== null && event.code === code) || event.key.toLowerCase() === chord.key\n}\n\nconst MAC_GLYPHS: Record<string, string> = { Mod: '⌘', Shift: '⇧', Alt: '⌥' }\nconst OTHER_NAMES: Record<string, string> = { Mod: 'Ctrl', Shift: 'Shift', Alt: 'Alt' }\n\n/**\n * The chord as keys, one per cap: `[\"⌘\", \"⇧\", \"C\"]`, or `[\"Ctrl\", \"Shift\",\n * \"C\"]` off macOS. ⌘ comes first, as the toolbar tooltips already write it.\n * keycaps.ts draws these; `shortcutKeycap` below is the same thing as text.\n */\nexport function keycapParts(shortcut: string): string[] {\n  const names = IS_MAC ? MAC_GLYPHS : OTHER_NAMES\n  return shortcut.split('+').map(part => names[part] ?? part.toUpperCase())\n}\n\n/** The chord as one string of caps, `⌘ ⇧ C` — what a row's <kbd> reads as. */\nexport function shortcutKeycap(shortcut: string): string {\n  return keycapParts(shortcut).join(' ')\n}\n\n/** The chord as `aria-keyshortcuts` spells it: `Meta+Shift+C`, `Control+,`. */\nexport function shortcutAria(shortcut: string): string {\n  return shortcut\n    .split('+')\n    .map(part => (part === 'Mod' ? (IS_MAC ? 'Meta' : 'Control') : part.toUpperCase()))\n    .map(part => (part.length === 1 ? part : part[0] + part.slice(1).toLowerCase()))\n    .join('+')\n}\n","/**\n * The command line.\n *\n * One bar for `/`, `?` and `:`, living in the overlays lane at the bottom of the\n * page. It is an ordinary `<input>`, so the platform gives us the caret,\n * selection, IME and every keyboard convention for free — a hand-built text\n * field inside a ProseMirror plugin would be a second editor to maintain and a\n * worse one.\n *\n * The focus contract is the whole design, and it is deliberately one-way:\n *\n *   - opening moves focus to the input, which means `handleKeyDown` in the\n *     editor is naturally silent while the bar is up — no mode juggling;\n *   - Enter commits, Escape cancels, and both stop propagating so the document\n *     menus and the link popover never react to them;\n *   - **blur cancels**, and the bar never takes focus back. ⌘K while the bar is\n *     open simply closes it and opens the palette. Two things fighting over\n *     focus is the failure mode this avoids by refusing to fight at all.\n *\n * The engine talks to this through a small interface and treats a missing host\n * as \"no bar\" — which is what unit tests get, and why every executor has a\n * direct entry point that does not need one.\n */\n\nimport { el } from '../dom'\n\nexport type CmdlinePrefix = ':' | '/' | '?'\nexport type MessageTone = 'info' | 'error'\n\nexport interface CmdlineHandlers {\n  onCommit: (input: string) => void\n  onCancel: () => void\n}\n\nexport interface CmdlineHost {\n  open: (prefix: CmdlinePrefix, handlers: CmdlineHandlers) => void\n  close: () => void\n  showMessage: (text: string, tone?: MessageTone) => void\n}\n\n/** How long a message stays before it stops being news. */\nconst MESSAGE_MS = 2500\n\nexport interface CmdlineBar extends CmdlineHost {\n  element: HTMLElement\n  destroy: () => void\n}\n\nexport function createCmdlineBar(options: { onClosed: () => void }): CmdlineBar {\n  const glyph = el('span', { class: 'pasty-cmdline__glyph' })\n  const input = el('input', {\n    class: 'pasty-cmdline__input',\n    type: 'text',\n    'aria-label': 'Command',\n    autocomplete: 'off',\n    autocorrect: 'off',\n    autocapitalize: 'off',\n    spellcheck: 'false',\n  })\n  const message = el('span', { class: 'pasty-cmdline__message', role: 'status' })\n\n  const element = el('div', { class: 'pasty-cmdline' }, glyph, input, message)\n  element.hidden = true\n\n  let handlers: CmdlineHandlers | null = null\n  let messageTimer: number | undefined\n\n  const finish = () => {\n    handlers = null\n    element.hidden = true\n    input.value = ''\n    options.onClosed()\n  }\n\n  const close = () => {\n    if (handlers) {\n      const pending = handlers\n      handlers = null\n      pending.onCancel()\n      finish()\n    }\n  }\n\n  const open = (prefix: CmdlinePrefix, next: CmdlineHandlers) => {\n    handlers = next\n    glyph.textContent = prefix\n    input.value = ''\n    message.textContent = ''\n    element.hidden = false\n    input.focus()\n  }\n\n  input.addEventListener('keydown', event => {\n    if (event.key === 'Enter') {\n      // Stopped here, or `title.ts`'s document-level Enter listener sees it too.\n      event.preventDefault()\n      event.stopPropagation()\n      // Read before closing: `finish` clears the field.\n      const typed = input.value\n      const pending = handlers\n      handlers = null\n      finish()\n      pending?.onCommit(typed)\n      return\n    }\n    if (event.key === 'Escape') {\n      // And the menus' and the link popover's Escape listeners see this one.\n      event.preventDefault()\n      event.stopPropagation()\n      close()\n    }\n  })\n\n  // Focus went somewhere else — the palette, the title field, a click in the\n  // document. The bar gives up rather than grabbing focus back.\n  input.addEventListener('blur', () => close())\n\n  const showMessage = (text: string, tone: MessageTone = 'info') => {\n    message.textContent = text\n    message.classList.toggle('is-error', tone === 'error')\n    if (element.hidden) {\n      // A message with no bar to sit in still has to be seen: show the lane,\n      // with no input to type into.\n      element.hidden = false\n      glyph.textContent = ''\n      input.hidden = true\n    }\n    window.clearTimeout(messageTimer)\n    messageTimer = window.setTimeout(() => {\n      message.textContent = ''\n      if (!handlers) {\n        element.hidden = true\n        input.hidden = false\n      }\n    }, MESSAGE_MS)\n  }\n\n  return {\n    element,\n    open,\n    close,\n    showMessage,\n    destroy: () => {\n      window.clearTimeout(messageTimer)\n      element.remove()\n    },\n  }\n}\n","/**\n * Keyboard instrumentation, off unless someone asks for it.\n *\n * A modal editor is a keyboard-ownership problem, and the bugs it produces —\n * \"Ctrl-E jumped to the end of the line\", \"the macro replayed something else\" —\n * are the kind that a tester can only describe, not diagnose. This is the tool\n * that turns a description into a trace.\n *\n * The switch is deliberately strict, because a keyboard logger is the last thing\n * anyone should ship by accident:\n *\n *   - **Nothing is logged by default.** No sampling, no analytics, no\n *     \"diagnostics\" that are really telemetry. Every line printed here goes to\n *     the console of the browser it was typed in and nowhere else.\n *   - The flag is read from `localStorage` **per event**, not once at startup,\n *     so clearing it goes quiet immediately rather than at the next reload.\n *   - It is not gated behind a dev build. The traces that matter come from\n *     people using the real application, and asking a tester to run a\n *     development server is asking them not to report the bug.\n *\n * Turn it on with `localStorage.setItem('pasty.vim_debug', '1')`, off with\n * `localStorage.removeItem('pasty.vim_debug')`.\n */\n\nimport type { Action } from './types'\n\nexport const VIM_DEBUG_KEY = 'pasty.vim_debug'\n\n/**\n * A one-line summary of what the engine did with a keystroke.\n *\n * The vocabulary matters more than the format: every keystroke in a modal mode\n * has to be explainable as one of these, and a chord that turns out to be\n * `passed` when the mode says it should be owned is the bug this exists to find.\n */\nexport type VimVerdict =\n  /** The engine ran a command, or banked a prefix key toward one. */\n  | `claimed: ${string}`\n  /** A modal-mode chord with no Vim meaning: swallowed so the platform cannot act on it. */\n  | 'consumed: unsupported-modal-chord'\n  /** ⌘ and ⌥ chords, and any Ctrl chord Vim does not claim: the app and the OS own these. */\n  | 'passed: modifier-passthrough'\n  /** INSERT is ordinary typing; only Escape is Vim's. */\n  | 'passed: insert-mode-native'\n  /** Vim is off. The engine is installed in every editor, so this is most keystrokes. */\n  | 'passed: vim-disabled'\n  /** Mid-composition: the input method owns every key until it is finished. */\n  | 'passed: ime-composing'\n\nexport function verdictForAction(action: Action | null, pending: boolean): VimVerdict {\n  if (action) {\n    return `claimed: ${action.kind}`\n  }\n  return pending ? 'claimed: pending' : 'consumed: unsupported-modal-chord'\n}\n\nfunction debugOn(): boolean {\n  try {\n    return window.localStorage.getItem(VIM_DEBUG_KEY) === '1'\n  } catch {\n    // Private browsing, a blocked storage partition: no flag, no logging.\n    return false\n  }\n}\n\n/**\n * The verdict for the event being handled right now.\n *\n * A `WeakMap` rather than a field: the document listener below sees the same\n * event object twice — once going down, once coming back up — and the engine\n * runs in between. Keying on the event means a verdict can never be attributed\n * to the wrong keystroke, and nothing is retained once the event is collected.\n */\nconst verdicts = new WeakMap<KeyboardEvent, VimVerdict>()\n\nexport function noteVerdict(event: KeyboardEvent, verdict: VimVerdict): void {\n  if (debugOn()) {\n    verdicts.set(event, verdict)\n  }\n}\n\nfunction describe(target: EventTarget | null): string {\n  if (!(target instanceof Element)) {\n    return String(target)\n  }\n  const classes = target.className && typeof target.className === 'string' ? `.${target.className.split(/\\s+/).join('.')}` : ''\n  return `${target.tagName.toLowerCase()}${classes}`\n}\n\nfunction log(phase: 'capture' | 'bubble', event: KeyboardEvent): void {\n  const verdict = verdicts.get(event)\n  console.log('[pasty vim]', {\n    phase,\n    key: event.key,\n    code: event.code,\n    ctrlKey: event.ctrlKey,\n    metaKey: event.metaKey,\n    altKey: event.altKey,\n    shiftKey: event.shiftKey,\n    defaultPrevented: event.defaultPrevented,\n    eventPhase: event.eventPhase,\n    target: describe(event.target),\n    ...(verdict ? { verdict } : {}),\n  })\n}\n\n/**\n * Watch every keydown on the way down and on the way back up.\n *\n * Both phases, because the interesting cases are the differences between them:\n * a key the palette claimed never reaches the second line, and a key the engine\n * claimed comes back `defaultPrevented` with a verdict attached. Installed once\n * from `boot()`; the flag check is inside the listener, so an installation that\n * is never switched on costs one `getItem` per keystroke.\n */\nexport function installVimKeyLogger(target: Document = document): () => void {\n  const capture = (event: KeyboardEvent) => {\n    if (debugOn()) {\n      log('capture', event)\n    }\n  }\n  const bubble = (event: KeyboardEvent) => {\n    if (debugOn()) {\n      log('bubble', event)\n    }\n  }\n  target.addEventListener('keydown', capture, true)\n  target.addEventListener('keydown', bubble, false)\n  return () => {\n    target.removeEventListener('keydown', capture, true)\n    target.removeEventListener('keydown', bubble, false)\n  }\n}\n","/**\n * The logical-line model.\n *\n * Vim's whole vocabulary is built on lines, and a rich-text tree does not have\n * any. This module invents them, once, so that `0 ^ $ I A o O J dd cc yy gg G`,\n * `j`/`k` and Visual Line all agree on what a line is:\n *\n *   - every textblock outside a code block is one line (paragraph, heading,\n *     list-item paragraph, table-cell paragraph, blockquote paragraph);\n *   - a code block contributes one line per newline-separated segment, because\n *     that is what the user sees and what the Markdown holds;\n *   - a `hardBreak` is an atom *inside* a line, not a separator — it has no\n *     Markdown-stable identity of its own;\n *   - a `horizontalRule` contributes no line at all (a documented simplification:\n *     `j` steps over a rule rather than onto it).\n *\n * Nothing here measures anything. There is no `coordsAtPos`, no rectangle, no\n * notion of a wrapped screen line — `j` moves to the next *logical* line even\n * when the paragraph wraps across five of them. That divergence from terminal\n * Vim is deliberate, it is what makes every motion deterministic and unit\n * testable, and it is pinned by a divergence fixture.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\n\n/** Stands in for a leaf node (a hard break) so text offsets stay position-aligned. */\nexport const ATOM = ' '\n\nconst BLANK = new Set([' ', '\\t', ATOM])\n\nexport interface Line {\n  /** Position of the line's first character. */\n  from: number\n  /** Position just past the line's last character. */\n  to: number\n  /** Position immediately before the containing textblock node. */\n  blockPos: number\n  block: PMNode\n  /** Which newline-separated segment of a code block this is; 0 elsewhere. */\n  index: number\n  code: boolean\n  /** The line's text, with leaf nodes rendered as `ATOM` so offsets align. */\n  text: string\n}\n\nexport interface FoundBlock {\n  node: PMNode\n  pos: number\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return value < min ? min : value > max ? max : value\n}\n\n/** A textblock's text with every leaf standing in as one character. */\nfunction blockText(block: PMNode): string {\n  return block.textBetween(0, block.content.size, undefined, ATOM)\n}\n\nfunction firstTextblockIn(node: PMNode, pos: number): FoundBlock | null {\n  if (node.isTextblock) {\n    return { node, pos }\n  }\n  if (node.isLeaf) {\n    return null\n  }\n  let inner = pos + 1\n  for (let i = 0; i < node.childCount; i++) {\n    const child = node.child(i)\n    const found = firstTextblockIn(child, inner)\n    if (found) {\n      return found\n    }\n    inner += child.nodeSize\n  }\n  return null\n}\n\nfunction lastTextblockIn(node: PMNode, pos: number): FoundBlock | null {\n  if (node.isTextblock) {\n    return { node, pos }\n  }\n  if (node.isLeaf) {\n    return null\n  }\n  let end = pos + 1 + node.content.size\n  for (let i = node.childCount - 1; i >= 0; i--) {\n    const child = node.child(i)\n    const childPos = end - child.nodeSize\n    const found = lastTextblockIn(child, childPos)\n    if (found) {\n      return found\n    }\n    end = childPos\n  }\n  return null\n}\n\n/**\n * The first textblock starting at or after `after`.\n *\n * Climbing the resolved path rather than scanning the document keeps this\n * proportional to nesting depth and sibling count, so `j` held down on a long\n * document costs the same as `j` pressed once near the top.\n */\nexport function nextTextblock(doc: PMNode, after: number): FoundBlock | null {\n  const $pos = doc.resolve(clamp(after, 0, doc.content.size))\n  for (let depth = $pos.depth; depth >= 0; depth--) {\n    const parent = $pos.node(depth)\n    let childPos = $pos.start(depth)\n    for (let i = 0; i < parent.childCount; i++) {\n      const child = parent.child(i)\n      if (childPos >= after) {\n        const found = firstTextblockIn(child, childPos)\n        if (found) {\n          return found\n        }\n      }\n      childPos += child.nodeSize\n    }\n  }\n  return null\n}\n\n/** The last textblock ending at or before `before`. */\nexport function prevTextblock(doc: PMNode, before: number): FoundBlock | null {\n  const $pos = doc.resolve(clamp(before, 0, doc.content.size))\n  for (let depth = $pos.depth; depth >= 0; depth--) {\n    const parent = $pos.node(depth)\n    let end = $pos.start(depth) + parent.content.size\n    for (let i = parent.childCount - 1; i >= 0; i--) {\n      const child = parent.child(i)\n      const childPos = end - child.nodeSize\n      if (end <= before) {\n        const found = lastTextblockIn(child, childPos)\n        if (found) {\n          return found\n        }\n      }\n      end = childPos\n    }\n  }\n  return null\n}\n\n/** The textblock containing `pos`, if `pos` is inside one. */\nfunction enclosingTextblock(doc: PMNode, pos: number): FoundBlock | null {\n  const $pos = doc.resolve(clamp(pos, 0, doc.content.size))\n  for (let depth = $pos.depth; depth >= 1; depth--) {\n    const node = $pos.node(depth)\n    if (node.isTextblock) {\n      return { node, pos: $pos.before(depth) }\n    }\n  }\n  return null\n}\n\n/** Split a block into its lines. One line for anything but a code block. */\nfunction linesOf(block: PMNode, blockPos: number): Line[] {\n  const text = blockText(block)\n  const start = blockPos + 1\n  if (block.type.name !== 'codeBlock') {\n    return [\n      { from: start, to: start + block.content.size, blockPos, block, index: 0, code: false, text },\n    ]\n  }\n  const lines: Line[] = []\n  let offset = 0\n  text.split('\\n').forEach((segment, index) => {\n    lines.push({\n      from: start + offset,\n      to: start + offset + segment.length,\n      blockPos,\n      block,\n      index,\n      code: true,\n      text: segment,\n    })\n    // +1 for the newline that separated this segment from the next.\n    offset += segment.length + 1\n  })\n  return lines\n}\n\n/**\n * The line containing `pos`.\n *\n * Null only for a document with no textblock at all (a lone horizontal rule),\n * in which case every caller no-ops rather than guessing.\n */\nexport function lineAt(doc: PMNode, pos: number): Line | null {\n  const found =\n    enclosingTextblock(doc, pos) ?? nextTextblock(doc, pos) ?? prevTextblock(doc, doc.content.size)\n  if (!found) {\n    return null\n  }\n  const all = linesOf(found.node, found.pos)\n  for (const line of all) {\n    // `<= line.to` so the position just past a line's last character — where the\n    // caret sits at end of line — belongs to that line, not the next one.\n    if (pos <= line.to) {\n      return line\n    }\n  }\n  return all[all.length - 1]\n}\n\nexport function nextLine(doc: PMNode, line: Line): Line | null {\n  if (line.code) {\n    const all = linesOf(line.block, line.blockPos)\n    if (line.index + 1 < all.length) {\n      return all[line.index + 1]\n    }\n  }\n  const found = nextTextblock(doc, line.blockPos + line.block.nodeSize)\n  return found ? linesOf(found.node, found.pos)[0] : null\n}\n\nexport function prevLine(doc: PMNode, line: Line): Line | null {\n  if (line.code && line.index > 0) {\n    return linesOf(line.block, line.blockPos)[line.index - 1]\n  }\n  const found = prevTextblock(doc, line.blockPos)\n  if (!found) {\n    return null\n  }\n  const all = linesOf(found.node, found.pos)\n  return all[all.length - 1]\n}\n\nexport function firstLine(doc: PMNode): Line | null {\n  const found = nextTextblock(doc, 0)\n  return found ? linesOf(found.node, found.pos)[0] : null\n}\n\nexport function lastLine(doc: PMNode): Line | null {\n  const found = prevTextblock(doc, doc.content.size)\n  if (!found) {\n    return null\n  }\n  const all = linesOf(found.node, found.pos)\n  return all[all.length - 1]\n}\n\n/** The `n`th line, 1-based, clamped to the document. What `{count}G` means. */\nexport function nthLine(doc: PMNode, n: number): Line | null {\n  let line = firstLine(doc)\n  if (!line) {\n    return null\n  }\n  for (let at = 1; at < n; at++) {\n    const next = nextLine(doc, line)\n    if (!next) {\n      return line\n    }\n    line = next\n  }\n  return line\n}\n\nexport function isBlankChar(character: string): boolean {\n  return BLANK.has(character)\n}\n\n/** Where `^` lands: the first non-blank, or the last character of a blank line. */\nexport function firstNonBlank(line: Line): number {\n  for (let at = 0; at < line.text.length; at++) {\n    if (!isBlankChar(line.text[at])) {\n      return line.from + at\n    }\n  }\n  return line.from + Math.max(0, line.text.length - 1)\n}\n\n/** Where the NORMAL-mode cursor may rest: one short of the end, never past the start. */\nexport function clampToLine(line: Line): number {\n  return line.text.length === 0 ? line.from : line.to - 1\n}\n","/**\n * The text stream a scan walks.\n *\n * Vim's words, WORDs and text objects all need the same thing: a cursor over the\n * document's *visible characters* that can step across line boundaries and knows\n * which class each character belongs to. This is that cursor, and it is shared by\n * `motions.ts` and `textobjects.ts` so the two can never disagree about where a\n * word begins.\n *\n * It reads `line.text` — the mark-free rendering `lines.ts` produces — which is\n * why `w` steps over a `**bold**` boundary without stopping. Marks are\n * formatting; Vim's words are text.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\n\nimport type { Line } from './lines'\nimport { isBlankChar, lineAt, nextLine, prevLine } from './lines'\n\nexport const WORD = /[\\p{L}\\p{N}_]/u\n\nexport type CharClass = 'blank' | 'word' | 'punct' | 'eol'\n\n/**\n * `W`, `B` and `E` are the same scan with punctuation folded into the run: a\n * WORD is whatever is not whitespace. One flag, rather than a second scanner.\n */\nexport function fold(cls: CharClass, big: boolean): CharClass {\n  return big && cls === 'punct' ? 'word' : cls\n}\n\n/** The class of one character, with no scan around it. */\nexport function classOf(character: string | undefined, big = false): CharClass {\n  if (character === undefined) {\n    return 'eol'\n  }\n  if (isBlankChar(character)) {\n    return 'blank'\n  }\n  return fold(WORD.test(character) ? 'word' : 'punct', big)\n}\n\n/**\n * A position in the text stream: a line plus an offset into it, where an offset\n * equal to the line's length is the virtual newline at its end. Stepping off\n * that slot is what carries `w` and `b` across blocks.\n */\nexport class Scan {\n  constructor(\n    private readonly doc: PMNode,\n    public line: Line,\n    public offset: number,\n  ) {}\n\n  static at(doc: PMNode, pos: number): Scan | null {\n    const line = lineAt(doc, pos)\n    if (!line) {\n      return null\n    }\n    return new Scan(doc, line, Math.max(0, Math.min(pos - line.from, line.text.length)))\n  }\n\n  pos(): number {\n    return this.line.from + this.offset\n  }\n\n  char(): string | null {\n    return this.offset >= this.line.text.length ? null : this.line.text[this.offset]\n  }\n\n  classHere(big = false): CharClass {\n    const character = this.char()\n    if (character === null) {\n      return 'eol'\n    }\n    if (isBlankChar(character)) {\n      return 'blank'\n    }\n    return fold(WORD.test(character) ? 'word' : 'punct', big)\n  }\n\n  forward(): boolean {\n    if (this.offset < this.line.text.length) {\n      this.offset += 1\n      return true\n    }\n    const next = nextLine(this.doc, this.line)\n    if (!next) {\n      return false\n    }\n    this.line = next\n    this.offset = 0\n    return true\n  }\n\n  backward(): boolean {\n    if (this.offset > 0) {\n      this.offset -= 1\n      return true\n    }\n    const previous = prevLine(this.doc, this.line)\n    if (!previous) {\n      return false\n    }\n    this.line = previous\n    this.offset = previous.text.length\n    return true\n  }\n\n  snapshot(): { line: Line; offset: number } {\n    return { line: this.line, offset: this.offset }\n  }\n\n  restore(saved: { line: Line; offset: number }): void {\n    this.line = saved.line\n    this.offset = saved.offset\n  }\n}\n\nexport function isBlankish(scan: Scan): boolean {\n  const cls = scan.classHere()\n  return cls === 'blank' || cls === 'eol'\n}\n\n/** Walk to the last character of the run the scan currently sits in. */\nexport function toRunEnd(scan: Scan, big: boolean): void {\n  const cls = scan.classHere(big)\n  for (;;) {\n    const saved = scan.snapshot()\n    if (!scan.forward()) {\n      return\n    }\n    if (scan.classHere(big) !== cls) {\n      scan.restore(saved)\n      return\n    }\n  }\n}\n\n/** Walk back to the first character of the run the scan currently sits in. */\nexport function toRunStart(scan: Scan, big: boolean): void {\n  const cls = scan.classHere(big)\n  for (;;) {\n    const saved = scan.snapshot()\n    if (!scan.backward()) {\n      return\n    }\n    if (scan.classHere(big) !== cls) {\n      scan.restore(saved)\n      return\n    }\n  }\n}\n\n","/**\n * Vim patterns, compiled.\n *\n * Search used to be literal text. That was defensible — a rich-text document has\n * no Markdown source for a pattern to match against — but it quietly betrayed\n * the muscle memory it was meant to serve: `/f.o` found nothing, and `\\.` found\n * a backslash. This module is the answer: a **bounded subset of Vim's magic\n * mode**, compiled once to a JavaScript `RegExp`, and used by `/`, `?`, `n`,\n * `N`, `*`, `#`, `:s` and the highlight alike, so none of them can disagree\n * about what a pattern means.\n *\n * The boundary is the whole design, and it is defensive in three directions:\n *\n *   1. **Supported syntax behaves as Vim's**, pinned by the table in\n *      `tests/vim/pattern.test.ts`.\n *   2. **Unsupported syntax fails out loud** — `Invalid pattern`, and nothing is\n *      searched or edited. Guessing at `\\zs` or `\\%(` would be worse than\n *      refusing them.\n *   3. **JavaScript's own regex language never leaks through.** In magic mode\n *      `+ ? ( ) { } |` are ordinary characters, so they are escaped in\n *      translation; someone searching for `f(x)` gets `f(x)`, not a group.\n *\n * Deliberately absent, and refused rather than approximated: multi-line\n * patterns (matching is line-scoped, so a pattern can never span blocks),\n * `\\zs`/`\\ze`, `\\%(`…`\\)` and the rest of `\\%`, `\\{-}` and the other non-greedy\n * forms, and lookaround. Zero-length matches are skipped rather than recorded —\n * substituting a dash for `x*` and turning `abc` into `-a-b-c-` is a party\n * trick, not a feature, and a highlight you cannot see is not a highlight.\n *\n * Pure: strings in, a compiled pattern or a reason out.\n */\n\n/** Vim's own classes, and what they are in JavaScript. */\nconst CLASS_ESCAPES: Record<string, string> = {\n  w: '\\\\w',\n  W: '\\\\W',\n  s: '\\\\s',\n  S: '\\\\S',\n  d: '\\\\d',\n  D: '\\\\D',\n  a: '[A-Za-z]',\n  A: '[^A-Za-z]',\n}\n\n/** Backslashed characters that stand for themselves. */\nconst LITERAL_ESCAPES = new Set(['.', '*', '[', ']', '^', '$', '/', '~', '\\\\'])\n\n/** The magic-mode specials that need a backslash, and their JavaScript spelling. */\nconst QUANTIFIER_ESCAPES: Record<string, string> = {\n  '+': '+',\n  '?': '?',\n  '=': '?',\n}\n\n/** Characters JavaScript treats as syntax and Vim's magic mode does not. */\nconst JS_SPECIAL = /[.*+?^${}()|[\\]\\\\]/\n\nexport interface CompiledPattern {\n  /** What the user typed, kept for messages. */\n  query: string\n  /** The JavaScript source it compiled to. */\n  source: string\n  /** `\\C` or `\\c` in the pattern, which overrides smartcase. Null leaves it to smartcase. */\n  forcedCase: 'sensitive' | 'insensitive' | null\n  /**\n   * Whether the pattern contains an uppercase *literal*.\n   *\n   * Read off the literals rather than the raw text, so `\\S` does not make a\n   * pattern case-sensitive by accident — the `S` is syntax, not something anyone\n   * asked to match.\n   */\n  uppercase: boolean\n}\n\nexport type CompileResult =\n  | { ok: true; pattern: CompiledPattern }\n  | { ok: false; reason: string }\n\nfunction fail(reason: string): CompileResult {\n  return { ok: false, reason }\n}\n\n/** A literal character, escaped for JavaScript if it means something there. */\nfunction literal(character: string): string {\n  return JS_SPECIAL.test(character) ? `\\\\${character}` : character\n}\n\n/**\n * `\\{n,m}` and its shorthands.\n *\n * Vim closes the brace with `}` or `\\}`, and every field is optional: `\\{}` is\n * `*`, `\\{3}` is exactly three, `\\{2,}` is two or more, `\\{,4}` is up to four.\n * Anything else is a malformed quantifier and the whole pattern is refused.\n */\nfunction readBrace(input: string, at: number): { source: string; next: number } | null {\n  let body = ''\n  let cursor = at\n  while (cursor < input.length) {\n    const character = input[cursor]\n    if (character === '}') {\n      cursor += 1\n      break\n    }\n    if (character === '\\\\' && input[cursor + 1] === '}') {\n      cursor += 2\n      break\n    }\n    body += character\n    cursor += 1\n    if (cursor >= input.length) {\n      return null\n    }\n  }\n  if (body === '') {\n    return { source: '*', next: cursor }\n  }\n  if (!/^\\d*(,\\d*)?$/.test(body)) {\n    return null\n  }\n  const [low, high] = body.split(',')\n  if (high === undefined) {\n    return { source: `{${low}}`, next: cursor }\n  }\n  return { source: `{${low === '' ? 0 : low},${high}}`, next: cursor }\n}\n\n/**\n * A character class, copied through with its contents left alone.\n *\n * Classes mean the same thing in both languages, so the only work is finding the\n * end of one — remembering that `]` immediately after `[` or `[^` is a literal\n * `]`, as it is in both.\n */\nfunction readClass(input: string, at: number): { source: string; next: number; uppercase: boolean } | null {\n  let cursor = at + 1\n  let body = ''\n  if (input[cursor] === '^') {\n    body += '^'\n    cursor += 1\n  }\n  if (input[cursor] === ']') {\n    body += '\\\\]'\n    cursor += 1\n  }\n  while (cursor < input.length && input[cursor] !== ']') {\n    if (input[cursor] === '\\\\' && cursor + 1 < input.length) {\n      body += input.slice(cursor, cursor + 2)\n      cursor += 2\n      continue\n    }\n    body += input[cursor]\n    cursor += 1\n  }\n  if (cursor >= input.length) {\n    // An unterminated class. Vim would treat the `[` as a literal; refusing is\n    // the honest answer, because the alternative is a pattern that silently\n    // means something other than what it says.\n    return null\n  }\n  return { source: `[${body}]`, next: cursor + 1, uppercase: /[A-Z]/.test(body.replace(/\\\\./g, '')) }\n}\n\n/**\n * Compile a Vim pattern.\n *\n * The walk is one pass with one piece of state beyond the output: whether there\n * is an atom to the left, which is what makes `*` at the start of a pattern a\n * literal asterisk (as in Vim) and `\\+` at the start an error (as in Vim).\n */\nexport function compilePattern(query: string): CompileResult {\n  if (query === '') {\n    return fail('empty pattern')\n  }\n  const out: string[] = []\n  let uppercase = false\n  let forcedCase: CompiledPattern['forcedCase'] = null\n  let hasAtom = false\n  let at = 0\n\n  const emitAtom = (source: string) => {\n    out.push(source)\n    hasAtom = true\n  }\n\n  while (at < query.length) {\n    const character = query[at]\n\n    if (character === '\\\\') {\n      const next = query[at + 1]\n      if (next === undefined) {\n        return fail('a pattern may not end in a backslash')\n      }\n      at += 2\n\n      if (next === 'c' || next === 'C') {\n        forcedCase = next === 'c' ? 'insensitive' : 'sensitive'\n        continue\n      }\n      if (LITERAL_ESCAPES.has(next)) {\n        emitAtom(`\\\\${next}`)\n        continue\n      }\n      if (CLASS_ESCAPES[next]) {\n        emitAtom(CLASS_ESCAPES[next])\n        continue\n      }\n      if (QUANTIFIER_ESCAPES[next]) {\n        if (!hasAtom) {\n          return fail(`nothing for \\\\${next} to repeat`)\n        }\n        out.push(QUANTIFIER_ESCAPES[next])\n        continue\n      }\n      if (next === '{') {\n        if (!hasAtom) {\n          return fail('nothing for \\\\{ to repeat')\n        }\n        const brace = readBrace(query, at)\n        if (!brace) {\n          return fail('malformed \\\\{n,m}')\n        }\n        out.push(brace.source)\n        at = brace.next\n        continue\n      }\n      if (next === '(') {\n        out.push('(')\n        hasAtom = false\n        continue\n      }\n      if (next === ')') {\n        if (!out.includes('(')) {\n          return fail('unmatched \\\\)')\n        }\n        emitAtom(')')\n        continue\n      }\n      if (next === '|') {\n        out.push('|')\n        hasAtom = false\n        continue\n      }\n      if (next === '<' || next === '>') {\n        // JavaScript's word boundary is symmetric, which is what both of Vim's\n        // one-sided ones amount to next to a word character.\n        out.push('\\\\b')\n        continue\n      }\n      // `\\zs`, `\\ze`, `\\%(`, `\\n`, `\\{-}` and anything else: refused rather than\n      // reinterpreted. Guessing at Vim syntax we do not implement is exactly how\n      // a search silently matches the wrong thing.\n      return fail(`unsupported escape \\\\${next}`)\n    }\n\n    at += 1\n\n    if (character === '[') {\n      const parsed = readClass(query, at - 1)\n      if (!parsed) {\n        return fail('unterminated [')\n      }\n      emitAtom(parsed.source)\n      uppercase = uppercase || parsed.uppercase\n      at = parsed.next\n      continue\n    }\n    if (character === '.') {\n      emitAtom('.')\n      continue\n    }\n    if (character === '*') {\n      // Vim: a `*` with no atom in front of it is a literal asterisk.\n      if (hasAtom) {\n        out.push('*')\n      } else {\n        emitAtom('\\\\*')\n      }\n      continue\n    }\n    if (character === '^') {\n      // An anchor only at the very start; a literal caret anywhere else, which\n      // is Vim's rule and the reason `/x^y` finds `x^y`.\n      if (out.length === 0) {\n        out.push('^')\n      } else {\n        emitAtom('\\\\^')\n      }\n      continue\n    }\n    if (character === '$') {\n      if (at === query.length) {\n        out.push('$')\n      } else {\n        emitAtom('\\\\$')\n      }\n      continue\n    }\n\n    if (/[A-Z]/.test(character)) {\n      uppercase = true\n    }\n    emitAtom(literal(character))\n  }\n\n  const source = out.join('')\n  try {\n    // The safety net: anything the walk above let through that JavaScript still\n    // refuses — an unbalanced group, a quantifier with nothing to repeat — is an\n    // invalid pattern rather than an exception at match time.\n    new RegExp(source)\n  } catch {\n    return fail('not a valid pattern')\n  }\n  return { ok: true, pattern: { query, source, forcedCase, uppercase } }\n}\n\n/**\n * Smartcase, unless the pattern said otherwise.\n *\n * An all-lowercase pattern ignores case; one uppercase letter in it makes the\n * whole thing case-sensitive. `\\C` and `\\c` override that explicitly, which is\n * the escape hatch for the times the heuristic is wrong.\n */\nexport function isCaseSensitive(pattern: CompiledPattern): boolean {\n  if (pattern.forcedCase) {\n    return pattern.forcedCase === 'sensitive'\n  }\n  return pattern.uppercase\n}\n\n/**\n * The matcher itself. Always global: every caller scans a line rather than\n * asking a yes-or-no question.\n */\nexport function buildRegExp(pattern: { source: string }, caseSensitive: boolean): RegExp {\n  return new RegExp(pattern.source, caseSensitive ? 'g' : 'gi')\n}\n\n/** What a match was, for a replacement to refer back to. */\nexport interface MatchText {\n  text: string\n  groups: (string | undefined)[]\n}\n\n/**\n * Expand a `:s` replacement.\n *\n * Vim's vocabulary, and only Vim's: `&` and `\\0` are the whole match, `\\1`–`\\9`\n * are the groups, `\\&` and `\\\\` are the characters themselves. Everything else\n * after a backslash is the character after the backslash — so `\\n` is an `n`\n * rather than a newline, because a newline in a replacement would mean splitting\n * a block, and a substitution that restructures the document is not something to\n * arrive at through an escape nobody meant.\n */\nexport function expandReplacement(template: string, match: MatchText): string {\n  let out = ''\n  let at = 0\n  while (at < template.length) {\n    const character = template[at]\n    if (character === '&') {\n      out += match.text\n      at += 1\n      continue\n    }\n    if (character === '\\\\' && at + 1 < template.length) {\n      const next = template[at + 1]\n      at += 2\n      if (next === '0') {\n        out += match.text\n        continue\n      }\n      if (next >= '1' && next <= '9') {\n        out += match.groups[Number(next) - 1] ?? ''\n        continue\n      }\n      out += next\n      continue\n    }\n    out += character\n    at += 1\n  }\n  return out\n}\n","/**\n * Finding text.\n *\n * **Patterns are Vim patterns — a common subset of magic mode, not the whole\n * regex language.** `pattern.ts` compiles them and is the authority on what the\n * syntax means; this module is what walks the document with the result. Anything\n * the compiler refuses is refused here too, out loud, rather than searched for\n * literally: a pattern that quietly means something other than what it says is\n * how you delete the wrong text.\n *\n * The same matcher serves `/`, `?`, `n`, `N`, `*`, `#` and `:s`, so those can\n * never disagree about what \"found\" means.\n *\n * Matching is line-scoped, like Vim's: a pattern never spans a line break, which\n * in this model means it never spans a block either. `^` and `$` therefore\n * anchor to a logical line, and every match is safe to hand to an operator — no\n * range can straddle a table cell or half a list item.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\n\nimport type { Line } from './lines'\nimport { firstLine, lineAt, nextLine } from './lines'\nimport { buildRegExp, compilePattern, isCaseSensitive } from './pattern'\nimport { WORD } from './scan'\n\nexport type SearchDirection = 1 | -1\n\n/**\n * A pattern, ready to run.\n *\n * Plain data — a source string and a decision about case — rather than a live\n * `RegExp`, because this is kept in plugin state and a `RegExp` with the global\n * flag carries a mutable `lastIndex` that two scans would fight over.\n */\nexport interface SearchSpec {\n  /** What the user typed, for messages. */\n  query: string\n  /** The JavaScript source the Vim pattern compiled to. */\n  source: string\n  caseSensitive: boolean\n}\n\nexport interface Match {\n  from: number\n  to: number\n  /** The matched text, and the groups, for a `:s` replacement to refer back to. */\n  text: string\n  groups: (string | undefined)[]\n}\n\n/** Highlighting more than this stops being a help and starts being a cost. */\nexport const MATCH_LIMIT = 2000\n\n/**\n * Compile a pattern, or refuse it.\n *\n * Null is an invalid pattern, and every caller answers it the same way: say\n * `Invalid pattern`, change nothing. `caseSensitive` overrides smartcase, which\n * is how `*` searches for a word exactly as it is spelled.\n */\nexport function specFor(\n  query: string,\n  options: { caseSensitive?: boolean } = {},\n): SearchSpec | null {\n  const compiled = compilePattern(query)\n  if (!compiled.ok) {\n    return null\n  }\n  return {\n    query,\n    source: compiled.pattern.source,\n    caseSensitive: options.caseSensitive ?? isCaseSensitive(compiled.pattern),\n  }\n}\n\n/** `\\<word\\>`, for `*` and `#`. */\nexport function wholeWordPattern(word: string): string {\n  return `\\\\<${word}\\\\>`\n}\n\nfunction isWordChar(character: string | undefined): boolean {\n  return character !== undefined && WORD.test(character)\n}\n\nfunction regexFor(spec: SearchSpec): RegExp | null {\n  try {\n    return buildRegExp(spec, spec.caseSensitive)\n  } catch {\n    // A spec only ever comes from `specFor`, so this cannot normally happen —\n    // and if it somehow does, no matches is a better answer than a throw inside\n    // a keystroke.\n    return null\n  }\n}\n\n/**\n * Every match on one line, appended in order.\n *\n * Zero-length matches are stepped over rather than recorded: a highlight with no\n * width is not a highlight, and a substitution between every character is a\n * party trick. Stepping is also what keeps a pattern like `x*` from looping.\n */\nfunction scanLine(\n  line: Line,\n  regex: RegExp,\n  into: Match[],\n  limit: number,\n  firstOnly: boolean,\n): void {\n  regex.lastIndex = 0\n  for (;;) {\n    const found = regex.exec(line.text)\n    if (!found || into.length >= limit) {\n      return\n    }\n    if (found[0] === '') {\n      regex.lastIndex += 1\n      if (regex.lastIndex > line.text.length) {\n        return\n      }\n      continue\n    }\n    into.push({\n      from: line.from + found.index,\n      to: line.from + found.index + found[0].length,\n      text: found[0],\n      groups: found.slice(1),\n    })\n    if (firstOnly) {\n      return\n    }\n  }\n}\n\n/** Every match in the document, in document order. */\nexport function findMatches(doc: PMNode, spec: SearchSpec, limit = MATCH_LIMIT): Match[] {\n  const matches: Match[] = []\n  const regex = regexFor(spec)\n  if (!regex) {\n    return matches\n  }\n  let line = firstLine(doc)\n  while (line && matches.length < limit) {\n    scanLine(line, regex, matches, limit, false)\n    line = nextLine(doc, line)\n  }\n  return matches\n}\n\n/**\n * Matches within a given set of lines — what `:s` operates on.\n *\n * `firstOnly` is the absence of the `g` flag: one substitution per line, which\n * is Vim's default and surprises people exactly once.\n */\nexport function matchesInLines(\n  lines: Line[],\n  spec: SearchSpec,\n  firstOnly: boolean,\n  limit = MATCH_LIMIT,\n): Match[] {\n  const matches: Match[] = []\n  const regex = regexFor(spec)\n  if (!regex) {\n    return matches\n  }\n  for (const line of lines) {\n    if (matches.length >= limit) {\n      break\n    }\n    scanLine(line, regex, matches, limit, firstOnly)\n  }\n  return matches\n}\n\n/**\n * The match a `/` or an `n` lands on: the next one past the cursor, wrapping at\n * the end of the document the way Vim's `wrapscan` does.\n */\nexport function matchFrom(\n  matches: Match[],\n  head: number,\n  direction: SearchDirection,\n): Match | null {\n  if (matches.length === 0) {\n    return null\n  }\n  if (direction === 1) {\n    return matches.find(match => match.from > head) ?? matches[0]\n  }\n  const before = [...matches].reverse().find(match => match.from < head)\n  return before ?? matches[matches.length - 1]\n}\n\n/**\n * The word under the cursor, for `*` and `#`.\n *\n * Null when the cursor is not on a word at all, in which case those keys do\n * nothing — Vim searches forward for the next word instead, which is a surprise\n * nobody has ever wanted.\n */\nexport function wordUnderCursor(doc: PMNode, head: number): string | null {\n  const line = lineAt(doc, head)\n  if (!line) {\n    return null\n  }\n  const offset = head - line.from\n  if (!isWordChar(line.text[offset])) {\n    return null\n  }\n  let start = offset\n  while (start > 0 && isWordChar(line.text[start - 1])) {\n    start -= 1\n  }\n  let end = offset + 1\n  while (end < line.text.length && isWordChar(line.text[end])) {\n    end += 1\n  }\n  return line.text.slice(start, end)\n}\n","/**\n * Text objects: `iw`, `aw`, `i\"`, `a(` and the rest.\n *\n * A motion says \"from here to there\". An object says \"this thing\", wherever the\n * cursor happens to be inside it — which is why `ciw` is the command people\n * reach for most and the one that has to be right.\n *\n * Everything here is scoped, deliberately. Words and quotes never leave the\n * logical line; brackets never leave the block (or, inside code, the code\n * block, where multi-line pairs are the normal case). A text object that could\n * run away across a whole document would, one day, and take an operator with it.\n *\n * Pure, like the motions: `(doc, head, spec, count)` in, a range or null out.\n * Null means \"no such object here\" and every caller turns that into a no-op —\n * `ci(` outside any brackets does nothing rather than guessing.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\n\nimport { ATOM, lineAt } from './lines'\nimport { classOf } from './scan'\nimport type { TextObjectSpec } from './types'\n\n/** Long enough for any real block; short enough that a pathological one ends. */\nconst SCAN_LIMIT = 100_000\n\nexport interface ObjectRange {\n  from: number\n  to: number\n}\n\n/** A run of characters that all belong to the same class. */\ninterface Run {\n  start: number\n  end: number\n  blank: boolean\n}\n\n/**\n * The text a bracket object may search, and where it starts in the document.\n *\n * Inside a code block that is the whole block — code brackets span lines and\n * always have. Everywhere else it is the block, which in this model is also the\n * line. Offsets map to positions by simple addition: `lines.ts` renders every\n * leaf as one character precisely so that stays true.\n */\nfunction blockScope(doc: PMNode, head: number): { text: string; base: number } | null {\n  const line = lineAt(doc, head)\n  if (!line) {\n    return null\n  }\n  if (line.code) {\n    const block = line.block\n    return {\n      text: block.textBetween(0, block.content.size, undefined, ATOM),\n      base: line.blockPos + 1,\n    }\n  }\n  return { text: line.text, base: line.from }\n}\n\n/** The text a word or quote object may search: never more than one line. */\nfunction lineScope(doc: PMNode, head: number): { text: string; base: number } | null {\n  const line = lineAt(doc, head)\n  return line ? { text: line.text, base: line.from } : null\n}\n\n// ---------------------------------------------------------------------------\n// words\n// ---------------------------------------------------------------------------\n\nfunction runsOf(text: string, big: boolean): Run[] {\n  const runs: Run[] = []\n  let at = 0\n  while (at < text.length) {\n    const cls = classOf(text[at], big)\n    let end = at + 1\n    while (end < text.length && classOf(text[end], big) === cls) {\n      end += 1\n    }\n    runs.push({ start: at, end, blank: cls === 'blank' })\n    at = end\n  }\n  return runs\n}\n\nfunction runIndexAt(runs: Run[], offset: number): number {\n  for (let at = 0; at < runs.length; at++) {\n    if (offset >= runs[at].start && offset < runs[at].end) {\n      return at\n    }\n  }\n  return runs.length - 1\n}\n\n/**\n * `iw`: the run under the cursor, and `count - 1` more after it.\n *\n * \"Inner word\" counts a stretch of whitespace as a word of its own, which is why\n * `2iw` is a word and the space after it rather than two words.\n */\nfunction innerWord(runs: Run[], index: number, count: number): ObjectRange | null {\n  const last = Math.min(runs.length - 1, index + count - 1)\n  return { from: runs[index].start, to: runs[last].end }\n}\n\n/**\n * `aw`: the word and the whitespace beside it.\n *\n * Vim's rule, which is fussier than it looks: take the trailing whitespace if\n * there is any, and only if there is none take the leading whitespace instead.\n * That is what makes `daw` in the middle of a sentence leave one space rather\n * than two or none.\n */\nfunction aroundWord(runs: Run[], index: number, count: number): ObjectRange | null {\n  let at = index\n  let from = runs[at].start\n  let to = runs[at].end\n  let tookTrailing = false\n\n  for (let word = 0; word < count; word++) {\n    if (at >= runs.length) {\n      break\n    }\n    // Starting on whitespace: the whitespace and then the word after it.\n    if (runs[at].blank) {\n      to = runs[at].end\n      at += 1\n      if (at < runs.length) {\n        to = runs[at].end\n        at += 1\n      }\n      tookTrailing = true\n      continue\n    }\n    to = runs[at].end\n    at += 1\n    if (at < runs.length && runs[at].blank) {\n      to = runs[at].end\n      at += 1\n      tookTrailing = true\n    } else {\n      tookTrailing = false\n    }\n  }\n\n  if (!tookTrailing && index > 0 && runs[index - 1].blank) {\n    from = runs[index - 1].start\n  }\n  return { from, to }\n}\n\n// ---------------------------------------------------------------------------\n// quotes\n// ---------------------------------------------------------------------------\n\n/**\n * `i\"` and `a\"`, paired left to right across the line.\n *\n * Quotes have no nesting to lean on, so Vim pairs them in order: the first with\n * the second, the third with the fourth. Escapes are not honoured — `\\\\\"` counts\n * as a quote — which is a documented simplification and the same one several\n * Vim plugins make. In prose, which is what Pasty holds, it is almost never\n * wrong.\n */\nfunction quoteObject(\n  text: string,\n  offset: number,\n  quote: string,\n  around: boolean,\n): ObjectRange | null {\n  const positions: number[] = []\n  for (let at = 0; at < text.length; at++) {\n    if (text[at] === quote) {\n      positions.push(at)\n    }\n  }\n  for (let pair = 0; pair + 1 < positions.length; pair += 2) {\n    const open = positions[pair]\n    const close = positions[pair + 1]\n    // The first pair that has not already finished before the cursor: standing\n    // *before* a quoted string on the line selects it, as Vim does.\n    if (close >= offset) {\n      if (around) {\n        return { from: open, to: close + 1 }\n      }\n      return open + 1 === close ? null : { from: open + 1, to: close }\n    }\n  }\n  return null\n}\n\n// ---------------------------------------------------------------------------\n// brackets\n// ---------------------------------------------------------------------------\n\nconst CLOSERS: Record<string, string> = { '(': ')', '[': ']', '{': '}' }\nconst OPENERS = new Set(Object.keys(CLOSERS))\nconst CLOSERS_TO_OPEN = new Map(Object.entries(CLOSERS).map(([open, close]) => [close, open]))\n\n/**\n * The `count`th enclosing bracket pair.\n *\n * Walks backwards with a nesting counter to the unmatched opener, then forwards\n * from it to its match. Doing it in that order is what makes the cursor's own\n * position decide which pair is \"the\" pair, and what lets a count climb outward\n * through nested ones.\n */\nfunction pairObject(\n  text: string,\n  offset: number,\n  open: string,\n  around: boolean,\n  count: number,\n): ObjectRange | null {\n  const close = CLOSERS[open]\n  let searchFrom = offset\n  let result: ObjectRange | null = null\n\n  for (let level = 0; level < count; level++) {\n    let depth = 0\n    let opener = -1\n    for (let at = searchFrom, steps = 0; at >= 0 && steps < SCAN_LIMIT; at--, steps++) {\n      // The cursor sitting on the closer belongs to that pair, not outside it.\n      if (text[at] === close && at !== searchFrom) {\n        depth += 1\n      } else if (text[at] === open) {\n        if (depth === 0) {\n          opener = at\n          break\n        }\n        depth -= 1\n      }\n    }\n    if (opener < 0) {\n      return null\n    }\n\n    let closer = -1\n    depth = 0\n    for (let at = opener + 1, steps = 0; at < text.length && steps < SCAN_LIMIT; at++, steps++) {\n      if (text[at] === open) {\n        depth += 1\n      } else if (text[at] === close) {\n        if (depth === 0) {\n          closer = at\n          break\n        }\n        depth -= 1\n      }\n    }\n    if (closer < 0) {\n      return null\n    }\n\n    result = around ? { from: opener, to: closer + 1 } : { from: opener + 1, to: closer }\n    // One step outside this pair, so the next round finds the one enclosing it.\n    searchFrom = opener - 1\n    if (searchFrom < 0 && level + 1 < count) {\n      return null\n    }\n  }\n\n  if (result && !around && result.to <= result.from) {\n    // `i(` on an empty pair has nothing inside it to operate on.\n    return null\n  }\n  return result\n}\n\n/**\n * `%`: the bracket matching the one at or after the cursor.\n *\n * The same scan the bracket objects use, entered from the other end — Vim looks\n * along the *line* for a bracket to start from, then matches it within the\n * block. Null when there is no bracket on the line, or one with no partner, and\n * `%` then does nothing rather than jumping somewhere arbitrary.\n */\nexport function matchingBracket(doc: PMNode, head: number): number | null {\n  const scope = blockScope(doc, head)\n  if (!scope) {\n    return null\n  }\n  const offset = head - scope.base\n\n  // Along this line only, which is what stops `%` on a prose paragraph from\n  // finding a bracket four code lines below.\n  let at = offset\n  while (at < scope.text.length && scope.text[at] !== '\\n') {\n    const character = scope.text[at]\n    if (OPENERS.has(character) || CLOSERS_TO_OPEN.has(character)) {\n      const match = partnerOf(scope.text, at)\n      return match === null ? null : scope.base + match\n    }\n    at += 1\n  }\n  return null\n}\n\n/**\n * The index of the bracket that closes or opens the one at `at`.\n *\n * One counter, counted the same way in both directions: openers add, closers\n * subtract, and the partner is wherever the count returns to zero. Going forward\n * that starts at +1 on the opener; going back it starts at −1 on the closer.\n */\nfunction partnerOf(text: string, at: number): number | null {\n  const character = text[at]\n  const forward = OPENERS.has(character)\n  const open = forward ? character : CLOSERS_TO_OPEN.get(character)!\n  const close = CLOSERS[open]\n  const step = forward ? 1 : -1\n\n  let depth = 0\n  for (\n    let index = at, steps = 0;\n    index >= 0 && index < text.length && steps < SCAN_LIMIT;\n    index += step, steps++\n  ) {\n    if (text[index] === open) {\n      depth += 1\n    } else if (text[index] === close) {\n      depth -= 1\n    } else {\n      continue\n    }\n    if (depth === 0) {\n      return index\n    }\n  }\n  return null\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a text object against the document.\n *\n * Null means there is no such object here, and every caller treats that as a\n * no-op: an operator that cannot find its object must leave the document alone.\n */\nexport function resolveTextObject(\n  doc: PMNode,\n  head: number,\n  spec: TextObjectSpec,\n  count: number,\n): ObjectRange | null {\n  if (spec.kind === 'word') {\n    const scope = lineScope(doc, head)\n    if (!scope || scope.text.length === 0) {\n      return null\n    }\n    const runs = runsOf(scope.text, spec.big)\n    if (runs.length === 0) {\n      return null\n    }\n    const index = runIndexAt(runs, head - scope.base)\n    const range = spec.around\n      ? aroundWord(runs, index, count)\n      : innerWord(runs, index, count)\n    return range ? { from: scope.base + range.from, to: scope.base + range.to } : null\n  }\n\n  if (spec.kind === 'quote') {\n    const scope = lineScope(doc, head)\n    if (!scope) {\n      return null\n    }\n    const range = quoteObject(scope.text, head - scope.base, spec.quote, spec.around)\n    return range ? { from: scope.base + range.from, to: scope.base + range.to } : null\n  }\n\n  const scope = blockScope(doc, head)\n  if (!scope) {\n    return null\n  }\n  const range = pairObject(scope.text, head - scope.base, spec.open, spec.around, count)\n  return range ? { from: scope.base + range.from, to: scope.base + range.to } : null\n}\n","/**\n * Motions.\n *\n * A motion answers two different questions at once: where the cursor goes, and\n * what range an operator in front of it covers. Vim's answers differ — `e` is\n * inclusive, `w` is exclusive, `j` is linewise, and `dw` at the last word of a\n * line famously refuses to pull the next line up. All of that lives here, in one\n * pure function over `(doc, head, motion)`, so the compatibility table can pin\n * it without an editor in the loop.\n *\n * The scanner underneath reads `line.text` — the mark-free rendering `lines.ts`\n * produces — which is why `w` steps over a `**bold**` boundary without stopping.\n * Marks are formatting; Vim's words are text.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\n\nimport type { Line } from './lines'\nimport {\n  clampToLine,\n  firstNonBlank,\n  isBlankChar,\n  lineAt,\n  nextLine,\n  nextTextblock,\n  nthLine,\n  prevLine,\n} from './lines'\nimport { Scan, isBlankish, toRunEnd, toRunStart } from './scan'\nimport { findMatches, matchFrom } from './search'\nimport { matchingBracket } from './textobjects'\nimport type { FindTarget, SearchState } from './types'\nimport type { CountedMotion, MotionSpec, OperatorKind } from './types'\n\n/** `;` and `,`: the same find, the other way round. */\nconst MIRROR: Record<FindTarget['kind'], FindTarget['kind']> = {\n  f: 'F',\n  F: 'f',\n  t: 'T',\n  T: 't',\n}\n\nexport type MotionWise = 'char' | 'line'\n\nexport interface MotionResult {\n  /** Where a bare motion leaves the cursor, before the NORMAL-mode clamp. */\n  target: number\n  wise: MotionWise\n  /** The operator range, with Vim's inclusive/exclusive adjustments applied. */\n  from: number\n  to: number\n  /** Whether the target differs from where the motion started. */\n  moved: boolean\n  /**\n   * Whether the motion could not do what it was asked.\n   *\n   * Not the same as `!moved`, and the difference is the whole point: `0` in\n   * column 1 and `$` at the end of a line *succeed* and go nowhere, while `l` at\n   * the end of a line and `j` on the last line *fail*. Only a failure stops a\n   * macro, so a rule of \"the cursor did not move, so stop\" ends any macro that\n   * begins by going to the start of the line — which is most of them.\n   */\n  failed: boolean\n  /** The column `j`/`k` want to keep. Null clears it — every other motion does. */\n  goal: number | null\n}\n\n/**\n * The motions that fail when they cannot move.\n *\n * They ask to go somewhere *relative* — a character, a line, a word, a block\n * onwards — so an edge that stops them is a refusal. Everything else names a\n * place (`0`, `$`, `G`, a mark, a match); arriving at a place you were already\n * standing in is not a failure, and a motion that cannot find its place at all\n * returns null instead.\n */\nconst RELATIVE = new Set<MotionSpec['kind']>([\n  'left',\n  'right',\n  'down',\n  'up',\n  'wordForward',\n  'wordBack',\n  'wordEnd',\n  'wordEndBack',\n  'blockForward',\n  'blockBack',\n])\n\nexport interface MotionContext {\n  operator?: OperatorKind | null\n  goal?: number | null\n  /** `m{a-z}` positions, for the mark motions. */\n  marks?: Record<string, number>\n  /** Where the last jump-class motion started, for `` `` `` and `''`. */\n  lastJump?: number | null\n  /** The pattern in effect, for `n` and `N`. */\n  search?: SearchState | null\n  /** The last `f`/`F`/`t`/`T`, for `;` and `,`. */\n  lastFind?: FindTarget | null\n}\n\n/** `w`: the start of the next word. An empty line counts as a word. */\nfunction wordForward(scan: Scan, big: boolean): void {\n  const startLine = scan.line\n  const cls = scan.classHere(big)\n  if (cls === 'word' || cls === 'punct') {\n    while (scan.classHere(big) === cls) {\n      if (!scan.forward()) {\n        return\n      }\n    }\n  } else if (cls === 'eol' && !scan.forward()) {\n    return\n  }\n  for (;;) {\n    const here = scan.classHere(big)\n    if (here === 'word' || here === 'punct') {\n      return\n    }\n    if (here === 'eol' && scan.line !== startLine && scan.line.text.length === 0) {\n      return\n    }\n    if (!scan.forward()) {\n      return\n    }\n  }\n}\n\n/** `b`: the start of the previous word. */\nfunction wordBack(scan: Scan, big: boolean): void {\n  const startLine = scan.line\n  if (!scan.backward()) {\n    return\n  }\n  for (;;) {\n    const here = scan.classHere(big)\n    if (here === 'eol' && scan.line !== startLine && scan.line.text.length === 0) {\n      return\n    }\n    if (here !== 'blank' && here !== 'eol') {\n      break\n    }\n    if (!scan.backward()) {\n      return\n    }\n  }\n  toRunStart(scan, big)\n}\n\n/** `e`: the last character of the next word. */\nfunction wordEnd(scan: Scan, big: boolean): void {\n  if (!scan.forward()) {\n    return\n  }\n  while (isBlankish(scan)) {\n    if (!scan.forward()) {\n      return\n    }\n  }\n  toRunEnd(scan, big)\n}\n\n/** `ge`: the last character of the previous word. Inclusive under an operator. */\nfunction wordEndBack(scan: Scan, big: boolean): void {\n  // Off the current run first, or `ge` from inside a word would find its own end.\n  toRunStart(scan, big)\n  if (!scan.backward()) {\n    return\n  }\n  while (isBlankish(scan)) {\n    if (!scan.backward()) {\n      return\n    }\n  }\n}\n\n/**\n * The `cw` special case: on a non-blank, `cw` acts like `ce`, so `cw` on a word\n * changes the word rather than swallowing the space after it. Unlike `e` it does\n * not step forward first, or `cw` on a one-character word would eat the next.\n */\nfunction changeWordEnd(scan: Scan, count: number, big: boolean): void {\n  for (let at = 0; at < count; at++) {\n    if (at > 0 && !scan.forward()) {\n      return\n    }\n    while (isBlankish(scan)) {\n      if (!scan.forward()) {\n        return\n      }\n    }\n    toRunEnd(scan, big)\n  }\n}\n\nfunction repeat(\n  scan: Scan,\n  count: number,\n  big: boolean,\n  step: (scan: Scan, big: boolean) => void,\n): void {\n  for (let at = 0; at < count; at++) {\n    step(scan, big)\n  }\n}\n\n/**\n * `f`, `F`, `t` and `T`, on the cursor's line and nowhere else.\n *\n * Returns the offset to land on, or null when the character is not there — in\n * which case the command does nothing, including under an operator. Vim's rule\n * for `t` is the interesting one: it stops one short, which means a naive `;`\n * would find the same place again and go nowhere. `skip` is what modern Vim does\n * instead — start one further along — and it is why `t;` advances.\n */\nfunction findOnLine(\n  text: string,\n  offset: number,\n  find: FindTarget,\n  count: number,\n  skip: boolean,\n): number | null {\n  const forward = find.kind === 'f' || find.kind === 't'\n  const till = find.kind === 't' || find.kind === 'T'\n  let at = offset\n  if (skip && till) {\n    at += forward ? 1 : -1\n  }\n\n  for (let step = 0; step < count; step++) {\n    at += forward ? 1 : -1\n    while (at >= 0 && at < text.length && text[at] !== find.char) {\n      at += forward ? 1 : -1\n    }\n    if (at < 0 || at >= text.length) {\n      return null\n    }\n  }\n  return till ? at + (forward ? -1 : 1) : at\n}\n\n/** The first text position inside the document's `index`th top-level block. */\nfunction topBlockStart(doc: PMNode, index: number): number | null {\n  if (index < 0 || index >= doc.childCount) {\n    return null\n  }\n  let pos = 0\n  for (let at = 0; at < index; at++) {\n    pos += doc.child(at).nodeSize\n  }\n  // Not `firstTextblockIn`: a top-level block with no textblock in it at all (a\n  // horizontal rule) should hand the search on to the next one.\n  const found = nextTextblock(doc, pos)\n  return found ? found.pos + 1 : null\n}\n\nfunction topBlockIndex(doc: PMNode, pos: number): number {\n  const $pos = doc.resolve(Math.max(0, Math.min(pos, doc.content.size)))\n  return $pos.depth === 0 ? 0 : $pos.index(0)\n}\n\n/**\n * `}`: the start of the next top-level block.\n *\n * Vim lands on the blank line between paragraphs; Markdown's blank lines *are*\n * the boundaries between top-level blocks, so this is the same idea expressed in\n * the model we actually have. A whole list or table counts as one paragraph,\n * which is what Vim does with a list that has no blank lines in it.\n */\nfunction blockForwardTarget(doc: PMNode, head: number): number | null {\n  const index = topBlockIndex(doc, head)\n  for (let at = index + 1; at < doc.childCount; at++) {\n    const start = topBlockStart(doc, at)\n    if (start !== null && start > head) {\n      return start\n    }\n  }\n  return null\n}\n\nfunction blockBackTarget(doc: PMNode, head: number): number | null {\n  const index = topBlockIndex(doc, head)\n  const start = topBlockStart(doc, index)\n  if (start !== null && head > start) {\n    return start\n  }\n  for (let at = index - 1; at >= 0; at--) {\n    const previous = topBlockStart(doc, at)\n    if (previous !== null && previous < head) {\n      return previous\n    }\n  }\n  return null\n}\n\n/** Walk `count` lines in one direction, stopping at the document's edge. */\nfunction lineStep(doc: PMNode, line: Line, count: number, down: boolean): Line {\n  let current = line\n  for (let at = 0; at < count; at++) {\n    const next = down ? nextLine(doc, current) : prevLine(doc, current)\n    if (!next) {\n      // Vim beeps and refuses when the count overshoots. Clamping is friendlier\n      // in an editor with no status line to beep into, and is a documented\n      // divergence: `999j` goes to the last line rather than doing nothing.\n      return current\n    }\n    current = next\n  }\n  return current\n}\n\nfunction charwise(head: number, target: number, goal: number | null = null): MotionResult {\n  const from = Math.min(head, target)\n  const to = Math.max(head, target)\n  return { target, wise: 'char', from, to, moved: target !== head, failed: false, goal }\n}\n\nfunction inclusive(head: number, target: number): MotionResult {\n  const from = Math.min(head, target)\n  const to = Math.max(head, target) + 1\n  return { target, wise: 'char', from, to, moved: target !== head, failed: false, goal: null }\n}\n\nfunction linewise(head: number, target: number, goal: number | null = null): MotionResult {\n  return {\n    target,\n    wise: 'line',\n    from: Math.min(head, target),\n    to: Math.max(head, target),\n    moved: target !== head,\n    failed: false,\n    goal,\n  }\n}\n\n/**\n * Vim's two exclusive-motion adjustments (`:h exclusive`), which are the whole\n * reason `dw` on the last word of a line does not pull the next line up:\n *\n *   1. an exclusive motion ending in column 1 ends at the end of the previous\n *      line instead;\n *   2. if it also started at or before the first non-blank, it becomes linewise.\n */\nfunction adjustExclusive(doc: PMNode, result: MotionResult): MotionResult {\n  const endLine = lineAt(doc, result.to)\n  const startLine = lineAt(doc, result.from)\n  if (!endLine || !startLine || endLine.from !== result.to || endLine.from === startLine.from) {\n    return result\n  }\n  const previous = prevLine(doc, endLine)\n  if (!previous) {\n    return result\n  }\n  const pulled: MotionResult = { ...result, to: previous.to }\n  if (result.from <= firstNonBlank(startLine)) {\n    return { ...pulled, wise: 'line' }\n  }\n  return pulled\n}\n\n/**\n * Where a motion goes, and what an operator in front of it covers.\n *\n * Null means the document has no line to move within, which only happens for a\n * document made entirely of leaf blocks. Callers treat it as a no-op.\n */\n/**\n * Where a motion goes, and what an operator in front of it covers.\n *\n * Null means the motion had nowhere to go at all — an unset mark, a character\n * that is not on the line, a pattern with no match — which every caller reads as\n * a failure. A result whose `failed` is set is the other kind: it had somewhere\n * to go and could not get there.\n */\nexport function resolveMotion(\n  doc: PMNode,\n  head: number,\n  motion: CountedMotion,\n  context: MotionContext = {},\n): MotionResult | null {\n  const result = resolveTarget(doc, head, motion, context)\n  if (!result) {\n    return null\n  }\n  return { ...result, failed: RELATIVE.has(motion.spec.kind) && !result.moved }\n}\n\nfunction resolveTarget(\n  doc: PMNode,\n  head: number,\n  motion: CountedMotion,\n  context: MotionContext = {},\n): MotionResult | null {\n  const line = lineAt(doc, head)\n  if (!line) {\n    return null\n  }\n  const { count, countGiven } = motion\n  const operator = context.operator ?? null\n  const big = motion.spec.big ?? false\n\n  switch (motion.spec.kind) {\n    case 'left':\n      return charwise(head, Math.max(head - count, line.from))\n\n    case 'right':\n      // The raw end of the line, not the NORMAL clamp: `x` at the last character\n      // has to be able to delete it, and the clamp happens after the move.\n      return charwise(head, Math.min(head + count, line.to))\n\n    case 'down':\n    case 'up': {\n      const down = motion.spec.kind === 'down'\n      const goal = context.goal ?? head - line.from\n      const target = lineStep(doc, line, count, down)\n      if (target.from === line.from) {\n        return { ...linewise(head, head, goal), moved: false }\n      }\n      const landing = Math.min(target.from + goal, clampToLine(target))\n      return linewise(head, landing, goal)\n    }\n\n    case 'wordForward': {\n      const scan = Scan.at(doc, head)\n      if (!scan) {\n        return null\n      }\n      const here = scan.classHere()\n      if (operator === 'c' && (here === 'word' || here === 'punct')) {\n        changeWordEnd(scan, count, big)\n        return inclusive(head, scan.pos())\n      }\n      repeat(scan, count, big, wordForward)\n      const result = charwise(head, scan.pos())\n      return operator ? adjustExclusive(doc, result) : result\n    }\n\n    case 'wordBack': {\n      const scan = Scan.at(doc, head)\n      if (!scan) {\n        return null\n      }\n      repeat(scan, count, big, wordBack)\n      const result = charwise(head, scan.pos())\n      return operator ? adjustExclusive(doc, result) : result\n    }\n\n    case 'wordEnd': {\n      const scan = Scan.at(doc, head)\n      if (!scan) {\n        return null\n      }\n      repeat(scan, count, big, wordEnd)\n      const target = scan.pos()\n      return operator ? inclusive(head, target) : charwise(head, target)\n    }\n\n    case 'wordEndBack': {\n      const scan = Scan.at(doc, head)\n      if (!scan) {\n        return null\n      }\n      repeat(scan, count, big, wordEndBack)\n      const target = scan.pos()\n      // Inclusive, like `e`: `dge` takes the character it lands on with it.\n      return operator ? inclusive(target, head) : charwise(head, target)\n    }\n\n    case 'lineStart':\n      return charwise(head, line.from)\n\n    case 'lineFirstNonBlank':\n      return charwise(head, firstNonBlank(line))\n\n    case 'lastNonBlank': {\n      // `g_`: the last non-blank, where `$` is the last character whatever it is.\n      let at = line.text.length - 1\n      while (at > 0 && isBlankChar(line.text[at])) {\n        at -= 1\n      }\n      const target = line.from + Math.max(0, at)\n      return operator ? inclusive(head, target) : charwise(head, target)\n    }\n\n    case 'lineEnd': {\n      // `2$` is the end of the *next* line, so a count walks first.\n      const target = count > 1 ? lineStep(doc, line, count - 1, true) : line\n      return operator\n        ? {\n            target: clampToLine(target),\n            wise: 'char',\n            from: head,\n            to: target.to,\n            moved: true,\n            failed: false,\n            goal: null,\n          }\n        : charwise(head, clampToLine(target))\n    }\n\n    case 'documentStart': {\n      const target = countGiven ? nthLine(doc, count) : lineAt(doc, 0)\n      return target ? linewise(head, firstNonBlank(target)) : null\n    }\n\n    case 'documentEnd': {\n      const target = countGiven ? nthLine(doc, count) : lineAt(doc, doc.content.size)\n      return target ? linewise(head, firstNonBlank(target)) : null\n    }\n\n    case 'markExact':\n    case 'markLine': {\n      const name = motion.spec.mark\n      if (!name) {\n        return null\n      }\n      // `` ` `` and `'` name the position the last jump started from, which is\n      // how `''` gets you back after a `G` you did not mean.\n      const raw =\n        name === '`' || name === \"'\" ? (context.lastJump ?? null) : (context.marks?.[name] ?? null)\n      if (raw === null) {\n        return null\n      }\n      const at = Math.max(0, Math.min(raw, doc.content.size))\n      const target = lineAt(doc, at)\n      if (!target) {\n        return null\n      }\n      // Exact under a backtick, first-non-blank and linewise under a quote —\n      // the same split Vim makes, and the reason `d'a` takes whole lines.\n      return motion.spec.kind === 'markExact'\n        ? charwise(head, Math.min(at, clampToLine(target)))\n        : linewise(head, firstNonBlank(target))\n    }\n\n    case 'searchNext':\n    case 'searchPrev': {\n      const search = context.search\n      if (!search) {\n        return null\n      }\n      // Re-scanned rather than read off the highlight: the document may have\n      // moved on since, and `n` landing on a match that is no longer there is\n      // worse than the scan is slow.\n      const matches = findMatches(doc, search.spec)\n      const forward = motion.spec.kind === 'searchNext' ? search.direction : -search.direction\n      let target = head\n      for (let at = 0; at < count; at++) {\n        const found = matchFrom(matches, target, forward as 1 | -1)\n        if (!found) {\n          return null\n        }\n        target = found.from\n      }\n      // Exclusive under an operator, as a search motion is in Vim: `d/foo`\n      // deletes up to the match and leaves it.\n      return charwise(head, target)\n    }\n\n    case 'findChar':\n    case 'repeatFind': {\n      const find = motion.spec.kind === 'findChar' ? motion.spec.find : context.lastFind\n      if (!find) {\n        return null\n      }\n      // `,` is `;` the other way, so the stored find is mirrored rather than a\n      // second thing to remember.\n      const mirrored: FindTarget =\n        motion.spec.kind === 'repeatFind' && motion.spec.reverse\n          ? { ...find, kind: MIRROR[find.kind] }\n          : find\n      const at = findOnLine(\n        line.text,\n        head - line.from,\n        mirrored,\n        count,\n        motion.spec.kind === 'repeatFind',\n      )\n      if (at === null) {\n        return null\n      }\n      const target = line.from + at\n      // `f` and `t` are inclusive under an operator; `F` and `T` are exclusive,\n      // like every other backward motion.\n      const forward = mirrored.kind === 'f' || mirrored.kind === 't'\n      return operator && forward ? inclusive(head, target) : charwise(head, target)\n    }\n\n    case 'matchPair': {\n      const target = matchingBracket(doc, head)\n      if (target === null) {\n        return null\n      }\n      // Inclusive: `d%` takes both brackets and everything between them.\n      return operator ? inclusive(head, target) : charwise(head, target)\n    }\n\n    case 'blockForward': {\n      let target: number | null = head\n      for (let at = 0; at < count; at++) {\n        const next = blockForwardTarget(doc, target)\n        if (next === null) {\n          const last = lineAt(doc, doc.content.size)\n          target = last ? last.to : target\n          break\n        }\n        target = next\n      }\n      const result = charwise(head, target)\n      return operator ? adjustExclusive(doc, result) : result\n    }\n\n    case 'blockBack': {\n      let target = head\n      for (let at = 0; at < count; at++) {\n        const previous = blockBackTarget(doc, target)\n        if (previous === null) {\n          const first = lineAt(doc, 0)\n          target = first ? first.from : target\n          break\n        }\n        target = previous\n      }\n      const result = charwise(head, target)\n      return operator ? adjustExclusive(doc, result) : result\n    }\n  }\n}\n","/**\n * Registers.\n *\n * A register holds a ProseMirror `Slice`, not Markdown and not a string. Yanking\n * a heading and putting it back has to produce a heading, and round-tripping\n * through the serializer on every `yy` would be both slow and lossy — the model\n * is the truth, so the model is what gets stored.\n *\n * The naming rules are Vim's, and they are mostly about what happens when you do\n * *not* name one:\n *\n *   - the unnamed register always gets the last yank or delete;\n *   - a yank also fills `\"0`, so an intervening delete cannot lose it — the\n *     reason `yyjjdd\"0p` works;\n *   - a linewise delete shifts the ring `\"1`…`\"9`, so the last nine deleted\n *     lines are still reachable;\n *   - `\"_` is the black hole: it swallows writes and reads back nothing;\n *   - an uppercase name appends to the lowercase one.\n *\n * Two simplifications, both deliberate. Charwise deletes go to the unnamed\n * register only — Vim also rings multi-line ones — and the small-delete register\n * `\"-` does not exist. Both are noted in the compatibility table.\n */\n\nimport { Slice } from '@tiptap/pm/model'\n\nexport interface RegisterEntry {\n  slice: Slice\n  /** Whole lines, so `p` puts them below rather than beside the cursor. */\n  linewise: boolean\n  /**\n   * The list the lines were items of, when they were items. Lets `p` put them\n   * back as siblings in a list of the same kind instead of as a nested one.\n   */\n  listContext?: string\n}\n\nexport type RegisterSource = 'yank' | 'delete'\n\n/**\n * The system clipboard, supplied by the extension so the engine stays portable.\n *\n * Reading is asynchronous and always will be — the browser may prompt — which is\n * why `\"+p` is the one command in this engine that cannot dispatch synchronously.\n */\nexport interface ClipboardBridge {\n  write: (entry: RegisterEntry) => void\n  read: () => Promise<RegisterEntry | null>\n}\n\nconst UNNAMED = '\"'\nconst BLACK_HOLE = '_'\nconst YANK = '0'\n/** `+` and `*` are one slot here: a browser has one clipboard. */\nconst CLIPBOARD = new Set(['+', '*'])\n\nconst LOWERCASE = /^[a-z]$/\nconst UPPERCASE = /^[A-Z]$/\nconst NUMBERED = /^[0-9]$/\n\n/** Which slot a name refers to. Null for names with no register behind them. */\nfunction slotFor(name: string): string | null {\n  if (LOWERCASE.test(name) || NUMBERED.test(name)) {\n    return name\n  }\n  if (UPPERCASE.test(name)) {\n    // `\"A` and `\"a` are the same register; the case only decides append vs set.\n    return name.toLowerCase()\n  }\n  if (CLIPBOARD.has(name)) {\n    return '+'\n  }\n  return name === UNNAMED ? UNNAMED : null\n}\n\nexport class RegisterFile {\n  private readonly slots = new Map<string, RegisterEntry>()\n  private clipboard: ClipboardBridge | null = null\n\n  /** Called once by the extension, which is the layer that may touch the DOM. */\n  useClipboard(bridge: ClipboardBridge | null): void {\n    this.clipboard = bridge\n  }\n\n  /** Whether a name means the system clipboard rather than a slot of our own. */\n  static isClipboard(name: string | null | undefined): boolean {\n    return name !== null && name !== undefined && CLIPBOARD.has(name)\n  }\n\n  /**\n   * The system clipboard's current contents, or null when it cannot be read —\n   * no bridge, no permission, an insecure origin. Never throws: a denied read\n   * falls back to the slot we last wrote, and `\"+p` still puts something.\n   */\n  async readClipboard(): Promise<RegisterEntry | null> {\n    if (!this.clipboard) {\n      return null\n    }\n    try {\n      return await this.clipboard.read()\n    } catch {\n      return null\n    }\n  }\n\n  read(name?: string | null): RegisterEntry | null {\n    if (name === BLACK_HOLE) {\n      return null\n    }\n    const slot = name ? slotFor(name) : UNNAMED\n    return slot ? (this.slots.get(slot) ?? null) : null\n  }\n\n  write(name: string | null | undefined, entry: RegisterEntry, source: RegisterSource): void {\n    if (name === BLACK_HOLE) {\n      // The whole point of the black hole: `\"_dd` deletes without disturbing\n      // whatever you were carrying.\n      return\n    }\n\n    if (name && CLIPBOARD.has(name)) {\n      this.slots.set('+', entry)\n      // Fire and forget. A clipboard write that fails is worth a warning and\n      // nothing more — the register still holds the text.\n      this.clipboard?.write(entry)\n      return\n    }\n\n    if (name && UPPERCASE.test(name)) {\n      const slot = name.toLowerCase()\n      const appended = append(this.slots.get(slot) ?? null, entry)\n      this.slots.set(slot, appended)\n      this.slots.set(UNNAMED, appended)\n      return\n    }\n\n    if (name && LOWERCASE.test(name)) {\n      this.slots.set(name, entry)\n      this.slots.set(UNNAMED, entry)\n      return\n    }\n\n    // Nothing named: the unnamed register, plus whichever history applies.\n    this.slots.set(UNNAMED, entry)\n    if (source === 'yank') {\n      this.slots.set(YANK, entry)\n      return\n    }\n    if (entry.linewise) {\n      this.shiftDeleteRing(entry)\n    }\n  }\n\n  /** `\"1` becomes `\"2`, and so on; the ninth falls off the end. */\n  private shiftDeleteRing(entry: RegisterEntry): void {\n    for (let at = 9; at > 1; at--) {\n      const previous = this.slots.get(String(at - 1))\n      if (previous) {\n        this.slots.set(String(at), previous)\n      } else {\n        this.slots.delete(String(at))\n      }\n    }\n    this.slots.set('1', entry)\n  }\n}\n\n/**\n * `\"Ayy` — appending.\n *\n * Fragments are concatenated and the result is linewise if either half was. That\n * is an approximation: Vim would make a charwise append to a linewise register\n * follow the register's own shape more carefully. It is documented rather than\n * elaborated, because the case is rare and the alternative is a second slicing\n * model nobody would read.\n */\nfunction append(existing: RegisterEntry | null, entry: RegisterEntry): RegisterEntry {\n  if (!existing) {\n    return entry\n  }\n  return {\n    slice: new Slice(\n      existing.slice.content.append(entry.slice.content),\n      existing.slice.openStart,\n      entry.slice.openEnd,\n    ),\n    linewise: existing.linewise || entry.linewise,\n    listContext: existing.listContext ?? entry.listContext,\n  }\n}\n","/**\n * The table safety invariant.\n *\n * Every step this engine dispatches must lie entirely inside one cell, cover\n * whole tables, or touch no table at all. A range that starts in a cell and\n * ends outside it — `d}` from the middle of a table, `dG` from a cell — would\n * otherwise ask ProseMirror to delete half a table structure, and the failure\n * mode is a document that no longer serializes.\n *\n * Clamping rather than refusing is the deliberate choice: the operator still\n * does something recognisable (delete to the end of the cell) instead of\n * silently doing nothing.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\n\nconst CELL_TYPES = new Set(['tableCell', 'tableHeader'])\n\nexport interface Range {\n  from: number\n  to: number\n}\n\n/** The content range of the innermost table cell containing `pos`, if any. */\nexport function cellAround(doc: PMNode, pos: number): Range | null {\n  const $pos = doc.resolve(Math.max(0, Math.min(pos, doc.content.size)))\n  for (let depth = $pos.depth; depth >= 1; depth--) {\n    if (CELL_TYPES.has($pos.node(depth).type.name)) {\n      return { from: $pos.start(depth), to: $pos.end(depth) }\n    }\n  }\n  return null\n}\n\n/** The node range of the innermost table containing `pos`, if any. */\nexport function tableAround(doc: PMNode, pos: number): Range | null {\n  const $pos = doc.resolve(Math.max(0, Math.min(pos, doc.content.size)))\n  for (let depth = $pos.depth; depth >= 1; depth--) {\n    if ($pos.node(depth).type.name === 'table') {\n      return { from: $pos.before(depth), to: $pos.after(depth) }\n    }\n  }\n  return null\n}\n\nexport function insideCell(doc: PMNode, pos: number): boolean {\n  return cellAround(doc, pos) !== null\n}\n\n/**\n * Pull an operator range back to something safe to dispatch.\n *\n * Null means \"nothing is left of it\" — the operator becomes a no-op rather than\n * doing something arbitrary at the edge of a table.\n */\nexport function clampOperatorRange(doc: PMNode, from: number, to: number): Range | null {\n  if (to <= from) {\n    return null\n  }\n  const start = cellAround(doc, from)\n  const end = cellAround(doc, to)\n\n  // Both endpoints in the same cell: ordinary editing, nothing to do.\n  if (start && end && start.from === end.from) {\n    return { from, to }\n  }\n  if (start) {\n    const clamped = Math.min(to, start.to)\n    return clamped > from ? { from, to: clamped } : null\n  }\n  if (end) {\n    // The range reaches into a table it did not start in: stop before the table\n    // rather than cut a row in half.\n    const table = tableAround(doc, to)\n    const clamped = table ? Math.min(to, table.from) : to\n    return clamped > from ? { from, to: clamped } : null\n  }\n  // Neither end is in a cell. Any table between them is covered whole.\n  return { from, to }\n}\n","/**\n * The scroll commands: `Ctrl-E`, `Ctrl-Y`, `Ctrl-D`, `Ctrl-U`, `Ctrl-F`, `Ctrl-B`.\n *\n * This is the one module in the engine that touches the browser's layout, and\n * the line between what it may and may not do is worth stating plainly.\n *\n * **These are viewport side effects, not motions.** They move the page, not the\n * cursor. They take no part in operator ranges, logical lines, marks, `.`, or\n * motion resolution, and nothing here ever produces a ProseMirror position. That\n * is why reading a line height and a window height is allowed while the rest of\n * the engine measures nothing: scrolling *is* a rendering concern, so the\n * numbers here decide how far the page moves and nothing else.\n *\n * **Documented divergence.** Terminal Vim drags the cursor along when scrolling\n * would push it off the screen. Pasty does not: the cursor stays where it is and\n * only the viewport moves. Doing otherwise would mean asking the browser which\n * document position is at some pixel — exactly the dependency this engine is\n * built without.\n */\n\nimport type { EditorView } from '@tiptap/pm/view'\n\nimport type { ScrollUnit } from './types'\n\n/** When the browser will not say (jsdom, `line-height: normal`): body text, near enough. */\nconst DEFAULT_LINE_HEIGHT = 28\n\nexport interface ViewportMetrics {\n  /** One text line, in pixels. */\n  line: number\n  /** The height of whatever is doing the scrolling. */\n  height: number\n}\n\n/**\n * How far to move, in pixels.\n *\n * Pure, so the arithmetic is a table test rather than a browser test. Vim's own\n * proportions: a line is a line, `Ctrl-D` is half a screen, and `Ctrl-F` is a\n * screen less two lines of overlap so the eye has something to land on.\n */\nexport function scrollDistance(unit: ScrollUnit, count: number, metrics: ViewportMetrics): number {\n  const line = metrics.line > 0 ? metrics.line : DEFAULT_LINE_HEIGHT\n  const steps = Math.max(1, count)\n  if (unit === 'line') {\n    return line * steps\n  }\n  if (unit === 'half') {\n    return Math.max(line, metrics.height / 2) * steps\n  }\n  return Math.max(line, metrics.height - line * 2) * steps\n}\n\n/**\n * Whatever actually scrolls when the document is taller than the window.\n *\n * Today that is the window — the editor page has no inner scroller — but a\n * layout change should not silently turn these commands into no-ops, so the\n * ancestors are walked rather than assumed.\n */\nfunction scrollerFor(view: EditorView): HTMLElement | null {\n  let node = view.dom.parentElement\n  while (node && node !== document.body) {\n    const style = window.getComputedStyle(node)\n    if (/(auto|scroll|overlay)/.test(style.overflowY) && node.scrollHeight > node.clientHeight) {\n      return node\n    }\n    node = node.parentElement\n  }\n  return null\n}\n\nfunction metricsFor(view: EditorView, scroller: HTMLElement | null): ViewportMetrics {\n  const line = Number.parseFloat(window.getComputedStyle(view.dom).lineHeight)\n  return {\n    line: Number.isFinite(line) ? line : DEFAULT_LINE_HEIGHT,\n    height: scroller ? scroller.clientHeight : window.innerHeight,\n  }\n}\n\n/**\n * Move the page.\n *\n * Wrapped, because this runs from a keystroke: a browser that refuses to scroll\n * (or a jsdom that has no viewport to scroll) must not turn `Ctrl-E` into an\n * error, and there is nothing to recover from beyond not having scrolled.\n */\nexport function scrollViewport(\n  view: EditorView,\n  action: { unit: ScrollUnit; direction: 1 | -1; count: number },\n): void {\n  try {\n    const scroller = scrollerFor(view)\n    const top = scrollDistance(action.unit, action.count, metricsFor(view, scroller)) * action.direction\n    if (scroller) {\n      scroller.scrollBy({ top, behavior: 'auto' })\n      return\n    }\n    window.scrollBy({ top, behavior: 'auto' })\n  } catch {\n    /* no viewport to move; the document is untouched either way */\n  }\n}\n","/**\n * The ex command line: what `:` accepts.\n *\n * Deliberately, aggressively narrow. Eight spellings are understood —\n * `:s/pat/repl/`, `:s/pat/repl/g`, the same two with a `%` range,\n * `:noh`/`:nohlsearch`, and `:w`/`:w!` — and **everything else is refused out\n * loud** rather than partially implemented. `:q` in a browser tab, `:e` with no\n * filesystem: each of those has an obvious wrong answer, and a command line that\n * half-works is worse than one that says what it does not do.\n *\n * `:w` is the exception that proves it. It is not a second way to save — it\n * flushes the save Pasty is already doing and reports what actually happened —\n * so it is a real command rather than a reassuring lie.\n *\n * The narrowness is also what stops the *ex line* growing a language of its own.\n * Patterns here are compiled by `vim/pattern.ts`, exactly as `/` and `n` compile\n * theirs — Vim-style, a common subset of magic mode, one matcher and one story —\n * and the parser has no place to put a flag that would change that.\n *\n * Pure: a string in, a description out. The document is somebody else's problem.\n */\n\nexport type ExCommand =\n  | {\n      kind: 'substitute'\n      pattern: string\n      replacement: string\n      /** The `g` flag: every match on a line rather than the first. */\n      all: boolean\n      /** The `%` range: the whole document rather than the current line. */\n      whole: boolean\n    }\n  | { kind: 'nohlsearch' }\n  /**\n   * `:w` and `:w!`.\n   *\n   * Pasty saves continuously, so this is an alias for \"flush now\" rather than a\n   * new way to persist anything — and the `!` is accepted only because fingers\n   * type it, not because it forces anything. `:w foo`, `:wa`, `:wq` and `:x` all\n   * mean things Pasty does not have (a filename, several buffers, quitting) and\n   * stay refused.\n   */\n  | { kind: 'write' }\n  /** Understood well enough to know we do not do it. */\n  | { kind: 'unsupported'; reason: string }\n\nconst NOT_SUPPORTED = 'Not supported in Pasty'\n\n/**\n * Read the fields of a substitution.\n *\n * `/` is the only separator — Vim allows any character, which is a nicety for\n * patterns full of slashes and a foot-gun everywhere else. `\\/` is an escaped\n * separator and becomes a literal slash; every other backslash is passed through\n * untouched, because the pattern compiler and the replacement expander are the\n * ones that know what a backslash means.\n *\n * The trailing separator is optional, as it is in Vim: `:s/foo/bar` is fine.\n */\nfunction readFields(rest: string): { fields: string[]; flags: string } | null {\n  if (!rest.startsWith('/')) {\n    return null\n  }\n  const fields: string[] = []\n  let current = ''\n  let at = 1\n\n  while (at < rest.length && fields.length < 2) {\n    const character = rest[at]\n    if (character === '\\\\' && rest[at + 1] === '/') {\n      current += '/'\n      at += 2\n      continue\n    }\n    if (character === '/') {\n      fields.push(current)\n      current = ''\n      at += 1\n      continue\n    }\n    current += character\n    at += 1\n  }\n\n  if (fields.length < 2) {\n    // No trailing separator: whatever is left is the replacement.\n    fields.push(current)\n    current = ''\n    at = rest.length\n  }\n  return fields.length === 2 ? { fields, flags: rest.slice(at) } : null\n}\n\nexport function parseEx(input: string): ExCommand {\n  const text = input.trim()\n\n  if (text === 'noh' || text === 'nohlsearch') {\n    return { kind: 'nohlsearch' }\n  }\n\n  if (text === 'w' || text === 'w!') {\n    return { kind: 'write' }\n  }\n\n  const whole = text.startsWith('%')\n  const body = whole ? text.slice(1) : text\n  if (!body.startsWith('s')) {\n    return { kind: 'unsupported', reason: NOT_SUPPORTED }\n  }\n\n  const read = readFields(body.slice(1))\n  if (!read) {\n    return { kind: 'unsupported', reason: NOT_SUPPORTED }\n  }\n  const [pattern, replacement] = read.fields\n  if (pattern === '') {\n    // Vim would reuse the last pattern. Refusing is the honest version until\n    // there is a reason to carry one.\n    return { kind: 'unsupported', reason: 'A pattern is required' }\n  }\n  // `g` or nothing. `i`, `c`, `e` and the rest each imply behaviour that is not\n  // here, and accepting them silently would be a lie.\n  if (read.flags !== '' && read.flags !== 'g') {\n    return { kind: 'unsupported', reason: NOT_SUPPORTED }\n  }\n\n  return { kind: 'substitute', pattern, replacement, all: read.flags === 'g', whole }\n}\n","/**\n * The plugin key, alone in its own module.\n *\n * `plugin.ts` owns the plugin and `operators.ts` owns execution, and both need\n * to read and stamp the engine's state. Importing the key from either would make\n * them import each other, so it lives here — the one thing they share.\n */\n\nimport { PluginKey } from '@tiptap/pm/state'\n\nimport type { VimState } from './types'\n\nexport const vimPluginKey = new PluginKey<VimState>('pastyVim')\n\n/** The engine's state, or null in an editor that has no Vim plugin installed. */\nexport function vimStateOf(state: { plugins?: unknown }): VimState | null {\n  return vimPluginKey.getState(state as never) ?? null\n}\n","/**\n * The vocabulary the engine is written in.\n *\n * Everything here is data: modes, the pending-input record the grammar\n * accumulates, and the `Action` the grammar emits once an input is complete.\n * `keys.ts` produces Actions and knows nothing about ProseMirror; `operators.ts`\n * consumes them and is the only module allowed to dispatch. Keeping the seam at\n * a plain object is what makes the grammar table-testable without an editor.\n */\n\nimport type { Slice } from '@tiptap/pm/model'\nimport type { DecorationSet } from '@tiptap/pm/view'\n\nimport type { SearchSpec } from './search'\n\nexport type VimMode = 'normal' | 'insert' | 'visual' | 'visualLine' | 'command'\n\n/**\n * An operator waits for a motion, a text object, or a repeat of itself.\n *\n * `>` and `<` ride the same machinery as `d`, `c` and `y` and are always\n * linewise however they were addressed — `>iw` shifts the line the word is on,\n * because indentation is a property of lines and nothing else.\n */\nexport type OperatorKind = 'd' | 'c' | 'y' | '>' | '<'\n\n/** What a motion means. Resolved against the document by `motions.ts`. */\nexport type MotionKind =\n  | 'left'\n  | 'right'\n  | 'down'\n  | 'up'\n  | 'wordForward'\n  | 'wordBack'\n  | 'wordEnd'\n  | 'wordEndBack'\n  | 'lineStart'\n  | 'lineFirstNonBlank'\n  | 'lineEnd'\n  | 'lastNonBlank'\n  | 'documentStart'\n  | 'documentEnd'\n  | 'blockForward'\n  | 'blockBack'\n  | 'markExact'\n  | 'markLine'\n  | 'searchNext'\n  | 'searchPrev'\n  | 'findChar'\n  | 'repeatFind'\n  | 'matchPair'\n\n/**\n * How far a scroll command moves the page.\n *\n * A viewport unit, deliberately not a document one: these commands never resolve\n * to a position, which is why they can measure pixels when nothing else may.\n */\nexport type ScrollUnit = 'line' | 'half' | 'page'\n\n/** `f` and `t` go forward; `F` and `T` go back; `t` and `T` stop one short. */\nexport type FindKind = 'f' | 'F' | 't' | 'T'\n\nexport interface FindTarget {\n  kind: FindKind\n  char: string\n}\n\nexport interface MotionSpec {\n  kind: MotionKind\n  /** WORD rather than word: runs delimited by whitespace alone. */\n  big?: boolean\n  /** Which mark, for `markExact` and `markLine`. */\n  mark?: string\n  /** What to find, for `findChar`. */\n  find?: FindTarget\n  /** `,` rather than `;`: repeat the last find the other way. */\n  reverse?: boolean\n}\n\n/** A motion together with the count that was typed for it. */\nexport interface CountedMotion {\n  spec: MotionSpec\n  count: number\n  /** Whether the user actually typed a count — `G` and `1G` differ. */\n  countGiven: boolean\n}\n\n/** Why a key is being held for the next one. */\nexport type CharReason =\n  | 'r'\n  | 'setMark'\n  | 'markExact'\n  | 'markLine'\n  | 'register'\n  | 'find'\n  | 'macroRecord'\n  | 'macroPlay'\n\n/**\n * \"This thing the cursor is in\", rather than \"from here to there\".\n *\n * Words and quotes are scoped to the logical line; brackets to the block, or to\n * the whole code block inside code, where multi-line pairs are ordinary.\n */\nexport type TextObjectSpec =\n  | { kind: 'word'; big: boolean; around: boolean }\n  | { kind: 'quote'; quote: string; around: boolean }\n  | { kind: 'pair'; open: string; around: boolean }\n\n/**\n * A key that starts a multi-key command and is waiting for its second half.\n * `null` means the grammar is between commands.\n */\nexport type Awaiting =\n  | { kind: 'g' }\n  | { kind: 'char'; reason: CharReason; find?: FindKind }\n  /** `i` or `a`, waiting for which object. Only ever set with something to apply it to. */\n  | { kind: 'textobject'; around: boolean }\n\nexport interface PendingInput {\n  /** The count being typed right now (after an operator, if there is one). */\n  count: number | null\n  /** The count typed before the operator, banked when the operator arrived. */\n  opCount: number | null\n  operator: OperatorKind | null\n  awaiting: Awaiting | null\n  /**\n   * The register named by a `\"x` prefix. Survives the rest of the command —\n   * Vim's order is `[\"x][count]operator[count]motion`, so the name arrives long\n   * before the command it belongs to is complete.\n   */\n  register: string | null\n}\n\nexport const EMPTY_PENDING: PendingInput = {\n  count: null,\n  opCount: null,\n  operator: null,\n  awaiting: null,\n  register: null,\n}\n\n/**\n * The search in effect.\n *\n * The highlight is a live `DecorationSet` rather than a list of positions: it is\n * *mapped* through every change rather than recomputed, so typing next to a\n * match costs nothing and the highlights follow the text they are on. `stale`\n * records that the document has moved on since the matches were found, which is\n * why `n` re-scans rather than trusting them.\n */\nexport interface SearchState {\n  spec: SearchSpec\n  direction: 1 | -1\n  highlight: DecorationSet | null\n  stale: boolean\n}\n\n/** A remembered visual selection, so `gv` can put it back. */\nexport interface VisualSpan {\n  anchor: number\n  head: number\n  line: boolean\n}\n\nexport interface VimState {\n  enabled: boolean\n  mode: VimMode\n  pending: PendingInput\n  /** Where VISUAL started. Null outside the visual modes. */\n  visualAnchor: number | null\n  /**\n   * The character the visual cursor sits on. Tracked apart from the rendered\n   * selection because Vim's visual range *includes* that character — so the\n   * ProseMirror head is one position past it — and Visual Line renders whole\n   * lines, which say nothing about where the cursor is.\n   */\n  visualHead: number | null\n  /**\n   * The column `j`/`k` are trying to keep, as a character offset into the\n   * logical line. Captured when a vertical run starts and cleared by anything\n   * else, exactly as Vim's curswant behaves.\n   */\n  goal: number | null\n  /**\n   * `m{a-z}`. Every one of these is a document position, so every one is mapped\n   * through `tr.mapping` on every change — a mark on text that moves follows it,\n   * and a mark on text that is deleted collapses rather than dangling.\n   */\n  marks: Record<string, number>\n  /** Where the cursor was before the last jump-class motion, for `` `` `` and `''`. */\n  lastJump: number | null\n  /** Where INSERT was last left, for `gi`. */\n  lastInsertEnd: number | null\n  /** The last visual selection, for `gv`. */\n  lastVisual: VisualSpan | null\n  /**\n   * The last `f`, `F`, `t` or `T`, for `;` and `,`. A character and a direction,\n   * not a position — so unlike the marks it needs no mapping and cannot go stale.\n   */\n  lastFind: FindTarget | null\n  /**\n   * The macro being recorded right now.\n   *\n   * Plugin state rather than storage, unlike the finished macros: the grammar\n   * has to know whether `q` means \"start\" or \"stop\", and a recording half-made\n   * when Vim is switched off is not worth carrying back.\n   */\n  recording: MacroRecording | null\n  /** The pattern in effect, and what it currently matches. Null before any search. */\n  search: SearchState | null\n  /**\n   * The line-number gutter, rebuilt on every document change rather than mapped:\n   * inserting a line renumbers every line under it, so there is nothing a\n   * mapping could preserve. Null when Vim is off or the document is too long.\n   */\n  gutter: DecorationSet | null\n  /**\n   * What has been typed since INSERT began, as a range.\n   *\n   * Kept only while the typing stays contiguous — one stretch growing from where\n   * insert started. An edit anywhere else (a click mid-word, an autocorrect, a\n   * paste) nulls it, and `.` then repeats the command that entered insert\n   * without the text. That is a documented degradation, never an error.\n   */\n  insertRun: { from: number; to: number } | null\n}\n\n/**\n * The last change, ready to be done again.\n *\n * Semantic, not keystrokes: the resolved `Action` plus whatever was typed if it\n * entered INSERT. Nothing here is a document position, so nothing here has to be\n * mapped — which is what lets `.` survive arbitrary edits in between.\n *\n * `typed` is a slice rather than a string because typing is not always flat: a\n * `<CR>` in the middle of it split a paragraph, and replaying that as text would\n * put the two halves back as one line.\n */\nexport interface RepeatRecord {\n  action: Action\n  typed: Slice | null\n}\n\n/** A completed command. One Action becomes at most one transaction. */\nexport type Action =\n  | { kind: 'motion'; motion: CountedMotion }\n  | { kind: 'operator'; operator: OperatorKind; motion: CountedMotion; register?: string | null }\n  | { kind: 'operatorLines'; operator: OperatorKind; count: number; register?: string | null }\n  | { kind: 'visualOperator'; operator: OperatorKind; register?: string | null }\n  | { kind: 'enterInsert'; where: 'i' | 'a' | 'I' | 'A' | 'gi' }\n  | { kind: 'openLine'; below: boolean }\n  | { kind: 'replaceChar'; char: string; count: number }\n  | { kind: 'toggleCase'; count: number }\n  | { kind: 'join'; count: number }\n  | { kind: 'paste'; after: boolean; count: number; register?: string | null }\n  | { kind: 'undo' }\n  | { kind: 'redo' }\n  | { kind: 'enterVisual'; line: boolean }\n  | { kind: 'exitInsert' }\n  | { kind: 'collapseVisual' }\n  | { kind: 'setMark'; mark: string }\n  | { kind: 'reselectVisual' }\n  | { kind: 'repeat'; count: number | null }\n  | { kind: 'openCmdline'; prefix: ':' | '/' | '?' }\n  | { kind: 'startRecording'; register: string }\n  | { kind: 'stopRecording' }\n  | { kind: 'playMacro'; register: string; count: number }\n  /** `*` and `#`: search for the word under the cursor, bounded. */\n  | { kind: 'searchWord'; direction: 1 | -1 }\n  | {\n      kind: 'operatorObject'\n      operator: OperatorKind\n      object: TextObjectSpec\n      count: number\n      register?: string | null\n    }\n  | { kind: 'visualObject'; object: TextObjectSpec; count: number }\n  /** `Ctrl-E`, `Ctrl-D`, `Ctrl-F` and their opposites: the page moves, the cursor does not. */\n  | { kind: 'scroll'; unit: ScrollUnit; direction: 1 | -1; count: number }\n  /**\n   * A key with a Vim meaning Pasty deliberately does not have.\n   *\n   * Consumed rather than passed on — in a modal mode an unowned chord reaches\n   * the platform's own text bindings — and answered with a message, because\n   * silence is indistinguishable from a bug.\n   */\n  | { kind: 'unsupported'; what: 'visualBlock' }\n\n/**\n * One step of a macro.\n *\n * **Resolved semantics, never keystrokes.** A macro holds the commands that ran,\n * so replaying `dw` re-resolves the motion against wherever the cursor now is —\n * the same reason `.` works. It also means an application shortcut is\n * structurally unrecordable: ⌘K never reaches this engine, so it can never end\n * up in a macro.\n *\n * `mode` is the mode the grammar was left in when the action was emitted, kept\n * so replay does not have to re-derive a transition the reducer already made.\n */\nexport type MacroItem =\n  | { kind: 'action'; action: Action; mode: VimMode }\n  /** What was typed in INSERT, structure and all — see `RepeatRecord.typed`. */\n  | { kind: 'insert'; typed: Slice }\n  | { kind: 'search'; query: string; direction: 1 | -1 }\n\nexport interface MacroRecording {\n  register: string\n  items: MacroItem[]\n}\n\n/** What the mode indicator and the Playwright bridge are allowed to see. */\nexport interface VimStatus {\n  enabled: boolean\n  mode: VimMode\n  /** The register being recorded into, or null. */\n  recording: string | null\n}\n","/**\n * Execution: every `Action` becomes at most one transaction.\n *\n * Three rules hold everywhere in this file.\n *\n * **One transaction per command.** Steps are accumulated on a single `tr` that\n * also carries the engine's next state, so a command either lands whole or does\n * not land at all. There is no window in which the document has been half\n * edited, which is what makes the failure path (`safely`, in `plugin.ts`) safe:\n * an exception means nothing was dispatched.\n *\n * **Ranges are built, then clamped.** `clampOperatorRange` is the last thing\n * between a computed range and a step, so no operator can cut a table in half.\n *\n * **Positions are recomputed from `tr.doc`.** Anything derived from the document\n * before a step is stale afterwards, and stale positions in ProseMirror are how\n * documents get corrupted rather than how commands get wrong.\n */\n\nimport { closeHistory, redo, undo } from '../history'\nimport { Fragment, Slice, type NodeType, type Node as PMNode } from '@tiptap/pm/model'\nimport { liftListItem, sinkListItem } from '@tiptap/pm/schema-list'\nimport { EditorState, TextSelection, type Command, type Transaction } from '@tiptap/pm/state'\nimport { CellSelection } from '@tiptap/pm/tables'\nimport { Decoration, DecorationSet, type EditorView } from '@tiptap/pm/view'\n\nimport type { Line } from './lines'\nimport {\n  ATOM,\n  clampToLine,\n  firstNonBlank,\n  isBlankChar,\n  lineAt,\n  nextLine,\n} from './lines'\nimport { resolveMotion } from './motions'\nimport { RegisterFile, type RegisterEntry } from './registers'\nimport { expandReplacement } from './pattern'\nimport {\n  MATCH_LIMIT,\n  findMatches,\n  matchFrom,\n  matchesInLines,\n  specFor,\n  wholeWordPattern,\n  wordUnderCursor,\n  type Match,\n  type SearchDirection,\n  type SearchSpec,\n} from './search'\nimport { cellAround, clampOperatorRange, insideCell } from './tables'\nimport { scrollViewport } from './viewport'\nimport { resolveTextObject } from './textobjects'\nimport type { CmdlineHost, MessageTone } from './cmdline'\nimport { parseEx } from './exline'\nimport { vimPluginKey } from './key'\nimport type {\n  Action,\n  MacroItem,\n  MotionKind,\n  OperatorKind,\n  RepeatRecord,\n  SearchState,\n  VimState,\n} from './types'\nimport { EMPTY_PENDING } from './types'\n\nconst LIST_TYPES = new Set(['bulletList', 'orderedList', 'taskList'])\nconst ITEM_TYPES = new Set(['listItem', 'taskItem'])\nconst CELL_TYPES = new Set(['tableCell', 'tableHeader'])\n\n/** Guards against a malformed document turning a loop into a hang. */\nconst WALK_LIMIT = 100000\n\n/** Matches `Markdown.indentation` in `editor.ts`, so code shifts by what it serializes as. */\nconst CODE_INDENT = '  '\n\nfunction isIndent(operator: OperatorKind): operator is '>' | '<' {\n  return operator === '>' || operator === '<'\n}\n\n/**\n * Motions that count as a jump.\n *\n * Vim remembers where you were before one of these so `` `` `` can bring you\n * back — the escape hatch for a `G` you did not mean. Ordinary movement inside a\n * line is not a jump and must not overwrite the mark.\n */\nconst JUMPS = new Set<MotionKind>([\n  'documentStart',\n  'documentEnd',\n  'blockForward',\n  'blockBack',\n  'markExact',\n  'markLine',\n  'searchNext',\n  'searchPrev',\n])\n\n/**\n * Whether a command did what it was asked to.\n *\n * Two values rather than three. A motion that goes exactly where it was told and\n * finds it was already there — `0` in column 1, `$` at the end of a line — has\n * *succeeded*; naming that a third outcome only invites the caller to treat it\n * as a failure again. What macro replay needs is this one bit, reported by the\n * command itself rather than inferred from whether the cursor happened to move.\n */\nexport type CommandOutcome = 'ok' | 'failed'\n\n/**\n * The out-channel for that bit.\n *\n * A small mutable box rather than a second return value, because `applyAction`\n * returns the next state from thirty branches and threading a pair through all\n * of them would obscure the ones that matter. The branches that set it are\n * exactly the ones that already say \"there is nothing here to do\".\n */\ninterface Report {\n  failed: boolean\n}\n\nexport interface ExecuteDeps {\n  registers: RegisterFile\n  /** Attach the engine's next state to a transaction and dispatch it. */\n  commit: (tr: Transaction, state: VimState) => void\n  /** The last change, so `.` has something to do again. */\n  repeat: () => RepeatRecord | null\n  setRepeat: (record: RepeatRecord | null) => void\n  /** The command-line bar, when the chrome has registered one. */\n  cmdline: () => CmdlineHost | null\n  /** Append a step to the macro being recorded, if one is. */\n  record: (item: MacroItem) => void\n  /** Keep a finished macro. */\n  saveMacro: (register: string, items: MacroItem[]) => void\n  /** Commit a search. Shared with macro replay so both go through one path. */\n  search: (query: string, direction: SearchDirection) => SearchOutcome\n  /** The application's save pipeline, when the chrome has registered one. */\n  save: () => SaveHook | null\n}\n\n/**\n * What `:w` flushes.\n *\n * Resolves true once the document is *actually* stored. Vim's `:w` reports on\n * the write it performed, and a `Saved` shown before the promise settles would\n * be the one kind of lie an editor may not tell about persistence.\n */\nexport type SaveHook = () => Promise<boolean>\n\n/**\n * How a search ended.\n *\n * Three answers rather than a boolean, because they are three different things\n * to say: it worked, the pattern is not in the document, or the pattern is not a\n * pattern. Only the first lets a macro carry on.\n */\nexport type SearchOutcome = 'ok' | 'not-found' | 'invalid'\n\ninterface Range {\n  from: number\n  to: number\n}\n\n// ---------------------------------------------------------------------------\n// positions\n// ---------------------------------------------------------------------------\n\n/** Where the NORMAL cursor may rest on the line containing `pos`. */\nfunction clampHead(doc: PMNode, pos: number): number {\n  const line = lineAt(doc, pos)\n  if (!line) {\n    return Math.max(0, Math.min(pos, doc.content.size))\n  }\n  return Math.max(line.from, Math.min(pos, clampToLine(line)))\n}\n\n/** Put the caret at `pos`, or at the nearest position that can hold a caret. */\nfunction selectAt(tr: Transaction, pos: number): void {\n  const at = Math.max(0, Math.min(pos, tr.doc.content.size))\n  tr.setSelection(TextSelection.near(tr.doc.resolve(at)))\n}\n\nfunction normalCursor(tr: Transaction, pos: number): void {\n  selectAt(tr, clampHead(tr.doc, pos))\n}\n\n/**\n * Ask the view to bring the cursor back on screen — but only when the command\n * moved it.\n *\n * ProseMirror scrolls to the selection only when a transaction says to, so\n * without this a `G` three screens down leaves the viewport where it was and the\n * command looks broken. The condition is `selectionSet` rather than `docChanged`\n * on purpose: a delete or a substitution that leaves the caret where the user is\n * already looking has no business moving the page, and the prefix keys of a\n * count set no selection at all, so `10G` scrolls once rather than three times.\n *\n * ProseMirror scrolls minimally and only when the selection is actually out of\n * view, so asking costs nothing when it is not needed. This is the one place in\n * the engine that has an opinion about the viewport; nothing here reads a\n * rendered position.\n */\nexport function followSelection(tr: Transaction): Transaction {\n  if (tr.selectionSet) {\n    tr.scrollIntoView()\n  }\n  return tr\n}\n\n/**\n * Dispatch a transaction the engine built outside the plugin's `commit`.\n *\n * The command line, the async clipboard put and `:s` all run from a callback\n * rather than from a keystroke, so they cannot use the closure `handleKeyDown`\n * hands out. Going through one function here keeps them on the same two rules:\n * the engine's next state rides along as meta, and a command that moved the\n * cursor asks the view to follow it.\n */\nfunction dispatchVim(view: EditorView, tr: Transaction, state: VimState): void {\n  followSelection(tr)\n  tr.setMeta(vimPluginKey, { state })\n  view.dispatch(tr)\n}\n\n/**\n * The character the cursor is on right now.\n *\n * In the visual modes this is the engine's own head rather than the selection's,\n * because the rendered selection covers that character and so ends one position\n * past it.\n */\nfunction headOf(state: EditorState, vim: VimState): number {\n  if ((vim.mode === 'visual' || vim.mode === 'visualLine') && vim.visualHead !== null) {\n    return vim.visualHead\n  }\n  return clampHead(state.doc, state.selection.head)\n}\n\nfunction firstNonBlankOffset(line: Line): number {\n  for (let at = 0; at < line.text.length; at++) {\n    if (!isBlankChar(line.text[at])) {\n      return at\n    }\n  }\n  return line.text.length\n}\n\n/** Every line from the one holding `from` to the one holding `to`, inclusive. */\nfunction lineSpan(doc: PMNode, from: number, to: number): Line[] {\n  const start = lineAt(doc, Math.min(from, to))\n  const end = lineAt(doc, Math.max(from, to))\n  if (!start || !end) {\n    return []\n  }\n  const lines = [start]\n  let current = start\n  for (let guard = 0; guard < WALK_LIMIT && current.from < end.from; guard++) {\n    const following = nextLine(doc, current)\n    if (!following) {\n      break\n    }\n    lines.push(following)\n    current = following\n  }\n  return lines\n}\n\n/** Walk `count` lines down from `line`, stopping at the document's last line. */\nfunction lineDown(doc: PMNode, line: Line, count: number): Line {\n  let current = line\n  for (let at = 0; at < count; at++) {\n    const following = nextLine(doc, current)\n    if (!following) {\n      return current\n    }\n    current = following\n  }\n  return current\n}\n\n// ---------------------------------------------------------------------------\n// what a line owns\n// ---------------------------------------------------------------------------\n\n/**\n * The node a line is really made of.\n *\n * A list item's line owns the item, not just the paragraph inside it, so `dd`\n * removes the bullet with the text and `yyp` duplicates an item rather than\n * stuffing a second paragraph into one. A table cell's line owns only the\n * paragraph — never the cell — because a table with a hole in it is not a table.\n */\nexport function ownerRangeOf(doc: PMNode, line: Line): Range {\n  if (line.code) {\n    return { from: line.blockPos, to: line.blockPos + line.block.nodeSize }\n  }\n  const $block = doc.resolve(line.blockPos)\n  const depth = $block.depth\n  if (depth >= 1 && ITEM_TYPES.has($block.parent.type.name) && $block.index(depth) === 0) {\n    return { from: $block.before(depth), to: $block.after(depth) }\n  }\n  return { from: line.blockPos, to: line.blockPos + line.block.nodeSize }\n}\n\ntype LinewiseMode = 'delete' | 'clearCell' | 'clearDoc'\n\ninterface LinewiseTarget extends Range {\n  mode: LinewiseMode\n  /** The list these lines were items of, so `p` can put them back as items. */\n  listContext?: string\n}\n\n/**\n * Grow a range outward while it is the entire content of its parent.\n *\n * Deleting the only item of a list has to take the list with it, or the Markdown\n * grows an empty list. The walk stops at a table cell (clear it instead) and at\n * the document (leave one empty paragraph) — the two places where \"delete the\n * container\" would destroy structure the user did not select.\n */\nfunction widen(doc: PMNode, from: number, to: number): LinewiseTarget {\n  let start = from\n  let end = to\n  for (let guard = 0; guard < 20; guard++) {\n    const $start = doc.resolve(start)\n    const depth = $start.depth\n    if (depth === 0) {\n      return start === 0 && end === doc.content.size\n        ? { from: start, to: end, mode: 'clearDoc' }\n        : { from: start, to: end, mode: 'delete' }\n    }\n    const covers = start === $start.start(depth) && end === $start.end(depth)\n    if (CELL_TYPES.has($start.parent.type.name)) {\n      return { from: start, to: end, mode: covers ? 'clearCell' : 'delete' }\n    }\n    if (!covers) {\n      return { from: start, to: end, mode: 'delete' }\n    }\n    start = $start.before(depth)\n    end = $start.after(depth)\n  }\n  return { from: start, to: end, mode: 'delete' }\n}\n\n/** The range `dd`, `cc`, `yy` and Visual Line actually operate on. */\nfunction linewiseTarget(doc: PMNode, lines: Line[]): LinewiseTarget | null {\n  if (lines.length === 0) {\n    return null\n  }\n  const first = lines[0]\n  const last = lines[lines.length - 1]\n\n  // Lines inside one code block are text, not nodes: a code line takes its own\n  // newline with it so the remaining lines close up.\n  if (lines.every(line => line.code && line.blockPos === first.blockPos)) {\n    const blockEnd = first.blockPos + 1 + first.block.content.size\n    const wholeBlock = first.from === first.blockPos + 1 && last.to === blockEnd\n    if (!wholeBlock) {\n      return last.to < blockEnd\n        ? { from: first.from, to: last.to + 1, mode: 'delete' }\n        : { from: first.from - 1, to: last.to, mode: 'delete' }\n    }\n  }\n\n  let from = Infinity\n  let to = -Infinity\n  for (const line of lines) {\n    const owner = ownerRangeOf(doc, line)\n    from = Math.min(from, owner.from)\n    to = Math.max(to, owner.to)\n  }\n  if (!Number.isFinite(from) || to <= from) {\n    return null\n  }\n\n  // Clamp before widening, not after: a range pulled back to the inside of a\n  // table cell is then recognised as covering that cell's whole content, and\n  // becomes \"clear the cell\" rather than a delete that leaves it empty by luck.\n  const safe = clampOperatorRange(doc, from, to)\n  if (!safe) {\n    return null\n  }\n  const widened = widen(doc, safe.from, safe.to)\n  // Read the list *after* widening: a sole item widens to the whole list, and\n  // the register then holds a list rather than items to graft into one.\n  const $final = doc.resolve(widened.from)\n  const listContext = LIST_TYPES.has($final.parent.type.name) ? $final.parent.type.name : undefined\n  return { ...widened, listContext }\n}\n\n// ---------------------------------------------------------------------------\n// operators\n// ---------------------------------------------------------------------------\n\nfunction writeRegister(\n  registers: RegisterFile,\n  operator: OperatorKind,\n  entry: RegisterEntry,\n  name: string | null | undefined,\n): void {\n  registers.write(name ?? null, entry, operator === 'y' ? 'yank' : 'delete')\n}\n\nfunction applyCharwise(\n  tr: Transaction,\n  operator: OperatorKind,\n  from: number,\n  to: number,\n  registers: RegisterFile,\n  next: VimState,\n  register?: string | null,\n): VimState {\n  const range = clampOperatorRange(tr.doc, from, to)\n  if (!range) {\n    return { ...next, mode: 'normal' }\n  }\n  writeRegister(\n    registers,\n    operator,\n    { slice: tr.doc.slice(range.from, range.to), linewise: false },\n    register,\n  )\n  if (operator === 'y') {\n    normalCursor(tr, range.from)\n    return { ...next, mode: 'normal' }\n  }\n  // What replaces bold text is bold. The marks come from the text being changed\n  // rather than from whatever happens to sit to its left once it is gone.\n  const marks = tr.doc.resolve(Math.min(range.from + 1, range.to)).marks()\n  closeHistory(tr)\n  tr.delete(range.from, range.to)\n  if (operator === 'c') {\n    selectAt(tr, range.from)\n    tr.setStoredMarks(marks)\n    return { ...next, mode: 'insert', insertRun: { from: range.from, to: range.from } }\n  }\n  normalCursor(tr, range.from)\n  return { ...next, mode: 'normal' }\n}\n\nfunction applyLinewise(\n  tr: Transaction,\n  operator: OperatorKind,\n  lines: Line[],\n  registers: RegisterFile,\n  next: VimState,\n  register?: string | null,\n): VimState {\n  if (isIndent(operator)) {\n    return applyIndent(tr, lines, operator, next)\n  }\n  const target = linewiseTarget(tr.doc, lines)\n  if (!target) {\n    return { ...next, mode: 'normal' }\n  }\n  writeRegister(\n    registers,\n    operator,\n    {\n      slice: tr.doc.slice(target.from, target.to),\n      linewise: true,\n      listContext: target.listContext,\n    },\n    register,\n  )\n  if (operator === 'y') {\n    normalCursor(tr, firstNonBlank(lines[0]))\n    return { ...next, mode: 'normal' }\n  }\n\n  closeHistory(tr)\n\n  // `cc` empties the line and keeps the block it was: changing a heading leaves\n  // a heading. Only the extra lines of a `3cc` are removed outright.\n  if (operator === 'c') {\n    if (lines.length > 1) {\n      const tail = linewiseTarget(tr.doc, lines.slice(1))\n      if (tail && tail.mode === 'delete') {\n        tr.delete(tail.from, tail.to)\n      }\n    }\n    const first = lines[0]\n    if (first.to > first.from) {\n      tr.delete(first.from, first.to)\n    }\n    selectAt(tr, first.from)\n    return { ...next, mode: 'insert', insertRun: { from: first.from, to: first.from } }\n  }\n\n  const paragraph = tr.doc.type.schema.nodes.paragraph\n  if (target.mode === 'clearDoc') {\n    const empty = paragraph.createAndFill()\n    if (empty) {\n      tr.replaceWith(0, tr.doc.content.size, empty)\n    }\n    selectAt(tr, 1)\n    return { ...next, mode: 'normal' }\n  }\n  if (target.mode === 'clearCell') {\n    const empty = paragraph.createAndFill()\n    if (empty) {\n      tr.replaceWith(target.from, target.to, empty)\n    }\n    selectAt(tr, target.from + 1)\n    return { ...next, mode: 'normal' }\n  }\n\n  tr.delete(target.from, target.to)\n  const landing = lineAt(tr.doc, Math.min(target.from, tr.doc.content.size))\n  normalCursor(tr, landing ? firstNonBlank(landing) : target.from)\n  return { ...next, mode: 'normal' }\n}\n\n/**\n * Run a ProseMirror command against the transaction we are already building.\n *\n * `sinkListItem` and `liftListItem` are commands over a whole `EditorState`, and\n * this engine's rule is one transaction per Vim command. Staging a plugin-free\n * state over the document as it currently stands lets the command produce its\n * steps, which are then appended here — so `>>` is still one undo unit and still\n * lands or does not land as a whole.\n */\nfunction runCommand(tr: Transaction, selection: TextSelection, command: Command): boolean {\n  const staged = EditorState.create({ doc: tr.doc, selection })\n  let produced: Transaction | null = null\n  const ran = command(staged, candidate => {\n    produced = candidate\n  })\n  if (!ran || !produced) {\n    return false\n  }\n  for (const step of (produced as Transaction).steps) {\n    tr.step(step)\n  }\n  return true\n}\n\n/** The list item a line belongs to, or null when the line is not in one. */\nfunction itemTypeOf(doc: PMNode, line: Line): NodeType | null {\n  if (line.code) {\n    return null\n  }\n  const $block = doc.resolve(line.blockPos)\n  const depth = $block.depth\n  if (depth >= 1 && ITEM_TYPES.has($block.parent.type.name) && $block.index(depth) === 0) {\n    return $block.parent.type\n  }\n  return null\n}\n\n/** Whether an item's list is itself inside another item — i.e. whether it can go left. */\nfunction isNestedItem(doc: PMNode, line: Line): boolean {\n  const $block = doc.resolve(line.blockPos)\n  // block → item → list → item\n  return $block.depth >= 3 && ITEM_TYPES.has($block.node($block.depth - 2).type.name)\n}\n\n/**\n * `>>` and `<<`.\n *\n * Two shapes of indentation exist in this document model and no third one is\n * invented. A list item shifts by changing its nesting, which is what\n * indentation *means* in a list and what Markdown can express. A code line\n * shifts by two literal spaces, matching what the serializer writes. Everywhere\n * else — a paragraph, a heading, a quote — `>>` does nothing, because Markdown\n * has no way to hold a shifted paragraph and inventing leading spaces would\n * quietly turn one into a code block on the next round trip.\n */\nfunction applyIndent(\n  tr: Transaction,\n  lines: Line[],\n  operator: '>' | '<',\n  next: VimState,\n): VimState {\n  const done: VimState = { ...next, mode: 'normal', visualAnchor: null, visualHead: null }\n  if (lines.length === 0) {\n    return done\n  }\n  const first = lines[0]\n  closeHistory(tr)\n\n  // Code: literal spaces, back to front so the earlier positions stay valid.\n  if (lines.every(line => line.code && line.blockPos === first.blockPos)) {\n    for (const line of [...lines].reverse()) {\n      if (operator === '>') {\n        tr.insertText(CODE_INDENT, line.from)\n      } else {\n        const lead = /^[ \\t]{1,2}/.exec(line.text)?.[0]\n        if (lead) {\n          tr.delete(line.from, line.from + lead.length)\n        }\n      }\n    }\n    const landing = lineAt(tr.doc, Math.min(first.from, tr.doc.content.size))\n    normalCursor(tr, landing ? firstNonBlank(landing) : first.from)\n    return done\n  }\n\n  // Lists: nesting, which is the only thing indentation can mean here.\n  const itemType = itemTypeOf(tr.doc, first)\n  if (!itemType || !lines.every(line => itemTypeOf(tr.doc, line) === itemType)) {\n    return done\n  }\n  // `<<` at the outermost level has nothing to remove, exactly as it has nothing\n  // to remove from an unindented line in a file.\n  if (operator === '<' && !lines.some(line => isNestedItem(tr.doc, line))) {\n    return done\n  }\n\n  const last = lines[lines.length - 1]\n  const selection = TextSelection.create(tr.doc, first.from, Math.min(last.to, tr.doc.content.size))\n  const ran = runCommand(\n    tr,\n    selection,\n    operator === '>' ? sinkListItem(itemType) : liftListItem(itemType),\n  )\n  if (!ran) {\n    // Nothing to indent into — the first item of a list has no sibling above it.\n    return done\n  }\n  const landing = lineAt(tr.doc, Math.min(first.from, tr.doc.content.size))\n  normalCursor(tr, landing ? firstNonBlank(landing) : first.from)\n  return done\n}\n\n/**\n * Replace a run of text, keeping the formatting that was on it.\n *\n * The one mutation `r`, `~` and `:s` all need, and the reason none of them has\n * its own: what replaces bold text is bold, and the marks come from the text\n * being replaced rather than from wherever the caret last was. Refuses a range\n * containing anything that is not text — a hard break has no case to toggle and\n * no character to substitute — and says so, so the caller can no-op.\n */\nfunction replaceRangeText(tr: Transaction, from: number, to: number, text: string): boolean {\n  let atom = false\n  tr.doc.nodesBetween(from, to, node => {\n    if (node.isLeaf && !node.isText) {\n      atom = true\n    }\n  })\n  if (atom) {\n    return false\n  }\n  if (text === '') {\n    tr.delete(from, to)\n    return true\n  }\n  const marks = tr.doc.resolve(Math.min(from + 1, to)).marks()\n  tr.replaceWith(from, to, tr.doc.type.schema.text(text, marks))\n  return true\n}\n\n/** `~`: upper becomes lower and lower becomes upper; everything else stands. */\nfunction swapCase(text: string): string {\n  return [...text]\n    .map(character => {\n      const upper = character.toUpperCase()\n      return character === upper ? character.toLowerCase() : upper\n    })\n    .join('')\n}\n\n// ---------------------------------------------------------------------------\n// paste\n// ---------------------------------------------------------------------------\n\nfunction sliceText(slice: Slice): string {\n  return slice.content.textBetween(0, slice.content.size, '\\n', ATOM)\n}\n\nfunction repeatFragment(fragment: Fragment, count: number): Fragment {\n  let all = fragment\n  for (let at = 1; at < count; at++) {\n    all = all.append(fragment)\n  }\n  return all\n}\n\nfunction fragmentHasTable(fragment: Fragment): boolean {\n  let found = false\n  fragment.forEach(node => {\n    if (node.type.name === 'table') {\n      found = true\n    }\n  })\n  return found\n}\n\n/**\n * Somewhere this content is actually allowed.\n *\n * Starts at the boundary the caller wants and hops outward through enclosing\n * nodes until the schema agrees — which is how a pasted heading lands beside a\n * list item rather than inside it. Null means nowhere, and the paste is dropped\n * rather than forced.\n */\nfunction insertionPoint(\n  doc: PMNode,\n  at: number,\n  fragment: Fragment,\n  after: boolean,\n): number | null {\n  // A table inside a cell is legal in the schema and illegible on the page.\n  if (fragmentHasTable(fragment) && insideCell(doc, at)) {\n    return null\n  }\n  let pos = at\n  for (let guard = 0; guard < 12; guard++) {\n    const $pos = doc.resolve(pos)\n    const index = $pos.index($pos.depth)\n    if ($pos.parent.canReplace(index, index, fragment)) {\n      return pos\n    }\n    if ($pos.depth === 0) {\n      return null\n    }\n    pos = after ? $pos.after($pos.depth) : $pos.before($pos.depth)\n  }\n  return null\n}\n\nfunction pasteCharwise(\n  tr: Transaction,\n  entry: RegisterEntry,\n  after: boolean,\n  count: number,\n  head: number,\n  next: VimState,\n): VimState {\n  const line = lineAt(tr.doc, head)\n  // `p` puts after the character under the cursor; at the end of a line — and on\n  // an empty one — that is the line's own end.\n  let pos = after && line ? Math.min(head + 1, line.to) : head\n  for (let at = 0; at < count; at++) {\n    const before = tr.doc.content.size\n    tr.replace(pos, pos, entry.slice)\n    pos += tr.doc.content.size - before\n  }\n  normalCursor(tr, pos - 1)\n  return { ...next, mode: 'normal' }\n}\n\nfunction pasteLinewise(\n  tr: Transaction,\n  entry: RegisterEntry,\n  after: boolean,\n  count: number,\n  head: number,\n  next: VimState,\n): VimState {\n  const line = lineAt(tr.doc, head)\n  if (!line) {\n    return { ...next, mode: 'normal' }\n  }\n\n  if (line.code) {\n    // Inside code the register is literal text. A linewise register carries the\n    // newline that ended its last line; the splice supplies its own.\n    const one = sliceText(entry.slice).replace(/\\n+$/, '')\n    const text = Array.from({ length: count }, () => one).join('\\n')\n    const at = after ? line.to : line.from\n    tr.insertText(after ? `\\n${text}` : `${text}\\n`, at)\n    normalCursor(tr, after ? at + 1 : at)\n    return { ...next, mode: 'normal' }\n  }\n\n  let fragment = repeatFragment(entry.slice.content, count)\n  const owner = ownerRangeOf(tr.doc, line)\n  const at = after ? owner.to : owner.from\n\n  // Items keep their bullets: dropped into a list of the same kind they join it,\n  // dropped anywhere else they bring a list of their own.\n  if (entry.listContext && tr.doc.resolve(at).parent.type.name !== entry.listContext) {\n    const listType = tr.doc.type.schema.nodes[entry.listContext]\n    const list = listType?.createAndFill(null, fragment)\n    if (!list) {\n      return { ...next, mode: 'normal' }\n    }\n    fragment = Fragment.from(list)\n  }\n\n  const point = insertionPoint(tr.doc, at, fragment, after)\n  if (point === null) {\n    return { ...next, mode: 'normal' }\n  }\n  tr.replace(point, point, new Slice(fragment, 0, 0))\n  const landed = lineAt(tr.doc, point + 1)\n  normalCursor(tr, landed ? firstNonBlank(landed) : point)\n  return { ...next, mode: 'normal' }\n}\n\n// ---------------------------------------------------------------------------\n// visual\n// ---------------------------------------------------------------------------\n\n/**\n * Draw the visual range.\n *\n * Visual Line renders the text extent of the covered lines, but *operates* on\n * the structural union those lines belong to — the same `linewiseTarget` `dd`\n * uses. The split is deliberate: the operation has to be the authoritative one,\n * because a selection that merely looks right and deletes half a list item is\n * the failure this engine is built to avoid.\n */\nexport function renderVisual(tr: Transaction, vim: VimState): void {\n  const { visualAnchor: anchor, visualHead: head } = vim\n  if (anchor === null || head === null) {\n    return\n  }\n  if (vim.mode === 'visualLine') {\n    const first = lineAt(tr.doc, Math.min(anchor, head))\n    const last = lineAt(tr.doc, Math.max(anchor, head))\n    if (!first || !last) {\n      return\n    }\n    tr.setSelection(TextSelection.create(tr.doc, first.from, last.to))\n    return\n  }\n  const low = Math.min(anchor, head)\n  const high = Math.max(anchor, head)\n  const line = lineAt(tr.doc, high)\n  const end = line ? Math.min(high + 1, line.to) : high\n  tr.setSelection(\n    head >= anchor\n      ? TextSelection.create(tr.doc, low, end)\n      : TextSelection.create(tr.doc, end, low),\n  )\n}\n\n/**\n * Clear the cells a table selection covers rather than removing them.\n *\n * prosemirror-tables normalises a selection that spans cells into a\n * `CellSelection` behind our back, so every operator has to ask what the\n * selection *is* at the moment it runs, not what it was when it was made.\n */\nfunction applyCellSelection(\n  tr: Transaction,\n  selection: CellSelection,\n  operator: OperatorKind,\n  registers: RegisterFile,\n  next: VimState,\n  register?: string | null,\n): VimState {\n  writeRegister(\n    registers,\n    operator,\n    { slice: tr.doc.slice(selection.from, selection.to), linewise: true },\n    register,\n  )\n  if (operator === 'y') {\n    normalCursor(tr, selection.from)\n    return { ...next, mode: 'normal', visualAnchor: null, visualHead: null }\n  }\n  closeHistory(tr)\n  const paragraph = tr.doc.type.schema.nodes.paragraph\n  let first: number | null = null\n  const cells: Range[] = []\n  selection.forEachCell((_cell, pos) => {\n    const $cell = tr.doc.resolve(pos + 1)\n    cells.push({ from: $cell.start($cell.depth), to: $cell.end($cell.depth) })\n  })\n  // Back to front, so each replacement leaves the earlier ranges valid.\n  for (const cell of cells.reverse()) {\n    const empty = paragraph.createAndFill()\n    if (empty) {\n      tr.replaceWith(cell.from, cell.to, empty)\n    }\n    first = cell.from + 1\n  }\n  if (first !== null) {\n    selectAt(tr, first)\n  }\n  return {\n    ...next,\n    mode: operator === 'c' ? 'insert' : 'normal',\n    visualAnchor: null,\n    visualHead: null,\n  }\n}\n\n/**\n * What a macro keeps.\n *\n * Everything except its own controls — recording the `q` that ended a recording\n * would replay as \"stop recording\" — and except a clipboard put, which completes\n * asynchronously after a permission prompt and would make a macro a sequence\n * that sometimes runs out of order. `execute` tells the user when it drops one.\n */\nfunction recordable(action: Action): boolean {\n  switch (action.kind) {\n    case 'startRecording':\n    case 'stopRecording':\n      return false\n    // A macro here is a sequence of document commands. Scrolling changes nothing\n    // it could replay, and a refusal message is not a command at all.\n    case 'scroll':\n    case 'unsupported':\n      return false\n    case 'paste':\n      return !RegisterFile.isClipboard(action.register)\n    default:\n      return true\n  }\n}\n\n/**\n * Which changes `.` will do again.\n *\n * Vim's rule, and a good one: motions are not changes, `y` is not a change, and\n * undo is emphatically not a change. Visual-mode operators are excluded too —\n * repeating one would need the selection to mean something in a place it was\n * never made, and a wrong guess there deletes text nobody pointed at.\n */\nfunction repeatable(action: Action): boolean {\n  switch (action.kind) {\n    case 'operator':\n    case 'operatorLines':\n    case 'operatorObject':\n      return action.operator !== 'y'\n    case 'replaceChar':\n    case 'toggleCase':\n    case 'join':\n    case 'paste':\n    case 'openLine':\n    case 'enterInsert':\n      return true\n    default:\n      return false\n  }\n}\n\n/** Whether replaying this action will leave the editor in INSERT. */\nfunction entersInsert(action: Action): boolean {\n  switch (action.kind) {\n    case 'enterInsert':\n    case 'openLine':\n      return true\n    case 'operator':\n    case 'operatorLines':\n    case 'operatorObject':\n      return action.operator === 'c'\n    default:\n      return false\n  }\n}\n\n/**\n * `3.` after `2dw` is `3dw`.\n *\n * A count on `.` *replaces* the recorded one rather than multiplying it, which\n * is Vim's rule and the only one that makes `.` usable for correcting a count\n * you got wrong the first time.\n */\nfunction withCount(action: Action, count: number | null): Action {\n  if (count === null) {\n    return action\n  }\n  switch (action.kind) {\n    case 'operator':\n      return { ...action, motion: { ...action.motion, count, countGiven: true } }\n    case 'operatorLines':\n    case 'operatorObject':\n    case 'replaceChar':\n    case 'toggleCase':\n    case 'join':\n    case 'paste':\n      return { ...action, count }\n    default:\n      return action\n  }\n}\n\n/**\n * Paint the matches, and move to one.\n *\n * The decorations are built once here and then *mapped* through every later\n * change rather than recomputed — see `plugin.ts`. Above the cap the highlight\n * is dropped rather than truncated: a half-highlighted document says something\n * false about where the matches are.\n */\nexport function buildSearchState(\n  doc: PMNode,\n  spec: SearchSpec,\n  direction: SearchDirection,\n  matches: Match[],\n  current: Match | null,\n): SearchState {\n  const decorations = matches.map(match =>\n    Decoration.inline(match.from, match.to, {\n      class:\n        current && match.from === current.from\n          ? 'vim-search-match vim-search-current'\n          : 'vim-search-match',\n    }),\n  )\n  return {\n    spec,\n    direction,\n    highlight: matches.length < MATCH_LIMIT ? DecorationSet.create(doc, decorations) : null,\n    stale: false,\n  }\n}\n\n/**\n * What `gv` reselects.\n *\n * Recorded on every exit from a visual mode — Escape, an operator, a click — so\n * \"select that again\" always has an answer, and the positions are mapped with\n * everything else when the document changes underneath them.\n */\nfunction rememberVisual(previous: VimState): Pick<VimState, 'lastVisual'> | Record<string, never> {\n  if (previous.visualAnchor === null || previous.visualHead === null) {\n    return {}\n  }\n  return {\n    lastVisual: {\n      anchor: previous.visualAnchor,\n      head: previous.visualHead,\n      line: previous.mode === 'visualLine',\n    },\n  }\n}\n\n// ---------------------------------------------------------------------------\n// the executor\n// ---------------------------------------------------------------------------\n\nfunction applyAction(\n  view: EditorView,\n  tr: Transaction,\n  action: Action,\n  previous: VimState,\n  next: VimState,\n  registers: RegisterFile,\n  repeat: RepeatRecord | null,\n  report: Report,\n): VimState {\n  const head = headOf(view.state, previous)\n  const schema = tr.doc.type.schema\n\n  switch (action.kind) {\n    case 'motion': {\n      const result = resolveMotion(tr.doc, head, action.motion, {\n        goal: previous.goal,\n        marks: previous.marks,\n        lastJump: previous.lastJump,\n        search: previous.search,\n        lastFind: previous.lastFind,\n      })\n      if (!result) {\n        // Nowhere to go at all: an unset mark, a character not on the line.\n        report.failed = true\n        return next\n      }\n      if (result.failed) {\n        // Somewhere to go and no way to get there — `l` at the end of a line,\n        // `j` on the last one. The cursor stays put and a macro stops here.\n        report.failed = true\n      }\n      const jumped = JUMPS.has(action.motion.spec.kind) ? { lastJump: head } : null\n      // `;` and `,` need something to repeat, and only an explicit find sets it.\n      const found = action.motion.spec.find ? { lastFind: action.motion.spec.find } : null\n      if (next.mode === 'visual' || next.mode === 'visualLine') {\n        const moved: VimState = {\n          ...next,\n          ...jumped,\n          ...found,\n          visualHead: clampHead(tr.doc, result.target),\n          goal: result.goal,\n        }\n        renderVisual(tr, moved)\n        return moved\n      }\n      normalCursor(tr, result.target)\n      return { ...next, ...jumped, ...found, goal: result.goal }\n    }\n\n    case 'operator': {\n      const result = resolveMotion(tr.doc, head, action.motion, {\n        operator: action.operator,\n        marks: previous.marks,\n        lastJump: previous.lastJump,\n        search: previous.search,\n        lastFind: previous.lastFind,\n      })\n      if (!result || result.to <= result.from) {\n        report.failed = true\n        return { ...next, mode: 'normal' }\n      }\n      // An operator over a find still records it, so `df,` then `;` works.\n      const remembered = action.motion.spec.find ? { lastFind: action.motion.spec.find } : null\n      next = { ...next, ...remembered }\n      // Indentation is a property of lines, so `>w` shifts the line the word is\n      // on rather than trying to shift part of one.\n      return result.wise === 'line' || isIndent(action.operator)\n        ? applyLinewise(\n            tr,\n            action.operator,\n            lineSpan(tr.doc, result.from, result.to),\n            registers,\n            next,\n            action.register,\n          )\n        : applyCharwise(\n            tr,\n            action.operator,\n            result.from,\n            result.to,\n            registers,\n            next,\n            action.register,\n          )\n    }\n\n    case 'operatorLines': {\n      const line = lineAt(tr.doc, head)\n      if (!line) {\n        report.failed = true\n        return next\n      }\n      const last = lineDown(tr.doc, line, action.count - 1)\n      return applyLinewise(\n        tr,\n        action.operator,\n        lineSpan(tr.doc, line.from, last.from),\n        registers,\n        next,\n        action.register,\n      )\n    }\n\n    case 'visualOperator': {\n      const selection = view.state.selection\n      if (selection instanceof CellSelection) {\n        return applyCellSelection(tr, selection, action.operator, registers, next, action.register)\n      }\n      const anchor = previous.visualAnchor ?? head\n      const cleared: VimState = {\n        ...next,\n        ...rememberVisual(previous),\n        visualAnchor: null,\n        visualHead: null,\n      }\n      // `>` and `<` are linewise from either visual mode.\n      if (previous.mode === 'visualLine' || isIndent(action.operator)) {\n        return applyLinewise(\n          tr,\n          action.operator,\n          lineSpan(tr.doc, anchor, head),\n          registers,\n          cleared,\n          action.register,\n        )\n      }\n      const low = Math.min(anchor, head)\n      const high = Math.max(anchor, head)\n      const line = lineAt(tr.doc, high)\n      return applyCharwise(\n        tr,\n        action.operator,\n        low,\n        line ? Math.min(high + 1, line.to) : high + 1,\n        registers,\n        cleared,\n        action.register,\n      )\n    }\n\n    case 'enterInsert': {\n      // `gi` goes back to where INSERT was last left, wherever the cursor has\n      // wandered since. With nothing remembered it is an ordinary `i`.\n      const start =\n        action.where === 'gi' && previous.lastInsertEnd !== null\n          ? Math.max(0, Math.min(previous.lastInsertEnd, tr.doc.content.size))\n          : head\n      const line = lineAt(tr.doc, start)\n      if (!line) {\n        report.failed = true\n        return next\n      }\n      const at =\n        action.where === 'a'\n          ? Math.min(start + 1, line.to)\n          : action.where === 'I'\n            ? firstNonBlank(line)\n            : action.where === 'A'\n              ? line.to\n              : start\n      closeHistory(tr)\n      selectAt(tr, at)\n      return { ...next, mode: 'insert', insertRun: { from: at, to: at } }\n    }\n\n    case 'openLine': {\n      const line = lineAt(tr.doc, head)\n      if (!line) {\n        report.failed = true\n        return next\n      }\n      closeHistory(tr)\n      if (line.code) {\n        const at = action.below ? line.to : line.from\n        tr.insertText('\\n', at)\n        const caret = action.below ? at + 1 : at\n        selectAt(tr, caret)\n        return { ...next, mode: 'insert', insertRun: { from: caret, to: caret } }\n      }\n      const $block = tr.doc.resolve(line.blockPos)\n      const depth = $block.depth\n      if (depth >= 1 && ITEM_TYPES.has($block.parent.type.name) && $block.index(depth) === 0) {\n        const itemType = $block.parent.type\n        const item = itemType.createAndFill(\n          itemType.name === 'taskItem' ? { checked: false } : null,\n        )\n        if (item) {\n          const at = action.below ? $block.after(depth) : $block.before(depth)\n          tr.insert(at, item)\n          selectAt(tr, at + 2)\n          return { ...next, mode: 'insert', insertRun: { from: at + 2, to: at + 2 } }\n        }\n      }\n      // A heading's `o` opens a paragraph, not a second heading — Vim continues\n      // the line's *position*, and rich text has no notion of continuing a level.\n      const paragraph = schema.nodes.paragraph.createAndFill()\n      if (!paragraph) {\n        return next\n      }\n      const at = action.below ? line.blockPos + line.block.nodeSize : line.blockPos\n      tr.insert(at, paragraph)\n      selectAt(tr, at + 1)\n      return { ...next, mode: 'insert', insertRun: { from: at + 1, to: at + 1 } }\n    }\n\n    case 'replaceChar': {\n      const line = lineAt(tr.doc, head)\n      const end = head + action.count\n      // `5rZ` on a two-character line replaces nothing at all, as in Vim.\n      if (!line || end > line.to) {\n        report.failed = true\n        return next\n      }\n      closeHistory(tr)\n      if (!replaceRangeText(tr, head, end, action.char.repeat(action.count))) {\n        report.failed = true\n        return next\n      }\n      normalCursor(tr, end - 1)\n      return next\n    }\n\n    case 'toggleCase': {\n      const line = lineAt(tr.doc, head)\n      if (!line) {\n        report.failed = true\n        return next\n      }\n      const end = Math.min(head + action.count, line.to)\n      if (end <= head) {\n        report.failed = true\n        return next\n      }\n      const text = line.text.slice(head - line.from, end - line.from)\n      closeHistory(tr)\n      if (!replaceRangeText(tr, head, end, swapCase(text))) {\n        report.failed = true\n        return next\n      }\n      // Vim leaves the cursor past what it toggled, so `~~~` walks a word.\n      normalCursor(tr, end)\n      return next\n    }\n\n    case 'join': {\n      closeHistory(tr)\n      let cursor = head\n      let joined = false\n      for (let at = 0; at < Math.max(1, action.count - 1); at++) {\n        const line = lineAt(tr.doc, cursor)\n        const following = line ? nextLine(tr.doc, line) : null\n        if (!line || !following || line.code !== following.code) {\n          break\n        }\n        if (cellAround(tr.doc, line.from)?.from !== cellAround(tr.doc, following.from)?.from) {\n          break\n        }\n        const from = line.to\n        const to = following.from + firstNonBlankOffset(following)\n        // Vim adds a space between the two lines, unless the first already ends\n        // in one or either side is empty.\n        const spaced =\n          line.text.length > 0 &&\n          following.text.length > 0 &&\n          !isBlankChar(line.text[line.text.length - 1])\n        tr.replace(from, to, Slice.empty)\n        if (spaced) {\n          tr.insertText(' ', from)\n        }\n        cursor = from\n        joined = true\n      }\n      if (joined) {\n        normalCursor(tr, cursor)\n      } else {\n        // `J` on the last line, or across a boundary it may not join.\n        report.failed = true\n      }\n      return next\n    }\n\n    case 'paste': {\n      const entry = registers.read(action.register)\n      if (!entry) {\n        report.failed = true\n        return next\n      }\n      closeHistory(tr)\n      return entry.linewise\n        ? pasteLinewise(tr, entry, action.after, action.count, head, next)\n        : pasteCharwise(tr, entry, action.after, action.count, head, next)\n    }\n\n    case 'enterVisual': {\n      const started: VimState = { ...next, visualAnchor: head, visualHead: head }\n      renderVisual(tr, started)\n      return started\n    }\n\n    case 'collapseVisual': {\n      normalCursor(tr, head)\n      return { ...next, ...rememberVisual(previous), visualAnchor: null, visualHead: null }\n    }\n\n    case 'reselectVisual': {\n      const span = previous.lastVisual\n      if (!span) {\n        report.failed = true\n        return next\n      }\n      const restored: VimState = {\n        ...next,\n        mode: span.line ? 'visualLine' : 'visual',\n        visualAnchor: Math.max(0, Math.min(span.anchor, tr.doc.content.size)),\n        visualHead: Math.max(0, Math.min(span.head, tr.doc.content.size)),\n      }\n      renderVisual(tr, restored)\n      return restored\n    }\n\n    case 'setMark':\n      return { ...next, marks: { ...previous.marks, [action.mark]: head } }\n\n    case 'startRecording':\n      return { ...next, recording: { register: action.register, items: [] } }\n\n    case 'stopRecording':\n      // The executor in `execute` has already saved the items; all that is left\n      // is to stop being in a recording.\n      return { ...next, recording: null }\n\n    case 'openCmdline': {\n      // Handled by `execute`, which owns the bar: the mode change is all that\n      // belongs in a transaction.\n      return { ...next, mode: 'command' }\n    }\n\n    // Routed round this function by the plugin, which hands it to the replay\n    // loop — `execute` must not know about the loop that calls it.\n    case 'playMacro':\n      return next\n\n    // Both handled in `execute`, before there is a transaction to build: one\n    // moves the viewport and the other says a sentence. Neither touches the\n    // document, and the meta-only transaction that carries the mode is all that\n    // reaches this file.\n    case 'scroll':\n    case 'unsupported':\n      return next\n\n    case 'searchWord': {\n      const word = wordUnderCursor(tr.doc, head)\n      if (!word) {\n        report.failed = true\n        return next\n      }\n      // `*` is a whole-word, case-sensitive search — that is the whole point of\n      // having it as well as `/`. The word bounds go through the pattern\n      // compiler like everything else, so there is one matcher and not two.\n      const spec = specFor(wholeWordPattern(word), { caseSensitive: true })\n      if (!spec) {\n        report.failed = true\n        return next\n      }\n      const matches = findMatches(tr.doc, spec)\n      const found = matchFrom(matches, head, action.direction)\n      if (!found) {\n        report.failed = true\n        return next\n      }\n      normalCursor(tr, found.from)\n      return {\n        ...next,\n        lastJump: head,\n        search: buildSearchState(tr.doc, spec, action.direction, matches, found),\n      }\n    }\n\n    case 'repeat': {\n      if (!repeat) {\n        report.failed = true\n        return next\n      }\n      // The recorded action is replayed against wherever the cursor is now, and\n      // whatever it types is appended in the *same* transaction — so one `.` is\n      // one undo unit, however many steps it took the first time.\n      const replayed = withCount(repeat.action, action.count)\n      const state = applyAction(view, tr, replayed, previous, next, registers, null, report)\n      if (state.mode !== 'insert') {\n        return state\n      }\n      // As a slice, not as text: a `<CR>` while typing split a block, and `.`\n      // has to be able to split it again rather than run the two halves together.\n      if (repeat.typed && repeat.typed.size > 0) {\n        tr.replaceSelection(repeat.typed)\n      }\n      closeHistory(tr)\n      const at = tr.selection.head\n      const line = lineAt(tr.doc, at)\n      normalCursor(tr, line ? Math.max(line.from, at - 1) : at)\n      // `gi` still points at the *original* insert. A replay is a replay, not a\n      // new place you were typing.\n      return { ...state, mode: 'normal', insertRun: null }\n    }\n\n    case 'operatorObject': {\n      const range = resolveTextObject(tr.doc, head, action.object, action.count)\n      // No such object here. `ci(` outside any brackets does nothing rather than\n      // guessing at what was meant.\n      if (!range) {\n        report.failed = true\n        return { ...next, mode: 'normal' }\n      }\n      if (isIndent(action.operator)) {\n        return applyLinewise(\n          tr,\n          action.operator,\n          lineSpan(tr.doc, range.from, range.to),\n          registers,\n          next,\n        )\n      }\n      return applyCharwise(\n        tr,\n        action.operator,\n        range.from,\n        range.to,\n        registers,\n        next,\n        action.register,\n      )\n    }\n\n    case 'visualObject': {\n      const range = resolveTextObject(tr.doc, head, action.object, action.count)\n      if (!range || range.to <= range.from) {\n        report.failed = true\n        return next\n      }\n      const selected: VimState = {\n        ...next,\n        visualAnchor: range.from,\n        visualHead: range.to - 1,\n      }\n      renderVisual(tr, selected)\n      return selected\n    }\n\n    case 'exitInsert': {\n      closeHistory(tr)\n      const at = view.state.selection.head\n      const line = lineAt(tr.doc, at)\n      normalCursor(tr, line ? Math.max(line.from, at - 1) : at)\n      // Where `gi` comes back to: the caret as it was when Escape was pressed,\n      // not the one-left NORMAL position.\n      return { ...next, lastInsertEnd: at, insertRun: null }\n    }\n\n    // Handled before the transaction is built; history dispatches its own.\n    case 'undo':\n    case 'redo':\n      return next\n  }\n}\n\n/**\n * Put the clipboard, once it arrives.\n *\n * The only command in this engine that dispatches later than the keystroke that\n * asked for it. Reading the system clipboard is asynchronous by construction —\n * the browser may prompt — so the put lands at the *then-current* selection. In\n * a single-user editor the worst a race can do is move where it lands; it can\n * never corrupt the document, because the transaction is built when it runs.\n */\nfunction pasteEntry(\n  view: EditorView,\n  entry: RegisterEntry,\n  after: boolean,\n  count: number,\n): void {\n  const vim = vimPluginKey.getState(view.state)\n  if (!vim?.enabled) {\n    return\n  }\n  const tr = view.state.tr\n  const head = clampHead(view.state.doc, view.state.selection.head)\n  closeHistory(tr)\n  const state = entry.linewise\n    ? pasteLinewise(tr, entry, after, count, head, vim)\n    : pasteCharwise(tr, entry, after, count, head, vim)\n  dispatchVim(view, tr, state)\n}\n\n/** Back to NORMAL, with the caret where the work is. */\nfunction leaveCommandMode(view: EditorView): void {\n  const vim = vimPluginKey.getState(view.state)\n  if (!vim) {\n    return\n  }\n  dispatchVim(view, view.state.tr, { ...vim, mode: 'normal' })\n  view.focus()\n}\n\n/**\n * Search, without the bar.\n *\n * The entry point the unit tests use and the bar's commit handler calls, so the\n * behaviour under test is the behaviour that ships. Returns false when nothing\n * matched, in which case nothing is dispatched and the document is untouched.\n */\nexport function executeSearch(\n  view: EditorView,\n  query: string,\n  direction: SearchDirection,\n): SearchOutcome {\n  const vim = vimPluginKey.getState(view.state)\n  if (!vim) {\n    return 'not-found'\n  }\n  const spec = specFor(query)\n  if (!spec) {\n    // A pattern the compiler refused. Nothing is searched and nothing is\n    // dispatched — see `pattern.ts` for why guessing is the worse option.\n    return 'invalid'\n  }\n  const matches = findMatches(view.state.doc, spec)\n  const head = clampHead(view.state.doc, view.state.selection.head)\n  const found = matchFrom(matches, head, direction)\n  if (!found) {\n    return 'not-found'\n  }\n  const tr = view.state.tr\n  normalCursor(tr, found.from)\n  dispatchVim(view, tr, {\n    ...vim,\n    mode: 'normal',\n    lastJump: head,\n    search: buildSearchState(view.state.doc, spec, direction, matches, found),\n  })\n  return 'ok'\n}\n\nexport interface ExResult {\n  message: string\n  tone: MessageTone\n}\n\n/**\n * What an ex command may reach outside the document.\n *\n * `announce` exists because one command answers late: `:w` cannot know what to\n * say until the save resolves, and by then `executeEx` has long returned.\n */\nexport interface ExHooks {\n  save?: SaveHook | null\n  announce?: (message: string, tone: MessageTone) => void\n}\n\n/**\n * Run an ex command.\n *\n * The entry point the unit suite drives and the bar's commit handler calls, so\n * what is tested is what `:` runs. Null means it ran and had nothing to say.\n *\n * The substitution invariant is the only hard part: **every match is found\n * before anything changes**, and each range is then mapped through the\n * transaction's accumulating steps as the replacements are applied in document\n * order. A replacement that shrinks or grows the text therefore cannot corrupt\n * the ranges after it, and the whole substitution is one transaction and one\n * undo step.\n */\nexport function executeEx(\n  view: EditorView,\n  input: string,\n  range?: { from: number; to: number } | null,\n  hooks: ExHooks = {},\n): ExResult | null {\n  const command = parseEx(input)\n  if (command.kind === 'unsupported') {\n    return { message: command.reason, tone: 'error' }\n  }\n  if (command.kind === 'nohlsearch') {\n    clearSearchHighlight(view)\n    return null\n  }\n  if (command.kind === 'write') {\n    // Pasty is already saving; this waits for it and says what happened. The\n    // message comes from the promise, never before it — and when the save fails,\n    // the application's own save-status machinery is still the source of truth,\n    // with this only echoing it into the bar the command was typed in.\n    const save = hooks.save\n    if (!save) {\n      // No pipeline registered: unit tests, and any host that never called\n      // `installVimChrome`. Quiet, like the bar itself.\n      return null\n    }\n    void save().then(\n      stored => hooks.announce?.(stored ? 'Saved' : \"Couldn't save\", stored ? 'info' : 'error'),\n      () => hooks.announce?.(\"Couldn't save\", 'error'),\n    )\n    return null\n  }\n\n  const vim = vimPluginKey.getState(view.state)\n  if (!vim) {\n    return null\n  }\n  const doc = view.state.doc\n  const head = clampHead(doc, view.state.selection.head)\n\n  // `%` is the whole document; a visual selection is the lines it covered; and\n  // with neither, `:s` is the line you are on, exactly as in Vim.\n  const lines = command.whole\n    ? lineSpan(doc, 0, doc.content.size)\n    : range\n      ? lineSpan(doc, range.from, range.to)\n      : lineSpan(doc, head, head)\n\n  const spec = specFor(command.pattern)\n  if (!spec) {\n    return { message: 'Invalid pattern', tone: 'error' }\n  }\n  const matches = matchesInLines(lines, spec, !command.all)\n  if (matches.length === 0) {\n    return { message: `Pattern not found: ${command.pattern}`, tone: 'error' }\n  }\n\n  const tr = view.state.tr\n  closeHistory(tr)\n  let replaced = 0\n  let last = matches[matches.length - 1].from\n  for (const match of matches) {\n    // Bias 1 on both ends: a replacement that finished exactly where this match\n    // begins must not swallow it.\n    const from = tr.mapping.map(match.from, 1)\n    const to = tr.mapping.map(match.to, 1)\n    // `&` and `\\1` are resolved against *this* match, which is why the groups\n    // travel with it rather than being re-derived from the changed document.\n    if (replaceRangeText(tr, from, to, expandReplacement(command.replacement, match))) {\n      replaced += 1\n      last = from\n    }\n  }\n  if (replaced === 0) {\n    return { message: `Pattern not found: ${command.pattern}`, tone: 'error' }\n  }\n\n  const landing = lineAt(tr.doc, Math.min(last, tr.doc.content.size))\n  normalCursor(tr, landing ? firstNonBlank(landing) : last)\n  dispatchVim(view, tr, { ...vim, mode: 'normal' })\n\n  return { message: `${replaced} replaced`, tone: 'info' }\n}\n\n/** Drop the highlight. What `:noh` does, and what disabling Vim does. */\nexport function clearSearchHighlight(view: EditorView): void {\n  const vim = vimPluginKey.getState(view.state)\n  if (!vim?.search) {\n    return\n  }\n  dispatchVim(view, view.state.tr, { ...vim, search: { ...vim.search, highlight: null } })\n}\n\n/**\n * Run one action.\n *\n * Every path ends in exactly one `commit`, including the failure path — the mode\n * indicator and the chrome are driven by transactions, so a command that does\n * nothing still has to say so.\n *\n * The returned outcome is what a macro stops on. Only commands that could not do\n * what they were asked report `failed`; a command that succeeded and changed\n * nothing visible — `0` in column 1 — is an ordinary success.\n */\nexport function execute(\n  view: EditorView,\n  action: Action,\n  previous: VimState,\n  next: VimState,\n  deps: ExecuteDeps,\n): CommandOutcome {\n  // The page moves; the document and the cursor do not. The transaction carries\n  // nothing but the state, which is what clears the count that preceded it — and\n  // because it sets no selection, the viewport rule in `followSelection` will not\n  // undo the scroll by pulling the cursor back into view.\n  if (action.kind === 'scroll') {\n    scrollViewport(view, action)\n    deps.commit(view.state.tr, next)\n    return 'ok'\n  }\n\n  // A key Vim has and Pasty deliberately does not. Consumed either way — in a\n  // modal mode an unowned chord reaches the platform's own editing bindings —\n  // and answered where there is a bar to answer in.\n  if (action.kind === 'unsupported') {\n    deps.cmdline()?.showMessage(\"Visual Block mode isn't supported in Pasty\", 'error')\n    deps.commit(view.state.tr, next)\n    // A refusal, not a failure: it did exactly what it is meant to do.\n    return 'ok'\n  }\n\n  if (action.kind === 'undo' || action.kind === 'redo') {\n    const run = action.kind === 'undo' ? undo : redo\n    // History says whether there was anything left to undo, which is exactly\n    // Vim's \"already at oldest change\" — and a macro stops on it.\n    const ran = run(view.state, view.dispatch)\n    const tr = view.state.tr\n    normalCursor(tr, tr.selection.head)\n    deps.commit(tr, next)\n    return ran ? 'ok' : 'failed'\n  }\n\n  // Opening the command line is the one command that reaches outside the\n  // document: the bar takes focus, so the editor stops seeing keys entirely and\n  // there is no mode juggling to get wrong.\n  if (action.kind === 'openCmdline') {\n    const host = deps.cmdline()\n    if (!host) {\n      // No bar registered (unit tests, a host that never called\n      // `installVimChrome`). Every command the bar offers has a direct entry\n      // point, so this is a no-op rather than a broken mode.\n      deps.commit(view.state.tr, next)\n      return 'ok'\n    }\n    // `:` from a visual selection operates on the lines it covered, which is why\n    // this is captured before the mode changes rather than parsed out of a\n    // `'<,'>` prefix nobody would enjoy typing.\n    const visualRange =\n      (previous.mode === 'visual' || previous.mode === 'visualLine') &&\n      previous.visualAnchor !== null &&\n      previous.visualHead !== null\n        ? { from: previous.visualAnchor, to: previous.visualHead }\n        : null\n\n    const tr = view.state.tr\n    tr.setMeta('addToHistory', false)\n    deps.commit(tr, { ...next, mode: 'command' })\n    host.open(action.prefix, {\n      onCommit: input => {\n        if (action.prefix === ':') {\n          const result = executeEx(view, input, visualRange, {\n            save: deps.save(),\n            announce: (message, tone) => host.showMessage(message, tone),\n          })\n          if (result) {\n            host.showMessage(result.message, result.tone)\n          }\n          leaveCommandMode(view)\n          return\n        }\n        const direction = action.prefix === '/' ? 1 : -1\n        const outcome = deps.search(input, direction)\n        if (outcome === 'ok') {\n          // A macro re-runs the search rather than jumping to where it landed.\n          deps.record({ kind: 'search', query: input, direction })\n        } else {\n          host.showMessage(\n            outcome === 'invalid' ? 'Invalid pattern' : `Pattern not found: ${input}`,\n            'error',\n          )\n        }\n        leaveCommandMode(view)\n      },\n      onCancel: () => leaveCommandMode(view),\n    })\n    return 'ok'\n  }\n\n  // `\"+p`: the system clipboard has to be read before there is anything to put,\n  // and that read is asynchronous. Nothing is dispatched now beyond the mode.\n  if (action.kind === 'paste' && RegisterFile.isClipboard(action.register)) {\n    // Deliberately left out of a macro rather than silently half-working: this\n    // completes later, at the selection as it is then, after a permission\n    // prompt this code cannot see the answer to.\n    if (vimPluginKey.getState(view.state)?.recording) {\n      deps.cmdline()?.showMessage('Clipboard puts are not recorded', 'error')\n    }\n    deps.commit(view.state.tr, next)\n    void deps.registers.readClipboard().then(entry => {\n      // A denied or empty read falls back to what we last wrote there, so `\"+p`\n      // still puts something rather than silently doing nothing.\n      const fallback = entry ?? deps.registers.read(action.register)\n      if (fallback) {\n        pasteEntry(view, fallback, action.after, action.count)\n      }\n    })\n    return 'ok'\n  }\n\n  // Keep the items before the state that holds them is replaced.\n  if (action.kind === 'stopRecording' && previous.recording) {\n    deps.saveMacro(previous.recording.register, [...previous.recording.items])\n  }\n\n  const tr = view.state.tr\n  const report: Report = { failed: false }\n  let state: VimState\n  try {\n    state = applyAction(view, tr, action, previous, next, deps.registers, deps.repeat(), report)\n  } catch (error) {\n    // A single transaction means a throw leaves nothing behind: the document is\n    // exactly as it was, and all that is left to do is forget the half-typed\n    // command so the next keystroke starts clean.\n    console.warn('[pasty] Vim command failed', error)\n    deps.commit(view.state.tr, { ...next, pending: { ...EMPTY_PENDING } })\n    return 'failed'\n  }\n\n  // Recorded once it has changed something — or once it has entered INSERT,\n  // where the change is the typing that follows. Never by `.` itself: repeating\n  // a repeat would be a loop with nothing at the bottom.\n  if (repeatable(action) && (tr.docChanged || entersInsert(action))) {\n    deps.setRepeat({ action, typed: null })\n  }\n  if (recordable(action)) {\n    deps.record({ kind: 'action', action, mode: next.mode })\n  }\n  // Insert has finished: fill in what was typed, if the capture survived. The\n  // macro gets the same text, from the same capture.\n  if (action.kind === 'exitInsert') {\n    const record = deps.repeat()\n    const run = previous.insertRun\n    const typed = run ? view.state.doc.slice(run.from, run.to) : null\n    if (record && entersInsert(record.action)) {\n      deps.setRepeat({ ...record, typed })\n    }\n    if (typed && typed.size > 0) {\n      deps.record({ kind: 'insert', typed })\n    }\n  }\n\n  deps.commit(tr, state)\n  return report.failed ? 'failed' : 'ok'\n}\n","/**\n * The block cursor.\n *\n * Cosmetic, and deliberately fragile-tolerant. The mode indicator is the\n * authoritative signal that Vim is in NORMAL; this only makes the caret *look*\n * like a terminal's, by hiding the native caret (a class on the editor) and\n * painting the character under it (a decoration).\n *\n * `.ProseMirror { white-space: normal }` means the rendered text does not always\n * agree with the model's whitespace, so anything that goes wrong here goes wrong\n * quietly: every path returns null rather than throwing, and no part of this\n * module measures a rectangle or positions an overlay.\n */\n\nimport { TextSelection, type EditorState } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nimport { lineAt } from './lines'\nimport type { VimState } from './types'\n\nfunction emptyLineCursor(): HTMLElement {\n  const box = document.createElement('span')\n  box.className = 'vim-block-cursor vim-block-cursor--empty'\n  box.setAttribute('aria-hidden', 'true')\n  return box\n}\n\nexport function cursorDecorations(state: EditorState, vim: VimState): DecorationSet | null {\n  if (!vim.enabled || vim.mode !== 'normal') {\n    return null\n  }\n  const selection = state.selection\n  // A node selection already draws itself, and a range is not a cursor.\n  if (!(selection instanceof TextSelection) || !selection.empty) {\n    return null\n  }\n  try {\n    const line = lineAt(state.doc, selection.head)\n    if (!line) {\n      return null\n    }\n    if (selection.head < line.to) {\n      return DecorationSet.create(state.doc, [\n        Decoration.inline(selection.head, selection.head + 1, { class: 'vim-block-cursor' }),\n      ])\n    }\n    // End of line, and empty lines: there is no character to paint, so stand a\n    // box where one would go.\n    return DecorationSet.create(state.doc, [\n      Decoration.widget(selection.head, emptyLineCursor, { side: 1 }),\n    ])\n  } catch {\n    return null\n  }\n}\n","/**\n * Line numbers.\n *\n * `42G` is only useful if something tells you where line 42 is, and in a\n * rich-text editor nothing does. The numbers here are **Pasty's logical lines** —\n * the same enumeration `nthLine` walks — so the gutter and `[count]G`, `j`, `k`,\n * `V` and every linewise operator agree by construction: one wrapped paragraph\n * is one number, one `\\n` inside a code block is one number.\n *\n * They are model-positioned widget decorations, one per line at the line's first\n * position, placed by CSS alone: the spans are absolutely positioned against the\n * editor's reserved left padding and take their *vertical* position from where\n * the browser would have laid them out inline. Nothing here measures a rectangle\n * or reads a rendered position — the same rule the rest of the engine keeps —\n * which is also why absolute positioning against `.ProseMirror` rather than\n * against each block is load-bearing: it escapes the `overflow` clip on a code\n * block and on a table wrapper without anyone having to compute an offset.\n *\n * Cosmetic, and allowed to fail: if a number is ever in the wrong place, the\n * document is still right and every command still works.\n */\n\nimport type { Node as PMNode } from '@tiptap/pm/model'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nimport { firstLine, nextLine } from './lines'\nimport { insideCell } from './tables'\n\n/**\n * Past this the gutter turns itself off.\n *\n * The set is rebuilt on every document change, so its cost is paid per\n * keystroke; a document with five thousand logical lines in it is one where the\n * numbers are worth less than the typing latency they would cost.\n */\nexport const MAX_GUTTER_LINES = 5000\n\nfunction numberSpan(value: number): HTMLElement {\n  const span = document.createElement('span')\n  span.className = 'vim-line-number'\n  span.textContent = String(value)\n  // Not part of the document: never selected, never spoken, never clicked into.\n  span.contentEditable = 'false'\n  span.setAttribute('aria-hidden', 'true')\n  return span\n}\n\n/**\n * A number for every logical line, or null when there are too many.\n *\n * Lines inside a table are counted but not drawn. A table cell is its own little\n * column of lines, and a number floating beside a grid says something untrue\n * about what `j` will do next; the count still advances so that the numbers\n * after the table are the ones `[count]G` uses.\n */\nexport function lineNumberDecorations(doc: PMNode): DecorationSet | null {\n  const decorations: Decoration[] = []\n  let line = firstLine(doc)\n  let number = 0\n\n  while (line) {\n    number += 1\n    if (number > MAX_GUTTER_LINES) {\n      return null\n    }\n    if (!insideCell(doc, line.from)) {\n      const value = number\n      decorations.push(\n        Decoration.widget(line.from, () => numberSpan(value), {\n          // Before whatever is at the position, and out of the way of the block\n          // cursor, which also lives at the start of a line.\n          side: -1,\n          key: `vim-line-${value}`,\n          // Readable without rendering the widget, which is what lets a test ask\n          // \"which number is at this position\" of the model rather than the DOM.\n          number: value,\n        }),\n      )\n    }\n    line = nextLine(doc, line)\n  }\n  return DecorationSet.create(doc, decorations)\n}\n","/**\n * The grammar.\n *\n * `normalizeKey` decides which browser events Vim is allowed to see at all, and\n * `reduceKey` is a pure state machine over those: state in, state plus an\n * optional `Action` out. No editor, no DOM, no timers — pending input persists\n * until it resolves, is cancelled with Escape, or is invalidated, exactly as it\n * does in a terminal. That is what makes `3d2w` behave and what makes the whole\n * grammar a table test.\n */\n\nimport type {\n  Action,\n  CharReason,\n  CountedMotion,\n  FindKind,\n  MotionSpec,\n  OperatorKind,\n  PendingInput,\n  ScrollUnit,\n  TextObjectSpec,\n  VimState,\n} from './types'\nimport { EMPTY_PENDING } from './types'\n\nexport interface KeyInput {\n  key: string\n  ctrl: boolean\n}\n\nexport interface ReduceResult {\n  state: VimState\n  action: Action | null\n  /** False means \"we did not claim this key\" — the browser gets it back. */\n  handled: boolean\n}\n\n/** A count nobody meant to type. Vim's own limit is far higher; this is a guard. */\nconst MAX_COUNT = 10000\n\n/**\n * The second key of a text object.\n *\n * `b` and `B` are Vim's aliases for the round and curly pairs, and a closer\n * names the same pair its opener does — `di)` and `di(` are one command.\n */\nconst TEXT_OBJECTS: Record<string, TextObjectSpec> = {\n  w: { kind: 'word', big: false, around: false },\n  W: { kind: 'word', big: true, around: false },\n  '\"': { kind: 'quote', quote: '\"', around: false },\n  \"'\": { kind: 'quote', quote: \"'\", around: false },\n  '`': { kind: 'quote', quote: '`', around: false },\n  '(': { kind: 'pair', open: '(', around: false },\n  ')': { kind: 'pair', open: '(', around: false },\n  b: { kind: 'pair', open: '(', around: false },\n  '[': { kind: 'pair', open: '[', around: false },\n  ']': { kind: 'pair', open: '[', around: false },\n  '{': { kind: 'pair', open: '{', around: false },\n  '}': { kind: 'pair', open: '{', around: false },\n  B: { kind: 'pair', open: '{', around: false },\n}\n\n/** Marks are lowercase letters. Uppercase file marks have no meaning here. */\nconst MARK_NAMES = /^[a-z]$/\n/** Plus the two that mean \"back where I jumped from\". */\nconst GOTO_MARK_NAMES = /^[a-z`']$/\n/**\n * Register names: the letters, the yank and delete history, the black hole, and\n * the two spellings of the system clipboard.\n */\nconst REGISTER_NAMES = /^[a-zA-Z0-9_+*\"]$/\n\n/**\n * The scroll family: the page moves, the cursor stays. Counts multiply.\n *\n * Claiming these is not only about having them. `Ctrl-D` and `Ctrl-K` in a\n * contenteditable are macOS's *forward-delete* and *kill-line*, so a modal mode\n * that leaves them unclaimed is a mode in which the platform edits the document\n * behind the mode's back.\n */\nconst SCROLL_KEYS: Record<string, { unit: ScrollUnit; direction: 1 | -1 }> = {\n  e: { unit: 'line', direction: 1 },\n  y: { unit: 'line', direction: -1 },\n  d: { unit: 'half', direction: 1 },\n  u: { unit: 'half', direction: -1 },\n  f: { unit: 'page', direction: 1 },\n  b: { unit: 'page', direction: -1 },\n}\n\n/**\n * The two chords Vim treats as Escape.\n *\n * `Ctrl-[` is Escape's ancestor and still the way half of Vim's users leave\n * INSERT. `Ctrl-C` is close but not identical in Vim — Pasty's is an\n * approximation, deliberately, because reproducing the differences would be\n * reproducing accidents. It also settles the Windows question: in a modal mode\n * where `y` is copy, `Ctrl-C` is far more likely to mean \"get me out of here\".\n */\nconst CTRL_ESCAPES = new Set(['[', 'c'])\n\n/**\n * Named keys with a Vim meaning. Arrows, Backspace and Space are the aliases\n * Vim itself provides; the rest are spelled out so the reducer only ever sees\n * single tokens.\n */\nconst NAMED: Record<string, string> = {\n  Escape: '<Esc>',\n  Enter: '<CR>',\n  Tab: '<Tab>',\n  Backspace: 'h',\n  ArrowLeft: 'h',\n  ArrowRight: 'l',\n  ArrowUp: 'k',\n  ArrowDown: 'j',\n  ' ': 'l',\n}\n\n/** Macro names are lowercase letters, like marks. */\nconst MACRO_NAMES = /^[a-z]$/\n\n/**\n * The browser event, as a Vim key — or null when Vim must not interfere.\n *\n * Returning null is the load-bearing case: ⌘K, ⌘Z, ⌘V and ⌥-anything have to\n * reach the application and the platform untouched, and an input method\n * composing a word must never have a keystroke stolen mid-syllable.\n *\n * Ctrl is the exception, and deliberately so. Those chords are passed on to the\n * reducer, which owns them in the modal modes and returns them in INSERT —\n * because an unclaimed `Ctrl-D` in a contenteditable is macOS's forward-delete,\n * and a mode that says NORMAL while the platform deletes text is worse than a\n * missing command.\n */\nexport function normalizeKey(event: KeyboardEvent): KeyInput | null {\n  if (event.metaKey || event.altKey) {\n    return null\n  }\n  const key = event.key\n  // Shift, Control, CapsLock and friends: half of a chord, never a command.\n  if (key.length > 1 && (key === 'Shift' || key === 'Control' || key === 'Alt' || key === 'Meta')) {\n    return null\n  }\n  if (event.ctrlKey) {\n    const lower = key.toLowerCase()\n    // Escape's two aliases arrive as Escape, so INSERT gets them for free —\n    // `reduceKey`'s insert branch already claims exactly one key.\n    if (CTRL_ESCAPES.has(lower)) {\n      return { key: '<Esc>', ctrl: false }\n    }\n    // Every other Ctrl chord is offered to the reducer, which claims it in the\n    // modal modes and hands it back in INSERT. `normalizeKey` cannot make that\n    // decision itself: it does not know the mode, and the answer depends on it.\n    return { key: lower, ctrl: true }\n  }\n  const named = NAMED[key]\n  if (named) {\n    return { key: named, ctrl: false }\n  }\n  // Function keys, Home, PageDown, dead keys: no Vim meaning, and the browser's\n  // behaviour is better than swallowing them.\n  return key.length === 1 ? { key, ctrl: false } : null\n}\n\n// ---------------------------------------------------------------------------\n// the reducer\n// ---------------------------------------------------------------------------\n\nconst MOTIONS: Record<string, MotionSpec> = {\n  h: { kind: 'left' },\n  l: { kind: 'right' },\n  j: { kind: 'down' },\n  k: { kind: 'up' },\n  w: { kind: 'wordForward' },\n  b: { kind: 'wordBack' },\n  e: { kind: 'wordEnd' },\n  // WORD, not word: the same scanner with punctuation folded into the run.\n  W: { kind: 'wordForward', big: true },\n  B: { kind: 'wordBack', big: true },\n  E: { kind: 'wordEnd', big: true },\n  '0': { kind: 'lineStart' },\n  '^': { kind: 'lineFirstNonBlank' },\n  $: { kind: 'lineEnd' },\n  G: { kind: 'documentEnd' },\n  n: { kind: 'searchNext' },\n  N: { kind: 'searchPrev' },\n  '}': { kind: 'blockForward' },\n  '{': { kind: 'blockBack' },\n  '%': { kind: 'matchPair' },\n  ';': { kind: 'repeatFind' },\n  ',': { kind: 'repeatFind', reverse: true },\n}\n\n/** The four keys that take a character and go looking for it. */\nconst FIND_KEYS = new Set<FindKind>(['f', 'F', 't', 'T'])\n\n/**\n * The `g` table.\n *\n * `gj`, `gk`, `g0` and `g$` are screen-line commands and Pasty has no screen\n * lines; `gu`, `gU` and `g~` are case operators that are not in scope. All of\n * them fall through to the consumed-and-reset default below rather than to a\n * letter in the document.\n */\nconst G_MOTIONS: Record<string, MotionSpec> = {\n  g: { kind: 'documentStart' },\n  e: { kind: 'wordEndBack' },\n  E: { kind: 'wordEndBack', big: true },\n  _: { kind: 'lastNonBlank' },\n}\n\nconst OPERATORS: Record<string, OperatorKind> = {\n  d: 'd',\n  c: 'c',\n  y: 'y',\n  '>': '>',\n  '<': '<',\n}\n\nfunction clampCount(value: number): number {\n  return Math.min(value, MAX_COUNT)\n}\n\nfunction extendCount(current: number | null, digit: string): number {\n  return clampCount((current ?? 0) * 10 + Number(digit))\n}\n\nfunction withPending(state: VimState, pending: Partial<PendingInput>): VimState {\n  return { ...state, pending: { ...state.pending, ...pending } }\n}\n\n/** Drop half-typed input without touching the mode. */\nfunction reset(state: VimState): VimState {\n  return { ...state, pending: { ...EMPTY_PENDING } }\n}\n\nfunction consumed(state: VimState): ReduceResult {\n  return { state: reset(state), action: null, handled: true }\n}\n\nfunction emit(state: VimState, action: Action): ReduceResult {\n  return { state: reset(state), action, handled: true }\n}\n\nfunction motionFor(pending: PendingInput, spec: MotionSpec): CountedMotion {\n  const count = clampCount((pending.opCount ?? 1) * (pending.count ?? 1))\n  return {\n    spec,\n    count,\n    countGiven: pending.opCount !== null || pending.count !== null,\n  }\n}\n\nfunction awaitChar(state: VimState, reason: CharReason): ReduceResult {\n  return {\n    state: withPending(state, { awaiting: { kind: 'char', reason } }),\n    action: null,\n    handled: true,\n  }\n}\n\n/**\n * One key against the machine.\n *\n * The order of the branches below *is* the grammar's precedence, and it is the\n * order Vim documents: a pending replace-character eats the next key whatever it\n * is, digits build counts before they mean anything else, and `0` is only a\n * motion when no count is being typed.\n */\nexport function reduceKey(state: VimState, input: KeyInput): ReduceResult {\n  if (!state.enabled) {\n    return { state, action: null, handled: false }\n  }\n\n  const { key, ctrl } = input\n  const { pending, mode } = state\n\n  // --- INSERT: one key belongs to us, the rest to the document -------------\n  if (mode === 'insert') {\n    if (key === '<Esc>' && !ctrl) {\n      return { state: { ...reset(state), mode: 'normal', goal: null }, action: { kind: 'exitInsert' }, handled: true }\n    }\n    return { state, action: null, handled: false }\n  }\n\n  const visual = mode === 'visual' || mode === 'visualLine'\n\n  // --- a key that was promised to a previous key ---------------------------\n  if (pending.awaiting?.kind === 'char') {\n    if (key === '<Esc>' || ctrl) {\n      return consumed(state)\n    }\n    // `r<CR>` splits the line in Vim. Pasty has no line splitting outside\n    // insert mode yet, so it is a no-op rather than a wrong guess.\n    if (key.length > 1) {\n      return consumed(state)\n    }\n    const reason = pending.awaiting.reason\n    if (reason === 'register') {\n      // Not a command yet: the name is banked and the command follows.\n      return REGISTER_NAMES.test(key)\n        ? {\n            state: withPending(state, { awaiting: null, register: key }),\n            action: null,\n            handled: true,\n          }\n        : consumed(state)\n    }\n    if (reason === 'macroRecord') {\n      return MACRO_NAMES.test(key)\n        ? emit(state, { kind: 'startRecording', register: key })\n        : consumed(state)\n    }\n    if (reason === 'macroPlay') {\n      // `@@` replays whichever macro ran last, which is the one people press.\n      const count = clampCount(pending.count ?? 1)\n      return MACRO_NAMES.test(key) || key === '@'\n        ? emit(state, { kind: 'playMacro', register: key, count })\n        : consumed(state)\n    }\n    if (reason === 'find') {\n      const kind = pending.awaiting.find\n      return kind\n        ? emit(state, motionAction(state, motionFor(pending, { kind: 'findChar', find: { kind, char: key } })))\n        : consumed(state)\n    }\n    if (reason === 'setMark') {\n      return MARK_NAMES.test(key) ? emit(state, { kind: 'setMark', mark: key }) : consumed(state)\n    }\n    if (reason === 'markExact' || reason === 'markLine') {\n      const kind = reason === 'markExact' ? 'markExact' : 'markLine'\n      return GOTO_MARK_NAMES.test(key)\n        ? emit(state, motionAction(state, motionFor(pending, { kind, mark: key })))\n        : consumed(state)\n    }\n    const count = clampCount((pending.opCount ?? 1) * (pending.count ?? 1))\n    return emit(state, { kind: 'replaceChar', char: key, count })\n  }\n\n  // --- the second half of a text object ------------------------------------\n  if (pending.awaiting?.kind === 'textobject') {\n    const object = TEXT_OBJECTS[key]\n    if (!object) {\n      return consumed(state)\n    }\n    const around = pending.awaiting.around\n    const spec = { ...object, around }\n    const count = clampCount((pending.opCount ?? 1) * (pending.count ?? 1))\n    if (pending.operator) {\n      return emit(state, {\n        kind: 'operatorObject',\n        operator: pending.operator,\n        object: spec,\n        count,\n        register: pending.register,\n      })\n    }\n    return emit(state, { kind: 'visualObject', object: spec, count })\n  }\n\n  if (pending.awaiting?.kind === 'g') {\n    const motion = G_MOTIONS[key]\n    if (motion) {\n      return emit(state, motionAction(state, motionFor(pending, motion)))\n    }\n    // `gi` and `gv` are commands, not motions, so an operator in front of them\n    // is not a command at all — `dgi` abandons, like `dy` does.\n    if (!pending.operator && !visual && key === 'i') {\n      return { state: { ...reset(state), mode: 'insert', goal: null }, action: { kind: 'enterInsert', where: 'gi' }, handled: true }\n    }\n    if (!pending.operator && key === 'v') {\n      return emit(state, { kind: 'reselectVisual' })\n    }\n    // gj, gk, g0, g$, gu, gU: screen-line and case commands Pasty does not\n    // implement. Consumed, so none of them leak a letter into the document.\n    return consumed(state)\n  }\n\n  // --- counts ---------------------------------------------------------------\n  if (key >= '1' && key <= '9' && !ctrl) {\n    return {\n      state: withPending(state, { count: extendCount(pending.count, key) }),\n      action: null,\n      handled: true,\n    }\n  }\n  if (key === '0' && !ctrl && pending.count !== null) {\n    return {\n      state: withPending(state, { count: extendCount(pending.count, key) }),\n      action: null,\n      handled: true,\n    }\n  }\n\n  // --- escape ---------------------------------------------------------------\n  if (key === '<Esc>') {\n    if (visual) {\n      return {\n        state: { ...reset(state), mode: 'normal', visualAnchor: null },\n        action: { kind: 'collapseVisual' },\n        handled: true,\n      }\n    }\n    return consumed(state)\n  }\n\n  // --- Ctrl chords, in a modal mode ----------------------------------------\n  // Every one of them has an owner here: implemented, answered, or swallowed.\n  // Nothing falls through, because what it would fall through to is the\n  // platform's own text editing.\n  if (ctrl) {\n    if (key === 'r') {\n      return emit(state, { kind: 'redo' })\n    }\n    const scroll = SCROLL_KEYS[key]\n    if (scroll) {\n      // A viewport side effect, so it neither takes an operator nor leaves one\n      // pending: `d<C-e>` scrolls and abandons the `d`, which is as close to\n      // Vim's \"that is not a motion\" as this engine gets.\n      return emit(state, { ...scroll, kind: 'scroll', count: clampCount(pending.count ?? 1) })\n    }\n    if (key === 'v') {\n      // Visual Block, which has no honest representation in a tree. Said out\n      // loud rather than ignored — silence here reads as a bug.\n      return emit(state, { kind: 'unsupported', what: 'visualBlock' })\n    }\n    return consumed(state)\n  }\n\n  // --- operators ------------------------------------------------------------\n  if (visual) {\n    const visualOperator = OPERATORS[key] ?? (key === 'x' ? 'd' : key === 's' ? 'c' : null)\n    if (visualOperator) {\n      return {\n        state: { ...reset(state), mode: 'normal', visualAnchor: null, goal: null },\n        action: { kind: 'visualOperator', operator: visualOperator, register: pending.register },\n        handled: true,\n      }\n    }\n  } else if (OPERATORS[key]) {\n    const operator = OPERATORS[key]\n    if (pending.operator === operator) {\n      // `dd`, `cc`, `yy` — the operator applied to whole lines.\n      const count = clampCount((pending.opCount ?? 1) * (pending.count ?? 1))\n      return emit(state, { kind: 'operatorLines', operator, count, register: pending.register })\n    }\n    if (pending.operator) {\n      // `dy` and friends: not a command, and not a licence to type a letter.\n      return consumed(state)\n    }\n    return {\n      state: withPending(state, { operator, opCount: pending.count, count: null }),\n      action: null,\n      handled: true,\n    }\n  }\n\n  // --- motions --------------------------------------------------------------\n  if (key === 'g') {\n    return { state: withPending(state, { awaiting: { kind: 'g' } }), action: null, handled: true }\n  }\n\n  // The command line. Opening it is a command in itself; what is typed into it\n  // never reaches this reducer, because the bar takes focus away from the editor.\n  if (key === '/' || key === '?' || key === ':') {\n    return emit(state, { kind: 'openCmdline', prefix: key })\n  }\n\n  // `*` and `#`: search for the word under the cursor, without typing it.\n  if (key === '*' || key === '#') {\n    return emit(state, { kind: 'searchWord', direction: key === '*' ? 1 : -1 })\n  }\n\n  // `q` names a macro, or ends the one being recorded — which is why the\n  // recording lives in the engine's state rather than in storage beside the\n  // finished macros. Available from the visual modes as well as NORMAL, as it is\n  // in Vim: the selection is still there afterwards, so starting a recording\n  // around one costs nothing.\n  if (key === 'q' && !pending.operator) {\n    return state.recording\n      ? emit(state, { kind: 'stopRecording' })\n      : awaitChar(state, 'macroRecord')\n  }\n  // `@` stays out of the visual modes. Replaying a sequence recorded elsewhere\n  // into a live selection means guessing which of the two the commands were\n  // meant for, and a wrong guess deletes text nobody pointed at.\n  if (key === '@' && !pending.operator && !visual) {\n    return awaitChar(state, 'macroPlay')\n  }\n\n  // `f`, `F`, `t`, `T`: the character to find arrives next.\n  if (FIND_KEYS.has(key as FindKind)) {\n    return {\n      state: withPending(state, { awaiting: { kind: 'char', reason: 'find', find: key as FindKind } }),\n      action: null,\n      handled: true,\n    }\n  }\n\n  // `\"x` names the register the next command will use.\n  if (key === '\"') {\n    return awaitChar(state, 'register')\n  }\n\n  // Marks. `m` names one; the two jump keys take the same names plus `` ` `` and\n  // `'` themselves, which mean \"where I was before the last jump\".\n  if (key === 'm' && !pending.operator && !visual) {\n    return awaitChar(state, 'setMark')\n  }\n  if (key === '`') {\n    return awaitChar(state, 'markExact')\n  }\n  if (key === \"'\") {\n    return awaitChar(state, 'markLine')\n  }\n\n  const motion = MOTIONS[key]\n  if (motion) {\n    return emit(state, motionAction(state, motionFor(pending, motion)))\n  }\n\n  // --- text objects ---------------------------------------------------------\n  // `i` and `a` only mean \"inner\" and \"around\" when there is something to apply\n  // them to. In plain NORMAL they are still insert commands, which is why this\n  // sits between the motions and the operator-abandon guard below.\n  if ((pending.operator || visual) && (key === 'i' || key === 'a')) {\n    return {\n      state: withPending(state, { awaiting: { kind: 'textobject', around: key === 'a' } }),\n      action: null,\n      handled: true,\n    }\n  }\n\n  // --- everything an operator cannot take -----------------------------------\n  // `dp` is not \"delete, then paste\": an operator waiting for a motion that\n  // never comes is abandoned, and the key that abandoned it goes with it.\n  if (pending.operator) {\n    return consumed(state)\n  }\n\n  const count = clampCount(pending.count ?? 1)\n\n  switch (key) {\n    // `x`, `X` and `s` are `dl`, `dh` and `cl` — lowered here so they fill the\n    // register and take counts without a second implementation.\n    case 'x':\n      return emit(state, deleteOver(pending, 'd', 'right'))\n    case 'X':\n      return emit(state, deleteOver(pending, 'd', 'left'))\n    case 's':\n      return emit(state, deleteOver(pending, 'c', 'right'))\n    case 'i':\n      return visual ? consumed(state) : insertAction(state, 'i')\n    case 'a':\n      return visual ? consumed(state) : insertAction(state, 'a')\n    case 'I':\n      return visual ? consumed(state) : insertAction(state, 'I')\n    case 'A':\n      return visual ? consumed(state) : insertAction(state, 'A')\n    case 'o':\n      return visual ? consumed(state) : openLineAction(state, true)\n    case 'O':\n      return visual ? consumed(state) : openLineAction(state, false)\n    case 'r':\n      return awaitChar(state, 'r')\n    case 'J':\n      return emit(state, { kind: 'join', count })\n    // `D` and `C` are `d$` and `c$`. `Y` is `yy` rather than `y$` — Vim's own\n    // inconsistency, kept because people's fingers have it.\n    case 'D':\n      return emit(state, deleteOver(pending, 'd', 'lineEnd'))\n    case 'C':\n      return emit(state, deleteOver(pending, 'c', 'lineEnd'))\n    case 'Y':\n      return emit(state, { kind: 'operatorLines', operator: 'y', count, register: pending.register })\n    case '~':\n      return emit(state, { kind: 'toggleCase', count })\n    // A count on `.` replaces the recorded one, rather than multiplying it:\n    // `3.` after `2dw` is `3dw`, which is what Vim does and what people expect.\n    case '.':\n      return emit(state, { kind: 'repeat', count: pending.count })\n    case 'u':\n      return emit(state, { kind: 'undo' })\n    case 'p':\n      return emit(state, { kind: 'paste', after: true, count, register: pending.register })\n    case 'P':\n      return emit(state, { kind: 'paste', after: false, count, register: pending.register })\n    case 'v':\n      return enterVisual(state, false)\n    case 'V':\n      return enterVisual(state, true)\n    default:\n      // RESERVED and unknown alike: consumed. In a modal editor an unrecognised\n      // key must do nothing, never type itself.\n      return consumed(state)\n  }\n}\n\nfunction motionAction(state: VimState, motion: CountedMotion): Action {\n  return state.pending.operator\n    ? {\n        kind: 'operator',\n        operator: state.pending.operator,\n        motion,\n        register: state.pending.register,\n      }\n    : { kind: 'motion', motion }\n}\n\nfunction deleteOver(\n  pending: PendingInput,\n  operator: OperatorKind,\n  kind: MotionSpec['kind'],\n): Action {\n  return {\n    kind: 'operator',\n    operator,\n    motion: { spec: { kind }, count: clampCount(pending.count ?? 1), countGiven: true },\n    register: pending.register,\n  }\n}\n\nfunction insertAction(state: VimState, where: 'i' | 'a' | 'I' | 'A'): ReduceResult {\n  return {\n    state: { ...reset(state), mode: 'insert', goal: null },\n    action: { kind: 'enterInsert', where },\n    handled: true,\n  }\n}\n\nfunction openLineAction(state: VimState, below: boolean): ReduceResult {\n  return {\n    state: { ...reset(state), mode: 'insert', goal: null },\n    action: { kind: 'openLine', below },\n    handled: true,\n  }\n}\n\nfunction enterVisual(state: VimState, line: boolean): ReduceResult {\n  const target: VimState['mode'] = line ? 'visualLine' : 'visual'\n  // Pressing the mode's own key again leaves it, the way it does in Vim.\n  if (state.mode === target) {\n    return {\n      state: { ...reset(state), mode: 'normal', visualAnchor: null },\n      action: { kind: 'collapseVisual' },\n      handled: true,\n    }\n  }\n  return {\n    state: { ...reset(state), mode: target },\n    action: { kind: 'enterVisual', line },\n    handled: true,\n  }\n}\n","/**\n * Macros.\n *\n * A macro here is a list of *resolved commands*, not a list of keystrokes. That\n * is the same decision `.` makes and it buys the same things: replaying `dw`\n * re-resolves the motion against wherever the cursor now is, nothing recorded is\n * a document position that could go stale, and an application shortcut is\n * structurally unrecordable — ⌘K never reaches this engine, so it can never end\n * up in a macro.\n *\n * Two rules keep replay from being a way to hang the editor or to produce a\n * result nobody can explain:\n *\n *   - **A command that fails stops the macro.** Vim's rule, and what makes\n *     `@@@@@@` terminate at the end of a document instead of running the last\n *     command over and over. Failure is *reported* by the command rather than\n *     inferred from whether the cursor moved: `0` in column 1 went exactly where\n *     it was asked and a macro that starts with it must not stop, while `j` on\n *     the last line could not, and one that ends with it must.\n *   - **Clipboard puts are not recorded at all.** `\"+p` completes asynchronously,\n *     after a permission prompt this code cannot see the answer to, and at the\n *     selection as it is *then*. A macro containing one would be a sequence that\n *     sometimes runs out of order — so it is left out, and the user is told.\n *\n * The replay loop lives here rather than in `operators.ts` on purpose: it calls\n * `execute`, and `execute` must not call it back.\n */\n\nimport type { EditorView } from '@tiptap/pm/view'\n\nimport { vimPluginKey } from './key'\nimport { execute, type ExecuteDeps } from './operators'\nimport { EMPTY_PENDING, type MacroItem, type VimState } from './types'\n\n/** A macro calling a macro calling a macro. Ten is far past useful. */\nconst MAX_DEPTH = 10\n/** Items per top-level `@`, counting everything nested inside it. */\nconst MAX_ITEMS = 10_000\n\nexport interface MacroDeps extends ExecuteDeps {\n  macros: () => Map<string, MacroItem[]>\n  lastPlayed: () => string | null\n  setLastPlayed: (register: string) => void\n  depth: () => number\n  setDepth: (depth: number) => void\n}\n\n/**\n * The state the executor should see for a replayed action.\n *\n * The mode comes off the recorded item, which is the mode the grammar was\n * actually left in when the action was emitted — so nothing here re-derives a\n * transition the reducer already made.\n */\nfunction stateFor(current: VimState, item: Extract<MacroItem, { kind: 'action' }>): VimState {\n  return { ...current, mode: item.mode, pending: { ...EMPTY_PENDING } }\n}\n\nexport function playMacro(\n  view: EditorView,\n  deps: MacroDeps,\n  register: string,\n  count: number,\n): void {\n  const name = register === '@' ? deps.lastPlayed() : register\n  if (!name) {\n    return\n  }\n  const items = deps.macros().get(name)\n  if (!items || items.length === 0) {\n    return\n  }\n  if (deps.depth() >= MAX_DEPTH) {\n    return\n  }\n\n  deps.setLastPlayed(name)\n  deps.setDepth(deps.depth() + 1)\n  try {\n    let budget = MAX_ITEMS\n    for (let round = 0; round < count; round++) {\n      for (const item of items) {\n        if (budget-- <= 0) {\n          return\n        }\n        if (!runItem(view, deps, item)) {\n          return\n        }\n      }\n    }\n  } finally {\n    deps.setDepth(deps.depth() - 1)\n  }\n}\n\n/** False means the macro should stop here. */\nfunction runItem(view: EditorView, deps: MacroDeps, item: MacroItem): boolean {\n  const current = vimPluginKey.getState(view.state)\n  if (!current?.enabled) {\n    return false\n  }\n\n  if (item.kind === 'insert') {\n    // The typing goes back in as the *slice* it was captured from, not as flat\n    // text: what was typed may have split a paragraph or started a list item,\n    // and `insertText` would replay that as one run-on line. Through the same\n    // commit the executors use, so replayed typing obeys the same viewport rule\n    // as everything else — it sets no selection of its own, so it asks for no\n    // scroll, and a jump earlier in the macro has already asked.\n    const tr = view.state.tr\n    tr.replaceSelection(item.typed)\n    deps.commit(tr, { ...current, mode: 'insert' })\n    return true\n  }\n\n  if (item.kind === 'search') {\n    // Anything but a hit stops the macro, exactly as a failed command does.\n    return deps.search(item.query, item.direction) === 'ok'\n  }\n\n  // A macro playing a macro: straight back into the loop, depth-guarded above.\n  if (item.action.kind === 'playMacro') {\n    playMacro(view, deps, item.action.register, item.action.count)\n    return true\n  }\n\n  return execute(view, item.action, current, stateFor(current, item), deps) !== 'failed'\n}\n","/**\n * The ProseMirror plugin: a thin shell around the pure modules.\n *\n * Everything hard happens elsewhere. This file owns three things the pure code\n * cannot: where the state lives, which browser events Vim is allowed to claim,\n * and the promise that *every* mode change arrives as a transaction — including\n * the ones that change nothing else, because the mode indicator and the rest of\n * the chrome repaint off `onTransaction`.\n *\n * Key handling lives in the plugin's `props.handleKeyDown` rather than in\n * `createEditor`'s `editorProps`, so the unit suite's `makeEditor` — which\n * builds an editor from `buildExtensions()` and nothing else — exercises exactly\n * the dispatch path that ships.\n */\n\nimport { Plugin, TextSelection, type EditorState, type Transaction } from '@tiptap/pm/state'\nimport { ySyncPluginKey } from '@tiptap/y-tiptap'\nimport { CellSelection } from '@tiptap/pm/tables'\nimport { DecorationSet, type EditorView } from '@tiptap/pm/view'\n\nimport { cursorDecorations } from './cursor'\nimport { noteVerdict, verdictForAction } from './debug'\nimport { lineNumberDecorations } from './gutter'\nimport { vimPluginKey } from './key'\nimport { normalizeKey, reduceKey } from './keys'\nimport { clampToLine, lineAt } from './lines'\nimport { playMacro, type MacroDeps } from './macro'\nimport { execute, executeSearch, followSelection, renderVisual, type SaveHook } from './operators'\nimport type { RegisterFile } from './registers'\nimport type { CmdlineHost } from './cmdline'\nimport type { MacroItem, RepeatRecord, VimState, VimStatus } from './types'\nimport { EMPTY_PENDING } from './types'\n\nexport { vimPluginKey }\n\nexport interface VimStorage {\n  registers: RegisterFile\n  listeners: Set<(status: VimStatus) => void>\n  /**\n   * The last change, for `.`. In storage rather than plugin state because it\n   * holds no document positions: nothing in it needs mapping, and it should\n   * outlive an enable/disable cycle the way the registers do.\n   */\n  repeat: RepeatRecord | null\n  /** Finished macros, by register. Like the registers, these outlive a toggle. */\n  macros: Map<string, MacroItem[]>\n  /** What `@@` replays. */\n  lastPlayed: string | null\n  /** How deep a macro is currently calling other macros. */\n  replayDepth: number\n  /**\n   * The command-line bar, once the chrome has registered one. Null in tests and\n   * in any host that has not called `installVimChrome` — every command that uses\n   * the bar also has a direct entry point that does not.\n   */\n  cmdline: CmdlineHost | null\n  /**\n   * The application's save pipeline, for `:w`. Null in tests and in any host\n   * that never registered one — `:w` is then a quiet no-op rather than a lie.\n   */\n  save: SaveHook | null\n}\n\ninterface VimMeta {\n  state: VimState\n}\n\nexport function initialVimState(enabled = false): VimState {\n  return {\n    enabled,\n    mode: 'normal',\n    pending: { ...EMPTY_PENDING },\n    visualAnchor: null,\n    visualHead: null,\n    goal: null,\n    marks: {},\n    lastJump: null,\n    lastInsertEnd: null,\n    lastVisual: null,\n    insertRun: null,\n    search: null,\n    lastFind: null,\n    recording: null,\n    gutter: null,\n  }\n}\n\nexport function statusOf(state: VimState): VimStatus {\n  return {\n    enabled: state.enabled,\n    mode: state.mode,\n    recording: state.recording?.register ?? null,\n  }\n}\n\nfunction mapMaybe(position: number | null, tr: Transaction): number | null {\n  return position === null ? null : tr.mapping.map(position)\n}\n\n/**\n * Carry every remembered position through a change.\n *\n * Marks, the jump origin, where INSERT was left and the last visual selection\n * are all document positions, and a stale position is how a later command\n * deletes the wrong thing. They are mapped on *every* doc change, whoever made\n * it — a mark on text that moves follows it, and a mark on text that is deleted\n * collapses to where it was rather than dangling past the end.\n *\n * The insert run is deliberately absent. Every other field here is *inherited*\n * from before the command and so still speaks the old document's coordinates;\n * the run is computed against the new one by whoever set it, and mapping it a\n * second time would move it twice.\n */\nfunction mapPositions(value: VimState, tr: Transaction): VimState {\n  const marks: Record<string, number> = {}\n  for (const [name, at] of Object.entries(value.marks)) {\n    marks[name] = tr.mapping.map(at)\n  }\n  return {\n    ...value,\n    marks,\n    visualAnchor: mapMaybe(value.visualAnchor, tr),\n    visualHead: mapMaybe(value.visualHead, tr),\n    lastJump: mapMaybe(value.lastJump, tr),\n    lastInsertEnd: mapMaybe(value.lastInsertEnd, tr),\n    lastVisual: value.lastVisual\n      ? {\n          ...value.lastVisual,\n          anchor: tr.mapping.map(value.lastVisual.anchor),\n          head: tr.mapping.map(value.lastVisual.head),\n        }\n      : null,\n  }\n}\n\n/**\n * Follow what is being typed, so `.` can type it again.\n *\n * The rule is contiguity: everything since INSERT began has to be one stretch\n * growing from where it began. Mapping the run's end forward and comparing it\n * with where the caret actually landed is what detects that in one line —\n * a typed character or a backspace at the end agree, an edit anywhere else does\n * not, and the capture is dropped rather than becoming wrong.\n */\nfunction trackInsert(\n  run: VimState['insertRun'],\n  tr: Transaction,\n  newState: EditorState,\n): VimState['insertRun'] {\n  if (!run) {\n    return null\n  }\n  const from = tr.mapping.map(run.from, -1)\n  const to = tr.mapping.map(run.to, 1)\n  const head = newState.selection.head\n  return head === to && head >= from ? { from, to: head } : null\n}\n\n/**\n * Move an insert run through somebody else's edit.\n *\n * `trackInsert` above asks \"is the caret still at the end of what I am typing?\",\n * which is the right question for a local change and the wrong one for a remote\n * one: a collaborator typing elsewhere does not move this caret, so that check\n * would drop a capture that is still perfectly good. Here the run is simply\n * carried forward.\n */\nfunction mapInsertRun(run: VimState['insertRun'], tr: Transaction): VimState['insertRun'] {\n  if (!run) {\n    return null\n  }\n  return { from: tr.mapping.map(run.from, -1), to: tr.mapping.map(run.to, 1) }\n}\n\n/** Where the NORMAL cursor may rest on the line holding `pos`. */\nfunction clampHead(state: EditorState, pos: number): number {\n  const line = lineAt(state.doc, pos)\n  if (!line) {\n    return pos\n  }\n  return Math.max(line.from, Math.min(pos, clampToLine(line)))\n}\n\n/**\n * Turn Vim on or off. Idempotent, and never lands in INSERT: enabling while the\n * caret sits in the middle of a sentence has to leave the next keystroke meaning\n * a command, or the feature is a trap.\n */\nexport function applyEnabled(view: EditorView, enabled: boolean): void {\n  const current = vimPluginKey.getState(view.state)\n  if (!current || current.enabled === enabled) {\n    return\n  }\n  const tr = view.state.tr\n  const next = initialVimState(enabled)\n  if (enabled) {\n    // A range selection has no meaning in NORMAL; collapse it where the user\n    // left the cursor rather than somewhere they have to go looking for it.\n    const head = clampHead(view.state, view.state.selection.head)\n    if (!view.state.selection.empty || head !== view.state.selection.head) {\n      tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, Math.min(head, tr.doc.content.size)))))\n    }\n  }\n  tr.setMeta(vimPluginKey, { state: next } satisfies VimMeta)\n  // Turning Vim on can move the caret — a range selection collapses to its head,\n  // and the head clamps onto the line. If that lands off screen the very first\n  // command would be typed somewhere the user cannot see.\n  followSelection(tr)\n  view.dispatch(tr)\n}\n\nfunction isVisual(state: VimState): boolean {\n  return state.mode === 'visual' || state.mode === 'visualLine'\n}\n\n/** Whether a key left something half-typed — a count, an operator, a `g`. */\nfunction hasPending(state: VimState): boolean {\n  const { count, opCount, operator, awaiting, register } = state.pending\n  return (\n    count !== null ||\n    opCount !== null ||\n    operator !== null ||\n    awaiting !== null ||\n    register !== null\n  )\n}\n\n/**\n * Everything the executor and the macro player need from the outside.\n *\n * One object, built in one place, so the two can never be handed different\n * registers or a different way of committing a search.\n */\nfunction macroDeps(\n  view: EditorView,\n  storage: VimStorage,\n  dispatch: (tr: Transaction, state: VimState) => void,\n): MacroDeps {\n  return {\n    registers: storage.registers,\n    commit: dispatch,\n    repeat: () => storage.repeat,\n    setRepeat: record => {\n      storage.repeat = record\n    },\n    cmdline: () => storage.cmdline,\n    save: () => storage.save,\n    record: item => {\n      const current = vimPluginKey.getState(view.state)\n      // Never while replaying: a macro that recorded itself would grow every\n      // time it ran.\n      //\n      // Appended in place. The recording is the one piece of engine state that\n      // is mutated rather than replaced, because it is append-only, is never\n      // mapped through a change, and is copied out the moment it is finished.\n      if (current?.recording && storage.replayDepth === 0) {\n        current.recording.items.push(item)\n      }\n    },\n    saveMacro: (register, items) => {\n      storage.macros.set(register, items)\n    },\n    search: (query, direction) => executeSearch(view, query, direction),\n    macros: () => storage.macros,\n    lastPlayed: () => storage.lastPlayed,\n    setLastPlayed: register => {\n      storage.lastPlayed = register\n    },\n    depth: () => storage.replayDepth,\n    setDepth: depth => {\n      storage.replayDepth = depth\n    },\n  }\n}\n\n/**\n * Keep the line numbers in step with the document.\n *\n * Rebuilt rather than mapped, and only when it has to be: inserting a line\n * renumbers every line below it, so there is nothing a mapping could preserve —\n * but a selection-only transaction changes no numbers at all, and rebuilding on\n * every keystroke of a motion would be pure waste.\n */\nfunction withGutter(\n  next: VimState,\n  previous: VimState,\n  tr: Transaction,\n  newState: EditorState,\n): VimState {\n  if (!next.enabled) {\n    return next.gutter ? { ...next, gutter: null } : next\n  }\n  if (tr.docChanged || !previous.enabled || next.gutter === null) {\n    return { ...next, gutter: lineNumberDecorations(newState.doc) }\n  }\n  return next\n}\n\nexport function createVimPlugin(storage: VimStorage): Plugin<VimState> {\n  /**\n   * Set while the editor has lost focus to something else on the page — the\n   * palette, the settings dialog, the link popover.\n   *\n   * Coming back, the browser hands ProseMirror a collapsed selection nobody\n   * asked for, and that arrives looking exactly like a click. A pointer is the\n   * one thing that genuinely ends a visual selection from outside the engine, so\n   * a `mousedown` clears this and everything else is treated as the browser\n   * tidying up after itself — which is what lets ⌘K leave VISUAL intact.\n   *\n   * Not plugin state: it describes the DOM, not the document, and it must not be\n   * mapped, undone or serialized with one.\n   */\n  let restoring = false\n\n  const commit = (view: EditorView) => (tr: Transaction, state: VimState) => {\n    restoring = false\n    tr.setMeta(vimPluginKey, { state } satisfies VimMeta)\n    // Every executor and the macro player go through here, so this is the one\n    // place that has to remember the viewport: a command that moved the cursor\n    // asks the view to follow it. See `followSelection`.\n    followSelection(tr)\n    view.dispatch(tr)\n  }\n\n  /**\n   * The next engine state for one transaction.\n   *\n   * Inside the closure because it reads `restoring`, which describes the DOM\n   * rather than the document and so cannot live in plugin state.\n   */\n  const applyState = (\n    tr: Transaction,\n    value: VimState,\n    oldState: EditorState,\n    newState: EditorState,\n  ): VimState => {\n    const meta = tr.getMeta(vimPluginKey) as VimMeta | undefined\n    if (meta) {\n      // The engine builds its next state against the document as it was, so\n      // a command that also edited the document leaves those positions one\n      // step behind. Mapping here means no executor has to remember to.\n      return tr.docChanged ? mapPositions(meta.state, tr) : meta.state\n    }\n    if (!value.enabled) {\n      return value\n    }\n    if (tr.docChanged && tr.getMeta(ySyncPluginKey)?.isChangeOrigin === true) {\n      // A collaborator typed. Their keystrokes are not a foreign edit *to this\n      // user* — nobody touched this editor — so the branch below would be\n      // wrong: it would clear a half-typed `d2` or an insert run being recorded\n      // for `.` every time somebody else pressed a key. Positions still have to\n      // move, because the document did.\n      return { ...mapPositions(value, tr), insertRun: mapInsertRun(value.insertRun, tr) }\n    }\n    if (tr.docChanged) {\n      // Something outside the engine edited the document — the toolbar, a\n      // paste, an undo from the palette, or, most often, a keystroke in\n      // INSERT. The mode is the user's and stays; half-typed input and a\n      // remembered column are not, and do not.\n      return {\n        ...mapPositions(value, tr),\n        pending: { ...EMPTY_PENDING },\n        goal: null,\n        insertRun: value.mode === 'insert' ? trackInsert(value.insertRun, tr, newState) : null,\n      }\n    }\n    if (tr.selectionSet && !oldState.selection.eq(newState.selection)) {\n      if (restoring && isVisual(value)) {\n        // Focus coming back, not a click: `appendTransaction` below puts the\n        // visual range back rather than letting it evaporate.\n        return { ...value, pending: { ...EMPTY_PENDING }, goal: null }\n      }\n      // A click. The visual selection it replaced is gone, so the mode that\n      // described it has to go too.\n      return {\n        ...value,\n        pending: { ...EMPTY_PENDING },\n        goal: null,\n        mode: value.mode === 'insert' ? 'insert' : 'normal',\n        visualAnchor: null,\n        visualHead: null,\n      }\n    }\n    return value\n  }\n\n  return new Plugin<VimState>({\n    key: vimPluginKey,\n\n    state: {\n      init: () => initialVimState(false),\n\n      apply(tr, value, oldState, newState) {\n        return withGutter(applyState(tr, value, oldState, newState), value, tr, newState)\n      },\n    },\n\n    props: {\n      handleKeyDown(view, event) {\n        const vim = vimPluginKey.getState(view.state)\n        if (!vim?.enabled) {\n          noteVerdict(event, 'passed: vim-disabled')\n          return false\n        }\n        // Mid-composition every keystroke belongs to the input method. Checked\n        // before normalisation so no path can steal one by accident.\n        if (view.composing || event.isComposing) {\n          noteVerdict(event, 'passed: ime-composing')\n          return false\n        }\n        const input = normalizeKey(event)\n        if (!input) {\n          noteVerdict(event, 'passed: modifier-passthrough')\n          return false\n        }\n        const result = reduceKey(vim, input)\n        if (!result.handled) {\n          // Only INSERT declines a key it was offered; every modal mode has an\n          // owner for everything `normalizeKey` lets through.\n          noteVerdict(event, 'passed: insert-mode-native')\n          return false\n        }\n        // What the engine decided, for the opt-in logger in `debug.ts`. Recorded\n        // before the command runs, so a command that throws still leaves a trace\n        // of what it was.\n        noteVerdict(event, verdictForAction(result.action, hasPending(result.state)))\n        const dispatch = commit(view)\n        const deps = macroDeps(view, storage, dispatch)\n        try {\n          if (result.action?.kind === 'playMacro') {\n            // Routed round `execute`, which must not know about the loop that\n            // calls it. Recorded *before* it runs: the replay that follows sets\n            // the depth guard, so the items it plays are not recorded too.\n            dispatch(view.state.tr, result.state)\n            deps.record({ kind: 'action', action: result.action, mode: result.state.mode })\n            playMacro(view, deps, result.action.register, result.action.count)\n          } else if (result.action) {\n            execute(view, result.action, vim, result.state, deps)\n          } else {\n            // A prefix key — `3`, `d`, `g`. Meta only: no steps, no serialization,\n            // and the chrome still learns that something is pending.\n            dispatch(view.state.tr, result.state)\n          }\n        } catch (error) {\n          console.warn('[pasty] Vim input failed', error)\n          dispatch(view.state.tr, { ...vim, pending: { ...EMPTY_PENDING } })\n        }\n        // Always true once claimed: letting a `d` fall through to the browser\n        // would type it into the document, which is the one outcome a modal\n        // editor may never produce.\n        return true\n      },\n\n      /**\n       * Dictation, dead keys and autocorrect can insert text without a keydown\n       * this plugin ever saw. In a modal mode there is no such thing as stray\n       * text, so it is refused rather than merged into the document.\n       */\n      handleTextInput(view) {\n        const vim = vimPluginKey.getState(view.state)\n        return Boolean(vim?.enabled) && vim?.mode !== 'insert'\n      },\n\n      handleDOMEvents: {\n        blur(view) {\n          restoring = true\n          const vim = vimPluginKey.getState(view.state)\n          // The mode is sticky across focus, gvim-style — only the half-typed\n          // command is dropped, so `3d` followed by a click does not later eat a\n          // `w`.\n          if (vim?.enabled && vim.pending.operator !== null) {\n            const tr = view.state.tr\n            tr.setMeta(vimPluginKey, {\n              state: { ...vim, pending: { ...EMPTY_PENDING } },\n            } satisfies VimMeta)\n            view.dispatch(tr)\n          }\n          return false\n        },\n\n        mousedown() {\n          // Whatever selection follows this one is the user's, not the browser's.\n          restoring = false\n          return false\n        },\n      },\n\n      decorations(state) {\n        const vim = vimPluginKey.getState(state)\n        if (!vim?.enabled) {\n          return undefined\n        }\n        const sets = [cursorDecorations(state, vim), vim.search?.highlight ?? null, vim.gutter]\n        const present = sets.filter((set): set is DecorationSet => set !== null)\n        if (present.length <= 1) {\n          return present[0]\n        }\n        return DecorationSet.create(state.doc, present.flatMap(set => set.find()))\n      },\n\n      attributes(state) {\n        const vim = vimPluginKey.getState(state)\n        if (!vim?.enabled) {\n          return {} as Record<string, string>\n        }\n        // `vim-enabled` reserves the gutter's column; `vim-modal` hides the\n        // native caret so the block cursor is the only one on screen.\n        return { class: vim.mode === 'insert' ? 'vim-enabled' : 'vim-enabled vim-modal' }\n      },\n    },\n\n    /**\n     * Put the visual range back after focus has been away.\n     *\n     * Runs on every transaction, but does nothing unless the rendered selection\n     * has drifted from what the engine's anchor and head describe — so a motion\n     * in VISUAL, which already drew the right range, appends nothing.\n     */\n    appendTransaction(_transactions, _oldState, newState) {\n      const vim = vimPluginKey.getState(newState)\n      if (!vim?.enabled || !isVisual(vim) || vim.visualAnchor === null || vim.visualHead === null) {\n        return null\n      }\n      // prosemirror-tables normalises any selection that spans cells into a\n      // CellSelection from its own appendTransaction. Redrawing a TextSelection\n      // over it would be normalised again, and again: two plugins appending\n      // transactions at each other never terminates. The cell selection is the\n      // truthful one, and the operators already branch on it.\n      if (newState.selection instanceof CellSelection) {\n        return null\n      }\n      const tr = newState.tr\n      renderVisual(tr, vim)\n      if (!tr.selectionSet || tr.selection.eq(newState.selection)) {\n        return null\n      }\n      restoring = false\n      tr.setMeta(vimPluginKey, { state: vim } satisfies VimMeta)\n      return tr\n    },\n\n    view() {\n      let last: VimStatus | null = null\n      return {\n        update(view) {\n          const vim = vimPluginKey.getState(view.state)\n          if (!vim) {\n            return\n          }\n          const status = statusOf(vim)\n          if (\n            last &&\n            last.enabled === status.enabled &&\n            last.mode === status.mode &&\n            last.recording === status.recording\n          ) {\n            return\n          }\n          last = status\n          for (const listener of storage.listeners) {\n            listener(status)\n          }\n        },\n      }\n    },\n  })\n}\n","/**\n * The Tiptap extension.\n *\n * Always installed, never conditional. `buildExtensions()` stays deterministic —\n * the round-trip suite and the schema guard build the same editor the app does —\n * and the preference is a flag in plugin state rather than an extension that\n * comes and goes. Toggling is then instantaneous, keeps the undo history, and\n * cannot leave the editor in a half-rebuilt state.\n *\n * Registered last, so its `handleKeyDown` runs before the other extensions'\n * keymaps. Modifier chords fall straight through it (see `normalizeKey`), which\n * is why ⌘K, ⌘Z and `Mod-Shift-K` keep working in NORMAL.\n */\n\nimport { Extension } from '@tiptap/core'\n\nimport { Slice } from '@tiptap/pm/model'\n\nimport { writeClipboardText } from '../clipboard'\nimport { parseMarkdown, serializeSelection } from '../markdown'\nimport { createVimPlugin, type VimStorage } from './plugin'\nimport { RegisterFile } from './registers'\n\nexport const VimExtension = Extension.create<Record<string, never>, VimStorage>({\n  name: 'vim',\n\n  addStorage() {\n    // Storage, not plugin state: registers outlive an enable/disable cycle, and\n    // the status listeners have to survive one too.\n    return {\n      registers: new RegisterFile(),\n      listeners: new Set(),\n      repeat: null,\n      cmdline: null,\n      save: null,\n      macros: new Map(),\n      lastPlayed: null,\n      replayDepth: 0,\n    }\n  },\n\n  addProseMirrorPlugins() {\n    // The one place the engine reaches the outside world. `\"+y` has to put the\n    // same Markdown on the clipboard that ⌘C does, so it goes through the same\n    // serializer and the same write path rather than a second implementation.\n    //\n    // Here rather than in `onCreate`, which Tiptap emits on a timeout: the\n    // bridge has to exist before the first keystroke, not before the first tick.\n    const editor = this.editor\n    this.storage.registers.useClipboard({\n      write: entry => {\n        const text = serializeSelection(editor, entry.slice)\n        void writeClipboardText(entry.linewise ? `${text}\\n` : text).then(written => {\n          if (!written) {\n            console.warn('[pasty] Could not write to the system clipboard.')\n          }\n        })\n      },\n\n      // Read through the same Markdown parser ⌘V uses, so `\"+p` and a paste put\n      // the same thing in. One paragraph is charwise — putting `foo` should give\n      // you `foo` beside the cursor, not a paragraph of its own — and anything\n      // with structure is linewise.\n      read: async () => {\n        const text = await navigator.clipboard?.readText()\n        if (!text) {\n          return null\n        }\n        const parsed = editor.schema.nodeFromJSON(parseMarkdown(editor, text))\n        if (parsed.childCount === 0) {\n          return null\n        }\n        const inline = parsed.childCount === 1 && parsed.firstChild?.type.name === 'paragraph'\n        return inline\n          ? { slice: new Slice(parsed.content, 1, 1), linewise: false }\n          : { slice: new Slice(parsed.content, 0, 0), linewise: true }\n      },\n    })\n\n    return [createVimPlugin(this.storage)]\n  },\n})\n","/**\n * The engine's public surface — the only module outside `vim/` anything imports.\n *\n * Plain exported functions rather than Tiptap commands. `addCommands` would mean\n * augmenting Tiptap's command types from inside a feature module, and would put\n * the engine's API behind a chain builder that the unit tests would then have to\n * go through. These are directly callable and directly testable.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport { createCmdlineBar } from './cmdline'\nimport { VIM_DEBUG_KEY } from './debug'\nimport {\n  executeEx as runEx,\n  executeSearch as runSearch,\n  type ExResult,\n  type SaveHook,\n  type SearchOutcome,\n} from './operators'\nimport { applyEnabled, statusOf, vimPluginKey, type VimStorage } from './plugin'\nimport type { SearchDirection } from './search'\nimport type { VimStatus } from './types'\n\nexport { VimExtension } from './extension'\nexport type { VimMode, VimStatus } from './types'\nexport { clearSearchHighlight } from './operators'\nexport { installVimKeyLogger, VIM_DEBUG_KEY } from './debug'\n\nfunction storageOf(editor: Editor): VimStorage | null {\n  return ((editor.storage as unknown as Record<string, unknown>).vim as VimStorage) ?? null\n}\n\nconst DISABLED: VimStatus = { enabled: false, mode: 'normal', recording: null }\n\nexport function vimStatus(editor: Editor): VimStatus {\n  const state = vimPluginKey.getState(editor.state)\n  return state ? statusOf(state) : DISABLED\n}\n\n/**\n * Turn Vim on or off. Idempotent; enabling always lands in NORMAL, disabling\n * leaves the selection alone and keeps the registers.\n */\nexport function setVimEnabled(editor: Editor, enabled: boolean): void {\n  applyEnabled(editor.view, enabled)\n}\n\n/**\n * Watch the engine's status. Fires immediately with the current value, the way\n * `ThemeController.subscribe` does, so a fresh indicator paints itself without\n * the caller having to prime it.\n */\nexport function subscribeVimStatus(\n  editor: Editor,\n  listener: (status: VimStatus) => void,\n): () => void {\n  const storage = storageOf(editor)\n  if (!storage) {\n    return () => {}\n  }\n  storage.listeners.add(listener)\n  listener(vimStatus(editor))\n  return () => {\n    storage.listeners.delete(listener)\n  }\n}\n\n/** The registers, for tests and for the chrome that will surface them later. */\nexport function vimRegisters(editor: Editor): VimStorage['registers'] | null {\n  return storageOf(editor)?.registers ?? null\n}\n\n/**\n * Search, without going through the bar.\n *\n * The entry point the unit suite drives, so what it tests is what `/` runs.\n * Anything but `'ok'` means nothing was dispatched: either the pattern is not in\n * the document, or it is not a pattern the compiler accepts.\n */\nexport function vimSearch(\n  editor: Editor,\n  query: string,\n  direction: SearchDirection,\n): SearchOutcome {\n  return runSearch(editor.view, query, direction)\n}\n\n/**\n * Run an ex command, without going through the bar.\n *\n * As with `vimSearch`, this is the same call the bar's Enter handler makes.\n * Returns what the bar would have shown, or null when there was nothing to say.\n */\nexport function vimEx(\n  editor: Editor,\n  input: string,\n  range?: { from: number; to: number } | null,\n): ExResult | null {\n  const storage = storageOf(editor)\n  return runEx(editor.view, input, range, {\n    save: storage?.save ?? null,\n    announce: (message, tone) => storage?.cmdline?.showMessage(message, tone),\n  })\n}\n\n/**\n * What a macro actually recorded, as JSON.\n *\n * A macro holds resolved commands rather than keystrokes, so \"the macro did\n * something else\" is a question about a list nobody can see. This prints that\n * list, which turns a report into a reproduction.\n *\n * Behind the same switch as the keyboard logger (`localStorage['pasty.vim_debug']\n * = '1'`) — the debugging surface is one thing that is either on or off, and\n * saying so is more useful than silently returning nothing.\n */\nexport function vimMacroDump(editor: Editor, register?: string): string {\n  try {\n    if (window.localStorage.getItem(VIM_DEBUG_KEY) !== '1') {\n      return `Vim debugging is off. localStorage.setItem('${VIM_DEBUG_KEY}', '1') to turn it on.`\n    }\n  } catch {\n    return 'Vim debugging is unavailable: this browser has no local storage.'\n  }\n  const macros = storageOf(editor)?.macros\n  if (!macros) {\n    return '{}'\n  }\n  const entries = register ? [[register, macros.get(register) ?? []] as const] : [...macros]\n  return JSON.stringify(Object.fromEntries(entries), null, 2)\n}\n\n/**\n * Give the engine its command-line bar, and its way of saving.\n *\n * Called once from `boot()`. Without it every command that would open the bar is\n * a no-op — which is exactly what the unit suite runs against, and why nothing\n * in the engine depends on the bar existing.\n *\n * `save` is the application's existing pipeline, not a second one: `:w` flushes\n * what Pasty is already doing and reports what actually happened, which is why\n * it resolves to whether the document is stored rather than to nothing.\n */\nexport function installVimChrome(\n  editor: Editor,\n  mounts: { overlays: HTMLElement; save?: SaveHook },\n): () => void {\n  const storage = storageOf(editor)\n  if (!storage) {\n    return () => {}\n  }\n  const bar = createCmdlineBar({ onClosed: () => {} })\n  mounts.overlays.append(bar.element)\n  storage.cmdline = bar\n  storage.save = mounts.save ?? null\n  return () => {\n    storage.cmdline = null\n    storage.save = null\n    bar.destroy()\n  }\n}\n","/**\n * Editor construction. `buildExtensions()` is shared by the application and the\n * round-trip test suite so the tests can never drift from what ships.\n */\n\nimport { Editor, Extension, type Extensions } from '@tiptap/core'\nimport { TextSelection, type Transaction } from '@tiptap/pm/state'\nimport Collaboration from '@tiptap/extension-collaboration'\nimport CollaborationCaret from '@tiptap/extension-collaboration-caret'\nimport { TaskItem } from '@tiptap/extension-list'\nimport { TableKit } from '@tiptap/extension-table'\nimport { Markdown } from '@tiptap/markdown'\nimport StarterKit from '@tiptap/starter-kit'\nimport type { Awareness } from 'y-protocols/awareness'\nimport type * as Y from 'yjs'\n\nimport {\n  PastyCode,\n  PastyLink,\n  PastyListItem,\n  PastyParagraph,\n  PastyTable,\n  PastyTaskList,\n} from './extensions'\nimport { HistoryBridge } from './history'\nimport { PastyListJoin } from './lists'\nimport { serializeSelection } from './markdown'\nimport { handleMarkdownPaste } from './paste'\nimport { hasPrimaryModifier } from './shortcuts'\nimport { VimExtension } from './vim'\n\n/** Fired on the editor's DOM node when the user asks for the link popover. */\nexport const LINK_SHORTCUT_EVENT = 'pasty:link-shortcut'\n\nconst PastyShortcuts = Extension.create({\n  name: 'pastyShortcuts',\n\n  addKeyboardShortcuts() {\n    const headingShortcut = (level: 1 | 2 | 3) => () =>\n      this.editor.chain().focus().toggleHeading({ level }).run()\n\n    return {\n      // ⌘⇧K, not ⌘K: the command palette took the plain chord, and offers this\n      // one back as a row. UI-free either way — the extension announces intent,\n      // link-popover.ts owns the widget.\n      'Mod-Shift-k': () => {\n        this.editor.view.dom.dispatchEvent(\n          new CustomEvent(LINK_SHORTCUT_EVENT, { bubbles: true }),\n        )\n        return true\n      },\n      'Mod-Alt-1': headingShortcut(1),\n      'Mod-Alt-2': headingShortcut(2),\n      'Mod-Alt-3': headingShortcut(3),\n      'Mod-Alt-0': () => this.editor.chain().focus().setParagraph().run(),\n    }\n  },\n})\n\n/**\n * Where ⌘-clicking a link should actually go, or null if the answer is nowhere.\n *\n * It resolves rather than approves, because the href is not always the\n * destination. The link editor deliberately stores whatever was typed — bare\n * domains, relative paths, `#anchors`, placeholders — so this has to make the\n * same reading of them that the rest of the editor makes.\n */\nexport function followableUrl(href: string): string | null {\n  const typed = href.trim()\n  // A blank href resolves to *this page*, so it would otherwise pass every\n  // check below and open a second copy of the document you are already in —\n  // and a blank href is exactly what Tiptap renders a hostile one as.\n  if (!typed || /\\s/.test(typed)) {\n    return null\n  }\n\n  // An explicit scheme is taken at its word, and only the web ones are\n  // followed: `window.open` is the call that would run a `javascript:` href\n  // arriving in somebody else's pasted document.\n  const absolute = parseUrl(typed)\n  if (absolute) {\n    return absolute.protocol === 'http:' || absolute.protocol === 'https:' ? absolute.href : null\n  }\n\n  // Root-relative: somewhere else in this app.\n  if (typed.startsWith('/')) {\n    return parseUrl(typed, window.location.href)?.href ?? null\n  }\n\n  // A bare domain means a website, which is not a guess — typing `blah.com`\n  // into the document autolinks it to `https://blah.com`, and the same address\n  // typed into the link editor instead cannot be allowed to mean something\n  // else. A host with no dot in it is a placeholder, not a destination.\n  const guessed = parseUrl(`https://${typed}`)\n  return guessed?.hostname.includes('.') ? guessed.href : null\n}\n\nfunction parseUrl(value: string, base?: string): URL | null {\n  try {\n    return new URL(value, base)\n  } catch {\n    return null\n  }\n}\n\n/** The link under a primary-button mouse event, or null. */\nfunction linkHref(event: MouseEvent): string | null {\n  // `button` matters because mousedown fires for all of them: without this a\n  // right-click would land here and a prevented default would eat the context\n  // menu.\n  if (event.button !== 0) {\n    return null\n  }\n  return (event.target as Element | null)?.closest?.('a[href]')?.getAttribute('href') ?? null\n}\n\n/** Where a plain click asks to go, or null if it is asking for anything else. */\nfunction followTarget(event: MouseEvent): string | null {\n  // The platform's modifier means \"edit this link\"; the popover owns that.\n  if (hasPrimaryModifier(event)) {\n    return null\n  }\n  const href = linkHref(event)\n  return href ? followableUrl(href) : null\n}\n\n/** Farther than this between press and release is a drag, not a click. */\nconst DRAG_SLOP = 4\n\n/** What the collaborative editor is built around: one document, one presence. */\nexport interface CollaborationSetup {\n  document: Y.Doc\n  awareness: Awareness\n  /** This client's name and colour, for the caret label above their cursor. */\n  user: { name: string; color: string }\n  /** Fired once Yjs has rendered its content into the editor for the first time. */\n  onFirstRender?: () => void\n}\n\n/**\n * A colour arriving over the wire, or nothing.\n *\n * Awareness bytes are relayed by the server verbatim — that is what keeps\n * presence a client concern — so the colour in them is whatever another client\n * said it was. It goes into a style attribute, so it is checked here rather\n * than trusted: six hex digits or no colour at all.\n */\nfunction safeColor(value: unknown): string | null {\n  return typeof value === 'string' && /^#[0-9a-f]{6}$/i.test(value) ? value : null\n}\n\n/** The caret and the name that floats above it, for one remote user. */\nfunction renderCaret(user: Record<string, unknown>): HTMLElement {\n  const color = safeColor(user.color)\n  const caret = document.createElement('span')\n  caret.classList.add('collaboration-carets__caret')\n  if (color) {\n    caret.style.setProperty('--peer-color', color)\n  }\n\n  const label = document.createElement('div')\n  label.classList.add('collaboration-carets__label')\n  // textContent, not innerHTML: a name is text, and this one came from another\n  // client.\n  label.textContent = typeof user.name === 'string' ? user.name : 'Someone'\n  caret.append(label)\n  return caret\n}\n\nfunction selectionRender(user: Record<string, unknown>) {\n  const color = safeColor(user.color)\n  return {\n    nodeName: 'span',\n    class: 'collaboration-carets__selection',\n    ...(color ? { style: `--peer-color: ${color}` } : {}),\n  }\n}\n\nexport function buildExtensions(collaboration?: CollaborationSetup): Extensions {\n  return [\n    StarterKit.configure({\n      // Yjs brings its own history — one that undoes *your* changes and leaves\n      // your collaborator's alone. Two histories under one editor would fight.\n      undoRedo: collaboration ? false : undefined,\n      // H4-H6 have no toolbar button, but agents emit them constantly and a\n      // schema that can't hold them would silently flatten pasted documents.\n      heading: { levels: [1, 2, 3, 4, 5, 6] },\n      // Underline has no Markdown representation, so Pasty doesn't offer it.\n      // Strike stays in the schema (valid GFM) but gets no toolbar button.\n      underline: false,\n      // Replaced below with versions whose Markdown output round-trips.\n      paragraph: false,\n      code: false,\n      listItem: false,\n      link: false,\n    }),\n    PastyParagraph,\n    PastyCode,\n    PastyListItem,\n    PastyLink.configure({\n      openOnClick: false,\n      autolink: true,\n      linkOnPaste: true,\n      defaultProtocol: 'https',\n    }),\n    // `- [ ]` is ordinary agent output. Without these it parsed as a bullet\n    // containing literal brackets, which looked wrong and could not round-trip.\n    // `nested: true` is what makes a task list legal inside a task item, and\n    // what gives Tab a sink to move into.\n    PastyTaskList,\n    TaskItem.configure({ nested: true }),\n    // Deleting an un-bulleted line leaves two lists touching; this rejoins them.\n    PastyListJoin,\n    // Column widths can't be expressed in GFM, so resizing would be a promise\n    // the format can't keep. `renderWrapper` makes `getHTML()` emit the same\n    // `.tableWrapper` the live node view wraps a table in, so the docs\n    // prerender lays tables out exactly as the editor does.\n    TableKit.configure({ table: false }),\n    PastyTable.configure({ resizable: false, renderWrapper: true }),\n    Markdown.configure({\n      // Lists do their own indentation (see PastyListItem); this only covers\n      // the remaining indented blocks.\n      indentation: { style: 'space', size: 2 },\n      markedOptions: { gfm: true, breaks: false },\n    }),\n    ...(collaboration\n      ? [\n          Collaboration.configure({\n            document: collaboration.document,\n            field: 'default',\n            onFirstRender: collaboration.onFirstRender,\n          }),\n          CollaborationCaret.configure({\n            // The extension only ever reads `provider.awareness`, so the\n            // polling provider hands it exactly that and nothing else.\n            provider: { awareness: collaboration.awareness },\n            user: collaboration.user,\n            render: renderCaret,\n            selectionRender,\n          }),\n        ]\n      : []),\n    // Always installed, in both modes, so the extension list — and the schema\n    // every test builds from it — is the same shape either way.\n    HistoryBridge,\n    PastyShortcuts,\n    // Last, so its handleKeyDown sees a key before any other extension's keymap.\n    // It is always installed and gated on a flag in its own plugin state, which\n    // keeps this list — and so the schema every test builds — identical whether\n    // or not the preference is on.\n    VimExtension,\n  ]\n}\n\nexport interface CreateEditorOptions {\n  element: HTMLElement\n  content?: string\n  onUpdate?: (editor: Editor, transaction: Transaction) => void\n  onTransaction?: (editor: Editor) => void\n  autofocus?: boolean\n  /** false renders the shared read-only view; everything else is unchanged, so\n      the document looks identical whether or not it can be edited. */\n  editable?: boolean\n  /**\n   * Build a Yjs-backed editor. The content then comes from the shared document\n   * rather than from `content`, which must not be passed alongside it: seeding\n   * the editor *and* the CRDT would put the text in twice.\n   */\n  collaboration?: CollaborationSetup\n}\n\n/**\n * How much of the window the chrome covers, in pixels.\n *\n * The header and the toolbar are `position: sticky`, so they float *over* the\n * document rather than scrolling with it. ProseMirror's idea of \"in view\" is the\n * window, which means a caret scrolled to the top of the window lands underneath\n * them — and a `gg` or a `1G` looks like it stopped short of the top.\n *\n * Read from the same custom properties the layout uses, so the two cannot drift\n * apart; the fallback is what they are in `static/base.css` today, for jsdom and\n * for any host that loads the editor without the stylesheet.\n */\nfunction chromeHeight(): number {\n  const FALLBACK = 85\n  try {\n    const style = getComputedStyle(document.documentElement)\n    const header = Number.parseFloat(style.getPropertyValue('--pasty-header-height'))\n    const toolbar = Number.parseFloat(style.getPropertyValue('--pasty-toolbar-height'))\n    return Number.isFinite(header) && Number.isFinite(toolbar) ? header + toolbar : FALLBACK\n  } catch {\n    return FALLBACK\n  }\n}\n\nexport function createEditor(options: CreateEditorOptions): Editor {\n  // The clipboard hooks need the editor they are installed on, so they close\n  // over a binding filled in a line later. Both only run on user input.\n  let editor: Editor\n\n  // Read once: these are constants in `base.css` rather than responsive values,\n  // and ProseMirror reads the props object as it was at construction.\n  const chrome = chromeHeight()\n\n  const editable = options.editable ?? true\n\n  const collaboration = options.collaboration\n\n  // A plain click on a link follows it, and following is not editing: the\n  // caret must not end up in the link. The browser places the caret as the\n  // default action of the press (Chrome does it on release), so the press is\n  // cancelled and the click that completes it does the following. A press\n  // that moves before it releases was reaching for something else, and the\n  // coordinates are what tell the two apart.\n  let pressed: { x: number; y: number } | null = null\n\n  editor = new Editor({\n    element: options.element,\n    extensions: buildExtensions(collaboration),\n    // In collab mode the Yjs document *is* the content, and passing initial\n    // content as well would insert it a second time on top of itself.\n    ...(collaboration ? {} : { content: options.content ?? '', contentType: 'markdown' as const }),\n    editable,\n    autofocus: options.autofocus ? 'start' : false,\n    editorProps: {\n      // The chrome floats over the document (see `chromeHeight`), so the top of\n      // the window is not the top of what you can see. These keep every scroll\n      // ProseMirror performs — a Vim jump, a search hit, typing at the edge —\n      // clear of it, which is the difference between `1G` working and `1G`\n      // looking like it stopped short.\n      scrollThreshold: { top: chrome, right: 0, bottom: 0, left: 0 },\n      scrollMargin: { top: chrome + 8, right: 5, bottom: 16, left: 5 },\n      handlePaste: (view, event) => handleMarkdownPaste(editor, view, event),\n      handleDOMEvents: {\n        mousedown: (view, event) => {\n          const href = linkHref(event)\n          if (!href) {\n            pressed = null\n            return false\n          }\n          if (hasPrimaryModifier(event)) {\n            // ProseMirror reads the platform modifier as \"select the node under\n            // the pointer\", which on a link is the whole paragraph. Here it\n            // means \"edit this link\": put the caret where the pointer is, and\n            // the popover opens from that caret on the click that follows.\n            const at = view.posAtCoords({ left: event.clientX, top: event.clientY })\n            if (at) {\n              view.dispatch(view.state.tr.setSelection(TextSelection.create(view.state.doc, at.pos)))\n            }\n            event.preventDefault()\n            return true\n          }\n          if (!followableUrl(href)) {\n            // Goes nowhere, so the click will edit it: an ordinary press.\n            pressed = null\n            return false\n          }\n          pressed = { x: event.clientX, y: event.clientY }\n          event.preventDefault()\n          return true\n        },\n        // `openOnClick` stays false so this stays ours: a plain click follows\n        // the link in a new tab, the same thing a click on a link does\n        // everywhere else on the web. Editing the words takes the modifier.\n        click: (_view, event) => {\n          const press = pressed\n          pressed = null\n          // The resolved destination, not the raw href: `blah.com` handed\n          // straight to `window.open` would resolve against this page again.\n          const destination = followTarget(event)\n          if (!destination || !press) {\n            return false\n          }\n          const moved =\n            Math.abs(event.clientX - press.x) > DRAG_SLOP ||\n            Math.abs(event.clientY - press.y) > DRAG_SLOP\n          if (moved) {\n            return false\n          }\n          event.preventDefault()\n          window.open(destination, '_blank', 'noopener,noreferrer')\n          return true\n        },\n      },\n      // One hook covers copy, cut and drag: ProseMirror routes them all through\n      // serializeForClipboard.\n      clipboardTextSerializer: slice => serializeSelection(editor, slice),\n      // A read-only mount is an article, not a textbox: announcing an editing\n      // role on a surface that refuses input is a promise to break.\n      attributes: editable\n        ? {\n            role: 'textbox',\n            'aria-multiline': 'true',\n            'aria-label': 'Document',\n            class: 'pasty-document',\n          }\n        : {\n            role: 'article',\n            'aria-label': 'Document',\n            class: 'pasty-document',\n          },\n    },\n    // The transaction comes through because the caller has to be able to tell\n    // its own typing from a collaborator's: one is a reason to save, the other\n    // is a reason to leave the caret alone.\n    onUpdate: ({ editor: instance, transaction }) =>\n      options.onUpdate?.(instance as Editor, transaction),\n    onTransaction: ({ editor: instance }) => options.onTransaction?.(instance as Editor),\n  })\n\n  return editor\n}\n","/**\n * Menu behaviour.\n *\n * `<details>`/`<summary>` already gives a working menu with no JavaScript: it\n * opens, it closes, it is keyboard reachable, and it survives a failed bundle.\n * This adds the four things native `details` does not — click-outside close,\n * Escape closing and handing focus back to the trigger, only one menu open at a\n * time, and arrow-key movement between rows.\n *\n * It is deliberately generic: any `details.menu` in the server-rendered header\n * picks it up, so a new menu needs markup and nothing else.\n */\n\nconst MENU = 'details.menu'\nconst ROW = '.menu__item'\n\nfunction openMenus(): HTMLDetailsElement[] {\n  return Array.from(document.querySelectorAll<HTMLDetailsElement>(MENU))\n}\n\nfunction close(menu: HTMLDetailsElement, refocus = false): void {\n  if (!menu.open) {\n    return\n  }\n  menu.open = false\n  if (refocus) {\n    menu.querySelector('summary')?.focus()\n  }\n}\n\nexport function installMenus(): () => void {\n  // `toggle` doesn't bubble, so this has to listen in the capture phase.\n  const onToggle = (event: Event) => {\n    const menu = event.target as HTMLDetailsElement\n    if (!(menu instanceof HTMLDetailsElement) || !menu.matches(MENU) || !menu.open) {\n      return\n    }\n    for (const other of openMenus()) {\n      if (other !== menu) {\n        close(other)\n      }\n    }\n  }\n\n  const onPointerDown = (event: MouseEvent) => {\n    for (const menu of openMenus()) {\n      if (menu.open && !menu.contains(event.target as Node)) {\n        close(menu)\n      }\n    }\n  }\n\n  const onKeyDown = (event: KeyboardEvent) => {\n    const target = event.target as HTMLElement | null\n    const menu = target?.closest?.(MENU) as HTMLDetailsElement | null\n    if (!menu?.open) {\n      return\n    }\n\n    if (event.key === 'Escape') {\n      event.preventDefault()\n      close(menu, true)\n      return\n    }\n\n    if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') {\n      return\n    }\n\n    const rows = Array.from(menu.querySelectorAll<HTMLElement>(ROW))\n    if (rows.length === 0) {\n      return\n    }\n    event.preventDefault()\n\n    const step = event.key === 'ArrowDown' ? 1 : -1\n    const current = rows.indexOf(document.activeElement as HTMLElement)\n    const next =\n      current < 0 ? (step === 1 ? 0 : rows.length - 1) : (current + step + rows.length) % rows.length\n    rows[next].focus()\n  }\n\n  document.addEventListener('toggle', onToggle, true)\n  document.addEventListener('mousedown', onPointerDown)\n  document.addEventListener('keydown', onKeyDown)\n\n  return () => {\n    document.removeEventListener('toggle', onToggle, true)\n    document.removeEventListener('mousedown', onPointerDown)\n    document.removeEventListener('keydown', onKeyDown)\n  }\n}\n","/**\n * Appearance.\n *\n * The heavy lifting is CSS, not this module. `static/base.css` declares\n * `color-scheme: light dark` and expresses every themed token as\n * `light-dark(light, dark)`, so **System costs no JavaScript at all** — the OS\n * preference is read by the browser, live, including on the auth pages that\n * never load a bundle.\n *\n * All this module does is the manual override: write `data-theme` on <html> so\n * the two attribute rules in base.css can pin `color-scheme`. Resolution is a\n * pure function so it can be tested without a DOM, and `matchMedia` is touched\n * in exactly one guarded place — it is needed only to tell subscribers that the\n * resolved theme changed, never for correctness.\n */\n\nimport { readThemePreference, writeThemePreference } from './persistence'\n\nexport type ThemePreference = 'system' | 'light' | 'dark'\nexport type ResolvedTheme = 'light' | 'dark'\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)'\n\n/** Anything we don't recognise is System. Storage is user-writable. */\nexport function normalizePreference(raw: string | null | undefined): ThemePreference {\n  return raw === 'light' || raw === 'dark' ? raw : 'system'\n}\n\n/** The whole decision, as a pure function. */\nexport function resolveTheme(\n  preference: ThemePreference,\n  systemPrefersDark: boolean,\n): ResolvedTheme {\n  if (preference === 'system') {\n    return systemPrefersDark ? 'dark' : 'light'\n  }\n  return preference\n}\n\n/**\n * System is the absence of the attribute, never `data-theme=\"system\"` — the CSS\n * knows two values and a missing attribute, and a third would silently do\n * nothing.\n */\nexport function applyPreference(preference: ThemePreference): void {\n  const root = document.documentElement\n  if (preference === 'system') {\n    delete root.dataset.theme\n    root.style.removeProperty('color-scheme')\n  } else {\n    root.dataset.theme = preference\n    // Matches what the boot script writes, so the first paint and every later\n    // one agree.\n    root.style.colorScheme = preference\n  }\n}\n\nfunction prefersDark(): boolean {\n  return typeof window.matchMedia === 'function' && window.matchMedia(DARK_QUERY).matches\n}\n\nexport interface ThemeController {\n  preference: () => ThemePreference\n  resolved: () => ResolvedTheme\n  set: (preference: ThemePreference) => void\n  subscribe: (listener: (preference: ThemePreference, resolved: ResolvedTheme) => void) => void\n  destroy: () => void\n}\n\nexport function installTheme(): ThemeController {\n  let preference = normalizePreference(readThemePreference())\n  applyPreference(preference)\n\n  const listeners = new Set<(preference: ThemePreference, resolved: ResolvedTheme) => void>()\n  const announce = () => {\n    for (const listener of listeners) {\n      listener(preference, resolveTheme(preference, prefersDark()))\n    }\n  }\n\n  // Purely so the picker can reflect reality. The pixels have already changed\n  // by the time this fires — that is CSS's job, and it does it on System with\n  // no reload.\n  const query = typeof window.matchMedia === 'function' ? window.matchMedia(DARK_QUERY) : null\n  const onSystemChange = () => {\n    if (preference === 'system') {\n      announce()\n    }\n  }\n  query?.addEventListener('change', onSystemChange)\n\n  return {\n    preference: () => preference,\n    resolved: () => resolveTheme(preference, prefersDark()),\n    set: next => {\n      preference = next\n      writeThemePreference(next)\n      applyPreference(next)\n      announce()\n    },\n    subscribe: listener => {\n      listeners.add(listener)\n      listener(preference, resolveTheme(preference, prefersDark()))\n    },\n    destroy: () => {\n      query?.removeEventListener('change', onSystemChange)\n      listeners.clear()\n    },\n  }\n}\n","/**\n * The read-only page behind /s/<token>.\n *\n * The same Tiptap mount as the editor with `editable: false`, so a shared\n * document and its original are rendered by one code path and cannot drift.\n * Nothing that implies editing boots here: no toolbar, no autosave, no title\n * field, no palette, no Vim — the vim extension ships in the bundle but stays\n * inert because nothing on this page ever calls `setVimEnabled`.\n */\n\nimport { installAppearanceMenu } from './appearance-menu'\nimport { writeClipboardText } from './clipboard'\nimport { clear, el } from './dom'\nimport { createEditor, followableUrl } from './editor'\nimport { installMenus } from './menus'\nimport { installTheme } from './theme'\nimport type { SharedDocument } from './types'\n\nconst COPY_ANNOUNCEMENT_MS = 1200\n\nexport interface SharedViewMounts {\n  workspace: HTMLElement\n  page: HTMLElement\n  mount: HTMLElement\n}\n\nexport function bootSharedView(root: HTMLElement, doc: SharedDocument): SharedViewMounts {\n  const mount = el('div', { class: 'pasty-editor is-shared' })\n  const page = el('div', { class: 'pasty-page' }, mount)\n  const workspace = el('div', { class: 'pasty-workspace' }, page)\n\n  clear(root)\n  root.append(workspace)\n\n  installMenus()\n  const theme = installTheme()\n  installAppearanceMenu(theme)\n\n  createEditor({\n    element: mount,\n    content: doc.markdown,\n    editable: false,\n    autofocus: false,\n  })\n\n  // In the editor a plain click on a link means \"edit these words\", so\n  // following one takes a modifier. A viewer cannot edit the words, so here a\n  // plain click follows — through the same resolver the editor uses, which is\n  // also what keeps a hostile href in somebody's shared Markdown from ever\n  // reaching window.open. Capture phase, so nothing underneath sees the click.\n  mount.addEventListener(\n    'click',\n    event => {\n      const href = (event.target as Element | null)\n        ?.closest?.('a[href]')\n        ?.getAttribute('href')\n      if (href === null || href === undefined) {\n        return\n      }\n      event.preventDefault()\n      const destination = followableUrl(href)\n      if (destination) {\n        window.open(destination, '_blank', 'noopener,noreferrer')\n      }\n    },\n    true,\n  )\n\n  // Copy Markdown copies the canonical Markdown the server sent, not a\n  // re-serialisation — what the owner shared is exactly what a recipient gets\n  // to paste into their own tools. Same announcement pattern as the editor's\n  // copy: a visible label swap for the eyes, a status region for the ears.\n  const copyConfirmation = el('span', { class: 'pasty-copied', role: 'status' })\n  document.body.append(copyConfirmation)\n  let copyTimer: number | undefined\n\n  for (const element of document.querySelectorAll<HTMLElement>('[data-shared-chrome]')) {\n    element.hidden = false\n  }\n  for (const trigger of document.querySelectorAll<HTMLElement>('[data-shared-copy]')) {\n    const label = trigger.textContent\n    trigger.addEventListener('click', () => {\n      void writeClipboardText(doc.markdown).then(copied => {\n        trigger.textContent = copied ? 'Copied' : label\n        copyConfirmation.textContent = copied ? 'Markdown copied' : \"Couldn't copy\"\n        window.clearTimeout(copyTimer)\n        copyTimer = window.setTimeout(() => {\n          trigger.textContent = label\n          copyConfirmation.textContent = ''\n        }, COPY_ANNOUNCEMENT_MS)\n      })\n    })\n  }\n\n  // The same bridge the editor page exposes, so browser tests can ask a shared\n  // page what it holds the same way they ask the editor.\n  Object.defineProperty(window, '__pasty', {\n    value: { getMarkdown: () => doc.markdown },\n    configurable: true,\n  })\n\n  return { workspace, page, mount }\n}\n","/**\n * The signed-out page behind /docs/<slug>.\n *\n * The read-only view (`shared-view.ts`), plus one verb. \"Edit a copy\" hands\n * the page's Markdown to the same adoption rule the CLI handoff uses — into\n * this browser's one draft slot, asking before it displaces anything — and\n * then goes to `/`, which resumes that draft. A full navigation rather than a\n * mode switch: the editor is a different page with different chrome, and the\n * server renders chrome.\n *\n * The server put the article and the page navigation into the root. The view\n * rebuilds the article from the same Markdown and clears the root to do it, so\n * the navigation is lifted out first and put back under the rebuilt page.\n */\n\nimport { el } from './dom'\nimport { adoptAsAnonymousDraft } from './handoff'\nimport { nowTimestamp } from './persistence'\nimport { bootSharedView } from './shared-view'\nimport type { PublishedDocument } from './types'\n\nconst REPLACE_PROMPT =\n  'Replace the draft in this browser with a copy of this page?\\n\\n' +\n  'Cancel keeps your draft. This page stays where it is, so you can come back to it.'\n\nconst UNSTORABLE = \"This browser can't keep a draft. Copy the Markdown instead.\"\n\nexport interface PublishedViewOptions {\n  /** Where the editor lives; the draft is resumed there. */\n  home: string\n  navigate: (url: string) => void\n}\n\nexport function bootPublishedView(\n  root: HTMLElement,\n  doc: PublishedDocument,\n  options: PublishedViewOptions,\n): void {\n  const nav = root.querySelector<HTMLElement>('.docs-nav')\n  const { page } = bootSharedView(root, doc)\n  if (nav) {\n    page.append(nav)\n  }\n\n  // The same lane the editor keeps its problem note in, so a refusal reads the\n  // way every other refusal in the product does.\n  const note = el('p', { class: 'pasty-problem', role: 'status' })\n  note.hidden = true\n  document.body.append(el('div', { class: 'pasty-overlays' }, note))\n\n  for (const trigger of document.querySelectorAll<HTMLElement>('[data-docs-edit]')) {\n    trigger.addEventListener('click', () => {\n      const result = adoptAsAnonymousDraft(\n        { title: doc.title, markdown: doc.markdown, updated_at: nowTimestamp() },\n        REPLACE_PROMPT,\n      )\n      if (!result) {\n        return // declined: the draft stays, and so does this page\n      }\n      if (!result.storedLocally) {\n        // Nothing to navigate to: `/` would open whatever it could load, which\n        // is not this page. Say so here, where the reader still has the text.\n        note.textContent = UNSTORABLE\n        note.hidden = false\n        return\n      }\n      options.navigate(options.home)\n    })\n  }\n}\n","/**\n * The anonymous /new handoff.\n *\n * Anonymous browsers have one draft slot, so starting over means replacing it.\n * This consumes the server's one-shot instruction, asks before displacing work,\n * and stores the blank immediately so a reload cannot resurrect the old draft.\n */\n\nimport { hasContent, loadAnonDocument, nowTimestamp, saveAnonDocument } from './persistence'\nimport type { PastyConfig, StoredDocument } from './types'\n\nconst DISCARD_PROMPT =\n  'Start a new document? This browser keeps one draft at a time, so the current one ' +\n  'will be replaced.\\n\\nCancel keeps it — create an account to keep several.'\n\nexport function resolveFreshStart(config: PastyConfig): StoredDocument | null {\n  if (!config.start_blank || config.user.is_authenticated) {\n    return null // the flag is anonymous-only; the guard is defense in depth\n  }\n\n  // From here this page is the editor at its usual address. A reload must\n  // resume what the user is about to type, not start them over again.\n  window.history.replaceState(null, '', config.urls.home)\n\n  const existing = loadAnonDocument()\n  if (hasContent(existing) && !window.confirm(DISCARD_PROMPT)) {\n    return null // chooseInitialDocument loads the kept draft, exactly as at `/`\n  }\n\n  // Written now, not on the first keystroke: the stored blank *is* the discard.\n  // Leaving the old draft in the slot would resurrect it on the next reload.\n  const blank: StoredDocument = { title: '', markdown: '', updated_at: nowTimestamp() }\n  saveAnonDocument(blank)\n  return blank\n}\n","/**\n * The introduction shown in a brand-new anonymous document.\n *\n * This is real document content, not an overlay: it can be selected, edited and\n * deleted like anything else the user typed. The trade that makes possible is\n * that an untouched introduction is part of the document — so it would be\n * copied and saved along with it. `isUntouchedIntro` is how the rest of the app\n * knows the user hasn't made the document theirs yet: a paste into an untouched\n * introduction replaces it rather than landing in the middle of it.\n */\n\n/**\n * The introduction's own first line. Named, because the title field derives a\n * document's name from its first line and this one is ours, not the user's — a\n * visitor who types one character into the introduction should not end up with\n * a document called \"Paste Markdown. Edit like Google Docs. Copy Markdown.\"\n */\nconst HEADLINE = 'Paste Markdown. Edit like Google Docs. Copy Markdown.'\n\nexport function introMarkdown(signupUrl: string): string {\n  return [\n    `**${HEADLINE}**`,\n    '',\n    'Paste Markdown here and Pasty will format it automatically. Edit it like a normal ' +\n      'document, then copy it back as Markdown.',\n    '',\n    'Try pasting something from ChatGPT, Claude, Cursor, Devin, or another coding agent.',\n    '',\n    `[Create an account](${signupUrl}) to save your documents.`,\n    '',\n  ].join('\\n')\n}\n\n/**\n * Is this line the introduction's headline, untouched?\n *\n * Exact, on purpose: someone who rewrites that line in place has made it their\n * own, and deriving a title from it is then the right thing to do.\n */\nexport function isIntroHeadline(text: string): boolean {\n  return text === HEADLINE\n}\n\n/** True while the document is still exactly the introduction we seeded. */\nexport function isUntouchedIntro(markdown: string, signupUrl: string): boolean {\n  return markdown.trim() === introMarkdown(signupUrl).trim()\n}\n","/**\n * The link editor.\n *\n * Positioned from `coordsAtPos` rather than a positioning library: one small\n * popover doesn't justify the dependency, and the editor never scrolls\n * horizontally.\n */\n\nimport { type Editor, getMarkRange, type Range } from '@tiptap/core'\nimport type { Mark } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport { el, icon } from './dom'\nimport { followableUrl, LINK_SHORTCUT_EVENT } from './editor'\nimport { ICONS } from './icons'\nimport { hasPrimaryModifier } from './shortcuts'\n\nconst POPOVER_WIDTH = 320\n\nexport interface LinkPopover {\n  element: HTMLElement\n  open: () => void\n  close: () => void\n  isOpen: () => boolean\n  destroy: () => void\n}\n\nexport function createLinkPopover(editor: Editor): LinkPopover {\n  // Deliberately not `type=\"url\"`: native constraint validation rejects\n  // schemeless values like `blah.com`, but Pasty stores whatever is typed —\n  // bare domains, relative paths, `#anchors`, even placeholders. `inputmode`\n  // keeps a URL-friendly keyboard without gating submission, and the off\n  // switches stop Safari from mangling a typed address.\n  const input = el('input', {\n    type: 'text',\n    inputmode: 'url',\n    autocapitalize: 'off',\n    autocorrect: 'off',\n    spellcheck: 'false',\n    class: 'pasty-link__input',\n    placeholder: 'https://example.com',\n    'aria-label': 'Link address',\n  }) as HTMLInputElement\n\n  // A submit button, so a click takes the same path Enter does. It was\n  // `type=\"button\"` with no listener of its own, and clicking it did nothing.\n  const apply = el('button', { type: 'submit', class: 'btn btn--primary', text: 'Apply' })\n  const remove = el('button', {\n    type: 'button',\n    class: 'pasty-link__remove',\n    title: 'Remove link',\n    'aria-label': 'Remove link',\n  })\n  remove.append(icon(ICONS.unlink, 18))\n\n  const form = el('form', { class: 'pasty-link__form' }, input, apply, remove)\n  const popover = el('div', { class: 'pasty-link', role: 'dialog', 'aria-label': 'Link' }, form)\n  popover.hidden = true\n\n  const isOpen = () => !popover.hidden\n\n  const close = (refocus = true) => {\n    if (!isOpen()) {\n      return\n    }\n    popover.hidden = true\n    if (refocus) {\n      editor.commands.focus()\n    }\n  }\n\n  const open = () => {\n    const target = linkTarget(editor.state)\n    const existing = target ? linkHref(editor.state, target) : ''\n    input.value = existing\n    remove.hidden = !existing\n    popover.hidden = false\n    position()\n    input.focus()\n    input.select()\n  }\n\n  const position = () => {\n    const { from } = editor.state.selection\n    const coords = editor.view.coordsAtPos(from)\n    const container = popover.offsetParent as HTMLElement | null\n    const bounds = container?.getBoundingClientRect()\n    const left = coords.left - (bounds?.left ?? 0)\n    const top = coords.bottom - (bounds?.top ?? 0)\n    const maxLeft = (container?.clientWidth ?? window.innerWidth) - POPOVER_WIDTH - 8\n    popover.style.left = `${Math.max(8, Math.min(left, Math.max(8, maxLeft)))}px`\n    popover.style.top = `${top + 8}px`\n  }\n\n  // Resolved on submit rather than on open: the selection is mapped through a\n  // collaborator's edits while the popover is up, and a range saved earlier\n  // would not be.\n  const aimAtTarget = () => {\n    const target = linkTarget(editor.state)\n    const chain = editor.chain().focus()\n    // A selection is already its own target, and re-making it as a text\n    // selection would flatten a table's cell selection.\n    if (target && editor.state.selection.empty) {\n      chain.setTextSelection(target)\n    }\n    return { chain, target }\n  }\n\n  form.addEventListener('submit', event => {\n    event.preventDefault()\n    const href = input.value.trim()\n    const { chain, target } = aimAtTarget()\n    if (!href) {\n      chain.unsetLink()\n    } else if (target) {\n      chain.setLink({ href })\n    } else {\n      // A caret outside every link would apply the mark to nothing, so insert\n      // the address as its own linked text — the same thing Docs does. A text\n      // node rather than a string, which would be parsed as HTML.\n      chain.insertContent({ type: 'text', text: href, marks: [{ type: 'link', attrs: { href } }] })\n    }\n    chain.run()\n    close()\n  })\n\n  remove.addEventListener('click', () => {\n    aimAtTarget().chain.unsetLink().run()\n    close()\n  })\n\n  popover.addEventListener('keydown', event => {\n    if (event.key === 'Escape') {\n      event.preventDefault()\n      close()\n    }\n  })\n\n  const onShortcut = () => open()\n  const onDocumentPointerDown = (event: MouseEvent) => {\n    if (isOpen() && !popover.contains(event.target as Node)) {\n      close(false)\n    }\n  }\n  // A plain click on a link follows it (editor.ts opens the tab), so editing\n  // one takes the platform's modifier — or a plain click on a link that goes\n  // nowhere, because a link that cannot be followed is a link that needs\n  // fixing. Coming back from a new tab to a popover that had grabbed the caret\n  // would be the opposite of what was asked for, so a click that follows never\n  // opens this.\n  const onEditorClick = (event: MouseEvent) => {\n    const target = (event.target as HTMLElement | null)?.closest('a')\n    if (!target || event.button !== 0) {\n      return\n    }\n    const follows =\n      !hasPrimaryModifier(event) && followableUrl(target.getAttribute('href') ?? '') !== null\n    if (follows) {\n      return\n    }\n    event.preventDefault()\n    window.setTimeout(open, 0)\n  }\n\n  editor.view.dom.addEventListener(LINK_SHORTCUT_EVENT, onShortcut)\n  editor.view.dom.addEventListener('click', onEditorClick)\n  document.addEventListener('mousedown', onDocumentPointerDown)\n\n  return {\n    element: popover,\n    open,\n    close,\n    isOpen,\n    destroy: () => {\n      editor.view.dom.removeEventListener(LINK_SHORTCUT_EVENT, onShortcut)\n      editor.view.dom.removeEventListener('click', onEditorClick)\n      document.removeEventListener('mousedown', onDocumentPointerDown)\n    },\n  }\n}\n\n/**\n * What Apply and Remove act on. A selection is taken exactly as it was made, so\n * part of a link can be re-pointed or unlinked on its own, which splits it.\n * Only a bare caret stands for a whole link — the one it sits in, edges\n * included, because the edge is where a click on a link's last letter lands.\n * Null for a caret outside every link.\n *\n * `extendMarkRange` used to do this job, and widened a *selection* inside a\n * link to the whole link: re-pointing one word of a linked line re-pointed the\n * line.\n */\nfunction linkTarget(state: EditorState): Range | null {\n  const { empty, from, to, $from } = state.selection\n  if (!empty) {\n    return { from, to }\n  }\n  return getMarkRange($from, state.schema.marks.link) ?? null\n}\n\n/** The address of the one link covering all of a range, or '' if there isn't one. */\nfunction linkHref(state: EditorState, range: Range): string {\n  const type = state.schema.marks.link\n  // undefined until the first text node; null once two disagree or one is bare.\n  let link: Mark | null | undefined\n  state.doc.nodesBetween(range.from, range.to, node => {\n    if (node.isText && link !== null) {\n      const mark = type.isInSet(node.marks)\n      link = mark && (link === undefined || mark.eq(link)) ? mark : null\n    }\n    return link !== null\n  })\n  return (link?.attrs.href as string | undefined) ?? ''\n}\n","/**\n * Keycaps.\n *\n * A chord is drawn as individual keys — `⌘` `⇧` `C` — rather than one cap\n * holding the whole chord. The container is a single <kbd> whose text still\n * reads `⌘ ⇧ C`, so everything that counts caps or reads their text sees one\n * keycap per chord; the caps inside it are spans, drawn by `.kbd__key` in\n * static/base.css. The header cue, the palette's rows and the menu's hint all\n * come from here.\n */\n\nimport { el } from './dom'\nimport { keycapParts } from './shortcuts'\n\n/** Symbols the mono face draws too small; the CSS gives these the UI face. */\nconst GLYPHS = new Set(['⌘', '⇧', '⌥', '⌃', '↑', '↓', '←', '→', '↵', '⏎', '⌫', '⇥'])\n\nfunction key(part: string): HTMLElement {\n  return el('span', {\n    class: GLYPHS.has(part) ? 'kbd__key kbd__key--glyph' : 'kbd__key',\n    text: part,\n  })\n}\n\nfunction fill(kbd: HTMLElement, parts: string[]): void {\n  kbd.classList.add('kbd')\n  kbd.replaceChildren()\n  parts.forEach((part, index) => {\n    // A space between caps, so the container's text is still \"⌘ ⇧ C\".\n    if (index > 0) {\n      kbd.append(' ')\n    }\n    kbd.append(key(part))\n  })\n}\n\n/** Fill an existing <kbd> with one cap per key of a chord. */\nexport function fillKeycap(kbd: HTMLElement, shortcut: string): void {\n  fill(kbd, keycapParts(shortcut))\n}\n\n/** A new <kbd> of literal keys: `↑` `↓`, `esc`. */\nexport function renderKeys(parts: string[]): HTMLElement {\n  const kbd = el('kbd', { class: 'kbd', 'aria-hidden': 'true' })\n  fill(kbd, parts)\n  return kbd\n}\n","/**\n * The document title.\n *\n * \"Untitled document\" is placeholder text, never stored content — an empty\n * title stays empty all the way to the database.\n *\n * A title nobody typed is derived from the document's first line, and keeps\n * following it. The rule the field enforces is one flag: **the title is ours to\n * write while `derived` is true, and the moment the user types into the field it\n * is theirs, permanently.** Who gets to set that flag at boot is `main.ts`'s\n * decision, not this module's.\n */\n\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport { el } from './dom'\n\nexport const UNTITLED = 'Untitled document'\n\n/**\n * How much of a first line is a name.\n *\n * Well under the server's 255, because a title is a label and not a preview —\n * but the cap is also a contract, not a preference. A title over 255 gets a 400\n * from the documents API, and autosave answers a 400 by showing the message and\n * scheduling no retry, so an over-long derived title would stop the document\n * saving until its first line changed.\n */\nconst MAX_LENGTH = 120\n\n/** Below this, a word-boundary cut throws away more than the ellipsis saves. */\nconst MIN_WORD_CUT = 60\n\n/**\n * The first line of a document, as a name for it.\n *\n * The first non-empty text block, whatever kind it is — a heading, a paragraph,\n * a list item. Code blocks are skipped: `#!/usr/bin/env python` is a first line\n * but it is not a title.\n */\nexport function deriveTitle(doc: ProseMirrorNode): string {\n  return clamp(collapse(firstTextblockText(doc)))\n}\n\n/**\n * A hand-written walk rather than `doc.descendants()`, because `descendants`\n * cannot be stopped: returning false only prevents descent, and the callback\n * still runs for every remaining sibling. This runs on every keystroke.\n */\nfunction firstTextblockText(node: ProseMirrorNode): string {\n  for (let index = 0; index < node.childCount; index += 1) {\n    const child = node.child(index)\n\n    if (child.isTextblock) {\n      if (child.type.spec.code) {\n        continue\n      }\n      // Not `textContent`: that gives leaf nodes no text at all, so a hard\n      // break would silently join \"foo\" and \"bar\" into \"foobar\".\n      const text = child.textBetween(0, child.content.size, ' ', ' ').trim()\n      if (text) {\n        return text\n      }\n      continue\n    }\n\n    const nested = firstTextblockText(child)\n    if (nested) {\n      return nested\n    }\n  }\n  return ''\n}\n\nfunction collapse(text: string): string {\n  return text.replace(/\\s+/g, ' ').trim()\n}\n\nfunction clamp(text: string): string {\n  if (text.length <= MAX_LENGTH) {\n    return text\n  }\n  const cut = text.slice(0, MAX_LENGTH)\n  const lastSpace = cut.lastIndexOf(' ')\n  // A single very long token has no boundary to find; cutting bluntly is the\n  // point, because the length is a guarantee and not a preference.\n  return (lastSpace >= MIN_WORD_CUT ? cut.slice(0, lastSpace) : cut).trimEnd()\n}\n\nexport interface TitleField {\n  element: HTMLInputElement\n  value: () => string\n  /** Write a derived title. A no-op once the user has typed one of their own. */\n  derive: (text: string) => void\n  /** Whether the current title is still ours to write. `main.ts` decides. */\n  setDerived: (derived: boolean) => void\n  /** Whether the title is derived right now. */\n  isDerived: () => boolean\n  /**\n   * Put a title in the field regardless of whose it is.\n   *\n   * The one caller is conflict resolution: adopting the server's document means\n   * adopting its name, and the `derived` flag has nothing to say about a title\n   * somebody else typed.\n   */\n  replace: (value: string) => void\n  /** A guest can read the name of the document they are editing, not write it. */\n  setReadOnly: () => void\n}\n\nexport function createTitleField(options: {\n  initial: string\n  onChange: (title: string) => void\n}): TitleField {\n  const input = el('input', {\n    type: 'text',\n    class: 'pasty-title',\n    placeholder: UNTITLED,\n    'aria-label': 'Document title',\n    maxlength: '255',\n    value: options.initial,\n  })\n\n  input.value = options.initial\n\n  // A title that arrived with the document is not ours until `main.ts` says so.\n  let derived = options.initial.trim() === ''\n\n  const syncDocumentTitle = () => {\n    document.title = `${input.value.trim() || UNTITLED} · Pasty`\n  }\n\n  input.addEventListener('input', () => {\n    // First, and unconditionally: from here the title is the user's.\n    derived = false\n    syncDocumentTitle()\n    options.onChange(input.value)\n  })\n\n  input.addEventListener('keydown', event => {\n    if (event.key === 'Enter') {\n      event.preventDefault()\n      input.blur()\n    }\n  })\n\n  syncDocumentTitle()\n\n  return {\n    element: input,\n    value: () => input.value,\n    derive: text => {\n      // The equality check is not just an optimisation: assigning to a focused\n      // input moves the caret to the end, and the steady state here is that\n      // nothing changed.\n      if (!derived || input.value === text) {\n        return\n      }\n      input.value = text\n      syncDocumentTitle()\n      // Deliberately not `options.onChange`: this is called *from* the document\n      // change handler, and calling back into it has no fixpoint.\n    },\n    setDerived: next => {\n      derived = next\n    },\n    isDerived: () => derived,\n    replace: value => {\n      input.value = value\n      // The title came from the server, so it is not ours to keep rewriting\n      // from the first line — unless there is none, which is the same \"no title\n      // yet\" state the field boots in.\n      derived = value.trim() === ''\n      syncDocumentTitle()\n    },\n    setReadOnly: () => {\n      input.readOnly = true\n      // Not `disabled`: the name is still worth reading, and a disabled input\n      // is skipped by the keyboard and dimmed as if it were broken.\n      input.setAttribute('aria-readonly', 'true')\n      input.title = 'Only the owner can rename this document'\n    },\n  }\n}\n","/**\n * The command palette.\n *\n * ⌘K opens one surface for the things Pasty can do that its chrome either hides\n * behind a menu or does not offer at the keyboard at all. It is also the cheat\n * sheet: a row with a chord of its own wears it as a keycap on the right, so\n * every opening teaches the faster route, and the first nine recent documents\n * are ⌘1–⌘9 whether or not the palette is open.\n *\n * The chords are dispatched from here as well — one capture-phase listener on\n * the document, for the reason ⌘K always was: nothing downstream, Vim mode\n * included, can swallow a chord the palette advertises. What is drawn and what\n * is matched come from the same item list, so the two cannot disagree.\n *\n * The surface is a native `<dialog>` opened with `showModal()`: the top layer,\n * the backdrop, the focus trap and Escape all come from the platform, the same\n * instinct that made the menus native `<details>` and the style control a\n * native `<select>`.\n *\n * Inside it is a **combobox, not a menu**. Focus stays in the input and\n * `aria-activedescendant` moves across the rows. `menus.ts` moves real DOM\n * focus between rows, which is right for a handful of static rows and fights a\n * filter field.\n *\n * `rankCommands` is a pure function so the matching can be tested without a\n * DOM, the same seam `resolveTheme` gives appearance.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport type { DocumentsApi } from './api'\nimport { clear, el, icon } from './dom'\nimport { LINK_SHORTCUT_EVENT } from './editor'\nimport { ICONS } from './icons'\nimport { fillKeycap, renderKeys } from './keycaps'\nimport type { SettingsController } from './settings'\nimport type { ShareController } from './share-controller'\nimport { IS_MAC, keycapParts, matchesShortcut, shortcutAria } from './shortcuts'\nimport type { ThemeController, ThemePreference } from './theme'\nimport { UNTITLED } from './title'\nimport type { DocumentSummary, PastyConfig } from './types'\nimport type { VimController } from './vim-controller'\n\n/* Hardcoded the way `urls` in the bootstrap payload and the header template\n   already hardcode `/`, `/d/`, `/login` and `/signup`. Adding them to the\n   payload would put authenticated-only routes in every anonymous page's\n   configuration to save two literals. */\nconst NEW_DOCUMENT_URL = '/new'\nconst CLI_URL = '/settings/cli'\n\n/** How many recent documents get a digit: ⌘1 is the most recent other document. */\nconst DOCUMENT_SHORTCUTS = 9\n/** With no query the palette is a shortlist, not a file browser — and exactly\n    the documents the digits reach, so every row it shows is a chord it teaches. */\nconst RECENT_LIMIT = DOCUMENT_SHORTCUTS\n/** With a query it still is not: nobody reads the sixtieth match. */\nconst MAX_ROWS = 60\n/** Long enough for a save on a bad connection, short enough not to strand anyone. */\nconst FLUSH_TIMEOUT_MS = 1500\n\nconst SECTIONS = ['Actions', 'Recent documents', 'Account'] as const\ntype Section = (typeof SECTIONS)[number]\n\nconst APPEARANCE: { value: ThemePreference; label: string }[] = [\n  { value: 'system', label: 'Appearance: System' },\n  { value: 'light', label: 'Appearance: Light' },\n  { value: 'dark', label: 'Appearance: Dark' },\n]\n\n// ---------------------------------------------------------------------------\n// matching\n// ---------------------------------------------------------------------------\n\nexport interface Rankable {\n  label: string\n  keywords?: string[]\n  /** Documents are ranked against commands; see `DOCUMENT_PENALTY`. */\n  kind?: 'command' | 'document'\n}\n\n/**\n * How well a row matched, best kind of match first. The gaps are wide so a\n * weaker match never creeps past a stronger one on a tie-break.\n */\nconst SCORE = {\n  prefix: 100,\n  wordStart: 80,\n  substring: 60,\n  keywordPrefix: 50,\n  keyword: 40,\n  subsequence: 20,\n}\n\n/**\n * A command outranks a document *at the same kind of match*, and no further:\n * the penalty is far smaller than one tier, so a document whose title starts\n * with the query still beats a command that merely contains it.\n */\nconst DOCUMENT_PENALTY = 5\n\nconst WORD_BREAK = /[\\s\\-–—:/(_.]/\n\n/** Every character of `needle`, in order, somewhere in `haystack`. */\nfunction isSubsequence(haystack: string, needle: string): boolean {\n  let at = 0\n  for (const character of needle) {\n    // Spaces are skipped, so \"copym\" finds \"Copy Markdown\" too.\n    if (character === ' ') {\n      continue\n    }\n    at = haystack.indexOf(character, at)\n    if (at < 0) {\n      return false\n    }\n    at += 1\n  }\n  return true\n}\n\nfunction scoreText(text: string, query: string): number {\n  const lower = text.toLowerCase()\n  if (lower.startsWith(query)) {\n    return SCORE.prefix\n  }\n  const index = lower.indexOf(query)\n  if (index > 0) {\n    return WORD_BREAK.test(lower[index - 1]) ? SCORE.wordStart : SCORE.substring\n  }\n  return isSubsequence(lower, query) ? SCORE.subsequence : 0\n}\n\nfunction scoreItem(item: Rankable, query: string): number {\n  let best = scoreText(item.label, query)\n  for (const keyword of item.keywords ?? []) {\n    const lower = keyword.toLowerCase()\n    if (lower.startsWith(query)) {\n      best = Math.max(best, SCORE.keywordPrefix)\n    } else if (lower.includes(query)) {\n      best = Math.max(best, SCORE.keyword)\n    }\n  }\n  return best\n}\n\n/**\n * Filter and order rows for a query. An empty query keeps everything in the\n * order it was declared, which is the order the palette wants to show when it\n * has nothing else to go on.\n */\nexport function rankCommands<T extends Rankable>(query: string, items: T[]): T[] {\n  const needle = query.trim().toLowerCase()\n  if (needle === '') {\n    return [...items]\n  }\n  return items\n    .map((item, order) => ({\n      item,\n      order,\n      score: scoreItem(item, needle) - (item.kind === 'document' ? DOCUMENT_PENALTY : 0),\n    }))\n    .filter(entry => entry.score > 0)\n    .sort((a, b) => b.score - a.score || a.order - b.order)\n    .map(entry => entry.item)\n}\n\n// ---------------------------------------------------------------------------\n// the palette\n// ---------------------------------------------------------------------------\n\ninterface PaletteItem extends Rankable {\n  id: string\n  section: Section\n  /** The chord that runs this row from anywhere, in Tiptap's spelling\n      (\"Mod+Shift+C\"). Drawn as a keycap on the right of the row. */\n  shortcut?: string\n  /** The editor's own keymap owns the chord, because it needs the caret. The\n      row advertises it; the dispatcher below leaves it alone. */\n  editorShortcut?: boolean\n  /** A second, quieter line under the label. Rows with one are the exception. */\n  description?: string\n  /** Marked with a check: the appearance that is already in effect. */\n  current?: boolean\n  run: () => void\n}\n\nexport interface PaletteOptions {\n  editor: Editor\n  theme: ThemeController\n  vim: VimController\n  settings: SettingsController\n  config: PastyConfig\n  api: DocumentsApi\n  /** Sharing, so the palette row and the header button are one action. */\n  share: ShareController\n  /** The document title field, so Rename can put the caret in it. */\n  title: HTMLInputElement\n  /** Copy the whole document and confirm it, exactly as the header button does. */\n  copy: () => Promise<boolean>\n  /** Save now; navigation waits on this so a keystroke cannot outrun a save. */\n  flush: () => Promise<void>\n  /** Leave for another page. Injected, like `flush`, so a test can see where a\n      chord went: jsdom's `location` cannot be observed. */\n  navigate: (url: string) => void\n  /** The document being edited, which is the one row worth leaving out. */\n  currentDocumentId: () => string | null\n  /**\n   * Delete the document on screen and leave the page.\n   *\n   * Confirming, flushing and stopping autosave all live at the call site: the\n   * palette knows which row to offer, not what a page has in flight.\n   */\n  deleteDocument: () => void\n  /**\n   * Whether this page still holds work the server has not taken.\n   *\n   * Checked *after* the flush below, so it only ever says yes when saving is\n   * genuinely stuck — a conflict waiting on an answer, most likely. Navigating\n   * then would be answering it by walking away.\n   */\n  blocked?: () => boolean\n}\n\nexport function installPalette(options: PaletteOptions): () => void {\n  const { api, config, editor, settings, theme, vim } = options\n  const authenticated = config.user.is_authenticated\n\n  // Old Safari has no top layer to put this in. Rather than reimplement one,\n  // leave the menus as they were: nothing announces a palette that isn't there.\n  if (typeof HTMLDialogElement === 'undefined' || !HTMLDialogElement.prototype.showModal) {\n    return () => {}\n  }\n\n  // --- surface --------------------------------------------------------------\n\n  const input = el('input', {\n    class: 'palette__input',\n    type: 'text',\n    role: 'combobox',\n    'aria-expanded': 'true',\n    'aria-controls': 'palette-list',\n    'aria-autocomplete': 'list',\n    'aria-label': authenticated ? 'Search commands and documents' : 'Search commands',\n    placeholder: authenticated ? 'Search commands and documents…' : 'Search commands…',\n    autocomplete: 'off',\n    autocorrect: 'off',\n    autocapitalize: 'off',\n    spellcheck: 'false',\n  })\n\n  const glyph = icon(ICONS.search, 15)\n  glyph.classList.add('palette__glyph')\n\n  const list = el('div', {\n    class: 'palette__list',\n    id: 'palette-list',\n    role: 'listbox',\n    'aria-label': 'Commands',\n  })\n\n  const empty = el('p', { class: 'palette__empty' })\n  empty.hidden = true\n\n  const dialog = el(\n    'dialog',\n    { class: 'palette', 'aria-label': 'Command palette' },\n    el('div', { class: 'palette__field' }, glyph, input),\n    list,\n    empty,\n  )\n  document.body.append(dialog)\n\n  // The palette's own keys, taught in a footer. Hidden from assistive\n  // technology: the combobox already announces its keyboard model.\n  dialog.append(\n    el(\n      'div',\n      { class: 'palette__footer', 'aria-hidden': 'true' },\n      el('span', { class: 'palette__hint' }, renderKeys(['↑', '↓']), 'Navigate'),\n      el('span', { class: 'palette__hint' }, renderKeys(['↵']), 'Run'),\n      el('span', { class: 'palette__hint' }, renderKeys(['esc']), 'Close'),\n    ),\n  )\n\n  // --- state ----------------------------------------------------------------\n\n  /** The rows on screen, in the order they are rendered. */\n  let rows: PaletteItem[] = []\n  let active = 0\n  let documents: DocumentSummary[] = []\n  let documentsLoaded = false\n  let loadingDocuments = false\n  /** Run after the dialog closes, so a command that wants focus can have it. */\n  let pending: (() => void) | null = null\n\n  // --- leaving the page -----------------------------------------------------\n\n  /**\n   * Navigation waits for the save. Switching documents used to mean opening a\n   * menu and finding a title; from here it is two keystrokes, which is fast\n   * enough to outrun a save in flight and take the last sentence typed with it.\n   */\n  const leave = (go: () => void) => {\n    const proceed = () => {\n      if (options.blocked?.()) {\n        // Saving is stuck and there is a question on screen about it. Stay.\n        return\n      }\n      go()\n    }\n    const saved = options.flush().catch(() => {})\n    const timer = window.setTimeout(proceed, FLUSH_TIMEOUT_MS)\n    void saved.then(() => {\n      window.clearTimeout(timer)\n      proceed()\n    })\n  }\n\n  const goTo = (url: string) => () => leave(() => options.navigate(url))\n\n  const logOut = () => {\n    const form = document.querySelector<HTMLFormElement>('form.logout-form')\n    if (!form) {\n      return\n    }\n    // A POST, because logging out with a GET is a link any page can pull.\n    leave(() => (form.requestSubmit ? form.requestSubmit() : form.submit()))\n  }\n\n  // --- the command set ------------------------------------------------------\n\n  const actionItems = (): PaletteItem[] => {\n    const items: PaletteItem[] = [\n      {\n        // The obvious chord. It was left to the devtools element picker for a\n        // while; the picker has a toolbar button and ⌘⌥I, and the product's\n        // most important action gets the shortcut people reach for first.\n        id: 'copy',\n        label: 'Copy Markdown',\n        section: 'Actions',\n        shortcut: 'Mod+Shift+C',\n        keywords: ['clipboard', 'export', 'markdown'],\n        run: () => void options.copy(),\n      },\n      {\n        // The same click the header's Private / Shared toggle is, in both\n        // directions, so the row says which one it is about to be: a private\n        // document is shared and its link copied, a shared one stops being\n        // shared. An anonymous visitor gets the popover's signup invitation\n        // instead. No 'public' in the keywords: the link is deliberately\n        // unlisted.\n        id: 'share',\n        label: options.share.shared() ? 'Unshare document' : 'Share document',\n        section: 'Actions',\n        // L for the link. ⌘⇧S is Strike's — still bound, even though the\n        // toolbar hides it.\n        shortcut: 'Mod+Shift+L',\n        keywords: options.share.shared()\n          ? ['unshare', 'stop sharing', 'private', 'revoke', 'link']\n          : ['share', 'link', 'copy link', 'send', 'read-only'],\n        run: () => options.share.toggle(),\n      },\n      {\n        // Not ⌘N: Chrome and Firefox reserve it for a new window and never let a\n        // page cancel it. ⌘⌥ is the family the headings and the code block use.\n        id: 'new',\n        label: 'New document',\n        section: 'Actions',\n        shortcut: 'Mod+Alt+N',\n        keywords: ['create', 'blank', 'add'],\n        run: goTo(NEW_DOCUMENT_URL),\n      },\n    ]\n\n    if (authenticated) {\n      items.push(\n        {\n          id: 'rename',\n          label: 'Rename document',\n          section: 'Actions',\n          shortcut: 'Mod+Shift+R',\n          keywords: ['title'],\n          run: () => {\n            options.title.focus()\n            options.title.select()\n          },\n        },\n      )\n    }\n\n    // The header's second toggle. Unlike the header, the palette offers it on a\n    // private document too — Make editable there shares the document and opens\n    // it for editing in one go, because a palette row has no neighbour to be\n    // clicked first. No chord: turning editing on reloads the page, which is\n    // not a thing to do from a stray keystroke.\n    if (authenticated) {\n      items.push({\n        id: 'share-edit',\n        label: options.share.editable() ? 'Make read-only' : 'Make editable',\n        section: 'Actions',\n        keywords: [\n          'allow editing',\n          'edit link',\n          'collaborate',\n          'read-only',\n          'editable',\n          'guest',\n          'live',\n        ],\n        run: () => options.share.toggleEditing(),\n      })\n    }\n\n    // Only for a document that exists server-side: an anonymous draft and an\n    // unconverted new page have nothing to delete, and a row that answered\n    // \"nothing happened\" would be worse than no row. No chord — see\n    // docs/keyboard-shortcuts.md; this is the one action where a stray\n    // keystroke is unrecoverable.\n    if (authenticated && options.currentDocumentId()) {\n      items.push({\n        id: 'delete',\n        label: 'Delete document',\n        description: 'For good, for everyone with a link',\n        section: 'Actions',\n        keywords: ['remove', 'trash', 'destroy'],\n        run: () => options.deleteDocument(),\n      })\n    }\n\n    // The one formatting command, and only because the palette took its\n    // shortcut: ⌘K → \"link\" → Enter still works, and the row is where anyone\n    // finds out the binding moved.\n    items.push({\n      id: 'link',\n      label: 'Insert link',\n      section: 'Actions',\n      shortcut: 'Mod+Shift+K',\n      editorShortcut: true,\n      keywords: ['url', 'href', 'anchor'],\n      run: () =>\n        editor.view.dom.dispatchEvent(new CustomEvent(LINK_SHORTCUT_EVENT, { bubbles: true })),\n    })\n\n    for (const choice of APPEARANCE) {\n      items.push({\n        id: `theme-${choice.value}`,\n        label: choice.label,\n        section: 'Actions',\n        keywords: ['theme', 'colour', 'color', 'mode', 'dark mode'],\n        current: theme.preference() === choice.value,\n        run: () => theme.set(choice.value),\n      })\n    }\n\n    // The label carries the state, so this row needs no check mark: \"Disable Vim\n    // mode\" already says it is on. Items are rebuilt on every render, so the\n    // label is current without anything having to invalidate it.\n    const vimOn = vim.enabled()\n    items.push({\n      id: 'vim',\n      label: vimOn ? 'Disable Vim mode' : 'Enable Vim mode',\n      description: vimOn\n        ? 'Return to standard editor controls'\n        : 'Use Vim keybindings while editing',\n      section: 'Actions',\n      keywords: ['vim', 'vi', 'vim mode', 'keybindings', 'keyboard', 'modal editing'],\n      run: () => vim.toggle(),\n    })\n\n    items.push({\n      id: 'settings',\n      label: 'Settings',\n      section: 'Actions',\n      shortcut: 'Mod+,',\n      keywords: ['settings', 'preferences', 'options'],\n      // Toggle, not open: the row and the chord are one mapping, and the chord\n      // pressed a second time should take the dialog away again.\n      run: () => settings.toggle(),\n    })\n\n    return items\n  }\n\n  const documentItems = (): PaletteItem[] => {\n    const current = options.currentDocumentId()\n    return documents\n      .filter(document => document.id !== current)\n      .map((document, index) => ({\n        id: `doc-${document.id}`,\n        label: document.title.trim() || UNTITLED,\n        section: 'Recent documents' as const,\n        kind: 'document' as const,\n        // Numbered by recency, not by row: a filtered list still says ⌘4 on the\n        // fourth most recent document, and the current one — filtered out\n        // above — never takes a digit from the others.\n        shortcut: index < DOCUMENT_SHORTCUTS ? `Mod+${index + 1}` : undefined,\n        run: goTo(`${config.urls.doc_base}${document.id}`),\n      }))\n  }\n\n  const accountItems = (): PaletteItem[] =>\n    authenticated\n      ? [\n          {\n            id: 'cli',\n            label: 'CLI access',\n            section: 'Account',\n            keywords: ['terminal', 'token', 'api', 'pasty'],\n            run: goTo(CLI_URL),\n          },\n          {\n            id: 'logout',\n            label: 'Log out',\n            section: 'Account',\n            keywords: ['sign out', 'signout', 'leave'],\n            run: logOut,\n          },\n        ]\n      : [\n          {\n            id: 'login',\n            label: 'Log in',\n            section: 'Account',\n            keywords: ['sign in', 'signin', 'account'],\n            run: goTo(config.urls.login),\n          },\n          {\n            id: 'signup',\n            label: 'Create account',\n            section: 'Account',\n            keywords: ['sign up', 'signup', 'register', 'join'],\n            run: goTo(config.urls.signup),\n          },\n        ]\n\n  /** Declared order is also rank order at equal scores, and section order. */\n  const allItems = (): PaletteItem[] => [...actionItems(), ...documentItems(), ...accountItems()]\n\n  // --- documents ------------------------------------------------------------\n\n  /**\n   * Fetched once, then filtered locally. The server caps the list, so a query\n   * costs nothing per keystroke. Failure is not fatal — the commands still\n   * work, the documents section simply does not appear.\n   */\n  const loadDocuments = () => {\n    if (!authenticated || documentsLoaded || loadingDocuments) {\n      return\n    }\n    loadingDocuments = true\n    void api\n      .list()\n      .then(payload => {\n        documents = payload.documents\n        documentsLoaded = true\n        if (dialog.open) {\n          render()\n        }\n      })\n      .catch(() => {})\n      .finally(() => {\n        loadingDocuments = false\n        if (dialog.open) {\n          render()\n        }\n      })\n  }\n\n  // --- rendering ------------------------------------------------------------\n\n  const optionElements = () => Array.from(list.querySelectorAll<HTMLElement>('.palette__option'))\n\n  const setActive = (index: number) => {\n    const elements = optionElements()\n    if (elements.length === 0) {\n      active = 0\n      input.removeAttribute('aria-activedescendant')\n      return\n    }\n    active = (index + elements.length) % elements.length\n    elements.forEach((element, at) => {\n      const on = at === active\n      element.setAttribute('aria-selected', String(on))\n      element.classList.toggle('is-active', on)\n    })\n    input.setAttribute('aria-activedescendant', elements[active].id)\n    elements[active].scrollIntoView({ block: 'nearest' })\n  }\n\n  const renderRow = (item: PaletteItem, index: number): HTMLElement => {\n    const label = el('span', { class: 'palette__label', text: item.label })\n    const row = el(\n      'div',\n      {\n        class: 'palette__option',\n        role: 'option',\n        id: `palette-option-${index}`,\n        'data-index': String(index),\n        'aria-selected': 'false',\n      },\n      item.description\n        ? el(\n            'span',\n            { class: 'palette__text' },\n            label,\n            el('span', { class: 'palette__description', text: item.description }),\n          )\n        : label,\n    )\n    if (item.current) {\n      const mark = icon(ICONS.check, 13)\n      mark.classList.add('palette__check')\n      row.append(mark)\n    } else if (item.shortcut) {\n      // The header cue's idiom: one cap per key, hidden from assistive\n      // technology, which gets the chord through `aria-keyshortcuts` and the\n      // row's name from the label alone.\n      row.setAttribute('aria-keyshortcuts', shortcutAria(item.shortcut))\n      const cap = el('kbd', { class: 'palette__key', 'aria-hidden': 'true' })\n      fillKeycap(cap, item.shortcut)\n      row.append(cap)\n    }\n    return row\n  }\n\n  function render(): void {\n    const query = input.value\n    const filtering = query.trim() !== ''\n    const ranked = rankCommands(query, allItems())\n\n    // With no query the documents are a shortlist. With one they are the point.\n    let seenDocuments = 0\n    const shown = ranked\n      .filter(item => filtering || item.kind !== 'document' || ++seenDocuments <= RECENT_LIMIT)\n      .slice(0, MAX_ROWS)\n\n    // The section headers stay while typing, even over a single row: dropping\n    // them pulled the list up from under the eye on the first keystroke. With a\n    // query, the section holding the best match leads and rows keep their rank\n    // within a section, so the best match is still the first row — and, since\n    // `rows` is in the order rendered, the one Enter runs.\n    const order: readonly Section[] = filtering\n      ? [...new Set(shown.map(item => item.section))]\n      : SECTIONS\n    rows = order.flatMap(section => shown.filter(item => item.section === section))\n\n    clear(list)\n    // \"No matches\" would be a lie while the documents are still arriving, and a\n    // silent one: Enter on an empty list does nothing, and nothing on screen\n    // would say why.\n    empty.textContent = loadingDocuments ? 'Searching documents…' : 'No matches'\n    empty.hidden = rows.length > 0\n    list.hidden = rows.length === 0\n\n    let index = 0\n    for (const section of order) {\n      const inSection = rows.filter(item => item.section === section)\n      if (inSection.length === 0) {\n        continue\n      }\n      // A `group` rather than a bare heading: a listbox's children have to be\n      // options or groups, and the visible header is the group's label twice.\n      const group = el(\n        'div',\n        { class: 'palette__group', role: 'group', 'aria-label': section },\n        el('p', { class: 'palette__section', text: section, 'aria-hidden': 'true' }),\n      )\n      for (const item of inSection) {\n        group.append(renderRow(item, index))\n        index += 1\n      }\n      list.append(group)\n    }\n\n    setActive(0)\n  }\n\n  // --- opening and closing --------------------------------------------------\n\n  const close = () => {\n    if (dialog.open) {\n      dialog.close()\n    }\n  }\n\n  const open = () => {\n    if (dialog.open) {\n      return\n    }\n    input.value = ''\n    render()\n    dialog.showModal()\n    input.focus()\n    loadDocuments()\n  }\n\n  const runActive = () => {\n    const item = rows[active]\n    if (!item) {\n      return\n    }\n    // Closing first, running second: a command that moves focus (Rename, Insert\n    // link) would otherwise be fighting the dialog's own focus restoration.\n    pending = item.run\n    close()\n  }\n\n  dialog.addEventListener('close', () => {\n    const command = pending\n    pending = null\n    // Back to the document by default — the same contract the link popover\n    // keeps. Commands that want focus elsewhere take it below.\n    editor.commands.focus()\n    command?.()\n  })\n\n  // A click that lands on the dialog itself landed on the backdrop; the panel\n  // has no padding of its own for a click to fall into.\n  dialog.addEventListener('mousedown', event => {\n    if (event.target === dialog) {\n      close()\n    }\n  })\n\n  dialog.addEventListener('keydown', event => {\n    if (event.key === 'ArrowDown') {\n      event.preventDefault()\n      setActive(active + 1)\n    } else if (event.key === 'ArrowUp') {\n      event.preventDefault()\n      setActive(active - 1)\n    } else if (event.key === 'Enter') {\n      event.preventDefault()\n      runActive()\n    }\n  })\n\n  input.addEventListener('input', () => render())\n\n  // Keeps the caret in the field: a row is activated, never focused.\n  list.addEventListener('mousedown', event => event.preventDefault())\n\n  list.addEventListener('click', event => {\n    const row = (event.target as HTMLElement).closest<HTMLElement>('.palette__option')\n    if (row) {\n      setActive(Number(row.dataset.index))\n      runActive()\n    }\n  })\n\n  // `mousemove`, not `mouseover`: a list that re-renders under a stationary\n  // pointer would otherwise steal the row the keyboard just chose.\n  list.addEventListener('mousemove', event => {\n    const row = (event.target as HTMLElement).closest<HTMLElement>('.palette__option')\n    if (row) {\n      setActive(Number(row.dataset.index))\n    }\n  })\n\n  // --- shortcuts ------------------------------------------------------------\n\n  /**\n   * A claimed chord: the browser does not act on it, and neither does anything\n   * below this listener. The second half matters off macOS, where Mod is Ctrl\n   * and Vim reads Ctrl+Shift+R as its own redo and Ctrl+Shift+C as Escape.\n   */\n  const claim = (event: KeyboardEvent) => {\n    event.preventDefault()\n    event.stopPropagation()\n  }\n\n  // Capture, on the document, so nothing downstream can swallow a chord first —\n  // not a focused input, not Vim mode. The browser's own bindings (⌘K is the\n  // address bar in Chrome and Firefox alike, ⌘1 is a tab) are what\n  // `preventDefault` is for, and only a chord with a row behind it is claimed:\n  // ⌘3 with two other documents stays the browser's.\n  const onKeyDown = (event: KeyboardEvent) => {\n    if (matchesShortcut(event, 'Mod+K')) {\n      claim(event)\n      if (event.repeat) {\n        return\n      }\n      if (dialog.open) {\n        close()\n      } else {\n        open()\n      }\n      return\n    }\n    // The cheap test first: ordinary typing must not build the item list.\n    const primary = IS_MAC ? event.metaKey : event.ctrlKey\n    const other = IS_MAC ? event.ctrlKey : event.metaKey\n    if (!primary || other) {\n      return\n    }\n    const item = allItems().find(\n      candidate =>\n        candidate.shortcut !== undefined &&\n        !candidate.editorShortcut &&\n        matchesShortcut(event, candidate.shortcut),\n    )\n    if (!item) {\n      return\n    }\n    // Under another modal — Settings — a popover would open inert and the title\n    // field would take focus it cannot have. Only the chord that closes the\n    // modal acts there.\n    const host = (event.target as Element | null)?.closest?.('dialog[open]') ?? null\n    if (host && host !== dialog && item.id !== 'settings') {\n      return\n    }\n    claim(event)\n    // A held key repeats; a navigation or a copy must not.\n    if (event.repeat) {\n      return\n    }\n    if (dialog.open) {\n      // The same deferral Enter gets: close first, run once focus is back.\n      pending = item.run\n      close()\n    } else {\n      item.run()\n    }\n  }\n  document.addEventListener('keydown', onKeyDown, true)\n\n  // Fetched now rather than on first open: ⌘1 has to know its document before\n  // the palette has ever been seen, and a digit with no document behind it has\n  // to be left to the browser — a decision that can only be made if the answer\n  // is already here.\n  loadDocuments()\n\n  // --- discoverability ------------------------------------------------------\n\n  // Server-rendered and hidden, because a row that needs this module to work\n  // should not exist before it runs. The hint is filled in here: only the\n  // browser knows whether that key is called Command or Ctrl.\n  for (const element of document.querySelectorAll<HTMLElement>('[data-palette-chrome]')) {\n    element.hidden = false\n  }\n  for (const trigger of document.querySelectorAll<HTMLElement>('[data-palette-open]')) {\n    const hint = trigger.querySelector('[data-palette-hint]')\n    if (hint) {\n      hint.replaceChildren(renderKeys(keycapParts('Mod+K')))\n    }\n    // The header cue is the chord itself, drawn as keycaps instead of spelled\n    // out as hint text. Same seam, different treatment.\n    const keys = trigger.querySelector<HTMLElement>('[data-palette-keys]')\n    if (keys) {\n      fillKeycap(keys, 'Mod+K')\n      trigger.setAttribute('aria-keyshortcuts', shortcutAria('Mod+K'))\n    }\n    trigger.addEventListener('click', () => {\n      trigger.closest('details')?.removeAttribute('open')\n      open()\n    })\n  }\n\n  return () => {\n    document.removeEventListener('keydown', onKeyDown, true)\n    close()\n    dialog.remove()\n  }\n}\n","/**\n * Settings.\n *\n * A native `<dialog>`, built the way the palette is: the top layer, the backdrop,\n * the focus trap and Escape all come from the platform, and closing returns\n * focus to the document.\n *\n * A dialog rather than a server-rendered page, because the two things a settings\n * page here has to do are things a page cannot: work for a visitor with no\n * account (the preference lives in localStorage), and change the running editor\n * without a reload. Both controllers it binds are the same ones the header menus\n * use, so a preference changed here and a preference changed there can never\n * disagree — there is one source of truth per setting and this is only another\n * view of it.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport { el } from './dom'\nimport type { ThemeController, ThemePreference } from './theme'\nimport type { VimController } from './vim-controller'\n\nconst APPEARANCE: { value: ThemePreference; label: string }[] = [\n  { value: 'system', label: 'System' },\n  { value: 'light', label: 'Light' },\n  { value: 'dark', label: 'Dark' },\n]\n\nexport interface SettingsController {\n  open: () => void\n  close: () => void\n  /** Open if closed, close if open: what the ⌘, chord does. */\n  toggle: () => void\n  destroy: () => void\n}\n\nexport interface SettingsOptions {\n  editor: Editor\n  theme: ThemeController\n  vim: VimController\n}\n\n/** A no-op controller, for browsers with no `<dialog>` — see `installSettings`. */\nconst INERT: SettingsController = {\n  open: () => {},\n  close: () => {},\n  toggle: () => {},\n  destroy: () => {},\n}\n\nexport function installSettings(options: SettingsOptions): SettingsController {\n  const { editor, theme, vim } = options\n\n  // Same exclusion the palette makes: rather than reimplement a top layer for\n  // browsers that have none, leave the header menus as the way to change the\n  // theme. Vim mode is then unreachable in those browsers, which is stated in\n  // DESIGN.md rather than papered over.\n  if (typeof HTMLDialogElement === 'undefined' || !HTMLDialogElement.prototype.showModal) {\n    return INERT\n  }\n\n  // --- surface --------------------------------------------------------------\n\n  const vimLabel = el('span', {\n    class: 'settings__label',\n    id: 'settings-vim-label',\n    text: 'Vim mode',\n  })\n  const vimSwitch = el(\n    'button',\n    {\n      type: 'button',\n      class: 'settings__switch',\n      role: 'switch',\n      'aria-checked': 'false',\n      'aria-labelledby': 'settings-vim-label',\n      'data-settings-vim': '',\n    },\n    el('span', { class: 'settings__knob' }),\n  )\n\n  const editorSection = el(\n    'section',\n    { class: 'settings__group' },\n    el('h3', { class: 'settings__section', text: 'Editor' }),\n    el(\n      'div',\n      { class: 'settings__row' },\n      el(\n        'span',\n        { class: 'settings__text' },\n        vimLabel,\n        el('span', {\n          class: 'settings__description',\n          text: 'Use Vim keybindings while editing documents.',\n        }),\n      ),\n      vimSwitch,\n    ),\n  )\n\n  const choices = APPEARANCE.map(choice =>\n    el('button', {\n      type: 'button',\n      class: 'settings__choice',\n      role: 'radio',\n      'aria-checked': 'false',\n      'data-settings-theme': choice.value,\n      text: choice.label,\n    }),\n  )\n\n  const appearanceSection = el(\n    'section',\n    { class: 'settings__group' },\n    el('h3', { class: 'settings__section', id: 'settings-appearance', text: 'Appearance' }),\n    el(\n      'div',\n      { class: 'settings__choices', role: 'radiogroup', 'aria-labelledby': 'settings-appearance' },\n      ...choices,\n    ),\n  )\n\n  const done = el('button', { type: 'button', class: 'btn btn--quiet settings__done', text: 'Done' })\n\n  const dialog = el(\n    'dialog',\n    { class: 'settings', 'aria-labelledby': 'settings-title' },\n    el(\n      'div',\n      { class: 'settings__head' },\n      el('h2', { class: 'settings__title', id: 'settings-title', text: 'Settings' }),\n      done,\n    ),\n    el('div', { class: 'settings__body' }, editorSection, appearanceSection),\n  )\n  document.body.append(dialog)\n\n  // --- binding --------------------------------------------------------------\n\n  vimSwitch.addEventListener('click', () => vim.toggle())\n  vim.subscribe(enabled => vimSwitch.setAttribute('aria-checked', String(enabled)))\n\n  for (const choice of choices) {\n    choice.addEventListener('click', () =>\n      theme.set(choice.dataset.settingsTheme as ThemePreference),\n    )\n  }\n  theme.subscribe(preference => {\n    for (const choice of choices) {\n      choice.setAttribute('aria-checked', String(choice.dataset.settingsTheme === preference))\n    }\n  })\n\n  // --- opening and closing --------------------------------------------------\n\n  const close = () => {\n    if (dialog.open) {\n      dialog.close()\n    }\n  }\n\n  const open = () => {\n    if (dialog.open) {\n      return\n    }\n    dialog.showModal()\n    // Not the switch: opening a dialog with focus on a control that Space\n    // toggles is a way to change a setting by accident.\n    done.focus()\n  }\n\n  const toggle = () => {\n    if (dialog.open) {\n      close()\n    } else {\n      open()\n    }\n  }\n\n  done.addEventListener('click', close)\n\n  // A click that lands on the dialog itself landed on the backdrop.\n  dialog.addEventListener('mousedown', event => {\n    if (event.target === dialog) {\n      close()\n    }\n  })\n\n  // The same contract the palette and the link popover keep: whatever closed\n  // this, the caret goes back where the work is.\n  dialog.addEventListener('close', () => editor.commands.focus())\n\n  // --- discoverability ------------------------------------------------------\n\n  // Server-rendered hidden, unhidden here, exactly as the palette's own row is:\n  // a row that needs this module should not exist before this module runs.\n  for (const element of document.querySelectorAll<HTMLElement>('[data-settings-chrome]')) {\n    element.hidden = false\n  }\n  for (const trigger of document.querySelectorAll<HTMLElement>('[data-settings-open]')) {\n    trigger.addEventListener('click', () => {\n      trigger.closest('details')?.removeAttribute('open')\n      open()\n    })\n  }\n\n  return {\n    open,\n    close,\n    toggle,\n    destroy: () => {\n      close()\n      dialog.remove()\n    },\n  }\n}\n","/**\n * The sharing controls in the header.\n *\n * Two toggles and a link. `Private` / `Shared` is one button, and one click\n * moves between them. While a document is shared, `Read-only` / `Editable` sits\n * beside it and does the same for the edit link. The link button copies\n * whichever link the header is naming and opens the popover that shows it.\n * There is no settings menu to open first, and no switch to confirm an\n * intention the click already stated.\n *\n * **Nothing moves under the pointer.** Clicking the same spot twice undoes the\n * first click, however quickly the second one lands:\n * - All three slots exist from the first render. The two that only mean\n *   something once a document is shared are reserved with `visibility:\n *   hidden`, never removed — the header group is right-aligned, so a slot\n *   appearing beside `Shared` would otherwise push it out from under the\n *   pointer.\n * - Every word a toggle can show shares one grid cell, so a toggle is as wide\n *   as its longest label and a change of word cannot resize it.\n * - A click is never dropped while a request is out. It sets what the user\n *   *wants*, the label follows at once, and one serialized worker walks the\n *   server towards it: a quick share-then-unshare mints a link and revokes it.\n * - Turning editing on or off reloads the page, and the reload waits for the\n *   clicks to settle. Read-only → Editable → Read-only mints an edit link and\n *   revokes it without reloading anything.\n *\n * The popover is still a `<details class=\"menu\">` in the server-rendered\n * header, so `menus.ts` gives it click-outside close, Escape-closes-and-\n * refocuses and one-menu-open-at-a-time for free. Its summary is the link\n * button, whose own click is cancelled: it copies and *opens*, and can never\n * close. Closing is Escape or a click elsewhere — and a click elsewhere is not\n * swallowed, so a toggle clicked while the popover is open still toggles.\n *\n * The state lives here, not in the DOM: the bootstrap seeds it\n * (`config.doc.share_url`, `config.doc.edit_url`) and only the share endpoints\n * move it. There is no GET to race with — the same write-only doctrine as\n * preferences — which is why copying an existing link sends no request.\n */\n\nimport type { DocumentsApi } from './api'\nimport { writeClipboardText, writeClipboardTextFromPromise } from './clipboard'\nimport { clear, el, icon } from './dom'\nimport { ICONS } from './icons'\nimport { consumeShareReopen, markPostAuthShareIntent, markShareReopen } from './persistence'\nimport type { PastyConfig } from './types'\n\n/** How long a transient label sits on a button before the resting one returns.\n    A timer, not a transition: `--pasty-t-*` collapse to 0 under reduced motion,\n    and a hold is not an animation — it still has to hold. */\nconst PULSE_MS = 1200\n\n/** How long after the last click a change of editor mode waits to reload the\n    page: long enough for a second click on the same spot to land and take the\n    first one back. */\nexport const RELOAD_SETTLE_MS = 600\n\nexport interface ShareController {\n  /** `Private` → `Shared`, or back. The palette row and ⌘⇧L are this too. */\n  toggle: () => void\n  /** `Read-only` → `Editable`, or back. From `Private` — which only the palette\n      offers — it shares the document on the way. */\n  toggleEditing: () => void\n  /** Copy the link the header is naming, and show it. */\n  copy: () => void\n  /** What the header says: the state asked for, which requests catch up to. */\n  shared: () => boolean\n  /** Whether the header says `Editable` — which is what makes this page\n      collaborative once it reloads. */\n  editable: () => boolean\n  /** The link the link button would copy: the edit one when editable. */\n  url: () => string | null\n  open: () => void\n  close: () => void\n  destroy: () => void\n}\n\nexport interface InstallShareOptions {\n  config: PastyConfig\n  api: DocumentsApi\n  /**\n   * Save now, creating the row if this document hasn't got one, and answer with\n   * its id — null only if that failed. Sharing never turns a user down for\n   * writing nothing: if the document is on screen, it can be shared.\n   */\n  ensureDocument: () => Promise<string | null>\n  /** The id autosave holds — the server's, not the page's, so a draft that\n      converted on this page shares as the document it became. */\n  documentId: () => string | null\n  /**\n   * Get this page's work somewhere safe, because turning editing on or off\n   * reloads it. Resolves when nothing is left only in this tab.\n   */\n  beforeReload?: () => Promise<void>\n  /** Reload. Injectable so tests can watch for it instead of navigating. */\n  reload?: () => void\n  /** Tell this browser's other tabs on this document to follow. */\n  announce?: (editable: boolean) => void\n  /** The settle window before a reload. Injectable so tests need not wait. */\n  settleMs?: number\n}\n\nconst noop = () => {}\n\n/** For pages whose header carries no share menu; every call is a no-op. */\nconst INERT: ShareController = {\n  toggle: noop,\n  toggleEditing: noop,\n  copy: noop,\n  shared: () => false,\n  editable: () => false,\n  url: () => null,\n  open: noop,\n  close: noop,\n  destroy: noop,\n}\n\ninterface Deferred<T> {\n  promise: Promise<T>\n  resolve: (value: T) => void\n  reject: () => void\n}\n\n/** A link promised to the clipboard during a click, delivered once minted. */\nfunction deferred<T>(): Deferred<T> {\n  let resolve!: (value: T) => void\n  let reject!: () => void\n  const promise = new Promise<T>((res, rej) => {\n    resolve = res\n    reject = () => rej(new Error('not minted'))\n  })\n  // A promise nobody ends up waiting on must not surface as unhandled.\n  promise.catch(() => {})\n  return { promise, resolve, reject }\n}\n\nexport function installShare(options: InstallShareOptions): ShareController {\n  const { api, config } = options\n\n  const menu = document.querySelector<HTMLDetailsElement>('details.share-menu')\n  const panel = menu?.querySelector<HTMLElement>('.share-menu__panel')\n  const summary = menu?.querySelector<HTMLElement>('summary')\n  if (!menu || !panel || !summary) {\n    return INERT\n  }\n\n  for (const element of document.querySelectorAll<HTMLElement>('[data-share-chrome]')) {\n    element.hidden = false\n  }\n\n  const close = () => {\n    menu.open = false\n  }\n\n  // --- anonymous: the popover is the invitation --------------------------------\n\n  if (!config.user.is_authenticated) {\n    const mark = () => markPostAuthShareIntent()\n    const signup = el('a', {\n      class: 'btn btn--primary share-menu__auth-action',\n      href: config.urls.signup,\n      text: 'Sign up',\n    })\n    const login = el('a', {\n      class: 'btn btn--quiet share-menu__auth-action',\n      href: config.urls.login,\n      text: 'Log in',\n    })\n    // The flag, then the navigation: the next authenticated page load reopens\n    // this popover so the action they came for is one click away.\n    signup.addEventListener('click', mark)\n    login.addEventListener('click', mark)\n    panel.append(\n      el('p', { class: 'share-menu__heading', text: 'Share this document' }),\n      el('p', {\n        class: 'share-menu__body',\n        text: 'Create an account to generate a shareable link.',\n      }),\n      el('div', { class: 'share-menu__auth' }, signup, login),\n    )\n    const open = () => {\n      menu.open = true\n      summary.focus()\n    }\n    // No click interception: there is nothing to do but open, which the native\n    // summary already does.\n    return { ...INERT, toggle: open, open, close }\n  }\n\n  // --- authenticated: each click says what the user wants ----------------------\n\n  let url: string | null = config.doc?.share_url ?? null\n  let editUrl: string | null = config.doc?.edit_url ?? null\n  /** The editor this page booted with — plain, or collaborative for an edit\n      link. Only a change to *this* needs a reload. */\n  const bootEditable = editUrl !== null\n  /** An edit link alone still means someone other than the owner can reach it. */\n  const serverShared = () => url !== null || editUrl !== null\n\n  // What the header says. The clicks move these; the worker moves the server.\n  let wantShared = serverShared()\n  let wantEditable = bootEditable\n  /** Which toggle's request is out, if any. One at a time, in click order. */\n  let busy: 'share' | 'edit' | null = null\n  /** The transient line in the panel — what the last action did. */\n  let message: string | null = null\n  /** The link button showing its check, after a copy the state can't show. */\n  let pulsing = false\n  let pulseTimer: number | undefined\n  let copyLabelTimer: number | undefined\n  let reloadTimer: number | undefined\n  let lastClickAt = 0\n  /** The page is on its way out; nothing more is asked of the server. */\n  let reloading = false\n  let viewLink: Deferred<string> | null = null\n  let editLink: Deferred<string> | null = null\n  /** How the edit link's clipboard write went, said after the reload. */\n  let editCopied: Promise<boolean> | null = null\n  const settleMs = options.settleMs ?? RELOAD_SETTLE_MS\n\n  // Each toggle's words, all of them always in the DOM and sharing one grid\n  // cell: the button is as wide as the longest, so the word can change under a\n  // pointer that is still on it without the button moving. `aria-hidden`,\n  // because the button's accessible name carries the state *and* the verb — a\n  // label that cross-fades is not one to read out.\n  const label = (text: string, glyph?: string) =>\n    el(\n      'span',\n      { class: 'share-toggle__label', 'aria-hidden': 'true' },\n      glyph ? icon(glyph, 14) : null,\n      text,\n    )\n  const stack = (labels: Record<string, HTMLElement>) =>\n    el('span', { class: 'share-toggle__labels' }, ...Object.values(labels))\n\n  const shareLabels = { private: label('Private', ICONS.lock), shared: label('Shared', ICONS.check) }\n  const editLabels = { readonly: label('Read-only'), editable: label('Editable') }\n  const shareToggle = el(\n    'button',\n    { type: 'button', class: 'btn btn--quiet share-controls__toggle share-toggle' },\n    stack(shareLabels),\n  )\n  const editToggle = el(\n    'button',\n    { type: 'button', class: 'btn btn--quiet share-controls__toggle share-edit-toggle' },\n    stack(editLabels),\n  )\n  // A wrapper, not two more direct children of the header group: the narrow\n  // rule that hides the auth links is written against those.\n  const controls = el('span', { class: 'share-controls' }, shareToggle, editToggle)\n  menu.before(controls)\n\n  // The summary becomes the link button, the check it pulses to sharing its\n  // cell for the same reason the toggles' words do.\n  const glyph = (name: string) =>\n    el('span', { class: 'share-toggle__label', 'aria-hidden': 'true' }, icon(name, 15))\n  const linkGlyphs = { link: glyph(ICONS.link), copied: glyph(ICONS.check) }\n  clear(summary)\n  summary.classList.add('share-menu__trigger--icon')\n  summary.append(stack(linkGlyphs))\n\n  const check = el('span', { class: 'share-menu__check' }, icon(ICONS.check, 15))\n  const headline = el('span')\n  const heading = el('p', { class: 'share-menu__heading' }, check, headline)\n  const body = el('p', { class: 'share-menu__body' })\n  const urlText = el('span', { class: 'share-menu__url' })\n  const copyButton = el('button', {\n    type: 'button',\n    class: 'btn btn--quiet share-menu__copy',\n    text: 'Copy',\n  })\n  const link = el('div', { class: 'share-menu__link' }, urlText, copyButton)\n  // The one live region on this surface. The heading says the same thing in the\n  // same breath, so only one of them may be allowed to speak.\n  const note = el('p', { class: 'share-menu__note', role: 'status' })\n  // The pre-share card's action. Normal users never see it — their click on\n  // `Private` has already shared the document — but the return from signup\n  // lands here, where the label spells out what the button is about to do, and\n  // so does a failure that needs retrying.\n  const shareAction = el('button', {\n    type: 'button',\n    class: 'btn btn--primary share-menu__share',\n    text: 'Share and copy link',\n  })\n  // The second link, when there is one to show beside the first. Only the\n  // editable face renders both: on that face the edit link is the subject and\n  // the view link is a footnote, so it gets the smaller treatment and a label.\n  const viewLabel = el('p', { class: 'share-menu__body share-menu__view-label', text: 'View only' })\n  // Distinct classes rather than a second `.share-menu__url`: the plain ones\n  // mean \"the link this popover is about\", and one selector that sometimes\n  // matches two elements is a trap for every test and every future reader.\n  const viewText = el('span', { class: 'share-menu__view-url' })\n  const viewCopy = el('button', {\n    type: 'button',\n    class: 'btn btn--quiet share-menu__view-copy',\n    text: 'Copy',\n  })\n  const viewRow = el('div', { class: 'share-menu__link share-menu__link--view' }, viewText, viewCopy)\n\n  // The note above the URL, not below it: \"copy it below\" has to be true, and\n  // an error on the pre-share card belongs directly above the retry.\n  panel.append(heading, body, note, link, viewLabel, viewRow, shareAction)\n\n  /** Hold a slot without showing it: invisible, unfocusable, still its size. */\n  const reserve = (element: HTMLElement, reserved: boolean) => {\n    element.toggleAttribute('data-reserved', reserved)\n    element.toggleAttribute('inert', reserved)\n  }\n\n  const show = (labels: Record<string, HTMLElement>, current: string) => {\n    for (const [key, node] of Object.entries(labels)) {\n      node.toggleAttribute('data-current', key === current)\n    }\n  }\n\n  const render = () => {\n    const isShared = wantShared\n    const isEditable = wantShared && wantEditable\n\n    show(shareLabels, isShared ? 'shared' : 'private')\n    shareToggle.dataset.state = isShared ? 'shared' : 'private'\n    shareToggle.setAttribute(\n      'aria-label',\n      isShared ? 'Shared — stop sharing' : 'Private — share and copy link',\n    )\n    shareToggle.setAttribute('aria-busy', String(busy === 'share'))\n\n    show(editLabels, isEditable ? 'editable' : 'readonly')\n    editToggle.dataset.state = isEditable ? 'editable' : 'readonly'\n    editToggle.setAttribute(\n      'aria-label',\n      isEditable ? 'Editable — make read-only' : 'Read-only — allow editing',\n    )\n    editToggle.setAttribute('aria-busy', String(busy === 'edit'))\n    reserve(editToggle, !isShared)\n\n    show(linkGlyphs, pulsing ? 'copied' : 'link')\n    summary.setAttribute('aria-label', isEditable ? 'Copy edit link' : 'Copy link')\n    // A private document has no link to copy, but the pre-share card hangs from\n    // this slot: an open popover keeps it.\n    reserve(menu, !isShared && !menu.open)\n\n    check.hidden = !isShared\n    headline.textContent = isEditable\n      ? 'Shared for editing'\n      : isShared\n        ? 'Shared as unlisted'\n        : 'Share this document'\n    body.textContent = isEditable\n      ? 'Anyone with the edit link can edit this document.'\n      : isShared\n        ? 'Anyone with this link can view this document.'\n        : 'Anyone with the link will be able to view this document.'\n\n    // The main link slot holds whichever link this face is *about* — once it\n    // exists. The header runs ahead of the server; the URL never does.\n    const primary = isEditable ? editUrl : url\n    link.classList.toggle('share-menu__link--edit', isEditable)\n    link.hidden = !isShared || primary === null\n    urlText.textContent = primary ?? ''\n\n    // And the view link only appears as the footnote of the editable face,\n    // where it is genuinely a second thing you might want to hand someone.\n    const showView = isEditable && url !== null\n    viewLabel.hidden = !showView\n    viewRow.hidden = !showView\n    viewText.textContent = url ?? ''\n\n    shareAction.hidden = isShared\n    note.textContent = message ?? ''\n  }\n\n  const say = (text: string | null) => {\n    message = text\n  }\n\n  /**\n   * Opened at click time and never on resolve — a popover the user dismissed\n   * while a request was out stays dismissed. `focus` is for the entry points\n   * that aren't a toggle: the summary is what Escape hands focus back to, and\n   * Safari only routes Escape to menus.ts from inside the menu. A toggle keeps\n   * its own focus, so Space pressed twice undoes itself exactly as two clicks\n   * do.\n   */\n  const open = (focus = true) => {\n    if (!menu.open) {\n      menu.open = true\n    }\n    render()\n    if (focus) {\n      summary.focus()\n    }\n  }\n\n  /** Hold the check on the link button, then let the link icon return. */\n  const pulse = () => {\n    pulsing = true\n    window.clearTimeout(pulseTimer)\n    pulseTimer = window.setTimeout(() => {\n      pulsing = false\n      render()\n    }, PULSE_MS)\n  }\n\n  // --- the worker ---------------------------------------------------------------\n\n  const documentId = () => {\n    const id = options.documentId()\n    if (id === null) {\n      throw new Error('no document')\n    }\n    return id\n  }\n\n  const mintView = async () => {\n    const id = await options.ensureDocument()\n    if (id === null) {\n      throw new Error('no document to share')\n    }\n    const minted = await api.share(id)\n    url = minted.share_url\n    editUrl = minted.edit_url\n    viewLink?.resolve(minted.share_url)\n    viewLink = null\n  }\n\n  /** Revokes both: \"nobody but me\" cannot mean \"except the people typing\". */\n  const revokeAll = async () => {\n    const id = options.documentId()\n    // Shared implies saved; this is unreachable, but be wrong quietly.\n    if (id !== null) {\n      await api.unshare(id)\n    }\n    url = null\n    editUrl = null\n  }\n\n  const mintEdit = async () => {\n    const minted = await api.shareEdit(documentId())\n    editUrl = minted.edit_url\n    url = minted.share_url\n    editLink?.resolve(minted.edit_url)\n    editLink = null\n  }\n\n  /** The narrow verb: a view link, if any, keeps working. */\n  const revokeEdit = async () => {\n    const result = await api.unshareEdit(documentId())\n    editUrl = null\n    url = result.share_url\n  }\n\n  /** One request at a time, until the server holds what the header says. */\n  const sync = () => {\n    if (busy !== null || reloading) {\n      return\n    }\n    if (wantShared && !serverShared()) {\n      run('share', mintView, \"Couldn't create the link. Try again.\")\n    } else if (!wantShared && serverShared()) {\n      run('share', revokeAll, \"Couldn't stop sharing. Try again.\")\n    } else if (wantShared && wantEditable && editUrl === null) {\n      run('edit', mintEdit, \"Couldn't create the edit link. Try again.\")\n    } else if (wantShared && !wantEditable && editUrl !== null) {\n      run('edit', revokeEdit, \"Couldn't turn off editing. Try again.\")\n    } else {\n      settled()\n    }\n  }\n\n  const run = (which: 'share' | 'edit', step: () => Promise<void>, failed: string) => {\n    busy = which\n    render()\n    step().then(\n      () => {\n        busy = null\n        render()\n        sync()\n      },\n      () => {\n        busy = null\n        // Whatever was asked for, the server's answer is what is true: the\n        // header goes back to it, and the popover says why.\n        wantShared = serverShared()\n        wantEditable = editUrl !== null\n        viewLink?.reject()\n        viewLink = null\n        editLink?.reject()\n        editLink = null\n        say(failed)\n        open(false)\n        settled()\n      },\n    )\n  }\n\n  /**\n   * The server has caught up with the clicks. If that left the page running\n   * the wrong editor — a plain one for a document with an edit link, or a\n   * collaborative one for a link that no longer exists — reload, once the\n   * clicks have had time to stop.\n   */\n  const settled = () => {\n    window.clearTimeout(reloadTimer)\n    if ((editUrl !== null) === bootEditable) {\n      return\n    }\n    const wait = Math.max(0, lastClickAt + settleMs - Date.now())\n    reloadTimer = window.setTimeout(() => void reloadNow(), wait)\n  }\n\n  /**\n   * The editor mode is fixed at page load, and swapping editors underneath a\n   * caret mid-sentence is not a thing worth doing well. So: get this tab's work\n   * somewhere safe, remember what to say when the page comes back, bring the\n   * other tabs along, and reload.\n   */\n  const reloadNow = async () => {\n    if (busy !== null || reloading || (editUrl !== null) === bootEditable) {\n      return\n    }\n    reloading = true\n    const editable = editUrl !== null\n    if (editable) {\n      const ok = editCopied ? await editCopied : false\n      markShareReopen(ok ? 'Link copied' : 'Edit link ready — copy it below.')\n    } else if (url !== null) {\n      markShareReopen('Editing turned off')\n    }\n    // Private says itself: the header is the whole answer, and a popover\n    // reopened on the pre-share card would read as an offer to share again.\n    options.announce?.(editable)\n    await options.beforeReload?.()\n    ;(options.reload ?? (() => window.location.reload()))()\n  }\n\n  // --- the clicks ----------------------------------------------------------------\n\n  const clicked = () => {\n    lastClickAt = Date.now()\n    window.clearTimeout(reloadTimer)\n  }\n\n  const toggle = () => {\n    if (reloading) {\n      return\n    }\n    clicked()\n    if (wantShared) {\n      wantShared = false\n      wantEditable = false\n      say(null)\n      // Done is done: the header says Private, which is the whole answer.\n      close()\n    } else {\n      wantShared = true\n      say('Creating link…')\n      viewLink?.reject()\n      viewLink = deferred()\n      // Asked for now, while the click is still the reason we are running: the\n      // clipboard takes a promise, but only one requested during the gesture.\n      void writeClipboardTextFromPromise(viewLink.promise).then(ok => {\n        // Sharing and copying are two operations: a document that is shared\n        // stays shared even when the clipboard refuses. Nothing to say if the\n        // click was taken back, or the link never came.\n        if (wantShared && url !== null) {\n          say(ok ? 'Link copied' : 'Link ready — copy it below.')\n          render()\n        }\n      })\n      open(false)\n    }\n    render()\n    sync()\n  }\n\n  const toggleEditing = () => {\n    if (reloading) {\n      return\n    }\n    clicked()\n    editLink?.reject()\n    editLink = null\n    if (wantShared && wantEditable) {\n      wantEditable = false\n      editCopied = null\n      say(null)\n    } else {\n      // From Private too, which only the palette can ask for: an edit link is\n      // a way in, so the header will say Shared as well, and the worker mints\n      // the view link before the edit one. The clipboard gets the edit link —\n      // it is what was asked for.\n      wantShared = true\n      wantEditable = true\n      editLink = deferred()\n      // Inside the click, for the same reason as sharing: the edit link is a\n      // round trip away and the clipboard only trusts the gesture.\n      const copied = writeClipboardTextFromPromise(editLink.promise)\n      editCopied = copied\n      say('Creating edit link…')\n      void copied.then(ok => {\n        if (editCopied === copied && editUrl !== null) {\n          say(ok ? 'Link copied' : 'Edit link ready — copy it below.')\n          render()\n        }\n      })\n    }\n    render()\n    sync()\n  }\n\n  /** The link button: a copy, with no request, of the link the header names. */\n  const copy = () => {\n    open()\n    const existing = wantShared ? (wantEditable ? editUrl : url) : null\n    if (existing === null) {\n      // Still being minted, or nothing to copy: the popover already says so.\n      return\n    }\n    void writeClipboardText(existing).then(ok => {\n      say(ok ? 'Link copied' : \"Couldn't copy the link. Copy it below.\")\n      if (ok) {\n        // The state didn't change, so the button has to be the thing that\n        // shows something happened.\n        pulse()\n      }\n      render()\n    })\n  }\n\n  // The summary is the link button. Cancelling its default toggle is what lets\n  // it open the popover without ever closing it — and Enter and Space\n  // synthesize cancelable clicks, so this covers the keyboard too.\n  summary.addEventListener('click', event => {\n    event.preventDefault()\n    copy()\n  })\n\n  shareToggle.addEventListener('click', () => toggle())\n  editToggle.addEventListener('click', () => toggleEditing())\n  shareAction.addEventListener('click', () => toggle())\n\n  // Focus stays on a toggle, which is outside the menu menus.ts listens in, so\n  // the toggles close the popover on Escape themselves.\n  controls.addEventListener('keydown', event => {\n    if (event.key === 'Escape' && menu.open) {\n      event.preventDefault()\n      close()\n    }\n  })\n\n  /** Both Copy buttons behave identically; only the link differs. */\n  const wireCopy = (button: HTMLButtonElement, source: () => string | null) => {\n    button.addEventListener('click', () => {\n      const value = source()\n      if (value === null) {\n        return\n      }\n      void writeClipboardText(value).then(ok => {\n        say(ok ? 'Link copied' : \"Couldn't copy the link. Copy it below.\")\n        button.textContent = ok ? 'Copied' : 'Copy'\n        render()\n        window.clearTimeout(copyLabelTimer)\n        copyLabelTimer = window.setTimeout(() => {\n          button.textContent = 'Copy'\n        }, PULSE_MS)\n      })\n    })\n  }\n\n  wireCopy(copyButton, () => (wantEditable ? editUrl : url))\n  wireCopy(viewCopy, () => url)\n\n  menu.addEventListener('toggle', () => {\n    // A message is about the action that produced it. Once the popover is gone,\n    // so is the action — reopening should not read out a stale confirmation.\n    if (!menu.open && message !== null && busy === null) {\n      say(null)\n    }\n    // And a private document's link slot goes back to being reserved.\n    render()\n  })\n\n  render()\n\n  // The other half of the reload: whatever the click before it was going to\n  // say, said now that there is a page to say it on.\n  const reopen = consumeShareReopen()\n  if (reopen !== null) {\n    say(reopen)\n    open()\n  }\n\n  return {\n    toggle,\n    toggleEditing,\n    copy,\n    shared: () => wantShared,\n    editable: () => wantShared && wantEditable,\n    url: () => (wantEditable ? editUrl : url),\n    open: () => open(),\n    close,\n    destroy: () => {\n      window.clearTimeout(pulseTimer)\n      window.clearTimeout(copyLabelTimer)\n      window.clearTimeout(reloadTimer)\n    },\n  }\n}\n","/**\n * Table controls.\n *\n * Only the six operations the spec calls for. No merging, no widths, no colors:\n * commands that aren't offered produce states that can't occur, which is why\n * table serialization stays simple.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport { el, icon } from './dom'\nimport { ICONS, type IconName } from './icons'\n\ninterface TableAction {\n  id: string\n  label: string\n  iconName: IconName\n  run: (editor: Editor) => void\n}\n\nconst ACTIONS: TableAction[] = [\n  {\n    id: 'addRowAfter',\n    label: 'Insert row below',\n    iconName: 'rowAfter',\n    run: editor => editor.chain().focus().addRowAfter().run(),\n  },\n  {\n    id: 'deleteRow',\n    label: 'Delete row',\n    iconName: 'rowDelete',\n    run: editor => editor.chain().focus().deleteRow().run(),\n  },\n  {\n    id: 'addColumnAfter',\n    label: 'Insert column right',\n    iconName: 'columnAfter',\n    run: editor => editor.chain().focus().addColumnAfter().run(),\n  },\n  {\n    id: 'deleteColumn',\n    label: 'Delete column',\n    iconName: 'columnDelete',\n    run: editor => editor.chain().focus().deleteColumn().run(),\n  },\n  {\n    id: 'deleteTable',\n    label: 'Delete table',\n    iconName: 'tableDelete',\n    run: editor => editor.chain().focus().deleteTable().run(),\n  },\n]\n\nexport interface TableMenu {\n  element: HTMLElement\n  sync: () => void\n}\n\nexport function createTableMenu(editor: Editor): TableMenu {\n  const group = el('div', {\n    class: 'pasty-toolbar__group',\n    role: 'group',\n    'aria-label': 'Table',\n  })\n  group.hidden = true\n\n  for (const action of ACTIONS) {\n    const button = el('button', {\n      type: 'button',\n      class: 'pasty-toolbar__button',\n      'data-item': action.id,\n      title: action.label,\n      'aria-label': action.label,\n    })\n    button.append(icon(ICONS[action.iconName]))\n    button.addEventListener('mousedown', event => event.preventDefault())\n    button.addEventListener('click', () => action.run(editor))\n    group.append(button)\n  }\n\n  const sync = () => {\n    group.hidden = !editor.isActive('table')\n  }\n\n  sync()\n  return { element: group, sync }\n}\n","/**\n * The formatting toolbar.\n *\n * A declarative list of items rendered as real buttons: `aria-pressed` tracks\n * the active state of the controls that actually toggle something, `disabled`\n * tracks what the current selection can do, and both re-sync on every\n * transaction.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport { el, icon } from './dom'\nimport { LINK_SHORTCUT_EVENT } from './editor'\nimport { ICONS, type IconName } from './icons'\nimport { shortcutHint } from './shortcuts'\n\ninterface ToolbarItem {\n  id: string\n  label: string\n  shortcut?: string\n  iconName: IconName\n  run: (editor: Editor) => void\n  isActive?: (editor: Editor) => boolean\n  isEnabled?: (editor: Editor) => boolean\n}\n\n/**\n * Grouped, and rendered as groups. Spacing carries the grouping rather than a\n * row of hairlines: 2px inside a cluster against 16px between them reads as\n * structure without adding four more lines to a bar we are trying to quieten.\n */\nconst CLUSTERS: ToolbarItem[][] = [\n  [\n    {\n      id: 'undo',\n      label: 'Undo',\n      shortcut: 'Mod+Z',\n      iconName: 'undo',\n      run: editor => editor.chain().focus().undo().run(),\n      isEnabled: editor => editor.can().undo(),\n    },\n    {\n      id: 'redo',\n      label: 'Redo',\n      shortcut: 'Mod+Shift+Z',\n      iconName: 'redo',\n      run: editor => editor.chain().focus().redo().run(),\n      isEnabled: editor => editor.can().redo(),\n    },\n  ],\n  [\n    {\n      id: 'bold',\n      label: 'Bold',\n      shortcut: 'Mod+B',\n      iconName: 'bold',\n      run: editor => editor.chain().focus().toggleBold().run(),\n      isActive: editor => editor.isActive('bold'),\n    },\n    {\n      id: 'italic',\n      label: 'Italic',\n      shortcut: 'Mod+I',\n      iconName: 'italic',\n      run: editor => editor.chain().focus().toggleItalic().run(),\n      isActive: editor => editor.isActive('italic'),\n    },\n    {\n      id: 'link',\n      label: 'Insert link',\n      shortcut: 'Mod+Shift+K',\n      iconName: 'link',\n      run: editor =>\n        editor.view.dom.dispatchEvent(new CustomEvent(LINK_SHORTCUT_EVENT, { bubbles: true })),\n      isActive: editor => editor.isActive('link'),\n    },\n  ],\n  [\n    {\n      id: 'bulletList',\n      label: 'Bulleted list',\n      shortcut: 'Mod+Shift+8',\n      iconName: 'bulletList',\n      run: editor => editor.chain().focus().toggleBulletList().run(),\n      isActive: editor => editor.isActive('bulletList'),\n    },\n    {\n      id: 'orderedList',\n      label: 'Numbered list',\n      shortcut: 'Mod+Shift+7',\n      iconName: 'orderedList',\n      run: editor => editor.chain().focus().toggleOrderedList().run(),\n      isActive: editor => editor.isActive('orderedList'),\n    },\n    {\n      id: 'taskList',\n      label: 'Task list',\n      shortcut: 'Mod+Shift+9',\n      iconName: 'taskList',\n      run: editor => editor.chain().focus().toggleTaskList().run(),\n      isActive: editor => editor.isActive('taskList'),\n    },\n  ],\n  [\n    {\n      id: 'blockquote',\n      label: 'Quote',\n      shortcut: 'Mod+Shift+B',\n      iconName: 'quote',\n      run: editor => editor.chain().focus().toggleBlockquote().run(),\n      isActive: editor => editor.isActive('blockquote'),\n    },\n    {\n      id: 'code',\n      label: 'Inline code',\n      shortcut: 'Mod+E',\n      iconName: 'code',\n      run: editor => editor.chain().focus().toggleCode().run(),\n      isActive: editor => editor.isActive('code'),\n    },\n    {\n      id: 'codeBlock',\n      label: 'Code block',\n      shortcut: 'Mod+Alt+C',\n      iconName: 'codeBlock',\n      run: editor => editor.chain().focus().toggleCodeBlock().run(),\n      isActive: editor => editor.isActive('codeBlock'),\n    },\n  ],\n  [\n    {\n      id: 'table',\n      label: 'Insert table',\n      iconName: 'table',\n      // A header row isn't optional: GFM has no way to write a table without one,\n      // so Pasty never creates a table that can't be serialized.\n      run: editor =>\n        editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),\n      isEnabled: editor => editor.can().insertTable({ rows: 3, cols: 3, withHeaderRow: true }),\n    },\n  ],\n]\n\nconst STYLES = [\n  { value: 'paragraph', label: 'Normal text' },\n  { value: '1', label: 'Heading 1' },\n  { value: '2', label: 'Heading 2' },\n  { value: '3', label: 'Heading 3' },\n] as const\n\nexport interface Toolbar {\n  element: HTMLElement\n  sync: () => void\n}\n\nexport function createToolbar(editor: Editor): Toolbar {\n  const bar = el('div', {\n    class: 'pasty-toolbar',\n    role: 'toolbar',\n    'aria-label': 'Formatting',\n  })\n\n  const styleSelect = el('select', {\n    class: 'pasty-style-select',\n    'aria-label': 'Text style',\n  }) as HTMLSelectElement\n\n  for (const style of STYLES) {\n    styleSelect.append(el('option', { value: style.value, text: style.label }))\n  }\n\n  styleSelect.addEventListener('change', () => {\n    const value = styleSelect.value\n    if (value === 'paragraph') {\n      editor.chain().focus().setParagraph().run()\n    } else {\n      editor\n        .chain()\n        .focus()\n        .setHeading({ level: Number(value) as 1 | 2 | 3 })\n        .run()\n    }\n  })\n\n  // The chevron is an inline sibling rather than a background image, so it is\n  // drawn by the same icon family as the rest of the bar and inherits its colour\n  // instead of baking one. `pointer-events: none` leaves the whole control\n  // clickable, and a wrapper cannot disturb the roving order because that\n  // queries descendants.\n  const chevron = icon(ICONS.chevronDown, 14)\n  chevron.classList.add('pasty-style-select__chevron')\n  bar.append(el('span', { class: 'pasty-style-select-wrap' }, styleSelect, chevron))\n\n  const buttons: { item: ToolbarItem; button: HTMLButtonElement }[] = []\n\n  for (const cluster of CLUSTERS) {\n    // Not `pasty-toolbar__group` — that class names the table controls, and the\n    // suite locates them with a strict locator that throws on more than one.\n    const group = el('div', { class: 'pasty-toolbar__cluster' })\n\n    for (const entry of cluster) {\n      const title = entry.shortcut\n        ? `${entry.label} (${shortcutHint(entry.shortcut)})`\n        : entry.label\n      const button = el('button', {\n        type: 'button',\n        class: 'pasty-toolbar__button',\n        'data-item': entry.id,\n        title,\n        'aria-label': entry.label,\n      })\n      button.append(icon(ICONS[entry.iconName]))\n      // mousedown-prevention keeps the selection alive when the button is clicked.\n      button.addEventListener('mousedown', event => event.preventDefault())\n      button.addEventListener('click', () => entry.run(editor))\n      group.append(button)\n      buttons.push({ item: entry, button })\n    }\n\n    bar.append(group)\n  }\n\n  // role=\"toolbar\" promises arrow-key navigation, so it has to deliver one.\n  installRovingFocus(bar)\n\n  const sync = () => {\n    for (const { item, button } of buttons) {\n      const active = item.isActive?.(editor) ?? false\n      // Only the controls that genuinely toggle a state carry aria-pressed.\n      // Undo, redo and Insert table were announcing themselves as \"not pressed\",\n      // which describes a toggle that is off — none of them is a toggle.\n      if (item.isActive) {\n        button.setAttribute('aria-pressed', String(active))\n      }\n      button.classList.toggle('is-active', active)\n\n      const enabled = item.isEnabled?.(editor) ?? true\n      button.disabled = !enabled\n    }\n\n    styleSelect.value = currentStyle(editor)\n  }\n\n  sync()\n  return { element: bar, sync }\n}\n\n/**\n * Roving tabindex: the toolbar is one tab stop, and the arrow keys move within\n * it. Disabled controls are skipped, which is why the list is recomputed on\n * every keystroke rather than cached.\n */\nfunction installRovingFocus(bar: HTMLElement): void {\n  const controls = (): HTMLElement[] =>\n    Array.from(bar.querySelectorAll<HTMLElement>('button, select')).filter(\n      control => !(control as HTMLButtonElement).disabled,\n    )\n\n  const setTabStop = (target: HTMLElement) => {\n    for (const control of Array.from(bar.querySelectorAll<HTMLElement>('button, select'))) {\n      control.tabIndex = control === target ? 0 : -1\n    }\n  }\n\n  // Deliberately does not focus: the editor has just claimed focus, and taking\n  // it away on load would drop the user outside their own document.\n  const initial = controls()[0]\n  if (initial) {\n    setTabStop(initial)\n  }\n\n  bar.addEventListener('keydown', event => {\n    const items = controls()\n    const current = items.indexOf(document.activeElement as HTMLElement)\n    if (current < 0) {\n      return\n    }\n\n    let next: number | undefined\n    if (event.key === 'ArrowRight') {\n      next = (current + 1) % items.length\n    } else if (event.key === 'ArrowLeft') {\n      next = (current - 1 + items.length) % items.length\n    } else if (event.key === 'Home') {\n      next = 0\n    } else if (event.key === 'End') {\n      next = items.length - 1\n    }\n\n    if (next !== undefined) {\n      event.preventDefault()\n      setTabStop(items[next])\n      items[next].focus()\n    }\n  })\n\n  // Clicking a control makes it the toolbar's tab stop, the way Docs behaves.\n  bar.addEventListener('focusin', event => {\n    const target = event.target as HTMLElement\n    if (target.matches('button, select')) {\n      setTabStop(target)\n    }\n  })\n}\n\nfunction currentStyle(editor: Editor): string {\n  for (const level of [1, 2, 3] as const) {\n    if (editor.isActive('heading', { level })) {\n      return String(level)\n    }\n  }\n  return 'paragraph'\n}\n","/**\n * The Vim preference.\n *\n * The engine in `vim/` knows nothing about accounts or storage; this is the one\n * place that decides whether Vim is on, keeps that decision somewhere it will\n * survive a reload, and hands the answer to everything that shows it — the\n * palette row, the settings dialog and the mode indicator all go through\n * `toggle()`, so there is exactly one flip path and no surface can disagree with\n * another.\n *\n * The hard part is the handoff. Signing up is a full-page navigation, so an\n * anonymous visitor's localStorage survives into their first authenticated page\n * load, and the two opinions have to be reconciled without ever silently\n * discarding the one the user actually saw. `resolveInitialVimMode` is that\n * decision as a pure function, which is why it is testable without a server.\n */\n\nimport type { Editor } from '@tiptap/core'\n\nimport type { PreferencesApi } from './api'\nimport { clearVimPreference, readVimPreference, writeVimPreference } from './persistence'\nimport type { PastyConfig } from './types'\nimport { setVimEnabled, vimStatus, type VimMode } from './vim'\n\nexport interface VimController {\n  enabled: () => boolean\n  mode: () => VimMode\n  set: (enabled: boolean) => void\n  /** The one flip path. Every surface that offers the setting calls this. */\n  toggle: () => void\n  subscribe: (listener: (enabled: boolean) => void) => void\n  destroy: () => void\n}\n\n/**\n * `'on'` and `'off'` are the only values written. Anything else — a stale value,\n * something a user typed into devtools — means \"no opinion\", the same as an\n * absent key, so a corrupted preference degrades to the default rather than to a\n * broken editor.\n */\nexport function normalizeVimPreference(raw: string | null | undefined): boolean | null {\n  if (raw === 'on') {\n    return true\n  }\n  if (raw === 'off') {\n    return false\n  }\n  return null\n}\n\nexport type VimBootAction =\n  /** Nothing to reconcile. */\n  | 'none'\n  /** The server already agrees; drop the local copy. */\n  | 'clear-local'\n  /** The local value wins; send it to the server, then drop it. */\n  | 'push-and-clear'\n\nexport interface VimBootDecision {\n  enabled: boolean\n  action: VimBootAction\n}\n\n/**\n * Which value wins on this page load.\n *\n * The local value wins **in both directions** when the two disagree, because it\n * is the one the user last saw and last chose. Someone who turned Vim off as an\n * anonymous visitor and then signed into an account that has it on should not\n * find it back on; someone who turned it on and then signed up should keep it.\n *\n * The key is only cleared once the server has taken the value over — the same\n * rule the anonymous document follows, for the same reason.\n */\nexport function resolveInitialVimMode(\n  authenticated: boolean,\n  serverValue: boolean,\n  localRaw: string | null,\n): VimBootDecision {\n  const local = normalizeVimPreference(localRaw)\n  if (!authenticated) {\n    return { enabled: local ?? false, action: 'none' }\n  }\n  if (local === null) {\n    return { enabled: serverValue, action: 'none' }\n  }\n  if (local === serverValue) {\n    return { enabled: serverValue, action: 'clear-local' }\n  }\n  return { enabled: local, action: 'push-and-clear' }\n}\n\nexport interface InstallVimOptions {\n  editor: Editor\n  config: PastyConfig\n  preferences: PreferencesApi\n}\n\nexport function installVim(options: InstallVimOptions): VimController {\n  const { config, editor, preferences } = options\n  const authenticated = config.user.is_authenticated\n\n  const decision = resolveInitialVimMode(\n    authenticated,\n    config.prefs.vim_mode,\n    readVimPreference(),\n  )\n  let enabled = decision.enabled\n  setVimEnabled(editor, enabled)\n\n  if (decision.action === 'clear-local') {\n    clearVimPreference()\n  } else if (decision.action === 'push-and-clear') {\n    void preferences\n      .update({ vim_mode: enabled })\n      // Only after the server confirms. If it never does, the key stays and the\n      // next boot tries again — the preference is never lost in transit.\n      .then(() => clearVimPreference())\n      .catch(() => console.warn('[pasty] Could not save your Vim mode preference.'))\n  }\n\n  const listeners = new Set<(enabled: boolean) => void>()\n  const announce = () => {\n    for (const listener of listeners) {\n      listener(enabled)\n    }\n  }\n\n  const persist = (next: boolean) => {\n    if (authenticated) {\n      // Fire and forget: a failed write means the server did not hear it, not\n      // that the editor should refuse to change. The in-session state stands and\n      // the next reload reverts — which is honest about what was saved.\n      void preferences\n        .update({ vim_mode: next })\n        .catch(() => console.warn('[pasty] Could not save your Vim mode preference.'))\n      return\n    }\n    // `'off'` rather than removing the key: absence means \"no opinion\", and this\n    // is very much an opinion. See `resolveInitialVimMode`.\n    writeVimPreference(next ? 'on' : 'off')\n  }\n\n  const set = (next: boolean) => {\n    if (next === enabled) {\n      return\n    }\n    enabled = next\n    persist(next)\n    setVimEnabled(editor, next)\n    announce()\n  }\n\n  return {\n    enabled: () => enabled,\n    mode: () => vimStatus(editor).mode,\n    set,\n    toggle: () => set(!enabled),\n    subscribe: listener => {\n      listeners.add(listener)\n      listener(enabled)\n    },\n    destroy: () => listeners.clear(),\n  }\n}\n","/**\n * The mode indicator.\n *\n * The one piece of chrome Vim mode adds, and the authoritative answer to \"which\n * mode am I in\" — the block cursor is a nicety that can fail; this cannot. It is\n * a `role=\"status\"` pill in a fixed corner, so it never moves anything on the\n * page and a screen reader hears the mode change without being interrupted.\n *\n * Sized to its longest label so switching modes cannot make it twitch.\n */\n\nimport { el } from './dom'\nimport type { VimMode, VimStatus } from './vim'\n\nconst LABELS: Record<VimMode, string> = {\n  normal: 'NORMAL',\n  insert: 'INSERT',\n  visual: 'VISUAL',\n  visualLine: 'VISUAL LINE',\n  command: 'COMMAND',\n}\n\nexport interface VimIndicator {\n  element: HTMLElement\n  sync: (status: VimStatus) => void\n}\n\nexport function createVimIndicator(): VimIndicator {\n  // `role=\"status\"` sits on the label, not on the pill: the pill also holds the\n  // sizer below, and a live region has to contain the mode and nothing else.\n  const label = el('span', {\n    class: 'pasty-vim-indicator__label',\n    role: 'status',\n    text: LABELS.normal,\n  })\n  // The pill is as wide as its widest label and no wider, in whatever font the\n  // page ends up using. A min-width in pixels would be a guess that goes wrong\n  // the moment the type scale changes; this cannot.\n  // Sized to the widest thing it can say, which is a mode plus a recording.\n  const sizer = el('span', {\n    class: 'pasty-vim-indicator__sizer',\n    'aria-hidden': 'true',\n    text: `${LABELS.visualLine} · REC @a`,\n  })\n  const element = el('div', { class: 'pasty-vim-indicator' }, label, sizer)\n  element.hidden = true\n\n  return {\n    element,\n    sync: status => {\n      element.hidden = !status.enabled\n      // While recording, the register is part of the mode: there is no other\n      // sign that a macro is being captured, and forgetting is easy.\n      const text = status.recording\n        ? `${LABELS[status.mode]} · REC @${status.recording}`\n        : LABELS[status.mode]\n      // Only on change: a live region rewritten on every transaction would\n      // announce itself over and over while someone holds down `j`.\n      if (status.enabled && label.textContent !== text) {\n        label.textContent = text\n      }\n    },\n  }\n}\n","/**\n * Boot.\n *\n * Reads the page configuration, builds the chrome, decides what the document\n * starts as, and wires persistence to the editor.\n */\n\nimport type { Editor } from '@tiptap/core'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { ySyncPluginKey } from '@tiptap/y-tiptap'\nimport * as Y from 'yjs'\n\nimport {\n  ApiError,\n  DocumentsApi,\n  GuestDocumentApi,\n  PreferencesApi,\n  type DocumentWriter,\n} from './api'\nimport { createAnonBanner } from './anon-banner'\nimport { readConfig } from './bootstrap'\nimport { copyWholeDocument } from './clipboard'\nimport { createAutosave, type ConflictSides } from './autosave'\nimport { createLiveDocument } from './collab/live'\nimport { createPresence } from './collab/presence'\nimport { createProvider, type PollingProvider } from './collab/provider'\nimport { buildSeed, hashSeed, SEED_ORIGIN } from './collab/seed'\nimport {\n  CONFLICT_TEXT,\n  DISCONNECT_HINT,\n  RESTORE_CHOICES,\n  createConflictNotice,\n} from './conflict'\nimport { bootPublishedView } from './docs-view'\nimport { clear, el } from './dom'\nimport { createEditor } from './editor'\nimport { resolveFreshStart } from './fresh-start'\nimport { resolveImportDocument } from './handoff'\nimport { introMarkdown, isIntroHeadline, isUntouchedIntro } from './intro'\nimport { createLinkPopover } from './link-popover'\nimport { parseMarkdown, serializeMarkdown } from './markdown'\nimport { installAppearanceMenu } from './appearance-menu'\nimport { installMenus } from './menus'\nimport { installPalette } from './palette'\nimport {\n  clearAnonDocument,\n  consumePostAuthShareIntent,\n  hasContent,\n  loadAnonDocument,\n  loadBackup,\n  markPostAuthShareIntent,\n  nowTimestamp,\n  saveAnonDocument,\n  saveConflictCopy,\n} from './persistence'\nimport { installSettings } from './settings'\nimport { installShare, type ShareController } from './share-controller'\nimport { bootSharedView } from './shared-view'\nimport { createTableMenu } from './table-menu'\nimport { installTheme } from './theme'\nimport { createTitleField, deriveTitle } from './title'\nimport { createToolbar } from './toolbar'\nimport type { ConflictDocument, PastyConfig, SaveStatus, StoredDocument } from './types'\nimport { installVimChrome, installVimKeyLogger, subscribeVimStatus, vimMacroDump, vimStatus } from './vim'\nimport { installVim } from './vim-controller'\nimport { createVimIndicator } from './vim-indicator'\nimport './styles/app.css'\nimport './styles/editor.css'\n\nconst ANON_SAVE_DEBOUNCE_MS = 800\nconst COPY_ANNOUNCEMENT_MS = 1200\n\nconst STATUS_TEXT: Record<SaveStatus, string> = {\n  idle: '',\n  saving: 'Saving…',\n  saved: 'Saved',\n  unsaved: 'Not saved',\n  offline: 'Not saved — retrying',\n  // Not \"Conflict\": the status line reports where the work is, and the answer\n  // here is \"somewhere else too\". The notice below says what to do about it.\n  conflict: 'Changed elsewhere',\n}\n\n/** The live layer talking, when it has something more urgent to say. */\nconst RECONNECTING_TEXT = 'Reconnecting…'\n\n/** Was this transaction somebody else's keystroke rather than this user's? */\nfunction isRemote(transaction: Transaction): boolean {\n  return transaction.getMeta(ySyncPluginKey)?.isChangeOrigin === true\n}\n\nfunction emptyDocument(): StoredDocument {\n  return { title: '', markdown: '', updated_at: nowTimestamp() }\n}\n\ninterface InitialDocument {\n  document: StoredDocument\n  documentId: string | null\n  convertingAnonymousDraft: boolean\n  /** The document is the introduction we just seeded, not the user's work. */\n  seededIntro: boolean\n  /** The document came back from localStorage, so \"Saved\" is true to say. */\n  fromStorage: boolean\n}\n\n/**\n * What does this page open with?\n *\n * In-progress anonymous work wins over a saved document, per the spec: someone\n * who logs in mid-edit must not watch their draft vanish. The draft is only\n * cleared once the server has confirmed a copy (see `onCreated`).\n *\n * A first-time visitor gets the introduction as ordinary document content.\n * \"First-time\" means no anonymous document has ever been stored — an empty\n * stored document means the user cleared it, and re-seeding then would be\n * putting text back that they just deleted.\n */\nfunction chooseInitialDocument(config: PastyConfig): InitialDocument {\n  const anonymous = loadAnonDocument()\n\n  if (config.user.is_authenticated) {\n    if (hasContent(anonymous)) {\n      return {\n        document: anonymous,\n        documentId: null,\n        convertingAnonymousDraft: true,\n        seededIntro: false,\n        fromStorage: true,\n      }\n    }\n    // Nothing worth keeping; don't leave an empty draft lying around.\n    clearAnonDocument()\n    if (config.published_doc) {\n      // A docs page. The content is the page's and the id is nobody's: the row\n      // is created on the first save, exactly as at `/`, so reading a docs\n      // page writes nothing and editing one writes a copy.\n      return {\n        document: {\n          title: config.published_doc.title,\n          markdown: config.published_doc.markdown,\n          updated_at: nowTimestamp(),\n        },\n        documentId: null,\n        convertingAnonymousDraft: false,\n        seededIntro: false,\n        fromStorage: false,\n      }\n    }\n    if (config.doc) {\n      return {\n        document: {\n          title: config.doc.title,\n          markdown: config.doc.markdown,\n          updated_at: config.doc.updated_at,\n        },\n        documentId: config.doc.id,\n        convertingAnonymousDraft: false,\n        seededIntro: false,\n        fromStorage: false,\n      }\n    }\n    return {\n      document: emptyDocument(),\n      documentId: null,\n      convertingAnonymousDraft: false,\n      seededIntro: false,\n      fromStorage: false,\n    }\n  }\n\n  if (anonymous) {\n    return {\n      document: anonymous,\n      documentId: null,\n      convertingAnonymousDraft: false,\n      seededIntro: false,\n      fromStorage: true,\n    }\n  }\n\n  return {\n    document: { title: '', markdown: introMarkdown(config.urls.signup), updated_at: nowTimestamp() },\n    documentId: null,\n    convertingAnonymousDraft: false,\n    seededIntro: true,\n    fromStorage: false,\n  }\n}\n\nfunction initialFreshDocument(document: StoredDocument): InitialDocument {\n  return {\n    document,\n    documentId: null,\n    convertingAnonymousDraft: false,\n    seededIntro: false,\n    fromStorage: false,\n  }\n}\n\nfunction boot(): void {\n  const root = document.getElementById('editor-root')\n  if (!root) {\n    return\n  }\n\n  const config = readConfig()\n\n  // A /s/<token> page. Everything editor-shaped stops here: same bundle, same\n  // renderer, none of the machinery that implies the viewer can type.\n  if (config.shared_doc) {\n    bootSharedView(root, config.shared_doc)\n    return\n  }\n\n  // A /docs/<slug> page, signed out: the same read-only view as /s/, plus a\n  // button that copies the page into this browser's draft. Signed in, the same\n  // URL falls through — `published_doc` seeds the editor below, and the first\n  // keystroke makes a private copy the way any new document is made.\n  if (config.published_doc && !config.user.is_authenticated) {\n    bootPublishedView(root, config.published_doc, {\n      home: config.urls.home,\n      navigate: url => window.location.assign(url),\n    })\n    return\n  }\n\n  // Three kinds of page, decided once. A guest holds an edit link and no\n  // account: everything account-shaped below — the anonymous draft, the\n  // introduction, the signup banner, conversion — is not merely hidden from\n  // them, it never runs.\n  const guestDoc = config.edit_doc ?? null\n  const pageKind: 'guest' | 'owner' | 'anonymous' = guestDoc\n    ? 'guest'\n    : config.user.is_authenticated\n      ? 'owner'\n      : 'anonymous'\n  const authenticated = pageKind === 'owner'\n  // One-shot, and consumed even when it won't be acted on, so a flag from an\n  // abandoned signup can't ambush a later visit.\n  const wantsShareOpen = consumePostAuthShareIntent() && authenticated\n  // Assigned once the controller exists below; `onCreated` only ever fires\n  // after boot has finished, the same reason `syncChrome` starts inert.\n  let share: ShareController | null = null\n  const handoff = pageKind === 'guest' ? null : resolveImportDocument(config)\n  const freshStart = handoff || pageKind === 'guest' ? null : resolveFreshStart(config)\n  let initial: InitialDocument\n  if (guestDoc) {\n    initial = {\n      document: {\n        title: guestDoc.title,\n        markdown: guestDoc.markdown,\n        updated_at: guestDoc.updated_at,\n      },\n      documentId: null,\n      convertingAnonymousDraft: false,\n      seededIntro: false,\n      // The page delivered it; nothing here is waiting to be written anywhere.\n      fromStorage: false,\n    }\n  } else if (handoff) {\n    initial = {\n      document: handoff.document,\n      documentId: null,\n      convertingAnonymousDraft: false,\n      seededIntro: false,\n      fromStorage: handoff.storedLocally,\n    }\n  } else if (freshStart) {\n    initial = initialFreshDocument(freshStart)\n  } else {\n    initial = chooseInitialDocument(config)\n  }\n\n  // The revision every save will be built on, until the server answers with a\n  // newer one. Delivered with the page: there is no fetch to race with.\n  const bootRevision = guestDoc?.revision ?? config.doc?.revision ?? 0\n  // Backups are keyed by document id, and a guest has none — the link is the\n  // address, so it is the name their unsaved work is kept under.\n  const storageKey = guestDoc ? guestDoc.endpoint : undefined\n\n  // --- chrome ---------------------------------------------------------------\n\n  const mount = el('div', { class: 'pasty-editor' })\n  const page = el('div', { class: 'pasty-page' }, mount)\n  const workspace = el('div', { class: 'pasty-workspace' }, page)\n  const toolbarRail = el('div', { class: 'pasty-toolbar-rail' })\n  const toolbarBar = el('div', { class: 'pasty-toolbar-bar' }, toolbarRail)\n  // Not on a guest page. The banner invites you to make an account so your work\n  // is saved — which on somebody else's document is both untrue and an auth\n  // link on a page that deliberately carries none.\n  const banner = pageKind === 'guest' ? null : createAnonBanner(config.urls)\n  const problemNote = el('p', { class: 'pasty-problem', role: 'status' })\n  problemNote.hidden = true\n  // Built here so the lane can hold it; its handlers are wired once autosave\n  // and the editor exist, because every branch of it touches both.\n  const conflict = createConflictNotice({\n    useLatest: () => resolveConflict('latest'),\n    keepMine: () => resolveConflict('mine'),\n  })\n  // One lane for all three, so they can never end up stacked in the same corner.\n  const overlays = el(\n    'div',\n    { class: 'pasty-overlays' },\n    problemNote,\n    conflict.element,\n    banner?.element ?? null,\n  )\n  // A sibling of that lane, not a member of it: the lane is centred and holds\n  // things that appear and vanish, and the indicator is neither.\n  const vimIndicator = createVimIndicator()\n\n  clear(root)\n  root.append(toolbarBar, workspace, overlays, vimIndicator.element)\n\n  // Progressive enhancement over the server-rendered <details> menus. The\n  // theme itself is already correct by now — base.css resolves System on its\n  // own, and the boot script applied any override before first paint.\n  installMenus()\n  const theme = installTheme()\n  installAppearanceMenu(theme)\n\n  // --- editor ---------------------------------------------------------------\n\n  const title = createTitleField({\n    initial: initial.document.title,\n    onChange: () => onDocumentChanged(),\n  })\n\n  const titleSlot = document.getElementById('doc-title-slot')\n  titleSlot?.append(title.element)\n  if (pageKind === 'guest') {\n    // The name is the owner's. A guest can read it — it says what they are\n    // working on — and the server drops a title from their writes anyway.\n    title.setReadOnly()\n  }\n\n  // Does this tab hold anything the store does not?\n  //\n  // A counter rather than a boolean, because a save can only ever clear the\n  // revision it actually sent. If an edit lands while a save is in flight, that\n  // save completing must not mark the newer edit as stored — `flush()` would\n  // then decline to write it, and the last thing typed would be lost. Today\n  // `autosave` re-reads and compares the snapshot synchronously before\n  // reporting \"saved\", so a boolean would happen to work; this does not depend\n  // on that invariant holding inside another module.\n  let editSerial = 0\n  let snapshotSerial = 0\n  let savedSerial = 0\n  const dirty = () => editSerial > savedSerial\n\n  const statusSlot = document.getElementById('save-status-slot')\n  const setStatus = (status: SaveStatus) => {\n    if (status === 'saved') {\n      // The one status that means persisted, and every save path ends here.\n      savedSerial = snapshotSerial\n    }\n    saveStatus = status\n    renderStatus()\n  }\n\n  /**\n   * One status line, two things that can claim it.\n   *\n   * `Reconnecting…` outranks everything except `Not saved — retrying`: if the\n   * durable save is also failing, that is the more serious of the two and the\n   * one the user needs to see.\n   */\n  let saveStatus: SaveStatus = 'idle'\n  let reconnecting = false\n  const renderStatus = () => {\n    if (!statusSlot) {\n      return\n    }\n    statusSlot.textContent =\n      reconnecting && saveStatus !== 'offline' ? RECONNECTING_TEXT : STATUS_TEXT[saveStatus]\n  }\n\n  // The editor can emit a transaction while it is still being constructed, so\n  // the handler goes through a binding that starts inert.\n  let syncChrome = () => {}\n\n  // The same hazard, one level up: `onDocumentChanged` is a hoisted declaration\n  // that reads `editor`, `title` and `introUntouched`, none of which exist yet.\n  // Nothing is worth saving before first paint anyway.\n  let booted = false\n\n  // --- the live layer -------------------------------------------------------\n  //\n  // Built before the editor, because the editor renders *from* the shared\n  // document rather than into it. Whether this page is collaborative at all was\n  // decided by the server: `collab` is in the bootstrap exactly when an edit\n  // link exists, and switching that is a reload, never a swap in place.\n  let live = config.collab ? createLiveDocument(config.collab) : null\n  let provider: PollingProvider | null = null\n  let presence: ReturnType<typeof createPresence> | null = null\n  /** Set while `ready()` has not run: a remote update then has nothing to tell. */\n  let firstRendered = false\n  let onFirstRender = () => {\n    firstRendered = true\n  }\n\n  const buildEditor = (): Editor =>\n    createEditor({\n      element: mount,\n      collaboration: live\n        ? {\n            document: live.doc,\n            awareness: live.awareness,\n            // Replaced by the server's answer on join; until then this client\n            // is somebody, just not yet somebody with a number.\n            user: { name: 'You', color: '#8a8a8a' },\n            onFirstRender: () => onFirstRender(),\n          }\n        : undefined,\n      content: live ? undefined : initial.document.markdown,\n      autofocus: true,\n      onUpdate: (_editor, transaction) =>\n        isRemote(transaction) ? onRemoteChanged() : onDocumentChanged(),\n      onTransaction: () => syncChrome(),\n    })\n\n  let editor: Editor = buildEditor()\n\n  /**\n   * Start this session's shared document off from the page's own Markdown.\n   *\n   * Only when there is no session yet. The seed is deterministic — see\n   * `collab/seed.ts` — so two people opening the same document at the same\n   * moment produce identical bytes that Yjs deduplicates, rather than two\n   * copies of the text merged into one document.\n   */\n  let seed: ReturnType<typeof buildSeed> | null = null\n  if (live && config.collab?.session === null) {\n    try {\n      const json = parseMarkdown(editor, initial.document.markdown)\n      seed = buildSeed(editor.schema, json as Record<string, unknown>, bootRevision)\n      // SEED_ORIGIN, so it is neither undoable nor pushed as this client's own\n      // contribution: the server is about to be told about it as the seed.\n      Y.applyUpdate(live.doc, seed.bytes, SEED_ORIGIN)\n    } catch {\n      // The bootstrap Markdown could not be parsed into a document to seed\n      // from. Rather than start a shared session around something wrong, fall\n      // back to the plain editor: saving still works, sharing still works, and\n      // only the live layer is missing.\n      editor.destroy()\n      live.destroy()\n      live = null\n      seed = null\n      clear(mount)\n      editor = buildEditor()\n    }\n  }\n\n  const toolbar = createToolbar(editor)\n  const tableMenu = createTableMenu(editor)\n  const linkPopover = createLinkPopover(editor)\n  toolbarRail.append(toolbar.element, tableMenu.element)\n  page.append(linkPopover.element)\n\n  // One subscription is enough: the engine announces every change to whether it\n  // is on and which mode it is in, however that change was caused.\n  const vim = installVim({ editor, config, preferences: new PreferencesApi(config) })\n  subscribeVimStatus(editor, status => vimIndicator.sync(status))\n  // The `/` and `:` bar lives in the overlays lane, where the other transient\n  // notices live — it comes and goes, which is exactly what that lane is for.\n  installVimChrome(editor, {\n    overlays,\n    // `:w` is an alias for the save that is already happening — flush it, then\n    // report the truth: stored means nothing is left unsaved in this tab.\n    save: async () => {\n      await flush()\n      return !dirty()\n    },\n  })\n  // Silent unless someone sets `pasty.vim_debug`, and the flag is read per\n  // keystroke — see `vim/debug.ts` for why a keyboard logger ships at all.\n  installVimKeyLogger()\n  // Another view of the same two controllers, so the dialog and the header menus\n  // can never disagree about what is on.\n  const settings = installSettings({ editor, theme, vim })\n\n  // Clicking the page margin puts the caret in the document, the way it does in\n  // any word processor. Without this the margins are dead space that looks\n  // editable and isn't.\n  page.addEventListener('mousedown', event => {\n    const target = event.target as HTMLElement\n    if (editor.view.dom.contains(target) || target.closest('a, button, input')) {\n      return\n    }\n    event.preventDefault()\n    const position = editor.view.posAtCoords({ left: event.clientX, top: event.clientY })\n    editor.commands.focus(position ? position.pos : 'end')\n  })\n\n  syncChrome = () => {\n    toolbar.sync()\n    tableMenu.sync()\n    updateOverlays()\n  }\n\n  // The introduction is ordinary content, so it behaves like content: select\n  // it, edit it, delete it. The one exception is paste. Someone whose first\n  // action is Cmd+V means \"this is my document now\", not \"insert this into the\n  // introduction\" — so an untouched introduction gets replaced wholesale. The\n  // listener is on capture so the selection is in place before ProseMirror's\n  // own paste handling runs.\n  let introUntouched = initial.seededIntro\n\n  // While the introduction is untouched it is doing double duty as the empty\n  // state, and editor.css renders it as instruction rather than as content.\n  const syncIntroState = () => {\n    mount.classList.toggle('is-intro', introUntouched)\n  }\n\n  const refreshIntroState = () => {\n    if (introUntouched && !isUntouchedIntro(serializeMarkdown(editor), config.urls.signup)) {\n      introUntouched = false\n      syncIntroState()\n    }\n  }\n\n  syncIntroState()\n\n  /**\n   * The document's first line, as a title — or nothing, when it is ours rather\n   * than the user's.\n   *\n   * `introUntouched` is not enough of a guard on its own: `refreshIntroState`\n   * clears it on the first edit anywhere in the document, so a visitor who types\n   * one character at the end of the introduction would otherwise end up with a\n   * document named after our headline, saved, and converted into their account\n   * on signup.\n   */\n  const firstLine = (): string => {\n    if (introUntouched) {\n      return ''\n    }\n    const text = deriveTitle(editor.state.doc)\n    return initial.seededIntro && isIntroHeadline(text) ? '' : text\n  }\n\n  editor.view.dom.addEventListener(\n    'paste',\n    () => {\n      if (introUntouched) {\n        editor.commands.selectAll()\n      }\n    },\n    true,\n  )\n\n  // --- persistence ----------------------------------------------------------\n\n  const snapshot = (): StoredDocument => {\n    // Every save path takes its payload from here, so this is where the\n    // revision gets stamped onto the bytes going out.\n    snapshotSerial = editSerial\n    return {\n      title: title.value(),\n      markdown: serializeMarkdown(editor),\n      updated_at: nowTimestamp(),\n    }\n  }\n\n  const showProblem = (message: string | null) => {\n    problemNote.textContent = message ?? ''\n    problemNote.hidden = !message\n  }\n\n  const api = new DocumentsApi(config)\n  const guestApi = guestDoc ? new GuestDocumentApi(guestDoc.endpoint, config.csrf_header) : null\n\n  /**\n   * Where a save goes when it goes over HTTP as itself: the owner's documents\n   * API, or a guest's token-addressed one. In collab mode this is still the\n   * fallback — the live session is the road a save takes while there is one.\n   */\n  const plainWriter: DocumentWriter = guestApi ?? api\n\n  /** False once the live layer has given up; from then on saves go the plain way. */\n  let liveWriting = live !== null\n\n  const writer: DocumentWriter = {\n    update: (id, input, options) =>\n      liveWriting && provider ? provider.write(input) : plainWriter.update(id, input, options),\n    // Only the documents API can make a row that does not exist yet, and only\n    // an owner ever needs one. Left undefined for a guest, which is what tells\n    // autosave that update is the only verb here.\n    ...(plainWriter.create\n      ? { create: (input, options) => plainWriter.create!(input, options) }\n      : {}),\n  }\n\n  const autosave = createAutosave({\n    api: writer,\n    documentId: initial.documentId,\n    storageKey,\n    revision: bootRevision,\n    collab: live !== null,\n    // The title is the owner's. A guest's writes carry Markdown only, and the\n    // server drops a title from them anyway — this is the client agreeing.\n    sendTitle: () => pageKind !== 'guest',\n    getSnapshot: snapshot,\n    onStatus: setStatus,\n    onCreated: created => {\n      // The draft is safe now, and only now.\n      clearAnonDocument()\n      const url = `${config.urls.doc_base}${created.id}`\n      if (config.doc && initial.convertingAnonymousDraft) {\n        // This page was rendered for one document and is showing another: the\n        // draft won, and has just become a document of its own. A reload is the\n        // only way to get the server-rendered chrome to agree with the screen.\n        if (wantsShareOpen) {\n          // Consumed at boot, re-armed across the reload: the intent is not\n          // done until a page has actually opened the popover.\n          markPostAuthShareIntent()\n        }\n        window.location.replace(url)\n      } else {\n        window.history.replaceState(null, '', url)\n        if (wantsShareOpen) {\n          // The draft they wanted to share is a document now. `open()`, not\n          // `act()`: signing up is not a decision to publish, so the popover\n          // comes back holding the pre-share card and waits for a real click.\n          share?.open()\n        }\n      }\n    },\n    onAuthLost: () => {\n      showProblem('Your session ended. Log in again to keep saving this document.')\n    },\n    onProblem: showProblem,\n    onConflict: sides => showConflict(sides),\n    onSessionReset: () => resetLive(),\n    onModeChanged: () => reloadForMode(),\n  })\n\n  // --- conflicts ------------------------------------------------------------\n  //\n  // Two versions of a document exist and the product will not choose between\n  // them. Whichever branch runs, the version it displaces is written to a\n  // localStorage namespace that ordinary saves never clear, *before* anything\n  // is overwritten — so \"Use latest\" is never the click that lost a paragraph.\n\n  /** What the notice is currently about, and what its two buttons will do. */\n  let conflictKind: 'save' | 'restore' | 'live' | null = null\n  let conflictServer: ConflictDocument | null = null\n  let conflictLocal: StoredDocument | null = null\n\n  const conflictKey = (): string => autosave.documentId() ?? storageKey ?? 'document'\n\n  const setDocumentContent = (markdown: string, nextTitle: string) => {\n    editor.commands.setContent(parseMarkdown(editor, markdown))\n    title.replace(nextTitle)\n  }\n\n  const showConflict = (sides: ConflictSides) => {\n    conflictKind = 'save'\n    conflictServer = sides.server\n    conflictLocal = sides.local\n    conflict.show(CONFLICT_TEXT.changed)\n  }\n\n  function resolveConflict(choice: 'latest' | 'mine'): void {\n    const kind = conflictKind\n    const server = conflictServer\n    const local = conflictLocal\n    conflict.hide()\n    conflictKind = null\n    if (kind === null || local === null) {\n      return\n    }\n\n    if (kind === 'restore') {\n      // The two sides here are \"what this browser still holds\" and \"what the\n      // page loaded\"; there is no server version to archive.\n      if (choice === 'mine') {\n        setDocumentContent(local.markdown, local.title)\n        onDocumentChanged()\n      }\n      return\n    }\n\n    if (kind === 'live') {\n      resolveLiveConflict(choice, local)\n      return\n    }\n\n    if (server === null) {\n      return\n    }\n    if (choice === 'latest') {\n      // Their version wins on screen; ours goes somewhere it can be found.\n      saveConflictCopy(conflictKey(), { origin: 'local', document: local, at: nowTimestamp() })\n      setDocumentContent(server.markdown, server.title)\n      autosave.adopt(server)\n      return\n    }\n    // Ours wins; theirs is archived on the server by the forced write, and here\n    // too, because the server's copy is admin-only.\n    saveConflictCopy(conflictKey(), {\n      origin: 'server',\n      document: {\n        title: server.title,\n        markdown: server.markdown,\n        updated_at: server.updated_at,\n      },\n      at: nowTimestamp(),\n    })\n    void autosave.keepMine(server)\n  }\n\n  let anonSaveTimer: number | undefined\n\n  const saveAnonymously = () => {\n    // Never touch the anonymous key while signed in — conversion is the only\n    // transition that consumes it — and never on a guest page, where the\n    // document belongs to somebody else entirely.\n    if (pageKind !== 'anonymous') {\n      return\n    }\n    // An introduction nobody has touched is not the user's work. Storing it\n    // would also mean converting it into their account when they sign up,\n    // which is how they would end up owning a document of ours.\n    if (introUntouched) {\n      return\n    }\n    const stored = saveAnonDocument(snapshot())\n    setStatus(stored ? 'saved' : 'unsaved')\n  }\n\n  function onDocumentChanged(): void {\n    if (!booted) {\n      return\n    }\n    editSerial += 1\n    refreshIntroState()\n    // Before the save branches, so the snapshot they take already carries it.\n    title.derive(firstLine())\n    updateOverlays()\n    if (pageKind !== 'anonymous') {\n      // Owner or guest: both save to the server, by different roads.\n      autosave.schedule()\n      return\n    }\n    if (introUntouched) {\n      return\n    }\n    setStatus('saving')\n    window.clearTimeout(anonSaveTimer)\n    anonSaveTimer = window.setTimeout(saveAnonymously, ANON_SAVE_DEBOUNCE_MS)\n  }\n\n  /**\n   * Somebody else typed.\n   *\n   * Their text is already safe — it is in the CRDT and on its way to everyone\n   * else — so this is only about the durable Markdown, on a gentler schedule.\n   * The title follows the document as usual; nothing here touches the caret.\n   */\n  function onRemoteChanged(): void {\n    if (!booted || !firstRendered) {\n      return\n    }\n    title.derive(firstLine())\n    autosave.scheduleRemote()\n  }\n\n  function updateOverlays(): void {\n    // The introduction already carries a Create an account link; the banner\n    // would just repeat it — and a guest has nothing to sign up *for* here.\n    banner?.update(pageKind === 'anonymous' && !introUntouched)\n  }\n\n  /** Save now. Resolves once the work has landed, so a caller can wait for it. */\n  const flush = (): Promise<void> => {\n    // `visibilitychange` fires on every tab switch, not just on close. Without\n    // this, a tab that only *loaded* a document would write its snapshot over\n    // whatever another tab had done since — and an anonymous tab left open from\n    // before you signed in would re-seed the draft after conversion cleared it,\n    // with nobody having typed a character.\n    if (!dirty()) {\n      return Promise.resolve()\n    }\n    if (pageKind !== 'anonymous') {\n      return autosave.flush()\n    }\n    window.clearTimeout(anonSaveTimer)\n    saveAnonymously()\n    return Promise.resolve()\n  }\n\n  window.addEventListener('beforeunload', () => void flush())\n  document.addEventListener('visibilitychange', () => {\n    const hidden = document.visibilityState === 'hidden'\n    if (hidden) {\n      void flush()\n    }\n    // A tab nobody is looking at stops claiming a caret in somebody else's\n    // document, and stops polling as if it were.\n    provider?.setHidden(hidden)\n  })\n  // pagehide, not beforeunload, for the goodbye: it is the one that fires on\n  // mobile Safari, and the keepalive request has to actually leave.\n  window.addEventListener('pagehide', () => provider?.leave())\n\n  // --- copy markdown --------------------------------------------------------\n\n  // The palette is the only thing that asks for this now, and it closes itself\n  // on the way out — which would leave a screen reader with nothing at all.\n  // This region says what happened, from somewhere that moves no layout.\n  const copyConfirmation = el('span', { class: 'pasty-copied', role: 'status' })\n  document.body.append(copyConfirmation)\n\n  let copyConfirmationTimer: number | undefined\n\n  // Named, because it is what the palette's `Copy Markdown` runs: one copy\n  // path, one announcement, however it was asked for.\n  const runCopy = (): Promise<boolean> =>\n    copyWholeDocument(editor).then(copied => {\n      copyConfirmation.textContent = copied ? 'Markdown copied' : \"Couldn't copy\"\n      // Cleared again so that copying twice announces twice: a region still\n      // holding the same sentence has not changed, and the silence would read\n      // as a command that did nothing. Clearing the timer first stops the first\n      // copy from wiping the second one's announcement early.\n      window.clearTimeout(copyConfirmationTimer)\n      copyConfirmationTimer = window.setTimeout(() => {\n        copyConfirmation.textContent = ''\n      }, COPY_ANNOUNCEMENT_MS)\n      return copied\n    })\n\n  // --- the live session -----------------------------------------------------\n\n  /**\n   * Turning editing on or off changes what kind of editor this page is, which\n   * is decided at load. So: get the work somewhere safe, then reload.\n   */\n  const beforeReload = async (): Promise<void> => {\n    await flush()\n    // Whatever never reached the server goes to localStorage under this\n    // session's key, and is replayed on the next join.\n    provider?.leave()\n  }\n\n  let reloading = false\n  const reloadForMode = () => {\n    if (reloading || dirty()) {\n      // Not while this tab holds something the server hasn't got. The next\n      // successful save calls back here.\n      return\n    }\n    reloading = true\n    window.location.reload()\n  }\n\n  /** Other tabs of ours, on this document, so they follow the mode change. */\n  const channel =\n    typeof BroadcastChannel !== 'undefined' && config.doc\n      ? new BroadcastChannel(`pasty:doc:${config.doc.id}`)\n      : null\n  channel?.addEventListener('message', event => {\n    if ((event.data as { type?: string } | null)?.type === 'editable') {\n      void flush().then(() => reloadForMode())\n    }\n  })\n\n  /**\n   * The live session was replaced under this tab.\n   *\n   * Nothing is lost either way — the text is on screen and in localStorage —\n   * but this tab's CRDT describes a session that no longer exists, so it cannot\n   * simply carry on. Clean, and it reloads into the new session; dirty, and the\n   * user is asked, because reloading would silently drop what they typed.\n   */\n  function resetLive(): void {\n    provider?.stop()\n    liveWriting = false\n    if (!dirty()) {\n      reloading = true\n      window.location.reload()\n      return\n    }\n    conflictKind = 'live'\n    conflictLocal = snapshot()\n    conflict.show(CONFLICT_TEXT.reset, { hint: DISCONNECT_HINT })\n  }\n\n  function resolveLiveConflict(choice: 'latest' | 'mine', local: StoredDocument): void {\n    if (choice === 'latest') {\n      // Their session wins. This tab's text is kept where it can be recovered,\n      // and the reload joins whatever is live now.\n      saveConflictCopy(conflictKey(), { origin: 'local', document: local, at: nowTimestamp() })\n      reloading = true\n      window.location.reload()\n      return\n    }\n    // This tab's text wins, written the plain way — the session it would have\n    // ridden on is gone. The other editors are reset in turn, which is what the\n    // hint on the notice says out loud.\n    void plainWriter\n      .update(autosave.documentId(), {\n        ...(pageKind === 'guest' ? {} : { title: local.title }),\n        markdown: local.markdown,\n        revision: autosave.revision(),\n        force: true,\n      })\n      .then(\n        () => {\n          reloading = true\n          window.location.reload()\n        },\n        () => showProblem(\"Couldn't save your version. Copy your text before reloading.\"),\n      )\n  }\n\n  if (live) {\n    const transport = guestApi ? guestApi.collab() : api.collab(config.doc?.id ?? '')\n    presence = createPresence(live.awareness)\n    document.querySelector('.app-header__right')?.prepend(presence.element)\n\n    const shared = live\n    void (seed ? hashSeed(seed) : Promise.resolve(null)).then(hashed => {\n      const started = createProvider({\n        doc: shared.doc,\n        awareness: shared.awareness,\n        transport,\n        bootstrap: shared.bootstrap,\n        seed: hashed,\n        revision: () => autosave.revision(),\n        hidden: () => document.visibilityState === 'hidden',\n      })\n      provider = started\n\n      started.on('status', status => {\n        reconnecting = status === 'reconnecting'\n        renderStatus()\n      })\n      // Somebody else persisted the Markdown. This tab's base moves with it, so\n      // its own next write is not refused for being behind.\n      started.on('revision', next => autosave.noteRevision(next))\n      started.on('identity', user => editor.commands.updateUser(user))\n      started.on('reset', () => resetLive())\n      started.on('gone', () => {\n        // The edit link was turned off. The text stays on screen — it is the\n        // user's, and taking it away would be the one unforgivable move — but\n        // there is nowhere left to save it.\n        started.stop()\n        liveWriting = false\n        autosave.stop()\n        editor.setEditable(false)\n        reconnecting = false\n        renderStatus()\n        showProblem(\n          'This edit link was turned off. Your text is still here — copy it if you need it.',\n        )\n      })\n      started.on('unavailable', () => {\n        // The live layer could not start. Editing carries on exactly as it did\n        // before any of this existed: revision-checked saves over HTTP.\n        liveWriting = false\n        reconnecting = false\n        renderStatus()\n        autosave.schedule()\n      })\n      started.start()\n    })\n  }\n\n  // --- share ----------------------------------------------------------------\n\n  share = installShare({\n    config,\n    api,\n    beforeReload,\n    announce: editable => channel?.postMessage({ type: 'editable', value: editable }),\n    // Save what this page holds — the `dirty()` guard above still decides\n    // whether that is anything — and then insist on a row, because sharing is\n    // the one action that needs something to point at even when the document is\n    // blank.\n    ensureDocument: async () => {\n      await flush()\n      return autosave.createIfMissing()\n    },\n    // Same reason as the palette's currentDocumentId: the id the server\n    // assigned, not the one the page was rendered for.\n    documentId: autosave.documentId,\n  })\n\n  // --- command palette ------------------------------------------------------\n\n  /**\n   * Delete the document this page is editing, and go home.\n   *\n   * The confirm is `window.confirm`, the same instinct as the fresh-start\n   * prompt: an irreversible thing that takes one keystroke to reach needs a\n   * beat, and the platform's dialog is the one nobody has to learn.\n   *\n   * Then the order matters. Flush first, so a PATCH already in flight settles\n   * against a row that still exists rather than racing the DELETE into a 404\n   * the user would see as a conflict. Stop second, so nothing fires afterwards\n   * and resurrects the document by creating it again. Only then the delete.\n   *\n   * A 404 means somebody already deleted it — another tab, the CLI — which is\n   * the outcome that was asked for, so it lands on `/` like a success. Anything\n   * else leaves the document alone, and a reload is the honest answer: this\n   * page has a stopped autosave and can no longer be typed into safely.\n   */\n  const deleteDocument = async (): Promise<void> => {\n    const id = autosave.documentId()\n    if (!id || !window.confirm('Delete this document? Anyone with a link loses it too.')) {\n      return\n    }\n    await flush()\n    autosave.stop()\n    try {\n      await api.delete(id)\n    } catch (error) {\n      if (!(error instanceof ApiError) || error.status !== 404) {\n        window.location.reload()\n        return\n      }\n    }\n    window.location.assign(config.urls.home)\n  }\n\n  installPalette({\n    editor,\n    theme,\n    vim,\n    settings,\n    config,\n    api,\n    share,\n    title: title.element,\n    copy: runCopy,\n    flush,\n    navigate: url => window.location.assign(url),\n    // A conflict on screen pauses saving, so leaving would answer the question\n    // by walking away from it.\n    blocked: () => dirty(),\n    // Not `config.doc`: an anonymous draft that converts on this page gets its\n    // id from the server, and the palette should stop listing it from then on.\n    currentDocumentId: autosave.documentId,\n    deleteDocument: () => void deleteDocument(),\n  })\n\n  // --- first paint ----------------------------------------------------------\n\n  /**\n   * Everything that has to wait until the document on screen is the real one.\n   *\n   * In the plain editor that is immediately: the content was passed to the\n   * constructor. In collab mode it is whenever Yjs first renders — deriving a\n   * title from an empty document and saving it would otherwise be this page's\n   * first act.\n   */\n  function ready(): void {\n    booted = true\n    updateOverlays()\n\n    // Is this title ours to write? It is if there isn't one — or if the one we\n    // loaded is still exactly the document's first line, which means we derived\n    // it in an earlier session. Without that second clause the feature defeats\n    // itself: the first backfill below saves a title, and every later visit\n    // would read it as one the user typed and stop following the document.\n    //\n    // The cost is a user who typed a title that happens to equal their own first\n    // line, and then changes that line. What they meant there is genuinely\n    // ambiguous, and the alternative is a database column for one bit.\n    const storedTitle = initial.document.title.trim()\n    title.setDerived(storedTitle === '' || storedTitle === firstLine())\n    title.derive(firstLine())\n\n    // A title we just derived for a document that had none is unsaved work.\n    // A guest cannot write one, so for them it is nothing at all.\n    const backfilled = pageKind !== 'guest' && storedTitle === '' && title.value() !== ''\n\n    // What this page holds that the store may not. The two saves below call\n    // `autosave.flush()` directly and so are never suppressed — but the command\n    // palette calls the `flush()` above before navigating, and a ⌘K in the first\n    // second must still wait for an in-flight conversion. Otherwise the keepalive\n    // POST lands, `onCreated` never runs, and the draft is never cleared.\n    editSerial = Number(initial.convertingAnonymousDraft || backfilled)\n\n    // One chain, so no document can be saved twice on open.\n    if (initial.convertingAnonymousDraft) {\n      // Get the draft onto the account immediately, not after the first keystroke.\n      void autosave.flush()\n    } else if (pageKind === 'guest') {\n      // The page delivered the document and nothing is pending; anything else\n      // would tell a guest their host's document was unsaved.\n      setStatus('saved')\n    } else if (authenticated) {\n      // `flush`, not `schedule`: scheduling sets \"Not saved\" synchronously, which\n      // would sit on screen for a second telling someone who has only opened a\n      // document that it is unsaved. Flushing says \"Saving…\", then \"Saved\".\n      if (backfilled) {\n        void autosave.flush()\n      } else {\n        setStatus(initial.documentId ? 'saved' : 'idle')\n      }\n    } else if (backfilled) {\n      saveAnonymously()\n    } else if (initial.fromStorage) {\n      // A seeded introduction isn't stored yet, so it isn't saved yet either.\n      setStatus('saved')\n    }\n\n    offerRestore()\n  }\n\n  /**\n   * Work from a previous visit that never reached the server.\n   *\n   * A save that fails leaves an error to react to; a save that simply never\n   * returns — the tab closed, the laptop slept — leaves nothing at all. The\n   * backup written before every request is what covers that, and this is where\n   * it is offered back. Never applied automatically: what is on screen came\n   * from the server, and replacing it without asking would be the same\n   * overwrite this whole feature exists to prevent.\n   */\n  function offerRestore(): void {\n    const key = autosave.documentId() ?? storageKey\n    if (!key || conflictKind !== null) {\n      return\n    }\n    const backup = loadBackup(key)\n    if (!backup || !hasContent(backup)) {\n      return\n    }\n    if (backup.markdown === initial.document.markdown && backup.title === initial.document.title) {\n      return\n    }\n    conflictKind = 'restore'\n    conflictLocal = { title: backup.title, markdown: backup.markdown, updated_at: backup.updated_at }\n    conflict.show(CONFLICT_TEXT.restore, RESTORE_CHOICES)\n  }\n\n  if (live) {\n    // Yjs may already have rendered during construction, in which case the flag\n    // is set and there is nothing to wait for.\n    if (firstRendered) {\n      ready()\n    } else {\n      onFirstRender = () => {\n        firstRendered = true\n        ready()\n      }\n    }\n  } else {\n    ready()\n  }\n\n  // The other half of the share intent: nothing converted (their draft may have\n  // been empty), so there is no onCreated to wait for — open now. Whatever\n  // state the document is in, the popover renders it, and the click that\n  // follows saves and shares from there.\n  if (wantsShareOpen && !initial.convertingAnonymousDraft) {\n    share.open()\n  }\n\n  // Exposed for the Playwright suite and the dev harness. getMarkdown is the\n  // same function that feeds saves and the Copy Markdown command, so browser\n  // tests assert on what actually ships.\n  Object.defineProperty(window, '__pasty', {\n    value: {\n      editor,\n      config,\n      getMarkdown: () => serializeMarkdown(editor),\n      // The Playwright bridge: browser tests read the mode the same way the\n      // indicator does, rather than scraping the pill they are also asserting on.\n      vim: {\n        enabled: () => vimStatus(editor).enabled,\n        mode: () => vimStatus(editor).mode,\n        // For bug reports: what a macro recorded, behind the debug flag.\n        debugMacro: (register?: string) => vimMacroDump(editor, register),\n      },\n      // The base the next save will name, so a browser test can watch a\n      // revision advance without reading the network.\n      revision: () => autosave.revision(),\n      collab: {\n        status: () => provider?.status() ?? null,\n        session: () => provider?.session() ?? null,\n        peers: () => provider?.peers() ?? 0,\n        // Stop waiting on a live layer that is never going to start, so a test\n        // does not have to sit through the backoff.\n        giveUp: () => provider?.giveUp(),\n      },\n    },\n    configurable: true,\n  })\n}\n\nif (document.readyState === 'loading') {\n  document.addEventListener('DOMContentLoaded', boot)\n} else {\n  boot()\n}\n"],"names":["create","copy","m","r","v","k","setIfUndefined","map","key","createT","set","f","res","value","any","last","arr","appendTo","dest","src","i","from","every","some","unfold","len","array","isArray","ObservableV2","map.create","name","map.setIfUndefined","set.create","_f","args","observers","array.from","Observable","floor","abs","min","a","b","max","isNegativeZero","n","BIT1","BIT2","BIT3","BIT4","BIT6","BIT7","BIT8","BIT30","BITS5","BITS6","BITS7","BITS31","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","isInteger","num","math.floor","fromCharCode","toLowerCase","s","trimLeftRegex","trimLeft","fromCamelCaseRegex","fromCamelCase","separator","match","_encodeUtf8Polyfill","str","encodedString","buf","utf8TextEncoder","_encodeUtf8Native","encodeUtf8","utf8TextDecoder","repeat","source","array.unfold","Encoder","createEncoder","encode","encoder","toUint8Array","length","uint8arr","curPos","d","verifyLen","bufferLen","math.max","write","writeUint8","writeVarUint","binary.BITS7","binary.BIT8","writeVarInt","isNegative","math.isNegativeZero","binary.BITS6","binary.BIT7","_strBuffer","_maxStrBSize","_writeVarStringNative","written","string.utf8TextEncoder","writeVarUint8Array","string.encodeUtf8","_writeVarStringPolyfill","writeVarString","writeUint8Array","uint8Array","cpos","leftCopyLen","math.min","rightCopyLen","writeOnDataView","dview","writeFloat32","writeFloat64","writeBigInt64","floatTestBed","isFloat32","writeAny","data","number.isInteger","math.abs","binary.BITS31","array.isArray","keys","RleEncoder","writer","flushUintOptRleEncoder","UintOptRleEncoder","flushIntDiffOptRleEncoder","encodedDiff","IntDiffOptRleEncoder","StringEncoder","string","methodUnimplemented","unexpectedCase","errorUnexpectedEndOfArray","error.create","errorIntegerOutOfRange","Decoder","createDecoder","hasContent","decoder","readUint8Array","view","readVarUint8Array","readVarUint","readUint8","mult","number.MAX_SAFE_INTEGER","readVarInt","sign","_readVarStringPolyfill","remainingLen","nextLen","bytes","_readVarStringNative","string.utf8TextDecoder","readVarString","readFromDataView","dv","readFloat32","readFloat64","readBigInt64","readAnyLookupTable","obj","readAny","RleDecoder","reader","UintOptRleDecoder","IntDiffOptRleDecoder","diff","hasCount","StringDecoder","end","getRandomValues","rand","uint32","oneOf","uuidv4Template","uuidv4","c","getUnixTime","undefinedToNull","VarStoragePolyfill","newValue","_localStorage","usePolyfill","varStorage","EqualityTraitSymbol","equals","isObject","o","assign","forEach","size","isEmpty","_k","hasProperty","equalFlat","val","equalityTrait.equals","freeze","deepFreeze","callAll","fs","id","equalityDeep","equalityTrait.EqualityTraitSymbol","object.size","object.hasProperty","isOneOf","options","isNode","isBrowser","params","computeParams","pargs","currParamName","parg","kv","string.fromCamelCase","hasParam","getVariable","conditions.undefinedToNull","define_process_env_default","storage.varStorage","hasConf","production","forceColor","f.isOneOf","supportsColor","createUint8ArrayFromLen","toBase64Browser","string.fromCharCode","toBase64Node","toBase64","env.isBrowser","copyUint8Array","newBuf","encodeAny","encoding.encode","encoding.writeAny","Pair","left","right","bool","gen","int53","int32","int31","letter","word","minLen","maxLen","schemaSymbol","ValidationError","path","expected","has","message","string.repeat","shapeExtends","equalityTraits.EqualityTraitSymbol","equalityTraits.equals","arr.isArray","arr.every","aitem","arr.some","bitem","obj.isObject","obj.every","akey","Schema$1","other","fun.equalityDeep","_o","_err","error.methodUnimplemented","$union","$null","$Optional","assert","$ConstructedBy","Schema","check","err","$constructedBy","$Custom","$custom","$Literal","literals","$literal","$$literal","_regexEscape","_schemaStringTemplateToRegex","$string","$$number","$$string","$$union","error.unexpectedCase","$StringTemplate","shape","opts","isOptionalSymbol","$$optional","$Never","$Object","partial","vv","vk","obj.hasProperty","$object","def","$$object","$objectAny","$Record","values","ck","$record","$$record","$Tuple","$tuple","$Array","$Union","oi","$array","$$array","$arrayAny","$InstanceOf","constructor","$instanceOf","$$schema","$Lambda","$$lambda","$function","$Intersection","schemas","$s","$","_t","$any","$$any","$bigint","$$bigint","$symbol","$number","$boolean","$$boolean","$undefined","$$null","$primitive","$jsonArr","$jsonRecord","$json","o2","env.production","schema","PatternMatcher","$state","pattern","handler","h","p","state","_random","prng.int53","number.MIN_SAFE_INTEGER","prng.word","prng.bool","random","prng.oneOf","prop","prng.int32","keysN","doc","$.$custom","el","DOCUMENT_FRAGMENT_NODE","ELEMENT_NODE","TEXT_NODE","mapToStyleString","map.map","DOCUMENT_NODE","createTimeoutClass","clearFunction","timeoutId","Timeout","timeout","callback","BOLD","symbol.create","UNBOLD","BLUE","GREY","GREEN","RED","PURPLE","ORANGE","UNCOLOR","computeNoColorLoggingArgs","strBuilder","logArgs","arg","_browserStyleMap","common.BOLD","pair.create","common.UNBOLD","common.BLUE","common.GREEN","common.GREY","common.RED","common.PURPLE","common.ORANGE","common.UNCOLOR","computeBrowserLoggingArgs","styles","currentStyle","style","dom.mapToStyleString","computeLoggingArgs","env.supportsColor","common.computeNoColorLoggingArgs","print","vconsoles","vc","warn","createIterator","next","iteratorFilter","iterator","filter","iteratorMap","fmap","done","DeleteItem","clock","DeleteSet","iterateDeletedStructs","transaction","ds","deletes","clientid","structs","lastStruct","clockState","del","iterateStructs","findIndexDS","dis","midindex","mid","midclock","isDeleted","sortAndMergeDeleteSet","dels","j","mergeDeleteSets","dss","merged","dssI","delsLeft","client","array.appendTo","addToDeleteSet","createDeleteSet","createDeleteSetFromStructStore","ss","dsitems","struct","writeDeleteSet","encoding.writeVarUint","item","readDeleteSet","numClients","decoding.readVarUint","numberOfDeletes","dsField","readAndApplyDeleteSet","store","unappliedDS","getState","clockEnd","index","findIndexSS","splitItem","UpdateEncoderV2","generateNewClientId","random.uint32","Doc","guid","random.uuidv4","collectionid","gc","gcFilter","meta","autoLoad","shouldLoad","StructStore","promise.create","resolve","provideSyncedPromise","eventHandler","isSynced","transact","origin","TypeConstructor","AbstractType","type","t","Constr","YArray","YText","YMap","YXmlElement","YXmlFragment","subdoc","content","DSDecoderV1","UpdateDecoderV1","createID","decoding.readUint8","decoding.readVarString","decoding.readAny","buffer.copyUint8Array","decoding.readVarUint8Array","DSDecoderV2","UpdateDecoderV2","decoding.IntDiffOptRleDecoder","decoding.UintOptRleDecoder","decoding.RleDecoder","decoding.StringDecoder","ID","keyClock","DSEncoderV1","encoding.createEncoder","encoding.toUint8Array","UpdateEncoderV1","info","encoding.writeUint8","encoding.writeVarString","isYKey","encoding.writeVarUint8Array","embed","DSEncoderV2","encoding.IntDiffOptRleEncoder","encoding.UintOptRleEncoder","encoding.RleEncoder","encoding.StringEncoder","encoding.writeUint8Array","writeStructs","startNewStructs","firstStruct","writeClientsStructs","_sm","sm","getStateVector","_clock","readClientsStructRefs","clientRefs","numOfStateUpdates","numberOfStructs","refs","binary.BITS5","GC","Skip","cantCopyParentInfo","Item","binary.BIT6","readItemContent","integrateStructs","clientsStructRefs","stack","clientsStructRefsIds","getNextStructTarget","nextStructsTarget","curStructsTarget","restStructs","missingSV","updateMissingSv","mclock","stackHead","addStackToRestSS","inapplicableItems","offset","missing","structRefs","writeStructsFromTransaction","readUpdateV2","ydoc","transactionOrigin","structDecoder","retry","pending","mergeUpdatesV2","dsRest","pendingDSUpdate","decoding.createDecoder","dsRest2","update","applyUpdateV2","YDecoder","applyUpdate","writeStateAsUpdate","targetStateVector","encodeStateAsUpdateV2","encodedTargetStateVector","decodeStateVector","updates","diffUpdateV2","mergeUpdates","convertUpdateFormatV2ToV1","encodeStateAsUpdate","readStateVector","ssLength","decodedState","writeStateVector","sv","writeDocumentStateVector","encodeStateVectorV2","encodeStateVector","EventHandler","createEventHandler","addEventHandlerListener","removeEventHandlerListener","l","g","callEventHandlerListeners","arg0","arg1","f.callAll","compareIDs","findRootTypeKey","isParentOf","parent","child","RelativePosition","tname","assoc","createRelativePositionFromJSON","json","AbsolutePosition","createAbsolutePosition","createRelativePosition","typeid","createRelativePositionFromTypeIndex","getItemWithOffset","getItem","createAbsolutePositionFromRelativePosition","rpos","followUndoneDeletions","rightID","typeID","followRedone","ContentType","compareRelativePositions","Snapshot","createSnapshot","snapshot","isVisible","splitSnapshotAffectedStructs","getItemCleanStart","_item","addStruct","find","findIndexCleanStart","getItemCleanEnd","replaceStruct","newStruct","clockStart","Transaction$1","local","writeUpdateMessageFromTransaction","map.any","addChangedTypeToTransaction","parentSub","tryToMergeWithLefts","pos","tryGcDeleteSet","deleteItems","di","deleteItem","endDeleteItemClock","si","tryMergeDeleteSet","mostRightIndexToCheck","cleanupTransactions","transactionCleanups","mergeStructs","subs","itemtype","events","event","event1","event2","cleanupYTextAfterTransaction","beforeClock","firstChangePos","replacedStructPos","logging.print","logging.ORANGE","logging.BOLD","logging.UNBOLD","logging.RED","subdocsAdded","subdocsLoaded","subdocsRemoved","initialCall","result","Transaction","finishCleanup","StackItem","deletions","insertions","clearUndoManagerStackItem","tr","um","stackItem","keepItem","popStackItem","undoManager","eventType","_tr","scope","itemsToRedo","itemsToDelete","performedChange","redoItem","subProps","changedParentTypes","UndoManager","typeScope","captureTimeout","captureTransaction","deleteFilter","trackedOrigins","ignoreRemoteMapChanges","undoing","redoing","endClock","startClock","now","time.getUnixTime","didAdd","lastOp","changeEvent","ytypes","tmpSet","ytype","logging.warn","clearUndoStack","clearRedoStack","lazyStructReaderGenerator","LazyStructReader","filterSkips","LazyStructWriter","sliceStruct","leftItem","YEncoder","updateDecoders","lazyStructDecoders","currWrite","updateEncoder","lazyStructEncoder","dec","dec1","dec2","clockDiff","currDecoder","firstClient","curr","iterated","writeStructToLazyStructWriter","finishLazyStructWriting","lazyStructWriter","currClient","svClock","flushLazyStructWriter","lazyWriter","restEncoder","partStructs","convertUpdateFormat","blockTransformer","updateDecoder","lazyDecoder","f.id","errorComputeChanges","YEvent","target","getPathTo","action","oldValue","prev","array.last","changes","added","deleted","delta","packOp","warnPrematureAccess","maxSearchMarker","globalSearchMarkerTimestamp","ArraySearchMarker","refreshMarkerTimestamp","marker","overwriteMarker","markPosition","searchMarker","pm","findMarker","yarray","pindex","updateMarkerChanges","callTypeObservers","changedType","y","_encoder","_parentSubs","typeListSlice","start","cs","typeListToArray","typeListToArraySnapshot","typeListForEach","typeListMap","typeListCreateIterator","currentContent","currentContentIndex","typeListGet","typeListInsertGenericsAfter","referenceItem","ownClientId","jsonContent","packJsonContent","ContentAny","ContentBinary","ContentDoc","lengthExceeded","typeListInsertGenerics","startIndex","typeListPushGenerics","maxMarker","currMarker","typeListDelete","startLength","typeMapDelete","typeMapSet","typeMapGet","typeMapGetAll","typeMapHas","typeMapGetAllSnapshot","createMapIterator","iterator.iteratorFilter","entry","YArrayEvent","items","parentSubs","YArrayRefID","readYArray","_decoder","YMapEvent","ymap","entries","iterator.iteratorMap","_value","YMapRefID","readYMap","equalAttrs","object.equalFlat","ItemTextListPosition","currentAttributes","ContentFormat","updateCurrentAttributes","findNextPosition","count","findPosition","useSearchMarker","insertNegatedAttributes","currPos","negatedAttributes","nextFormat","format","minimizeAttributeChanges","attributes","insertAttributes","currentVal","insertText","text","_val","ContentString","ContentEmbed","formatText","iterationLoop","attr","newlines","cleanupFormattingGap","startAttributes","currAttributes","endFormats","cf","cleanups","reachedCurr","startAttrValue","cleanupContextlessFormattingGap","attrs","cleanupYTextFormatting","map.copy","needFullCleanup","afterClock","yText","deleteText","startAttrs","YTextEvent","ytext","sub","oldAttributes","insert","retain","deleteLen","addOp","op","object.isEmpty","object.assign","curVal","e","sanitize","ins","prevSnapshot","computeYChange","ops","packStr","addAttributes","computeDelta","cur","attributeName","attributeValue","YTextRefID","readYText","YXmlTreeWalker","root","nxt","first","query","element","YXmlEvent","xml","_document","hooks","binding","fragment","xmlType","ref","refItem","pc","YXmlFragmentRefID","readYXmlFragment","nodeName","object.forEach","stringBuilder","keysLen","attrsString","dom","yxml","YXmlElementRefID","readYXmlElement","YXmlHook","hookName","hook","YXmlHookRefID","readYXmlHook","YXmlText","nestedNodes","node","YXmlTextRefID","readYXmlText","AbstractStruct","encodingRef","structGCRefNumber","readContentBinary","ContentDeleted","readContentDeleted","createDocFromOpts","readContentDoc","readContentEmbed","_offset","_right","_transaction","readContentFormat","ContentJSON","readContentJSON","isDevMode","env.getVariable","object.deepFreeze","readContentAny","firstCharCode","readContentString","typeRefs","readContentType","nextID","keep","rightItem","isDeletedByUndoStack","array.some","redoitems","ownClientID","redone","parentItem","parentType","leftTrace","rightTrace","nextClock","nextId","redoneItem","rightOrigin","binary.BIT2","isMarked","binary.BIT4","binary.BIT1","doKeep","binary.BIT3","doDelete","conflictingItems","itemsBeforeOrigin","parentGCd","ykey","contentRefs","structSkipRefNumber","glo","importIdentifier","OrderedMap","found","newKey","self","place","without","findDiffStart","childA","childB","tA","tB","surrogateHigh","surrogateLow","inner","findDiffEnd","posA","posB","iA","iB","ch","Fragment","to","nodeStart","blockSeparator","leafText","nodeText","current","otherPos","retIndex","joined","nodes","compareDeep","Mark$1","Mark","placed","_","mark","marks","ReplaceError","Slice","openStart","openEnd","insertInto","removeRange","openIsolating","indexTo","offsetTo","dist","replace","$from","$to","slice","replaceOuter","depth","close","prepareSliceForReplace","replaceThreeWay","replaceTwoWay","checkJoin","main","joinable","$before","$after","addNode","addRange","$start","$end","endIndex","$along","extra","ResolvedPos","parentOffset","dOff","tmp","after","pred","NodeRange","rem","cache","resolveCache","elt","ResolveCache","resolveCacheSize","emptyAttrs","Node$1","Node","startPos","includeParents","wrapMarks","replacement","one","two","TextNode","base","ContentMatch","validEnd","nodeTypes","stream","TokenStream","expr","parseExpr","dfa","nfa","checkForDeadEnds","frag","toEnd","seen","search","types","finished","tp","computed","active","scan","out","tok","exprs","parseExprSeq","parseExprSubscript","parseExprAtom","parseExprRange","parseNum","resolveName","typeName","connect","compile","edge","term","edges","loop","cmp","nullFrom","labeled","explore","states","work","dead","defaultAttrs","defaults","attrName","computeAttrs","built","given","checkAttrs","initAttrs","Attribute","NodeType$1","NodeType","spec","group","before","matched","markType","topType","validateType","MarkType","rank","instanceSpec","contentExprCache","contentExpr","markExpr","gatherMarks","excl","ok","isTagRule","rule","isStyleRule","DOMParser$1","DOMParser","rules","matchedStyles","context","ParseContext","matches","priority","blockTags","ignoreTags","listTags","OPT_PRESERVE_WS","OPT_PRESERVE_WS_FULL","OPT_OPEN_LEFT","wsOptionsFor","preserveWhitespace","NodeContext","solid","fill","wrap","parser","isOpen","topNode","topContext","topOptions","top","preserveWS","lines","nodeBefore","domNodeBefore","matchAfter","outerWS","ruleID","normalizeList","sync","oldNeedsBlock","innerMarks","continueAfter","nodeType","startIn","contentDOM","cautious","route","penalty","cx","block","nodeMarks","markMayApply","applyMarks","textNode","parts","option","useRoot","minDepth","part","$context","deflt","prevItem","selector","DOMSerializer","rendered","add","markDOM","renderSpec","inline","toDOM","structure","xmlNS","blockArraysIn","gatherToDOM","suspiciousAttributeCache","suspiciousAttributes","suspiciousAttributesInner","tagName","suspicious","space","innerContent","lower16","factor16","makeRecover","recoverIndex","recoverOffset","DEL_BEFORE","DEL_AFTER","DEL_ACROSS","DEL_SIDE","MapResult","delInfo","recover","StepMap","ranges","inverted","simple","oldIndex","newIndex","oldSize","newSize","side","oldStart","newStart","Mapping","maps","mirror","mirrors","mapping","startSize","mirr","totalSize","inverse","corr","stepsByID","Step","stepClass","StepResult","failed","mapFragment","mapped","AddMarkStep","oldSlice","RemoveMarkStep","AddNodeMarkStep","updated","newSet","RemoveNodeMarkStep","ReplaceStep","contentBetween","ReplaceAroundStep","gapFrom","gapTo","gap","inserted","addMark","removed","removing","adding","removeMark","step","toRemove","clearIncompatible","clearNewlines","replSteps","allowed","newline","canCut","liftTarget","range","contentBefore","contentAfter","lift","gapStart","gapEnd","splitting","findWrapping","innerRange","around","findWrappingOutside","findWrappingInside","withAttrs","outer","inside","innerMatch","wrappers","setBlockType","mapFrom","attrsHere","canChangeType","convertNewlines","pre","supportLinebreak","replaceLinebreaks","startM","endM","replaceNewlines","$pos","setNodeMarkup","newNode","canSplit","typesAfter","innerType","rest","overrideChild","baseType","split","typeAfter","canJoin","canAppendWithSubstitutedLinebreaks","linebreakReplacement","joinPoint","dir","join","beforeType","$full","insertPoint","dropPoint","pass","bias","insertPos","fits","wrapping","replaceStep","fitsTrivially","Fitter","unplaced","fit","moveInline","placedSize","startDepth","sliceDepth","contentAt","frontierDepth","inject","openAtEnd","dropFromFragment","taken","openEndCount","closeNodeStart","addToFragment","level","contentAfterFits","dropInner","open","invalidMarks","definesContent","replaceRange","targetDepths","coveredDepths","preferredTarget","preferredTargetIndex","leftNodes","preferredDepth","leftNode","openDepth","targetDepth","expand","closeFragment","startSteps","oldOpen","newOpen","replaceRangeWith","point","deleteRange","shared","isolated","covered","AttrStep","DocAttrStep","TransformError","Transform","fromB","toB","steps","classesById","Selection","$anchor","$head","SelectionRange","lastNode","lastParent","selectionToInsertionEnd","textOnly","TextSelection","findSelectionIn","AllSelection","cls","selectionClass","warnedAboutTextSelection","checkTextSelection","TextBookmark","anchor","head","dPos","NodeSelection","NodeBookmark","sel","AllBookmark","startLen","_from","_to","_newFrom","newTo","UPDATED_SEL","UPDATED_MARKS","UPDATED_SCROLL","selection","time","inheritMarks","bind","FieldDesc","desc","baseFields","config","instance","_marks","_old","Configuration","plugins","plugin","EditorState","ignore","rootTr","trs","newState","haveNew","oldState","newInstance","fields","field","$config","pluginFields","bindProps","Plugin","createKey","PluginKey","domIndex","parentNode","reusedRange","textRange","clearReusedRange","isEquivalentPosition","off","targetNode","targetOff","scanFor","atomElements","_a","nodeSize","hasBlockDesc","textNodeBefore$1","textNodeAfter$1","isOnEdge","atStart","atEnd","selectionCollapsed","domSel","keyEvent","keyCode","deepActiveElement","caretFromPoint","x","nav","agent","ie_edge","ie_upto10","ie_11up","ie","ie_version","gecko","_chrome","chrome","chrome_version","safari","ios","mac","windows","android","webkit","webkit_version","windowRect","vp","getSide","clientRect","rect","scaleX","scaleY","scrollRectIntoView","startDOM","nonZero","scrollThreshold","scrollMargin","atTop","bounding","moveX","moveY","startX","startY","dX","dY","storeScrollPos","refDOM","refTop","localRect","scrollStack","resetScrollPos","newRefTop","restoreScrollStack","dTop","preventScrollSupported","focusPreventScroll","stored","findOffsetInNode","coords","closest","dxClosest","coordsClosest","rowBot","rowTop","firstBelow","coordsBelow","childIndex","rects","dx","findOffsetInText","singleRect","inRect","targetKludge","posFromElement","posFromCaret","outsideBlock","sawBlock","elementFromPoint","box","startI","posAtCoords","caret","BIDI","coordsAtPos","atom","supportEmptyRange","rectBefore","rectAfter","flattenV","takeSide","flattenH","withFlushedState","viewState","endOfTextblockVertical","nearest","boxes","maybeRTL","endOfTextblockHorizontal","oldNode","oldOff","anchorNode","anchorOffset","oldBidiLevel","parentDOM","newOff","cachedState","cachedDir","cachedResult","endOfTextblock","NOT_DIRTY","CHILD_DIRTY","CONTENT_DIRTY","NODE_DIRTY","ViewDesc","children","widget","outerDeco","innerDeco","addedNodes","domBefore","domAfter","onlyNodes","nodeDOM","TrailingHackViewDesc","WidgetViewDesc","enter","fromOffset","toOffset","childBase","force","anchorDOM","headDOM","selRange","brKludge","domSelExtended","mutation","startInside","endInside","dirty","stop","CompositionViewDesc","textDOM","mut","MarkViewDesc","custom","replaceNodes","NodeViewDesc","descObj","applyOuterDeco","CustomNodeViewDesc","TextViewDesc","sameOuterDeco","composition","localComposition","compositionInChild","updater","ViewTreeUpdater","iterDeco","insideNode","compIndex","renderDescs","iosHacks","textPos","findTextInFragment","needsWrap","oldDOM","patchOuterDeco","computeOuterDeco","docViewDesc","docView","skip","_view","descs","childDOM","rm","OuterDecoLevel","noDeco","outerDOM","prevComputed","curComputed","curDOM","deco","patchAttributes","prevList","curList","lock","preMatch","parentIndex","maxKeep","scanTo","markDesc","targetDesc","domNode","nextDOM","locked","wrapper","lastChild","hack","parentDesc","curDesc","descI","fI","compareSide","onWidget","onNode","locals","decoIndex","restNode","widgets","cutAt","oldCSS","childStart","selectionFromDOM","nearestDesc","inWidget","nearestDescNode","selectionBetween","editorOwnsSelection","hasSelection","selectionToDOM","syncNodeSelection","mouseDown","curSel","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","temporarilyEditableNear","resetEditable","removeClassOnSelectionChange","setEditable","img","clearNodeSelection","hasFocusAndSelection","anchorInRightPlace","moveSelectionBlock","$side","apply","selectHorizontally","mods","$newHead","nodePos","nodeLen","isIgnorable","skipIgnoredNodes","skipIgnoredNodesBefore","skipIgnoredNodesAfter","moveNode","moveOffset","isBlockNode","setSelFocus","textNodeAfter","textNodeBefore","findDirection","selectVertically","beyond","stopNativeHorizontalDelete","empty","nextNode","switchEditable","safariDownArrowBug","focusNode","focusOffset","getMods","captureKeyDown","code","serializeForClipboard","serializer","detachedDoc","firstChild","wrapMap","parseFromClipboard","html","plainText","inCode","asText","parsed","readHTML","restoreReplacedSpaces","contextNode","sliceData","inlineParents","addContext","closeSlice","normalizeSiblings","lastWrap","inLast","addToSibling","closeRight","wrapped","withWrappers","sibling","closeRange","_policy","maybeWrapTrusted","trustedTypes","metas","firstTag","handlers","editHandlers","passiveHandlers","InputState","initInput","eventBelongsToView","runCustomHandler","ensureListeners","setSelectionOrigin","destroyInput","currentHandlers","dispatchEvent","_event","inOrNearComposition","eventCoords","isNear","click","dy","runHandlerOnContext","propName","updateSelection","selectClickedLeaf","selectClickedNode","selectedNode","selectAt","handleSingleClick","selectNode","handleDoubleClick","handleTripleClick","defaultTripleClick","selectionForTripleClick","TripleClickDrag","selectNodes","forceDOMFlush","endComposition","selectNodeModifier","flushed","LeftMouseDown","MouseDown","targetPos","startSelection","timeoutComposition","selectionBeforeUneditable","scheduleComposeEnd","delay","clearComposition","findCompositionNode","textBefore","textAfter","descAfter","lastChanged","descBefore","restarting","captureCopy","brokenClipboardAPI","cut","sliceSingleNode","capturePaste","plain","doPaste","preferPlain","singleNode","getText","clipboardData","uris","Dragging","move","dragCopyModifier","dragMoves","test","draggedSlice","dragging","handleDrop","eventPos","$mouse","beforeInsert","domChangeCount","$cursor","compareObjs","WidgetType","noSpec","span","oldOffset","Decoration","InlineType","none","DecorationSet","decorations","buildTree","predicate","childOff","newLocal","mapChildren","byPos","childNode","childOffset","baseOffset","takeSpansForNode","moveSpans","withoutNulls","localSet","DecorationGroup","removeOverlap","members","mappedDecos","member","sorted","oldChildren","moved","oldEnd","newEnd","dSize","mustRebuild","fromLocal","toLocal","mapAndGatherRemainingDecorations","spans","gather","hasNulls","localStart","subtree","working","insertAhead","viewDecorations","observeOptions","useCharData","SelectionState","DOMObserver","handleDOMChange","mutations","take","ancestors","container","newSel","typeOver","brs","br","blockParent","readSel","checkCSS","fixUpBadSafariComposition","previousSibling","nextSibling","cssChecked","cssCheckWarned","rangeToSelectionRange","currentAnchor","safariShadowSelectionRange","read","nextCell","parseBetween","from_","to_","startDoc","ruleFromNode","isInline","readDOMChange","compositionID","parse","compare","preferredPos","preferredSide","change","findDiff","resolveSelection","$fromA","inlineChange","looksLikeBackspace","chFrom","chTo","mkTr","markChange","isMarkChange","parsedSel","curMarks","prevMarks","old","$newStart","$newEnd","skipClosingAndOpening","$next","fromEnd","mayOpen","lenA","lenB","endA","endB","adjust","EditorView","props","checkStateComponent","getEditable","updateCursorWrapper","buildNodeViews","computeDocDeco","prevProps","redraw","updateSel","pluginsChanged","nodeViews","changedNodeViews","scroll","updateDoc","oldScrollPos","forceSelUpdate","selectionContextChanged","chromeKludge","prevState","pluginView","movedPos","cached","dispatchTransaction","sel1","sel2","nA","nB","outdatedTimeout","Awareness","remove","removeAwarenessStates","clientID","currLocalMeta","filteredUpdated","f.equalityDeep","awareness","clients","curMeta","encodeAwarenessUpdate","applyAwarenessUpdate","timestamp","clientMeta","currClock","createMutex","token","highSurrogateRegex","lowSurrogateRegex","simpleDiffString","simpleDiff","rotr","w","shift","sum0to256","sum1to256","sigma0to256","sigma1to256","K","HINIT","Hasher","H","W","tt","T1","T2","isPaddedWith1","ci","binary.BIT30","digest","ySyncPluginKey","yUndoPluginKey","yCursorPluginKey","_convolute","hashOfJSON","buf.toBase64","sha256.digest","buf.encodeAny","Y.isDeleted","defaultColors","getUserColor","colorMapping","colors","user","usedColors","color","random.oneOf","ySyncPlugin","yXmlFragment","permanentUserData","onFirstRender","initialContentChanged","ProsemirrorBinding","syncState","_initargs","_state","pluginState","eventloop.timeout","yUndoPluginState","recoverSelectionEndpoint","newDoc","oldDoc","oldAbs","resolved","isMisresolvedAfterStructuralChange","recovered","findAbsolutePositionAfterStructuralChange","restoreRelativeSelection","relSel","relativePositionToAbsolutePosition","createSafeNodeSelection","createSafeNodeRangeSelection","clampedAnchor","clampedHead","getRelativeSelection","pmbinding","absolutePositionToRelativePosition","environment.isBrowser","documentElement","dom.doc","Y.createSnapshot","Y.createDeleteSet","fragmentContent","createNodeFromYElement","PModel.Slice","PModel.Fragment","historyDoc","historyType","Y.snapshot","Y.Doc","Y.applyUpdateV2","rootKey","historyStructs","itemIndex","Y.findIndexSS","pud","Y.iterateDeletedStructs","Y.typeListToArraySnapshot","Y.Snapshot","delType","Y.Item","createNodeIfNotExists","Y.UndoManager","updateYFragment","prosemirrorView","Y.XmlElement","createChildren","nextytext","Y.Text","ns","createTextNodesFromYText","textchild","_meta","deltas","attributesToMarks","createTypeFromTextNodes","Y.XmlText","marksToAttributes","createTypeFromElementNode","normalizePNodeContent","createTypeFromTextOrElementNode","pattrs","yattrs","eq","pnode","textNodes","tnode","equalYTextPText","ptexts","object.keys","object.every","yattrname","markname","yattr2markname","pmarks","equalYTypePNode","matchNodeName","normalizedContent","ychild","mappedIdentity","pcontent","findMappedChildAnchors","yChildren","pChildren","pChildIndices","pChild","candidates","yChild","yIndex","pIndex","predecessors","tails","low","high","middle","anchors","deleteYChildren","yDomFragment","insertPChildren","updateMatchingYChild","updateYText","reconcileUnanchoredChildren","yStart","yEnd","pStart","pEnd","matchingChildren","reconcileMappedChildren","computeChildEqualityFactor","pChildCnt","yChildCnt","minCnt","foundMappedChild","leftY","leftP","rightY","rightP","ytextTrans","nAttrs","Y.ContentString","Y.ContentFormat","hashedMarkNameRegex","markName","isOverlapping","pNode","yDomAttrs","pAttrs","updateLeft","updateRight","equalityLeft","equalityRight","yDelLen","yElement","viewsToUpdate","MetaEntry","MetaEntriesQueue","ups","updateMetas","metaEntries","isRetry","isFirst","metaEntry","setMeta","Y.createRelativePositionFromTypeIndex","pNodeSize","Y.RelativePosition","Y.findRootTypeKey","isMisresolvedTextPosition","relPos","absPos","decoded","Y.createAbsolutePositionFromRelativePosition","Y.createID","documentType","decodedPos","Y.isParentOf","contentType","attrsEqual","aKeys","hasDistinctiveAttrs","specAttrs","remapIntoBlock","$oldPos","newBlockStart","newBlock","idx","targetIdx","targetChild","remapped","contentStart","contentEnd","findByPredicate","requireUnique","occurrence","matchCount","matchStart","matchBlock","newPos","sameTypeAndAttrs","oldText","byAll","byText","byAttrs","isStructuralTransaction","hasBlock","resolvedAbs","$old","$new","bothAtStart","prosemirrorToYXmlFragment","xmlFragment","Y.XmlFragment","prosemirrorJSONToYXmlFragment","defaultAwarenessStateFilter","currentClientId","userClientId","_user","defaultCursorBuilder","cursor","userDiv","nonbreakingSpace1","nonbreakingSpace2","defaultSelectionBuilder","rxValidColor","createDecorations","awarenessFilter","createCursor","createSelection","ystate","aw","clientId","Y.createRelativePositionFromJSON","maxsize","yCursorPlugin","awarenessStateFilter","cursorBuilder","selectionBuilder","getSelection","cursorStateField","yCursorState","isRemoteChange","awarenessListener","updateCursorInfo","editorView","Y.compareRelativePositions","onFocusChange","forceAwarenessUpdate","undo","redo","defaultProtectedNodes","defaultDeleteFilter","protectedNodes","Text","XmlElement","yUndoPlugin","initargs","_undoManager","destroyListenersBefore","destroyListenersAfter","listener","hasUndoOps","hasRedoOps","leakedDestroyListeners","FALLBACK","readConfig","readCookie","prefix","cookie","ApiError","status","body","document","apiRequest","method","url","csrfHeader","headers","response","error","conflict","DocumentsApi","input","GuestDocumentApi","endpoint","_id","PreferencesApi","tag","icon","markup","svg","clear","ICONS","ANON_KEY","BACKUP_PREFIX","CONFLICT_PREFIX","COLLAB_PENDING_PREFIX","MAX_PENDING_BYTES","BANNER_DISMISSED_KEY","THEME_KEY","VIM_MODE_KEY","readStore","readJson","storage","raw","writeJson","isStoredDocument","loadAnonDocument","saveAnonDocument","clearAnonDocument","saveBackup","loadBackup","clearBackup","saveConflictCopy","savePendingUpdates","session","serialized","loadPendingUpdates","clearPendingUpdates","SHARE_INTENT_KEY","markPostAuthShareIntent","consumePostAuthShareIntent","marked","SHARE_REOPEN_KEY","markShareReopen","note","consumeShareReopen","isBannerDismissed","dismissBanner","readThemePreference","writeThemePreference","readVimPreference","writeVimPreference","clearVimPreference","nowTimestamp","createAnonBanner","urls","dismiss","banner","dismissed","visible","WORD_CHARACTER","ENTITY_REFERENCE","TAG_START","isIntraword","escapeInlineMarkdown","character","escapeLeadingBlockTokens","line","indent","escaped","escapeParagraphLines","markdown","escapeTableCell","CODE_SPAN_OPEN","CODE_SPAN_CLOSE","CODE_SPAN_MARKERS","CODE_SPAN","ADJACENT_SPANS","stripCodeSpanMarkers","repairCodeSpans","_match","renderCodeSpan","longestRun","longest","run","fence","startsAwkward","endsAwkward","padding","MarkdownParseError","hardenedManagers","hardenManager","codeTypes","rawText","manager","editor","isEmptyDoc","trimTrailingNewlines","parseMarkdown","companionMarkSignature","isCodeText","splitCodeRunsAtMarkBoundaries","segment","transform","signatures","serializeDocument","serializeMarkdown","serializeSelection","only","STRONG_SIGNALS","TABLE_ROW","TABLE_DELIMITER","WEAK_SIGNALS","detectMarkdown","hasTable","weak","writeClipboardText","legacyCopy","writeClipboardTextFromPromise","blob","textarea","previous","copied","copyWholeDocument","DEBOUNCE_MS","RETRY_BASE_MS","RETRY_MAX_MS","BEHIND_LIMIT","BEHIND_BACKOFF_MS","REMOTE_DEBOUNCE_MS","sameContent","createAutosave","documentId","revision","debounceTimer","retryTimer","retryDelay","inFlight","running","lastSaved","csrfRetried","stopped","paused","behindStreak","pendingKeepalive","setStatus","sendTitle","backupKey","clearTimers","schedule","fire","save","scheduleRemote","flush","createIfMissing","retryLater","pause","runSave","keepalive","again","request","adoptResult","created","saved","handleFailure","handleConflict","server","CHUNK","binary","fromBase64","SEED_ORIGIN","hashToUint32","hash","byte","seedContent","buildSeed","Y.encodeStateAsUpdate","Y.decodeStateVector","Y.encodeStateVector","sha256Hex","hashSeed","seed","stateContainsSeed","Y.applyUpdate","PROVIDER_ORIGIN","BOOTSTRAP_ORIGIN","PUSH_DELAY","AWARENESS_THROTTLE","POLL_PEERS","POLL_ALONE","POLL_HIDDEN","BACKOFF_BASE","BACKOFF_MAX","JOIN_ATTEMPTS","KEEPALIVE_BUDGET","createProvider","timers","handle","transport","listeners","seq","hidden","timer","backoff","joinFailures","outbox","pendingAwareness","awarenessTimer","pendingWrite","sentWrite","peers","identity","emit","payload","onDocUpdate","onAwarenessUpdate","ids","applyRemote","applyAwareness","cadence","tick","takeOutbox","Y.mergeUpdates","requeue","bootstrap","encodeLocalAwareness","reset","seedMatches","stranded","gone","giveUp","nextBackoff","presence","settleWrite","requeueWrite","rejectWrite","waiter","reason","leave","send","reject","createLiveDocument","initials","trimmed","safeColor","usersOf","users","createPresence","render","chip","CONFLICT_TEXT","DISCONNECT_HINT","CONFLICT_CHOICES","RESTORE_CHOICES","createConflictNotice","actions","latest","mine","hint","face","REPLACE_PROMPT","resolveImportDocument","imported","incoming","adoptAsAnonymousDraft","prompt","existing","CHOICE","installAppearanceMenu","theme","rows","row","preference","__defProp","__exportAll","all","no_symbols","deleteSelection","dispatch","atBlockStart","joinBackward","$cut","findCutBefore","deleteBarrier","textblockAt","delStep","joinTextblockBackward","joinTextblocksAround","joinTextblockForward","atBlockEnd","findCutAfter","beforeText","beforePos","afterText","afterPos","selectNodeBackward","joinForward","selectNodeForward","joinUp","nodeSel","joinDown","newlineInCode","defaultBlockAt","exitCode","above","createParagraphNear","liftEmptyBlock","splitBlockAs","splitNode","splitDepth","splitPos","can","$first","splitBlock","selectParentNode","same","joinMaybeClear","conn","canDelAfter","$joinAt","selAfter","at","afterDepth","selectTextblockSide","selectTextblockStart","selectTextblockEnd","wrapIn","applicable","chainCommands","commands","wrapInList","listType","wrapRangeInList","doJoin","outerRange","$insert","doWrapInList","joinBefore","liftListItem","itemType","liftToOuterList","liftOutOfList","endOfList","list","indexBefore","sinkListItem","nestedBefore","keyName","ignoreKey","normalizeKeyName","alt","ctrl","mod","normalize","modifiers","keymap","bindings","keydownHandler","baseName","direct","noShift","fromCode","createChainableState","storedMarks","CommandManager","rawCommands","command","startTr","shouldDispatch","callbacks","hasStartTransaction","chain","_target","property","blur","_window","clearContent","emitUpdate","clearNodes","$mappedFrom","$mappedTo","nodeRange","targetLiftDepth","defaultType","fn","createParagraphNear$1","originRange","contentSlice","deleteCurrentNode","currentNode","getNodeType","nameOrType","deleteNode","typeOrName","hasTextContent","nodeSpec","expandSelectionForSide","parentContent","expandSelectionForInlineText","exitCode$1","isRegExp","objectIncludes","object1","object2","findMarkInSet","isMarkInSet","getMarkRange","firstMark","endPos","getMarkType","extendMarkRange","newSelection","isTextSelection","minMax","resolveFocusPosition","position","selectionAtStart","selectionAtEnd","minPos","maxPos","isAndroid","isiOS","isSafari","focus","delayedFocus","isSameSelection","insertContent","removeWhitespaces","elementFromString","wrappedValue","isProseMirrorContent","createNodeFromContent","isJSONContent","isTextContent","Fragment$1","hasInvalidContent","invalidContent","contentCheckSchema","isFragment","nodeOrFragment","insertContentAt","emitContentError","parseOptions","_options$errorOnInval","isOnlyTextContent","isOnlyBlockContent","newContent","_node$text","$fromNode","fromSelectionAtStart","insertDefaultBlock","validAttrKeys","filteredAttrs","joinUp$1","joinDown$1","joinBackward$1","joinForward$1","joinItemBackward","joinItemForward","joinTextblockBackward$1","joinTextblockForward$1","isMacOS","keyboardShortcut","capturedTransaction","newStep","isNodeActive","nodeRanges","relativeFrom","relativeTo","selectionRange","matchedNodeRanges","sum","lift$1","liftEmptyBlock$1","liftListItem$1","newlineInCode$1","getSchemaTypeNameByName","deleteProps","propOrProps","newObj","resetAttributes","schemaType","canReset","scrollIntoView","selectAll","selectNodeBackward$1","selectNodeForward$1","selectParentNode$1","selectTextblockEnd$1","selectTextblockStart$1","createDocument","setContent","errorOnInvalidContent","getMarkAttributes","markItem","combineTransactionSteps","transactions","findChildrenInRange","nodesWithPos","findParentNodeClosestToPos","findParentNode","getExtensionField","extension","flattenExtensions","extensions","addExtensions","getHTMLFromFragment","documentFragment","isFunction","callOrReturn","isEmptyObject","splitExtensions","getAttributesFromExtensions","extensionAttributes","nodeExtensions","markExtensions","nodeAndMarkExtensions","defaultAttribute","nodeExtensionTypes","ext","markExtensionTypes","allExtensionTypes","addGlobalAttributes","globalAttribute","resolvedTypes","attribute","mergedAttr","splitStyleDeclarations","inSingleQuote","inDoubleQuote","parenDepth","char","parseStyleEntries","pairs","declarations","numDeclarations","declaration","firstColonIndex","mergeAttributes","objects","mergedAttributes","valueClasses","existingClasses","insertClasses","valueClass","styleMap","getRenderedAttributes","nodeOrMark","fromString","injectExtensionAttributesToParseRule","parseRule","newAttributes","cleanUpSchemaItem","buildAttributeSpec","extensionAttribute","_extensionAttribute$a","_extensionAttribute$a2","getSchemaByResolvedExtensions","_nodeExtensions$find","allAttributes","extendNodeSchema","parseHTML","renderHTML","renderText","extendMarkSchema","findDuplicates","filtered","sortExtensions","priorityA","priorityB","resolveExtensions","resolvedExtensions","duplicatedNames","getSchema","generateJSON","getTextBetween","startNode","textSerializers","textSerializer","getTextSerializersFromSchema","getNodeAttributes","nodeItem","getAttributes","removeDuplicates","by","simplifyChangedRanges","uniqueChanges","otherChange","getChangedRanges","stepMap","getMarksBetween","getNodeAtPosition","maxDepth","currentDepth","getPreviousBlockSibling","parentDepth","getSchemaTypeByName","getSplittedAttributes","getTextContentFromNodes","maxMatch","sliceEndPos","_node$type$spec$toTex","_node$type$spec","chunk","isMarkActive","markRanges","matchedRange","markRange","excludedRange","isActive","isAtEndOfNode","$parentPos","isAtStartOfNode","isExtensionRulesEnabled","enabled","enabledExtension","isList","isNodeEmpty","checkChildren","ignoreWhitespace","isContentEmpty","isNodeSelection","MappablePosition","getUpdatedPosition","mapResult","createMappablePosition","canSetMark","newMarkType","_state$storedMarks","currentMarks","someNodeSupportsMark","_pos","parentAllowsMarkType","currentMarksAllowMarkType","otherMark","setMark","trimmedFrom","trimmedTo","setNode","attributesToCopy","updatedState","setNodeSelection","setTextDirection","direction","setTextSelection","resolvedFrom","resolvedEnd","sinkListItem$1","ensureMarks","splittableMarks","filteredMarks","keepMarks","splitListItem","overrideAttrs","grandParent","_type$contentMatch$de","depthBefore","depthAfter","newNextTypeAttributes","nextType","newTypeAttributes","normalizeListType","areListTypesCompatible","typeA","typeB","joinListBackwards","joinListForwards","nodeAfter","createInnerSelectionForWholeDocList","toggleList","listTypeOrName","itemTypeOrName","parentList","isAllSelection","topLevelNodes","soleTopLevelNode","allSelectionList","currentList","isInsideExistingList","hasWholeDocSelectedList","trx","disp","nextSelection","canWrapInList","toggleMark","extendEmptyMarkRange","toggleNode","toggleTypeOrName","toggleType","toggleWrap","undoInputRule","undoable","toUndo","unsetAllMarks","ignoreClearable","nonClearableMarks","clearableMarkTypes","unsetMark","_$from$marks$find","unsetTextDirection","newAttrs","updateAttributes","canUpdate","lastPos","trimmedFrom2","trimmedTo2","DECORATION_MANAGER_PLUGIN_KEY","updateDecorations","extensionName","wrapIn$1","wrapInList$1","commands_exports","depthByEditor","runInDecorationApplyScope","_depthByEditor$get","_depthByEditor$get2","remaining","EventEmitter","onceFn","isWidgetDecoration","decoration","decorationsToPMDecorations","pmDecorations","widgetKeys","buildDecorationSet","rangeOwnsPosition","docSize","filterOutOfRangeDecorations","warnedExtensions","widgetKeyOf","_decoration$spec","isAttrStep","hasResolvableChangedRange","hasMappedRange","positionalStep","blockRangeFor","changed","nodeEnd","getRebuildRanges","newRanges","newRange","blockRange","mapDecorationSet","removedSpec","mapDecorations","_previous$decorationS","_previous$widgetKeysB","previousSet","mergeDecorationSets","decorationSetsByExtension","allDecorations","unionWidgetKeys","widgetKeysByExtension","validateDecorationSpec","_update","shouldRecomputeDecoration","forced","EMPTY_KEYS","DecorationManager","nextState","_DECORATION_MANAGER_P","_DECORATION_MANAGER_P2","addDecorations","_config","managerState","forceAll","forceName","recomputedNames","_DECORATION_MANAGER_P3","_DECORATION_MANAGER_P4","resolution","stale","addedKeys","names","keysA","keysB","canInsertNode","createStyleTag","nonce","suffix","tiptapStyleTag","styleNode","decodeHtmlEntities","encodeHtmlEntities","isNumber","getType","isPlainObject","parseIndentedBlocks","lexer","totalRaw","baseIndentSize","currentLine","itemMatch","itemData","indentLevel","mainContent","itemContent","_nextLine$match","nextLine","_nextNonEmpty$match","nextNonEmptyIndex","nestedTokens","nestedContent","dedentedNested","nestedLine","renderNestedMarkdownContent","prefixOrGenerator","ctx","output","_h$renderChild","_h$renderChild2","childContent","indentedChild","markTypeName","marksEqual","consumed","markA","nameA","markB","mergeDeep","updateMarkViewAttributes","checkMark","thisMark","foundMark","needsUpdate","updatedMark","InputRule","_config$undoable","inputRuleMatcherHandler","inputRuleMatch","run$1","_ref","matchedDocLength","matchStartOffset","inputRulesPlugin","simulatedInputMeta","Extendable","extendedConfig","_args","resolvedConfig","currentPos","PasteRule","pasteRuleMatcherHandler","pasteRuleMatch","pasteEvent","dropEvent","_node$type","_node$content$size","_node$content","contentSize","resolvedTo","textToMatch","tiptapDragFromOtherEditor","createClipboardPasteEvent","_event$clipboardData","pasteRulesPlugin","dragSourceElement","isPastedFromProseMirror","isDroppedFromProseMirror","processEvent","pasteEvt","chainableState","handleDragstart","_view$dom$parentEleme","handleDragend","dragFromOtherEditor","_clipboardData","isPaste","isDrop","simulatedPasteMeta","isSimulatedPaste","ExtensionManager","addCommands","allPlugins","addKeyboardShortcuts","defaultBindings","shortcut","keyMapPlugin","addInputRules","inputResult","inputPlugins","addPasteRules","pasteRules","addProseMirrorPlugins","proseMirrorPlugins","decorationPlugin","_this$decorationManag","addNodeView","nodeViewResult","nodeview","getPos","innerDecorations","HTMLAttributes","baseDispatch","baseTransform","extensionTransform","transformedHtml","addMarkView","markView","_this$decorationManag2","_callOrReturn","_callOrReturn2","onBeforeCreate","onCreate","onUpdate","onSelectionUpdate","onTransaction","onFocus","onBlur","onDestroy","Extension","ClipboardTextSerializer","Commands","Delete","appendedTransactions","_this$editor$options$4","_this$editor$options$5","_this$editor$options$","_this$editor$options$2","_this$editor$options$3","nextTransaction","isFullyWithinRange","_nextTransaction$doc$","_nextTransaction$doc$2","foundBeforeMark","foundAfterMark","Drop","Editable","focusEventsPluginKey","FocusEvents","Keymap","handleBackspace","parentIsIsolating","parentPos","isAtStart","handleDelete","baseKeymap","pcKeymap","macKeymap","docChanges","ignoreTr","allFrom","allEnd","Paste","Tabindex","_this$options$value","TextDirection","hasChecked","warnOnDuplicatedProseMirrorModel","NodePos","isBlock","_this$actualDepth","isNonTextAtom","childNodePos","nodeAttributes","attrKeys","firstItemOnly","childPos","Editor","initialDoc","editable","handlePlugins","nameOrPluginKeyToRemove","prevPlugins","nameOrPluginKey","_this$options$coreExt","_this$options$coreExt2","allExtensions","fallbackDoc","editorProps","enableExtensionDispatchTransaction","baseTransformPastedHTML","transformPastedHTML","_this$capturedTransac","selectionHasChanged","rootTrWasApplied","mostRecentFocusTr","nameOrAttributes","attributesOrUndefined","_this$editorView$isDe","_this$editorView","_this$$doc","_this$$doc2","markInputRule","captureGroup","fullMatch","startSpaces","textStart","textEnd","markEnd","nodeInputRule","lastChar","insertionStart","textblockTypeInputRule","wrappingInputRule","markPasteRule","isChangeOrigin","getYAbsolutePosition","relativePos","getYRelativePosition","absolutePos","CollaborationMappablePosition","yRelativePosition","getUpdatedPosition$1","absolutePosition","Collaboration","yUndoPluginInstance","originalUndoPluginView","viewRet","hasUndoManSelf","ySyncPluginOptions","_fragment$doc","src_default","awarenessStatesToArray","defaultOnUpdate","CollaborationCaret","label","provider","ListItemName$1","TextStyleName$1","bulletListInputRegex","BulletList","helpers","inputRule","getBranchingNestedListAtCursor","itemName","wrapperNames","listItemDepth","listItem","indexInListItem","nextChild","hasBranching","hoistBranchingNestedList","nestedList","nestedListPos","mappedInsertPos","handleDeleteBranchingNestedList","createBranchingListDeleteKeymap","ROMAN_NUMERALS","ALPHA_NUMERALS","ORDERED_LIST_MARKER_PATTERN","toRoman","numeral","toRomanUpper","fromRoman","roman","lower","isValidRoman","fromAlpha","second","toRomanAlpha","detectMarkerType","markerToStart","startToMarker","areOrderedListMarkersSequential","markers","_detectMarkerType","firstType","firstStart","parseListMarker","buildOrderedListAttrsFromMarker","getListMarker","isSameLineOrderedListToken","_token$tokens","_token$tokens2","nestedToken","parseSameLineOrderedListText","ListItem","_helpers$parseBlockCh","parseBlockChildren","firstToken","additionalContent","_context$meta","_context$meta2","findListItemPos","getNextListDepth","listItemPos","hasListBefore","editorState","parentListTypes","previousNodePos","previousNode","$listPos","listDescendants","lastItem","$lastItemPos","itemDepth","nextListIsDeeper","listDepth","nextListIsHigher","handleTab","blockStart","blockEnd","insideLastItemEnd","ListKeymap","handled","ORDERED_LIST_ITEM_REGEX","INDENTED_LINE_REGEX","PARAGRAPH_INTERRUPTERS","isOrderedListMarkerLine","isBlockContentLine","trimmedLine","interruptsLazyContinuation","splitItemContent","contentLines","paragraphLines","blockLines","reachedBlockBoundary","collectOrderedListItems","listItems","currentLineIndex","_separator","number","markerType","itemNumber","itemContentLines","nextLineIndex","itemLines","sawBlankLine","leadingWhitespace","contentIndent","PLAIN_TEXT_ORDERED_LIST_LINE_REGEX","parsePlainTextOrderedListPaste","parsedItems","buildNestedStructure","baseIndent","currentIndex","mainText","tokens","blockTokens","lookAheadIndex","nestedItems","nestedListItems","nestedItem","parseListItems","itemToken","inlineContent","ListItemName","TextStyleName","orderedListInputRegex","cssListStyleTypeToHtmlType","OrderedList","htmlType","mappedFromOl","firstLi","liStyle","mappedFromLi","attributesWithoutType","startValue","typeValue","_tokens","_listItems$","_listItems$2","_event$clipboardData2","orderedListContent","orderedListNode","joinPredicate","inputRegex","visuallyHiddenStyle","getCheckboxLabel","checked","a11y","_a11y$checkboxLabel","TaskItem","dataChecked","_element$querySelecto","_node$attrs","shortcuts","checkboxWrapper","checkboxStyler","checkbox","updateA11Y","prevRenderedAttributeKeys","updatedNode","newHTMLAttributes","newKeys","staticAttrs","TaskList","_src$match","parseTaskListContent","nestedResult","taskListToken","remainder","readFromCache","addToCache","cachePos","TableMap","width","height","problems","bottom","axis","leftA","rightA","topA","bottomA","leftB","rightB","topB","bottomB","col","table","rowStart","rowEnd","rowEndIndex","computeMap","findWidth","mapPos","colWidths","rowNode","cellNode","colspan","rowspan","colwidth","colW","widthIndex","expectedPos","tableMap","badWidths","findBadColWidths","hasRowSpan","rowWidth","prevRow","cell","colWidth","freshColWidth","tableNodeTypes","role","tableEditingKey","cellAround","cellWrapping","isInTable","selectionCell","$cell","cellNear","pointsAtCell","moveCellForward","inSameTable","$cellA","$cellB","tableStart","removeColSpan","addColSpan","columnIsHeader","headerCell","CellSelection","$anchorCell","$headCell","cells","tableChanged","rowContent","cellRect","extraLeft","extraRight","anchorTop","headTop","anchorBottom","headBottom","anchorRect","headRect","anchorLeft","headLeft","anchorRight","headRight","anchorCell","headCell","CellBookmark","drawCellSelection","isCellBoundarySelection","afterFrom","beforeTo","isTextSelectionAcrossCells","fromCellBoundaryNode","toCellBoundaryNode","normalizeSelection","allowTableNodeSelection","lastCell","fixTablesKey","changedDescendants","curSize","fixTables","fixTable","tablePos","mustAdd","prob","selectedRect","addColumn","refColumn","addColumnBefore","addColumnAfter","removeColumn","mapStart","deleteColumn","rowIsHeader","_table$nodeAt","addRow","rowPos","refRow","_table$nodeAt2","addRowBefore","addRowAfter","removeRow","nextRow","deleteRow","cellsOverlapRectangle","indexTop","indexLeft","indexBottom","indexRight","mergeCells","mergedPos","mergedCell","cellPos","splitCell","splitCellWithType","getCellType","_cellAround","baseAttrs","setCellAttr","deprecated_toggleHeader","isHeaderEnabledByType","cellPositions","toggleHeader","isHeaderRowEnabled","isHeaderColumnEnabled","selectionStartsAt","cellsRect","newType","relativeCellPos","toggleHeaderCell","findNextCell","goToNextCell","deleteTable","deleteCellSelection","baseContent","pastedCells","fitSlice","ensureRectangular","widths","clipCells","newWidth","newHeight","newRows","growTable","emptyHead","start$1","header","emptyRow","isolateHorizontal","cellTop","cellLeft","isolateVertical","updatePos","insertCells","recomp","handleKeyDown","arrow","shiftArrow","maybeSetSelection","atEndOfCell","cellSel","handlePaste","handleMouseDown$1","startEvent","_cellUnderMouse","startDOMCell","domInCell","setCellSelection","cellUnderMouse","$anchor$1","starting","dirStr","mousePos","TableView","defaultCellMinWidth","updateColumnsOnResize","record","colgroup","overrideCol","overrideValue","totalWidth","fixedWidth","hasWidth","cssWidth","col$1","_nextDOM$parentNode","columnResizingPluginKey","columnResizing","handleWidth","cellMinWidth","View","lastColumnResizable","_plugin$spec","tableName","ResizeState","handleMouseMove","handleMouseLeave","handleMouseDown","handleDecorations","activeHandle","domCellAround","edgeCell","updateHandle","_view$dom$ownerDocume","win","currentColWidth","finish","event$1","pluginState$1","updateColumnWidth","draggedWidth","dragged","displayColumnWidth","domWidth","resizeMinWidth","mapIndex","zeroes","_columnResizingPlugin","tableEditing","normalizeTableCellAlign","parseAlign","styleAlign","attrAlign","normalizeTableCellAlignFromAttributes","createAlignAttribute","parseColgroupWidth","_table$querySelectorA","cellIndex","parseColwidth","COLLAPSIBLE_WHITESPACE","isEmptyCellElement","_element$textContent","fillEmptyCellContent","cellType","filled","TableCell","_node","TableHeader","TableRow","getColStyleDeclaration","minWidth","updateColumns","propertyKey","propertyValue","colElement","hasUserWidth","isInsideWrapper","isInsideContent","createColGroup","cols","tableWidth","tableMinWidth","createCell","cellContent","getTableNodeTypes","roles","createTable","rowsCount","colsCount","withHeaderRow","headerCells","isCellSelection","deleteTableWhenAllCellsSelected","cellCount","keepCursorInTable","mappedTablePos","stillInTable","tableNode","endOfTable","escapeTableCellPipes","runLen","closeLen","spanContent","preprocessTablePipes","collapseWhitespace","renderTableToMarkdown","_options$cellLineSepa","cellSep","isHeader","align","columnCount","_r$i","pad","headerRow","hasHeader","colAlignments","_r$i2","headerTexts","dashCount","alignment","Table","userStyles","getTableStyle","alignments","_alignments$index","bodyCells","_alignments$index2","sep","helper","blankLineIndex","candidate","candidateLines","preprocessed","tableToken","lineCount","isResizable","TableKit","M","O","G","u","be","Re","Oe","Te","C","we","Q","se","ye","Pe","F","Se","$e","U","_e","oe","Le","ne","Me","ze","Ee","Ie","ae","Ae","z","Ce","le","Be","De","qe","ue","ve","He","pe","Ze","Ge","Ne","Qe","je","Fe","Ue","Ke","We","Xe","q","Je","ce","he","Ve","re","X","Ye","N","et","B","E","ke","T","J","V","I","de","ge","fe","nt","R","S","Y","ee","te","me","xe","Z","P","D","L","TRAILING_BLANK_LINES","extractAbsorbedBlankLines","trailingBlankLines","wrapInMarkdownBlock","findMarksToClose","marksToClose","currentMark","findMarksToOpen","activeMarks","marksToOpen","activeMark","findMarksToCloseAtEnd","markSetsEqual","isLastNode","nextNodeHasNoMarks","nextNodeHasDifferentMarks","marksToCloseAtEnd","closeMarksBeforeNode","getMarkClosing","beforeMarkdown","closeMarkdown","reopenMarksAfterNode","marksToReopen","getMarkOpening","afterMarkdown","openMarkdown","isTaskItem","assumeContentType","STANDARD_HTML_TAGS","HTML_TAG_NAME_PATTERN","extractHtmlTagNames","tagNames","isHtmlUnknownTagName","htmlContainsUnrecognizedTag","schemaTags","MarkdownManager","_options$marked","_options$indentation$","_options$indentation","_options$indentation$2","_options$indentation2","_getExtensionField","_markdownCfg$indentsC","isCode","tokenName","renderMarkdown","tokenizer","markdownCfg","parseExisting","renderExisting","_this$activeParseLexe","tokenize","createTokenizerHelpers","createLexer","startCb","markedExtension","markdownHandlers","nodeTypeHandlers","docOrContent","previousParseLexer","parseLexer","parseImplicitEmptyParagraphs","normalizedTokens","nonSpaceTokenIndexes","indexes","previousNonSpaceTokenIndex","nextNonSpaceTokenPointer","_nonSpaceTokenIndexes","nextNonSpaceTokenIndex","separatorCount","emptyParagraphCount","parseResult","normalized","toReturn","hasTask","hasNonTask","groups","currentGroup","currentType","isTask","processedItem","firstLineMatch","nestedLines","nonEmptyLines","minIndent","results","subToken","_token$raw","isClosing","openMatch","escapedTagName","closingRegex","foundIndex","_ref2","_t$raw","tRaw","mergedRaw","mergedToken","parsedSingle","markHandler","markedContent","previousMarks","existingMarks","newMark","inlineTypes","tags","collect","parseDOM","_handler$renderMarkdo","childLevel","nodeOrNodes","reopenWithHtmlOnNextOpen","markOpeningModes","textContent","activeMarksClosingHere","hasCrossedBoundary","middleTrailingWhitespace","middleTrailingMatch","leadingMatch","openingMode","nextMarkTypes","activeMarkKeys","activeMarksClosingHereLifo","trailingWhitespace","trailingMatch","_activeMarks$get","nodeMarkTypes","openingModesToReopen","_markOpeningModes$get","nodeContent","_openingModesToReopen","_this$getHtmlReopenTa","placeholder","syntheticNode","placeholderIndex","_this$getHtmlReopenTa2","placeholderEnd","marks1","marks2","nextMarks","continuesInNextNode","byRankInnerFirst","_this$extensionRanks$","_this$extensionRanks$2","rankA","rankB","endingHere","continuing","Markdown","mdContent","_json$content","jsxElements","jsxFragments","createJSXElement","isJSXElement","flattenFragmentChildren","flattenedChildren","_previous$lastChild","Blockquote","jsx","linesWithPrefix","starInputRegex","starPasteRegex","underscoreInputRegex","underscorePasteRegex","Bold","inputRegexMatch","pasteRegexMatch","regex","Code","DEFAULT_TAB_SIZE","backtickInputRegex","tildeInputRegex","CodeBlock","_element$firstElement","languageClassPrefix","language","className","_token$raw2","_this$options$tabSize","tabSize","indentedText","_this$options$tabSize2","_currentLine$match","codeBlockStart","codeBlockEnd","charCount","relativeCursorPos","leadingSpaces","spacesToRemove","lineStartPos","reverseIndentText","_line$match","isAtEnd","endsWithDoubleNewline","vscode","vscodeData","Document","HardBreak","Heading","headingChars","HorizontalRule","$originTo","currentChain","chainState","posAfter","Italic","encodedTlds","encodedUtlds","numeric","ascii","alpha","asciinumeric","alphanumeric","domain","emoji","scheme","slashscheme","whitespace","registerGroup","addToGroups","flags","flagsForToken","State","exactOnly","inputs","regexp","templateState","allFlags","ta","ts","WORD","UWORD","ASCIINUMERICAL","ALPHANUMERICAL","LOCALHOST","TLD","UTLD","SCHEME","SLASH_SCHEME","NUM","WS","NL","OPENBRACE","CLOSEBRACE","OPENBRACKET","CLOSEBRACKET","OPENPAREN","CLOSEPAREN","OPENANGLEBRACKET","CLOSEANGLEBRACKET","FULLWIDTHLEFTPAREN","FULLWIDTHRIGHTPAREN","LEFTCORNERBRACKET","RIGHTCORNERBRACKET","LEFTWHITECORNERBRACKET","RIGHTWHITECORNERBRACKET","FULLWIDTHLESSTHAN","FULLWIDTHGREATERTHAN","AMPERSAND","APOSTROPHE","ASTERISK","AT","BACKSLASH","BACKTICK","CARET","COLON","COMMA","DOLLAR","DOT","EQUALS","EXCLAMATION","HYPHEN","PERCENT","PIPE","PLUS","POUND","QUERY","QUOTE","FULLWIDTHMIDDLEDOT","SEMI","SLASH","TILDE","UNDERSCORE","EMOJI$1","SYM","tk","ASCII_LETTER","LETTER","EMOJI","DIGIT","SPACE","CR","LF","EMOJI_VARIATION","EMOJI_JOINER","OBJECT_REPLACEMENT","tlds","utlds","init$2","customSchemes","Start","decodeTlds","Num","Asciinumeric","Alphanumeric","Word","UWord","Nl","Cr","Ws","Emoji","EmojiJoiner","wordjr","uwordjr","fastts","sch","iterable","stringToArray","charCursor","tokenLength","latestAccepting","sinceAccepts","charsSinceAccepts","defaultt","jr","encoded","words","digits","popDigitCount","popCount","noop","Options","defaultRender","ignoredTags","uppercaseIgnoredTags","ir","operator","isCallable","MultiToken","truncate","formatted","protocol","href","formattedHref","rel","eventListeners","createTokenClass","Token","Email","Url","makeState","init$1","qsAccepting","qsNonAccepting","localpartAccepting","Localpart","Domain","Scheme","SlashScheme","LocalpartAt","LocalpartDot","EmailDomain","EmailDomainDot","Email$1","EmailDomainHyphen","DomainHyphen","DomainDot","DomainDotTld","DomainDotTldColon","DomainDotTldColonPort","Url$1","UrlNonaccept","SchemeColon","SlashSchemeColon","SlashSchemeColonSlash","UriPrefix","bracketPairs","OPEN","CLOSE","UrlOpen","UrlOpenQ","UrlOpenSyms","multis","textTokens","secondState","multiLength","initMultiToken","Multi","subtokens","startIdx","endIdx","warnAdvice","INIT","registerCustomProtocol","optionalSlashSlash","init","UNICODE_WHITESPACE_PATTERN","UNICODE_WHITESPACE_REGEX","UNICODE_WHITESPACE_REGEX_END","UNICODE_WHITESPACE_REGEX_GLOBAL","isValidLinkStructure","autolink","preventAutolink","nodesInChangedRanges","textBlock","textBeforeWhitespace","endText","wordsBeforeWhitespace","lastWordBeforeSpace","lastWordAndBlockOffset","linksBeforeSpace","link","clickHandler","_link$href","_link$target","MARKDOWN_LINK_INPUT_REGEX","MARKDOWN_LINK_PASTE_REGEX","isEscaped","backslashes","isInsideCodeSpan","matchIndex","openRunLength","runLength","isConvertibleLink","isAllowedHref","_match$index","_match$index2","linkText","toRuleMatch","_match$index3","linkSyntax","straightQuotedTitle","curlyDoubleTitle","curlySingleTitle","title","matchesOverlap","getMarkdownLinkAttributes","_match$data","_match$data$title","_match$data2","markdownLinkInputRule","markdownLinkPasteRule","_config$findPlainUrls","_config$findPlainUrls2","markdownMatches","plainUrlMatches","urlMatch","markdownMatch","_props$match$data","pasteHandler","shouldAutoLink","isAllowedUri","uri","protocols","allowedProtocols","nextProtocol","Link","hasProtocol","hasMaybeProtocol","hostname","_this$options$HTMLAtt","_this$options$HTMLAtt2","_this$options$HTMLAtt3","_node$attrs$href","_node$attrs$title","_node$attrs2","findPlainUrls","foundLinks","defaultProtocol","EMPTY_PARAGRAPH_MARKDOWN","NBSP_CHAR","Paragraph","_ctx$previousNode","_ctx$previousNode2","previousContent","pasteRegex","Strike","Underline","dropCursor","DropCursorView","editorDOM","editorRect","nodeRect","halfWidth","parentLeft","parentTop","parentScaleX","parentScaleY","disableDropCursor","disabled","GapCursor","GapBookmark","closedBefore","closedAfter","override","mustMove","$cur","needsGap","gapCursor","drawGapCursor","handleClick","beforeinput","$found","clickPos","GOOD_LEAF_SIZE","RopeSequence","Append","Leaf","prototypeAccessors","leftLen","max_empty_items","Branch","eventCount","preserveItems","remap","addAfter","addBefore","histOptions","newItems","oldItems","overflow","DEPTH_OVERFLOW","cutOffEvents","mirrorPos","rebasedTransform","rebasedCount","rebasedItems","newUntil","iRebased","newMaps","branch","upto","newItem","cutPoint","mirrorOffset","HistoryState","undone","prevRanges","prevTime","prevComposition","applyTransaction","history","historyTr","historyKey","rebased","closeHistoryKey","appended","mustPreserveItems","rangesFor","newGroup","isAdjacentTo","mapRanges","adjacent","histTransaction","pop","newHist","cachedPreserveItems","cachedPreserveItemsPlugins","closeHistory","hist","inputType","buildCommand","initialEvaluationDone","limit","autoTrim","initialContentSize","over","Dropcursor","isEditable","isFocused","maxLevels","currentLevel","Gapcursor","DEFAULT_DATA_ATTRIBUTE","PLUGIN_KEY","createPlaceholderDecoration","dataAttribute","hasAnchor","emptyNode","emptyEditor","classes","resolveEmptyNodeClass","emptyNodeClass","scanRangeForDecorations","buildPlaceholderDecorations","resolveTopLevelRange","_resolved$nodeAfter","topLevelPos","toContentRelativeRange","getTopLevelBlocksInRange","absNodeStart","absNodeEnd","mergeRanges","collectBlocksForChange","collectRescanRanges","clampRange","clampedFrom","updateDecorationsInRanges","newDecos","createPlaceholderStateField","preparePlaceholderAttribute","createPlaceholderPlugin","useResolvedPath","_PLUGIN_KEY$getState","shouldSyncDomSelection","shouldPreserveSelection","clearDomSelection","_window$getSelection","restoreDomSelection","nodeEqualsType","TrailingNode","_this$editor$schema$t","defaultNode","disabledNodes","__","shouldInsertNodeAtEnd","endPosition","UndoRedo","StarterKit","_this$options","_this$options2","_this$options3","_this$options4","CELL_LINE_SEPARATOR","PastyParagraph","PastyCode","PastyLink","isSpaceAfterLinkEnd","PastyListItem","listMarker","indented","normalizeAlign","renderCell","flattened","delimiter","PastyTable","rowNodes","column","bodyRows","cellWidths","TASK_ITEM_LINE","TASK_NEST_COLUMNS","shiftIndent","leading","snapTaskIndents","openLevels","upstreamTaskTokenizer","PastyTaskList","firstLine","undoManagerOf","yUndo","pmUndo","yRedo","pmRedo","CLOSE_META","pmCloseHistory","HistoryBridge","_oldState","LIST_TYPES","sameKindOfList","listSeams","seams","visit","PastyListJoin","WRAPPER_TAGS","hasRealHtml","elements","selectionIsInCode","handleMarkdownPaste","clipboard","textLooksLikeMarkdown","IS_MAC","shortcutHint","hasPrimaryModifier","parseShortcut","codeFor","matchesShortcut","chord","primary","MAC_GLYPHS","OTHER_NAMES","keycapParts","shortcutAria","MESSAGE_MS","createCmdlineBar","glyph","messageTimer","typed","tone","VIM_DEBUG_KEY","verdictForAction","debugOn","verdicts","noteVerdict","verdict","describe","log","phase","installVimKeyLogger","capture","bubble","ATOM","BLANK","clamp","blockText","firstTextblockIn","lastTextblockIn","nextTextblock","prevTextblock","enclosingTextblock","linesOf","blockPos","lineAt","prevLine","nthLine","isBlankChar","firstNonBlank","clampToLine","fold","big","classOf","Scan","isBlankish","toRunEnd","toRunStart","CLASS_ESCAPES","LITERAL_ESCAPES","QUANTIFIER_ESCAPES","JS_SPECIAL","fail","literal","readBrace","readClass","compilePattern","uppercase","forcedCase","hasAtom","emitAtom","brace","isCaseSensitive","buildRegExp","caseSensitive","expandReplacement","template","MATCH_LIMIT","specFor","compiled","wholeWordPattern","isWordChar","regexFor","scanLine","into","firstOnly","findMatches","matchesInLines","matchFrom","wordUnderCursor","SCAN_LIMIT","blockScope","lineScope","runsOf","runs","runIndexAt","innerWord","aroundWord","tookTrailing","quoteObject","quote","positions","pair","CLOSERS","OPENERS","CLOSERS_TO_OPEN","pairObject","searchFrom","opener","closer","matchingBracket","partnerOf","forward","resolveTextObject","MIRROR","RELATIVE","wordForward","startLine","here","wordBack","wordEnd","wordEndBack","changeWordEnd","findOnLine","till","topBlockStart","topBlockIndex","blockForwardTarget","blockBackTarget","lineStep","down","charwise","goal","inclusive","linewise","adjustExclusive","endLine","pulled","resolveMotion","motion","resolveTarget","countGiven","landing","mirrored","UNNAMED","BLACK_HOLE","YANK","CLIPBOARD","LOWERCASE","UPPERCASE","NUMBERED","slotFor","RegisterFile","bridge","slot","append","CELL_TYPES","tableAround","insideCell","clampOperatorRange","clamped","DEFAULT_LINE_HEIGHT","scrollDistance","unit","metrics","scrollerFor","metricsFor","scroller","scrollViewport","NOT_SUPPORTED","readFields","parseEx","whole","vimPluginKey","EMPTY_PENDING","ITEM_TYPES","WALK_LIMIT","CODE_INDENT","isIndent","JUMPS","clampHead","normalCursor","followSelection","dispatchVim","headOf","vim","firstNonBlankOffset","lineSpan","guard","following","lineDown","ownerRangeOf","$block","widen","covers","linewiseTarget","owner","safe","widened","$final","listContext","writeRegister","registers","applyCharwise","register","applyLinewise","applyIndent","tail","paragraph","runCommand","staged","produced","itemTypeOf","isNestedItem","lead","replaceRangeText","swapCase","upper","sliceText","repeatFragment","fragmentHasTable","insertionPoint","pasteCharwise","pasteLinewise","landed","renderVisual","applyCellSelection","_cell","recordable","repeatable","entersInsert","withCount","buildSearchState","rememberVisual","applyAction","report","jumped","remembered","cleared","spaced","started","restored","replayed","selected","pasteEntry","leaveCommandMode","executeSearch","executeEx","clearSearchHighlight","replaced","execute","deps","ran","host","visualRange","outcome","fallback","emptyLineCursor","cursorDecorations","MAX_GUTTER_LINES","numberSpan","lineNumberDecorations","MAX_COUNT","TEXT_OBJECTS","MARK_NAMES","GOTO_MARK_NAMES","REGISTER_NAMES","SCROLL_KEYS","CTRL_ESCAPES","NAMED","MACRO_NAMES","normalizeKey","named","MOTIONS","FIND_KEYS","G_MOTIONS","OPERATORS","clampCount","extendCount","digit","withPending","motionFor","awaitChar","reduceKey","mode","visual","kind","motionAction","object","visualOperator","deleteOver","insertAction","openLineAction","enterVisual","where","below","MAX_DEPTH","MAX_ITEMS","stateFor","playMacro","budget","round","runItem","initialVimState","statusOf","mapMaybe","mapPositions","trackInsert","mapInsertRun","applyEnabled","isVisual","hasPending","opCount","awaiting","macroDeps","withGutter","createVimPlugin","restoring","commit","applyState","present","_transactions","VimExtension","storageOf","DISABLED","vimStatus","setVimEnabled","subscribeVimStatus","vimMacroDump","macros","installVimChrome","mounts","bar","LINK_SHORTCUT_EVENT","PastyShortcuts","headingShortcut","followableUrl","absolute","parseUrl","guessed","linkHref","followTarget","DRAG_SLOP","renderCaret","selectionRender","buildExtensions","collaboration","chromeHeight","toolbar","createEditor","pressed","press","destination","MENU","ROW","openMenus","menu","refocus","installMenus","onToggle","onPointerDown","onKeyDown","DARK_QUERY","normalizePreference","resolveTheme","systemPrefersDark","applyPreference","prefersDark","installTheme","announce","onSystemChange","COPY_ANNOUNCEMENT_MS","bootSharedView","mount","page","workspace","copyConfirmation","copyTimer","trigger","UNSTORABLE","bootPublishedView","DISCARD_PROMPT","resolveFreshStart","blank","HEADLINE","introMarkdown","signupUrl","isIntroHeadline","isUntouchedIntro","POPOVER_WIDTH","createLinkPopover","form","popover","linkTarget","bounds","maxLeft","aimAtTarget","onShortcut","onDocumentPointerDown","onEditorClick","GLYPHS","kbd","fillKeycap","renderKeys","UNTITLED","MAX_LENGTH","MIN_WORD_CUT","deriveTitle","collapse","firstTextblockText","nested","lastSpace","createTitleField","derived","syncDocumentTitle","NEW_DOCUMENT_URL","CLI_URL","DOCUMENT_SHORTCUTS","RECENT_LIMIT","MAX_ROWS","FLUSH_TIMEOUT_MS","SECTIONS","APPEARANCE","SCORE","DOCUMENT_PENALTY","WORD_BREAK","isSubsequence","haystack","needle","scoreText","scoreItem","best","keyword","rankCommands","order","installPalette","api","settings","authenticated","dialog","documents","documentsLoaded","loadingDocuments","go","proceed","goTo","logOut","actionItems","choice","vimOn","documentItems","accountItems","allItems","loadDocuments","optionElements","setActive","on","renderRow","cap","filtering","ranked","seenDocuments","shown","section","inSection","runActive","claim","INERT","installSettings","vimLabel","vimSwitch","editorSection","choices","appearanceSection","toggle","PULSE_MS","RELOAD_SETTLE_MS","deferred","promise","rej","installShare","panel","summary","signup","login","editUrl","bootEditable","serverShared","wantShared","wantEditable","busy","pulsing","pulseTimer","copyLabelTimer","reloadTimer","lastClickAt","reloading","viewLink","editLink","editCopied","settleMs","labels","shareLabels","editLabels","shareToggle","editToggle","controls","linkGlyphs","headline","heading","urlText","copyButton","shareAction","viewLabel","viewText","viewCopy","viewRow","reserve","reserved","show","isShared","showView","say","pulse","mintView","minted","revokeAll","mintEdit","revokeEdit","settled","which","wait","reloadNow","clicked","toggleEditing","wireCopy","button","reopen","ACTIONS","createTableMenu","CLUSTERS","STYLES","createToolbar","styleSelect","chevron","buttons","cluster","installRovingFocus","control","setTabStop","initial","normalizeVimPreference","resolveInitialVimMode","serverValue","localRaw","installVim","preferences","decision","persist","LABELS","createVimIndicator","sizer","ANON_SAVE_DEBOUNCE_MS","STATUS_TEXT","RECONNECTING_TEXT","isRemote","emptyDocument","chooseInitialDocument","anonymous","initialFreshDocument","boot","guestDoc","pageKind","wantsShareOpen","share","handoff","freshStart","bootRevision","storageKey","toolbarRail","toolbarBar","problemNote","resolveConflict","overlays","vimIndicator","onDocumentChanged","editSerial","snapshotSerial","savedSerial","statusSlot","saveStatus","renderStatus","reconnecting","syncChrome","booted","live","firstRendered","buildEditor","_editor","onRemoteChanged","tableMenu","linkPopover","updateOverlays","introUntouched","syncIntroState","refreshIntroState","showProblem","guestApi","plainWriter","liveWriting","autosave","sides","showConflict","resetLive","reloadForMode","conflictKind","conflictServer","conflictLocal","conflictKey","setDocumentContent","nextTitle","resolveLiveConflict","anonSaveTimer","saveAnonymously","copyConfirmationTimer","runCopy","beforeReload","channel","hashed","deleteDocument","ready","storedTitle","backfilled","offerRestore","backup"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94]}