[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/js/dist/ -> sync.js (source)

   1  "use strict";
   2  var wp;
   3  (wp ||= {}).sync = (() => {
   4    var __create = Object.create;
   5    var __defProp = Object.defineProperty;
   6    var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
   7    var __getOwnPropNames = Object.getOwnPropertyNames;
   8    var __getProtoOf = Object.getPrototypeOf;
   9    var __hasOwnProp = Object.prototype.hasOwnProperty;
  10    var __commonJS = (cb, mod) => function __require() {
  11      return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
  12    };
  13    var __export = (target, all2) => {
  14      for (var name in all2)
  15        __defProp(target, name, { get: all2[name], enumerable: true });
  16    };
  17    var __copyProps = (to, from2, except, desc) => {
  18      if (from2 && typeof from2 === "object" || typeof from2 === "function") {
  19        for (let key of __getOwnPropNames(from2))
  20          if (!__hasOwnProp.call(to, key) && key !== except)
  21            __defProp(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable });
  22      }
  23      return to;
  24    };
  25    var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  26      // If the importer is in node compatibility mode or this is not an ESM
  27      // file that has been converted to a CommonJS file using a Babel-
  28      // compatible transform (i.e. "__esModule" has not been set), then set
  29      // "default" to the CommonJS "module.exports" for node compatibility.
  30      isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  31      mod
  32    ));
  33    var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
  34  
  35    // package-external:@wordpress/private-apis
  36    var require_private_apis = __commonJS({
  37      "package-external:@wordpress/private-apis"(exports, module) {
  38        module.exports = window.wp.privateApis;
  39      }
  40    });
  41  
  42    // package-external:@wordpress/hooks
  43    var require_hooks = __commonJS({
  44      "package-external:@wordpress/hooks"(exports, module) {
  45        module.exports = window.wp.hooks;
  46      }
  47    });
  48  
  49    // package-external:@wordpress/api-fetch
  50    var require_api_fetch = __commonJS({
  51      "package-external:@wordpress/api-fetch"(exports, module) {
  52        module.exports = window.wp.apiFetch;
  53      }
  54    });
  55  
  56    // node_modules/fast-deep-equal/es6/index.js
  57    var require_es6 = __commonJS({
  58      "node_modules/fast-deep-equal/es6/index.js"(exports, module) {
  59        "use strict";
  60        module.exports = function equal(a, b) {
  61          if (a === b) return true;
  62          if (a && b && typeof a == "object" && typeof b == "object") {
  63            if (a.constructor !== b.constructor) return false;
  64            var length2, i, keys2;
  65            if (Array.isArray(a)) {
  66              length2 = a.length;
  67              if (length2 != b.length) return false;
  68              for (i = length2; i-- !== 0; )
  69                if (!equal(a[i], b[i])) return false;
  70              return true;
  71            }
  72            if (a instanceof Map && b instanceof Map) {
  73              if (a.size !== b.size) return false;
  74              for (i of a.entries())
  75                if (!b.has(i[0])) return false;
  76              for (i of a.entries())
  77                if (!equal(i[1], b.get(i[0]))) return false;
  78              return true;
  79            }
  80            if (a instanceof Set && b instanceof Set) {
  81              if (a.size !== b.size) return false;
  82              for (i of a.entries())
  83                if (!b.has(i[0])) return false;
  84              return true;
  85            }
  86            if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
  87              length2 = a.length;
  88              if (length2 != b.length) return false;
  89              for (i = length2; i-- !== 0; )
  90                if (a[i] !== b[i]) return false;
  91              return true;
  92            }
  93            if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
  94            if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
  95            if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
  96            keys2 = Object.keys(a);
  97            length2 = keys2.length;
  98            if (length2 !== Object.keys(b).length) return false;
  99            for (i = length2; i-- !== 0; )
 100              if (!Object.prototype.hasOwnProperty.call(b, keys2[i])) return false;
 101            for (i = length2; i-- !== 0; ) {
 102              var key = keys2[i];
 103              if (!equal(a[key], b[key])) return false;
 104            }
 105            return true;
 106          }
 107          return a !== a && b !== b;
 108        };
 109      }
 110    });
 111  
 112    // packages/sync/build-module/index.mjs
 113    var index_exports = {};
 114    __export(index_exports, {
 115      Awareness: () => Awareness,
 116      Y: () => yjs_exports,
 117      YJS_VERSION: () => YJS_VERSION,
 118      privateApis: () => privateApis
 119    });
 120  
 121    // node_modules/yjs/dist/yjs.mjs
 122    var yjs_exports = {};
 123    __export(yjs_exports, {
 124      AbsolutePosition: () => AbsolutePosition,
 125      AbstractConnector: () => AbstractConnector,
 126      AbstractStruct: () => AbstractStruct,
 127      AbstractType: () => AbstractType,
 128      Array: () => YArray,
 129      ContentAny: () => ContentAny,
 130      ContentBinary: () => ContentBinary,
 131      ContentDeleted: () => ContentDeleted,
 132      ContentDoc: () => ContentDoc,
 133      ContentEmbed: () => ContentEmbed,
 134      ContentFormat: () => ContentFormat,
 135      ContentJSON: () => ContentJSON,
 136      ContentString: () => ContentString,
 137      ContentType: () => ContentType,
 138      Doc: () => Doc,
 139      GC: () => GC,
 140      ID: () => ID,
 141      Item: () => Item,
 142      Map: () => YMap,
 143      PermanentUserData: () => PermanentUserData,
 144      RelativePosition: () => RelativePosition,
 145      Skip: () => Skip,
 146      Snapshot: () => Snapshot,
 147      Text: () => YText,
 148      Transaction: () => Transaction,
 149      UndoManager: () => UndoManager,
 150      UpdateDecoderV1: () => UpdateDecoderV1,
 151      UpdateDecoderV2: () => UpdateDecoderV2,
 152      UpdateEncoderV1: () => UpdateEncoderV1,
 153      UpdateEncoderV2: () => UpdateEncoderV2,
 154      XmlElement: () => YXmlElement,
 155      XmlFragment: () => YXmlFragment,
 156      XmlHook: () => YXmlHook,
 157      XmlText: () => YXmlText,
 158      YArrayEvent: () => YArrayEvent,
 159      YEvent: () => YEvent,
 160      YMapEvent: () => YMapEvent,
 161      YTextEvent: () => YTextEvent,
 162      YXmlEvent: () => YXmlEvent,
 163      applyUpdate: () => applyUpdate,
 164      applyUpdateV2: () => applyUpdateV2,
 165      cleanupYTextFormatting: () => cleanupYTextFormatting,
 166      compareIDs: () => compareIDs,
 167      compareRelativePositions: () => compareRelativePositions,
 168      convertUpdateFormatV1ToV2: () => convertUpdateFormatV1ToV2,
 169      convertUpdateFormatV2ToV1: () => convertUpdateFormatV2ToV1,
 170      createAbsolutePositionFromRelativePosition: () => createAbsolutePositionFromRelativePosition,
 171      createDeleteSet: () => createDeleteSet,
 172      createDeleteSetFromStructStore: () => createDeleteSetFromStructStore,
 173      createDocFromSnapshot: () => createDocFromSnapshot,
 174      createID: () => createID,
 175      createRelativePositionFromJSON: () => createRelativePositionFromJSON,
 176      createRelativePositionFromTypeIndex: () => createRelativePositionFromTypeIndex,
 177      createSnapshot: () => createSnapshot,
 178      decodeRelativePosition: () => decodeRelativePosition,
 179      decodeSnapshot: () => decodeSnapshot,
 180      decodeSnapshotV2: () => decodeSnapshotV2,
 181      decodeStateVector: () => decodeStateVector,
 182      decodeUpdate: () => decodeUpdate,
 183      decodeUpdateV2: () => decodeUpdateV2,
 184      diffUpdate: () => diffUpdate,
 185      diffUpdateV2: () => diffUpdateV2,
 186      emptySnapshot: () => emptySnapshot,
 187      encodeRelativePosition: () => encodeRelativePosition,
 188      encodeSnapshot: () => encodeSnapshot,
 189      encodeSnapshotV2: () => encodeSnapshotV2,
 190      encodeStateAsUpdate: () => encodeStateAsUpdate,
 191      encodeStateAsUpdateV2: () => encodeStateAsUpdateV2,
 192      encodeStateVector: () => encodeStateVector,
 193      encodeStateVectorFromUpdate: () => encodeStateVectorFromUpdate,
 194      encodeStateVectorFromUpdateV2: () => encodeStateVectorFromUpdateV2,
 195      equalDeleteSets: () => equalDeleteSets,
 196      equalSnapshots: () => equalSnapshots,
 197      findIndexSS: () => findIndexSS,
 198      findRootTypeKey: () => findRootTypeKey,
 199      getItem: () => getItem,
 200      getItemCleanEnd: () => getItemCleanEnd,
 201      getItemCleanStart: () => getItemCleanStart,
 202      getState: () => getState,
 203      getTypeChildren: () => getTypeChildren,
 204      isDeleted: () => isDeleted,
 205      isParentOf: () => isParentOf,
 206      iterateDeletedStructs: () => iterateDeletedStructs,
 207      logType: () => logType,
 208      logUpdate: () => logUpdate,
 209      logUpdateV2: () => logUpdateV2,
 210      mergeDeleteSets: () => mergeDeleteSets,
 211      mergeUpdates: () => mergeUpdates,
 212      mergeUpdatesV2: () => mergeUpdatesV2,
 213      obfuscateUpdate: () => obfuscateUpdate,
 214      obfuscateUpdateV2: () => obfuscateUpdateV2,
 215      parseUpdateMeta: () => parseUpdateMeta,
 216      parseUpdateMetaV2: () => parseUpdateMetaV2,
 217      readUpdate: () => readUpdate,
 218      readUpdateV2: () => readUpdateV2,
 219      relativePositionToJSON: () => relativePositionToJSON,
 220      snapshot: () => snapshot,
 221      snapshotContainsUpdate: () => snapshotContainsUpdate,
 222      transact: () => transact,
 223      tryGc: () => tryGc,
 224      typeListToArraySnapshot: () => typeListToArraySnapshot,
 225      typeMapGetAllSnapshot: () => typeMapGetAllSnapshot,
 226      typeMapGetSnapshot: () => typeMapGetSnapshot
 227    });
 228  
 229    // node_modules/lib0/map.js
 230    var create = () => /* @__PURE__ */ new Map();
 231    var copy = (m) => {
 232      const r = create();
 233      m.forEach((v, k) => {
 234        r.set(k, v);
 235      });
 236      return r;
 237    };
 238    var setIfUndefined = (map2, key, createT) => {
 239      let set = map2.get(key);
 240      if (set === void 0) {
 241        map2.set(key, set = createT());
 242      }
 243      return set;
 244    };
 245    var map = (m, f) => {
 246      const res = [];
 247      for (const [key, value] of m) {
 248        res.push(f(value, key));
 249      }
 250      return res;
 251    };
 252    var any = (m, f) => {
 253      for (const [key, value] of m) {
 254        if (f(value, key)) {
 255          return true;
 256        }
 257      }
 258      return false;
 259    };
 260  
 261    // node_modules/lib0/set.js
 262    var create2 = () => /* @__PURE__ */ new Set();
 263  
 264    // node_modules/lib0/array.js
 265    var last = (arr) => arr[arr.length - 1];
 266    var appendTo = (dest, src) => {
 267      for (let i = 0; i < src.length; i++) {
 268        dest.push(src[i]);
 269      }
 270    };
 271    var from = Array.from;
 272    var every = (arr, f) => {
 273      for (let i = 0; i < arr.length; i++) {
 274        if (!f(arr[i], i, arr)) {
 275          return false;
 276        }
 277      }
 278      return true;
 279    };
 280    var some = (arr, f) => {
 281      for (let i = 0; i < arr.length; i++) {
 282        if (f(arr[i], i, arr)) {
 283          return true;
 284        }
 285      }
 286      return false;
 287    };
 288    var unfold = (len, f) => {
 289      const array = new Array(len);
 290      for (let i = 0; i < len; i++) {
 291        array[i] = f(i, array);
 292      }
 293      return array;
 294    };
 295    var isArray = Array.isArray;
 296  
 297    // node_modules/lib0/observable.js
 298    var ObservableV2 = class {
 299      constructor() {
 300        this._observers = create();
 301      }
 302      /**
 303       * @template {keyof EVENTS & string} NAME
 304       * @param {NAME} name
 305       * @param {EVENTS[NAME]} f
 306       */
 307      on(name, f) {
 308        setIfUndefined(
 309          this._observers,
 310          /** @type {string} */
 311          name,
 312          create2
 313        ).add(f);
 314        return f;
 315      }
 316      /**
 317       * @template {keyof EVENTS & string} NAME
 318       * @param {NAME} name
 319       * @param {EVENTS[NAME]} f
 320       */
 321      once(name, f) {
 322        const _f = (...args2) => {
 323          this.off(
 324            name,
 325            /** @type {any} */
 326            _f
 327          );
 328          f(...args2);
 329        };
 330        this.on(
 331          name,
 332          /** @type {any} */
 333          _f
 334        );
 335      }
 336      /**
 337       * @template {keyof EVENTS & string} NAME
 338       * @param {NAME} name
 339       * @param {EVENTS[NAME]} f
 340       */
 341      off(name, f) {
 342        const observers = this._observers.get(name);
 343        if (observers !== void 0) {
 344          observers.delete(f);
 345          if (observers.size === 0) {
 346            this._observers.delete(name);
 347          }
 348        }
 349      }
 350      /**
 351       * Emit a named event. All registered event listeners that listen to the
 352       * specified name will receive the event.
 353       *
 354       * @todo This should catch exceptions
 355       *
 356       * @template {keyof EVENTS & string} NAME
 357       * @param {NAME} name The event name.
 358       * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.
 359       */
 360      emit(name, args2) {
 361        return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args2));
 362      }
 363      destroy() {
 364        this._observers = create();
 365      }
 366    };
 367    var Observable = class {
 368      constructor() {
 369        this._observers = create();
 370      }
 371      /**
 372       * @param {N} name
 373       * @param {function} f
 374       */
 375      on(name, f) {
 376        setIfUndefined(this._observers, name, create2).add(f);
 377      }
 378      /**
 379       * @param {N} name
 380       * @param {function} f
 381       */
 382      once(name, f) {
 383        const _f = (...args2) => {
 384          this.off(name, _f);
 385          f(...args2);
 386        };
 387        this.on(name, _f);
 388      }
 389      /**
 390       * @param {N} name
 391       * @param {function} f
 392       */
 393      off(name, f) {
 394        const observers = this._observers.get(name);
 395        if (observers !== void 0) {
 396          observers.delete(f);
 397          if (observers.size === 0) {
 398            this._observers.delete(name);
 399          }
 400        }
 401      }
 402      /**
 403       * Emit a named event. All registered event listeners that listen to the
 404       * specified name will receive the event.
 405       *
 406       * @todo This should catch exceptions
 407       *
 408       * @param {N} name The event name.
 409       * @param {Array<any>} args The arguments that are applied to the event listener.
 410       */
 411      emit(name, args2) {
 412        return from((this._observers.get(name) || create()).values()).forEach((f) => f(...args2));
 413      }
 414      destroy() {
 415        this._observers = create();
 416      }
 417    };
 418  
 419    // node_modules/lib0/math.js
 420    var floor = Math.floor;
 421    var abs = Math.abs;
 422    var min = (a, b) => a < b ? a : b;
 423    var max = (a, b) => a > b ? a : b;
 424    var isNaN2 = Number.isNaN;
 425    var isNegativeZero = (n) => n !== 0 ? n < 0 : 1 / n < 0;
 426  
 427    // node_modules/lib0/binary.js
 428    var BIT1 = 1;
 429    var BIT2 = 2;
 430    var BIT3 = 4;
 431    var BIT4 = 8;
 432    var BIT6 = 32;
 433    var BIT7 = 64;
 434    var BIT8 = 128;
 435    var BIT18 = 1 << 17;
 436    var BIT19 = 1 << 18;
 437    var BIT20 = 1 << 19;
 438    var BIT21 = 1 << 20;
 439    var BIT22 = 1 << 21;
 440    var BIT23 = 1 << 22;
 441    var BIT24 = 1 << 23;
 442    var BIT25 = 1 << 24;
 443    var BIT26 = 1 << 25;
 444    var BIT27 = 1 << 26;
 445    var BIT28 = 1 << 27;
 446    var BIT29 = 1 << 28;
 447    var BIT30 = 1 << 29;
 448    var BIT31 = 1 << 30;
 449    var BIT32 = 1 << 31;
 450    var BITS5 = 31;
 451    var BITS6 = 63;
 452    var BITS7 = 127;
 453    var BITS17 = BIT18 - 1;
 454    var BITS18 = BIT19 - 1;
 455    var BITS19 = BIT20 - 1;
 456    var BITS20 = BIT21 - 1;
 457    var BITS21 = BIT22 - 1;
 458    var BITS22 = BIT23 - 1;
 459    var BITS23 = BIT24 - 1;
 460    var BITS24 = BIT25 - 1;
 461    var BITS25 = BIT26 - 1;
 462    var BITS26 = BIT27 - 1;
 463    var BITS27 = BIT28 - 1;
 464    var BITS28 = BIT29 - 1;
 465    var BITS29 = BIT30 - 1;
 466    var BITS30 = BIT31 - 1;
 467    var BITS31 = 2147483647;
 468  
 469    // node_modules/lib0/number.js
 470    var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER;
 471    var MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER;
 472    var LOWEST_INT32 = 1 << 31;
 473    var isInteger = Number.isInteger || ((num) => typeof num === "number" && isFinite(num) && floor(num) === num);
 474    var isNaN3 = Number.isNaN;
 475    var parseInt2 = Number.parseInt;
 476  
 477    // node_modules/lib0/string.js
 478    var fromCharCode = String.fromCharCode;
 479    var fromCodePoint = String.fromCodePoint;
 480    var MAX_UTF16_CHARACTER = fromCharCode(65535);
 481    var toLowerCase = (s) => s.toLowerCase();
 482    var trimLeftRegex = /^\s*/g;
 483    var trimLeft = (s) => s.replace(trimLeftRegex, "");
 484    var fromCamelCaseRegex = /([A-Z])/g;
 485    var fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, (match2) => `$separator}$toLowerCase(match2)}`));
 486    var _encodeUtf8Polyfill = (str) => {
 487      const encodedString = unescape(encodeURIComponent(str));
 488      const len = encodedString.length;
 489      const buf = new Uint8Array(len);
 490      for (let i = 0; i < len; i++) {
 491        buf[i] = /** @type {number} */
 492        encodedString.codePointAt(i);
 493      }
 494      return buf;
 495    };
 496    var utf8TextEncoder = (
 497      /** @type {TextEncoder} */
 498      typeof TextEncoder !== "undefined" ? new TextEncoder() : null
 499    );
 500    var _encodeUtf8Native = (str) => utf8TextEncoder.encode(str);
 501    var encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill;
 502    var utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
 503    if (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {
 504      utf8TextDecoder = null;
 505    }
 506    var repeat = (source, n) => unfold(n, () => source).join("");
 507  
 508    // node_modules/lib0/encoding.js
 509    var Encoder = class {
 510      constructor() {
 511        this.cpos = 0;
 512        this.cbuf = new Uint8Array(100);
 513        this.bufs = [];
 514      }
 515    };
 516    var createEncoder = () => new Encoder();
 517    var length = (encoder) => {
 518      let len = encoder.cpos;
 519      for (let i = 0; i < encoder.bufs.length; i++) {
 520        len += encoder.bufs[i].length;
 521      }
 522      return len;
 523    };
 524    var toUint8Array = (encoder) => {
 525      const uint8arr = new Uint8Array(length(encoder));
 526      let curPos = 0;
 527      for (let i = 0; i < encoder.bufs.length; i++) {
 528        const d = encoder.bufs[i];
 529        uint8arr.set(d, curPos);
 530        curPos += d.length;
 531      }
 532      uint8arr.set(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos), curPos);
 533      return uint8arr;
 534    };
 535    var verifyLen = (encoder, len) => {
 536      const bufferLen = encoder.cbuf.length;
 537      if (bufferLen - encoder.cpos < len) {
 538        encoder.bufs.push(new Uint8Array(encoder.cbuf.buffer, 0, encoder.cpos));
 539        encoder.cbuf = new Uint8Array(max(bufferLen, len) * 2);
 540        encoder.cpos = 0;
 541      }
 542    };
 543    var write = (encoder, num) => {
 544      const bufferLen = encoder.cbuf.length;
 545      if (encoder.cpos === bufferLen) {
 546        encoder.bufs.push(encoder.cbuf);
 547        encoder.cbuf = new Uint8Array(bufferLen * 2);
 548        encoder.cpos = 0;
 549      }
 550      encoder.cbuf[encoder.cpos++] = num;
 551    };
 552    var writeUint8 = write;
 553    var writeVarUint = (encoder, num) => {
 554      while (num > BITS7) {
 555        write(encoder, BIT8 | BITS7 & num);
 556        num = floor(num / 128);
 557      }
 558      write(encoder, BITS7 & num);
 559    };
 560    var writeVarInt = (encoder, num) => {
 561      const isNegative = isNegativeZero(num);
 562      if (isNegative) {
 563        num = -num;
 564      }
 565      write(encoder, (num > BITS6 ? BIT8 : 0) | (isNegative ? BIT7 : 0) | BITS6 & num);
 566      num = floor(num / 64);
 567      while (num > 0) {
 568        write(encoder, (num > BITS7 ? BIT8 : 0) | BITS7 & num);
 569        num = floor(num / 128);
 570      }
 571    };
 572    var _strBuffer = new Uint8Array(3e4);
 573    var _maxStrBSize = _strBuffer.length / 3;
 574    var _writeVarStringNative = (encoder, str) => {
 575      if (str.length < _maxStrBSize) {
 576        const written = utf8TextEncoder.encodeInto(str, _strBuffer).written || 0;
 577        writeVarUint(encoder, written);
 578        for (let i = 0; i < written; i++) {
 579          write(encoder, _strBuffer[i]);
 580        }
 581      } else {
 582        writeVarUint8Array(encoder, encodeUtf8(str));
 583      }
 584    };
 585    var _writeVarStringPolyfill = (encoder, str) => {
 586      const encodedString = unescape(encodeURIComponent(str));
 587      const len = encodedString.length;
 588      writeVarUint(encoder, len);
 589      for (let i = 0; i < len; i++) {
 590        write(
 591          encoder,
 592          /** @type {number} */
 593          encodedString.codePointAt(i)
 594        );
 595      }
 596    };
 597    var writeVarString = utf8TextEncoder && /** @type {any} */
 598    utf8TextEncoder.encodeInto ? _writeVarStringNative : _writeVarStringPolyfill;
 599    var writeBinaryEncoder = (encoder, append2) => writeUint8Array(encoder, toUint8Array(append2));
 600    var writeUint8Array = (encoder, uint8Array) => {
 601      const bufferLen = encoder.cbuf.length;
 602      const cpos = encoder.cpos;
 603      const leftCopyLen = min(bufferLen - cpos, uint8Array.length);
 604      const rightCopyLen = uint8Array.length - leftCopyLen;
 605      encoder.cbuf.set(uint8Array.subarray(0, leftCopyLen), cpos);
 606      encoder.cpos += leftCopyLen;
 607      if (rightCopyLen > 0) {
 608        encoder.bufs.push(encoder.cbuf);
 609        encoder.cbuf = new Uint8Array(max(bufferLen * 2, rightCopyLen));
 610        encoder.cbuf.set(uint8Array.subarray(leftCopyLen));
 611        encoder.cpos = rightCopyLen;
 612      }
 613    };
 614    var writeVarUint8Array = (encoder, uint8Array) => {
 615      writeVarUint(encoder, uint8Array.byteLength);
 616      writeUint8Array(encoder, uint8Array);
 617    };
 618    var writeOnDataView = (encoder, len) => {
 619      verifyLen(encoder, len);
 620      const dview = new DataView(encoder.cbuf.buffer, encoder.cpos, len);
 621      encoder.cpos += len;
 622      return dview;
 623    };
 624    var writeFloat32 = (encoder, num) => writeOnDataView(encoder, 4).setFloat32(0, num, false);
 625    var writeFloat64 = (encoder, num) => writeOnDataView(encoder, 8).setFloat64(0, num, false);
 626    var writeBigInt64 = (encoder, num) => (
 627      /** @type {any} */
 628      writeOnDataView(encoder, 8).setBigInt64(0, num, false)
 629    );
 630    var floatTestBed = new DataView(new ArrayBuffer(4));
 631    var isFloat32 = (num) => {
 632      floatTestBed.setFloat32(0, num);
 633      return floatTestBed.getFloat32(0) === num;
 634    };
 635    var writeAny = (encoder, data) => {
 636      switch (typeof data) {
 637        case "string":
 638          write(encoder, 119);
 639          writeVarString(encoder, data);
 640          break;
 641        case "number":
 642          if (isInteger(data) && abs(data) <= BITS31) {
 643            write(encoder, 125);
 644            writeVarInt(encoder, data);
 645          } else if (isFloat32(data)) {
 646            write(encoder, 124);
 647            writeFloat32(encoder, data);
 648          } else {
 649            write(encoder, 123);
 650            writeFloat64(encoder, data);
 651          }
 652          break;
 653        case "bigint":
 654          write(encoder, 122);
 655          writeBigInt64(encoder, data);
 656          break;
 657        case "object":
 658          if (data === null) {
 659            write(encoder, 126);
 660          } else if (isArray(data)) {
 661            write(encoder, 117);
 662            writeVarUint(encoder, data.length);
 663            for (let i = 0; i < data.length; i++) {
 664              writeAny(encoder, data[i]);
 665            }
 666          } else if (data instanceof Uint8Array) {
 667            write(encoder, 116);
 668            writeVarUint8Array(encoder, data);
 669          } else {
 670            write(encoder, 118);
 671            const keys2 = Object.keys(data);
 672            writeVarUint(encoder, keys2.length);
 673            for (let i = 0; i < keys2.length; i++) {
 674              const key = keys2[i];
 675              writeVarString(encoder, key);
 676              writeAny(encoder, data[key]);
 677            }
 678          }
 679          break;
 680        case "boolean":
 681          write(encoder, data ? 120 : 121);
 682          break;
 683        default:
 684          write(encoder, 127);
 685      }
 686    };
 687    var RleEncoder = class extends Encoder {
 688      /**
 689       * @param {function(Encoder, T):void} writer
 690       */
 691      constructor(writer) {
 692        super();
 693        this.w = writer;
 694        this.s = null;
 695        this.count = 0;
 696      }
 697      /**
 698       * @param {T} v
 699       */
 700      write(v) {
 701        if (this.s === v) {
 702          this.count++;
 703        } else {
 704          if (this.count > 0) {
 705            writeVarUint(this, this.count - 1);
 706          }
 707          this.count = 1;
 708          this.w(this, v);
 709          this.s = v;
 710        }
 711      }
 712    };
 713    var flushUintOptRleEncoder = (encoder) => {
 714      if (encoder.count > 0) {
 715        writeVarInt(encoder.encoder, encoder.count === 1 ? encoder.s : -encoder.s);
 716        if (encoder.count > 1) {
 717          writeVarUint(encoder.encoder, encoder.count - 2);
 718        }
 719      }
 720    };
 721    var UintOptRleEncoder = class {
 722      constructor() {
 723        this.encoder = new Encoder();
 724        this.s = 0;
 725        this.count = 0;
 726      }
 727      /**
 728       * @param {number} v
 729       */
 730      write(v) {
 731        if (this.s === v) {
 732          this.count++;
 733        } else {
 734          flushUintOptRleEncoder(this);
 735          this.count = 1;
 736          this.s = v;
 737        }
 738      }
 739      /**
 740       * Flush the encoded state and transform this to a Uint8Array.
 741       *
 742       * Note that this should only be called once.
 743       */
 744      toUint8Array() {
 745        flushUintOptRleEncoder(this);
 746        return toUint8Array(this.encoder);
 747      }
 748    };
 749    var flushIntDiffOptRleEncoder = (encoder) => {
 750      if (encoder.count > 0) {
 751        const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1);
 752        writeVarInt(encoder.encoder, encodedDiff);
 753        if (encoder.count > 1) {
 754          writeVarUint(encoder.encoder, encoder.count - 2);
 755        }
 756      }
 757    };
 758    var IntDiffOptRleEncoder = class {
 759      constructor() {
 760        this.encoder = new Encoder();
 761        this.s = 0;
 762        this.count = 0;
 763        this.diff = 0;
 764      }
 765      /**
 766       * @param {number} v
 767       */
 768      write(v) {
 769        if (this.diff === v - this.s) {
 770          this.s = v;
 771          this.count++;
 772        } else {
 773          flushIntDiffOptRleEncoder(this);
 774          this.count = 1;
 775          this.diff = v - this.s;
 776          this.s = v;
 777        }
 778      }
 779      /**
 780       * Flush the encoded state and transform this to a Uint8Array.
 781       *
 782       * Note that this should only be called once.
 783       */
 784      toUint8Array() {
 785        flushIntDiffOptRleEncoder(this);
 786        return toUint8Array(this.encoder);
 787      }
 788    };
 789    var StringEncoder = class {
 790      constructor() {
 791        this.sarr = [];
 792        this.s = "";
 793        this.lensE = new UintOptRleEncoder();
 794      }
 795      /**
 796       * @param {string} string
 797       */
 798      write(string) {
 799        this.s += string;
 800        if (this.s.length > 19) {
 801          this.sarr.push(this.s);
 802          this.s = "";
 803        }
 804        this.lensE.write(string.length);
 805      }
 806      toUint8Array() {
 807        const encoder = new Encoder();
 808        this.sarr.push(this.s);
 809        this.s = "";
 810        writeVarString(encoder, this.sarr.join(""));
 811        writeUint8Array(encoder, this.lensE.toUint8Array());
 812        return toUint8Array(encoder);
 813      }
 814    };
 815  
 816    // node_modules/lib0/error.js
 817    var create3 = (s) => new Error(s);
 818    var methodUnimplemented = () => {
 819      throw create3("Method unimplemented");
 820    };
 821    var unexpectedCase = () => {
 822      throw create3("Unexpected case");
 823    };
 824  
 825    // node_modules/lib0/decoding.js
 826    var errorUnexpectedEndOfArray = create3("Unexpected end of array");
 827    var errorIntegerOutOfRange = create3("Integer out of Range");
 828    var Decoder = class {
 829      /**
 830       * @param {Uint8Array<Buf>} uint8Array Binary data to decode
 831       */
 832      constructor(uint8Array) {
 833        this.arr = uint8Array;
 834        this.pos = 0;
 835      }
 836    };
 837    var createDecoder = (uint8Array) => new Decoder(uint8Array);
 838    var hasContent = (decoder) => decoder.pos !== decoder.arr.length;
 839    var readUint8Array = (decoder, len) => {
 840      const view = new Uint8Array(decoder.arr.buffer, decoder.pos + decoder.arr.byteOffset, len);
 841      decoder.pos += len;
 842      return view;
 843    };
 844    var readVarUint8Array = (decoder) => readUint8Array(decoder, readVarUint(decoder));
 845    var readUint8 = (decoder) => decoder.arr[decoder.pos++];
 846    var readVarUint = (decoder) => {
 847      let num = 0;
 848      let mult = 1;
 849      const len = decoder.arr.length;
 850      while (decoder.pos < len) {
 851        const r = decoder.arr[decoder.pos++];
 852        num = num + (r & BITS7) * mult;
 853        mult *= 128;
 854        if (r < BIT8) {
 855          return num;
 856        }
 857        if (num > MAX_SAFE_INTEGER) {
 858          throw errorIntegerOutOfRange;
 859        }
 860      }
 861      throw errorUnexpectedEndOfArray;
 862    };
 863    var readVarInt = (decoder) => {
 864      let r = decoder.arr[decoder.pos++];
 865      let num = r & BITS6;
 866      let mult = 64;
 867      const sign = (r & BIT7) > 0 ? -1 : 1;
 868      if ((r & BIT8) === 0) {
 869        return sign * num;
 870      }
 871      const len = decoder.arr.length;
 872      while (decoder.pos < len) {
 873        r = decoder.arr[decoder.pos++];
 874        num = num + (r & BITS7) * mult;
 875        mult *= 128;
 876        if (r < BIT8) {
 877          return sign * num;
 878        }
 879        if (num > MAX_SAFE_INTEGER) {
 880          throw errorIntegerOutOfRange;
 881        }
 882      }
 883      throw errorUnexpectedEndOfArray;
 884    };
 885    var _readVarStringPolyfill = (decoder) => {
 886      let remainingLen = readVarUint(decoder);
 887      if (remainingLen === 0) {
 888        return "";
 889      } else {
 890        let encodedString = String.fromCodePoint(readUint8(decoder));
 891        if (--remainingLen < 100) {
 892          while (remainingLen--) {
 893            encodedString += String.fromCodePoint(readUint8(decoder));
 894          }
 895        } else {
 896          while (remainingLen > 0) {
 897            const nextLen = remainingLen < 1e4 ? remainingLen : 1e4;
 898            const bytes = decoder.arr.subarray(decoder.pos, decoder.pos + nextLen);
 899            decoder.pos += nextLen;
 900            encodedString += String.fromCodePoint.apply(
 901              null,
 902              /** @type {any} */
 903              bytes
 904            );
 905            remainingLen -= nextLen;
 906          }
 907        }
 908        return decodeURIComponent(escape(encodedString));
 909      }
 910    };
 911    var _readVarStringNative = (decoder) => (
 912      /** @type any */
 913      utf8TextDecoder.decode(readVarUint8Array(decoder))
 914    );
 915    var readVarString = utf8TextDecoder ? _readVarStringNative : _readVarStringPolyfill;
 916    var readFromDataView = (decoder, len) => {
 917      const dv = new DataView(decoder.arr.buffer, decoder.arr.byteOffset + decoder.pos, len);
 918      decoder.pos += len;
 919      return dv;
 920    };
 921    var readFloat32 = (decoder) => readFromDataView(decoder, 4).getFloat32(0, false);
 922    var readFloat64 = (decoder) => readFromDataView(decoder, 8).getFloat64(0, false);
 923    var readBigInt64 = (decoder) => (
 924      /** @type {any} */
 925      readFromDataView(decoder, 8).getBigInt64(0, false)
 926    );
 927    var readAnyLookupTable = [
 928      (decoder) => void 0,
 929      // CASE 127: undefined
 930      (decoder) => null,
 931      // CASE 126: null
 932      readVarInt,
 933      // CASE 125: integer
 934      readFloat32,
 935      // CASE 124: float32
 936      readFloat64,
 937      // CASE 123: float64
 938      readBigInt64,
 939      // CASE 122: bigint
 940      (decoder) => false,
 941      // CASE 121: boolean (false)
 942      (decoder) => true,
 943      // CASE 120: boolean (true)
 944      readVarString,
 945      // CASE 119: string
 946      (decoder) => {
 947        const len = readVarUint(decoder);
 948        const obj = {};
 949        for (let i = 0; i < len; i++) {
 950          const key = readVarString(decoder);
 951          obj[key] = readAny(decoder);
 952        }
 953        return obj;
 954      },
 955      (decoder) => {
 956        const len = readVarUint(decoder);
 957        const arr = [];
 958        for (let i = 0; i < len; i++) {
 959          arr.push(readAny(decoder));
 960        }
 961        return arr;
 962      },
 963      readVarUint8Array
 964      // CASE 116: Uint8Array
 965    ];
 966    var readAny = (decoder) => readAnyLookupTable[127 - readUint8(decoder)](decoder);
 967    var RleDecoder = class extends Decoder {
 968      /**
 969       * @param {Uint8Array} uint8Array
 970       * @param {function(Decoder):T} reader
 971       */
 972      constructor(uint8Array, reader) {
 973        super(uint8Array);
 974        this.reader = reader;
 975        this.s = null;
 976        this.count = 0;
 977      }
 978      read() {
 979        if (this.count === 0) {
 980          this.s = this.reader(this);
 981          if (hasContent(this)) {
 982            this.count = readVarUint(this) + 1;
 983          } else {
 984            this.count = -1;
 985          }
 986        }
 987        this.count--;
 988        return (
 989          /** @type {T} */
 990          this.s
 991        );
 992      }
 993    };
 994    var UintOptRleDecoder = class extends Decoder {
 995      /**
 996       * @param {Uint8Array} uint8Array
 997       */
 998      constructor(uint8Array) {
 999        super(uint8Array);
1000        this.s = 0;
1001        this.count = 0;
1002      }
1003      read() {
1004        if (this.count === 0) {
1005          this.s = readVarInt(this);
1006          const isNegative = isNegativeZero(this.s);
1007          this.count = 1;
1008          if (isNegative) {
1009            this.s = -this.s;
1010            this.count = readVarUint(this) + 2;
1011          }
1012        }
1013        this.count--;
1014        return (
1015          /** @type {number} */
1016          this.s
1017        );
1018      }
1019    };
1020    var IntDiffOptRleDecoder = class extends Decoder {
1021      /**
1022       * @param {Uint8Array} uint8Array
1023       */
1024      constructor(uint8Array) {
1025        super(uint8Array);
1026        this.s = 0;
1027        this.count = 0;
1028        this.diff = 0;
1029      }
1030      /**
1031       * @return {number}
1032       */
1033      read() {
1034        if (this.count === 0) {
1035          const diff = readVarInt(this);
1036          const hasCount = diff & 1;
1037          this.diff = floor(diff / 2);
1038          this.count = 1;
1039          if (hasCount) {
1040            this.count = readVarUint(this) + 2;
1041          }
1042        }
1043        this.s += this.diff;
1044        this.count--;
1045        return this.s;
1046      }
1047    };
1048    var StringDecoder = class {
1049      /**
1050       * @param {Uint8Array} uint8Array
1051       */
1052      constructor(uint8Array) {
1053        this.decoder = new UintOptRleDecoder(uint8Array);
1054        this.str = readVarString(this.decoder);
1055        this.spos = 0;
1056      }
1057      /**
1058       * @return {string}
1059       */
1060      read() {
1061        const end = this.spos + this.decoder.read();
1062        const res = this.str.slice(this.spos, end);
1063        this.spos = end;
1064        return res;
1065      }
1066    };
1067  
1068    // node_modules/lib0/webcrypto.js
1069    var subtle = crypto.subtle;
1070    var getRandomValues = crypto.getRandomValues.bind(crypto);
1071  
1072    // node_modules/lib0/random.js
1073    var uint32 = () => getRandomValues(new Uint32Array(1))[0];
1074    var uuidv4Template = "10000000-1000-4000-8000" + -1e11;
1075    var uuidv4 = () => uuidv4Template.replace(
1076      /[018]/g,
1077      /** @param {number} c */
1078      (c) => (c ^ uint32() & 15 >> c / 4).toString(16)
1079    );
1080  
1081    // node_modules/lib0/time.js
1082    var getUnixTime = Date.now;
1083  
1084    // node_modules/lib0/promise.js
1085    var create4 = (f) => (
1086      /** @type {Promise<T>} */
1087      new Promise(f)
1088    );
1089    var all = Promise.all.bind(Promise);
1090  
1091    // node_modules/lib0/conditions.js
1092    var undefinedToNull = (v) => v === void 0 ? null : v;
1093  
1094    // node_modules/lib0/storage.js
1095    var VarStoragePolyfill = class {
1096      constructor() {
1097        this.map = /* @__PURE__ */ new Map();
1098      }
1099      /**
1100       * @param {string} key
1101       * @param {any} newValue
1102       */
1103      setItem(key, newValue) {
1104        this.map.set(key, newValue);
1105      }
1106      /**
1107       * @param {string} key
1108       */
1109      getItem(key) {
1110        return this.map.get(key);
1111      }
1112    };
1113    var _localStorage = new VarStoragePolyfill();
1114    var usePolyfill = true;
1115    try {
1116      if (typeof localStorage !== "undefined" && localStorage) {
1117        _localStorage = localStorage;
1118        usePolyfill = false;
1119      }
1120    } catch (e) {
1121    }
1122    var varStorage = _localStorage;
1123  
1124    // node_modules/lib0/trait/equality.js
1125    var EqualityTraitSymbol = /* @__PURE__ */ Symbol("Equality");
1126    var equals = (a, b) => a === b || !!a?.[EqualityTraitSymbol]?.(b) || false;
1127  
1128    // node_modules/lib0/object.js
1129    var isObject = (o) => typeof o === "object";
1130    var assign = Object.assign;
1131    var keys = Object.keys;
1132    var forEach = (obj, f) => {
1133      for (const key in obj) {
1134        f(obj[key], key);
1135      }
1136    };
1137    var size = (obj) => keys(obj).length;
1138    var isEmpty = (obj) => {
1139      for (const _k in obj) {
1140        return false;
1141      }
1142      return true;
1143    };
1144    var every2 = (obj, f) => {
1145      for (const key in obj) {
1146        if (!f(obj[key], key)) {
1147          return false;
1148        }
1149      }
1150      return true;
1151    };
1152    var hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key);
1153    var equalFlat = (a, b) => a === b || size(a) === size(b) && every2(a, (val, key) => (val !== void 0 || hasProperty(b, key)) && equals(b[key], val));
1154    var freeze = Object.freeze;
1155    var deepFreeze = (o) => {
1156      for (const key in o) {
1157        const c = o[key];
1158        if (typeof c === "object" || typeof c === "function") {
1159          deepFreeze(o[key]);
1160        }
1161      }
1162      return freeze(o);
1163    };
1164  
1165    // node_modules/lib0/function.js
1166    var callAll = (fs, args2, i = 0) => {
1167      try {
1168        for (; i < fs.length; i++) {
1169          fs[i](...args2);
1170        }
1171      } finally {
1172        if (i < fs.length) {
1173          callAll(fs, args2, i + 1);
1174        }
1175      }
1176    };
1177    var id = (a) => a;
1178    var equalityDeep = (a, b) => {
1179      if (a === b) {
1180        return true;
1181      }
1182      if (a == null || b == null || a.constructor !== b.constructor && (a.constructor || Object) !== (b.constructor || Object)) {
1183        return false;
1184      }
1185      if (a[EqualityTraitSymbol] != null) {
1186        return a[EqualityTraitSymbol](b);
1187      }
1188      switch (a.constructor) {
1189        case ArrayBuffer:
1190          a = new Uint8Array(a);
1191          b = new Uint8Array(b);
1192        // eslint-disable-next-line no-fallthrough
1193        case Uint8Array: {
1194          if (a.byteLength !== b.byteLength) {
1195            return false;
1196          }
1197          for (let i = 0; i < a.length; i++) {
1198            if (a[i] !== b[i]) {
1199              return false;
1200            }
1201          }
1202          break;
1203        }
1204        case Set: {
1205          if (a.size !== b.size) {
1206            return false;
1207          }
1208          for (const value of a) {
1209            if (!b.has(value)) {
1210              return false;
1211            }
1212          }
1213          break;
1214        }
1215        case Map: {
1216          if (a.size !== b.size) {
1217            return false;
1218          }
1219          for (const key of a.keys()) {
1220            if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {
1221              return false;
1222            }
1223          }
1224          break;
1225        }
1226        case void 0:
1227        case Object:
1228          if (size(a) !== size(b)) {
1229            return false;
1230          }
1231          for (const key in a) {
1232            if (!hasProperty(a, key) || !equalityDeep(a[key], b[key])) {
1233              return false;
1234            }
1235          }
1236          break;
1237        case Array:
1238          if (a.length !== b.length) {
1239            return false;
1240          }
1241          for (let i = 0; i < a.length; i++) {
1242            if (!equalityDeep(a[i], b[i])) {
1243              return false;
1244            }
1245          }
1246          break;
1247        default:
1248          return false;
1249      }
1250      return true;
1251    };
1252    var isOneOf = (value, options) => options.includes(value);
1253  
1254    // node_modules/lib0/environment.js
1255    var isNode = typeof process !== "undefined" && process.release && /node|io\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== "undefined" ? process : 0) === "[object process]";
1256    var isBrowser = typeof window !== "undefined" && typeof document !== "undefined" && !isNode;
1257    var isMac = typeof navigator !== "undefined" ? /Mac/.test(navigator.platform) : false;
1258    var params;
1259    var args = [];
1260    var computeParams = () => {
1261      if (params === void 0) {
1262        if (isNode) {
1263          params = create();
1264          const pargs = process.argv;
1265          let currParamName = null;
1266          for (let i = 0; i < pargs.length; i++) {
1267            const parg = pargs[i];
1268            if (parg[0] === "-") {
1269              if (currParamName !== null) {
1270                params.set(currParamName, "");
1271              }
1272              currParamName = parg;
1273            } else {
1274              if (currParamName !== null) {
1275                params.set(currParamName, parg);
1276                currParamName = null;
1277              } else {
1278                args.push(parg);
1279              }
1280            }
1281          }
1282          if (currParamName !== null) {
1283            params.set(currParamName, "");
1284          }
1285        } else if (typeof location === "object") {
1286          params = create();
1287          (location.search || "?").slice(1).split("&").forEach((kv) => {
1288            if (kv.length !== 0) {
1289              const [key, value] = kv.split("=");
1290              params.set(`--$fromCamelCase(key, "-")}`, value);
1291              params.set(`-$fromCamelCase(key, "-")}`, value);
1292            }
1293          });
1294        } else {
1295          params = create();
1296        }
1297      }
1298      return params;
1299    };
1300    var hasParam = (name) => computeParams().has(name);
1301    var getVariable = (name) => isNode ? undefinedToNull(process.env[name.toUpperCase().replaceAll("-", "_")]) : undefinedToNull(varStorage.getItem(name));
1302    var hasConf = (name) => hasParam("--" + name) || getVariable(name) !== null;
1303    var production = hasConf("production");
1304    var forceColor = isNode && isOneOf(process.env.FORCE_COLOR, ["true", "1", "2"]);
1305    var supportsColor = forceColor || !hasParam("--no-colors") && // @todo deprecate --no-colors
1306    !hasConf("no-color") && (!isNode || process.stdout.isTTY) && (!isNode || hasParam("--color") || getVariable("COLORTERM") !== null || (getVariable("TERM") || "").includes("color"));
1307  
1308    // node_modules/lib0/buffer.js
1309    var createUint8ArrayFromLen = (len) => new Uint8Array(len);
1310    var createUint8ArrayViewFromArrayBuffer = (buffer, byteOffset, length2) => new Uint8Array(buffer, byteOffset, length2);
1311    var toBase64Browser = (bytes) => {
1312      let s = "";
1313      for (let i = 0; i < bytes.byteLength; i++) {
1314        s += fromCharCode(bytes[i]);
1315      }
1316      return btoa(s);
1317    };
1318    var toBase64Node = (bytes) => Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64");
1319    var fromBase64Browser = (s) => {
1320      const a = atob(s);
1321      const bytes = createUint8ArrayFromLen(a.length);
1322      for (let i = 0; i < a.length; i++) {
1323        bytes[i] = a.charCodeAt(i);
1324      }
1325      return bytes;
1326    };
1327    var fromBase64Node = (s) => {
1328      const buf = Buffer.from(s, "base64");
1329      return createUint8ArrayViewFromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength);
1330    };
1331    var toBase64 = isBrowser ? toBase64Browser : toBase64Node;
1332    var fromBase64 = isBrowser ? fromBase64Browser : fromBase64Node;
1333    var copyUint8Array = (uint8Array) => {
1334      const newBuf = createUint8ArrayFromLen(uint8Array.byteLength);
1335      newBuf.set(uint8Array);
1336      return newBuf;
1337    };
1338  
1339    // node_modules/lib0/pair.js
1340    var Pair = class {
1341      /**
1342       * @param {L} left
1343       * @param {R} right
1344       */
1345      constructor(left, right) {
1346        this.left = left;
1347        this.right = right;
1348      }
1349    };
1350    var create5 = (left, right) => new Pair(left, right);
1351  
1352    // node_modules/lib0/prng.js
1353    var bool = (gen) => gen.next() >= 0.5;
1354    var int53 = (gen, min2, max2) => floor(gen.next() * (max2 + 1 - min2) + min2);
1355    var int32 = (gen, min2, max2) => floor(gen.next() * (max2 + 1 - min2) + min2);
1356    var int31 = (gen, min2, max2) => int32(gen, min2, max2);
1357    var letter = (gen) => fromCharCode(int31(gen, 97, 122));
1358    var word = (gen, minLen = 0, maxLen = 20) => {
1359      const len = int31(gen, minLen, maxLen);
1360      let str = "";
1361      for (let i = 0; i < len; i++) {
1362        str += letter(gen);
1363      }
1364      return str;
1365    };
1366    var oneOf = (gen, array) => array[int31(gen, 0, array.length - 1)];
1367  
1368    // node_modules/lib0/schema.js
1369    var schemaSymbol = /* @__PURE__ */ Symbol("0schema");
1370    var ValidationError = class {
1371      constructor() {
1372        this._rerrs = [];
1373      }
1374      /**
1375       * @param {string?} path
1376       * @param {string} expected
1377       * @param {string} has
1378       * @param {string?} message
1379       */
1380      extend(path, expected, has, message = null) {
1381        this._rerrs.push({ path, expected, has, message });
1382      }
1383      toString() {
1384        const s = [];
1385        for (let i = this._rerrs.length - 1; i > 0; i--) {
1386          const r = this._rerrs[i];
1387          s.push(repeat(" ", (this._rerrs.length - i) * 2) + `$r.path != null ? `[$r.path}] ` : ""}$r.has} doesn't match $r.expected}. $r.message}`);
1388        }
1389        return s.join("\n");
1390      }
1391    };
1392    var shapeExtends = (a, b) => {
1393      if (a === b) return true;
1394      if (a == null || b == null || a.constructor !== b.constructor) return false;
1395      if (a[EqualityTraitSymbol]) return equals(a, b);
1396      if (isArray(a)) {
1397        return every(
1398          a,
1399          (aitem) => some(b, (bitem) => shapeExtends(aitem, bitem))
1400        );
1401      } else if (isObject(a)) {
1402        return every2(
1403          a,
1404          (aitem, akey) => shapeExtends(aitem, b[akey])
1405        );
1406      }
1407      return false;
1408    };
1409    var Schema = class {
1410      // this.shape must not be defined on Schema. Otherwise typecheck on metatypes (e.g. $$object) won't work as expected anymore
1411      /**
1412       * If true, the more things are added to the shape the more objects this schema will accept (e.g.
1413       * union). By default, the more objects are added, the the fewer objects this schema will accept.
1414       * @protected
1415       */
1416      static _dilutes = false;
1417      /**
1418       * @param {Schema<any>} other
1419       */
1420      extends(other) {
1421        let [a, b] = [
1422          /** @type {any} */
1423          this.shape,
1424          /** @type {any} */
1425          other.shape
1426        ];
1427        if (
1428          /** @type {typeof Schema<any>} */
1429          this.constructor._dilutes
1430        ) [b, a] = [a, b];
1431        return shapeExtends(a, b);
1432      }
1433      /**
1434       * Overwrite this when necessary. By default, we only check the `shape` property which every shape
1435       * should have.
1436       * @param {Schema<any>} other
1437       */
1438      equals(other) {
1439        return this.constructor === other.constructor && equalityDeep(this.shape, other.shape);
1440      }
1441      [schemaSymbol]() {
1442        return true;
1443      }
1444      /**
1445       * @param {object} other
1446       */
1447      [EqualityTraitSymbol](other) {
1448        return this.equals(
1449          /** @type {any} */
1450          other
1451        );
1452      }
1453      /**
1454       * Use `schema.validate(obj)` with a typed parameter that is already of typed to be an instance of
1455       * Schema. Validate will check the structure of the parameter and return true iff the instance
1456       * really is an instance of Schema.
1457       *
1458       * @param {T} o
1459       * @return {boolean}
1460       */
1461      validate(o) {
1462        return this.check(o);
1463      }
1464      /* c8 ignore start */
1465      /**
1466       * Similar to validate, but this method accepts untyped parameters.
1467       *
1468       * @param {any} _o
1469       * @param {ValidationError} [_err]
1470       * @return {_o is T}
1471       */
1472      check(_o, _err) {
1473        methodUnimplemented();
1474      }
1475      /* c8 ignore stop */
1476      /**
1477       * @type {Schema<T?>}
1478       */
1479      get nullable() {
1480        return $union(this, $null);
1481      }
1482      /**
1483       * @type {$Optional<Schema<T>>}
1484       */
1485      get optional() {
1486        return new $Optional(
1487          /** @type {Schema<T>} */
1488          this
1489        );
1490      }
1491      /**
1492       * Cast a variable to a specific type. Returns the casted value, or throws an exception otherwise.
1493       * Use this if you know that the type is of a specific type and you just want to convince the type
1494       * system.
1495       *
1496       * **Do not rely on these error messages!**
1497       * Performs an assertion check only if not in a production environment.
1498       *
1499       * @template OO
1500       * @param {OO} o
1501       * @return {Extract<OO, T> extends never ? T : (OO extends Array<never> ? T : Extract<OO,T>)}
1502       */
1503      cast(o) {
1504        assert(o, this);
1505        return (
1506          /** @type {any} */
1507          o
1508        );
1509      }
1510      /**
1511       * EXPECTO PATRONUM!! 🪄
1512       * This function protects against type errors. Though it may not work in the real world.
1513       *
1514       * "After all this time?"
1515       * "Always." - Snape, talking about type safety
1516       *
1517       * Ensures that a variable is a a specific type. Returns the value, or throws an exception if the assertion check failed.
1518       * Use this if you know that the type is of a specific type and you just want to convince the type
1519       * system.
1520       *
1521       * Can be useful when defining lambdas: `s.lambda(s.$number, s.$void).expect((n) => n + 1)`
1522       *
1523       * **Do not rely on these error messages!**
1524       * Performs an assertion check if not in a production environment.
1525       *
1526       * @param {T} o
1527       * @return {o extends T ? T : never}
1528       */
1529      expect(o) {
1530        assert(o, this);
1531        return o;
1532      }
1533    };
1534    var $ConstructedBy = class extends Schema {
1535      /**
1536       * @param {C} c
1537       * @param {((o:Instance<C>)=>boolean)|null} check
1538       */
1539      constructor(c, check) {
1540        super();
1541        this.shape = c;
1542        this._c = check;
1543      }
1544      /**
1545       * @param {any} o
1546       * @param {ValidationError} [err]
1547       * @return {o is C extends ((...args:any[]) => infer T) ? T : (C extends (new (...args:any[]) => any) ? InstanceType<C> : never)} o
1548       */
1549      check(o, err = void 0) {
1550        const c = o?.constructor === this.shape && (this._c == null || this._c(o));
1551        !c && err?.extend(null, this.shape.name, o?.constructor.name, o?.constructor !== this.shape ? "Constructor match failed" : "Check failed");
1552        return c;
1553      }
1554    };
1555    var $constructedBy = (c, check = null) => new $ConstructedBy(c, check);
1556    var $$constructedBy = $constructedBy($ConstructedBy);
1557    var $Custom = class extends Schema {
1558      /**
1559       * @param {(o:any) => boolean} check
1560       */
1561      constructor(check) {
1562        super();
1563        this.shape = check;
1564      }
1565      /**
1566       * @param {any} o
1567       * @param {ValidationError} err
1568       * @return {o is any}
1569       */
1570      check(o, err) {
1571        const c = this.shape(o);
1572        !c && err?.extend(null, "custom prop", o?.constructor.name, "failed to check custom prop");
1573        return c;
1574      }
1575    };
1576    var $custom = (check) => new $Custom(check);
1577    var $$custom = $constructedBy($Custom);
1578    var $Literal = class extends Schema {
1579      /**
1580       * @param {Array<T>} literals
1581       */
1582      constructor(literals) {
1583        super();
1584        this.shape = literals;
1585      }
1586      /**
1587       *
1588       * @param {any} o
1589       * @param {ValidationError} [err]
1590       * @return {o is T}
1591       */
1592      check(o, err) {
1593        const c = this.shape.some((a) => a === o);
1594        !c && err?.extend(null, this.shape.join(" | "), o.toString());
1595        return c;
1596      }
1597    };
1598    var $literal = (...literals) => new $Literal(literals);
1599    var $$literal = $constructedBy($Literal);
1600    var _regexEscape = (
1601      /** @type {any} */
1602      RegExp.escape || /** @type {(str:string) => string} */
1603      ((str) => str.replace(/[().|&,$^[\]]/g, (s) => "\\" + s))
1604    );
1605    var _schemaStringTemplateToRegex = (s) => {
1606      if ($string.check(s)) {
1607        return [_regexEscape(s)];
1608      }
1609      if ($$literal.check(s)) {
1610        return (
1611          /** @type {Array<string|number>} */
1612          s.shape.map((v) => v + "")
1613        );
1614      }
1615      if ($$number.check(s)) {
1616        return ["[+-]?\\d+.?\\d*"];
1617      }
1618      if ($$string.check(s)) {
1619        return [".*"];
1620      }
1621      if ($$union.check(s)) {
1622        return s.shape.map(_schemaStringTemplateToRegex).flat(1);
1623      }
1624      unexpectedCase();
1625    };
1626    var $StringTemplate = class extends Schema {
1627      /**
1628       * @param {T} shape
1629       */
1630      constructor(shape) {
1631        super();
1632        this.shape = shape;
1633        this._r = new RegExp("^" + shape.map(_schemaStringTemplateToRegex).map((opts) => `($opts.join("|")})`).join("") + "$");
1634      }
1635      /**
1636       * @param {any} o
1637       * @param {ValidationError} [err]
1638       * @return {o is CastStringTemplateArgsToTemplate<T>}
1639       */
1640      check(o, err) {
1641        const c = this._r.exec(o) != null;
1642        !c && err?.extend(null, this._r.toString(), o.toString(), "String doesn't match string template.");
1643        return c;
1644      }
1645    };
1646    var $$stringTemplate = $constructedBy($StringTemplate);
1647    var isOptionalSymbol = /* @__PURE__ */ Symbol("optional");
1648    var $Optional = class extends Schema {
1649      /**
1650       * @param {S} shape
1651       */
1652      constructor(shape) {
1653        super();
1654        this.shape = shape;
1655      }
1656      /**
1657       * @param {any} o
1658       * @param {ValidationError} [err]
1659       * @return {o is (Unwrap<S>|undefined)}
1660       */
1661      check(o, err) {
1662        const c = o === void 0 || this.shape.check(o);
1663        !c && err?.extend(null, "undefined (optional)", "()");
1664        return c;
1665      }
1666      get [isOptionalSymbol]() {
1667        return true;
1668      }
1669    };
1670    var $$optional = $constructedBy($Optional);
1671    var $Never = class extends Schema {
1672      /**
1673       * @param {any} _o
1674       * @param {ValidationError} [err]
1675       * @return {_o is never}
1676       */
1677      check(_o, err) {
1678        err?.extend(null, "never", typeof _o);
1679        return false;
1680      }
1681    };
1682    var $never = new $Never();
1683    var $$never = $constructedBy($Never);
1684    var $Object = class _$Object extends Schema {
1685      /**
1686       * @param {S} shape
1687       * @param {boolean} partial
1688       */
1689      constructor(shape, partial = false) {
1690        super();
1691        this.shape = shape;
1692        this._isPartial = partial;
1693      }
1694      static _dilutes = true;
1695      /**
1696       * @type {Schema<Partial<$ObjectToType<S>>>}
1697       */
1698      get partial() {
1699        return new _$Object(this.shape, true);
1700      }
1701      /**
1702       * @param {any} o
1703       * @param {ValidationError} err
1704       * @return {o is $ObjectToType<S>}
1705       */
1706      check(o, err) {
1707        if (o == null) {
1708          err?.extend(null, "object", "null");
1709          return false;
1710        }
1711        return every2(this.shape, (vv, vk) => {
1712          const c = this._isPartial && !hasProperty(o, vk) || vv.check(o[vk], err);
1713          !c && err?.extend(vk.toString(), vv.toString(), typeof o[vk], "Object property does not match");
1714          return c;
1715        });
1716      }
1717    };
1718    var $object = (def) => (
1719      /** @type {any} */
1720      new $Object(def)
1721    );
1722    var $$object = $constructedBy($Object);
1723    var $objectAny = $custom((o) => o != null && (o.constructor === Object || o.constructor == null));
1724    var $Record = class extends Schema {
1725      /**
1726       * @param {Keys} keys
1727       * @param {Values} values
1728       */
1729      constructor(keys2, values) {
1730        super();
1731        this.shape = {
1732          keys: keys2,
1733          values
1734        };
1735      }
1736      /**
1737       * @param {any} o
1738       * @param {ValidationError} err
1739       * @return {o is { [key in Unwrap<Keys>]: Unwrap<Values> }}
1740       */
1741      check(o, err) {
1742        return o != null && every2(o, (vv, vk) => {
1743          const ck = this.shape.keys.check(vk, err);
1744          !ck && err?.extend(vk + "", "Record", typeof o, ck ? "Key doesn't match schema" : "Value doesn't match value");
1745          return ck && this.shape.values.check(vv, err);
1746        });
1747      }
1748    };
1749    var $record = (keys2, values) => new $Record(keys2, values);
1750    var $$record = $constructedBy($Record);
1751    var $Tuple = class extends Schema {
1752      /**
1753       * @param {S} shape
1754       */
1755      constructor(shape) {
1756        super();
1757        this.shape = shape;
1758      }
1759      /**
1760       * @param {any} o
1761       * @param {ValidationError} err
1762       * @return {o is { [K in keyof S]: S[K] extends Schema<infer Type> ? Type : never }}
1763       */
1764      check(o, err) {
1765        return o != null && every2(this.shape, (vv, vk) => {
1766          const c = (
1767            /** @type {Schema<any>} */
1768            vv.check(o[vk], err)
1769          );
1770          !c && err?.extend(vk.toString(), "Tuple", typeof vv);
1771          return c;
1772        });
1773      }
1774    };
1775    var $tuple = (...def) => new $Tuple(def);
1776    var $$tuple = $constructedBy($Tuple);
1777    var $Array = class extends Schema {
1778      /**
1779       * @param {Array<S>} v
1780       */
1781      constructor(v) {
1782        super();
1783        this.shape = v.length === 1 ? v[0] : new $Union(v);
1784      }
1785      /**
1786       * @param {any} o
1787       * @param {ValidationError} [err]
1788       * @return {o is Array<S extends Schema<infer T> ? T : never>} o
1789       */
1790      check(o, err) {
1791        const c = isArray(o) && every(o, (oi) => this.shape.check(oi));
1792        !c && err?.extend(null, "Array", "");
1793        return c;
1794      }
1795    };
1796    var $array = (...def) => new $Array(def);
1797    var $$array = $constructedBy($Array);
1798    var $arrayAny = $custom((o) => isArray(o));
1799    var $InstanceOf = class extends Schema {
1800      /**
1801       * @param {new (...args:any) => T} constructor
1802       * @param {((o:T) => boolean)|null} check
1803       */
1804      constructor(constructor, check) {
1805        super();
1806        this.shape = constructor;
1807        this._c = check;
1808      }
1809      /**
1810       * @param {any} o
1811       * @param {ValidationError} err
1812       * @return {o is T}
1813       */
1814      check(o, err) {
1815        const c = o instanceof this.shape && (this._c == null || this._c(o));
1816        !c && err?.extend(null, this.shape.name, o?.constructor.name);
1817        return c;
1818      }
1819    };
1820    var $instanceOf = (c, check = null) => new $InstanceOf(c, check);
1821    var $$instanceOf = $constructedBy($InstanceOf);
1822    var $$schema = $instanceOf(Schema);
1823    var $Lambda = class extends Schema {
1824      /**
1825       * @param {Args} args
1826       */
1827      constructor(args2) {
1828        super();
1829        this.len = args2.length - 1;
1830        this.args = $tuple(...args2.slice(-1));
1831        this.res = args2[this.len];
1832      }
1833      /**
1834       * @param {any} f
1835       * @param {ValidationError} err
1836       * @return {f is _LArgsToLambdaDef<Args>}
1837       */
1838      check(f, err) {
1839        const c = f.constructor === Function && f.length <= this.len;
1840        !c && err?.extend(null, "function", typeof f);
1841        return c;
1842      }
1843    };
1844    var $$lambda = $constructedBy($Lambda);
1845    var $function = $custom((o) => typeof o === "function");
1846    var $Intersection = class extends Schema {
1847      /**
1848       * @param {T} v
1849       */
1850      constructor(v) {
1851        super();
1852        this.shape = v;
1853      }
1854      /**
1855       * @param {any} o
1856       * @param {ValidationError} [err]
1857       * @return {o is Intersect<UnwrapArray<T>>}
1858       */
1859      check(o, err) {
1860        const c = every(this.shape, (check) => check.check(o, err));
1861        !c && err?.extend(null, "Intersectinon", typeof o);
1862        return c;
1863      }
1864    };
1865    var $$intersect = $constructedBy($Intersection, (o) => o.shape.length > 0);
1866    var $Union = class extends Schema {
1867      static _dilutes = true;
1868      /**
1869       * @param {Array<Schema<S>>} v
1870       */
1871      constructor(v) {
1872        super();
1873        this.shape = v;
1874      }
1875      /**
1876       * @param {any} o
1877       * @param {ValidationError} [err]
1878       * @return {o is S}
1879       */
1880      check(o, err) {
1881        const c = some(this.shape, (vv) => vv.check(o, err));
1882        err?.extend(null, "Union", typeof o);
1883        return c;
1884      }
1885    };
1886    var $union = (...schemas) => schemas.findIndex(($s) => $$union.check($s)) >= 0 ? $union(...schemas.map(($s) => $($s)).map(($s) => $$union.check($s) ? $s.shape : [$s]).flat(1)) : schemas.length === 1 ? schemas[0] : new $Union(schemas);
1887    var $$union = (
1888      /** @type {Schema<$Union<any>>} */
1889      $constructedBy($Union)
1890    );
1891    var _t = () => true;
1892    var $any = $custom(_t);
1893    var $$any = (
1894      /** @type {Schema<Schema<any>>} */
1895      $constructedBy($Custom, (o) => o.shape === _t)
1896    );
1897    var $bigint = $custom((o) => typeof o === "bigint");
1898    var $$bigint = (
1899      /** @type {Schema<Schema<BigInt>>} */
1900      $custom((o) => o === $bigint)
1901    );
1902    var $symbol = $custom((o) => typeof o === "symbol");
1903    var $$symbol = (
1904      /** @type {Schema<Schema<Symbol>>} */
1905      $custom((o) => o === $symbol)
1906    );
1907    var $number = $custom((o) => typeof o === "number");
1908    var $$number = (
1909      /** @type {Schema<Schema<number>>} */
1910      $custom((o) => o === $number)
1911    );
1912    var $string = $custom((o) => typeof o === "string");
1913    var $$string = (
1914      /** @type {Schema<Schema<string>>} */
1915      $custom((o) => o === $string)
1916    );
1917    var $boolean = $custom((o) => typeof o === "boolean");
1918    var $$boolean = (
1919      /** @type {Schema<Schema<Boolean>>} */
1920      $custom((o) => o === $boolean)
1921    );
1922    var $undefined = $literal(void 0);
1923    var $$undefined = (
1924      /** @type {Schema<Schema<undefined>>} */
1925      $constructedBy($Literal, (o) => o.shape.length === 1 && o.shape[0] === void 0)
1926    );
1927    var $void = $literal(void 0);
1928    var $null = $literal(null);
1929    var $$null = (
1930      /** @type {Schema<Schema<null>>} */
1931      $constructedBy($Literal, (o) => o.shape.length === 1 && o.shape[0] === null)
1932    );
1933    var $uint8Array = $constructedBy(Uint8Array);
1934    var $$uint8Array = (
1935      /** @type {Schema<Schema<Uint8Array>>} */
1936      $constructedBy($ConstructedBy, (o) => o.shape === Uint8Array)
1937    );
1938    var $primitive = $union($number, $string, $null, $undefined, $bigint, $boolean, $symbol);
1939    var $json = (() => {
1940      const $jsonArr = (
1941        /** @type {$Array<$any>} */
1942        $array($any)
1943      );
1944      const $jsonRecord = (
1945        /** @type {$Record<$string,$any>} */
1946        $record($string, $any)
1947      );
1948      const $json2 = $union($number, $string, $null, $boolean, $jsonArr, $jsonRecord);
1949      $jsonArr.shape = $json2;
1950      $jsonRecord.shape.values = $json2;
1951      return $json2;
1952    })();
1953    var $ = (o) => {
1954      if ($$schema.check(o)) {
1955        return (
1956          /** @type {any} */
1957          o
1958        );
1959      } else if ($objectAny.check(o)) {
1960        const o2 = {};
1961        for (const k in o) {
1962          o2[k] = $(o[k]);
1963        }
1964        return (
1965          /** @type {any} */
1966          $object(o2)
1967        );
1968      } else if ($arrayAny.check(o)) {
1969        return (
1970          /** @type {any} */
1971          $union(...o.map($))
1972        );
1973      } else if ($primitive.check(o)) {
1974        return (
1975          /** @type {any} */
1976          $literal(o)
1977        );
1978      } else if ($function.check(o)) {
1979        return (
1980          /** @type {any} */
1981          $constructedBy(
1982            /** @type {any} */
1983            o
1984          )
1985        );
1986      }
1987      unexpectedCase();
1988    };
1989    var assert = production ? () => {
1990    } : (o, schema) => {
1991      const err = new ValidationError();
1992      if (!schema.check(o, err)) {
1993        throw create3(`Expected value to be of type $schema.constructor.name}.
1994  $err.toString()}`);
1995      }
1996    };
1997    var PatternMatcher = class {
1998      /**
1999       * @param {Schema<State>} [$state]
2000       */
2001      constructor($state) {
2002        this.patterns = [];
2003        this.$state = $state;
2004      }
2005      /**
2006       * @template P
2007       * @template R
2008       * @param {P} pattern
2009       * @param {(o:NoInfer<Unwrap<ReadSchema<P>>>,s:State)=>R} handler
2010       * @return {PatternMatcher<State,Patterns|Pattern<Unwrap<ReadSchema<P>>,R>>}
2011       */
2012      if(pattern, handler) {
2013        this.patterns.push({ if: $(pattern), h: handler });
2014        return this;
2015      }
2016      /**
2017       * @template R
2018       * @param {(o:any,s:State)=>R} h
2019       */
2020      else(h) {
2021        return this.if($any, h);
2022      }
2023      /**
2024       * @return {State extends undefined
2025       *   ? <In extends Unwrap<Patterns['if']>>(o:In,state?:undefined)=>PatternMatchResult<Patterns,In>
2026       *   : <In extends Unwrap<Patterns['if']>>(o:In,state:State)=>PatternMatchResult<Patterns,In>}
2027       */
2028      done() {
2029        return (
2030          /** @type {any} */
2031          (o, s) => {
2032            for (let i = 0; i < this.patterns.length; i++) {
2033              const p = this.patterns[i];
2034              if (p.if.check(o)) {
2035                return p.h(o, s);
2036              }
2037            }
2038            throw create3("Unhandled pattern");
2039          }
2040        );
2041      }
2042    };
2043    var match = (state) => new PatternMatcher(
2044      /** @type {any} */
2045      state
2046    );
2047    var _random = (
2048      /** @type {any} */
2049      match(
2050        /** @type {Schema<prng.PRNG>} */
2051        $any
2052      ).if($$number, (_o, gen) => int53(gen, MIN_SAFE_INTEGER, MAX_SAFE_INTEGER)).if($$string, (_o, gen) => word(gen)).if($$boolean, (_o, gen) => bool(gen)).if($$bigint, (_o, gen) => BigInt(int53(gen, MIN_SAFE_INTEGER, MAX_SAFE_INTEGER))).if($$union, (o, gen) => random(gen, oneOf(gen, o.shape))).if($$object, (o, gen) => {
2053        const res = {};
2054        for (const k in o.shape) {
2055          let prop = o.shape[k];
2056          if ($$optional.check(prop)) {
2057            if (bool(gen)) {
2058              continue;
2059            }
2060            prop = prop.shape;
2061          }
2062          res[k] = _random(prop, gen);
2063        }
2064        return res;
2065      }).if($$array, (o, gen) => {
2066        const arr = [];
2067        const n = int32(gen, 0, 42);
2068        for (let i = 0; i < n; i++) {
2069          arr.push(random(gen, o.shape));
2070        }
2071        return arr;
2072      }).if($$literal, (o, gen) => {
2073        return oneOf(gen, o.shape);
2074      }).if($$null, (o, gen) => {
2075        return null;
2076      }).if($$lambda, (o, gen) => {
2077        const res = random(gen, o.res);
2078        return () => res;
2079      }).if($$any, (o, gen) => random(gen, oneOf(gen, [
2080        $number,
2081        $string,
2082        $null,
2083        $undefined,
2084        $bigint,
2085        $boolean,
2086        $array($number),
2087        $record($union("a", "b", "c"), $number)
2088      ]))).if($$record, (o, gen) => {
2089        const res = {};
2090        const keysN = int53(gen, 0, 3);
2091        for (let i = 0; i < keysN; i++) {
2092          const key = random(gen, o.shape.keys);
2093          const val = random(gen, o.shape.values);
2094          res[key] = val;
2095        }
2096        return res;
2097      }).done()
2098    );
2099    var random = (gen, schema) => (
2100      /** @type {any} */
2101      _random($(schema), gen)
2102    );
2103  
2104    // node_modules/lib0/dom.js
2105    var doc = (
2106      /** @type {Document} */
2107      typeof document !== "undefined" ? document : {}
2108    );
2109    var $fragment = $custom((el) => el.nodeType === DOCUMENT_FRAGMENT_NODE);
2110    var domParser = (
2111      /** @type {DOMParser} */
2112      typeof DOMParser !== "undefined" ? new DOMParser() : null
2113    );
2114    var $element = $custom((el) => el.nodeType === ELEMENT_NODE);
2115    var $text = $custom((el) => el.nodeType === TEXT_NODE);
2116    var mapToStyleString = (m) => map(m, (value, key) => `$key}:$value};`).join("");
2117    var ELEMENT_NODE = doc.ELEMENT_NODE;
2118    var TEXT_NODE = doc.TEXT_NODE;
2119    var CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE;
2120    var COMMENT_NODE = doc.COMMENT_NODE;
2121    var DOCUMENT_NODE = doc.DOCUMENT_NODE;
2122    var DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE;
2123    var DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE;
2124    var $node = $custom((el) => el.nodeType === DOCUMENT_NODE);
2125  
2126    // node_modules/lib0/symbol.js
2127    var create6 = Symbol;
2128  
2129    // node_modules/lib0/logging.common.js
2130    var BOLD = create6();
2131    var UNBOLD = create6();
2132    var BLUE = create6();
2133    var GREY = create6();
2134    var GREEN = create6();
2135    var RED = create6();
2136    var PURPLE = create6();
2137    var ORANGE = create6();
2138    var UNCOLOR = create6();
2139    var computeNoColorLoggingArgs = (args2) => {
2140      if (args2.length === 1 && args2[0]?.constructor === Function) {
2141        args2 = /** @type {Array<string|Symbol|Object|number>} */
2142        /** @type {[function]} */
2143        args2[0]();
2144      }
2145      const strBuilder = [];
2146      const logArgs = [];
2147      let i = 0;
2148      for (; i < args2.length; i++) {
2149        const arg = args2[i];
2150        if (arg === void 0) {
2151          break;
2152        } else if (arg.constructor === String || arg.constructor === Number) {
2153          strBuilder.push(arg);
2154        } else if (arg.constructor === Object) {
2155          break;
2156        }
2157      }
2158      if (i > 0) {
2159        logArgs.push(strBuilder.join(""));
2160      }
2161      for (; i < args2.length; i++) {
2162        const arg = args2[i];
2163        if (!(arg instanceof Symbol)) {
2164          logArgs.push(arg);
2165        }
2166      }
2167      return logArgs;
2168    };
2169    var lastLoggingTime = getUnixTime();
2170  
2171    // node_modules/lib0/logging.js
2172    var _browserStyleMap = {
2173      [BOLD]: create5("font-weight", "bold"),
2174      [UNBOLD]: create5("font-weight", "normal"),
2175      [BLUE]: create5("color", "blue"),
2176      [GREEN]: create5("color", "green"),
2177      [GREY]: create5("color", "grey"),
2178      [RED]: create5("color", "red"),
2179      [PURPLE]: create5("color", "purple"),
2180      [ORANGE]: create5("color", "orange"),
2181      // not well supported in chrome when debugging node with inspector - TODO: deprecate
2182      [UNCOLOR]: create5("color", "black")
2183    };
2184    var computeBrowserLoggingArgs = (args2) => {
2185      if (args2.length === 1 && args2[0]?.constructor === Function) {
2186        args2 = /** @type {Array<string|Symbol|Object|number>} */
2187        /** @type {[function]} */
2188        args2[0]();
2189      }
2190      const strBuilder = [];
2191      const styles = [];
2192      const currentStyle = create();
2193      let logArgs = [];
2194      let i = 0;
2195      for (; i < args2.length; i++) {
2196        const arg = args2[i];
2197        const style = _browserStyleMap[arg];
2198        if (style !== void 0) {
2199          currentStyle.set(style.left, style.right);
2200        } else {
2201          if (arg === void 0) {
2202            break;
2203          }
2204          if (arg.constructor === String || arg.constructor === Number) {
2205            const style2 = mapToStyleString(currentStyle);
2206            if (i > 0 || style2.length > 0) {
2207              strBuilder.push("%c" + arg);
2208              styles.push(style2);
2209            } else {
2210              strBuilder.push(arg);
2211            }
2212          } else {
2213            break;
2214          }
2215        }
2216      }
2217      if (i > 0) {
2218        logArgs = styles;
2219        logArgs.unshift(strBuilder.join(""));
2220      }
2221      for (; i < args2.length; i++) {
2222        const arg = args2[i];
2223        if (!(arg instanceof Symbol)) {
2224          logArgs.push(arg);
2225        }
2226      }
2227      return logArgs;
2228    };
2229    var computeLoggingArgs = supportsColor ? computeBrowserLoggingArgs : computeNoColorLoggingArgs;
2230    var print = (...args2) => {
2231      console.log(...computeLoggingArgs(args2));
2232      vconsoles.forEach((vc) => vc.print(args2));
2233    };
2234    var warn = (...args2) => {
2235      console.warn(...computeLoggingArgs(args2));
2236      args2.unshift(ORANGE);
2237      vconsoles.forEach((vc) => vc.print(args2));
2238    };
2239    var vconsoles = create2();
2240  
2241    // node_modules/lib0/iterator.js
2242    var createIterator = (next) => ({
2243      /**
2244       * @return {IterableIterator<T>}
2245       */
2246      [Symbol.iterator]() {
2247        return this;
2248      },
2249      // @ts-ignore
2250      next
2251    });
2252    var iteratorFilter = (iterator, filter) => createIterator(() => {
2253      let res;
2254      do {
2255        res = iterator.next();
2256      } while (!res.done && !filter(res.value));
2257      return res;
2258    });
2259    var iteratorMap = (iterator, fmap) => createIterator(() => {
2260      const { done, value } = iterator.next();
2261      return { done, value: done ? void 0 : fmap(value) };
2262    });
2263  
2264    // node_modules/yjs/dist/yjs.mjs
2265    var AbstractConnector = class extends ObservableV2 {
2266      /**
2267       * @param {Doc} ydoc
2268       * @param {any} awareness
2269       */
2270      constructor(ydoc, awareness) {
2271        super();
2272        this.doc = ydoc;
2273        this.awareness = awareness;
2274      }
2275    };
2276    var DeleteItem = class {
2277      /**
2278       * @param {number} clock
2279       * @param {number} len
2280       */
2281      constructor(clock, len) {
2282        this.clock = clock;
2283        this.len = len;
2284      }
2285    };
2286    var DeleteSet = class {
2287      constructor() {
2288        this.clients = /* @__PURE__ */ new Map();
2289      }
2290    };
2291    var iterateDeletedStructs = (transaction, ds, f) => ds.clients.forEach((deletes, clientid) => {
2292      const structs = (
2293        /** @type {Array<GC|Item>} */
2294        transaction.doc.store.clients.get(clientid)
2295      );
2296      if (structs != null) {
2297        const lastStruct = structs[structs.length - 1];
2298        const clockState = lastStruct.id.clock + lastStruct.length;
2299        for (let i = 0, del = deletes[i]; i < deletes.length && del.clock < clockState; del = deletes[++i]) {
2300          iterateStructs(transaction, structs, del.clock, del.len, f);
2301        }
2302      }
2303    });
2304    var findIndexDS = (dis, clock) => {
2305      let left = 0;
2306      let right = dis.length - 1;
2307      while (left <= right) {
2308        const midindex = floor((left + right) / 2);
2309        const mid = dis[midindex];
2310        const midclock = mid.clock;
2311        if (midclock <= clock) {
2312          if (clock < midclock + mid.len) {
2313            return midindex;
2314          }
2315          left = midindex + 1;
2316        } else {
2317          right = midindex - 1;
2318        }
2319      }
2320      return null;
2321    };
2322    var isDeleted = (ds, id2) => {
2323      const dis = ds.clients.get(id2.client);
2324      return dis !== void 0 && findIndexDS(dis, id2.clock) !== null;
2325    };
2326    var sortAndMergeDeleteSet = (ds) => {
2327      ds.clients.forEach((dels) => {
2328        dels.sort((a, b) => a.clock - b.clock);
2329        let i, j;
2330        for (i = 1, j = 1; i < dels.length; i++) {
2331          const left = dels[j - 1];
2332          const right = dels[i];
2333          if (left.clock + left.len >= right.clock) {
2334            left.len = max(left.len, right.clock + right.len - left.clock);
2335          } else {
2336            if (j < i) {
2337              dels[j] = right;
2338            }
2339            j++;
2340          }
2341        }
2342        dels.length = j;
2343      });
2344    };
2345    var mergeDeleteSets = (dss) => {
2346      const merged = new DeleteSet();
2347      for (let dssI = 0; dssI < dss.length; dssI++) {
2348        dss[dssI].clients.forEach((delsLeft, client) => {
2349          if (!merged.clients.has(client)) {
2350            const dels = delsLeft.slice();
2351            for (let i = dssI + 1; i < dss.length; i++) {
2352              appendTo(dels, dss[i].clients.get(client) || []);
2353            }
2354            merged.clients.set(client, dels);
2355          }
2356        });
2357      }
2358      sortAndMergeDeleteSet(merged);
2359      return merged;
2360    };
2361    var addToDeleteSet = (ds, client, clock, length2) => {
2362      setIfUndefined(ds.clients, client, () => (
2363        /** @type {Array<DeleteItem>} */
2364        []
2365      )).push(new DeleteItem(clock, length2));
2366    };
2367    var createDeleteSet = () => new DeleteSet();
2368    var createDeleteSetFromStructStore = (ss) => {
2369      const ds = createDeleteSet();
2370      ss.clients.forEach((structs, client) => {
2371        const dsitems = [];
2372        for (let i = 0; i < structs.length; i++) {
2373          const struct = structs[i];
2374          if (struct.deleted) {
2375            const clock = struct.id.clock;
2376            let len = struct.length;
2377            if (i + 1 < structs.length) {
2378              for (let next = structs[i + 1]; i + 1 < structs.length && next.deleted; next = structs[++i + 1]) {
2379                len += next.length;
2380              }
2381            }
2382            dsitems.push(new DeleteItem(clock, len));
2383          }
2384        }
2385        if (dsitems.length > 0) {
2386          ds.clients.set(client, dsitems);
2387        }
2388      });
2389      return ds;
2390    };
2391    var writeDeleteSet = (encoder, ds) => {
2392      writeVarUint(encoder.restEncoder, ds.clients.size);
2393      from(ds.clients.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, dsitems]) => {
2394        encoder.resetDsCurVal();
2395        writeVarUint(encoder.restEncoder, client);
2396        const len = dsitems.length;
2397        writeVarUint(encoder.restEncoder, len);
2398        for (let i = 0; i < len; i++) {
2399          const item = dsitems[i];
2400          encoder.writeDsClock(item.clock);
2401          encoder.writeDsLen(item.len);
2402        }
2403      });
2404    };
2405    var readDeleteSet = (decoder) => {
2406      const ds = new DeleteSet();
2407      const numClients = readVarUint(decoder.restDecoder);
2408      for (let i = 0; i < numClients; i++) {
2409        decoder.resetDsCurVal();
2410        const client = readVarUint(decoder.restDecoder);
2411        const numberOfDeletes = readVarUint(decoder.restDecoder);
2412        if (numberOfDeletes > 0) {
2413          const dsField = setIfUndefined(ds.clients, client, () => (
2414            /** @type {Array<DeleteItem>} */
2415            []
2416          ));
2417          for (let i2 = 0; i2 < numberOfDeletes; i2++) {
2418            dsField.push(new DeleteItem(decoder.readDsClock(), decoder.readDsLen()));
2419          }
2420        }
2421      }
2422      return ds;
2423    };
2424    var readAndApplyDeleteSet = (decoder, transaction, store) => {
2425      const unappliedDS = new DeleteSet();
2426      const numClients = readVarUint(decoder.restDecoder);
2427      for (let i = 0; i < numClients; i++) {
2428        decoder.resetDsCurVal();
2429        const client = readVarUint(decoder.restDecoder);
2430        const numberOfDeletes = readVarUint(decoder.restDecoder);
2431        const structs = store.clients.get(client) || [];
2432        const state = getState(store, client);
2433        for (let i2 = 0; i2 < numberOfDeletes; i2++) {
2434          const clock = decoder.readDsClock();
2435          const clockEnd = clock + decoder.readDsLen();
2436          if (clock < state) {
2437            if (state < clockEnd) {
2438              addToDeleteSet(unappliedDS, client, state, clockEnd - state);
2439            }
2440            let index = findIndexSS(structs, clock);
2441            let struct = structs[index];
2442            if (!struct.deleted && struct.id.clock < clock) {
2443              structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock));
2444              index++;
2445            }
2446            while (index < structs.length) {
2447              struct = structs[index++];
2448              if (struct.id.clock < clockEnd) {
2449                if (!struct.deleted) {
2450                  if (clockEnd < struct.id.clock + struct.length) {
2451                    structs.splice(index, 0, splitItem(transaction, struct, clockEnd - struct.id.clock));
2452                  }
2453                  struct.delete(transaction);
2454                }
2455              } else {
2456                break;
2457              }
2458            }
2459          } else {
2460            addToDeleteSet(unappliedDS, client, clock, clockEnd - clock);
2461          }
2462        }
2463      }
2464      if (unappliedDS.clients.size > 0) {
2465        const ds = new UpdateEncoderV2();
2466        writeVarUint(ds.restEncoder, 0);
2467        writeDeleteSet(ds, unappliedDS);
2468        return ds.toUint8Array();
2469      }
2470      return null;
2471    };
2472    var equalDeleteSets = (ds1, ds2) => {
2473      if (ds1.clients.size !== ds2.clients.size) return false;
2474      for (const [client, deleteItems1] of ds1.clients.entries()) {
2475        const deleteItems2 = (
2476          /** @type {Array<import('../internals.js').DeleteItem>} */
2477          ds2.clients.get(client)
2478        );
2479        if (deleteItems2 === void 0 || deleteItems1.length !== deleteItems2.length) return false;
2480        for (let i = 0; i < deleteItems1.length; i++) {
2481          const di1 = deleteItems1[i];
2482          const di2 = deleteItems2[i];
2483          if (di1.clock !== di2.clock || di1.len !== di2.len) {
2484            return false;
2485          }
2486        }
2487      }
2488      return true;
2489    };
2490    var generateNewClientId = uint32;
2491    var Doc = class _Doc extends ObservableV2 {
2492      /**
2493       * @param {DocOpts} opts configuration
2494       */
2495      constructor({ guid = uuidv4(), collectionid = null, gc = true, gcFilter = () => true, meta = null, autoLoad = false, shouldLoad = true } = {}) {
2496        super();
2497        this.gc = gc;
2498        this.gcFilter = gcFilter;
2499        this.clientID = generateNewClientId();
2500        this.guid = guid;
2501        this.collectionid = collectionid;
2502        this.share = /* @__PURE__ */ new Map();
2503        this.store = new StructStore();
2504        this._transaction = null;
2505        this._transactionCleanups = [];
2506        this.subdocs = /* @__PURE__ */ new Set();
2507        this._item = null;
2508        this.shouldLoad = shouldLoad;
2509        this.autoLoad = autoLoad;
2510        this.meta = meta;
2511        this.isLoaded = false;
2512        this.isSynced = false;
2513        this.isDestroyed = false;
2514        this.whenLoaded = create4((resolve) => {
2515          this.on("load", () => {
2516            this.isLoaded = true;
2517            resolve(this);
2518          });
2519        });
2520        const provideSyncedPromise = () => create4((resolve) => {
2521          const eventHandler = (isSynced) => {
2522            if (isSynced === void 0 || isSynced === true) {
2523              this.off("sync", eventHandler);
2524              resolve();
2525            }
2526          };
2527          this.on("sync", eventHandler);
2528        });
2529        this.on("sync", (isSynced) => {
2530          if (isSynced === false && this.isSynced) {
2531            this.whenSynced = provideSyncedPromise();
2532          }
2533          this.isSynced = isSynced === void 0 || isSynced === true;
2534          if (this.isSynced && !this.isLoaded) {
2535            this.emit("load", [this]);
2536          }
2537        });
2538        this.whenSynced = provideSyncedPromise();
2539      }
2540      /**
2541       * Notify the parent document that you request to load data into this subdocument (if it is a subdocument).
2542       *
2543       * `load()` might be used in the future to request any provider to load the most current data.
2544       *
2545       * It is safe to call `load()` multiple times.
2546       */
2547      load() {
2548        const item = this._item;
2549        if (item !== null && !this.shouldLoad) {
2550          transact(
2551            /** @type {any} */
2552            item.parent.doc,
2553            (transaction) => {
2554              transaction.subdocsLoaded.add(this);
2555            },
2556            null,
2557            true
2558          );
2559        }
2560        this.shouldLoad = true;
2561      }
2562      getSubdocs() {
2563        return this.subdocs;
2564      }
2565      getSubdocGuids() {
2566        return new Set(from(this.subdocs).map((doc2) => doc2.guid));
2567      }
2568      /**
2569       * Changes that happen inside of a transaction are bundled. This means that
2570       * the observer fires _after_ the transaction is finished and that all changes
2571       * that happened inside of the transaction are sent as one message to the
2572       * other peers.
2573       *
2574       * @template T
2575       * @param {function(Transaction):T} f The function that should be executed as a transaction
2576       * @param {any} [origin] Origin of who started the transaction. Will be stored on transaction.origin
2577       * @return T
2578       *
2579       * @public
2580       */
2581      transact(f, origin2 = null) {
2582        return transact(this, f, origin2);
2583      }
2584      /**
2585       * Define a shared data type.
2586       *
2587       * Multiple calls of `ydoc.get(name, TypeConstructor)` yield the same result
2588       * and do not overwrite each other. I.e.
2589       * `ydoc.get(name, Y.Array) === ydoc.get(name, Y.Array)`
2590       *
2591       * After this method is called, the type is also available on `ydoc.share.get(name)`.
2592       *
2593       * *Best Practices:*
2594       * Define all types right after the Y.Doc instance is created and store them in a separate object.
2595       * Also use the typed methods `getText(name)`, `getArray(name)`, ..
2596       *
2597       * @template {typeof AbstractType<any>} Type
2598       * @example
2599       *   const ydoc = new Y.Doc(..)
2600       *   const appState = {
2601       *     document: ydoc.getText('document')
2602       *     comments: ydoc.getArray('comments')
2603       *   }
2604       *
2605       * @param {string} name
2606       * @param {Type} TypeConstructor The constructor of the type definition. E.g. Y.Text, Y.Array, Y.Map, ...
2607       * @return {InstanceType<Type>} The created type. Constructed with TypeConstructor
2608       *
2609       * @public
2610       */
2611      get(name, TypeConstructor = (
2612        /** @type {any} */
2613        AbstractType
2614      )) {
2615        const type = setIfUndefined(this.share, name, () => {
2616          const t = new TypeConstructor();
2617          t._integrate(this, null);
2618          return t;
2619        });
2620        const Constr = type.constructor;
2621        if (TypeConstructor !== AbstractType && Constr !== TypeConstructor) {
2622          if (Constr === AbstractType) {
2623            const t = new TypeConstructor();
2624            t._map = type._map;
2625            type._map.forEach(
2626              /** @param {Item?} n */
2627              (n) => {
2628                for (; n !== null; n = n.left) {
2629                  n.parent = t;
2630                }
2631              }
2632            );
2633            t._start = type._start;
2634            for (let n = t._start; n !== null; n = n.right) {
2635              n.parent = t;
2636            }
2637            t._length = type._length;
2638            this.share.set(name, t);
2639            t._integrate(this, null);
2640            return (
2641              /** @type {InstanceType<Type>} */
2642              t
2643            );
2644          } else {
2645            throw new Error(`Type with the name $name} has already been defined with a different constructor`);
2646          }
2647        }
2648        return (
2649          /** @type {InstanceType<Type>} */
2650          type
2651        );
2652      }
2653      /**
2654       * @template T
2655       * @param {string} [name]
2656       * @return {YArray<T>}
2657       *
2658       * @public
2659       */
2660      getArray(name = "") {
2661        return (
2662          /** @type {YArray<T>} */
2663          this.get(name, YArray)
2664        );
2665      }
2666      /**
2667       * @param {string} [name]
2668       * @return {YText}
2669       *
2670       * @public
2671       */
2672      getText(name = "") {
2673        return this.get(name, YText);
2674      }
2675      /**
2676       * @template T
2677       * @param {string} [name]
2678       * @return {YMap<T>}
2679       *
2680       * @public
2681       */
2682      getMap(name = "") {
2683        return (
2684          /** @type {YMap<T>} */
2685          this.get(name, YMap)
2686        );
2687      }
2688      /**
2689       * @param {string} [name]
2690       * @return {YXmlElement}
2691       *
2692       * @public
2693       */
2694      getXmlElement(name = "") {
2695        return (
2696          /** @type {YXmlElement<{[key:string]:string}>} */
2697          this.get(name, YXmlElement)
2698        );
2699      }
2700      /**
2701       * @param {string} [name]
2702       * @return {YXmlFragment}
2703       *
2704       * @public
2705       */
2706      getXmlFragment(name = "") {
2707        return this.get(name, YXmlFragment);
2708      }
2709      /**
2710       * Converts the entire document into a js object, recursively traversing each yjs type
2711       * Doesn't log types that have not been defined (using ydoc.getType(..)).
2712       *
2713       * @deprecated Do not use this method and rather call toJSON directly on the shared types.
2714       *
2715       * @return {Object<string, any>}
2716       */
2717      toJSON() {
2718        const doc2 = {};
2719        this.share.forEach((value, key) => {
2720          doc2[key] = value.toJSON();
2721        });
2722        return doc2;
2723      }
2724      /**
2725       * Emit `destroy` event and unregister all event handlers.
2726       */
2727      destroy() {
2728        this.isDestroyed = true;
2729        from(this.subdocs).forEach((subdoc) => subdoc.destroy());
2730        const item = this._item;
2731        if (item !== null) {
2732          this._item = null;
2733          const content = (
2734            /** @type {ContentDoc} */
2735            item.content
2736          );
2737          content.doc = new _Doc({ guid: this.guid, ...content.opts, shouldLoad: false });
2738          content.doc._item = item;
2739          transact(
2740            /** @type {any} */
2741            item.parent.doc,
2742            (transaction) => {
2743              const doc2 = content.doc;
2744              if (!item.deleted) {
2745                transaction.subdocsAdded.add(doc2);
2746              }
2747              transaction.subdocsRemoved.add(this);
2748            },
2749            null,
2750            true
2751          );
2752        }
2753        this.emit("destroyed", [true]);
2754        this.emit("destroy", [this]);
2755        super.destroy();
2756      }
2757    };
2758    var DSDecoderV1 = class {
2759      /**
2760       * @param {decoding.Decoder} decoder
2761       */
2762      constructor(decoder) {
2763        this.restDecoder = decoder;
2764      }
2765      resetDsCurVal() {
2766      }
2767      /**
2768       * @return {number}
2769       */
2770      readDsClock() {
2771        return readVarUint(this.restDecoder);
2772      }
2773      /**
2774       * @return {number}
2775       */
2776      readDsLen() {
2777        return readVarUint(this.restDecoder);
2778      }
2779    };
2780    var UpdateDecoderV1 = class extends DSDecoderV1 {
2781      /**
2782       * @return {ID}
2783       */
2784      readLeftID() {
2785        return createID(readVarUint(this.restDecoder), readVarUint(this.restDecoder));
2786      }
2787      /**
2788       * @return {ID}
2789       */
2790      readRightID() {
2791        return createID(readVarUint(this.restDecoder), readVarUint(this.restDecoder));
2792      }
2793      /**
2794       * Read the next client id.
2795       * Use this in favor of readID whenever possible to reduce the number of objects created.
2796       */
2797      readClient() {
2798        return readVarUint(this.restDecoder);
2799      }
2800      /**
2801       * @return {number} info An unsigned 8-bit integer
2802       */
2803      readInfo() {
2804        return readUint8(this.restDecoder);
2805      }
2806      /**
2807       * @return {string}
2808       */
2809      readString() {
2810        return readVarString(this.restDecoder);
2811      }
2812      /**
2813       * @return {boolean} isKey
2814       */
2815      readParentInfo() {
2816        return readVarUint(this.restDecoder) === 1;
2817      }
2818      /**
2819       * @return {number} info An unsigned 8-bit integer
2820       */
2821      readTypeRef() {
2822        return readVarUint(this.restDecoder);
2823      }
2824      /**
2825       * Write len of a struct - well suited for Opt RLE encoder.
2826       *
2827       * @return {number} len
2828       */
2829      readLen() {
2830        return readVarUint(this.restDecoder);
2831      }
2832      /**
2833       * @return {any}
2834       */
2835      readAny() {
2836        return readAny(this.restDecoder);
2837      }
2838      /**
2839       * @return {Uint8Array}
2840       */
2841      readBuf() {
2842        return copyUint8Array(readVarUint8Array(this.restDecoder));
2843      }
2844      /**
2845       * Legacy implementation uses JSON parse. We use any-decoding in v2.
2846       *
2847       * @return {any}
2848       */
2849      readJSON() {
2850        return JSON.parse(readVarString(this.restDecoder));
2851      }
2852      /**
2853       * @return {string}
2854       */
2855      readKey() {
2856        return readVarString(this.restDecoder);
2857      }
2858    };
2859    var DSDecoderV2 = class {
2860      /**
2861       * @param {decoding.Decoder} decoder
2862       */
2863      constructor(decoder) {
2864        this.dsCurrVal = 0;
2865        this.restDecoder = decoder;
2866      }
2867      resetDsCurVal() {
2868        this.dsCurrVal = 0;
2869      }
2870      /**
2871       * @return {number}
2872       */
2873      readDsClock() {
2874        this.dsCurrVal += readVarUint(this.restDecoder);
2875        return this.dsCurrVal;
2876      }
2877      /**
2878       * @return {number}
2879       */
2880      readDsLen() {
2881        const diff = readVarUint(this.restDecoder) + 1;
2882        this.dsCurrVal += diff;
2883        return diff;
2884      }
2885    };
2886    var UpdateDecoderV2 = class extends DSDecoderV2 {
2887      /**
2888       * @param {decoding.Decoder} decoder
2889       */
2890      constructor(decoder) {
2891        super(decoder);
2892        this.keys = [];
2893        readVarUint(decoder);
2894        this.keyClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder));
2895        this.clientDecoder = new UintOptRleDecoder(readVarUint8Array(decoder));
2896        this.leftClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder));
2897        this.rightClockDecoder = new IntDiffOptRleDecoder(readVarUint8Array(decoder));
2898        this.infoDecoder = new RleDecoder(readVarUint8Array(decoder), readUint8);
2899        this.stringDecoder = new StringDecoder(readVarUint8Array(decoder));
2900        this.parentInfoDecoder = new RleDecoder(readVarUint8Array(decoder), readUint8);
2901        this.typeRefDecoder = new UintOptRleDecoder(readVarUint8Array(decoder));
2902        this.lenDecoder = new UintOptRleDecoder(readVarUint8Array(decoder));
2903      }
2904      /**
2905       * @return {ID}
2906       */
2907      readLeftID() {
2908        return new ID(this.clientDecoder.read(), this.leftClockDecoder.read());
2909      }
2910      /**
2911       * @return {ID}
2912       */
2913      readRightID() {
2914        return new ID(this.clientDecoder.read(), this.rightClockDecoder.read());
2915      }
2916      /**
2917       * Read the next client id.
2918       * Use this in favor of readID whenever possible to reduce the number of objects created.
2919       */
2920      readClient() {
2921        return this.clientDecoder.read();
2922      }
2923      /**
2924       * @return {number} info An unsigned 8-bit integer
2925       */
2926      readInfo() {
2927        return (
2928          /** @type {number} */
2929          this.infoDecoder.read()
2930        );
2931      }
2932      /**
2933       * @return {string}
2934       */
2935      readString() {
2936        return this.stringDecoder.read();
2937      }
2938      /**
2939       * @return {boolean}
2940       */
2941      readParentInfo() {
2942        return this.parentInfoDecoder.read() === 1;
2943      }
2944      /**
2945       * @return {number} An unsigned 8-bit integer
2946       */
2947      readTypeRef() {
2948        return this.typeRefDecoder.read();
2949      }
2950      /**
2951       * Write len of a struct - well suited for Opt RLE encoder.
2952       *
2953       * @return {number}
2954       */
2955      readLen() {
2956        return this.lenDecoder.read();
2957      }
2958      /**
2959       * @return {any}
2960       */
2961      readAny() {
2962        return readAny(this.restDecoder);
2963      }
2964      /**
2965       * @return {Uint8Array}
2966       */
2967      readBuf() {
2968        return readVarUint8Array(this.restDecoder);
2969      }
2970      /**
2971       * This is mainly here for legacy purposes.
2972       *
2973       * 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.
2974       *
2975       * @return {any}
2976       */
2977      readJSON() {
2978        return readAny(this.restDecoder);
2979      }
2980      /**
2981       * @return {string}
2982       */
2983      readKey() {
2984        const keyClock = this.keyClockDecoder.read();
2985        if (keyClock < this.keys.length) {
2986          return this.keys[keyClock];
2987        } else {
2988          const key = this.stringDecoder.read();
2989          this.keys.push(key);
2990          return key;
2991        }
2992      }
2993    };
2994    var DSEncoderV1 = class {
2995      constructor() {
2996        this.restEncoder = createEncoder();
2997      }
2998      toUint8Array() {
2999        return toUint8Array(this.restEncoder);
3000      }
3001      resetDsCurVal() {
3002      }
3003      /**
3004       * @param {number} clock
3005       */
3006      writeDsClock(clock) {
3007        writeVarUint(this.restEncoder, clock);
3008      }
3009      /**
3010       * @param {number} len
3011       */
3012      writeDsLen(len) {
3013        writeVarUint(this.restEncoder, len);
3014      }
3015    };
3016    var UpdateEncoderV1 = class extends DSEncoderV1 {
3017      /**
3018       * @param {ID} id
3019       */
3020      writeLeftID(id2) {
3021        writeVarUint(this.restEncoder, id2.client);
3022        writeVarUint(this.restEncoder, id2.clock);
3023      }
3024      /**
3025       * @param {ID} id
3026       */
3027      writeRightID(id2) {
3028        writeVarUint(this.restEncoder, id2.client);
3029        writeVarUint(this.restEncoder, id2.clock);
3030      }
3031      /**
3032       * Use writeClient and writeClock instead of writeID if possible.
3033       * @param {number} client
3034       */
3035      writeClient(client) {
3036        writeVarUint(this.restEncoder, client);
3037      }
3038      /**
3039       * @param {number} info An unsigned 8-bit integer
3040       */
3041      writeInfo(info) {
3042        writeUint8(this.restEncoder, info);
3043      }
3044      /**
3045       * @param {string} s
3046       */
3047      writeString(s) {
3048        writeVarString(this.restEncoder, s);
3049      }
3050      /**
3051       * @param {boolean} isYKey
3052       */
3053      writeParentInfo(isYKey) {
3054        writeVarUint(this.restEncoder, isYKey ? 1 : 0);
3055      }
3056      /**
3057       * @param {number} info An unsigned 8-bit integer
3058       */
3059      writeTypeRef(info) {
3060        writeVarUint(this.restEncoder, info);
3061      }
3062      /**
3063       * Write len of a struct - well suited for Opt RLE encoder.
3064       *
3065       * @param {number} len
3066       */
3067      writeLen(len) {
3068        writeVarUint(this.restEncoder, len);
3069      }
3070      /**
3071       * @param {any} any
3072       */
3073      writeAny(any2) {
3074        writeAny(this.restEncoder, any2);
3075      }
3076      /**
3077       * @param {Uint8Array} buf
3078       */
3079      writeBuf(buf) {
3080        writeVarUint8Array(this.restEncoder, buf);
3081      }
3082      /**
3083       * @param {any} embed
3084       */
3085      writeJSON(embed) {
3086        writeVarString(this.restEncoder, JSON.stringify(embed));
3087      }
3088      /**
3089       * @param {string} key
3090       */
3091      writeKey(key) {
3092        writeVarString(this.restEncoder, key);
3093      }
3094    };
3095    var DSEncoderV2 = class {
3096      constructor() {
3097        this.restEncoder = createEncoder();
3098        this.dsCurrVal = 0;
3099      }
3100      toUint8Array() {
3101        return toUint8Array(this.restEncoder);
3102      }
3103      resetDsCurVal() {
3104        this.dsCurrVal = 0;
3105      }
3106      /**
3107       * @param {number} clock
3108       */
3109      writeDsClock(clock) {
3110        const diff = clock - this.dsCurrVal;
3111        this.dsCurrVal = clock;
3112        writeVarUint(this.restEncoder, diff);
3113      }
3114      /**
3115       * @param {number} len
3116       */
3117      writeDsLen(len) {
3118        if (len === 0) {
3119          unexpectedCase();
3120        }
3121        writeVarUint(this.restEncoder, len - 1);
3122        this.dsCurrVal += len;
3123      }
3124    };
3125    var UpdateEncoderV2 = class extends DSEncoderV2 {
3126      constructor() {
3127        super();
3128        this.keyMap = /* @__PURE__ */ new Map();
3129        this.keyClock = 0;
3130        this.keyClockEncoder = new IntDiffOptRleEncoder();
3131        this.clientEncoder = new UintOptRleEncoder();
3132        this.leftClockEncoder = new IntDiffOptRleEncoder();
3133        this.rightClockEncoder = new IntDiffOptRleEncoder();
3134        this.infoEncoder = new RleEncoder(writeUint8);
3135        this.stringEncoder = new StringEncoder();
3136        this.parentInfoEncoder = new RleEncoder(writeUint8);
3137        this.typeRefEncoder = new UintOptRleEncoder();
3138        this.lenEncoder = new UintOptRleEncoder();
3139      }
3140      toUint8Array() {
3141        const encoder = createEncoder();
3142        writeVarUint(encoder, 0);
3143        writeVarUint8Array(encoder, this.keyClockEncoder.toUint8Array());
3144        writeVarUint8Array(encoder, this.clientEncoder.toUint8Array());
3145        writeVarUint8Array(encoder, this.leftClockEncoder.toUint8Array());
3146        writeVarUint8Array(encoder, this.rightClockEncoder.toUint8Array());
3147        writeVarUint8Array(encoder, toUint8Array(this.infoEncoder));
3148        writeVarUint8Array(encoder, this.stringEncoder.toUint8Array());
3149        writeVarUint8Array(encoder, toUint8Array(this.parentInfoEncoder));
3150        writeVarUint8Array(encoder, this.typeRefEncoder.toUint8Array());
3151        writeVarUint8Array(encoder, this.lenEncoder.toUint8Array());
3152        writeUint8Array(encoder, toUint8Array(this.restEncoder));
3153        return toUint8Array(encoder);
3154      }
3155      /**
3156       * @param {ID} id
3157       */
3158      writeLeftID(id2) {
3159        this.clientEncoder.write(id2.client);
3160        this.leftClockEncoder.write(id2.clock);
3161      }
3162      /**
3163       * @param {ID} id
3164       */
3165      writeRightID(id2) {
3166        this.clientEncoder.write(id2.client);
3167        this.rightClockEncoder.write(id2.clock);
3168      }
3169      /**
3170       * @param {number} client
3171       */
3172      writeClient(client) {
3173        this.clientEncoder.write(client);
3174      }
3175      /**
3176       * @param {number} info An unsigned 8-bit integer
3177       */
3178      writeInfo(info) {
3179        this.infoEncoder.write(info);
3180      }
3181      /**
3182       * @param {string} s
3183       */
3184      writeString(s) {
3185        this.stringEncoder.write(s);
3186      }
3187      /**
3188       * @param {boolean} isYKey
3189       */
3190      writeParentInfo(isYKey) {
3191        this.parentInfoEncoder.write(isYKey ? 1 : 0);
3192      }
3193      /**
3194       * @param {number} info An unsigned 8-bit integer
3195       */
3196      writeTypeRef(info) {
3197        this.typeRefEncoder.write(info);
3198      }
3199      /**
3200       * Write len of a struct - well suited for Opt RLE encoder.
3201       *
3202       * @param {number} len
3203       */
3204      writeLen(len) {
3205        this.lenEncoder.write(len);
3206      }
3207      /**
3208       * @param {any} any
3209       */
3210      writeAny(any2) {
3211        writeAny(this.restEncoder, any2);
3212      }
3213      /**
3214       * @param {Uint8Array} buf
3215       */
3216      writeBuf(buf) {
3217        writeVarUint8Array(this.restEncoder, buf);
3218      }
3219      /**
3220       * This is mainly here for legacy purposes.
3221       *
3222       * 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.
3223       *
3224       * @param {any} embed
3225       */
3226      writeJSON(embed) {
3227        writeAny(this.restEncoder, embed);
3228      }
3229      /**
3230       * Property keys are often reused. For example, in y-prosemirror the key `bold` might
3231       * occur very often. For a 3d application, the key `position` might occur very often.
3232       *
3233       * We cache these keys in a Map and refer to them via a unique number.
3234       *
3235       * @param {string} key
3236       */
3237      writeKey(key) {
3238        const clock = this.keyMap.get(key);
3239        if (clock === void 0) {
3240          this.keyClockEncoder.write(this.keyClock++);
3241          this.stringEncoder.write(key);
3242        } else {
3243          this.keyClockEncoder.write(clock);
3244        }
3245      }
3246    };
3247    var writeStructs = (encoder, structs, client, clock) => {
3248      clock = max(clock, structs[0].id.clock);
3249      const startNewStructs = findIndexSS(structs, clock);
3250      writeVarUint(encoder.restEncoder, structs.length - startNewStructs);
3251      encoder.writeClient(client);
3252      writeVarUint(encoder.restEncoder, clock);
3253      const firstStruct = structs[startNewStructs];
3254      firstStruct.write(encoder, clock - firstStruct.id.clock);
3255      for (let i = startNewStructs + 1; i < structs.length; i++) {
3256        structs[i].write(encoder, 0);
3257      }
3258    };
3259    var writeClientsStructs = (encoder, store, _sm) => {
3260      const sm = /* @__PURE__ */ new Map();
3261      _sm.forEach((clock, client) => {
3262        if (getState(store, client) > clock) {
3263          sm.set(client, clock);
3264        }
3265      });
3266      getStateVector(store).forEach((_clock, client) => {
3267        if (!_sm.has(client)) {
3268          sm.set(client, 0);
3269        }
3270      });
3271      writeVarUint(encoder.restEncoder, sm.size);
3272      from(sm.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {
3273        writeStructs(
3274          encoder,
3275          /** @type {Array<GC|Item>} */
3276          store.clients.get(client),
3277          client,
3278          clock
3279        );
3280      });
3281    };
3282    var readClientsStructRefs = (decoder, doc2) => {
3283      const clientRefs = create();
3284      const numOfStateUpdates = readVarUint(decoder.restDecoder);
3285      for (let i = 0; i < numOfStateUpdates; i++) {
3286        const numberOfStructs = readVarUint(decoder.restDecoder);
3287        const refs = new Array(numberOfStructs);
3288        const client = decoder.readClient();
3289        let clock = readVarUint(decoder.restDecoder);
3290        clientRefs.set(client, { i: 0, refs });
3291        for (let i2 = 0; i2 < numberOfStructs; i2++) {
3292          const info = decoder.readInfo();
3293          switch (BITS5 & info) {
3294            case 0: {
3295              const len = decoder.readLen();
3296              refs[i2] = new GC(createID(client, clock), len);
3297              clock += len;
3298              break;
3299            }
3300            case 10: {
3301              const len = readVarUint(decoder.restDecoder);
3302              refs[i2] = new Skip(createID(client, clock), len);
3303              clock += len;
3304              break;
3305            }
3306            default: {
3307              const cantCopyParentInfo = (info & (BIT7 | BIT8)) === 0;
3308              const struct = new Item(
3309                createID(client, clock),
3310                null,
3311                // left
3312                (info & BIT8) === BIT8 ? decoder.readLeftID() : null,
3313                // origin
3314                null,
3315                // right
3316                (info & BIT7) === BIT7 ? decoder.readRightID() : null,
3317                // right origin
3318                cantCopyParentInfo ? decoder.readParentInfo() ? doc2.get(decoder.readString()) : decoder.readLeftID() : null,
3319                // parent
3320                cantCopyParentInfo && (info & BIT6) === BIT6 ? decoder.readString() : null,
3321                // parentSub
3322                readItemContent(decoder, info)
3323                // item content
3324              );
3325              refs[i2] = struct;
3326              clock += struct.length;
3327            }
3328          }
3329        }
3330      }
3331      return clientRefs;
3332    };
3333    var integrateStructs = (transaction, store, clientsStructRefs) => {
3334      const stack = [];
3335      let clientsStructRefsIds = from(clientsStructRefs.keys()).sort((a, b) => a - b);
3336      if (clientsStructRefsIds.length === 0) {
3337        return null;
3338      }
3339      const getNextStructTarget = () => {
3340        if (clientsStructRefsIds.length === 0) {
3341          return null;
3342        }
3343        let nextStructsTarget = (
3344          /** @type {{i:number,refs:Array<GC|Item>}} */
3345          clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1])
3346        );
3347        while (nextStructsTarget.refs.length === nextStructsTarget.i) {
3348          clientsStructRefsIds.pop();
3349          if (clientsStructRefsIds.length > 0) {
3350            nextStructsTarget = /** @type {{i:number,refs:Array<GC|Item>}} */
3351            clientsStructRefs.get(clientsStructRefsIds[clientsStructRefsIds.length - 1]);
3352          } else {
3353            return null;
3354          }
3355        }
3356        return nextStructsTarget;
3357      };
3358      let curStructsTarget = getNextStructTarget();
3359      if (curStructsTarget === null) {
3360        return null;
3361      }
3362      const restStructs = new StructStore();
3363      const missingSV = /* @__PURE__ */ new Map();
3364      const updateMissingSv = (client, clock) => {
3365        const mclock = missingSV.get(client);
3366        if (mclock == null || mclock > clock) {
3367          missingSV.set(client, clock);
3368        }
3369      };
3370      let stackHead = (
3371        /** @type {any} */
3372        curStructsTarget.refs[
3373          /** @type {any} */
3374          curStructsTarget.i++
3375        ]
3376      );
3377      const state = /* @__PURE__ */ new Map();
3378      const addStackToRestSS = () => {
3379        for (const item of stack) {
3380          const client = item.id.client;
3381          const inapplicableItems = clientsStructRefs.get(client);
3382          if (inapplicableItems) {
3383            inapplicableItems.i--;
3384            restStructs.clients.set(client, inapplicableItems.refs.slice(inapplicableItems.i));
3385            clientsStructRefs.delete(client);
3386            inapplicableItems.i = 0;
3387            inapplicableItems.refs = [];
3388          } else {
3389            restStructs.clients.set(client, [item]);
3390          }
3391          clientsStructRefsIds = clientsStructRefsIds.filter((c) => c !== client);
3392        }
3393        stack.length = 0;
3394      };
3395      while (true) {
3396        if (stackHead.constructor !== Skip) {
3397          const localClock = setIfUndefined(state, stackHead.id.client, () => getState(store, stackHead.id.client));
3398          const offset = localClock - stackHead.id.clock;
3399          if (offset < 0) {
3400            stack.push(stackHead);
3401            updateMissingSv(stackHead.id.client, stackHead.id.clock - 1);
3402            addStackToRestSS();
3403          } else {
3404            const missing = stackHead.getMissing(transaction, store);
3405            if (missing !== null) {
3406              stack.push(stackHead);
3407              const structRefs = clientsStructRefs.get(
3408                /** @type {number} */
3409                missing
3410              ) || { refs: [], i: 0 };
3411              if (structRefs.refs.length === structRefs.i) {
3412                updateMissingSv(
3413                  /** @type {number} */
3414                  missing,
3415                  getState(store, missing)
3416                );
3417                addStackToRestSS();
3418              } else {
3419                stackHead = structRefs.refs[structRefs.i++];
3420                continue;
3421              }
3422            } else if (offset === 0 || offset < stackHead.length) {
3423              stackHead.integrate(transaction, offset);
3424              state.set(stackHead.id.client, stackHead.id.clock + stackHead.length);
3425            }
3426          }
3427        }
3428        if (stack.length > 0) {
3429          stackHead = /** @type {GC|Item} */
3430          stack.pop();
3431        } else if (curStructsTarget !== null && curStructsTarget.i < curStructsTarget.refs.length) {
3432          stackHead = /** @type {GC|Item} */
3433          curStructsTarget.refs[curStructsTarget.i++];
3434        } else {
3435          curStructsTarget = getNextStructTarget();
3436          if (curStructsTarget === null) {
3437            break;
3438          } else {
3439            stackHead = /** @type {GC|Item} */
3440            curStructsTarget.refs[curStructsTarget.i++];
3441          }
3442        }
3443      }
3444      if (restStructs.clients.size > 0) {
3445        const encoder = new UpdateEncoderV2();
3446        writeClientsStructs(encoder, restStructs, /* @__PURE__ */ new Map());
3447        writeVarUint(encoder.restEncoder, 0);
3448        return { missing: missingSV, update: encoder.toUint8Array() };
3449      }
3450      return null;
3451    };
3452    var writeStructsFromTransaction = (encoder, transaction) => writeClientsStructs(encoder, transaction.doc.store, transaction.beforeState);
3453    var readUpdateV2 = (decoder, ydoc, transactionOrigin, structDecoder = new UpdateDecoderV2(decoder)) => transact(ydoc, (transaction) => {
3454      transaction.local = false;
3455      let retry = false;
3456      const doc2 = transaction.doc;
3457      const store = doc2.store;
3458      const ss = readClientsStructRefs(structDecoder, doc2);
3459      const restStructs = integrateStructs(transaction, store, ss);
3460      const pending = store.pendingStructs;
3461      if (pending) {
3462        for (const [client, clock] of pending.missing) {
3463          if (clock < getState(store, client)) {
3464            retry = true;
3465            break;
3466          }
3467        }
3468        if (restStructs) {
3469          for (const [client, clock] of restStructs.missing) {
3470            const mclock = pending.missing.get(client);
3471            if (mclock == null || mclock > clock) {
3472              pending.missing.set(client, clock);
3473            }
3474          }
3475          pending.update = mergeUpdatesV2([pending.update, restStructs.update]);
3476        }
3477      } else {
3478        store.pendingStructs = restStructs;
3479      }
3480      const dsRest = readAndApplyDeleteSet(structDecoder, transaction, store);
3481      if (store.pendingDs) {
3482        const pendingDSUpdate = new UpdateDecoderV2(createDecoder(store.pendingDs));
3483        readVarUint(pendingDSUpdate.restDecoder);
3484        const dsRest2 = readAndApplyDeleteSet(pendingDSUpdate, transaction, store);
3485        if (dsRest && dsRest2) {
3486          store.pendingDs = mergeUpdatesV2([dsRest, dsRest2]);
3487        } else {
3488          store.pendingDs = dsRest || dsRest2;
3489        }
3490      } else {
3491        store.pendingDs = dsRest;
3492      }
3493      if (retry) {
3494        const update = (
3495          /** @type {{update: Uint8Array}} */
3496          store.pendingStructs.update
3497        );
3498        store.pendingStructs = null;
3499        applyUpdateV2(transaction.doc, update);
3500      }
3501    }, transactionOrigin, false);
3502    var readUpdate = (decoder, ydoc, transactionOrigin) => readUpdateV2(decoder, ydoc, transactionOrigin, new UpdateDecoderV1(decoder));
3503    var applyUpdateV2 = (ydoc, update, transactionOrigin, YDecoder = UpdateDecoderV2) => {
3504      const decoder = createDecoder(update);
3505      readUpdateV2(decoder, ydoc, transactionOrigin, new YDecoder(decoder));
3506    };
3507    var applyUpdate = (ydoc, update, transactionOrigin) => applyUpdateV2(ydoc, update, transactionOrigin, UpdateDecoderV1);
3508    var writeStateAsUpdate = (encoder, doc2, targetStateVector = /* @__PURE__ */ new Map()) => {
3509      writeClientsStructs(encoder, doc2.store, targetStateVector);
3510      writeDeleteSet(encoder, createDeleteSetFromStructStore(doc2.store));
3511    };
3512    var encodeStateAsUpdateV2 = (doc2, encodedTargetStateVector = new Uint8Array([0]), encoder = new UpdateEncoderV2()) => {
3513      const targetStateVector = decodeStateVector(encodedTargetStateVector);
3514      writeStateAsUpdate(encoder, doc2, targetStateVector);
3515      const updates = [encoder.toUint8Array()];
3516      if (doc2.store.pendingDs) {
3517        updates.push(doc2.store.pendingDs);
3518      }
3519      if (doc2.store.pendingStructs) {
3520        updates.push(diffUpdateV2(doc2.store.pendingStructs.update, encodedTargetStateVector));
3521      }
3522      if (updates.length > 1) {
3523        if (encoder.constructor === UpdateEncoderV1) {
3524          return mergeUpdates(updates.map((update, i) => i === 0 ? update : convertUpdateFormatV2ToV1(update)));
3525        } else if (encoder.constructor === UpdateEncoderV2) {
3526          return mergeUpdatesV2(updates);
3527        }
3528      }
3529      return updates[0];
3530    };
3531    var encodeStateAsUpdate = (doc2, encodedTargetStateVector) => encodeStateAsUpdateV2(doc2, encodedTargetStateVector, new UpdateEncoderV1());
3532    var readStateVector = (decoder) => {
3533      const ss = /* @__PURE__ */ new Map();
3534      const ssLength = readVarUint(decoder.restDecoder);
3535      for (let i = 0; i < ssLength; i++) {
3536        const client = readVarUint(decoder.restDecoder);
3537        const clock = readVarUint(decoder.restDecoder);
3538        ss.set(client, clock);
3539      }
3540      return ss;
3541    };
3542    var decodeStateVector = (decodedState) => readStateVector(new DSDecoderV1(createDecoder(decodedState)));
3543    var writeStateVector = (encoder, sv) => {
3544      writeVarUint(encoder.restEncoder, sv.size);
3545      from(sv.entries()).sort((a, b) => b[0] - a[0]).forEach(([client, clock]) => {
3546        writeVarUint(encoder.restEncoder, client);
3547        writeVarUint(encoder.restEncoder, clock);
3548      });
3549      return encoder;
3550    };
3551    var writeDocumentStateVector = (encoder, doc2) => writeStateVector(encoder, getStateVector(doc2.store));
3552    var encodeStateVectorV2 = (doc2, encoder = new DSEncoderV2()) => {
3553      if (doc2 instanceof Map) {
3554        writeStateVector(encoder, doc2);
3555      } else {
3556        writeDocumentStateVector(encoder, doc2);
3557      }
3558      return encoder.toUint8Array();
3559    };
3560    var encodeStateVector = (doc2) => encodeStateVectorV2(doc2, new DSEncoderV1());
3561    var EventHandler = class {
3562      constructor() {
3563        this.l = [];
3564      }
3565    };
3566    var createEventHandler = () => new EventHandler();
3567    var addEventHandlerListener = (eventHandler, f) => eventHandler.l.push(f);
3568    var removeEventHandlerListener = (eventHandler, f) => {
3569      const l = eventHandler.l;
3570      const len = l.length;
3571      eventHandler.l = l.filter((g) => f !== g);
3572      if (len === eventHandler.l.length) {
3573        console.error("[yjs] Tried to remove event handler that doesn't exist.");
3574      }
3575    };
3576    var callEventHandlerListeners = (eventHandler, arg0, arg1) => callAll(eventHandler.l, [arg0, arg1]);
3577    var ID = class {
3578      /**
3579       * @param {number} client client id
3580       * @param {number} clock unique per client id, continuous number
3581       */
3582      constructor(client, clock) {
3583        this.client = client;
3584        this.clock = clock;
3585      }
3586    };
3587    var compareIDs = (a, b) => a === b || a !== null && b !== null && a.client === b.client && a.clock === b.clock;
3588    var createID = (client, clock) => new ID(client, clock);
3589    var writeID = (encoder, id2) => {
3590      writeVarUint(encoder, id2.client);
3591      writeVarUint(encoder, id2.clock);
3592    };
3593    var readID = (decoder) => createID(readVarUint(decoder), readVarUint(decoder));
3594    var findRootTypeKey = (type) => {
3595      for (const [key, value] of type.doc.share.entries()) {
3596        if (value === type) {
3597          return key;
3598        }
3599      }
3600      throw unexpectedCase();
3601    };
3602    var isParentOf = (parent, child) => {
3603      while (child !== null) {
3604        if (child.parent === parent) {
3605          return true;
3606        }
3607        child = /** @type {AbstractType<any>} */
3608        child.parent._item;
3609      }
3610      return false;
3611    };
3612    var logType = (type) => {
3613      const res = [];
3614      let n = type._start;
3615      while (n) {
3616        res.push(n);
3617        n = n.right;
3618      }
3619      console.log("Children: ", res);
3620      console.log("Children content: ", res.filter((m) => !m.deleted).map((m) => m.content));
3621    };
3622    var PermanentUserData = class {
3623      /**
3624       * @param {Doc} doc
3625       * @param {YMap<any>} [storeType]
3626       */
3627      constructor(doc2, storeType = doc2.getMap("users")) {
3628        const dss = /* @__PURE__ */ new Map();
3629        this.yusers = storeType;
3630        this.doc = doc2;
3631        this.clients = /* @__PURE__ */ new Map();
3632        this.dss = dss;
3633        const initUser = (user, userDescription) => {
3634          const ds = user.get("ds");
3635          const ids = user.get("ids");
3636          const addClientId = (
3637            /** @param {number} clientid */
3638            (clientid) => this.clients.set(clientid, userDescription)
3639          );
3640          ds.observe(
3641            /** @param {YArrayEvent<any>} event */
3642            (event) => {
3643              event.changes.added.forEach((item) => {
3644                item.content.getContent().forEach((encodedDs) => {
3645                  if (encodedDs instanceof Uint8Array) {
3646                    this.dss.set(userDescription, mergeDeleteSets([this.dss.get(userDescription) || createDeleteSet(), readDeleteSet(new DSDecoderV1(createDecoder(encodedDs)))]));
3647                  }
3648                });
3649              });
3650            }
3651          );
3652          this.dss.set(userDescription, mergeDeleteSets(ds.map((encodedDs) => readDeleteSet(new DSDecoderV1(createDecoder(encodedDs))))));
3653          ids.observe(
3654            /** @param {YArrayEvent<any>} event */
3655            (event) => event.changes.added.forEach((item) => item.content.getContent().forEach(addClientId))
3656          );
3657          ids.forEach(addClientId);
3658        };
3659        storeType.observe((event) => {
3660          event.keysChanged.forEach(
3661            (userDescription) => initUser(storeType.get(userDescription), userDescription)
3662          );
3663        });
3664        storeType.forEach(initUser);
3665      }
3666      /**
3667       * @param {Doc} doc
3668       * @param {number} clientid
3669       * @param {string} userDescription
3670       * @param {Object} conf
3671       * @param {function(Transaction, DeleteSet):boolean} [conf.filter]
3672       */
3673      setUserMapping(doc2, clientid, userDescription, { filter = () => true } = {}) {
3674        const users = this.yusers;
3675        let user = users.get(userDescription);
3676        if (!user) {
3677          user = new YMap();
3678          user.set("ids", new YArray());
3679          user.set("ds", new YArray());
3680          users.set(userDescription, user);
3681        }
3682        user.get("ids").push([clientid]);
3683        users.observe((_event) => {
3684          setTimeout(() => {
3685            const userOverwrite = users.get(userDescription);
3686            if (userOverwrite !== user) {
3687              user = userOverwrite;
3688              this.clients.forEach((_userDescription, clientid2) => {
3689                if (userDescription === _userDescription) {
3690                  user.get("ids").push([clientid2]);
3691                }
3692              });
3693              const encoder = new DSEncoderV1();
3694              const ds = this.dss.get(userDescription);
3695              if (ds) {
3696                writeDeleteSet(encoder, ds);
3697                user.get("ds").push([encoder.toUint8Array()]);
3698              }
3699            }
3700          }, 0);
3701        });
3702        doc2.on(
3703          "afterTransaction",
3704          /** @param {Transaction} transaction */
3705          (transaction) => {
3706            setTimeout(() => {
3707              const yds = user.get("ds");
3708              const ds = transaction.deleteSet;
3709              if (transaction.local && ds.clients.size > 0 && filter(transaction, ds)) {
3710                const encoder = new DSEncoderV1();
3711                writeDeleteSet(encoder, ds);
3712                yds.push([encoder.toUint8Array()]);
3713              }
3714            });
3715          }
3716        );
3717      }
3718      /**
3719       * @param {number} clientid
3720       * @return {any}
3721       */
3722      getUserByClientId(clientid) {
3723        return this.clients.get(clientid) || null;
3724      }
3725      /**
3726       * @param {ID} id
3727       * @return {string | null}
3728       */
3729      getUserByDeletedId(id2) {
3730        for (const [userDescription, ds] of this.dss.entries()) {
3731          if (isDeleted(ds, id2)) {
3732            return userDescription;
3733          }
3734        }
3735        return null;
3736      }
3737    };
3738    var RelativePosition = class {
3739      /**
3740       * @param {ID|null} type
3741       * @param {string|null} tname
3742       * @param {ID|null} item
3743       * @param {number} assoc
3744       */
3745      constructor(type, tname, item, assoc = 0) {
3746        this.type = type;
3747        this.tname = tname;
3748        this.item = item;
3749        this.assoc = assoc;
3750      }
3751    };
3752    var relativePositionToJSON = (rpos) => {
3753      const json = {};
3754      if (rpos.type) {
3755        json.type = rpos.type;
3756      }
3757      if (rpos.tname) {
3758        json.tname = rpos.tname;
3759      }
3760      if (rpos.item) {
3761        json.item = rpos.item;
3762      }
3763      if (rpos.assoc != null) {
3764        json.assoc = rpos.assoc;
3765      }
3766      return json;
3767    };
3768    var 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);
3769    var AbsolutePosition = class {
3770      /**
3771       * @param {AbstractType<any>} type
3772       * @param {number} index
3773       * @param {number} [assoc]
3774       */
3775      constructor(type, index, assoc = 0) {
3776        this.type = type;
3777        this.index = index;
3778        this.assoc = assoc;
3779      }
3780    };
3781    var createAbsolutePosition = (type, index, assoc = 0) => new AbsolutePosition(type, index, assoc);
3782    var createRelativePosition = (type, item, assoc) => {
3783      let typeid = null;
3784      let tname = null;
3785      if (type._item === null) {
3786        tname = findRootTypeKey(type);
3787      } else {
3788        typeid = createID(type._item.id.client, type._item.id.clock);
3789      }
3790      return new RelativePosition(typeid, tname, item, assoc);
3791    };
3792    var createRelativePositionFromTypeIndex = (type, index, assoc = 0) => {
3793      let t = type._start;
3794      if (assoc < 0) {
3795        if (index === 0) {
3796          return createRelativePosition(type, null, assoc);
3797        }
3798        index--;
3799      }
3800      while (t !== null) {
3801        if (!t.deleted && t.countable) {
3802          if (t.length > index) {
3803            return createRelativePosition(type, createID(t.id.client, t.id.clock + index), assoc);
3804          }
3805          index -= t.length;
3806        }
3807        if (t.right === null && assoc < 0) {
3808          return createRelativePosition(type, t.lastId, assoc);
3809        }
3810        t = t.right;
3811      }
3812      return createRelativePosition(type, null, assoc);
3813    };
3814    var writeRelativePosition = (encoder, rpos) => {
3815      const { type, tname, item, assoc } = rpos;
3816      if (item !== null) {
3817        writeVarUint(encoder, 0);
3818        writeID(encoder, item);
3819      } else if (tname !== null) {
3820        writeUint8(encoder, 1);
3821        writeVarString(encoder, tname);
3822      } else if (type !== null) {
3823        writeUint8(encoder, 2);
3824        writeID(encoder, type);
3825      } else {
3826        throw unexpectedCase();
3827      }
3828      writeVarInt(encoder, assoc);
3829      return encoder;
3830    };
3831    var encodeRelativePosition = (rpos) => {
3832      const encoder = createEncoder();
3833      writeRelativePosition(encoder, rpos);
3834      return toUint8Array(encoder);
3835    };
3836    var readRelativePosition = (decoder) => {
3837      let type = null;
3838      let tname = null;
3839      let itemID = null;
3840      switch (readVarUint(decoder)) {
3841        case 0:
3842          itemID = readID(decoder);
3843          break;
3844        case 1:
3845          tname = readVarString(decoder);
3846          break;
3847        case 2: {
3848          type = readID(decoder);
3849        }
3850      }
3851      const assoc = hasContent(decoder) ? readVarInt(decoder) : 0;
3852      return new RelativePosition(type, tname, itemID, assoc);
3853    };
3854    var decodeRelativePosition = (uint8Array) => readRelativePosition(createDecoder(uint8Array));
3855    var getItemWithOffset = (store, id2) => {
3856      const item = getItem(store, id2);
3857      const diff = id2.clock - item.id.clock;
3858      return {
3859        item,
3860        diff
3861      };
3862    };
3863    var createAbsolutePositionFromRelativePosition = (rpos, doc2, followUndoneDeletions = true) => {
3864      const store = doc2.store;
3865      const rightID = rpos.item;
3866      const typeID = rpos.type;
3867      const tname = rpos.tname;
3868      const assoc = rpos.assoc;
3869      let type = null;
3870      let index = 0;
3871      if (rightID !== null) {
3872        if (getState(store, rightID.client) <= rightID.clock) {
3873          return null;
3874        }
3875        const res = followUndoneDeletions ? followRedone(store, rightID) : getItemWithOffset(store, rightID);
3876        const right = res.item;
3877        if (!(right instanceof Item)) {
3878          return null;
3879        }
3880        type = /** @type {AbstractType<any>} */
3881        right.parent;
3882        if (type._item === null || !type._item.deleted) {
3883          index = right.deleted || !right.countable ? 0 : res.diff + (assoc >= 0 ? 0 : 1);
3884          let n = right.left;
3885          while (n !== null) {
3886            if (!n.deleted && n.countable) {
3887              index += n.length;
3888            }
3889            n = n.left;
3890          }
3891        }
3892      } else {
3893        if (tname !== null) {
3894          type = doc2.get(tname);
3895        } else if (typeID !== null) {
3896          if (getState(store, typeID.client) <= typeID.clock) {
3897            return null;
3898          }
3899          const { item } = followUndoneDeletions ? followRedone(store, typeID) : { item: getItem(store, typeID) };
3900          if (item instanceof Item && item.content instanceof ContentType) {
3901            type = item.content.type;
3902          } else {
3903            return null;
3904          }
3905        } else {
3906          throw unexpectedCase();
3907        }
3908        if (assoc >= 0) {
3909          index = type._length;
3910        } else {
3911          index = 0;
3912        }
3913      }
3914      return createAbsolutePosition(type, index, rpos.assoc);
3915    };
3916    var compareRelativePositions = (a, b) => a === b || a !== null && b !== null && a.tname === b.tname && compareIDs(a.item, b.item) && compareIDs(a.type, b.type) && a.assoc === b.assoc;
3917    var Snapshot = class {
3918      /**
3919       * @param {DeleteSet} ds
3920       * @param {Map<number,number>} sv state map
3921       */
3922      constructor(ds, sv) {
3923        this.ds = ds;
3924        this.sv = sv;
3925      }
3926    };
3927    var equalSnapshots = (snap1, snap2) => {
3928      const ds1 = snap1.ds.clients;
3929      const ds2 = snap2.ds.clients;
3930      const sv1 = snap1.sv;
3931      const sv2 = snap2.sv;
3932      if (sv1.size !== sv2.size || ds1.size !== ds2.size) {
3933        return false;
3934      }
3935      for (const [key, value] of sv1.entries()) {
3936        if (sv2.get(key) !== value) {
3937          return false;
3938        }
3939      }
3940      for (const [client, dsitems1] of ds1.entries()) {
3941        const dsitems2 = ds2.get(client) || [];
3942        if (dsitems1.length !== dsitems2.length) {
3943          return false;
3944        }
3945        for (let i = 0; i < dsitems1.length; i++) {
3946          const dsitem1 = dsitems1[i];
3947          const dsitem2 = dsitems2[i];
3948          if (dsitem1.clock !== dsitem2.clock || dsitem1.len !== dsitem2.len) {
3949            return false;
3950          }
3951        }
3952      }
3953      return true;
3954    };
3955    var encodeSnapshotV2 = (snapshot2, encoder = new DSEncoderV2()) => {
3956      writeDeleteSet(encoder, snapshot2.ds);
3957      writeStateVector(encoder, snapshot2.sv);
3958      return encoder.toUint8Array();
3959    };
3960    var encodeSnapshot = (snapshot2) => encodeSnapshotV2(snapshot2, new DSEncoderV1());
3961    var decodeSnapshotV2 = (buf, decoder = new DSDecoderV2(createDecoder(buf))) => {
3962      return new Snapshot(readDeleteSet(decoder), readStateVector(decoder));
3963    };
3964    var decodeSnapshot = (buf) => decodeSnapshotV2(buf, new DSDecoderV1(createDecoder(buf)));
3965    var createSnapshot = (ds, sm) => new Snapshot(ds, sm);
3966    var emptySnapshot = createSnapshot(createDeleteSet(), /* @__PURE__ */ new Map());
3967    var snapshot = (doc2) => createSnapshot(createDeleteSetFromStructStore(doc2.store), getStateVector(doc2.store));
3968    var isVisible = (item, snapshot2) => snapshot2 === void 0 ? !item.deleted : snapshot2.sv.has(item.id.client) && (snapshot2.sv.get(item.id.client) || 0) > item.id.clock && !isDeleted(snapshot2.ds, item.id);
3969    var splitSnapshotAffectedStructs = (transaction, snapshot2) => {
3970      const meta = setIfUndefined(transaction.meta, splitSnapshotAffectedStructs, create2);
3971      const store = transaction.doc.store;
3972      if (!meta.has(snapshot2)) {
3973        snapshot2.sv.forEach((clock, client) => {
3974          if (clock < getState(store, client)) {
3975            getItemCleanStart(transaction, createID(client, clock));
3976          }
3977        });
3978        iterateDeletedStructs(transaction, snapshot2.ds, (_item) => {
3979        });
3980        meta.add(snapshot2);
3981      }
3982    };
3983    var createDocFromSnapshot = (originDoc, snapshot2, newDoc = new Doc()) => {
3984      if (originDoc.gc) {
3985        throw new Error("Garbage-collection must be disabled in `originDoc`!");
3986      }
3987      const { sv, ds } = snapshot2;
3988      const encoder = new UpdateEncoderV2();
3989      originDoc.transact((transaction) => {
3990        let size2 = 0;
3991        sv.forEach((clock) => {
3992          if (clock > 0) {
3993            size2++;
3994          }
3995        });
3996        writeVarUint(encoder.restEncoder, size2);
3997        for (const [client, clock] of sv) {
3998          if (clock === 0) {
3999            continue;
4000          }
4001          if (clock < getState(originDoc.store, client)) {
4002            getItemCleanStart(transaction, createID(client, clock));
4003          }
4004          const structs = originDoc.store.clients.get(client) || [];
4005          const lastStructIndex = findIndexSS(structs, clock - 1);
4006          writeVarUint(encoder.restEncoder, lastStructIndex + 1);
4007          encoder.writeClient(client);
4008          writeVarUint(encoder.restEncoder, 0);
4009          for (let i = 0; i <= lastStructIndex; i++) {
4010            structs[i].write(encoder, 0);
4011          }
4012        }
4013        writeDeleteSet(encoder, ds);
4014      });
4015      applyUpdateV2(newDoc, encoder.toUint8Array(), "snapshot");
4016      return newDoc;
4017    };
4018    var snapshotContainsUpdateV2 = (snapshot2, update, YDecoder = UpdateDecoderV2) => {
4019      const updateDecoder = new YDecoder(createDecoder(update));
4020      const lazyDecoder = new LazyStructReader(updateDecoder, false);
4021      for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {
4022        if ((snapshot2.sv.get(curr.id.client) || 0) < curr.id.clock + curr.length) {
4023          return false;
4024        }
4025      }
4026      const mergedDS = mergeDeleteSets([snapshot2.ds, readDeleteSet(updateDecoder)]);
4027      return equalDeleteSets(snapshot2.ds, mergedDS);
4028    };
4029    var snapshotContainsUpdate = (snapshot2, update) => snapshotContainsUpdateV2(snapshot2, update, UpdateDecoderV1);
4030    var StructStore = class {
4031      constructor() {
4032        this.clients = /* @__PURE__ */ new Map();
4033        this.pendingStructs = null;
4034        this.pendingDs = null;
4035      }
4036    };
4037    var getStateVector = (store) => {
4038      const sm = /* @__PURE__ */ new Map();
4039      store.clients.forEach((structs, client) => {
4040        const struct = structs[structs.length - 1];
4041        sm.set(client, struct.id.clock + struct.length);
4042      });
4043      return sm;
4044    };
4045    var getState = (store, client) => {
4046      const structs = store.clients.get(client);
4047      if (structs === void 0) {
4048        return 0;
4049      }
4050      const lastStruct = structs[structs.length - 1];
4051      return lastStruct.id.clock + lastStruct.length;
4052    };
4053    var addStruct = (store, struct) => {
4054      let structs = store.clients.get(struct.id.client);
4055      if (structs === void 0) {
4056        structs = [];
4057        store.clients.set(struct.id.client, structs);
4058      } else {
4059        const lastStruct = structs[structs.length - 1];
4060        if (lastStruct.id.clock + lastStruct.length !== struct.id.clock) {
4061          throw unexpectedCase();
4062        }
4063      }
4064      structs.push(struct);
4065    };
4066    var findIndexSS = (structs, clock) => {
4067      let left = 0;
4068      let right = structs.length - 1;
4069      let mid = structs[right];
4070      let midclock = mid.id.clock;
4071      if (midclock === clock) {
4072        return right;
4073      }
4074      let midindex = floor(clock / (midclock + mid.length - 1) * right);
4075      while (left <= right) {
4076        mid = structs[midindex];
4077        midclock = mid.id.clock;
4078        if (midclock <= clock) {
4079          if (clock < midclock + mid.length) {
4080            return midindex;
4081          }
4082          left = midindex + 1;
4083        } else {
4084          right = midindex - 1;
4085        }
4086        midindex = floor((left + right) / 2);
4087      }
4088      throw unexpectedCase();
4089    };
4090    var find = (store, id2) => {
4091      const structs = store.clients.get(id2.client);
4092      return structs[findIndexSS(structs, id2.clock)];
4093    };
4094    var getItem = (
4095      /** @type {function(StructStore,ID):Item} */
4096      find
4097    );
4098    var findIndexCleanStart = (transaction, structs, clock) => {
4099      const index = findIndexSS(structs, clock);
4100      const struct = structs[index];
4101      if (struct.id.clock < clock && struct instanceof Item) {
4102        structs.splice(index + 1, 0, splitItem(transaction, struct, clock - struct.id.clock));
4103        return index + 1;
4104      }
4105      return index;
4106    };
4107    var getItemCleanStart = (transaction, id2) => {
4108      const structs = (
4109        /** @type {Array<Item>} */
4110        transaction.doc.store.clients.get(id2.client)
4111      );
4112      return structs[findIndexCleanStart(transaction, structs, id2.clock)];
4113    };
4114    var getItemCleanEnd = (transaction, store, id2) => {
4115      const structs = store.clients.get(id2.client);
4116      const index = findIndexSS(structs, id2.clock);
4117      const struct = structs[index];
4118      if (id2.clock !== struct.id.clock + struct.length - 1 && struct.constructor !== GC) {
4119        structs.splice(index + 1, 0, splitItem(transaction, struct, id2.clock - struct.id.clock + 1));
4120      }
4121      return struct;
4122    };
4123    var replaceStruct = (store, struct, newStruct) => {
4124      const structs = (
4125        /** @type {Array<GC|Item>} */
4126        store.clients.get(struct.id.client)
4127      );
4128      structs[findIndexSS(structs, struct.id.clock)] = newStruct;
4129    };
4130    var iterateStructs = (transaction, structs, clockStart, len, f) => {
4131      if (len === 0) {
4132        return;
4133      }
4134      const clockEnd = clockStart + len;
4135      let index = findIndexCleanStart(transaction, structs, clockStart);
4136      let struct;
4137      do {
4138        struct = structs[index++];
4139        if (clockEnd < struct.id.clock + struct.length) {
4140          findIndexCleanStart(transaction, structs, clockEnd);
4141        }
4142        f(struct);
4143      } while (index < structs.length && structs[index].id.clock < clockEnd);
4144    };
4145    var Transaction = class {
4146      /**
4147       * @param {Doc} doc
4148       * @param {any} origin
4149       * @param {boolean} local
4150       */
4151      constructor(doc2, origin2, local) {
4152        this.doc = doc2;
4153        this.deleteSet = new DeleteSet();
4154        this.beforeState = getStateVector(doc2.store);
4155        this.afterState = /* @__PURE__ */ new Map();
4156        this.changed = /* @__PURE__ */ new Map();
4157        this.changedParentTypes = /* @__PURE__ */ new Map();
4158        this._mergeStructs = [];
4159        this.origin = origin2;
4160        this.meta = /* @__PURE__ */ new Map();
4161        this.local = local;
4162        this.subdocsAdded = /* @__PURE__ */ new Set();
4163        this.subdocsRemoved = /* @__PURE__ */ new Set();
4164        this.subdocsLoaded = /* @__PURE__ */ new Set();
4165        this._needFormattingCleanup = false;
4166      }
4167    };
4168    var writeUpdateMessageFromTransaction = (encoder, transaction) => {
4169      if (transaction.deleteSet.clients.size === 0 && !any(transaction.afterState, (clock, client) => transaction.beforeState.get(client) !== clock)) {
4170        return false;
4171      }
4172      sortAndMergeDeleteSet(transaction.deleteSet);
4173      writeStructsFromTransaction(encoder, transaction);
4174      writeDeleteSet(encoder, transaction.deleteSet);
4175      return true;
4176    };
4177    var addChangedTypeToTransaction = (transaction, type, parentSub) => {
4178      const item = type._item;
4179      if (item === null || item.id.clock < (transaction.beforeState.get(item.id.client) || 0) && !item.deleted) {
4180        setIfUndefined(transaction.changed, type, create2).add(parentSub);
4181      }
4182    };
4183    var tryToMergeWithLefts = (structs, pos) => {
4184      let right = structs[pos];
4185      let left = structs[pos - 1];
4186      let i = pos;
4187      for (; i > 0; right = left, left = structs[--i - 1]) {
4188        if (left.deleted === right.deleted && left.constructor === right.constructor) {
4189          if (left.mergeWith(right)) {
4190            if (right instanceof Item && right.parentSub !== null && /** @type {AbstractType<any>} */
4191            right.parent._map.get(right.parentSub) === right) {
4192              right.parent._map.set(
4193                right.parentSub,
4194                /** @type {Item} */
4195                left
4196              );
4197            }
4198            continue;
4199          }
4200        }
4201        break;
4202      }
4203      const merged = pos - i;
4204      if (merged) {
4205        structs.splice(pos + 1 - merged, merged);
4206      }
4207      return merged;
4208    };
4209    var tryGcDeleteSet = (ds, store, gcFilter) => {
4210      for (const [client, deleteItems] of ds.clients.entries()) {
4211        const structs = (
4212          /** @type {Array<GC|Item>} */
4213          store.clients.get(client)
4214        );
4215        for (let di = deleteItems.length - 1; di >= 0; di--) {
4216          const deleteItem = deleteItems[di];
4217          const endDeleteItemClock = deleteItem.clock + deleteItem.len;
4218          for (let si = findIndexSS(structs, deleteItem.clock), struct = structs[si]; si < structs.length && struct.id.clock < endDeleteItemClock; struct = structs[++si]) {
4219            const struct2 = structs[si];
4220            if (deleteItem.clock + deleteItem.len <= struct2.id.clock) {
4221              break;
4222            }
4223            if (struct2 instanceof Item && struct2.deleted && !struct2.keep && gcFilter(struct2)) {
4224              struct2.gc(store, false);
4225            }
4226          }
4227        }
4228      }
4229    };
4230    var tryMergeDeleteSet = (ds, store) => {
4231      ds.clients.forEach((deleteItems, client) => {
4232        const structs = (
4233          /** @type {Array<GC|Item>} */
4234          store.clients.get(client)
4235        );
4236        for (let di = deleteItems.length - 1; di >= 0; di--) {
4237          const deleteItem = deleteItems[di];
4238          const mostRightIndexToCheck = min(structs.length - 1, 1 + findIndexSS(structs, deleteItem.clock + deleteItem.len - 1));
4239          for (let si = mostRightIndexToCheck, struct = structs[si]; si > 0 && struct.id.clock >= deleteItem.clock; struct = structs[si]) {
4240            si -= 1 + tryToMergeWithLefts(structs, si);
4241          }
4242        }
4243      });
4244    };
4245    var tryGc = (ds, store, gcFilter) => {
4246      tryGcDeleteSet(ds, store, gcFilter);
4247      tryMergeDeleteSet(ds, store);
4248    };
4249    var cleanupTransactions = (transactionCleanups, i) => {
4250      if (i < transactionCleanups.length) {
4251        const transaction = transactionCleanups[i];
4252        const doc2 = transaction.doc;
4253        const store = doc2.store;
4254        const ds = transaction.deleteSet;
4255        const mergeStructs = transaction._mergeStructs;
4256        try {
4257          sortAndMergeDeleteSet(ds);
4258          transaction.afterState = getStateVector(transaction.doc.store);
4259          doc2.emit("beforeObserverCalls", [transaction, doc2]);
4260          const fs = [];
4261          transaction.changed.forEach(
4262            (subs, itemtype) => fs.push(() => {
4263              if (itemtype._item === null || !itemtype._item.deleted) {
4264                itemtype._callObserver(transaction, subs);
4265              }
4266            })
4267          );
4268          fs.push(() => {
4269            transaction.changedParentTypes.forEach((events, type) => {
4270              if (type._dEH.l.length > 0 && (type._item === null || !type._item.deleted)) {
4271                events = events.filter(
4272                  (event) => event.target._item === null || !event.target._item.deleted
4273                );
4274                events.forEach((event) => {
4275                  event.currentTarget = type;
4276                  event._path = null;
4277                });
4278                events.sort((event1, event2) => event1.path.length - event2.path.length);
4279                fs.push(() => {
4280                  callEventHandlerListeners(type._dEH, events, transaction);
4281                });
4282              }
4283            });
4284            fs.push(() => doc2.emit("afterTransaction", [transaction, doc2]));
4285            fs.push(() => {
4286              if (transaction._needFormattingCleanup) {
4287                cleanupYTextAfterTransaction(transaction);
4288              }
4289            });
4290          });
4291          callAll(fs, []);
4292        } finally {
4293          if (doc2.gc) {
4294            tryGcDeleteSet(ds, store, doc2.gcFilter);
4295          }
4296          tryMergeDeleteSet(ds, store);
4297          transaction.afterState.forEach((clock, client) => {
4298            const beforeClock = transaction.beforeState.get(client) || 0;
4299            if (beforeClock !== clock) {
4300              const structs = (
4301                /** @type {Array<GC|Item>} */
4302                store.clients.get(client)
4303              );
4304              const firstChangePos = max(findIndexSS(structs, beforeClock), 1);
4305              for (let i2 = structs.length - 1; i2 >= firstChangePos; ) {
4306                i2 -= 1 + tryToMergeWithLefts(structs, i2);
4307              }
4308            }
4309          });
4310          for (let i2 = mergeStructs.length - 1; i2 >= 0; i2--) {
4311            const { client, clock } = mergeStructs[i2].id;
4312            const structs = (
4313              /** @type {Array<GC|Item>} */
4314              store.clients.get(client)
4315            );
4316            const replacedStructPos = findIndexSS(structs, clock);
4317            if (replacedStructPos + 1 < structs.length) {
4318              if (tryToMergeWithLefts(structs, replacedStructPos + 1) > 1) {
4319                continue;
4320              }
4321            }
4322            if (replacedStructPos > 0) {
4323              tryToMergeWithLefts(structs, replacedStructPos);
4324            }
4325          }
4326          if (!transaction.local && transaction.afterState.get(doc2.clientID) !== transaction.beforeState.get(doc2.clientID)) {
4327            print(ORANGE, BOLD, "[yjs] ", UNBOLD, RED, "Changed the client-id because another client seems to be using it.");
4328            doc2.clientID = generateNewClientId();
4329          }
4330          doc2.emit("afterTransactionCleanup", [transaction, doc2]);
4331          if (doc2._observers.has("update")) {
4332            const encoder = new UpdateEncoderV1();
4333            const hasContent2 = writeUpdateMessageFromTransaction(encoder, transaction);
4334            if (hasContent2) {
4335              doc2.emit("update", [encoder.toUint8Array(), transaction.origin, doc2, transaction]);
4336            }
4337          }
4338          if (doc2._observers.has("updateV2")) {
4339            const encoder = new UpdateEncoderV2();
4340            const hasContent2 = writeUpdateMessageFromTransaction(encoder, transaction);
4341            if (hasContent2) {
4342              doc2.emit("updateV2", [encoder.toUint8Array(), transaction.origin, doc2, transaction]);
4343            }
4344          }
4345          const { subdocsAdded, subdocsLoaded, subdocsRemoved } = transaction;
4346          if (subdocsAdded.size > 0 || subdocsRemoved.size > 0 || subdocsLoaded.size > 0) {
4347            subdocsAdded.forEach((subdoc) => {
4348              subdoc.clientID = doc2.clientID;
4349              if (subdoc.collectionid == null) {
4350                subdoc.collectionid = doc2.collectionid;
4351              }
4352              doc2.subdocs.add(subdoc);
4353            });
4354            subdocsRemoved.forEach((subdoc) => doc2.subdocs.delete(subdoc));
4355            doc2.emit("subdocs", [{ loaded: subdocsLoaded, added: subdocsAdded, removed: subdocsRemoved }, doc2, transaction]);
4356            subdocsRemoved.forEach((subdoc) => subdoc.destroy());
4357          }
4358          if (transactionCleanups.length <= i + 1) {
4359            doc2._transactionCleanups = [];
4360            doc2.emit("afterAllTransactions", [doc2, transactionCleanups]);
4361          } else {
4362            cleanupTransactions(transactionCleanups, i + 1);
4363          }
4364        }
4365      }
4366    };
4367    var transact = (doc2, f, origin2 = null, local = true) => {
4368      const transactionCleanups = doc2._transactionCleanups;
4369      let initialCall = false;
4370      let result = null;
4371      if (doc2._transaction === null) {
4372        initialCall = true;
4373        doc2._transaction = new Transaction(doc2, origin2, local);
4374        transactionCleanups.push(doc2._transaction);
4375        if (transactionCleanups.length === 1) {
4376          doc2.emit("beforeAllTransactions", [doc2]);
4377        }
4378        doc2.emit("beforeTransaction", [doc2._transaction, doc2]);
4379      }
4380      try {
4381        result = f(doc2._transaction);
4382      } finally {
4383        if (initialCall) {
4384          const finishCleanup = doc2._transaction === transactionCleanups[0];
4385          doc2._transaction = null;
4386          if (finishCleanup) {
4387            cleanupTransactions(transactionCleanups, 0);
4388          }
4389        }
4390      }
4391      return result;
4392    };
4393    var StackItem = class {
4394      /**
4395       * @param {DeleteSet} deletions
4396       * @param {DeleteSet} insertions
4397       */
4398      constructor(deletions, insertions) {
4399        this.insertions = insertions;
4400        this.deletions = deletions;
4401        this.meta = /* @__PURE__ */ new Map();
4402      }
4403    };
4404    var clearUndoManagerStackItem = (tr, um, stackItem) => {
4405      iterateDeletedStructs(tr, stackItem.deletions, (item) => {
4406        if (item instanceof Item && um.scope.some((type) => type === tr.doc || isParentOf(
4407          /** @type {AbstractType<any>} */
4408          type,
4409          item
4410        ))) {
4411          keepItem(item, false);
4412        }
4413      });
4414    };
4415    var popStackItem = (undoManager, stack, eventType) => {
4416      let _tr = null;
4417      const doc2 = undoManager.doc;
4418      const scope = undoManager.scope;
4419      transact(doc2, (transaction) => {
4420        while (stack.length > 0 && undoManager.currStackItem === null) {
4421          const store = doc2.store;
4422          const stackItem = (
4423            /** @type {StackItem} */
4424            stack.pop()
4425          );
4426          const itemsToRedo = /* @__PURE__ */ new Set();
4427          const itemsToDelete = [];
4428          let performedChange = false;
4429          iterateDeletedStructs(transaction, stackItem.insertions, (struct) => {
4430            if (struct instanceof Item) {
4431              if (struct.redone !== null) {
4432                let { item, diff } = followRedone(store, struct.id);
4433                if (diff > 0) {
4434                  item = getItemCleanStart(transaction, createID(item.id.client, item.id.clock + diff));
4435                }
4436                struct = item;
4437              }
4438              if (!struct.deleted && scope.some((type) => type === transaction.doc || isParentOf(
4439                /** @type {AbstractType<any>} */
4440                type,
4441                /** @type {Item} */
4442                struct
4443              ))) {
4444                itemsToDelete.push(struct);
4445              }
4446            }
4447          });
4448          iterateDeletedStructs(transaction, stackItem.deletions, (struct) => {
4449            if (struct instanceof Item && scope.some((type) => type === transaction.doc || isParentOf(
4450              /** @type {AbstractType<any>} */
4451              type,
4452              struct
4453            )) && // Never redo structs in stackItem.insertions because they were created and deleted in the same capture interval.
4454            !isDeleted(stackItem.insertions, struct.id)) {
4455              itemsToRedo.add(struct);
4456            }
4457          });
4458          itemsToRedo.forEach((struct) => {
4459            performedChange = redoItem(transaction, struct, itemsToRedo, stackItem.insertions, undoManager.ignoreRemoteMapChanges, undoManager) !== null || performedChange;
4460          });
4461          for (let i = itemsToDelete.length - 1; i >= 0; i--) {
4462            const item = itemsToDelete[i];
4463            if (undoManager.deleteFilter(item)) {
4464              item.delete(transaction);
4465              performedChange = true;
4466            }
4467          }
4468          undoManager.currStackItem = performedChange ? stackItem : null;
4469        }
4470        transaction.changed.forEach((subProps, type) => {
4471          if (subProps.has(null) && type._searchMarker) {
4472            type._searchMarker.length = 0;
4473          }
4474        });
4475        _tr = transaction;
4476      }, undoManager);
4477      const res = undoManager.currStackItem;
4478      if (res != null) {
4479        const changedParentTypes = _tr.changedParentTypes;
4480        undoManager.emit("stack-item-popped", [{ stackItem: res, type: eventType, changedParentTypes, origin: undoManager }, undoManager]);
4481        undoManager.currStackItem = null;
4482      }
4483      return res;
4484    };
4485    var UndoManager = class extends ObservableV2 {
4486      /**
4487       * @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.
4488       * @param {UndoManagerOptions} options
4489       */
4490      constructor(typeScope, {
4491        captureTimeout = 500,
4492        captureTransaction = (_tr) => true,
4493        deleteFilter = () => true,
4494        trackedOrigins = /* @__PURE__ */ new Set([null]),
4495        ignoreRemoteMapChanges = false,
4496        doc: doc2 = (
4497          /** @type {Doc} */
4498          isArray(typeScope) ? typeScope[0].doc : typeScope instanceof Doc ? typeScope : typeScope.doc
4499        )
4500      } = {}) {
4501        super();
4502        this.scope = [];
4503        this.doc = doc2;
4504        this.addToScope(typeScope);
4505        this.deleteFilter = deleteFilter;
4506        trackedOrigins.add(this);
4507        this.trackedOrigins = trackedOrigins;
4508        this.captureTransaction = captureTransaction;
4509        this.undoStack = [];
4510        this.redoStack = [];
4511        this.undoing = false;
4512        this.redoing = false;
4513        this.currStackItem = null;
4514        this.lastChange = 0;
4515        this.ignoreRemoteMapChanges = ignoreRemoteMapChanges;
4516        this.captureTimeout = captureTimeout;
4517        this.afterTransactionHandler = (transaction) => {
4518          if (!this.captureTransaction(transaction) || !this.scope.some((type) => transaction.changedParentTypes.has(
4519            /** @type {AbstractType<any>} */
4520            type
4521          ) || type === this.doc) || !this.trackedOrigins.has(transaction.origin) && (!transaction.origin || !this.trackedOrigins.has(transaction.origin.constructor))) {
4522            return;
4523          }
4524          const undoing = this.undoing;
4525          const redoing = this.redoing;
4526          const stack = undoing ? this.redoStack : this.undoStack;
4527          if (undoing) {
4528            this.stopCapturing();
4529          } else if (!redoing) {
4530            this.clear(false, true);
4531          }
4532          const insertions = new DeleteSet();
4533          transaction.afterState.forEach((endClock, client) => {
4534            const startClock = transaction.beforeState.get(client) || 0;
4535            const len = endClock - startClock;
4536            if (len > 0) {
4537              addToDeleteSet(insertions, client, startClock, len);
4538            }
4539          });
4540          const now = getUnixTime();
4541          let didAdd = false;
4542          if (this.lastChange > 0 && now - this.lastChange < this.captureTimeout && stack.length > 0 && !undoing && !redoing) {
4543            const lastOp = stack[stack.length - 1];
4544            lastOp.deletions = mergeDeleteSets([lastOp.deletions, transaction.deleteSet]);
4545            lastOp.insertions = mergeDeleteSets([lastOp.insertions, insertions]);
4546          } else {
4547            stack.push(new StackItem(transaction.deleteSet, insertions));
4548            didAdd = true;
4549          }
4550          if (!undoing && !redoing) {
4551            this.lastChange = now;
4552          }
4553          iterateDeletedStructs(
4554            transaction,
4555            transaction.deleteSet,
4556            /** @param {Item|GC} item */
4557            (item) => {
4558              if (item instanceof Item && this.scope.some((type) => type === transaction.doc || isParentOf(
4559                /** @type {AbstractType<any>} */
4560                type,
4561                item
4562              ))) {
4563                keepItem(item, true);
4564              }
4565            }
4566          );
4567          const changeEvent = [{ stackItem: stack[stack.length - 1], origin: transaction.origin, type: undoing ? "redo" : "undo", changedParentTypes: transaction.changedParentTypes }, this];
4568          if (didAdd) {
4569            this.emit("stack-item-added", changeEvent);
4570          } else {
4571            this.emit("stack-item-updated", changeEvent);
4572          }
4573        };
4574        this.doc.on("afterTransaction", this.afterTransactionHandler);
4575        this.doc.on("destroy", () => {
4576          this.destroy();
4577        });
4578      }
4579      /**
4580       * Extend the scope.
4581       *
4582       * @param {Array<AbstractType<any> | Doc> | AbstractType<any> | Doc} ytypes
4583       */
4584      addToScope(ytypes) {
4585        const tmpSet = new Set(this.scope);
4586        ytypes = isArray(ytypes) ? ytypes : [ytypes];
4587        ytypes.forEach((ytype) => {
4588          if (!tmpSet.has(ytype)) {
4589            tmpSet.add(ytype);
4590            if (ytype instanceof AbstractType ? ytype.doc !== this.doc : ytype !== this.doc) warn("[yjs#509] Not same Y.Doc");
4591            this.scope.push(ytype);
4592          }
4593        });
4594      }
4595      /**
4596       * @param {any} origin
4597       */
4598      addTrackedOrigin(origin2) {
4599        this.trackedOrigins.add(origin2);
4600      }
4601      /**
4602       * @param {any} origin
4603       */
4604      removeTrackedOrigin(origin2) {
4605        this.trackedOrigins.delete(origin2);
4606      }
4607      clear(clearUndoStack = true, clearRedoStack = true) {
4608        if (clearUndoStack && this.canUndo() || clearRedoStack && this.canRedo()) {
4609          this.doc.transact((tr) => {
4610            if (clearUndoStack) {
4611              this.undoStack.forEach((item) => clearUndoManagerStackItem(tr, this, item));
4612              this.undoStack = [];
4613            }
4614            if (clearRedoStack) {
4615              this.redoStack.forEach((item) => clearUndoManagerStackItem(tr, this, item));
4616              this.redoStack = [];
4617            }
4618            this.emit("stack-cleared", [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }]);
4619          });
4620        }
4621      }
4622      /**
4623       * UndoManager merges Undo-StackItem if they are created within time-gap
4624       * smaller than `options.captureTimeout`. Call `um.stopCapturing()` so that the next
4625       * StackItem won't be merged.
4626       *
4627       *
4628       * @example
4629       *     // without stopCapturing
4630       *     ytext.insert(0, 'a')
4631       *     ytext.insert(1, 'b')
4632       *     um.undo()
4633       *     ytext.toString() // => '' (note that 'ab' was removed)
4634       *     // with stopCapturing
4635       *     ytext.insert(0, 'a')
4636       *     um.stopCapturing()
4637       *     ytext.insert(0, 'b')
4638       *     um.undo()
4639       *     ytext.toString() // => 'a' (note that only 'b' was removed)
4640       *
4641       */
4642      stopCapturing() {
4643        this.lastChange = 0;
4644      }
4645      /**
4646       * Undo last changes on type.
4647       *
4648       * @return {StackItem?} Returns StackItem if a change was applied
4649       */
4650      undo() {
4651        this.undoing = true;
4652        let res;
4653        try {
4654          res = popStackItem(this, this.undoStack, "undo");
4655        } finally {
4656          this.undoing = false;
4657        }
4658        return res;
4659      }
4660      /**
4661       * Redo last undo operation.
4662       *
4663       * @return {StackItem?} Returns StackItem if a change was applied
4664       */
4665      redo() {
4666        this.redoing = true;
4667        let res;
4668        try {
4669          res = popStackItem(this, this.redoStack, "redo");
4670        } finally {
4671          this.redoing = false;
4672        }
4673        return res;
4674      }
4675      /**
4676       * Are undo steps available?
4677       *
4678       * @return {boolean} `true` if undo is possible
4679       */
4680      canUndo() {
4681        return this.undoStack.length > 0;
4682      }
4683      /**
4684       * Are redo steps available?
4685       *
4686       * @return {boolean} `true` if redo is possible
4687       */
4688      canRedo() {
4689        return this.redoStack.length > 0;
4690      }
4691      destroy() {
4692        this.trackedOrigins.delete(this);
4693        this.doc.off("afterTransaction", this.afterTransactionHandler);
4694        super.destroy();
4695      }
4696    };
4697    function* lazyStructReaderGenerator(decoder) {
4698      const numOfStateUpdates = readVarUint(decoder.restDecoder);
4699      for (let i = 0; i < numOfStateUpdates; i++) {
4700        const numberOfStructs = readVarUint(decoder.restDecoder);
4701        const client = decoder.readClient();
4702        let clock = readVarUint(decoder.restDecoder);
4703        for (let i2 = 0; i2 < numberOfStructs; i2++) {
4704          const info = decoder.readInfo();
4705          if (info === 10) {
4706            const len = readVarUint(decoder.restDecoder);
4707            yield new Skip(createID(client, clock), len);
4708            clock += len;
4709          } else if ((BITS5 & info) !== 0) {
4710            const cantCopyParentInfo = (info & (BIT7 | BIT8)) === 0;
4711            const struct = new Item(
4712              createID(client, clock),
4713              null,
4714              // left
4715              (info & BIT8) === BIT8 ? decoder.readLeftID() : null,
4716              // origin
4717              null,
4718              // right
4719              (info & BIT7) === BIT7 ? decoder.readRightID() : null,
4720              // right origin
4721              // @ts-ignore Force writing a string here.
4722              cantCopyParentInfo ? decoder.readParentInfo() ? decoder.readString() : decoder.readLeftID() : null,
4723              // parent
4724              cantCopyParentInfo && (info & BIT6) === BIT6 ? decoder.readString() : null,
4725              // parentSub
4726              readItemContent(decoder, info)
4727              // item content
4728            );
4729            yield struct;
4730            clock += struct.length;
4731          } else {
4732            const len = decoder.readLen();
4733            yield new GC(createID(client, clock), len);
4734            clock += len;
4735          }
4736        }
4737      }
4738    }
4739    var LazyStructReader = class {
4740      /**
4741       * @param {UpdateDecoderV1 | UpdateDecoderV2} decoder
4742       * @param {boolean} filterSkips
4743       */
4744      constructor(decoder, filterSkips) {
4745        this.gen = lazyStructReaderGenerator(decoder);
4746        this.curr = null;
4747        this.done = false;
4748        this.filterSkips = filterSkips;
4749        this.next();
4750      }
4751      /**
4752       * @return {Item | GC | Skip |null}
4753       */
4754      next() {
4755        do {
4756          this.curr = this.gen.next().value || null;
4757        } while (this.filterSkips && this.curr !== null && this.curr.constructor === Skip);
4758        return this.curr;
4759      }
4760    };
4761    var logUpdate = (update) => logUpdateV2(update, UpdateDecoderV1);
4762    var logUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {
4763      const structs = [];
4764      const updateDecoder = new YDecoder(createDecoder(update));
4765      const lazyDecoder = new LazyStructReader(updateDecoder, false);
4766      for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {
4767        structs.push(curr);
4768      }
4769      print("Structs: ", structs);
4770      const ds = readDeleteSet(updateDecoder);
4771      print("DeleteSet: ", ds);
4772    };
4773    var decodeUpdate = (update) => decodeUpdateV2(update, UpdateDecoderV1);
4774    var decodeUpdateV2 = (update, YDecoder = UpdateDecoderV2) => {
4775      const structs = [];
4776      const updateDecoder = new YDecoder(createDecoder(update));
4777      const lazyDecoder = new LazyStructReader(updateDecoder, false);
4778      for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {
4779        structs.push(curr);
4780      }
4781      return {
4782        structs,
4783        ds: readDeleteSet(updateDecoder)
4784      };
4785    };
4786    var LazyStructWriter = class {
4787      /**
4788       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
4789       */
4790      constructor(encoder) {
4791        this.currClient = 0;
4792        this.startClock = 0;
4793        this.written = 0;
4794        this.encoder = encoder;
4795        this.clientStructs = [];
4796      }
4797    };
4798    var mergeUpdates = (updates) => mergeUpdatesV2(updates, UpdateDecoderV1, UpdateEncoderV1);
4799    var encodeStateVectorFromUpdateV2 = (update, YEncoder = DSEncoderV2, YDecoder = UpdateDecoderV2) => {
4800      const encoder = new YEncoder();
4801      const updateDecoder = new LazyStructReader(new YDecoder(createDecoder(update)), false);
4802      let curr = updateDecoder.curr;
4803      if (curr !== null) {
4804        let size2 = 0;
4805        let currClient = curr.id.client;
4806        let stopCounting = curr.id.clock !== 0;
4807        let currClock = stopCounting ? 0 : curr.id.clock + curr.length;
4808        for (; curr !== null; curr = updateDecoder.next()) {
4809          if (currClient !== curr.id.client) {
4810            if (currClock !== 0) {
4811              size2++;
4812              writeVarUint(encoder.restEncoder, currClient);
4813              writeVarUint(encoder.restEncoder, currClock);
4814            }
4815            currClient = curr.id.client;
4816            currClock = 0;
4817            stopCounting = curr.id.clock !== 0;
4818          }
4819          if (curr.constructor === Skip) {
4820            stopCounting = true;
4821          }
4822          if (!stopCounting) {
4823            currClock = curr.id.clock + curr.length;
4824          }
4825        }
4826        if (currClock !== 0) {
4827          size2++;
4828          writeVarUint(encoder.restEncoder, currClient);
4829          writeVarUint(encoder.restEncoder, currClock);
4830        }
4831        const enc = createEncoder();
4832        writeVarUint(enc, size2);
4833        writeBinaryEncoder(enc, encoder.restEncoder);
4834        encoder.restEncoder = enc;
4835        return encoder.toUint8Array();
4836      } else {
4837        writeVarUint(encoder.restEncoder, 0);
4838        return encoder.toUint8Array();
4839      }
4840    };
4841    var encodeStateVectorFromUpdate = (update) => encodeStateVectorFromUpdateV2(update, DSEncoderV1, UpdateDecoderV1);
4842    var parseUpdateMetaV2 = (update, YDecoder = UpdateDecoderV2) => {
4843      const from2 = /* @__PURE__ */ new Map();
4844      const to = /* @__PURE__ */ new Map();
4845      const updateDecoder = new LazyStructReader(new YDecoder(createDecoder(update)), false);
4846      let curr = updateDecoder.curr;
4847      if (curr !== null) {
4848        let currClient = curr.id.client;
4849        let currClock = curr.id.clock;
4850        from2.set(currClient, currClock);
4851        for (; curr !== null; curr = updateDecoder.next()) {
4852          if (currClient !== curr.id.client) {
4853            to.set(currClient, currClock);
4854            from2.set(curr.id.client, curr.id.clock);
4855            currClient = curr.id.client;
4856          }
4857          currClock = curr.id.clock + curr.length;
4858        }
4859        to.set(currClient, currClock);
4860      }
4861      return { from: from2, to };
4862    };
4863    var parseUpdateMeta = (update) => parseUpdateMetaV2(update, UpdateDecoderV1);
4864    var sliceStruct = (left, diff) => {
4865      if (left.constructor === GC) {
4866        const { client, clock } = left.id;
4867        return new GC(createID(client, clock + diff), left.length - diff);
4868      } else if (left.constructor === Skip) {
4869        const { client, clock } = left.id;
4870        return new Skip(createID(client, clock + diff), left.length - diff);
4871      } else {
4872        const leftItem = (
4873          /** @type {Item} */
4874          left
4875        );
4876        const { client, clock } = leftItem.id;
4877        return new Item(
4878          createID(client, clock + diff),
4879          null,
4880          createID(client, clock + diff - 1),
4881          null,
4882          leftItem.rightOrigin,
4883          leftItem.parent,
4884          leftItem.parentSub,
4885          leftItem.content.splice(diff)
4886        );
4887      }
4888    };
4889    var mergeUpdatesV2 = (updates, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {
4890      if (updates.length === 1) {
4891        return updates[0];
4892      }
4893      const updateDecoders = updates.map((update) => new YDecoder(createDecoder(update)));
4894      let lazyStructDecoders = updateDecoders.map((decoder) => new LazyStructReader(decoder, true));
4895      let currWrite = null;
4896      const updateEncoder = new YEncoder();
4897      const lazyStructEncoder = new LazyStructWriter(updateEncoder);
4898      while (true) {
4899        lazyStructDecoders = lazyStructDecoders.filter((dec) => dec.curr !== null);
4900        lazyStructDecoders.sort(
4901          /** @type {function(any,any):number} */
4902          (dec1, dec2) => {
4903            if (dec1.curr.id.client === dec2.curr.id.client) {
4904              const clockDiff = dec1.curr.id.clock - dec2.curr.id.clock;
4905              if (clockDiff === 0) {
4906                return dec1.curr.constructor === dec2.curr.constructor ? 0 : dec1.curr.constructor === Skip ? 1 : -1;
4907              } else {
4908                return clockDiff;
4909              }
4910            } else {
4911              return dec2.curr.id.client - dec1.curr.id.client;
4912            }
4913          }
4914        );
4915        if (lazyStructDecoders.length === 0) {
4916          break;
4917        }
4918        const currDecoder = lazyStructDecoders[0];
4919        const firstClient = (
4920          /** @type {Item | GC} */
4921          currDecoder.curr.id.client
4922        );
4923        if (currWrite !== null) {
4924          let curr = (
4925            /** @type {Item | GC | null} */
4926            currDecoder.curr
4927          );
4928          let iterated = false;
4929          while (curr !== null && curr.id.clock + curr.length <= currWrite.struct.id.clock + currWrite.struct.length && curr.id.client >= currWrite.struct.id.client) {
4930            curr = currDecoder.next();
4931            iterated = true;
4932          }
4933          if (curr === null || // current decoder is empty
4934          curr.id.client !== firstClient || // check whether there is another decoder that has has updates from `firstClient`
4935          iterated && curr.id.clock > currWrite.struct.id.clock + currWrite.struct.length) {
4936            continue;
4937          }
4938          if (firstClient !== currWrite.struct.id.client) {
4939            writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);
4940            currWrite = { struct: curr, offset: 0 };
4941            currDecoder.next();
4942          } else {
4943            if (currWrite.struct.id.clock + currWrite.struct.length < curr.id.clock) {
4944              if (currWrite.struct.constructor === Skip) {
4945                currWrite.struct.length = curr.id.clock + curr.length - currWrite.struct.id.clock;
4946              } else {
4947                writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);
4948                const diff = curr.id.clock - currWrite.struct.id.clock - currWrite.struct.length;
4949                const struct = new Skip(createID(firstClient, currWrite.struct.id.clock + currWrite.struct.length), diff);
4950                currWrite = { struct, offset: 0 };
4951              }
4952            } else {
4953              const diff = currWrite.struct.id.clock + currWrite.struct.length - curr.id.clock;
4954              if (diff > 0) {
4955                if (currWrite.struct.constructor === Skip) {
4956                  currWrite.struct.length -= diff;
4957                } else {
4958                  curr = sliceStruct(curr, diff);
4959                }
4960              }
4961              if (!currWrite.struct.mergeWith(
4962                /** @type {any} */
4963                curr
4964              )) {
4965                writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);
4966                currWrite = { struct: curr, offset: 0 };
4967                currDecoder.next();
4968              }
4969            }
4970          }
4971        } else {
4972          currWrite = { struct: (
4973            /** @type {Item | GC} */
4974            currDecoder.curr
4975          ), offset: 0 };
4976          currDecoder.next();
4977        }
4978        for (let next = currDecoder.curr; next !== null && next.id.client === firstClient && next.id.clock === currWrite.struct.id.clock + currWrite.struct.length && next.constructor !== Skip; next = currDecoder.next()) {
4979          writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);
4980          currWrite = { struct: next, offset: 0 };
4981        }
4982      }
4983      if (currWrite !== null) {
4984        writeStructToLazyStructWriter(lazyStructEncoder, currWrite.struct, currWrite.offset);
4985        currWrite = null;
4986      }
4987      finishLazyStructWriting(lazyStructEncoder);
4988      const dss = updateDecoders.map((decoder) => readDeleteSet(decoder));
4989      const ds = mergeDeleteSets(dss);
4990      writeDeleteSet(updateEncoder, ds);
4991      return updateEncoder.toUint8Array();
4992    };
4993    var diffUpdateV2 = (update, sv, YDecoder = UpdateDecoderV2, YEncoder = UpdateEncoderV2) => {
4994      const state = decodeStateVector(sv);
4995      const encoder = new YEncoder();
4996      const lazyStructWriter = new LazyStructWriter(encoder);
4997      const decoder = new YDecoder(createDecoder(update));
4998      const reader = new LazyStructReader(decoder, false);
4999      while (reader.curr) {
5000        const curr = reader.curr;
5001        const currClient = curr.id.client;
5002        const svClock = state.get(currClient) || 0;
5003        if (reader.curr.constructor === Skip) {
5004          reader.next();
5005          continue;
5006        }
5007        if (curr.id.clock + curr.length > svClock) {
5008          writeStructToLazyStructWriter(lazyStructWriter, curr, max(svClock - curr.id.clock, 0));
5009          reader.next();
5010          while (reader.curr && reader.curr.id.client === currClient) {
5011            writeStructToLazyStructWriter(lazyStructWriter, reader.curr, 0);
5012            reader.next();
5013          }
5014        } else {
5015          while (reader.curr && reader.curr.id.client === currClient && reader.curr.id.clock + reader.curr.length <= svClock) {
5016            reader.next();
5017          }
5018        }
5019      }
5020      finishLazyStructWriting(lazyStructWriter);
5021      const ds = readDeleteSet(decoder);
5022      writeDeleteSet(encoder, ds);
5023      return encoder.toUint8Array();
5024    };
5025    var diffUpdate = (update, sv) => diffUpdateV2(update, sv, UpdateDecoderV1, UpdateEncoderV1);
5026    var flushLazyStructWriter = (lazyWriter) => {
5027      if (lazyWriter.written > 0) {
5028        lazyWriter.clientStructs.push({ written: lazyWriter.written, restEncoder: toUint8Array(lazyWriter.encoder.restEncoder) });
5029        lazyWriter.encoder.restEncoder = createEncoder();
5030        lazyWriter.written = 0;
5031      }
5032    };
5033    var writeStructToLazyStructWriter = (lazyWriter, struct, offset) => {
5034      if (lazyWriter.written > 0 && lazyWriter.currClient !== struct.id.client) {
5035        flushLazyStructWriter(lazyWriter);
5036      }
5037      if (lazyWriter.written === 0) {
5038        lazyWriter.currClient = struct.id.client;
5039        lazyWriter.encoder.writeClient(struct.id.client);
5040        writeVarUint(lazyWriter.encoder.restEncoder, struct.id.clock + offset);
5041      }
5042      struct.write(lazyWriter.encoder, offset);
5043      lazyWriter.written++;
5044    };
5045    var finishLazyStructWriting = (lazyWriter) => {
5046      flushLazyStructWriter(lazyWriter);
5047      const restEncoder = lazyWriter.encoder.restEncoder;
5048      writeVarUint(restEncoder, lazyWriter.clientStructs.length);
5049      for (let i = 0; i < lazyWriter.clientStructs.length; i++) {
5050        const partStructs = lazyWriter.clientStructs[i];
5051        writeVarUint(restEncoder, partStructs.written);
5052        writeUint8Array(restEncoder, partStructs.restEncoder);
5053      }
5054    };
5055    var convertUpdateFormat = (update, blockTransformer, YDecoder, YEncoder) => {
5056      const updateDecoder = new YDecoder(createDecoder(update));
5057      const lazyDecoder = new LazyStructReader(updateDecoder, false);
5058      const updateEncoder = new YEncoder();
5059      const lazyWriter = new LazyStructWriter(updateEncoder);
5060      for (let curr = lazyDecoder.curr; curr !== null; curr = lazyDecoder.next()) {
5061        writeStructToLazyStructWriter(lazyWriter, blockTransformer(curr), 0);
5062      }
5063      finishLazyStructWriting(lazyWriter);
5064      const ds = readDeleteSet(updateDecoder);
5065      writeDeleteSet(updateEncoder, ds);
5066      return updateEncoder.toUint8Array();
5067    };
5068    var createObfuscator = ({ formatting = true, subdocs = true, yxml = true } = {}) => {
5069      let i = 0;
5070      const mapKeyCache = create();
5071      const nodeNameCache = create();
5072      const formattingKeyCache = create();
5073      const formattingValueCache = create();
5074      formattingValueCache.set(null, null);
5075      return (block) => {
5076        switch (block.constructor) {
5077          case GC:
5078          case Skip:
5079            return block;
5080          case Item: {
5081            const item = (
5082              /** @type {Item} */
5083              block
5084            );
5085            const content = item.content;
5086            switch (content.constructor) {
5087              case ContentDeleted:
5088                break;
5089              case ContentType: {
5090                if (yxml) {
5091                  const type = (
5092                    /** @type {ContentType} */
5093                    content.type
5094                  );
5095                  if (type instanceof YXmlElement) {
5096                    type.nodeName = setIfUndefined(nodeNameCache, type.nodeName, () => "node-" + i);
5097                  }
5098                  if (type instanceof YXmlHook) {
5099                    type.hookName = setIfUndefined(nodeNameCache, type.hookName, () => "hook-" + i);
5100                  }
5101                }
5102                break;
5103              }
5104              case ContentAny: {
5105                const c = (
5106                  /** @type {ContentAny} */
5107                  content
5108                );
5109                c.arr = c.arr.map(() => i);
5110                break;
5111              }
5112              case ContentBinary: {
5113                const c = (
5114                  /** @type {ContentBinary} */
5115                  content
5116                );
5117                c.content = new Uint8Array([i]);
5118                break;
5119              }
5120              case ContentDoc: {
5121                const c = (
5122                  /** @type {ContentDoc} */
5123                  content
5124                );
5125                if (subdocs) {
5126                  c.opts = {};
5127                  c.doc.guid = i + "";
5128                }
5129                break;
5130              }
5131              case ContentEmbed: {
5132                const c = (
5133                  /** @type {ContentEmbed} */
5134                  content
5135                );
5136                c.embed = {};
5137                break;
5138              }
5139              case ContentFormat: {
5140                const c = (
5141                  /** @type {ContentFormat} */
5142                  content
5143                );
5144                if (formatting) {
5145                  c.key = setIfUndefined(formattingKeyCache, c.key, () => i + "");
5146                  c.value = setIfUndefined(formattingValueCache, c.value, () => ({ i }));
5147                }
5148                break;
5149              }
5150              case ContentJSON: {
5151                const c = (
5152                  /** @type {ContentJSON} */
5153                  content
5154                );
5155                c.arr = c.arr.map(() => i);
5156                break;
5157              }
5158              case ContentString: {
5159                const c = (
5160                  /** @type {ContentString} */
5161                  content
5162                );
5163                c.str = repeat(i % 10 + "", c.str.length);
5164                break;
5165              }
5166              default:
5167                unexpectedCase();
5168            }
5169            if (item.parentSub) {
5170              item.parentSub = setIfUndefined(mapKeyCache, item.parentSub, () => i + "");
5171            }
5172            i++;
5173            return block;
5174          }
5175          default:
5176            unexpectedCase();
5177        }
5178      };
5179    };
5180    var obfuscateUpdate = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV1, UpdateEncoderV1);
5181    var obfuscateUpdateV2 = (update, opts) => convertUpdateFormat(update, createObfuscator(opts), UpdateDecoderV2, UpdateEncoderV2);
5182    var convertUpdateFormatV1ToV2 = (update) => convertUpdateFormat(update, id, UpdateDecoderV1, UpdateEncoderV2);
5183    var convertUpdateFormatV2ToV1 = (update) => convertUpdateFormat(update, id, UpdateDecoderV2, UpdateEncoderV1);
5184    var errorComputeChanges = "You must not compute changes after the event-handler fired.";
5185    var YEvent = class {
5186      /**
5187       * @param {T} target The changed type.
5188       * @param {Transaction} transaction
5189       */
5190      constructor(target, transaction) {
5191        this.target = target;
5192        this.currentTarget = target;
5193        this.transaction = transaction;
5194        this._changes = null;
5195        this._keys = null;
5196        this._delta = null;
5197        this._path = null;
5198      }
5199      /**
5200       * Computes the path from `y` to the changed type.
5201       *
5202       * @todo v14 should standardize on path: Array<{parent, index}> because that is easier to work with.
5203       *
5204       * The following property holds:
5205       * @example
5206       *   let type = y
5207       *   event.path.forEach(dir => {
5208       *     type = type.get(dir)
5209       *   })
5210       *   type === event.target // => true
5211       */
5212      get path() {
5213        return this._path || (this._path = getPathTo(this.currentTarget, this.target));
5214      }
5215      /**
5216       * Check if a struct is deleted by this event.
5217       *
5218       * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.
5219       *
5220       * @param {AbstractStruct} struct
5221       * @return {boolean}
5222       */
5223      deletes(struct) {
5224        return isDeleted(this.transaction.deleteSet, struct.id);
5225      }
5226      /**
5227       * @type {Map<string, { action: 'add' | 'update' | 'delete', oldValue: any }>}
5228       */
5229      get keys() {
5230        if (this._keys === null) {
5231          if (this.transaction.doc._transactionCleanups.length === 0) {
5232            throw create3(errorComputeChanges);
5233          }
5234          const keys2 = /* @__PURE__ */ new Map();
5235          const target = this.target;
5236          const changed = (
5237            /** @type Set<string|null> */
5238            this.transaction.changed.get(target)
5239          );
5240          changed.forEach((key) => {
5241            if (key !== null) {
5242              const item = (
5243                /** @type {Item} */
5244                target._map.get(key)
5245              );
5246              let action;
5247              let oldValue;
5248              if (this.adds(item)) {
5249                let prev = item.left;
5250                while (prev !== null && this.adds(prev)) {
5251                  prev = prev.left;
5252                }
5253                if (this.deletes(item)) {
5254                  if (prev !== null && this.deletes(prev)) {
5255                    action = "delete";
5256                    oldValue = last(prev.content.getContent());
5257                  } else {
5258                    return;
5259                  }
5260                } else {
5261                  if (prev !== null && this.deletes(prev)) {
5262                    action = "update";
5263                    oldValue = last(prev.content.getContent());
5264                  } else {
5265                    action = "add";
5266                    oldValue = void 0;
5267                  }
5268                }
5269              } else {
5270                if (this.deletes(item)) {
5271                  action = "delete";
5272                  oldValue = last(
5273                    /** @type {Item} */
5274                    item.content.getContent()
5275                  );
5276                } else {
5277                  return;
5278                }
5279              }
5280              keys2.set(key, { action, oldValue });
5281            }
5282          });
5283          this._keys = keys2;
5284        }
5285        return this._keys;
5286      }
5287      /**
5288       * This is a computed property. Note that this can only be safely computed during the
5289       * event call. Computing this property after other changes happened might result in
5290       * unexpected behavior (incorrect computation of deltas). A safe way to collect changes
5291       * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.
5292       *
5293       * @type {Array<{insert?: string | Array<any> | object | AbstractType<any>, retain?: number, delete?: number, attributes?: Object<string, any>}>}
5294       */
5295      get delta() {
5296        return this.changes.delta;
5297      }
5298      /**
5299       * Check if a struct is added by this event.
5300       *
5301       * In contrast to change.deleted, this method also returns true if the struct was added and then deleted.
5302       *
5303       * @param {AbstractStruct} struct
5304       * @return {boolean}
5305       */
5306      adds(struct) {
5307        return struct.id.clock >= (this.transaction.beforeState.get(struct.id.client) || 0);
5308      }
5309      /**
5310       * This is a computed property. Note that this can only be safely computed during the
5311       * event call. Computing this property after other changes happened might result in
5312       * unexpected behavior (incorrect computation of deltas). A safe way to collect changes
5313       * is to store the `changes` or the `delta` object. Avoid storing the `transaction` object.
5314       *
5315       * @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}>}}
5316       */
5317      get changes() {
5318        let changes = this._changes;
5319        if (changes === null) {
5320          if (this.transaction.doc._transactionCleanups.length === 0) {
5321            throw create3(errorComputeChanges);
5322          }
5323          const target = this.target;
5324          const added = create2();
5325          const deleted = create2();
5326          const delta = [];
5327          changes = {
5328            added,
5329            deleted,
5330            delta,
5331            keys: this.keys
5332          };
5333          const changed = (
5334            /** @type Set<string|null> */
5335            this.transaction.changed.get(target)
5336          );
5337          if (changed.has(null)) {
5338            let lastOp = null;
5339            const packOp = () => {
5340              if (lastOp) {
5341                delta.push(lastOp);
5342              }
5343            };
5344            for (let item = target._start; item !== null; item = item.right) {
5345              if (item.deleted) {
5346                if (this.deletes(item) && !this.adds(item)) {
5347                  if (lastOp === null || lastOp.delete === void 0) {
5348                    packOp();
5349                    lastOp = { delete: 0 };
5350                  }
5351                  lastOp.delete += item.length;
5352                  deleted.add(item);
5353                }
5354              } else {
5355                if (this.adds(item)) {
5356                  if (lastOp === null || lastOp.insert === void 0) {
5357                    packOp();
5358                    lastOp = { insert: [] };
5359                  }
5360                  lastOp.insert = lastOp.insert.concat(item.content.getContent());
5361                  added.add(item);
5362                } else {
5363                  if (lastOp === null || lastOp.retain === void 0) {
5364                    packOp();
5365                    lastOp = { retain: 0 };
5366                  }
5367                  lastOp.retain += item.length;
5368                }
5369              }
5370            }
5371            if (lastOp !== null && lastOp.retain === void 0) {
5372              packOp();
5373            }
5374          }
5375          this._changes = changes;
5376        }
5377        return (
5378          /** @type {any} */
5379          changes
5380        );
5381      }
5382    };
5383    var getPathTo = (parent, child) => {
5384      const path = [];
5385      while (child._item !== null && child !== parent) {
5386        if (child._item.parentSub !== null) {
5387          path.unshift(child._item.parentSub);
5388        } else {
5389          let i = 0;
5390          let c = (
5391            /** @type {AbstractType<any>} */
5392            child._item.parent._start
5393          );
5394          while (c !== child._item && c !== null) {
5395            if (!c.deleted && c.countable) {
5396              i += c.length;
5397            }
5398            c = c.right;
5399          }
5400          path.unshift(i);
5401        }
5402        child = /** @type {AbstractType<any>} */
5403        child._item.parent;
5404      }
5405      return path;
5406    };
5407    var warnPrematureAccess = () => {
5408      warn("Invalid access: Add Yjs type to a document before reading data.");
5409    };
5410    var maxSearchMarker = 80;
5411    var globalSearchMarkerTimestamp = 0;
5412    var ArraySearchMarker = class {
5413      /**
5414       * @param {Item} p
5415       * @param {number} index
5416       */
5417      constructor(p, index) {
5418        p.marker = true;
5419        this.p = p;
5420        this.index = index;
5421        this.timestamp = globalSearchMarkerTimestamp++;
5422      }
5423    };
5424    var refreshMarkerTimestamp = (marker) => {
5425      marker.timestamp = globalSearchMarkerTimestamp++;
5426    };
5427    var overwriteMarker = (marker, p, index) => {
5428      marker.p.marker = false;
5429      marker.p = p;
5430      p.marker = true;
5431      marker.index = index;
5432      marker.timestamp = globalSearchMarkerTimestamp++;
5433    };
5434    var markPosition = (searchMarker, p, index) => {
5435      if (searchMarker.length >= maxSearchMarker) {
5436        const marker = searchMarker.reduce((a, b) => a.timestamp < b.timestamp ? a : b);
5437        overwriteMarker(marker, p, index);
5438        return marker;
5439      } else {
5440        const pm = new ArraySearchMarker(p, index);
5441        searchMarker.push(pm);
5442        return pm;
5443      }
5444    };
5445    var findMarker = (yarray, index) => {
5446      if (yarray._start === null || index === 0 || yarray._searchMarker === null) {
5447        return null;
5448      }
5449      const marker = yarray._searchMarker.length === 0 ? null : yarray._searchMarker.reduce((a, b) => abs(index - a.index) < abs(index - b.index) ? a : b);
5450      let p = yarray._start;
5451      let pindex = 0;
5452      if (marker !== null) {
5453        p = marker.p;
5454        pindex = marker.index;
5455        refreshMarkerTimestamp(marker);
5456      }
5457      while (p.right !== null && pindex < index) {
5458        if (!p.deleted && p.countable) {
5459          if (index < pindex + p.length) {
5460            break;
5461          }
5462          pindex += p.length;
5463        }
5464        p = p.right;
5465      }
5466      while (p.left !== null && pindex > index) {
5467        p = p.left;
5468        if (!p.deleted && p.countable) {
5469          pindex -= p.length;
5470        }
5471      }
5472      while (p.left !== null && p.left.id.client === p.id.client && p.left.id.clock + p.left.length === p.id.clock) {
5473        p = p.left;
5474        if (!p.deleted && p.countable) {
5475          pindex -= p.length;
5476        }
5477      }
5478      if (marker !== null && abs(marker.index - pindex) < /** @type {YText|YArray<any>} */
5479      p.parent.length / maxSearchMarker) {
5480        overwriteMarker(marker, p, pindex);
5481        return marker;
5482      } else {
5483        return markPosition(yarray._searchMarker, p, pindex);
5484      }
5485    };
5486    var updateMarkerChanges = (searchMarker, index, len) => {
5487      for (let i = searchMarker.length - 1; i >= 0; i--) {
5488        const m = searchMarker[i];
5489        if (len > 0) {
5490          let p = m.p;
5491          p.marker = false;
5492          while (p && (p.deleted || !p.countable)) {
5493            p = p.left;
5494            if (p && !p.deleted && p.countable) {
5495              m.index -= p.length;
5496            }
5497          }
5498          if (p === null || p.marker === true) {
5499            searchMarker.splice(i, 1);
5500            continue;
5501          }
5502          m.p = p;
5503          p.marker = true;
5504        }
5505        if (index < m.index || len > 0 && index === m.index) {
5506          m.index = max(index, m.index + len);
5507        }
5508      }
5509    };
5510    var getTypeChildren = (t) => {
5511      t.doc ?? warnPrematureAccess();
5512      let s = t._start;
5513      const arr = [];
5514      while (s) {
5515        arr.push(s);
5516        s = s.right;
5517      }
5518      return arr;
5519    };
5520    var callTypeObservers = (type, transaction, event) => {
5521      const changedType = type;
5522      const changedParentTypes = transaction.changedParentTypes;
5523      while (true) {
5524        setIfUndefined(changedParentTypes, type, () => []).push(event);
5525        if (type._item === null) {
5526          break;
5527        }
5528        type = /** @type {AbstractType<any>} */
5529        type._item.parent;
5530      }
5531      callEventHandlerListeners(changedType._eH, event, transaction);
5532    };
5533    var AbstractType = class {
5534      constructor() {
5535        this._item = null;
5536        this._map = /* @__PURE__ */ new Map();
5537        this._start = null;
5538        this.doc = null;
5539        this._length = 0;
5540        this._eH = createEventHandler();
5541        this._dEH = createEventHandler();
5542        this._searchMarker = null;
5543      }
5544      /**
5545       * @return {AbstractType<any>|null}
5546       */
5547      get parent() {
5548        return this._item ? (
5549          /** @type {AbstractType<any>} */
5550          this._item.parent
5551        ) : null;
5552      }
5553      /**
5554       * Integrate this type into the Yjs instance.
5555       *
5556       * * Save this struct in the os
5557       * * This type is sent to other client
5558       * * Observer functions are fired
5559       *
5560       * @param {Doc} y The Yjs instance
5561       * @param {Item|null} item
5562       */
5563      _integrate(y, item) {
5564        this.doc = y;
5565        this._item = item;
5566      }
5567      /**
5568       * @return {AbstractType<EventType>}
5569       */
5570      _copy() {
5571        throw methodUnimplemented();
5572      }
5573      /**
5574       * Makes a copy of this data type that can be included somewhere else.
5575       *
5576       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
5577       *
5578       * @return {AbstractType<EventType>}
5579       */
5580      clone() {
5581        throw methodUnimplemented();
5582      }
5583      /**
5584       * @param {UpdateEncoderV1 | UpdateEncoderV2} _encoder
5585       */
5586      _write(_encoder) {
5587      }
5588      /**
5589       * The first non-deleted item
5590       */
5591      get _first() {
5592        let n = this._start;
5593        while (n !== null && n.deleted) {
5594          n = n.right;
5595        }
5596        return n;
5597      }
5598      /**
5599       * Creates YEvent and calls all type observers.
5600       * Must be implemented by each type.
5601       *
5602       * @param {Transaction} transaction
5603       * @param {Set<null|string>} _parentSubs Keys changed on this type. `null` if list was modified.
5604       */
5605      _callObserver(transaction, _parentSubs) {
5606        if (!transaction.local && this._searchMarker) {
5607          this._searchMarker.length = 0;
5608        }
5609      }
5610      /**
5611       * Observe all events that are created on this type.
5612       *
5613       * @param {function(EventType, Transaction):void} f Observer function
5614       */
5615      observe(f) {
5616        addEventHandlerListener(this._eH, f);
5617      }
5618      /**
5619       * Observe all events that are created by this type and its children.
5620       *
5621       * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function
5622       */
5623      observeDeep(f) {
5624        addEventHandlerListener(this._dEH, f);
5625      }
5626      /**
5627       * Unregister an observer function.
5628       *
5629       * @param {function(EventType,Transaction):void} f Observer function
5630       */
5631      unobserve(f) {
5632        removeEventHandlerListener(this._eH, f);
5633      }
5634      /**
5635       * Unregister an observer function.
5636       *
5637       * @param {function(Array<YEvent<any>>,Transaction):void} f Observer function
5638       */
5639      unobserveDeep(f) {
5640        removeEventHandlerListener(this._dEH, f);
5641      }
5642      /**
5643       * @abstract
5644       * @return {any}
5645       */
5646      toJSON() {
5647      }
5648    };
5649    var typeListSlice = (type, start, end) => {
5650      type.doc ?? warnPrematureAccess();
5651      if (start < 0) {
5652        start = type._length + start;
5653      }
5654      if (end < 0) {
5655        end = type._length + end;
5656      }
5657      let len = end - start;
5658      const cs = [];
5659      let n = type._start;
5660      while (n !== null && len > 0) {
5661        if (n.countable && !n.deleted) {
5662          const c = n.content.getContent();
5663          if (c.length <= start) {
5664            start -= c.length;
5665          } else {
5666            for (let i = start; i < c.length && len > 0; i++) {
5667              cs.push(c[i]);
5668              len--;
5669            }
5670            start = 0;
5671          }
5672        }
5673        n = n.right;
5674      }
5675      return cs;
5676    };
5677    var typeListToArray = (type) => {
5678      type.doc ?? warnPrematureAccess();
5679      const cs = [];
5680      let n = type._start;
5681      while (n !== null) {
5682        if (n.countable && !n.deleted) {
5683          const c = n.content.getContent();
5684          for (let i = 0; i < c.length; i++) {
5685            cs.push(c[i]);
5686          }
5687        }
5688        n = n.right;
5689      }
5690      return cs;
5691    };
5692    var typeListToArraySnapshot = (type, snapshot2) => {
5693      const cs = [];
5694      let n = type._start;
5695      while (n !== null) {
5696        if (n.countable && isVisible(n, snapshot2)) {
5697          const c = n.content.getContent();
5698          for (let i = 0; i < c.length; i++) {
5699            cs.push(c[i]);
5700          }
5701        }
5702        n = n.right;
5703      }
5704      return cs;
5705    };
5706    var typeListForEach = (type, f) => {
5707      let index = 0;
5708      let n = type._start;
5709      type.doc ?? warnPrematureAccess();
5710      while (n !== null) {
5711        if (n.countable && !n.deleted) {
5712          const c = n.content.getContent();
5713          for (let i = 0; i < c.length; i++) {
5714            f(c[i], index++, type);
5715          }
5716        }
5717        n = n.right;
5718      }
5719    };
5720    var typeListMap = (type, f) => {
5721      const result = [];
5722      typeListForEach(type, (c, i) => {
5723        result.push(f(c, i, type));
5724      });
5725      return result;
5726    };
5727    var typeListCreateIterator = (type) => {
5728      let n = type._start;
5729      let currentContent = null;
5730      let currentContentIndex = 0;
5731      return {
5732        [Symbol.iterator]() {
5733          return this;
5734        },
5735        next: () => {
5736          if (currentContent === null) {
5737            while (n !== null && n.deleted) {
5738              n = n.right;
5739            }
5740            if (n === null) {
5741              return {
5742                done: true,
5743                value: void 0
5744              };
5745            }
5746            currentContent = n.content.getContent();
5747            currentContentIndex = 0;
5748            n = n.right;
5749          }
5750          const value = currentContent[currentContentIndex++];
5751          if (currentContent.length <= currentContentIndex) {
5752            currentContent = null;
5753          }
5754          return {
5755            done: false,
5756            value
5757          };
5758        }
5759      };
5760    };
5761    var typeListGet = (type, index) => {
5762      type.doc ?? warnPrematureAccess();
5763      const marker = findMarker(type, index);
5764      let n = type._start;
5765      if (marker !== null) {
5766        n = marker.p;
5767        index -= marker.index;
5768      }
5769      for (; n !== null; n = n.right) {
5770        if (!n.deleted && n.countable) {
5771          if (index < n.length) {
5772            return n.content.getContent()[index];
5773          }
5774          index -= n.length;
5775        }
5776      }
5777    };
5778    var typeListInsertGenericsAfter = (transaction, parent, referenceItem, content) => {
5779      let left = referenceItem;
5780      const doc2 = transaction.doc;
5781      const ownClientId = doc2.clientID;
5782      const store = doc2.store;
5783      const right = referenceItem === null ? parent._start : referenceItem.right;
5784      let jsonContent = [];
5785      const packJsonContent = () => {
5786        if (jsonContent.length > 0) {
5787          left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentAny(jsonContent));
5788          left.integrate(transaction, 0);
5789          jsonContent = [];
5790        }
5791      };
5792      content.forEach((c) => {
5793        if (c === null) {
5794          jsonContent.push(c);
5795        } else {
5796          switch (c.constructor) {
5797            case Number:
5798            case Object:
5799            case Boolean:
5800            case Array:
5801            case String:
5802              jsonContent.push(c);
5803              break;
5804            default:
5805              packJsonContent();
5806              switch (c.constructor) {
5807                case Uint8Array:
5808                case ArrayBuffer:
5809                  left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentBinary(new Uint8Array(
5810                    /** @type {Uint8Array} */
5811                    c
5812                  )));
5813                  left.integrate(transaction, 0);
5814                  break;
5815                case Doc:
5816                  left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentDoc(
5817                    /** @type {Doc} */
5818                    c
5819                  ));
5820                  left.integrate(transaction, 0);
5821                  break;
5822                default:
5823                  if (c instanceof AbstractType) {
5824                    left = new Item(createID(ownClientId, getState(store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentType(c));
5825                    left.integrate(transaction, 0);
5826                  } else {
5827                    throw new Error("Unexpected content type in insert operation");
5828                  }
5829              }
5830          }
5831        }
5832      });
5833      packJsonContent();
5834    };
5835    var lengthExceeded = () => create3("Length exceeded!");
5836    var typeListInsertGenerics = (transaction, parent, index, content) => {
5837      if (index > parent._length) {
5838        throw lengthExceeded();
5839      }
5840      if (index === 0) {
5841        if (parent._searchMarker) {
5842          updateMarkerChanges(parent._searchMarker, index, content.length);
5843        }
5844        return typeListInsertGenericsAfter(transaction, parent, null, content);
5845      }
5846      const startIndex = index;
5847      const marker = findMarker(parent, index);
5848      let n = parent._start;
5849      if (marker !== null) {
5850        n = marker.p;
5851        index -= marker.index;
5852        if (index === 0) {
5853          n = n.prev;
5854          index += n && n.countable && !n.deleted ? n.length : 0;
5855        }
5856      }
5857      for (; n !== null; n = n.right) {
5858        if (!n.deleted && n.countable) {
5859          if (index <= n.length) {
5860            if (index < n.length) {
5861              getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index));
5862            }
5863            break;
5864          }
5865          index -= n.length;
5866        }
5867      }
5868      if (parent._searchMarker) {
5869        updateMarkerChanges(parent._searchMarker, startIndex, content.length);
5870      }
5871      return typeListInsertGenericsAfter(transaction, parent, n, content);
5872    };
5873    var typeListPushGenerics = (transaction, parent, content) => {
5874      const marker = (parent._searchMarker || []).reduce((maxMarker, currMarker) => currMarker.index > maxMarker.index ? currMarker : maxMarker, { index: 0, p: parent._start });
5875      let n = marker.p;
5876      if (n) {
5877        while (n.right) {
5878          n = n.right;
5879        }
5880      }
5881      return typeListInsertGenericsAfter(transaction, parent, n, content);
5882    };
5883    var typeListDelete = (transaction, parent, index, length2) => {
5884      if (length2 === 0) {
5885        return;
5886      }
5887      const startIndex = index;
5888      const startLength = length2;
5889      const marker = findMarker(parent, index);
5890      let n = parent._start;
5891      if (marker !== null) {
5892        n = marker.p;
5893        index -= marker.index;
5894      }
5895      for (; n !== null && index > 0; n = n.right) {
5896        if (!n.deleted && n.countable) {
5897          if (index < n.length) {
5898            getItemCleanStart(transaction, createID(n.id.client, n.id.clock + index));
5899          }
5900          index -= n.length;
5901        }
5902      }
5903      while (length2 > 0 && n !== null) {
5904        if (!n.deleted) {
5905          if (length2 < n.length) {
5906            getItemCleanStart(transaction, createID(n.id.client, n.id.clock + length2));
5907          }
5908          n.delete(transaction);
5909          length2 -= n.length;
5910        }
5911        n = n.right;
5912      }
5913      if (length2 > 0) {
5914        throw lengthExceeded();
5915      }
5916      if (parent._searchMarker) {
5917        updateMarkerChanges(
5918          parent._searchMarker,
5919          startIndex,
5920          -startLength + length2
5921          /* in case we remove the above exception */
5922        );
5923      }
5924    };
5925    var typeMapDelete = (transaction, parent, key) => {
5926      const c = parent._map.get(key);
5927      if (c !== void 0) {
5928        c.delete(transaction);
5929      }
5930    };
5931    var typeMapSet = (transaction, parent, key, value) => {
5932      const left = parent._map.get(key) || null;
5933      const doc2 = transaction.doc;
5934      const ownClientId = doc2.clientID;
5935      let content;
5936      if (value == null) {
5937        content = new ContentAny([value]);
5938      } else {
5939        switch (value.constructor) {
5940          case Number:
5941          case Object:
5942          case Boolean:
5943          case Array:
5944          case String:
5945          case Date:
5946          case BigInt:
5947            content = new ContentAny([value]);
5948            break;
5949          case Uint8Array:
5950            content = new ContentBinary(
5951              /** @type {Uint8Array} */
5952              value
5953            );
5954            break;
5955          case Doc:
5956            content = new ContentDoc(
5957              /** @type {Doc} */
5958              value
5959            );
5960            break;
5961          default:
5962            if (value instanceof AbstractType) {
5963              content = new ContentType(value);
5964            } else {
5965              throw new Error("Unexpected content type");
5966            }
5967        }
5968      }
5969      new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, null, null, parent, key, content).integrate(transaction, 0);
5970    };
5971    var typeMapGet = (parent, key) => {
5972      parent.doc ?? warnPrematureAccess();
5973      const val = parent._map.get(key);
5974      return val !== void 0 && !val.deleted ? val.content.getContent()[val.length - 1] : void 0;
5975    };
5976    var typeMapGetAll = (parent) => {
5977      const res = {};
5978      parent.doc ?? warnPrematureAccess();
5979      parent._map.forEach((value, key) => {
5980        if (!value.deleted) {
5981          res[key] = value.content.getContent()[value.length - 1];
5982        }
5983      });
5984      return res;
5985    };
5986    var typeMapHas = (parent, key) => {
5987      parent.doc ?? warnPrematureAccess();
5988      const val = parent._map.get(key);
5989      return val !== void 0 && !val.deleted;
5990    };
5991    var typeMapGetSnapshot = (parent, key, snapshot2) => {
5992      let v = parent._map.get(key) || null;
5993      while (v !== null && (!snapshot2.sv.has(v.id.client) || v.id.clock >= (snapshot2.sv.get(v.id.client) || 0))) {
5994        v = v.left;
5995      }
5996      return v !== null && isVisible(v, snapshot2) ? v.content.getContent()[v.length - 1] : void 0;
5997    };
5998    var typeMapGetAllSnapshot = (parent, snapshot2) => {
5999      const res = {};
6000      parent._map.forEach((value, key) => {
6001        let v = value;
6002        while (v !== null && (!snapshot2.sv.has(v.id.client) || v.id.clock >= (snapshot2.sv.get(v.id.client) || 0))) {
6003          v = v.left;
6004        }
6005        if (v !== null && isVisible(v, snapshot2)) {
6006          res[key] = v.content.getContent()[v.length - 1];
6007        }
6008      });
6009      return res;
6010    };
6011    var createMapIterator = (type) => {
6012      type.doc ?? warnPrematureAccess();
6013      return iteratorFilter(
6014        type._map.entries(),
6015        /** @param {any} entry */
6016        (entry) => !entry[1].deleted
6017      );
6018    };
6019    var YArrayEvent = class extends YEvent {
6020    };
6021    var YArray = class _YArray extends AbstractType {
6022      constructor() {
6023        super();
6024        this._prelimContent = [];
6025        this._searchMarker = [];
6026      }
6027      /**
6028       * Construct a new YArray containing the specified items.
6029       * @template {Object<string,any>|Array<any>|number|null|string|Uint8Array} T
6030       * @param {Array<T>} items
6031       * @return {YArray<T>}
6032       */
6033      static from(items) {
6034        const a = new _YArray();
6035        a.push(items);
6036        return a;
6037      }
6038      /**
6039       * Integrate this type into the Yjs instance.
6040       *
6041       * * Save this struct in the os
6042       * * This type is sent to other client
6043       * * Observer functions are fired
6044       *
6045       * @param {Doc} y The Yjs instance
6046       * @param {Item} item
6047       */
6048      _integrate(y, item) {
6049        super._integrate(y, item);
6050        this.insert(
6051          0,
6052          /** @type {Array<any>} */
6053          this._prelimContent
6054        );
6055        this._prelimContent = null;
6056      }
6057      /**
6058       * @return {YArray<T>}
6059       */
6060      _copy() {
6061        return new _YArray();
6062      }
6063      /**
6064       * Makes a copy of this data type that can be included somewhere else.
6065       *
6066       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
6067       *
6068       * @return {YArray<T>}
6069       */
6070      clone() {
6071        const arr = new _YArray();
6072        arr.insert(0, this.toArray().map(
6073          (el) => el instanceof AbstractType ? (
6074            /** @type {typeof el} */
6075            el.clone()
6076          ) : el
6077        ));
6078        return arr;
6079      }
6080      get length() {
6081        this.doc ?? warnPrematureAccess();
6082        return this._length;
6083      }
6084      /**
6085       * Creates YArrayEvent and calls observers.
6086       *
6087       * @param {Transaction} transaction
6088       * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.
6089       */
6090      _callObserver(transaction, parentSubs) {
6091        super._callObserver(transaction, parentSubs);
6092        callTypeObservers(this, transaction, new YArrayEvent(this, transaction));
6093      }
6094      /**
6095       * Inserts new content at an index.
6096       *
6097       * Important: This function expects an array of content. Not just a content
6098       * object. The reason for this "weirdness" is that inserting several elements
6099       * is very efficient when it is done as a single operation.
6100       *
6101       * @example
6102       *  // Insert character 'a' at position 0
6103       *  yarray.insert(0, ['a'])
6104       *  // Insert numbers 1, 2 at position 1
6105       *  yarray.insert(1, [1, 2])
6106       *
6107       * @param {number} index The index to insert content at.
6108       * @param {Array<T>} content The array of content
6109       */
6110      insert(index, content) {
6111        if (this.doc !== null) {
6112          transact(this.doc, (transaction) => {
6113            typeListInsertGenerics(
6114              transaction,
6115              this,
6116              index,
6117              /** @type {any} */
6118              content
6119            );
6120          });
6121        } else {
6122          this._prelimContent.splice(index, 0, ...content);
6123        }
6124      }
6125      /**
6126       * Appends content to this YArray.
6127       *
6128       * @param {Array<T>} content Array of content to append.
6129       *
6130       * @todo Use the following implementation in all types.
6131       */
6132      push(content) {
6133        if (this.doc !== null) {
6134          transact(this.doc, (transaction) => {
6135            typeListPushGenerics(
6136              transaction,
6137              this,
6138              /** @type {any} */
6139              content
6140            );
6141          });
6142        } else {
6143          this._prelimContent.push(...content);
6144        }
6145      }
6146      /**
6147       * Prepends content to this YArray.
6148       *
6149       * @param {Array<T>} content Array of content to prepend.
6150       */
6151      unshift(content) {
6152        this.insert(0, content);
6153      }
6154      /**
6155       * Deletes elements starting from an index.
6156       *
6157       * @param {number} index Index at which to start deleting elements
6158       * @param {number} length The number of elements to remove. Defaults to 1.
6159       */
6160      delete(index, length2 = 1) {
6161        if (this.doc !== null) {
6162          transact(this.doc, (transaction) => {
6163            typeListDelete(transaction, this, index, length2);
6164          });
6165        } else {
6166          this._prelimContent.splice(index, length2);
6167        }
6168      }
6169      /**
6170       * Returns the i-th element from a YArray.
6171       *
6172       * @param {number} index The index of the element to return from the YArray
6173       * @return {T}
6174       */
6175      get(index) {
6176        return typeListGet(this, index);
6177      }
6178      /**
6179       * Transforms this YArray to a JavaScript Array.
6180       *
6181       * @return {Array<T>}
6182       */
6183      toArray() {
6184        return typeListToArray(this);
6185      }
6186      /**
6187       * Returns a portion of this YArray into a JavaScript Array selected
6188       * from start to end (end not included).
6189       *
6190       * @param {number} [start]
6191       * @param {number} [end]
6192       * @return {Array<T>}
6193       */
6194      slice(start = 0, end = this.length) {
6195        return typeListSlice(this, start, end);
6196      }
6197      /**
6198       * Transforms this Shared Type to a JSON object.
6199       *
6200       * @return {Array<any>}
6201       */
6202      toJSON() {
6203        return this.map((c) => c instanceof AbstractType ? c.toJSON() : c);
6204      }
6205      /**
6206       * Returns an Array with the result of calling a provided function on every
6207       * element of this YArray.
6208       *
6209       * @template M
6210       * @param {function(T,number,YArray<T>):M} f Function that produces an element of the new Array
6211       * @return {Array<M>} A new array with each element being the result of the
6212       *                 callback function
6213       */
6214      map(f) {
6215        return typeListMap(
6216          this,
6217          /** @type {any} */
6218          f
6219        );
6220      }
6221      /**
6222       * Executes a provided function once on every element of this YArray.
6223       *
6224       * @param {function(T,number,YArray<T>):void} f A function to execute on every element of this YArray.
6225       */
6226      forEach(f) {
6227        typeListForEach(this, f);
6228      }
6229      /**
6230       * @return {IterableIterator<T>}
6231       */
6232      [Symbol.iterator]() {
6233        return typeListCreateIterator(this);
6234      }
6235      /**
6236       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
6237       */
6238      _write(encoder) {
6239        encoder.writeTypeRef(YArrayRefID);
6240      }
6241    };
6242    var readYArray = (_decoder) => new YArray();
6243    var YMapEvent = class extends YEvent {
6244      /**
6245       * @param {YMap<T>} ymap The YArray that changed.
6246       * @param {Transaction} transaction
6247       * @param {Set<any>} subs The keys that changed.
6248       */
6249      constructor(ymap, transaction, subs) {
6250        super(ymap, transaction);
6251        this.keysChanged = subs;
6252      }
6253    };
6254    var YMap = class _YMap extends AbstractType {
6255      /**
6256       *
6257       * @param {Iterable<readonly [string, any]>=} entries - an optional iterable to initialize the YMap
6258       */
6259      constructor(entries) {
6260        super();
6261        this._prelimContent = null;
6262        if (entries === void 0) {
6263          this._prelimContent = /* @__PURE__ */ new Map();
6264        } else {
6265          this._prelimContent = new Map(entries);
6266        }
6267      }
6268      /**
6269       * Integrate this type into the Yjs instance.
6270       *
6271       * * Save this struct in the os
6272       * * This type is sent to other client
6273       * * Observer functions are fired
6274       *
6275       * @param {Doc} y The Yjs instance
6276       * @param {Item} item
6277       */
6278      _integrate(y, item) {
6279        super._integrate(y, item);
6280        this._prelimContent.forEach((value, key) => {
6281          this.set(key, value);
6282        });
6283        this._prelimContent = null;
6284      }
6285      /**
6286       * @return {YMap<MapType>}
6287       */
6288      _copy() {
6289        return new _YMap();
6290      }
6291      /**
6292       * Makes a copy of this data type that can be included somewhere else.
6293       *
6294       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
6295       *
6296       * @return {YMap<MapType>}
6297       */
6298      clone() {
6299        const map2 = new _YMap();
6300        this.forEach((value, key) => {
6301          map2.set(key, value instanceof AbstractType ? (
6302            /** @type {typeof value} */
6303            value.clone()
6304          ) : value);
6305        });
6306        return map2;
6307      }
6308      /**
6309       * Creates YMapEvent and calls observers.
6310       *
6311       * @param {Transaction} transaction
6312       * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.
6313       */
6314      _callObserver(transaction, parentSubs) {
6315        callTypeObservers(this, transaction, new YMapEvent(this, transaction, parentSubs));
6316      }
6317      /**
6318       * Transforms this Shared Type to a JSON object.
6319       *
6320       * @return {Object<string,any>}
6321       */
6322      toJSON() {
6323        this.doc ?? warnPrematureAccess();
6324        const map2 = {};
6325        this._map.forEach((item, key) => {
6326          if (!item.deleted) {
6327            const v = item.content.getContent()[item.length - 1];
6328            map2[key] = v instanceof AbstractType ? v.toJSON() : v;
6329          }
6330        });
6331        return map2;
6332      }
6333      /**
6334       * Returns the size of the YMap (count of key/value pairs)
6335       *
6336       * @return {number}
6337       */
6338      get size() {
6339        return [...createMapIterator(this)].length;
6340      }
6341      /**
6342       * Returns the keys for each element in the YMap Type.
6343       *
6344       * @return {IterableIterator<string>}
6345       */
6346      keys() {
6347        return iteratorMap(
6348          createMapIterator(this),
6349          /** @param {any} v */
6350          (v) => v[0]
6351        );
6352      }
6353      /**
6354       * Returns the values for each element in the YMap Type.
6355       *
6356       * @return {IterableIterator<MapType>}
6357       */
6358      values() {
6359        return iteratorMap(
6360          createMapIterator(this),
6361          /** @param {any} v */
6362          (v) => v[1].content.getContent()[v[1].length - 1]
6363        );
6364      }
6365      /**
6366       * Returns an Iterator of [key, value] pairs
6367       *
6368       * @return {IterableIterator<[string, MapType]>}
6369       */
6370      entries() {
6371        return iteratorMap(
6372          createMapIterator(this),
6373          /** @param {any} v */
6374          (v) => (
6375            /** @type {any} */
6376            [v[0], v[1].content.getContent()[v[1].length - 1]]
6377          )
6378        );
6379      }
6380      /**
6381       * Executes a provided function on once on every key-value pair.
6382       *
6383       * @param {function(MapType,string,YMap<MapType>):void} f A function to execute on every element of this YArray.
6384       */
6385      forEach(f) {
6386        this.doc ?? warnPrematureAccess();
6387        this._map.forEach((item, key) => {
6388          if (!item.deleted) {
6389            f(item.content.getContent()[item.length - 1], key, this);
6390          }
6391        });
6392      }
6393      /**
6394       * Returns an Iterator of [key, value] pairs
6395       *
6396       * @return {IterableIterator<[string, MapType]>}
6397       */
6398      [Symbol.iterator]() {
6399        return this.entries();
6400      }
6401      /**
6402       * Remove a specified element from this YMap.
6403       *
6404       * @param {string} key The key of the element to remove.
6405       */
6406      delete(key) {
6407        if (this.doc !== null) {
6408          transact(this.doc, (transaction) => {
6409            typeMapDelete(transaction, this, key);
6410          });
6411        } else {
6412          this._prelimContent.delete(key);
6413        }
6414      }
6415      /**
6416       * Adds or updates an element with a specified key and value.
6417       * @template {MapType} VAL
6418       *
6419       * @param {string} key The key of the element to add to this YMap
6420       * @param {VAL} value The value of the element to add
6421       * @return {VAL}
6422       */
6423      set(key, value) {
6424        if (this.doc !== null) {
6425          transact(this.doc, (transaction) => {
6426            typeMapSet(
6427              transaction,
6428              this,
6429              key,
6430              /** @type {any} */
6431              value
6432            );
6433          });
6434        } else {
6435          this._prelimContent.set(key, value);
6436        }
6437        return value;
6438      }
6439      /**
6440       * Returns a specified element from this YMap.
6441       *
6442       * @param {string} key
6443       * @return {MapType|undefined}
6444       */
6445      get(key) {
6446        return (
6447          /** @type {any} */
6448          typeMapGet(this, key)
6449        );
6450      }
6451      /**
6452       * Returns a boolean indicating whether the specified key exists or not.
6453       *
6454       * @param {string} key The key to test.
6455       * @return {boolean}
6456       */
6457      has(key) {
6458        return typeMapHas(this, key);
6459      }
6460      /**
6461       * Removes all elements from this YMap.
6462       */
6463      clear() {
6464        if (this.doc !== null) {
6465          transact(this.doc, (transaction) => {
6466            this.forEach(function(_value, key, map2) {
6467              typeMapDelete(transaction, map2, key);
6468            });
6469          });
6470        } else {
6471          this._prelimContent.clear();
6472        }
6473      }
6474      /**
6475       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
6476       */
6477      _write(encoder) {
6478        encoder.writeTypeRef(YMapRefID);
6479      }
6480    };
6481    var readYMap = (_decoder) => new YMap();
6482    var equalAttrs = (a, b) => a === b || typeof a === "object" && typeof b === "object" && a && b && equalFlat(a, b);
6483    var ItemTextListPosition = class {
6484      /**
6485       * @param {Item|null} left
6486       * @param {Item|null} right
6487       * @param {number} index
6488       * @param {Map<string,any>} currentAttributes
6489       */
6490      constructor(left, right, index, currentAttributes) {
6491        this.left = left;
6492        this.right = right;
6493        this.index = index;
6494        this.currentAttributes = currentAttributes;
6495      }
6496      /**
6497       * Only call this if you know that this.right is defined
6498       */
6499      forward() {
6500        if (this.right === null) {
6501          unexpectedCase();
6502        }
6503        switch (this.right.content.constructor) {
6504          case ContentFormat:
6505            if (!this.right.deleted) {
6506              updateCurrentAttributes(
6507                this.currentAttributes,
6508                /** @type {ContentFormat} */
6509                this.right.content
6510              );
6511            }
6512            break;
6513          default:
6514            if (!this.right.deleted) {
6515              this.index += this.right.length;
6516            }
6517            break;
6518        }
6519        this.left = this.right;
6520        this.right = this.right.right;
6521      }
6522    };
6523    var findNextPosition = (transaction, pos, count) => {
6524      while (pos.right !== null && count > 0) {
6525        switch (pos.right.content.constructor) {
6526          case ContentFormat:
6527            if (!pos.right.deleted) {
6528              updateCurrentAttributes(
6529                pos.currentAttributes,
6530                /** @type {ContentFormat} */
6531                pos.right.content
6532              );
6533            }
6534            break;
6535          default:
6536            if (!pos.right.deleted) {
6537              if (count < pos.right.length) {
6538                getItemCleanStart(transaction, createID(pos.right.id.client, pos.right.id.clock + count));
6539              }
6540              pos.index += pos.right.length;
6541              count -= pos.right.length;
6542            }
6543            break;
6544        }
6545        pos.left = pos.right;
6546        pos.right = pos.right.right;
6547      }
6548      return pos;
6549    };
6550    var findPosition = (transaction, parent, index, useSearchMarker) => {
6551      const currentAttributes = /* @__PURE__ */ new Map();
6552      const marker = useSearchMarker ? findMarker(parent, index) : null;
6553      if (marker) {
6554        const pos = new ItemTextListPosition(marker.p.left, marker.p, marker.index, currentAttributes);
6555        return findNextPosition(transaction, pos, index - marker.index);
6556      } else {
6557        const pos = new ItemTextListPosition(null, parent._start, 0, currentAttributes);
6558        return findNextPosition(transaction, pos, index);
6559      }
6560    };
6561    var insertNegatedAttributes = (transaction, parent, currPos, negatedAttributes) => {
6562      while (currPos.right !== null && (currPos.right.deleted === true || currPos.right.content.constructor === ContentFormat && equalAttrs(
6563        negatedAttributes.get(
6564          /** @type {ContentFormat} */
6565          currPos.right.content.key
6566        ),
6567        /** @type {ContentFormat} */
6568        currPos.right.content.value
6569      ))) {
6570        if (!currPos.right.deleted) {
6571          negatedAttributes.delete(
6572            /** @type {ContentFormat} */
6573            currPos.right.content.key
6574          );
6575        }
6576        currPos.forward();
6577      }
6578      const doc2 = transaction.doc;
6579      const ownClientId = doc2.clientID;
6580      negatedAttributes.forEach((val, key) => {
6581        const left = currPos.left;
6582        const right = currPos.right;
6583        const nextFormat = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val));
6584        nextFormat.integrate(transaction, 0);
6585        currPos.right = nextFormat;
6586        currPos.forward();
6587      });
6588    };
6589    var updateCurrentAttributes = (currentAttributes, format) => {
6590      const { key, value } = format;
6591      if (value === null) {
6592        currentAttributes.delete(key);
6593      } else {
6594        currentAttributes.set(key, value);
6595      }
6596    };
6597    var minimizeAttributeChanges = (currPos, attributes) => {
6598      while (true) {
6599        if (currPos.right === null) {
6600          break;
6601        } else if (currPos.right.deleted || currPos.right.content.constructor === ContentFormat && equalAttrs(
6602          attributes[
6603            /** @type {ContentFormat} */
6604            currPos.right.content.key
6605          ] ?? null,
6606          /** @type {ContentFormat} */
6607          currPos.right.content.value
6608        )) ;
6609        else {
6610          break;
6611        }
6612        currPos.forward();
6613      }
6614    };
6615    var insertAttributes = (transaction, parent, currPos, attributes) => {
6616      const doc2 = transaction.doc;
6617      const ownClientId = doc2.clientID;
6618      const negatedAttributes = /* @__PURE__ */ new Map();
6619      for (const key in attributes) {
6620        const val = attributes[key];
6621        const currentVal = currPos.currentAttributes.get(key) ?? null;
6622        if (!equalAttrs(currentVal, val)) {
6623          negatedAttributes.set(key, currentVal);
6624          const { left, right } = currPos;
6625          currPos.right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, new ContentFormat(key, val));
6626          currPos.right.integrate(transaction, 0);
6627          currPos.forward();
6628        }
6629      }
6630      return negatedAttributes;
6631    };
6632    var insertText = (transaction, parent, currPos, text2, attributes) => {
6633      currPos.currentAttributes.forEach((_val, key) => {
6634        if (attributes[key] === void 0) {
6635          attributes[key] = null;
6636        }
6637      });
6638      const doc2 = transaction.doc;
6639      const ownClientId = doc2.clientID;
6640      minimizeAttributeChanges(currPos, attributes);
6641      const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes);
6642      const content = text2.constructor === String ? new ContentString(
6643        /** @type {string} */
6644        text2
6645      ) : text2 instanceof AbstractType ? new ContentType(text2) : new ContentEmbed(text2);
6646      let { left, right, index } = currPos;
6647      if (parent._searchMarker) {
6648        updateMarkerChanges(parent._searchMarker, currPos.index, content.getLength());
6649      }
6650      right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), left, left && left.lastId, right, right && right.id, parent, null, content);
6651      right.integrate(transaction, 0);
6652      currPos.right = right;
6653      currPos.index = index;
6654      currPos.forward();
6655      insertNegatedAttributes(transaction, parent, currPos, negatedAttributes);
6656    };
6657    var formatText = (transaction, parent, currPos, length2, attributes) => {
6658      const doc2 = transaction.doc;
6659      const ownClientId = doc2.clientID;
6660      minimizeAttributeChanges(currPos, attributes);
6661      const negatedAttributes = insertAttributes(transaction, parent, currPos, attributes);
6662      iterationLoop: while (currPos.right !== null && (length2 > 0 || negatedAttributes.size > 0 && (currPos.right.deleted || currPos.right.content.constructor === ContentFormat))) {
6663        if (!currPos.right.deleted) {
6664          switch (currPos.right.content.constructor) {
6665            case ContentFormat: {
6666              const { key, value } = (
6667                /** @type {ContentFormat} */
6668                currPos.right.content
6669              );
6670              const attr = attributes[key];
6671              if (attr !== void 0) {
6672                if (equalAttrs(attr, value)) {
6673                  negatedAttributes.delete(key);
6674                } else {
6675                  if (length2 === 0) {
6676                    break iterationLoop;
6677                  }
6678                  negatedAttributes.set(key, value);
6679                }
6680                currPos.right.delete(transaction);
6681              } else {
6682                currPos.currentAttributes.set(key, value);
6683              }
6684              break;
6685            }
6686            default:
6687              if (length2 < currPos.right.length) {
6688                getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length2));
6689              }
6690              length2 -= currPos.right.length;
6691              break;
6692          }
6693        }
6694        currPos.forward();
6695      }
6696      if (length2 > 0) {
6697        let newlines = "";
6698        for (; length2 > 0; length2--) {
6699          newlines += "\n";
6700        }
6701        currPos.right = new Item(createID(ownClientId, getState(doc2.store, ownClientId)), currPos.left, currPos.left && currPos.left.lastId, currPos.right, currPos.right && currPos.right.id, parent, null, new ContentString(newlines));
6702        currPos.right.integrate(transaction, 0);
6703        currPos.forward();
6704      }
6705      insertNegatedAttributes(transaction, parent, currPos, negatedAttributes);
6706    };
6707    var cleanupFormattingGap = (transaction, start, curr, startAttributes, currAttributes) => {
6708      let end = start;
6709      const endFormats = create();
6710      while (end && (!end.countable || end.deleted)) {
6711        if (!end.deleted && end.content.constructor === ContentFormat) {
6712          const cf = (
6713            /** @type {ContentFormat} */
6714            end.content
6715          );
6716          endFormats.set(cf.key, cf);
6717        }
6718        end = end.right;
6719      }
6720      let cleanups = 0;
6721      let reachedCurr = false;
6722      while (start !== end) {
6723        if (curr === start) {
6724          reachedCurr = true;
6725        }
6726        if (!start.deleted) {
6727          const content = start.content;
6728          switch (content.constructor) {
6729            case ContentFormat: {
6730              const { key, value } = (
6731                /** @type {ContentFormat} */
6732                content
6733              );
6734              const startAttrValue = startAttributes.get(key) ?? null;
6735              if (endFormats.get(key) !== content || startAttrValue === value) {
6736                start.delete(transaction);
6737                cleanups++;
6738                if (!reachedCurr && (currAttributes.get(key) ?? null) === value && startAttrValue !== value) {
6739                  if (startAttrValue === null) {
6740                    currAttributes.delete(key);
6741                  } else {
6742                    currAttributes.set(key, startAttrValue);
6743                  }
6744                }
6745              }
6746              if (!reachedCurr && !start.deleted) {
6747                updateCurrentAttributes(
6748                  currAttributes,
6749                  /** @type {ContentFormat} */
6750                  content
6751                );
6752              }
6753              break;
6754            }
6755          }
6756        }
6757        start = /** @type {Item} */
6758        start.right;
6759      }
6760      return cleanups;
6761    };
6762    var cleanupContextlessFormattingGap = (transaction, item) => {
6763      while (item && item.right && (item.right.deleted || !item.right.countable)) {
6764        item = item.right;
6765      }
6766      const attrs = /* @__PURE__ */ new Set();
6767      while (item && (item.deleted || !item.countable)) {
6768        if (!item.deleted && item.content.constructor === ContentFormat) {
6769          const key = (
6770            /** @type {ContentFormat} */
6771            item.content.key
6772          );
6773          if (attrs.has(key)) {
6774            item.delete(transaction);
6775          } else {
6776            attrs.add(key);
6777          }
6778        }
6779        item = item.left;
6780      }
6781    };
6782    var cleanupYTextFormatting = (type) => {
6783      let res = 0;
6784      transact(
6785        /** @type {Doc} */
6786        type.doc,
6787        (transaction) => {
6788          let start = (
6789            /** @type {Item} */
6790            type._start
6791          );
6792          let end = type._start;
6793          let startAttributes = create();
6794          const currentAttributes = copy(startAttributes);
6795          while (end) {
6796            if (end.deleted === false) {
6797              switch (end.content.constructor) {
6798                case ContentFormat:
6799                  updateCurrentAttributes(
6800                    currentAttributes,
6801                    /** @type {ContentFormat} */
6802                    end.content
6803                  );
6804                  break;
6805                default:
6806                  res += cleanupFormattingGap(transaction, start, end, startAttributes, currentAttributes);
6807                  startAttributes = copy(currentAttributes);
6808                  start = end;
6809                  break;
6810              }
6811            }
6812            end = end.right;
6813          }
6814        }
6815      );
6816      return res;
6817    };
6818    var cleanupYTextAfterTransaction = (transaction) => {
6819      const needFullCleanup = /* @__PURE__ */ new Set();
6820      const doc2 = transaction.doc;
6821      for (const [client, afterClock] of transaction.afterState.entries()) {
6822        const clock = transaction.beforeState.get(client) || 0;
6823        if (afterClock === clock) {
6824          continue;
6825        }
6826        iterateStructs(
6827          transaction,
6828          /** @type {Array<Item|GC>} */
6829          doc2.store.clients.get(client),
6830          clock,
6831          afterClock,
6832          (item) => {
6833            if (!item.deleted && /** @type {Item} */
6834            item.content.constructor === ContentFormat && item.constructor !== GC) {
6835              needFullCleanup.add(
6836                /** @type {any} */
6837                item.parent
6838              );
6839            }
6840          }
6841        );
6842      }
6843      transact(doc2, (t) => {
6844        iterateDeletedStructs(transaction, transaction.deleteSet, (item) => {
6845          if (item instanceof GC || !/** @type {YText} */
6846          item.parent._hasFormatting || needFullCleanup.has(
6847            /** @type {YText} */
6848            item.parent
6849          )) {
6850            return;
6851          }
6852          const parent = (
6853            /** @type {YText} */
6854            item.parent
6855          );
6856          if (item.content.constructor === ContentFormat) {
6857            needFullCleanup.add(parent);
6858          } else {
6859            cleanupContextlessFormattingGap(t, item);
6860          }
6861        });
6862        for (const yText of needFullCleanup) {
6863          cleanupYTextFormatting(yText);
6864        }
6865      });
6866    };
6867    var deleteText = (transaction, currPos, length2) => {
6868      const startLength = length2;
6869      const startAttrs = copy(currPos.currentAttributes);
6870      const start = currPos.right;
6871      while (length2 > 0 && currPos.right !== null) {
6872        if (currPos.right.deleted === false) {
6873          switch (currPos.right.content.constructor) {
6874            case ContentType:
6875            case ContentEmbed:
6876            case ContentString:
6877              if (length2 < currPos.right.length) {
6878                getItemCleanStart(transaction, createID(currPos.right.id.client, currPos.right.id.clock + length2));
6879              }
6880              length2 -= currPos.right.length;
6881              currPos.right.delete(transaction);
6882              break;
6883          }
6884        }
6885        currPos.forward();
6886      }
6887      if (start) {
6888        cleanupFormattingGap(transaction, start, currPos.right, startAttrs, currPos.currentAttributes);
6889      }
6890      const parent = (
6891        /** @type {AbstractType<any>} */
6892        /** @type {Item} */
6893        (currPos.left || currPos.right).parent
6894      );
6895      if (parent._searchMarker) {
6896        updateMarkerChanges(parent._searchMarker, currPos.index, -startLength + length2);
6897      }
6898      return currPos;
6899    };
6900    var YTextEvent = class extends YEvent {
6901      /**
6902       * @param {YText} ytext
6903       * @param {Transaction} transaction
6904       * @param {Set<any>} subs The keys that changed
6905       */
6906      constructor(ytext, transaction, subs) {
6907        super(ytext, transaction);
6908        this.childListChanged = false;
6909        this.keysChanged = /* @__PURE__ */ new Set();
6910        subs.forEach((sub) => {
6911          if (sub === null) {
6912            this.childListChanged = true;
6913          } else {
6914            this.keysChanged.add(sub);
6915          }
6916        });
6917      }
6918      /**
6919       * @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}>}}
6920       */
6921      get changes() {
6922        if (this._changes === null) {
6923          const changes = {
6924            keys: this.keys,
6925            delta: this.delta,
6926            added: /* @__PURE__ */ new Set(),
6927            deleted: /* @__PURE__ */ new Set()
6928          };
6929          this._changes = changes;
6930        }
6931        return (
6932          /** @type {any} */
6933          this._changes
6934        );
6935      }
6936      /**
6937       * Compute the changes in the delta format.
6938       * A {@link https://quilljs.com/docs/delta/|Quill Delta}) that represents the changes on the document.
6939       *
6940       * @type {Array<{insert?:string|object|AbstractType<any>, delete?:number, retain?:number, attributes?: Object<string,any>}>}
6941       *
6942       * @public
6943       */
6944      get delta() {
6945        if (this._delta === null) {
6946          const y = (
6947            /** @type {Doc} */
6948            this.target.doc
6949          );
6950          const delta = [];
6951          transact(y, (transaction) => {
6952            const currentAttributes = /* @__PURE__ */ new Map();
6953            const oldAttributes = /* @__PURE__ */ new Map();
6954            let item = this.target._start;
6955            let action = null;
6956            const attributes = {};
6957            let insert = "";
6958            let retain = 0;
6959            let deleteLen = 0;
6960            const addOp = () => {
6961              if (action !== null) {
6962                let op = null;
6963                switch (action) {
6964                  case "delete":
6965                    if (deleteLen > 0) {
6966                      op = { delete: deleteLen };
6967                    }
6968                    deleteLen = 0;
6969                    break;
6970                  case "insert":
6971                    if (typeof insert === "object" || insert.length > 0) {
6972                      op = { insert };
6973                      if (currentAttributes.size > 0) {
6974                        op.attributes = {};
6975                        currentAttributes.forEach((value, key) => {
6976                          if (value !== null) {
6977                            op.attributes[key] = value;
6978                          }
6979                        });
6980                      }
6981                    }
6982                    insert = "";
6983                    break;
6984                  case "retain":
6985                    if (retain > 0) {
6986                      op = { retain };
6987                      if (!isEmpty(attributes)) {
6988                        op.attributes = assign({}, attributes);
6989                      }
6990                    }
6991                    retain = 0;
6992                    break;
6993                }
6994                if (op) delta.push(op);
6995                action = null;
6996              }
6997            };
6998            while (item !== null) {
6999              switch (item.content.constructor) {
7000                case ContentType:
7001                case ContentEmbed:
7002                  if (this.adds(item)) {
7003                    if (!this.deletes(item)) {
7004                      addOp();
7005                      action = "insert";
7006                      insert = item.content.getContent()[0];
7007                      addOp();
7008                    }
7009                  } else if (this.deletes(item)) {
7010                    if (action !== "delete") {
7011                      addOp();
7012                      action = "delete";
7013                    }
7014                    deleteLen += 1;
7015                  } else if (!item.deleted) {
7016                    if (action !== "retain") {
7017                      addOp();
7018                      action = "retain";
7019                    }
7020                    retain += 1;
7021                  }
7022                  break;
7023                case ContentString:
7024                  if (this.adds(item)) {
7025                    if (!this.deletes(item)) {
7026                      if (action !== "insert") {
7027                        addOp();
7028                        action = "insert";
7029                      }
7030                      insert += /** @type {ContentString} */
7031                      item.content.str;
7032                    }
7033                  } else if (this.deletes(item)) {
7034                    if (action !== "delete") {
7035                      addOp();
7036                      action = "delete";
7037                    }
7038                    deleteLen += item.length;
7039                  } else if (!item.deleted) {
7040                    if (action !== "retain") {
7041                      addOp();
7042                      action = "retain";
7043                    }
7044                    retain += item.length;
7045                  }
7046                  break;
7047                case ContentFormat: {
7048                  const { key, value } = (
7049                    /** @type {ContentFormat} */
7050                    item.content
7051                  );
7052                  if (this.adds(item)) {
7053                    if (!this.deletes(item)) {
7054                      const curVal = currentAttributes.get(key) ?? null;
7055                      if (!equalAttrs(curVal, value)) {
7056                        if (action === "retain") {
7057                          addOp();
7058                        }
7059                        if (equalAttrs(value, oldAttributes.get(key) ?? null)) {
7060                          delete attributes[key];
7061                        } else {
7062                          attributes[key] = value;
7063                        }
7064                      } else if (value !== null) {
7065                        item.delete(transaction);
7066                      }
7067                    }
7068                  } else if (this.deletes(item)) {
7069                    oldAttributes.set(key, value);
7070                    const curVal = currentAttributes.get(key) ?? null;
7071                    if (!equalAttrs(curVal, value)) {
7072                      if (action === "retain") {
7073                        addOp();
7074                      }
7075                      attributes[key] = curVal;
7076                    }
7077                  } else if (!item.deleted) {
7078                    oldAttributes.set(key, value);
7079                    const attr = attributes[key];
7080                    if (attr !== void 0) {
7081                      if (!equalAttrs(attr, value)) {
7082                        if (action === "retain") {
7083                          addOp();
7084                        }
7085                        if (value === null) {
7086                          delete attributes[key];
7087                        } else {
7088                          attributes[key] = value;
7089                        }
7090                      } else if (attr !== null) {
7091                        item.delete(transaction);
7092                      }
7093                    }
7094                  }
7095                  if (!item.deleted) {
7096                    if (action === "insert") {
7097                      addOp();
7098                    }
7099                    updateCurrentAttributes(
7100                      currentAttributes,
7101                      /** @type {ContentFormat} */
7102                      item.content
7103                    );
7104                  }
7105                  break;
7106                }
7107              }
7108              item = item.right;
7109            }
7110            addOp();
7111            while (delta.length > 0) {
7112              const lastOp = delta[delta.length - 1];
7113              if (lastOp.retain !== void 0 && lastOp.attributes === void 0) {
7114                delta.pop();
7115              } else {
7116                break;
7117              }
7118            }
7119          });
7120          this._delta = delta;
7121        }
7122        return (
7123          /** @type {any} */
7124          this._delta
7125        );
7126      }
7127    };
7128    var YText = class _YText extends AbstractType {
7129      /**
7130       * @param {String} [string] The initial value of the YText.
7131       */
7132      constructor(string) {
7133        super();
7134        this._pending = string !== void 0 ? [() => this.insert(0, string)] : [];
7135        this._searchMarker = [];
7136        this._hasFormatting = false;
7137      }
7138      /**
7139       * Number of characters of this text type.
7140       *
7141       * @type {number}
7142       */
7143      get length() {
7144        this.doc ?? warnPrematureAccess();
7145        return this._length;
7146      }
7147      /**
7148       * @param {Doc} y
7149       * @param {Item} item
7150       */
7151      _integrate(y, item) {
7152        super._integrate(y, item);
7153        try {
7154          this._pending.forEach((f) => f());
7155        } catch (e) {
7156          console.error(e);
7157        }
7158        this._pending = null;
7159      }
7160      _copy() {
7161        return new _YText();
7162      }
7163      /**
7164       * Makes a copy of this data type that can be included somewhere else.
7165       *
7166       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
7167       *
7168       * @return {YText}
7169       */
7170      clone() {
7171        const text2 = new _YText();
7172        text2.applyDelta(this.toDelta());
7173        return text2;
7174      }
7175      /**
7176       * Creates YTextEvent and calls observers.
7177       *
7178       * @param {Transaction} transaction
7179       * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.
7180       */
7181      _callObserver(transaction, parentSubs) {
7182        super._callObserver(transaction, parentSubs);
7183        const event = new YTextEvent(this, transaction, parentSubs);
7184        callTypeObservers(this, transaction, event);
7185        if (!transaction.local && this._hasFormatting) {
7186          transaction._needFormattingCleanup = true;
7187        }
7188      }
7189      /**
7190       * Returns the unformatted string representation of this YText type.
7191       *
7192       * @public
7193       */
7194      toString() {
7195        this.doc ?? warnPrematureAccess();
7196        let str = "";
7197        let n = this._start;
7198        while (n !== null) {
7199          if (!n.deleted && n.countable && n.content.constructor === ContentString) {
7200            str += /** @type {ContentString} */
7201            n.content.str;
7202          }
7203          n = n.right;
7204        }
7205        return str;
7206      }
7207      /**
7208       * Returns the unformatted string representation of this YText type.
7209       *
7210       * @return {string}
7211       * @public
7212       */
7213      toJSON() {
7214        return this.toString();
7215      }
7216      /**
7217       * Apply a {@link Delta} on this shared YText type.
7218       *
7219       * @param {Array<any>} delta The changes to apply on this element.
7220       * @param {object}  opts
7221       * @param {boolean} [opts.sanitize] Sanitize input delta. Removes ending newlines if set to true.
7222       *
7223       *
7224       * @public
7225       */
7226      applyDelta(delta, { sanitize = true } = {}) {
7227        if (this.doc !== null) {
7228          transact(this.doc, (transaction) => {
7229            const currPos = new ItemTextListPosition(null, this._start, 0, /* @__PURE__ */ new Map());
7230            for (let i = 0; i < delta.length; i++) {
7231              const op = delta[i];
7232              if (op.insert !== void 0) {
7233                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;
7234                if (typeof ins !== "string" || ins.length > 0) {
7235                  insertText(transaction, this, currPos, ins, op.attributes || {});
7236                }
7237              } else if (op.retain !== void 0) {
7238                formatText(transaction, this, currPos, op.retain, op.attributes || {});
7239              } else if (op.delete !== void 0) {
7240                deleteText(transaction, currPos, op.delete);
7241              }
7242            }
7243          });
7244        } else {
7245          this._pending.push(() => this.applyDelta(delta));
7246        }
7247      }
7248      /**
7249       * Returns the Delta representation of this YText type.
7250       *
7251       * @param {Snapshot} [snapshot]
7252       * @param {Snapshot} [prevSnapshot]
7253       * @param {function('removed' | 'added', ID):any} [computeYChange]
7254       * @return {any} The Delta representation of this type.
7255       *
7256       * @public
7257       */
7258      toDelta(snapshot2, prevSnapshot, computeYChange) {
7259        this.doc ?? warnPrematureAccess();
7260        const ops = [];
7261        const currentAttributes = /* @__PURE__ */ new Map();
7262        const doc2 = (
7263          /** @type {Doc} */
7264          this.doc
7265        );
7266        let str = "";
7267        let n = this._start;
7268        function packStr() {
7269          if (str.length > 0) {
7270            const attributes = {};
7271            let addAttributes = false;
7272            currentAttributes.forEach((value, key) => {
7273              addAttributes = true;
7274              attributes[key] = value;
7275            });
7276            const op = { insert: str };
7277            if (addAttributes) {
7278              op.attributes = attributes;
7279            }
7280            ops.push(op);
7281            str = "";
7282          }
7283        }
7284        const computeDelta = () => {
7285          while (n !== null) {
7286            if (isVisible(n, snapshot2) || prevSnapshot !== void 0 && isVisible(n, prevSnapshot)) {
7287              switch (n.content.constructor) {
7288                case ContentString: {
7289                  const cur = currentAttributes.get("ychange");
7290                  if (snapshot2 !== void 0 && !isVisible(n, snapshot2)) {
7291                    if (cur === void 0 || cur.user !== n.id.client || cur.type !== "removed") {
7292                      packStr();
7293                      currentAttributes.set("ychange", computeYChange ? computeYChange("removed", n.id) : { type: "removed" });
7294                    }
7295                  } else if (prevSnapshot !== void 0 && !isVisible(n, prevSnapshot)) {
7296                    if (cur === void 0 || cur.user !== n.id.client || cur.type !== "added") {
7297                      packStr();
7298                      currentAttributes.set("ychange", computeYChange ? computeYChange("added", n.id) : { type: "added" });
7299                    }
7300                  } else if (cur !== void 0) {
7301                    packStr();
7302                    currentAttributes.delete("ychange");
7303                  }
7304                  str += /** @type {ContentString} */
7305                  n.content.str;
7306                  break;
7307                }
7308                case ContentType:
7309                case ContentEmbed: {
7310                  packStr();
7311                  const op = {
7312                    insert: n.content.getContent()[0]
7313                  };
7314                  if (currentAttributes.size > 0) {
7315                    const attrs = (
7316                      /** @type {Object<string,any>} */
7317                      {}
7318                    );
7319                    op.attributes = attrs;
7320                    currentAttributes.forEach((value, key) => {
7321                      attrs[key] = value;
7322                    });
7323                  }
7324                  ops.push(op);
7325                  break;
7326                }
7327                case ContentFormat:
7328                  if (isVisible(n, snapshot2)) {
7329                    packStr();
7330                    updateCurrentAttributes(
7331                      currentAttributes,
7332                      /** @type {ContentFormat} */
7333                      n.content
7334                    );
7335                  }
7336                  break;
7337              }
7338            }
7339            n = n.right;
7340          }
7341          packStr();
7342        };
7343        if (snapshot2 || prevSnapshot) {
7344          transact(doc2, (transaction) => {
7345            if (snapshot2) {
7346              splitSnapshotAffectedStructs(transaction, snapshot2);
7347            }
7348            if (prevSnapshot) {
7349              splitSnapshotAffectedStructs(transaction, prevSnapshot);
7350            }
7351            computeDelta();
7352          }, "cleanup");
7353        } else {
7354          computeDelta();
7355        }
7356        return ops;
7357      }
7358      /**
7359       * Insert text at a given index.
7360       *
7361       * @param {number} index The index at which to start inserting.
7362       * @param {String} text The text to insert at the specified position.
7363       * @param {TextAttributes} [attributes] Optionally define some formatting
7364       *                                    information to apply on the inserted
7365       *                                    Text.
7366       * @public
7367       */
7368      insert(index, text2, attributes) {
7369        if (text2.length <= 0) {
7370          return;
7371        }
7372        const y = this.doc;
7373        if (y !== null) {
7374          transact(y, (transaction) => {
7375            const pos = findPosition(transaction, this, index, !attributes);
7376            if (!attributes) {
7377              attributes = {};
7378              pos.currentAttributes.forEach((v, k) => {
7379                attributes[k] = v;
7380              });
7381            }
7382            insertText(transaction, this, pos, text2, attributes);
7383          });
7384        } else {
7385          this._pending.push(() => this.insert(index, text2, attributes));
7386        }
7387      }
7388      /**
7389       * Inserts an embed at a index.
7390       *
7391       * @param {number} index The index to insert the embed at.
7392       * @param {Object | AbstractType<any>} embed The Object that represents the embed.
7393       * @param {TextAttributes} [attributes] Attribute information to apply on the
7394       *                                    embed
7395       *
7396       * @public
7397       */
7398      insertEmbed(index, embed, attributes) {
7399        const y = this.doc;
7400        if (y !== null) {
7401          transact(y, (transaction) => {
7402            const pos = findPosition(transaction, this, index, !attributes);
7403            insertText(transaction, this, pos, embed, attributes || {});
7404          });
7405        } else {
7406          this._pending.push(() => this.insertEmbed(index, embed, attributes || {}));
7407        }
7408      }
7409      /**
7410       * Deletes text starting from an index.
7411       *
7412       * @param {number} index Index at which to start deleting.
7413       * @param {number} length The number of characters to remove. Defaults to 1.
7414       *
7415       * @public
7416       */
7417      delete(index, length2) {
7418        if (length2 === 0) {
7419          return;
7420        }
7421        const y = this.doc;
7422        if (y !== null) {
7423          transact(y, (transaction) => {
7424            deleteText(transaction, findPosition(transaction, this, index, true), length2);
7425          });
7426        } else {
7427          this._pending.push(() => this.delete(index, length2));
7428        }
7429      }
7430      /**
7431       * Assigns properties to a range of text.
7432       *
7433       * @param {number} index The position where to start formatting.
7434       * @param {number} length The amount of characters to assign properties to.
7435       * @param {TextAttributes} attributes Attribute information to apply on the
7436       *                                    text.
7437       *
7438       * @public
7439       */
7440      format(index, length2, attributes) {
7441        if (length2 === 0) {
7442          return;
7443        }
7444        const y = this.doc;
7445        if (y !== null) {
7446          transact(y, (transaction) => {
7447            const pos = findPosition(transaction, this, index, false);
7448            if (pos.right === null) {
7449              return;
7450            }
7451            formatText(transaction, this, pos, length2, attributes);
7452          });
7453        } else {
7454          this._pending.push(() => this.format(index, length2, attributes));
7455        }
7456      }
7457      /**
7458       * Removes an attribute.
7459       *
7460       * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.
7461       *
7462       * @param {String} attributeName The attribute name that is to be removed.
7463       *
7464       * @public
7465       */
7466      removeAttribute(attributeName) {
7467        if (this.doc !== null) {
7468          transact(this.doc, (transaction) => {
7469            typeMapDelete(transaction, this, attributeName);
7470          });
7471        } else {
7472          this._pending.push(() => this.removeAttribute(attributeName));
7473        }
7474      }
7475      /**
7476       * Sets or updates an attribute.
7477       *
7478       * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.
7479       *
7480       * @param {String} attributeName The attribute name that is to be set.
7481       * @param {any} attributeValue The attribute value that is to be set.
7482       *
7483       * @public
7484       */
7485      setAttribute(attributeName, attributeValue) {
7486        if (this.doc !== null) {
7487          transact(this.doc, (transaction) => {
7488            typeMapSet(transaction, this, attributeName, attributeValue);
7489          });
7490        } else {
7491          this._pending.push(() => this.setAttribute(attributeName, attributeValue));
7492        }
7493      }
7494      /**
7495       * Returns an attribute value that belongs to the attribute name.
7496       *
7497       * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.
7498       *
7499       * @param {String} attributeName The attribute name that identifies the
7500       *                               queried value.
7501       * @return {any} The queried attribute value.
7502       *
7503       * @public
7504       */
7505      getAttribute(attributeName) {
7506        return (
7507          /** @type {any} */
7508          typeMapGet(this, attributeName)
7509        );
7510      }
7511      /**
7512       * Returns all attribute name/value pairs in a JSON Object.
7513       *
7514       * @note Xml-Text nodes don't have attributes. You can use this feature to assign properties to complete text-blocks.
7515       *
7516       * @return {Object<string, any>} A JSON Object that describes the attributes.
7517       *
7518       * @public
7519       */
7520      getAttributes() {
7521        return typeMapGetAll(this);
7522      }
7523      /**
7524       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
7525       */
7526      _write(encoder) {
7527        encoder.writeTypeRef(YTextRefID);
7528      }
7529    };
7530    var readYText = (_decoder) => new YText();
7531    var YXmlTreeWalker = class {
7532      /**
7533       * @param {YXmlFragment | YXmlElement} root
7534       * @param {function(AbstractType<any>):boolean} [f]
7535       */
7536      constructor(root, f = () => true) {
7537        this._filter = f;
7538        this._root = root;
7539        this._currentNode = /** @type {Item} */
7540        root._start;
7541        this._firstCall = true;
7542        root.doc ?? warnPrematureAccess();
7543      }
7544      [Symbol.iterator]() {
7545        return this;
7546      }
7547      /**
7548       * Get the next node.
7549       *
7550       * @return {IteratorResult<YXmlElement|YXmlText|YXmlHook>} The next node.
7551       *
7552       * @public
7553       */
7554      next() {
7555        let n = this._currentNode;
7556        let type = n && n.content && /** @type {any} */
7557        n.content.type;
7558        if (n !== null && (!this._firstCall || n.deleted || !this._filter(type))) {
7559          do {
7560            type = /** @type {any} */
7561            n.content.type;
7562            if (!n.deleted && (type.constructor === YXmlElement || type.constructor === YXmlFragment) && type._start !== null) {
7563              n = type._start;
7564            } else {
7565              while (n !== null) {
7566                const nxt = n.next;
7567                if (nxt !== null) {
7568                  n = nxt;
7569                  break;
7570                } else if (n.parent === this._root) {
7571                  n = null;
7572                } else {
7573                  n = /** @type {AbstractType<any>} */
7574                  n.parent._item;
7575                }
7576              }
7577            }
7578          } while (n !== null && (n.deleted || !this._filter(
7579            /** @type {ContentType} */
7580            n.content.type
7581          )));
7582        }
7583        this._firstCall = false;
7584        if (n === null) {
7585          return { value: void 0, done: true };
7586        }
7587        this._currentNode = n;
7588        return { value: (
7589          /** @type {any} */
7590          n.content.type
7591        ), done: false };
7592      }
7593    };
7594    var YXmlFragment = class _YXmlFragment extends AbstractType {
7595      constructor() {
7596        super();
7597        this._prelimContent = [];
7598      }
7599      /**
7600       * @type {YXmlElement|YXmlText|null}
7601       */
7602      get firstChild() {
7603        const first = this._first;
7604        return first ? first.content.getContent()[0] : null;
7605      }
7606      /**
7607       * Integrate this type into the Yjs instance.
7608       *
7609       * * Save this struct in the os
7610       * * This type is sent to other client
7611       * * Observer functions are fired
7612       *
7613       * @param {Doc} y The Yjs instance
7614       * @param {Item} item
7615       */
7616      _integrate(y, item) {
7617        super._integrate(y, item);
7618        this.insert(
7619          0,
7620          /** @type {Array<any>} */
7621          this._prelimContent
7622        );
7623        this._prelimContent = null;
7624      }
7625      _copy() {
7626        return new _YXmlFragment();
7627      }
7628      /**
7629       * Makes a copy of this data type that can be included somewhere else.
7630       *
7631       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
7632       *
7633       * @return {YXmlFragment}
7634       */
7635      clone() {
7636        const el = new _YXmlFragment();
7637        el.insert(0, this.toArray().map((item) => item instanceof AbstractType ? item.clone() : item));
7638        return el;
7639      }
7640      get length() {
7641        this.doc ?? warnPrematureAccess();
7642        return this._prelimContent === null ? this._length : this._prelimContent.length;
7643      }
7644      /**
7645       * Create a subtree of childNodes.
7646       *
7647       * @example
7648       * const walker = elem.createTreeWalker(dom => dom.nodeName === 'div')
7649       * for (let node in walker) {
7650       *   // `node` is a div node
7651       *   nop(node)
7652       * }
7653       *
7654       * @param {function(AbstractType<any>):boolean} filter Function that is called on each child element and
7655       *                          returns a Boolean indicating whether the child
7656       *                          is to be included in the subtree.
7657       * @return {YXmlTreeWalker} A subtree and a position within it.
7658       *
7659       * @public
7660       */
7661      createTreeWalker(filter) {
7662        return new YXmlTreeWalker(this, filter);
7663      }
7664      /**
7665       * Returns the first YXmlElement that matches the query.
7666       * Similar to DOM's {@link querySelector}.
7667       *
7668       * Query support:
7669       *   - tagname
7670       * TODO:
7671       *   - id
7672       *   - attribute
7673       *
7674       * @param {CSS_Selector} query The query on the children.
7675       * @return {YXmlElement|YXmlText|YXmlHook|null} The first element that matches the query or null.
7676       *
7677       * @public
7678       */
7679      querySelector(query) {
7680        query = query.toUpperCase();
7681        const iterator = new YXmlTreeWalker(this, (element2) => element2.nodeName && element2.nodeName.toUpperCase() === query);
7682        const next = iterator.next();
7683        if (next.done) {
7684          return null;
7685        } else {
7686          return next.value;
7687        }
7688      }
7689      /**
7690       * Returns all YXmlElements that match the query.
7691       * Similar to Dom's {@link querySelectorAll}.
7692       *
7693       * @todo Does not yet support all queries. Currently only query by tagName.
7694       *
7695       * @param {CSS_Selector} query The query on the children
7696       * @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query.
7697       *
7698       * @public
7699       */
7700      querySelectorAll(query) {
7701        query = query.toUpperCase();
7702        return from(new YXmlTreeWalker(this, (element2) => element2.nodeName && element2.nodeName.toUpperCase() === query));
7703      }
7704      /**
7705       * Creates YXmlEvent and calls observers.
7706       *
7707       * @param {Transaction} transaction
7708       * @param {Set<null|string>} parentSubs Keys changed on this type. `null` if list was modified.
7709       */
7710      _callObserver(transaction, parentSubs) {
7711        callTypeObservers(this, transaction, new YXmlEvent(this, parentSubs, transaction));
7712      }
7713      /**
7714       * Get the string representation of all the children of this YXmlFragment.
7715       *
7716       * @return {string} The string representation of all children.
7717       */
7718      toString() {
7719        return typeListMap(this, (xml) => xml.toString()).join("");
7720      }
7721      /**
7722       * @return {string}
7723       */
7724      toJSON() {
7725        return this.toString();
7726      }
7727      /**
7728       * Creates a Dom Element that mirrors this YXmlElement.
7729       *
7730       * @param {Document} [_document=document] The document object (you must define
7731       *                                        this when calling this method in
7732       *                                        nodejs)
7733       * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks
7734       *                                             are presented in the DOM
7735       * @param {any} [binding] You should not set this property. This is
7736       *                               used if DomBinding wants to create a
7737       *                               association to the created DOM type.
7738       * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}
7739       *
7740       * @public
7741       */
7742      toDOM(_document = document, hooks = {}, binding) {
7743        const fragment = _document.createDocumentFragment();
7744        if (binding !== void 0) {
7745          binding._createAssociation(fragment, this);
7746        }
7747        typeListForEach(this, (xmlType) => {
7748          fragment.insertBefore(xmlType.toDOM(_document, hooks, binding), null);
7749        });
7750        return fragment;
7751      }
7752      /**
7753       * Inserts new content at an index.
7754       *
7755       * @example
7756       *  // Insert character 'a' at position 0
7757       *  xml.insert(0, [new Y.XmlText('text')])
7758       *
7759       * @param {number} index The index to insert content at
7760       * @param {Array<YXmlElement|YXmlText>} content The array of content
7761       */
7762      insert(index, content) {
7763        if (this.doc !== null) {
7764          transact(this.doc, (transaction) => {
7765            typeListInsertGenerics(transaction, this, index, content);
7766          });
7767        } else {
7768          this._prelimContent.splice(index, 0, ...content);
7769        }
7770      }
7771      /**
7772       * Inserts new content at an index.
7773       *
7774       * @example
7775       *  // Insert character 'a' at position 0
7776       *  xml.insert(0, [new Y.XmlText('text')])
7777       *
7778       * @param {null|Item|YXmlElement|YXmlText} ref The index to insert content at
7779       * @param {Array<YXmlElement|YXmlText>} content The array of content
7780       */
7781      insertAfter(ref, content) {
7782        if (this.doc !== null) {
7783          transact(this.doc, (transaction) => {
7784            const refItem = ref && ref instanceof AbstractType ? ref._item : ref;
7785            typeListInsertGenericsAfter(transaction, this, refItem, content);
7786          });
7787        } else {
7788          const pc = (
7789            /** @type {Array<any>} */
7790            this._prelimContent
7791          );
7792          const index = ref === null ? 0 : pc.findIndex((el) => el === ref) + 1;
7793          if (index === 0 && ref !== null) {
7794            throw create3("Reference item not found");
7795          }
7796          pc.splice(index, 0, ...content);
7797        }
7798      }
7799      /**
7800       * Deletes elements starting from an index.
7801       *
7802       * @param {number} index Index at which to start deleting elements
7803       * @param {number} [length=1] The number of elements to remove. Defaults to 1.
7804       */
7805      delete(index, length2 = 1) {
7806        if (this.doc !== null) {
7807          transact(this.doc, (transaction) => {
7808            typeListDelete(transaction, this, index, length2);
7809          });
7810        } else {
7811          this._prelimContent.splice(index, length2);
7812        }
7813      }
7814      /**
7815       * Transforms this YArray to a JavaScript Array.
7816       *
7817       * @return {Array<YXmlElement|YXmlText|YXmlHook>}
7818       */
7819      toArray() {
7820        return typeListToArray(this);
7821      }
7822      /**
7823       * Appends content to this YArray.
7824       *
7825       * @param {Array<YXmlElement|YXmlText>} content Array of content to append.
7826       */
7827      push(content) {
7828        this.insert(this.length, content);
7829      }
7830      /**
7831       * Prepends content to this YArray.
7832       *
7833       * @param {Array<YXmlElement|YXmlText>} content Array of content to prepend.
7834       */
7835      unshift(content) {
7836        this.insert(0, content);
7837      }
7838      /**
7839       * Returns the i-th element from a YArray.
7840       *
7841       * @param {number} index The index of the element to return from the YArray
7842       * @return {YXmlElement|YXmlText}
7843       */
7844      get(index) {
7845        return typeListGet(this, index);
7846      }
7847      /**
7848       * Returns a portion of this YXmlFragment into a JavaScript Array selected
7849       * from start to end (end not included).
7850       *
7851       * @param {number} [start]
7852       * @param {number} [end]
7853       * @return {Array<YXmlElement|YXmlText>}
7854       */
7855      slice(start = 0, end = this.length) {
7856        return typeListSlice(this, start, end);
7857      }
7858      /**
7859       * Executes a provided function on once on every child element.
7860       *
7861       * @param {function(YXmlElement|YXmlText,number, typeof self):void} f A function to execute on every element of this YArray.
7862       */
7863      forEach(f) {
7864        typeListForEach(this, f);
7865      }
7866      /**
7867       * Transform the properties of this type to binary and write it to an
7868       * BinaryEncoder.
7869       *
7870       * This is called when this Item is sent to a remote peer.
7871       *
7872       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
7873       */
7874      _write(encoder) {
7875        encoder.writeTypeRef(YXmlFragmentRefID);
7876      }
7877    };
7878    var readYXmlFragment = (_decoder) => new YXmlFragment();
7879    var YXmlElement = class _YXmlElement extends YXmlFragment {
7880      constructor(nodeName = "UNDEFINED") {
7881        super();
7882        this.nodeName = nodeName;
7883        this._prelimAttrs = /* @__PURE__ */ new Map();
7884      }
7885      /**
7886       * @type {YXmlElement|YXmlText|null}
7887       */
7888      get nextSibling() {
7889        const n = this._item ? this._item.next : null;
7890        return n ? (
7891          /** @type {YXmlElement|YXmlText} */
7892          /** @type {ContentType} */
7893          n.content.type
7894        ) : null;
7895      }
7896      /**
7897       * @type {YXmlElement|YXmlText|null}
7898       */
7899      get prevSibling() {
7900        const n = this._item ? this._item.prev : null;
7901        return n ? (
7902          /** @type {YXmlElement|YXmlText} */
7903          /** @type {ContentType} */
7904          n.content.type
7905        ) : null;
7906      }
7907      /**
7908       * Integrate this type into the Yjs instance.
7909       *
7910       * * Save this struct in the os
7911       * * This type is sent to other client
7912       * * Observer functions are fired
7913       *
7914       * @param {Doc} y The Yjs instance
7915       * @param {Item} item
7916       */
7917      _integrate(y, item) {
7918        super._integrate(y, item);
7919        /** @type {Map<string, any>} */
7920        this._prelimAttrs.forEach((value, key) => {
7921          this.setAttribute(key, value);
7922        });
7923        this._prelimAttrs = null;
7924      }
7925      /**
7926       * Creates an Item with the same effect as this Item (without position effect)
7927       *
7928       * @return {YXmlElement}
7929       */
7930      _copy() {
7931        return new _YXmlElement(this.nodeName);
7932      }
7933      /**
7934       * Makes a copy of this data type that can be included somewhere else.
7935       *
7936       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
7937       *
7938       * @return {YXmlElement<KV>}
7939       */
7940      clone() {
7941        const el = new _YXmlElement(this.nodeName);
7942        const attrs = this.getAttributes();
7943        forEach(attrs, (value, key) => {
7944          el.setAttribute(
7945            key,
7946            /** @type {any} */
7947            value
7948          );
7949        });
7950        el.insert(0, this.toArray().map((v) => v instanceof AbstractType ? v.clone() : v));
7951        return el;
7952      }
7953      /**
7954       * Returns the XML serialization of this YXmlElement.
7955       * The attributes are ordered by attribute-name, so you can easily use this
7956       * method to compare YXmlElements
7957       *
7958       * @return {string} The string representation of this type.
7959       *
7960       * @public
7961       */
7962      toString() {
7963        const attrs = this.getAttributes();
7964        const stringBuilder = [];
7965        const keys2 = [];
7966        for (const key in attrs) {
7967          keys2.push(key);
7968        }
7969        keys2.sort();
7970        const keysLen = keys2.length;
7971        for (let i = 0; i < keysLen; i++) {
7972          const key = keys2[i];
7973          stringBuilder.push(key + '="' + attrs[key] + '"');
7974        }
7975        const nodeName = this.nodeName.toLocaleLowerCase();
7976        const attrsString = stringBuilder.length > 0 ? " " + stringBuilder.join(" ") : "";
7977        return `<$nodeName}$attrsString}>$super.toString()}</$nodeName}>`;
7978      }
7979      /**
7980       * Removes an attribute from this YXmlElement.
7981       *
7982       * @param {string} attributeName The attribute name that is to be removed.
7983       *
7984       * @public
7985       */
7986      removeAttribute(attributeName) {
7987        if (this.doc !== null) {
7988          transact(this.doc, (transaction) => {
7989            typeMapDelete(transaction, this, attributeName);
7990          });
7991        } else {
7992          this._prelimAttrs.delete(attributeName);
7993        }
7994      }
7995      /**
7996       * Sets or updates an attribute.
7997       *
7998       * @template {keyof KV & string} KEY
7999       *
8000       * @param {KEY} attributeName The attribute name that is to be set.
8001       * @param {KV[KEY]} attributeValue The attribute value that is to be set.
8002       *
8003       * @public
8004       */
8005      setAttribute(attributeName, attributeValue) {
8006        if (this.doc !== null) {
8007          transact(this.doc, (transaction) => {
8008            typeMapSet(transaction, this, attributeName, attributeValue);
8009          });
8010        } else {
8011          this._prelimAttrs.set(attributeName, attributeValue);
8012        }
8013      }
8014      /**
8015       * Returns an attribute value that belongs to the attribute name.
8016       *
8017       * @template {keyof KV & string} KEY
8018       *
8019       * @param {KEY} attributeName The attribute name that identifies the
8020       *                               queried value.
8021       * @return {KV[KEY]|undefined} The queried attribute value.
8022       *
8023       * @public
8024       */
8025      getAttribute(attributeName) {
8026        return (
8027          /** @type {any} */
8028          typeMapGet(this, attributeName)
8029        );
8030      }
8031      /**
8032       * Returns whether an attribute exists
8033       *
8034       * @param {string} attributeName The attribute name to check for existence.
8035       * @return {boolean} whether the attribute exists.
8036       *
8037       * @public
8038       */
8039      hasAttribute(attributeName) {
8040        return (
8041          /** @type {any} */
8042          typeMapHas(this, attributeName)
8043        );
8044      }
8045      /**
8046       * Returns all attribute name/value pairs in a JSON Object.
8047       *
8048       * @param {Snapshot} [snapshot]
8049       * @return {{ [Key in Extract<keyof KV,string>]?: KV[Key]}} A JSON Object that describes the attributes.
8050       *
8051       * @public
8052       */
8053      getAttributes(snapshot2) {
8054        return (
8055          /** @type {any} */
8056          snapshot2 ? typeMapGetAllSnapshot(this, snapshot2) : typeMapGetAll(this)
8057        );
8058      }
8059      /**
8060       * Creates a Dom Element that mirrors this YXmlElement.
8061       *
8062       * @param {Document} [_document=document] The document object (you must define
8063       *                                        this when calling this method in
8064       *                                        nodejs)
8065       * @param {Object<string, any>} [hooks={}] Optional property to customize how hooks
8066       *                                             are presented in the DOM
8067       * @param {any} [binding] You should not set this property. This is
8068       *                               used if DomBinding wants to create a
8069       *                               association to the created DOM type.
8070       * @return {Node} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}
8071       *
8072       * @public
8073       */
8074      toDOM(_document = document, hooks = {}, binding) {
8075        const dom = _document.createElement(this.nodeName);
8076        const attrs = this.getAttributes();
8077        for (const key in attrs) {
8078          const value = attrs[key];
8079          if (typeof value === "string") {
8080            dom.setAttribute(key, value);
8081          }
8082        }
8083        typeListForEach(this, (yxml) => {
8084          dom.appendChild(yxml.toDOM(_document, hooks, binding));
8085        });
8086        if (binding !== void 0) {
8087          binding._createAssociation(dom, this);
8088        }
8089        return dom;
8090      }
8091      /**
8092       * Transform the properties of this type to binary and write it to an
8093       * BinaryEncoder.
8094       *
8095       * This is called when this Item is sent to a remote peer.
8096       *
8097       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
8098       */
8099      _write(encoder) {
8100        encoder.writeTypeRef(YXmlElementRefID);
8101        encoder.writeKey(this.nodeName);
8102      }
8103    };
8104    var readYXmlElement = (decoder) => new YXmlElement(decoder.readKey());
8105    var YXmlEvent = class extends YEvent {
8106      /**
8107       * @param {YXmlElement|YXmlText|YXmlFragment} target The target on which the event is created.
8108       * @param {Set<string|null>} subs The set of changed attributes. `null` is included if the
8109       *                   child list changed.
8110       * @param {Transaction} transaction The transaction instance with which the
8111       *                                  change was created.
8112       */
8113      constructor(target, subs, transaction) {
8114        super(target, transaction);
8115        this.childListChanged = false;
8116        this.attributesChanged = /* @__PURE__ */ new Set();
8117        subs.forEach((sub) => {
8118          if (sub === null) {
8119            this.childListChanged = true;
8120          } else {
8121            this.attributesChanged.add(sub);
8122          }
8123        });
8124      }
8125    };
8126    var YXmlHook = class _YXmlHook extends YMap {
8127      /**
8128       * @param {string} hookName nodeName of the Dom Node.
8129       */
8130      constructor(hookName) {
8131        super();
8132        this.hookName = hookName;
8133      }
8134      /**
8135       * Creates an Item with the same effect as this Item (without position effect)
8136       */
8137      _copy() {
8138        return new _YXmlHook(this.hookName);
8139      }
8140      /**
8141       * Makes a copy of this data type that can be included somewhere else.
8142       *
8143       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
8144       *
8145       * @return {YXmlHook}
8146       */
8147      clone() {
8148        const el = new _YXmlHook(this.hookName);
8149        this.forEach((value, key) => {
8150          el.set(key, value);
8151        });
8152        return el;
8153      }
8154      /**
8155       * Creates a Dom Element that mirrors this YXmlElement.
8156       *
8157       * @param {Document} [_document=document] The document object (you must define
8158       *                                        this when calling this method in
8159       *                                        nodejs)
8160       * @param {Object.<string, any>} [hooks] Optional property to customize how hooks
8161       *                                             are presented in the DOM
8162       * @param {any} [binding] You should not set this property. This is
8163       *                               used if DomBinding wants to create a
8164       *                               association to the created DOM type
8165       * @return {Element} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}
8166       *
8167       * @public
8168       */
8169      toDOM(_document = document, hooks = {}, binding) {
8170        const hook = hooks[this.hookName];
8171        let dom;
8172        if (hook !== void 0) {
8173          dom = hook.createDom(this);
8174        } else {
8175          dom = document.createElement(this.hookName);
8176        }
8177        dom.setAttribute("data-yjs-hook", this.hookName);
8178        if (binding !== void 0) {
8179          binding._createAssociation(dom, this);
8180        }
8181        return dom;
8182      }
8183      /**
8184       * Transform the properties of this type to binary and write it to an
8185       * BinaryEncoder.
8186       *
8187       * This is called when this Item is sent to a remote peer.
8188       *
8189       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
8190       */
8191      _write(encoder) {
8192        encoder.writeTypeRef(YXmlHookRefID);
8193        encoder.writeKey(this.hookName);
8194      }
8195    };
8196    var readYXmlHook = (decoder) => new YXmlHook(decoder.readKey());
8197    var YXmlText = class _YXmlText extends YText {
8198      /**
8199       * @type {YXmlElement|YXmlText|null}
8200       */
8201      get nextSibling() {
8202        const n = this._item ? this._item.next : null;
8203        return n ? (
8204          /** @type {YXmlElement|YXmlText} */
8205          /** @type {ContentType} */
8206          n.content.type
8207        ) : null;
8208      }
8209      /**
8210       * @type {YXmlElement|YXmlText|null}
8211       */
8212      get prevSibling() {
8213        const n = this._item ? this._item.prev : null;
8214        return n ? (
8215          /** @type {YXmlElement|YXmlText} */
8216          /** @type {ContentType} */
8217          n.content.type
8218        ) : null;
8219      }
8220      _copy() {
8221        return new _YXmlText();
8222      }
8223      /**
8224       * Makes a copy of this data type that can be included somewhere else.
8225       *
8226       * Note that the content is only readable _after_ it has been included somewhere in the Ydoc.
8227       *
8228       * @return {YXmlText}
8229       */
8230      clone() {
8231        const text2 = new _YXmlText();
8232        text2.applyDelta(this.toDelta());
8233        return text2;
8234      }
8235      /**
8236       * Creates a Dom Element that mirrors this YXmlText.
8237       *
8238       * @param {Document} [_document=document] The document object (you must define
8239       *                                        this when calling this method in
8240       *                                        nodejs)
8241       * @param {Object<string, any>} [hooks] Optional property to customize how hooks
8242       *                                             are presented in the DOM
8243       * @param {any} [binding] You should not set this property. This is
8244       *                               used if DomBinding wants to create a
8245       *                               association to the created DOM type.
8246       * @return {Text} The {@link https://developer.mozilla.org/en-US/docs/Web/API/Element|Dom Element}
8247       *
8248       * @public
8249       */
8250      toDOM(_document = document, hooks, binding) {
8251        const dom = _document.createTextNode(this.toString());
8252        if (binding !== void 0) {
8253          binding._createAssociation(dom, this);
8254        }
8255        return dom;
8256      }
8257      toString() {
8258        return this.toDelta().map((delta) => {
8259          const nestedNodes = [];
8260          for (const nodeName in delta.attributes) {
8261            const attrs = [];
8262            for (const key in delta.attributes[nodeName]) {
8263              attrs.push({ key, value: delta.attributes[nodeName][key] });
8264            }
8265            attrs.sort((a, b) => a.key < b.key ? -1 : 1);
8266            nestedNodes.push({ nodeName, attrs });
8267          }
8268          nestedNodes.sort((a, b) => a.nodeName < b.nodeName ? -1 : 1);
8269          let str = "";
8270          for (let i = 0; i < nestedNodes.length; i++) {
8271            const node = nestedNodes[i];
8272            str += `<$node.nodeName}`;
8273            for (let j = 0; j < node.attrs.length; j++) {
8274              const attr = node.attrs[j];
8275              str += ` $attr.key}="$attr.value}"`;
8276            }
8277            str += ">";
8278          }
8279          str += delta.insert;
8280          for (let i = nestedNodes.length - 1; i >= 0; i--) {
8281            str += `</$nestedNodes[i].nodeName}>`;
8282          }
8283          return str;
8284        }).join("");
8285      }
8286      /**
8287       * @return {string}
8288       */
8289      toJSON() {
8290        return this.toString();
8291      }
8292      /**
8293       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8294       */
8295      _write(encoder) {
8296        encoder.writeTypeRef(YXmlTextRefID);
8297      }
8298    };
8299    var readYXmlText = (decoder) => new YXmlText();
8300    var AbstractStruct = class {
8301      /**
8302       * @param {ID} id
8303       * @param {number} length
8304       */
8305      constructor(id2, length2) {
8306        this.id = id2;
8307        this.length = length2;
8308      }
8309      /**
8310       * @type {boolean}
8311       */
8312      get deleted() {
8313        throw methodUnimplemented();
8314      }
8315      /**
8316       * Merge this struct with the item to the right.
8317       * This method is already assuming that `this.id.clock + this.length === this.id.clock`.
8318       * Also this method does *not* remove right from StructStore!
8319       * @param {AbstractStruct} right
8320       * @return {boolean} whether this merged with right
8321       */
8322      mergeWith(right) {
8323        return false;
8324      }
8325      /**
8326       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
8327       * @param {number} offset
8328       * @param {number} encodingRef
8329       */
8330      write(encoder, offset, encodingRef) {
8331        throw methodUnimplemented();
8332      }
8333      /**
8334       * @param {Transaction} transaction
8335       * @param {number} offset
8336       */
8337      integrate(transaction, offset) {
8338        throw methodUnimplemented();
8339      }
8340    };
8341    var structGCRefNumber = 0;
8342    var GC = class extends AbstractStruct {
8343      get deleted() {
8344        return true;
8345      }
8346      delete() {
8347      }
8348      /**
8349       * @param {GC} right
8350       * @return {boolean}
8351       */
8352      mergeWith(right) {
8353        if (this.constructor !== right.constructor) {
8354          return false;
8355        }
8356        this.length += right.length;
8357        return true;
8358      }
8359      /**
8360       * @param {Transaction} transaction
8361       * @param {number} offset
8362       */
8363      integrate(transaction, offset) {
8364        if (offset > 0) {
8365          this.id.clock += offset;
8366          this.length -= offset;
8367        }
8368        addStruct(transaction.doc.store, this);
8369      }
8370      /**
8371       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8372       * @param {number} offset
8373       */
8374      write(encoder, offset) {
8375        encoder.writeInfo(structGCRefNumber);
8376        encoder.writeLen(this.length - offset);
8377      }
8378      /**
8379       * @param {Transaction} transaction
8380       * @param {StructStore} store
8381       * @return {null | number}
8382       */
8383      getMissing(transaction, store) {
8384        return null;
8385      }
8386    };
8387    var ContentBinary = class _ContentBinary {
8388      /**
8389       * @param {Uint8Array} content
8390       */
8391      constructor(content) {
8392        this.content = content;
8393      }
8394      /**
8395       * @return {number}
8396       */
8397      getLength() {
8398        return 1;
8399      }
8400      /**
8401       * @return {Array<any>}
8402       */
8403      getContent() {
8404        return [this.content];
8405      }
8406      /**
8407       * @return {boolean}
8408       */
8409      isCountable() {
8410        return true;
8411      }
8412      /**
8413       * @return {ContentBinary}
8414       */
8415      copy() {
8416        return new _ContentBinary(this.content);
8417      }
8418      /**
8419       * @param {number} offset
8420       * @return {ContentBinary}
8421       */
8422      splice(offset) {
8423        throw methodUnimplemented();
8424      }
8425      /**
8426       * @param {ContentBinary} right
8427       * @return {boolean}
8428       */
8429      mergeWith(right) {
8430        return false;
8431      }
8432      /**
8433       * @param {Transaction} transaction
8434       * @param {Item} item
8435       */
8436      integrate(transaction, item) {
8437      }
8438      /**
8439       * @param {Transaction} transaction
8440       */
8441      delete(transaction) {
8442      }
8443      /**
8444       * @param {StructStore} store
8445       */
8446      gc(store) {
8447      }
8448      /**
8449       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8450       * @param {number} offset
8451       */
8452      write(encoder, offset) {
8453        encoder.writeBuf(this.content);
8454      }
8455      /**
8456       * @return {number}
8457       */
8458      getRef() {
8459        return 3;
8460      }
8461    };
8462    var readContentBinary = (decoder) => new ContentBinary(decoder.readBuf());
8463    var ContentDeleted = class _ContentDeleted {
8464      /**
8465       * @param {number} len
8466       */
8467      constructor(len) {
8468        this.len = len;
8469      }
8470      /**
8471       * @return {number}
8472       */
8473      getLength() {
8474        return this.len;
8475      }
8476      /**
8477       * @return {Array<any>}
8478       */
8479      getContent() {
8480        return [];
8481      }
8482      /**
8483       * @return {boolean}
8484       */
8485      isCountable() {
8486        return false;
8487      }
8488      /**
8489       * @return {ContentDeleted}
8490       */
8491      copy() {
8492        return new _ContentDeleted(this.len);
8493      }
8494      /**
8495       * @param {number} offset
8496       * @return {ContentDeleted}
8497       */
8498      splice(offset) {
8499        const right = new _ContentDeleted(this.len - offset);
8500        this.len = offset;
8501        return right;
8502      }
8503      /**
8504       * @param {ContentDeleted} right
8505       * @return {boolean}
8506       */
8507      mergeWith(right) {
8508        this.len += right.len;
8509        return true;
8510      }
8511      /**
8512       * @param {Transaction} transaction
8513       * @param {Item} item
8514       */
8515      integrate(transaction, item) {
8516        addToDeleteSet(transaction.deleteSet, item.id.client, item.id.clock, this.len);
8517        item.markDeleted();
8518      }
8519      /**
8520       * @param {Transaction} transaction
8521       */
8522      delete(transaction) {
8523      }
8524      /**
8525       * @param {StructStore} store
8526       */
8527      gc(store) {
8528      }
8529      /**
8530       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8531       * @param {number} offset
8532       */
8533      write(encoder, offset) {
8534        encoder.writeLen(this.len - offset);
8535      }
8536      /**
8537       * @return {number}
8538       */
8539      getRef() {
8540        return 1;
8541      }
8542    };
8543    var readContentDeleted = (decoder) => new ContentDeleted(decoder.readLen());
8544    var createDocFromOpts = (guid, opts) => new Doc({ guid, ...opts, shouldLoad: opts.shouldLoad || opts.autoLoad || false });
8545    var ContentDoc = class _ContentDoc {
8546      /**
8547       * @param {Doc} doc
8548       */
8549      constructor(doc2) {
8550        if (doc2._item) {
8551          console.error("This document was already integrated as a sub-document. You should create a second instance instead with the same guid.");
8552        }
8553        this.doc = doc2;
8554        const opts = {};
8555        this.opts = opts;
8556        if (!doc2.gc) {
8557          opts.gc = false;
8558        }
8559        if (doc2.autoLoad) {
8560          opts.autoLoad = true;
8561        }
8562        if (doc2.meta !== null) {
8563          opts.meta = doc2.meta;
8564        }
8565      }
8566      /**
8567       * @return {number}
8568       */
8569      getLength() {
8570        return 1;
8571      }
8572      /**
8573       * @return {Array<any>}
8574       */
8575      getContent() {
8576        return [this.doc];
8577      }
8578      /**
8579       * @return {boolean}
8580       */
8581      isCountable() {
8582        return true;
8583      }
8584      /**
8585       * @return {ContentDoc}
8586       */
8587      copy() {
8588        return new _ContentDoc(createDocFromOpts(this.doc.guid, this.opts));
8589      }
8590      /**
8591       * @param {number} offset
8592       * @return {ContentDoc}
8593       */
8594      splice(offset) {
8595        throw methodUnimplemented();
8596      }
8597      /**
8598       * @param {ContentDoc} right
8599       * @return {boolean}
8600       */
8601      mergeWith(right) {
8602        return false;
8603      }
8604      /**
8605       * @param {Transaction} transaction
8606       * @param {Item} item
8607       */
8608      integrate(transaction, item) {
8609        this.doc._item = item;
8610        transaction.subdocsAdded.add(this.doc);
8611        if (this.doc.shouldLoad) {
8612          transaction.subdocsLoaded.add(this.doc);
8613        }
8614      }
8615      /**
8616       * @param {Transaction} transaction
8617       */
8618      delete(transaction) {
8619        if (transaction.subdocsAdded.has(this.doc)) {
8620          transaction.subdocsAdded.delete(this.doc);
8621        } else {
8622          transaction.subdocsRemoved.add(this.doc);
8623        }
8624      }
8625      /**
8626       * @param {StructStore} store
8627       */
8628      gc(store) {
8629      }
8630      /**
8631       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8632       * @param {number} offset
8633       */
8634      write(encoder, offset) {
8635        encoder.writeString(this.doc.guid);
8636        encoder.writeAny(this.opts);
8637      }
8638      /**
8639       * @return {number}
8640       */
8641      getRef() {
8642        return 9;
8643      }
8644    };
8645    var readContentDoc = (decoder) => new ContentDoc(createDocFromOpts(decoder.readString(), decoder.readAny()));
8646    var ContentEmbed = class _ContentEmbed {
8647      /**
8648       * @param {Object} embed
8649       */
8650      constructor(embed) {
8651        this.embed = embed;
8652      }
8653      /**
8654       * @return {number}
8655       */
8656      getLength() {
8657        return 1;
8658      }
8659      /**
8660       * @return {Array<any>}
8661       */
8662      getContent() {
8663        return [this.embed];
8664      }
8665      /**
8666       * @return {boolean}
8667       */
8668      isCountable() {
8669        return true;
8670      }
8671      /**
8672       * @return {ContentEmbed}
8673       */
8674      copy() {
8675        return new _ContentEmbed(this.embed);
8676      }
8677      /**
8678       * @param {number} offset
8679       * @return {ContentEmbed}
8680       */
8681      splice(offset) {
8682        throw methodUnimplemented();
8683      }
8684      /**
8685       * @param {ContentEmbed} right
8686       * @return {boolean}
8687       */
8688      mergeWith(right) {
8689        return false;
8690      }
8691      /**
8692       * @param {Transaction} transaction
8693       * @param {Item} item
8694       */
8695      integrate(transaction, item) {
8696      }
8697      /**
8698       * @param {Transaction} transaction
8699       */
8700      delete(transaction) {
8701      }
8702      /**
8703       * @param {StructStore} store
8704       */
8705      gc(store) {
8706      }
8707      /**
8708       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8709       * @param {number} offset
8710       */
8711      write(encoder, offset) {
8712        encoder.writeJSON(this.embed);
8713      }
8714      /**
8715       * @return {number}
8716       */
8717      getRef() {
8718        return 5;
8719      }
8720    };
8721    var readContentEmbed = (decoder) => new ContentEmbed(decoder.readJSON());
8722    var ContentFormat = class _ContentFormat {
8723      /**
8724       * @param {string} key
8725       * @param {Object} value
8726       */
8727      constructor(key, value) {
8728        this.key = key;
8729        this.value = value;
8730      }
8731      /**
8732       * @return {number}
8733       */
8734      getLength() {
8735        return 1;
8736      }
8737      /**
8738       * @return {Array<any>}
8739       */
8740      getContent() {
8741        return [];
8742      }
8743      /**
8744       * @return {boolean}
8745       */
8746      isCountable() {
8747        return false;
8748      }
8749      /**
8750       * @return {ContentFormat}
8751       */
8752      copy() {
8753        return new _ContentFormat(this.key, this.value);
8754      }
8755      /**
8756       * @param {number} _offset
8757       * @return {ContentFormat}
8758       */
8759      splice(_offset) {
8760        throw methodUnimplemented();
8761      }
8762      /**
8763       * @param {ContentFormat} _right
8764       * @return {boolean}
8765       */
8766      mergeWith(_right) {
8767        return false;
8768      }
8769      /**
8770       * @param {Transaction} _transaction
8771       * @param {Item} item
8772       */
8773      integrate(_transaction, item) {
8774        const p = (
8775          /** @type {YText} */
8776          item.parent
8777        );
8778        p._searchMarker = null;
8779        p._hasFormatting = true;
8780      }
8781      /**
8782       * @param {Transaction} transaction
8783       */
8784      delete(transaction) {
8785      }
8786      /**
8787       * @param {StructStore} store
8788       */
8789      gc(store) {
8790      }
8791      /**
8792       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8793       * @param {number} offset
8794       */
8795      write(encoder, offset) {
8796        encoder.writeKey(this.key);
8797        encoder.writeJSON(this.value);
8798      }
8799      /**
8800       * @return {number}
8801       */
8802      getRef() {
8803        return 6;
8804      }
8805    };
8806    var readContentFormat = (decoder) => new ContentFormat(decoder.readKey(), decoder.readJSON());
8807    var ContentJSON = class _ContentJSON {
8808      /**
8809       * @param {Array<any>} arr
8810       */
8811      constructor(arr) {
8812        this.arr = arr;
8813      }
8814      /**
8815       * @return {number}
8816       */
8817      getLength() {
8818        return this.arr.length;
8819      }
8820      /**
8821       * @return {Array<any>}
8822       */
8823      getContent() {
8824        return this.arr;
8825      }
8826      /**
8827       * @return {boolean}
8828       */
8829      isCountable() {
8830        return true;
8831      }
8832      /**
8833       * @return {ContentJSON}
8834       */
8835      copy() {
8836        return new _ContentJSON(this.arr);
8837      }
8838      /**
8839       * @param {number} offset
8840       * @return {ContentJSON}
8841       */
8842      splice(offset) {
8843        const right = new _ContentJSON(this.arr.slice(offset));
8844        this.arr = this.arr.slice(0, offset);
8845        return right;
8846      }
8847      /**
8848       * @param {ContentJSON} right
8849       * @return {boolean}
8850       */
8851      mergeWith(right) {
8852        this.arr = this.arr.concat(right.arr);
8853        return true;
8854      }
8855      /**
8856       * @param {Transaction} transaction
8857       * @param {Item} item
8858       */
8859      integrate(transaction, item) {
8860      }
8861      /**
8862       * @param {Transaction} transaction
8863       */
8864      delete(transaction) {
8865      }
8866      /**
8867       * @param {StructStore} store
8868       */
8869      gc(store) {
8870      }
8871      /**
8872       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8873       * @param {number} offset
8874       */
8875      write(encoder, offset) {
8876        const len = this.arr.length;
8877        encoder.writeLen(len - offset);
8878        for (let i = offset; i < len; i++) {
8879          const c = this.arr[i];
8880          encoder.writeString(c === void 0 ? "undefined" : JSON.stringify(c));
8881        }
8882      }
8883      /**
8884       * @return {number}
8885       */
8886      getRef() {
8887        return 2;
8888      }
8889    };
8890    var readContentJSON = (decoder) => {
8891      const len = decoder.readLen();
8892      const cs = [];
8893      for (let i = 0; i < len; i++) {
8894        const c = decoder.readString();
8895        if (c === "undefined") {
8896          cs.push(void 0);
8897        } else {
8898          cs.push(JSON.parse(c));
8899        }
8900      }
8901      return new ContentJSON(cs);
8902    };
8903    var isDevMode = getVariable("node_env") === "development";
8904    var ContentAny = class _ContentAny {
8905      /**
8906       * @param {Array<any>} arr
8907       */
8908      constructor(arr) {
8909        this.arr = arr;
8910        isDevMode && deepFreeze(arr);
8911      }
8912      /**
8913       * @return {number}
8914       */
8915      getLength() {
8916        return this.arr.length;
8917      }
8918      /**
8919       * @return {Array<any>}
8920       */
8921      getContent() {
8922        return this.arr;
8923      }
8924      /**
8925       * @return {boolean}
8926       */
8927      isCountable() {
8928        return true;
8929      }
8930      /**
8931       * @return {ContentAny}
8932       */
8933      copy() {
8934        return new _ContentAny(this.arr);
8935      }
8936      /**
8937       * @param {number} offset
8938       * @return {ContentAny}
8939       */
8940      splice(offset) {
8941        const right = new _ContentAny(this.arr.slice(offset));
8942        this.arr = this.arr.slice(0, offset);
8943        return right;
8944      }
8945      /**
8946       * @param {ContentAny} right
8947       * @return {boolean}
8948       */
8949      mergeWith(right) {
8950        this.arr = this.arr.concat(right.arr);
8951        return true;
8952      }
8953      /**
8954       * @param {Transaction} transaction
8955       * @param {Item} item
8956       */
8957      integrate(transaction, item) {
8958      }
8959      /**
8960       * @param {Transaction} transaction
8961       */
8962      delete(transaction) {
8963      }
8964      /**
8965       * @param {StructStore} store
8966       */
8967      gc(store) {
8968      }
8969      /**
8970       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
8971       * @param {number} offset
8972       */
8973      write(encoder, offset) {
8974        const len = this.arr.length;
8975        encoder.writeLen(len - offset);
8976        for (let i = offset; i < len; i++) {
8977          const c = this.arr[i];
8978          encoder.writeAny(c);
8979        }
8980      }
8981      /**
8982       * @return {number}
8983       */
8984      getRef() {
8985        return 8;
8986      }
8987    };
8988    var readContentAny = (decoder) => {
8989      const len = decoder.readLen();
8990      const cs = [];
8991      for (let i = 0; i < len; i++) {
8992        cs.push(decoder.readAny());
8993      }
8994      return new ContentAny(cs);
8995    };
8996    var ContentString = class _ContentString {
8997      /**
8998       * @param {string} str
8999       */
9000      constructor(str) {
9001        this.str = str;
9002      }
9003      /**
9004       * @return {number}
9005       */
9006      getLength() {
9007        return this.str.length;
9008      }
9009      /**
9010       * @return {Array<any>}
9011       */
9012      getContent() {
9013        return this.str.split("");
9014      }
9015      /**
9016       * @return {boolean}
9017       */
9018      isCountable() {
9019        return true;
9020      }
9021      /**
9022       * @return {ContentString}
9023       */
9024      copy() {
9025        return new _ContentString(this.str);
9026      }
9027      /**
9028       * @param {number} offset
9029       * @return {ContentString}
9030       */
9031      splice(offset) {
9032        const right = new _ContentString(this.str.slice(offset));
9033        this.str = this.str.slice(0, offset);
9034        const firstCharCode = this.str.charCodeAt(offset - 1);
9035        if (firstCharCode >= 55296 && firstCharCode <= 56319) {
9036          this.str = this.str.slice(0, offset - 1) + "\uFFFD";
9037          right.str = "\uFFFD" + right.str.slice(1);
9038        }
9039        return right;
9040      }
9041      /**
9042       * @param {ContentString} right
9043       * @return {boolean}
9044       */
9045      mergeWith(right) {
9046        this.str += right.str;
9047        return true;
9048      }
9049      /**
9050       * @param {Transaction} transaction
9051       * @param {Item} item
9052       */
9053      integrate(transaction, item) {
9054      }
9055      /**
9056       * @param {Transaction} transaction
9057       */
9058      delete(transaction) {
9059      }
9060      /**
9061       * @param {StructStore} store
9062       */
9063      gc(store) {
9064      }
9065      /**
9066       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
9067       * @param {number} offset
9068       */
9069      write(encoder, offset) {
9070        encoder.writeString(offset === 0 ? this.str : this.str.slice(offset));
9071      }
9072      /**
9073       * @return {number}
9074       */
9075      getRef() {
9076        return 4;
9077      }
9078    };
9079    var readContentString = (decoder) => new ContentString(decoder.readString());
9080    var typeRefs = [
9081      readYArray,
9082      readYMap,
9083      readYText,
9084      readYXmlElement,
9085      readYXmlFragment,
9086      readYXmlHook,
9087      readYXmlText
9088    ];
9089    var YArrayRefID = 0;
9090    var YMapRefID = 1;
9091    var YTextRefID = 2;
9092    var YXmlElementRefID = 3;
9093    var YXmlFragmentRefID = 4;
9094    var YXmlHookRefID = 5;
9095    var YXmlTextRefID = 6;
9096    var ContentType = class _ContentType {
9097      /**
9098       * @param {AbstractType<any>} type
9099       */
9100      constructor(type) {
9101        this.type = type;
9102      }
9103      /**
9104       * @return {number}
9105       */
9106      getLength() {
9107        return 1;
9108      }
9109      /**
9110       * @return {Array<any>}
9111       */
9112      getContent() {
9113        return [this.type];
9114      }
9115      /**
9116       * @return {boolean}
9117       */
9118      isCountable() {
9119        return true;
9120      }
9121      /**
9122       * @return {ContentType}
9123       */
9124      copy() {
9125        return new _ContentType(this.type._copy());
9126      }
9127      /**
9128       * @param {number} offset
9129       * @return {ContentType}
9130       */
9131      splice(offset) {
9132        throw methodUnimplemented();
9133      }
9134      /**
9135       * @param {ContentType} right
9136       * @return {boolean}
9137       */
9138      mergeWith(right) {
9139        return false;
9140      }
9141      /**
9142       * @param {Transaction} transaction
9143       * @param {Item} item
9144       */
9145      integrate(transaction, item) {
9146        this.type._integrate(transaction.doc, item);
9147      }
9148      /**
9149       * @param {Transaction} transaction
9150       */
9151      delete(transaction) {
9152        let item = this.type._start;
9153        while (item !== null) {
9154          if (!item.deleted) {
9155            item.delete(transaction);
9156          } else if (item.id.clock < (transaction.beforeState.get(item.id.client) || 0)) {
9157            transaction._mergeStructs.push(item);
9158          }
9159          item = item.right;
9160        }
9161        this.type._map.forEach((item2) => {
9162          if (!item2.deleted) {
9163            item2.delete(transaction);
9164          } else if (item2.id.clock < (transaction.beforeState.get(item2.id.client) || 0)) {
9165            transaction._mergeStructs.push(item2);
9166          }
9167        });
9168        transaction.changed.delete(this.type);
9169      }
9170      /**
9171       * @param {StructStore} store
9172       */
9173      gc(store) {
9174        let item = this.type._start;
9175        while (item !== null) {
9176          item.gc(store, true);
9177          item = item.right;
9178        }
9179        this.type._start = null;
9180        this.type._map.forEach(
9181          /** @param {Item | null} item */
9182          (item2) => {
9183            while (item2 !== null) {
9184              item2.gc(store, true);
9185              item2 = item2.left;
9186            }
9187          }
9188        );
9189        this.type._map = /* @__PURE__ */ new Map();
9190      }
9191      /**
9192       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
9193       * @param {number} offset
9194       */
9195      write(encoder, offset) {
9196        this.type._write(encoder);
9197      }
9198      /**
9199       * @return {number}
9200       */
9201      getRef() {
9202        return 7;
9203      }
9204    };
9205    var readContentType = (decoder) => new ContentType(typeRefs[decoder.readTypeRef()](decoder));
9206    var followRedone = (store, id2) => {
9207      let nextID = id2;
9208      let diff = 0;
9209      let item;
9210      do {
9211        if (diff > 0) {
9212          nextID = createID(nextID.client, nextID.clock + diff);
9213        }
9214        item = getItem(store, nextID);
9215        diff = nextID.clock - item.id.clock;
9216        nextID = item.redone;
9217      } while (nextID !== null && item instanceof Item);
9218      return {
9219        item,
9220        diff
9221      };
9222    };
9223    var keepItem = (item, keep) => {
9224      while (item !== null && item.keep !== keep) {
9225        item.keep = keep;
9226        item = /** @type {AbstractType<any>} */
9227        item.parent._item;
9228      }
9229    };
9230    var splitItem = (transaction, leftItem, diff) => {
9231      const { client, clock } = leftItem.id;
9232      const rightItem = new Item(
9233        createID(client, clock + diff),
9234        leftItem,
9235        createID(client, clock + diff - 1),
9236        leftItem.right,
9237        leftItem.rightOrigin,
9238        leftItem.parent,
9239        leftItem.parentSub,
9240        leftItem.content.splice(diff)
9241      );
9242      if (leftItem.deleted) {
9243        rightItem.markDeleted();
9244      }
9245      if (leftItem.keep) {
9246        rightItem.keep = true;
9247      }
9248      if (leftItem.redone !== null) {
9249        rightItem.redone = createID(leftItem.redone.client, leftItem.redone.clock + diff);
9250      }
9251      leftItem.right = rightItem;
9252      if (rightItem.right !== null) {
9253        rightItem.right.left = rightItem;
9254      }
9255      transaction._mergeStructs.push(rightItem);
9256      if (rightItem.parentSub !== null && rightItem.right === null) {
9257        rightItem.parent._map.set(rightItem.parentSub, rightItem);
9258      }
9259      leftItem.length = diff;
9260      return rightItem;
9261    };
9262    var isDeletedByUndoStack = (stack, id2) => some(
9263      stack,
9264      /** @param {StackItem} s */
9265      (s) => isDeleted(s.deletions, id2)
9266    );
9267    var redoItem = (transaction, item, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) => {
9268      const doc2 = transaction.doc;
9269      const store = doc2.store;
9270      const ownClientID = doc2.clientID;
9271      const redone = item.redone;
9272      if (redone !== null) {
9273        return getItemCleanStart(transaction, redone);
9274      }
9275      let parentItem = (
9276        /** @type {AbstractType<any>} */
9277        item.parent._item
9278      );
9279      let left = null;
9280      let right;
9281      if (parentItem !== null && parentItem.deleted === true) {
9282        if (parentItem.redone === null && (!redoitems.has(parentItem) || redoItem(transaction, parentItem, redoitems, itemsToDelete, ignoreRemoteMapChanges, um) === null)) {
9283          return null;
9284        }
9285        while (parentItem.redone !== null) {
9286          parentItem = getItemCleanStart(transaction, parentItem.redone);
9287        }
9288      }
9289      const parentType = parentItem === null ? (
9290        /** @type {AbstractType<any>} */
9291        item.parent
9292      ) : (
9293        /** @type {ContentType} */
9294        parentItem.content.type
9295      );
9296      if (item.parentSub === null) {
9297        left = item.left;
9298        right = item;
9299        while (left !== null) {
9300          let leftTrace = left;
9301          while (leftTrace !== null && /** @type {AbstractType<any>} */
9302          leftTrace.parent._item !== parentItem) {
9303            leftTrace = leftTrace.redone === null ? null : getItemCleanStart(transaction, leftTrace.redone);
9304          }
9305          if (leftTrace !== null && /** @type {AbstractType<any>} */
9306          leftTrace.parent._item === parentItem) {
9307            left = leftTrace;
9308            break;
9309          }
9310          left = left.left;
9311        }
9312        while (right !== null) {
9313          let rightTrace = right;
9314          while (rightTrace !== null && /** @type {AbstractType<any>} */
9315          rightTrace.parent._item !== parentItem) {
9316            rightTrace = rightTrace.redone === null ? null : getItemCleanStart(transaction, rightTrace.redone);
9317          }
9318          if (rightTrace !== null && /** @type {AbstractType<any>} */
9319          rightTrace.parent._item === parentItem) {
9320            right = rightTrace;
9321            break;
9322          }
9323          right = right.right;
9324        }
9325      } else {
9326        right = null;
9327        if (item.right && !ignoreRemoteMapChanges) {
9328          left = item;
9329          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))) {
9330            left = left.right;
9331            while (left.redone) left = getItemCleanStart(transaction, left.redone);
9332          }
9333          if (left && left.right !== null) {
9334            return null;
9335          }
9336        } else {
9337          left = parentType._map.get(item.parentSub) || null;
9338        }
9339      }
9340      const nextClock = getState(store, ownClientID);
9341      const nextId = createID(ownClientID, nextClock);
9342      const redoneItem = new Item(
9343        nextId,
9344        left,
9345        left && left.lastId,
9346        right,
9347        right && right.id,
9348        parentType,
9349        item.parentSub,
9350        item.content.copy()
9351      );
9352      item.redone = nextId;
9353      keepItem(redoneItem, true);
9354      redoneItem.integrate(transaction, 0);
9355      return redoneItem;
9356    };
9357    var Item = class _Item extends AbstractStruct {
9358      /**
9359       * @param {ID} id
9360       * @param {Item | null} left
9361       * @param {ID | null} origin
9362       * @param {Item | null} right
9363       * @param {ID | null} rightOrigin
9364       * @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.
9365       * @param {string | null} parentSub
9366       * @param {AbstractContent} content
9367       */
9368      constructor(id2, left, origin2, right, rightOrigin, parent, parentSub, content) {
9369        super(id2, content.getLength());
9370        this.origin = origin2;
9371        this.left = left;
9372        this.right = right;
9373        this.rightOrigin = rightOrigin;
9374        this.parent = parent;
9375        this.parentSub = parentSub;
9376        this.redone = null;
9377        this.content = content;
9378        this.info = this.content.isCountable() ? BIT2 : 0;
9379      }
9380      /**
9381       * This is used to mark the item as an indexed fast-search marker
9382       *
9383       * @type {boolean}
9384       */
9385      set marker(isMarked) {
9386        if ((this.info & BIT4) > 0 !== isMarked) {
9387          this.info ^= BIT4;
9388        }
9389      }
9390      get marker() {
9391        return (this.info & BIT4) > 0;
9392      }
9393      /**
9394       * If true, do not garbage collect this Item.
9395       */
9396      get keep() {
9397        return (this.info & BIT1) > 0;
9398      }
9399      set keep(doKeep) {
9400        if (this.keep !== doKeep) {
9401          this.info ^= BIT1;
9402        }
9403      }
9404      get countable() {
9405        return (this.info & BIT2) > 0;
9406      }
9407      /**
9408       * Whether this item was deleted or not.
9409       * @type {Boolean}
9410       */
9411      get deleted() {
9412        return (this.info & BIT3) > 0;
9413      }
9414      set deleted(doDelete) {
9415        if (this.deleted !== doDelete) {
9416          this.info ^= BIT3;
9417        }
9418      }
9419      markDeleted() {
9420        this.info |= BIT3;
9421      }
9422      /**
9423       * Return the creator clientID of the missing op or define missing items and return null.
9424       *
9425       * @param {Transaction} transaction
9426       * @param {StructStore} store
9427       * @return {null | number}
9428       */
9429      getMissing(transaction, store) {
9430        if (this.origin && this.origin.client !== this.id.client && this.origin.clock >= getState(store, this.origin.client)) {
9431          return this.origin.client;
9432        }
9433        if (this.rightOrigin && this.rightOrigin.client !== this.id.client && this.rightOrigin.clock >= getState(store, this.rightOrigin.client)) {
9434          return this.rightOrigin.client;
9435        }
9436        if (this.parent && this.parent.constructor === ID && this.id.client !== this.parent.client && this.parent.clock >= getState(store, this.parent.client)) {
9437          return this.parent.client;
9438        }
9439        if (this.origin) {
9440          this.left = getItemCleanEnd(transaction, store, this.origin);
9441          this.origin = this.left.lastId;
9442        }
9443        if (this.rightOrigin) {
9444          this.right = getItemCleanStart(transaction, this.rightOrigin);
9445          this.rightOrigin = this.right.id;
9446        }
9447        if (this.left && this.left.constructor === GC || this.right && this.right.constructor === GC) {
9448          this.parent = null;
9449        } else if (!this.parent) {
9450          if (this.left && this.left.constructor === _Item) {
9451            this.parent = this.left.parent;
9452            this.parentSub = this.left.parentSub;
9453          } else if (this.right && this.right.constructor === _Item) {
9454            this.parent = this.right.parent;
9455            this.parentSub = this.right.parentSub;
9456          }
9457        } else if (this.parent.constructor === ID) {
9458          const parentItem = getItem(store, this.parent);
9459          if (parentItem.constructor === GC) {
9460            this.parent = null;
9461          } else {
9462            this.parent = /** @type {ContentType} */
9463            parentItem.content.type;
9464          }
9465        }
9466        return null;
9467      }
9468      /**
9469       * @param {Transaction} transaction
9470       * @param {number} offset
9471       */
9472      integrate(transaction, offset) {
9473        if (offset > 0) {
9474          this.id.clock += offset;
9475          this.left = getItemCleanEnd(transaction, transaction.doc.store, createID(this.id.client, this.id.clock - 1));
9476          this.origin = this.left.lastId;
9477          this.content = this.content.splice(offset);
9478          this.length -= offset;
9479        }
9480        if (this.parent) {
9481          if (!this.left && (!this.right || this.right.left !== null) || this.left && this.left.right !== this.right) {
9482            let left = this.left;
9483            let o;
9484            if (left !== null) {
9485              o = left.right;
9486            } else if (this.parentSub !== null) {
9487              o = /** @type {AbstractType<any>} */
9488              this.parent._map.get(this.parentSub) || null;
9489              while (o !== null && o.left !== null) {
9490                o = o.left;
9491              }
9492            } else {
9493              o = /** @type {AbstractType<any>} */
9494              this.parent._start;
9495            }
9496            const conflictingItems = /* @__PURE__ */ new Set();
9497            const itemsBeforeOrigin = /* @__PURE__ */ new Set();
9498            while (o !== null && o !== this.right) {
9499              itemsBeforeOrigin.add(o);
9500              conflictingItems.add(o);
9501              if (compareIDs(this.origin, o.origin)) {
9502                if (o.id.client < this.id.client) {
9503                  left = o;
9504                  conflictingItems.clear();
9505                } else if (compareIDs(this.rightOrigin, o.rightOrigin)) {
9506                  break;
9507                }
9508              } else if (o.origin !== null && itemsBeforeOrigin.has(getItem(transaction.doc.store, o.origin))) {
9509                if (!conflictingItems.has(getItem(transaction.doc.store, o.origin))) {
9510                  left = o;
9511                  conflictingItems.clear();
9512                }
9513              } else {
9514                break;
9515              }
9516              o = o.right;
9517            }
9518            this.left = left;
9519          }
9520          if (this.left !== null) {
9521            const right = this.left.right;
9522            this.right = right;
9523            this.left.right = this;
9524          } else {
9525            let r;
9526            if (this.parentSub !== null) {
9527              r = /** @type {AbstractType<any>} */
9528              this.parent._map.get(this.parentSub) || null;
9529              while (r !== null && r.left !== null) {
9530                r = r.left;
9531              }
9532            } else {
9533              r = /** @type {AbstractType<any>} */
9534              this.parent._start;
9535              this.parent._start = this;
9536            }
9537            this.right = r;
9538          }
9539          if (this.right !== null) {
9540            this.right.left = this;
9541          } else if (this.parentSub !== null) {
9542            this.parent._map.set(this.parentSub, this);
9543            if (this.left !== null) {
9544              this.left.delete(transaction);
9545            }
9546          }
9547          if (this.parentSub === null && this.countable && !this.deleted) {
9548            this.parent._length += this.length;
9549          }
9550          addStruct(transaction.doc.store, this);
9551          this.content.integrate(transaction, this);
9552          addChangedTypeToTransaction(
9553            transaction,
9554            /** @type {AbstractType<any>} */
9555            this.parent,
9556            this.parentSub
9557          );
9558          if (
9559            /** @type {AbstractType<any>} */
9560            this.parent._item !== null && /** @type {AbstractType<any>} */
9561            this.parent._item.deleted || this.parentSub !== null && this.right !== null
9562          ) {
9563            this.delete(transaction);
9564          }
9565        } else {
9566          new GC(this.id, this.length).integrate(transaction, 0);
9567        }
9568      }
9569      /**
9570       * Returns the next non-deleted item
9571       */
9572      get next() {
9573        let n = this.right;
9574        while (n !== null && n.deleted) {
9575          n = n.right;
9576        }
9577        return n;
9578      }
9579      /**
9580       * Returns the previous non-deleted item
9581       */
9582      get prev() {
9583        let n = this.left;
9584        while (n !== null && n.deleted) {
9585          n = n.left;
9586        }
9587        return n;
9588      }
9589      /**
9590       * Computes the last content address of this Item.
9591       */
9592      get lastId() {
9593        return this.length === 1 ? this.id : createID(this.id.client, this.id.clock + this.length - 1);
9594      }
9595      /**
9596       * Try to merge two items
9597       *
9598       * @param {Item} right
9599       * @return {boolean}
9600       */
9601      mergeWith(right) {
9602        if (this.constructor === right.constructor && compareIDs(right.origin, this.lastId) && this.right === right && compareIDs(this.rightOrigin, right.rightOrigin) && this.id.client === right.id.client && this.id.clock + this.length === right.id.clock && this.deleted === right.deleted && this.redone === null && right.redone === null && this.content.constructor === right.content.constructor && this.content.mergeWith(right.content)) {
9603          const searchMarker = (
9604            /** @type {AbstractType<any>} */
9605            this.parent._searchMarker
9606          );
9607          if (searchMarker) {
9608            searchMarker.forEach((marker) => {
9609              if (marker.p === right) {
9610                marker.p = this;
9611                if (!this.deleted && this.countable) {
9612                  marker.index -= this.length;
9613                }
9614              }
9615            });
9616          }
9617          if (right.keep) {
9618            this.keep = true;
9619          }
9620          this.right = right.right;
9621          if (this.right !== null) {
9622            this.right.left = this;
9623          }
9624          this.length += right.length;
9625          return true;
9626        }
9627        return false;
9628      }
9629      /**
9630       * Mark this Item as deleted.
9631       *
9632       * @param {Transaction} transaction
9633       */
9634      delete(transaction) {
9635        if (!this.deleted) {
9636          const parent = (
9637            /** @type {AbstractType<any>} */
9638            this.parent
9639          );
9640          if (this.countable && this.parentSub === null) {
9641            parent._length -= this.length;
9642          }
9643          this.markDeleted();
9644          addToDeleteSet(transaction.deleteSet, this.id.client, this.id.clock, this.length);
9645          addChangedTypeToTransaction(transaction, parent, this.parentSub);
9646          this.content.delete(transaction);
9647        }
9648      }
9649      /**
9650       * @param {StructStore} store
9651       * @param {boolean} parentGCd
9652       */
9653      gc(store, parentGCd) {
9654        if (!this.deleted) {
9655          throw unexpectedCase();
9656        }
9657        this.content.gc(store);
9658        if (parentGCd) {
9659          replaceStruct(store, this, new GC(this.id, this.length));
9660        } else {
9661          this.content = new ContentDeleted(this.length);
9662        }
9663      }
9664      /**
9665       * Transform the properties of this type to binary and write it to an
9666       * BinaryEncoder.
9667       *
9668       * This is called when this Item is sent to a remote peer.
9669       *
9670       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder The encoder to write data to.
9671       * @param {number} offset
9672       */
9673      write(encoder, offset) {
9674        const origin2 = offset > 0 ? createID(this.id.client, this.id.clock + offset - 1) : this.origin;
9675        const rightOrigin = this.rightOrigin;
9676        const parentSub = this.parentSub;
9677        const info = this.content.getRef() & BITS5 | (origin2 === null ? 0 : BIT8) | // origin is defined
9678        (rightOrigin === null ? 0 : BIT7) | // right origin is defined
9679        (parentSub === null ? 0 : BIT6);
9680        encoder.writeInfo(info);
9681        if (origin2 !== null) {
9682          encoder.writeLeftID(origin2);
9683        }
9684        if (rightOrigin !== null) {
9685          encoder.writeRightID(rightOrigin);
9686        }
9687        if (origin2 === null && rightOrigin === null) {
9688          const parent = (
9689            /** @type {AbstractType<any>} */
9690            this.parent
9691          );
9692          if (parent._item !== void 0) {
9693            const parentItem = parent._item;
9694            if (parentItem === null) {
9695              const ykey = findRootTypeKey(parent);
9696              encoder.writeParentInfo(true);
9697              encoder.writeString(ykey);
9698            } else {
9699              encoder.writeParentInfo(false);
9700              encoder.writeLeftID(parentItem.id);
9701            }
9702          } else if (parent.constructor === String) {
9703            encoder.writeParentInfo(true);
9704            encoder.writeString(parent);
9705          } else if (parent.constructor === ID) {
9706            encoder.writeParentInfo(false);
9707            encoder.writeLeftID(parent);
9708          } else {
9709            unexpectedCase();
9710          }
9711          if (parentSub !== null) {
9712            encoder.writeString(parentSub);
9713          }
9714        }
9715        this.content.write(encoder, offset);
9716      }
9717    };
9718    var readItemContent = (decoder, info) => contentRefs[info & BITS5](decoder);
9719    var contentRefs = [
9720      () => {
9721        unexpectedCase();
9722      },
9723      // GC is not ItemContent
9724      readContentDeleted,
9725      // 1
9726      readContentJSON,
9727      // 2
9728      readContentBinary,
9729      // 3
9730      readContentString,
9731      // 4
9732      readContentEmbed,
9733      // 5
9734      readContentFormat,
9735      // 6
9736      readContentType,
9737      // 7
9738      readContentAny,
9739      // 8
9740      readContentDoc,
9741      // 9
9742      () => {
9743        unexpectedCase();
9744      }
9745      // 10 - Skip is not ItemContent
9746    ];
9747    var structSkipRefNumber = 10;
9748    var Skip = class extends AbstractStruct {
9749      get deleted() {
9750        return true;
9751      }
9752      delete() {
9753      }
9754      /**
9755       * @param {Skip} right
9756       * @return {boolean}
9757       */
9758      mergeWith(right) {
9759        if (this.constructor !== right.constructor) {
9760          return false;
9761        }
9762        this.length += right.length;
9763        return true;
9764      }
9765      /**
9766       * @param {Transaction} transaction
9767       * @param {number} offset
9768       */
9769      integrate(transaction, offset) {
9770        unexpectedCase();
9771      }
9772      /**
9773       * @param {UpdateEncoderV1 | UpdateEncoderV2} encoder
9774       * @param {number} offset
9775       */
9776      write(encoder, offset) {
9777        encoder.writeInfo(structSkipRefNumber);
9778        writeVarUint(encoder.restEncoder, this.length - offset);
9779      }
9780      /**
9781       * @param {Transaction} transaction
9782       * @param {StructStore} store
9783       * @return {null | number}
9784       */
9785      getMissing(transaction, store) {
9786        return null;
9787      }
9788    };
9789    var glo = (
9790      /** @type {any} */
9791      typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}
9792    );
9793    var importIdentifier = "__ $YJS$ __";
9794    if (glo[importIdentifier] === true) {
9795      console.error("Yjs was already imported. This breaks constructor checks and will lead to issues! - https://github.com/yjs/yjs/issues/438");
9796    }
9797    glo[importIdentifier] = true;
9798  
9799    // node_modules/y-protocols/awareness.js
9800    var outdatedTimeout = 3e4;
9801    var Awareness = class extends Observable {
9802      /**
9803       * @param {Y.Doc} doc
9804       */
9805      constructor(doc2) {
9806        super();
9807        this.doc = doc2;
9808        this.clientID = doc2.clientID;
9809        this.states = /* @__PURE__ */ new Map();
9810        this.meta = /* @__PURE__ */ new Map();
9811        this._checkInterval = /** @type {any} */
9812        setInterval(() => {
9813          const now = getUnixTime();
9814          if (this.getLocalState() !== null && outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */
9815          this.meta.get(this.clientID).lastUpdated) {
9816            this.setLocalState(this.getLocalState());
9817          }
9818          const remove = [];
9819          this.meta.forEach((meta, clientid) => {
9820            if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {
9821              remove.push(clientid);
9822            }
9823          });
9824          if (remove.length > 0) {
9825            removeAwarenessStates(this, remove, "timeout");
9826          }
9827        }, floor(outdatedTimeout / 10));
9828        doc2.on("destroy", () => {
9829          this.destroy();
9830        });
9831        this.setLocalState({});
9832      }
9833      destroy() {
9834        this.emit("destroy", [this]);
9835        this.setLocalState(null);
9836        super.destroy();
9837        clearInterval(this._checkInterval);
9838      }
9839      /**
9840       * @return {Object<string,any>|null}
9841       */
9842      getLocalState() {
9843        return this.states.get(this.clientID) || null;
9844      }
9845      /**
9846       * @param {Object<string,any>|null} state
9847       */
9848      setLocalState(state) {
9849        const clientID = this.clientID;
9850        const currLocalMeta = this.meta.get(clientID);
9851        const clock = currLocalMeta === void 0 ? 0 : currLocalMeta.clock + 1;
9852        const prevState = this.states.get(clientID);
9853        if (state === null) {
9854          this.states.delete(clientID);
9855        } else {
9856          this.states.set(clientID, state);
9857        }
9858        this.meta.set(clientID, {
9859          clock,
9860          lastUpdated: getUnixTime()
9861        });
9862        const added = [];
9863        const updated = [];
9864        const filteredUpdated = [];
9865        const removed = [];
9866        if (state === null) {
9867          removed.push(clientID);
9868        } else if (prevState == null) {
9869          if (state != null) {
9870            added.push(clientID);
9871          }
9872        } else {
9873          updated.push(clientID);
9874          if (!equalityDeep(prevState, state)) {
9875            filteredUpdated.push(clientID);
9876          }
9877        }
9878        if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {
9879          this.emit("change", [{ added, updated: filteredUpdated, removed }, "local"]);
9880        }
9881        this.emit("update", [{ added, updated, removed }, "local"]);
9882      }
9883      /**
9884       * @param {string} field
9885       * @param {any} value
9886       */
9887      setLocalStateField(field, value) {
9888        const state = this.getLocalState();
9889        if (state !== null) {
9890          this.setLocalState({
9891            ...state,
9892            [field]: value
9893          });
9894        }
9895      }
9896      /**
9897       * @return {Map<number,Object<string,any>>}
9898       */
9899      getStates() {
9900        return this.states;
9901      }
9902    };
9903    var removeAwarenessStates = (awareness, clients, origin2) => {
9904      const removed = [];
9905      for (let i = 0; i < clients.length; i++) {
9906        const clientID = clients[i];
9907        if (awareness.states.has(clientID)) {
9908          awareness.states.delete(clientID);
9909          if (clientID === awareness.clientID) {
9910            const curMeta = (
9911              /** @type {MetaClientState} */
9912              awareness.meta.get(clientID)
9913            );
9914            awareness.meta.set(clientID, {
9915              clock: curMeta.clock + 1,
9916              lastUpdated: getUnixTime()
9917            });
9918          }
9919          removed.push(clientID);
9920        }
9921      }
9922      if (removed.length > 0) {
9923        awareness.emit("change", [{ added: [], updated: [], removed }, origin2]);
9924        awareness.emit("update", [{ added: [], updated: [], removed }, origin2]);
9925      }
9926    };
9927  
9928    // packages/sync/build-module/config.mjs
9929    var CRDT_DOC_VERSION = 1;
9930    var CRDT_DOC_META_PERSISTENCE_KEY = "fromPersistence";
9931    var CRDT_RECORD_MAP_KEY = "document";
9932    var CRDT_STATE_MAP_KEY = "state";
9933    var CRDT_STATE_MAP_SAVED_AT_KEY = "savedAt";
9934    var CRDT_STATE_MAP_SAVED_BY_KEY = "savedBy";
9935    var CRDT_STATE_MAP_VERSION_KEY = "version";
9936    var LOCAL_EDITOR_ORIGIN = "gutenberg";
9937    var LOCAL_SYNC_MANAGER_ORIGIN = "syncManager";
9938    var LOCAL_UNDO_IGNORED_ORIGIN = "gutenberg-undo-ignored";
9939  
9940    // packages/sync/build-module/errors.mjs
9941    var ConnectionErrorCode = /* @__PURE__ */ ((ConnectionErrorCode2) => {
9942      ConnectionErrorCode2["AUTHENTICATION_FAILED"] = "authentication-failed";
9943      ConnectionErrorCode2["CONNECTION_EXPIRED"] = "connection-expired";
9944      ConnectionErrorCode2["CONNECTION_LIMIT_EXCEEDED"] = "connection-limit-exceeded";
9945      ConnectionErrorCode2["DOCUMENT_SIZE_LIMIT_EXCEEDED"] = "document-size-limit-exceeded";
9946      ConnectionErrorCode2["PROTOCOL_MISMATCH"] = "protocol-mismatch";
9947      ConnectionErrorCode2["UNKNOWN_ERROR"] = "unknown-error";
9948      return ConnectionErrorCode2;
9949    })(ConnectionErrorCode || {});
9950    var ConnectionError = class extends Error {
9951      constructor(code = "unknown-error", message) {
9952        super(message);
9953        this.code = code;
9954        this.name = "ConnectionError";
9955      }
9956    };
9957  
9958    // packages/sync/build-module/lock-unlock.mjs
9959    var import_private_apis = __toESM(require_private_apis(), 1);
9960    var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)(
9961      "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.",
9962      "@wordpress/sync"
9963    );
9964  
9965    // packages/sync/build-module/performance.mjs
9966    function logPerformanceTiming(fn) {
9967      return function(...args2) {
9968        const start = performance.now();
9969        const result = fn.apply(this, args2);
9970        const end = performance.now();
9971        console.log(
9972          `[SyncManager][performance]: $fn.name} took ${(end - start).toFixed(2)} ms`
9973        );
9974        return result;
9975      };
9976    }
9977    function passThru(fn) {
9978      return ((...args2) => fn(...args2));
9979    }
9980    function yieldToEventLoop(fn) {
9981      return function(...args2) {
9982        setTimeout(() => {
9983          fn.apply(this, args2);
9984        }, 0);
9985      };
9986    }
9987  
9988    // packages/sync/build-module/providers/index.mjs
9989    var import_hooks3 = __toESM(require_hooks(), 1);
9990  
9991    // packages/sync/build-module/providers/http-polling/polling-manager.mjs
9992    var import_hooks2 = __toESM(require_hooks(), 1);
9993  
9994    // node_modules/y-protocols/sync.js
9995    var messageYjsSyncStep1 = 0;
9996    var messageYjsSyncStep2 = 1;
9997    var messageYjsUpdate = 2;
9998    var writeSyncStep1 = (encoder, doc2) => {
9999      writeVarUint(encoder, messageYjsSyncStep1);
10000      const sv = encodeStateVector(doc2);
10001      writeVarUint8Array(encoder, sv);
10002    };
10003    var writeSyncStep2 = (encoder, doc2, encodedStateVector) => {
10004      writeVarUint(encoder, messageYjsSyncStep2);
10005      writeVarUint8Array(encoder, encodeStateAsUpdate(doc2, encodedStateVector));
10006    };
10007    var readSyncStep1 = (decoder, encoder, doc2) => writeSyncStep2(encoder, doc2, readVarUint8Array(decoder));
10008    var readSyncStep2 = (decoder, doc2, transactionOrigin, errorHandler) => {
10009      try {
10010        applyUpdate(doc2, readVarUint8Array(decoder), transactionOrigin);
10011      } catch (error) {
10012        if (errorHandler != null) errorHandler(
10013          /** @type {Error} */
10014          error
10015        );
10016        console.error("Caught error while handling a Yjs update", error);
10017      }
10018    };
10019    var readUpdate2 = readSyncStep2;
10020    var readSyncMessage = (decoder, encoder, doc2, transactionOrigin, errorHandler) => {
10021      const messageType = readVarUint(decoder);
10022      switch (messageType) {
10023        case messageYjsSyncStep1:
10024          readSyncStep1(decoder, encoder, doc2);
10025          break;
10026        case messageYjsSyncStep2:
10027          readSyncStep2(decoder, doc2, transactionOrigin, errorHandler);
10028          break;
10029        case messageYjsUpdate:
10030          readUpdate2(decoder, doc2, transactionOrigin, errorHandler);
10031          break;
10032        default:
10033          throw new Error("Unknown message type");
10034      }
10035      return messageType;
10036    };
10037  
10038    // packages/sync/build-module/providers/http-polling/config.mjs
10039    var import_hooks = __toESM(require_hooks(), 1);
10040    var DEFAULT_CLIENT_LIMIT_PER_ROOM = 3;
10041    var ERROR_RETRY_DELAYS_SOLO_MS = [
10042      2e3,
10043      4e3,
10044      8e3,
10045      12e3
10046      // Solo: 26s total retry time solo before dialog
10047    ];
10048    var ERROR_RETRY_DELAYS_WITH_COLLABORATORS_MS = [
10049      1e3,
10050      2e3,
10051      4e3,
10052      8e3
10053      // With collaborators: 15s total retry time before dialog
10054    ];
10055    var DISCONNECT_DIALOG_RETRY_MS = 3e4;
10056    var MANUAL_RETRY_INTERVAL_MS = 15e3;
10057    var MAX_ENCODED_UPDATE_SIZE_IN_BYTES = 1 * 1024 * 1024;
10058    var MAX_UPDATE_SIZE_IN_BYTES = Math.floor(MAX_ENCODED_UPDATE_SIZE_IN_BYTES / 4) * 3;
10059    var MAX_ROOMS_PER_REQUEST = 50;
10060    var MAX_SYNC_REQUEST_BODY_SIZE_IN_BYTES = 15 * 1024 * 1024;
10061    var MIN_SYNC_REQUEST_BODY_SIZE_LIMIT_IN_BYTES = 2 * 1024 * 1024;
10062    var DEFAULT_POLLING_INTERVAL_IN_MS = 4e3;
10063    var DEFAULT_POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS = 1e3;
10064    function getFilteredPollingInterval(hookName, defaultInterval) {
10065      const filteredInterval = (0, import_hooks.applyFilters)(hookName, defaultInterval);
10066      if (typeof filteredInterval !== "number" || !Number.isFinite(filteredInterval) || filteredInterval <= 0) {
10067        return defaultInterval;
10068      }
10069      return Math.min(filteredInterval, defaultInterval);
10070    }
10071    var POLLING_INTERVAL_IN_MS = getFilteredPollingInterval(
10072      "sync.pollingManager.pollingInterval",
10073      DEFAULT_POLLING_INTERVAL_IN_MS
10074    );
10075    var POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS = getFilteredPollingInterval(
10076      "sync.pollingManager.pollingIntervalWithCollaborators",
10077      DEFAULT_POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS
10078    );
10079    var POLLING_INTERVAL_BACKGROUND_TAB_IN_MS = 25 * 1e3;
10080  
10081    // packages/sync/build-module/providers/http-polling/types.mjs
10082    var SyncUpdateType = /* @__PURE__ */ ((SyncUpdateType2) => {
10083      SyncUpdateType2["COMPACTION"] = "compaction";
10084      SyncUpdateType2["SYNC_STEP_1"] = "sync_step1";
10085      SyncUpdateType2["SYNC_STEP_2"] = "sync_step2";
10086      SyncUpdateType2["UPDATE"] = "update";
10087      return SyncUpdateType2;
10088    })(SyncUpdateType || {});
10089  
10090    // packages/sync/build-module/providers/http-polling/utils.mjs
10091    var import_api_fetch = __toESM(require_api_fetch(), 1);
10092    var SYNC_API_PATH = "/wp-sync/v1/updates";
10093    function uint8ArrayToBase64(data) {
10094      let binary = "";
10095      const len = data.byteLength;
10096      for (let i = 0; i < len; i++) {
10097        binary += String.fromCharCode(data[i]);
10098      }
10099      return globalThis.btoa(binary);
10100    }
10101    function base64ToUint8Array(base64) {
10102      const binaryString = globalThis.atob(base64);
10103      const len = binaryString.length;
10104      const bytes = new Uint8Array(len);
10105      for (let i = 0; i < len; i++) {
10106        bytes[i] = binaryString.charCodeAt(i);
10107      }
10108      return bytes;
10109    }
10110    function createSyncUpdate(data, type) {
10111      return {
10112        data: uint8ArrayToBase64(data),
10113        type
10114      };
10115    }
10116    function createUpdateQueue(initial = [], paused = true) {
10117      let isPaused = paused;
10118      const updates = [...initial];
10119      return {
10120        add(update) {
10121          updates.push(update);
10122        },
10123        addBulk(bulkUpdates) {
10124          if (0 === bulkUpdates.length) {
10125            return;
10126          }
10127          updates.push(...bulkUpdates);
10128        },
10129        clear() {
10130          updates.splice(0, updates.length);
10131        },
10132        get() {
10133          if (isPaused) {
10134            return [];
10135          }
10136          return updates.splice(0, updates.length);
10137        },
10138        pause() {
10139          isPaused = true;
10140        },
10141        peek() {
10142          if (isPaused) {
10143            return [];
10144          }
10145          return [...updates];
10146        },
10147        restore(restoredUpdates) {
10148          const filtered = restoredUpdates.filter(
10149            (u) => u.type !== SyncUpdateType.COMPACTION
10150          );
10151          if (0 === filtered.length) {
10152            return;
10153          }
10154          updates.unshift(...filtered);
10155        },
10156        restoreExact(restoredUpdates) {
10157          if (0 === restoredUpdates.length) {
10158            return;
10159          }
10160          updates.unshift(...restoredUpdates);
10161        },
10162        resume() {
10163          isPaused = false;
10164        },
10165        size() {
10166          return updates.length;
10167        },
10168        take(count) {
10169          if (isPaused || count <= 0) {
10170            return [];
10171          }
10172          return updates.splice(0, count);
10173        }
10174      };
10175    }
10176    function postSyncUpdate(payload) {
10177      return (0, import_api_fetch.default)({
10178        method: "POST",
10179        path: SYNC_API_PATH,
10180        data: payload
10181      });
10182    }
10183    function postSyncUpdateNonBlocking(payload) {
10184      if (payload.rooms.length === 0) {
10185        return;
10186      }
10187      (0, import_api_fetch.default)({
10188        method: "POST",
10189        path: SYNC_API_PATH,
10190        data: payload,
10191        keepalive: true
10192      }).catch(() => {
10193      });
10194    }
10195    function intValueOrDefault(value, defaultValue) {
10196      const intValue = parseInt(String(value), 10);
10197      return isNaN(intValue) ? defaultValue : intValue;
10198    }
10199    function rotateWindow(items, offset, size2) {
10200      if (items.length === 0) {
10201        return { window: [], nextOffset: 0 };
10202      }
10203      const start = (offset % items.length + items.length) % items.length;
10204      const wrapped = [...items.slice(start), ...items.slice(0, start)];
10205      return {
10206        window: wrapped.slice(0, Math.max(0, size2)),
10207        nextOffset: (start + Math.max(0, size2)) % items.length
10208      };
10209    }
10210  
10211    // packages/sync/build-module/providers/http-polling/polling-manager.mjs
10212    var POLLING_MANAGER_ORIGIN = "polling-manager";
10213    function isForbiddenError(error) {
10214      return error?.data?.status === 403;
10215    }
10216    function isRequestBodyTooLargeError(error) {
10217      return error?.data?.status === 413 && error?.code === "rest_sync_body_too_large";
10218    }
10219    function isProtocolMismatchError(error) {
10220      return error?.code === "rest_sync_protocol_mismatch";
10221    }
10222    function handleForbiddenError(error, requestedRooms) {
10223      const requestedRoomNames = new Set(
10224        requestedRooms.map((room) => room.room)
10225      );
10226      const forbiddenRooms = Array.isArray(error.data.rooms) ? error.data.rooms.filter((room) => requestedRoomNames.has(room)) : [];
10227      if (forbiddenRooms.length > 0) {
10228        for (const room of forbiddenRooms) {
10229          const state = roomStates.get(room);
10230          if (state) {
10231            state.log(
10232              "Permission denied, unregistering room",
10233              { error },
10234              "error",
10235              true
10236              // force
10237            );
10238            unregisterRoom(room, { sendDisconnectSignal: false });
10239          }
10240        }
10241        for (const room of requestedRooms) {
10242          if (forbiddenRooms.includes(room.room)) {
10243            continue;
10244          }
10245          if (!roomStates.has(room.room)) {
10246            continue;
10247          }
10248          const remainingState = roomStates.get(room.room);
10249          if (room.updates.length > 0) {
10250            remainingState.updateQueue.restore(room.updates);
10251          }
10252        }
10253      } else {
10254        const rooms = [...roomStates.keys()];
10255        for (const room of rooms) {
10256          const state = roomStates.get(room);
10257          if (state) {
10258            state.log(
10259              "Permission denied, unregistering room",
10260              { error },
10261              "error",
10262              true
10263              // force
10264            );
10265            unregisterRoom(room, { sendDisconnectSignal: false });
10266          }
10267        }
10268      }
10269    }
10270    var roomStates = /* @__PURE__ */ new Map();
10271    function createDeprecatedCompactionUpdate(updates) {
10272      const mergeable = updates.filter(
10273        (u) => [SyncUpdateType.COMPACTION, SyncUpdateType.UPDATE].includes(
10274          u.type
10275        )
10276      ).map((u) => base64ToUint8Array(u.data));
10277      return createSyncUpdate(
10278        mergeUpdatesV2(mergeable),
10279        SyncUpdateType.COMPACTION
10280      );
10281    }
10282    function createSyncStep1Update(doc2) {
10283      const encoder = createEncoder();
10284      writeSyncStep1(encoder, doc2);
10285      return createSyncUpdate(
10286        toUint8Array(encoder),
10287        SyncUpdateType.SYNC_STEP_1
10288      );
10289    }
10290    function createSyncStep2Update(doc2, step1) {
10291      const decoder = createDecoder(step1);
10292      const encoder = createEncoder();
10293      readSyncMessage(
10294        decoder,
10295        encoder,
10296        doc2,
10297        POLLING_MANAGER_ORIGIN
10298      );
10299      return createSyncUpdate(
10300        toUint8Array(encoder),
10301        SyncUpdateType.SYNC_STEP_2
10302      );
10303    }
10304    function processAwarenessUpdate(state, awareness) {
10305      const currentStates = awareness.getStates();
10306      const added = /* @__PURE__ */ new Set();
10307      const updated = /* @__PURE__ */ new Set();
10308      const removed = new Set(
10309        Array.from(currentStates.keys()).filter(
10310          (clientId) => !state[clientId]
10311        )
10312      );
10313      Object.entries(state).forEach(([clientIdString, awarenessState]) => {
10314        const clientId = Number(clientIdString);
10315        if (clientId === awareness.clientID) {
10316          return;
10317        }
10318        if (null === awarenessState) {
10319          currentStates.delete(clientId);
10320          removed.add(clientId);
10321          return;
10322        }
10323        if (!currentStates.has(clientId)) {
10324          currentStates.set(clientId, awarenessState);
10325          added.add(clientId);
10326          return;
10327        }
10328        const currentState = currentStates.get(clientId);
10329        if (JSON.stringify(currentState) !== JSON.stringify(awarenessState)) {
10330          currentStates.set(clientId, awarenessState);
10331          updated.add(clientId);
10332        }
10333      });
10334      if (added.size + updated.size > 0) {
10335        awareness.emit("change", [
10336          {
10337            added: Array.from(added),
10338            updated: Array.from(updated),
10339            // Left blank on purpose, as the removal of clients is handled in the if condition below.
10340            removed: []
10341          }
10342        ]);
10343      }
10344      if (removed.size > 0) {
10345        removeAwarenessStates(
10346          awareness,
10347          Array.from(removed),
10348          POLLING_MANAGER_ORIGIN
10349        );
10350      }
10351    }
10352    function processDocUpdate(update, doc2, onSync) {
10353      const data = base64ToUint8Array(update.data);
10354      switch (update.type) {
10355        case SyncUpdateType.SYNC_STEP_1: {
10356          return createSyncStep2Update(doc2, data);
10357        }
10358        case SyncUpdateType.SYNC_STEP_2: {
10359          const decoder = createDecoder(data);
10360          const encoder = createEncoder();
10361          readSyncMessage(
10362            decoder,
10363            encoder,
10364            doc2,
10365            POLLING_MANAGER_ORIGIN
10366          );
10367          onSync();
10368          return;
10369        }
10370        case SyncUpdateType.COMPACTION:
10371        case SyncUpdateType.UPDATE: {
10372          applyUpdateV2(doc2, data, POLLING_MANAGER_ORIGIN);
10373        }
10374      }
10375    }
10376    function checkConnectionLimit(awareness, roomState) {
10377      if (!roomState.isPrimaryRoom || hasCheckedConnectionLimit) {
10378        return false;
10379      }
10380      hasCheckedConnectionLimit = true;
10381      const maxClientsPerRoom = (0, import_hooks2.applyFilters)(
10382        "sync.pollingProvider.maxClientsPerRoom",
10383        DEFAULT_CLIENT_LIMIT_PER_ROOM,
10384        roomState.room
10385      );
10386      const clientCount = Object.keys(awareness).length;
10387      const validatedLimit = intValueOrDefault(
10388        maxClientsPerRoom,
10389        DEFAULT_CLIENT_LIMIT_PER_ROOM
10390      );
10391      if (clientCount > validatedLimit) {
10392        roomState.log("Connection limit exceeded", {
10393          clientCount,
10394          maxClientsPerRoom: validatedLimit,
10395          room: roomState.room
10396        });
10397        return true;
10398      }
10399      return false;
10400    }
10401    var areListenersRegistered = false;
10402    var consecutiveFailures = 0;
10403    var hasCheckedConnectionLimit = false;
10404    var isManualRetry = false;
10405    var hasCollaborators = false;
10406    var isActiveBrowser = "visible" === document.visibilityState;
10407    var isPolling = false;
10408    var isUnloadPending = false;
10409    var pollInterval = POLLING_INTERVAL_IN_MS;
10410    var pollingTimeoutId = null;
10411    var syncRequestBodySizeLimit = MAX_SYNC_REQUEST_BODY_SIZE_IN_BYTES;
10412    var roomOverflowOffset = 0;
10413    function handleBeforeUnload() {
10414      isUnloadPending = true;
10415    }
10416    function handlePageHide() {
10417      const rooms = Array.from(roomStates.entries()).map(
10418        ([room, state]) => ({
10419          after: 0,
10420          awareness: null,
10421          client_id: state.clientId,
10422          room,
10423          updates: []
10424        })
10425      );
10426      for (let i = 0; i < rooms.length; i += MAX_ROOMS_PER_REQUEST) {
10427        postSyncUpdateNonBlocking({
10428          rooms: rooms.slice(i, i + MAX_ROOMS_PER_REQUEST)
10429        });
10430      }
10431    }
10432    function handleVisibilityChange() {
10433      const wasActive = isActiveBrowser;
10434      isActiveBrowser = document.visibilityState === "visible";
10435      if (isActiveBrowser && !wasActive) {
10436        if (pollingTimeoutId) {
10437          clearTimeout(pollingTimeoutId);
10438          pollingTimeoutId = null;
10439          poll();
10440        }
10441      }
10442    }
10443    function selectRoomsForRequest() {
10444      const allRooms = Array.from(roomStates.values());
10445      if (allRooms.length <= MAX_ROOMS_PER_REQUEST) {
10446        return allRooms;
10447      }
10448      const primaryRoom = allRooms.find((state) => state.isPrimaryRoom);
10449      const overflowRooms = allRooms.filter((state) => state !== primaryRoom);
10450      const overflowSlotsPerRequest = MAX_ROOMS_PER_REQUEST - (primaryRoom ? 1 : 0);
10451      const { window: overflowSlice, nextOffset } = rotateWindow(
10452        overflowRooms,
10453        roomOverflowOffset,
10454        overflowSlotsPerRequest
10455      );
10456      roomOverflowOffset = nextOffset;
10457      if (primaryRoom) {
10458        return [primaryRoom, ...overflowSlice];
10459      }
10460      return overflowSlice;
10461    }
10462    var textEncoder = new TextEncoder();
10463    function getJsonByteLength(value) {
10464      return textEncoder.encode(JSON.stringify(value)).byteLength;
10465    }
10466    function createPayloadRoom(state, updates = []) {
10467      return {
10468        after: state.endCursor ?? 0,
10469        awareness: state.localAwarenessState,
10470        client_id: state.clientId,
10471        room: state.room,
10472        updates
10473      };
10474    }
10475    function getUpdatePayloadSizeDelta(existingUpdateCount, update) {
10476      const commaSize = existingUpdateCount === 0 ? 0 : 1;
10477      return commaSize + getJsonByteLength(update);
10478    }
10479    function buildPayloadForRequest(selectedRoomStates) {
10480      const payload = { rooms: [] };
10481      const roomsInRequest = [];
10482      for (const state of selectedRoomStates) {
10483        const room = createPayloadRoom(state);
10484        const candidate = { rooms: [...payload.rooms, room] };
10485        if (payload.rooms.length > 0 && getJsonByteLength(candidate) > syncRequestBodySizeLimit) {
10486          break;
10487        }
10488        payload.rooms.push(room);
10489        roomsInRequest.push(state);
10490      }
10491      const pendingUpdates = roomsInRequest.map(
10492        (state) => state.updateQueue.peek()
10493      );
10494      const sentUpdateCounts = roomsInRequest.map(() => 0);
10495      let payloadSize = getJsonByteLength(payload);
10496      let addedUpdate = true;
10497      while (addedUpdate) {
10498        addedUpdate = false;
10499        for (let i = 0; i < roomsInRequest.length; i++) {
10500          const update = pendingUpdates[i][sentUpdateCounts[i]];
10501          if (!update) {
10502            continue;
10503          }
10504          const sizeDelta = getUpdatePayloadSizeDelta(
10505            sentUpdateCounts[i],
10506            update
10507          );
10508          if (payloadSize + sizeDelta > syncRequestBodySizeLimit) {
10509            continue;
10510          }
10511          sentUpdateCounts[i]++;
10512          payloadSize += sizeDelta;
10513          addedUpdate = true;
10514        }
10515      }
10516      for (let i = 0; i < roomsInRequest.length; i++) {
10517        payload.rooms[i].updates = roomsInRequest[i].updateQueue.take(
10518          sentUpdateCounts[i]
10519        );
10520      }
10521      return { payload, roomsInRequest };
10522    }
10523    function restoreExactUpdates(payload) {
10524      for (const room of payload.rooms) {
10525        if (!roomStates.has(room.room) || room.updates.length === 0) {
10526          continue;
10527        }
10528        roomStates.get(room.room).updateQueue.restoreExact(room.updates);
10529      }
10530    }
10531    function poll() {
10532      isPolling = true;
10533      pollingTimeoutId = null;
10534      async function start() {
10535        if (0 === roomStates.size) {
10536          isPolling = false;
10537          return;
10538        }
10539        isUnloadPending = false;
10540        const { payload, roomsInRequest } = buildPayloadForRequest(
10541          selectRoomsForRequest()
10542        );
10543        roomsInRequest.forEach((state) => {
10544          state.onStatusChange({ status: "connecting" });
10545        });
10546        try {
10547          const { rooms } = await postSyncUpdate(payload);
10548          consecutiveFailures = 0;
10549          isManualRetry = false;
10550          syncRequestBodySizeLimit = MAX_SYNC_REQUEST_BODY_SIZE_IN_BYTES;
10551          roomsInRequest.forEach((state) => {
10552            if (roomStates.get(state.room) !== state) {
10553              return;
10554            }
10555            state.onStatusChange({ status: "connected" });
10556          });
10557          hasCollaborators = false;
10558          rooms.forEach((room) => {
10559            if (!roomStates.has(room.room)) {
10560              return;
10561            }
10562            const roomState = roomStates.get(room.room);
10563            roomState.endCursor = room.end_cursor;
10564            if (checkConnectionLimit(room.awareness, roomState)) {
10565              roomState.onStatusChange({
10566                status: "disconnected",
10567                error: new ConnectionError(
10568                  ConnectionErrorCode.CONNECTION_LIMIT_EXCEEDED,
10569                  "Connection limit exceeded"
10570                )
10571              });
10572              unregisterRoom(room.room);
10573              return;
10574            }
10575            roomState.processAwarenessUpdate(room.awareness);
10576            if (roomState.isPrimaryRoom && Object.keys(room.awareness).length > 1) {
10577              hasCollaborators = true;
10578              roomStates.forEach((state) => {
10579                state.updateQueue.resume();
10580              });
10581            }
10582            const responseUpdates = [];
10583            for (const update of room.updates) {
10584              try {
10585                const response = roomState.processDocUpdate(update);
10586                if (response) {
10587                  responseUpdates.push(response);
10588                }
10589              } catch (error) {
10590                roomState.log(
10591                  "Failed to apply sync update",
10592                  { error, update },
10593                  "error",
10594                  true
10595                  // force
10596                );
10597              }
10598            }
10599            roomState.updateQueue.addBulk(responseUpdates);
10600            if (room.should_compact) {
10601              roomState.log("Server requested compaction update");
10602              roomState.updateQueue.clear();
10603              roomState.updateQueue.add(
10604                roomState.createCompactionUpdate()
10605              );
10606            } else if (room.compaction_request) {
10607              roomState.log("Server requested (old) compaction update");
10608              roomState.updateQueue.add(
10609                createDeprecatedCompactionUpdate(
10610                  room.compaction_request
10611                )
10612              );
10613            }
10614          });
10615          if (isActiveBrowser && hasCollaborators) {
10616            pollInterval = POLLING_INTERVAL_WITH_COLLABORATORS_IN_MS;
10617          } else if (isActiveBrowser) {
10618            pollInterval = POLLING_INTERVAL_IN_MS;
10619          } else {
10620            pollInterval = POLLING_INTERVAL_BACKGROUND_TAB_IN_MS;
10621          }
10622        } catch (error) {
10623          if (isForbiddenError(error)) {
10624            handleForbiddenError(error, payload.rooms);
10625            if (roomStates.size === 0) {
10626              isPolling = false;
10627              return;
10628            }
10629          } else if (isRequestBodyTooLargeError(error)) {
10630            syncRequestBodySizeLimit = Math.max(
10631              MIN_SYNC_REQUEST_BODY_SIZE_LIMIT_IN_BYTES,
10632              Math.floor(syncRequestBodySizeLimit / 2)
10633            );
10634            pollInterval = hasCollaborators ? ERROR_RETRY_DELAYS_WITH_COLLABORATORS_MS[0] : ERROR_RETRY_DELAYS_SOLO_MS[0];
10635            restoreExactUpdates(payload);
10636            for (const room of payload.rooms) {
10637              if (!roomStates.has(room.room)) {
10638                continue;
10639              }
10640              roomStates.get(room.room).log(
10641                "Sync request body too large, retrying with smaller batches",
10642                {
10643                  error,
10644                  nextPoll: pollInterval,
10645                  syncRequestBodySizeLimit
10646                },
10647                "error",
10648                true
10649                // force
10650              );
10651            }
10652          } else if (isProtocolMismatchError(error)) {
10653            const affectedRooms = [...roomStates.entries()];
10654            for (const [, state] of affectedRooms) {
10655              state.onStatusChange({
10656                status: "disconnected",
10657                error: new ConnectionError(
10658                  ConnectionErrorCode.PROTOCOL_MISMATCH,
10659                  "Protocol mismatch between client and server"
10660                )
10661              });
10662            }
10663            for (const [room] of affectedRooms) {
10664              unregisterRoom(room, { sendDisconnectSignal: false });
10665            }
10666            isPolling = false;
10667            return;
10668          } else {
10669            consecutiveFailures++;
10670            const retrySchedule = hasCollaborators ? ERROR_RETRY_DELAYS_WITH_COLLABORATORS_MS : ERROR_RETRY_DELAYS_SOLO_MS;
10671            if (consecutiveFailures <= retrySchedule.length) {
10672              pollInterval = retrySchedule[consecutiveFailures - 1];
10673            } else {
10674              pollInterval = DISCONNECT_DIALOG_RETRY_MS;
10675            }
10676            if (isManualRetry) {
10677              pollInterval = MANUAL_RETRY_INTERVAL_MS;
10678              isManualRetry = false;
10679            }
10680            for (const room of payload.rooms) {
10681              if (!roomStates.has(room.room)) {
10682                continue;
10683              }
10684              const state = roomStates.get(room.room);
10685              if (room.updates.length > 0 && state.endCursor > 0) {
10686                state.updateQueue.clear();
10687                state.updateQueue.add(state.createCompactionUpdate());
10688              } else if (room.updates.length > 0) {
10689                state.updateQueue.restore(room.updates);
10690              }
10691              state.log(
10692                "Error posting sync update, will retry with backoff",
10693                { error, nextPoll: pollInterval },
10694                "error",
10695                true
10696                // force
10697              );
10698            }
10699            if (!isUnloadPending) {
10700              const backgroundRetriesFailed = consecutiveFailures > retrySchedule.length;
10701              roomsInRequest.forEach((state) => {
10702                if (roomStates.get(state.room) !== state) {
10703                  return;
10704                }
10705                state.onStatusChange({
10706                  status: "disconnected",
10707                  canManuallyRetry: true,
10708                  consecutiveFailures,
10709                  backgroundRetriesFailed,
10710                  willAutoRetryInMs: pollInterval
10711                });
10712              });
10713            }
10714          }
10715        }
10716        pollingTimeoutId = setTimeout(poll, pollInterval);
10717      }
10718      void start();
10719    }
10720    function registerRoom({
10721      room,
10722      doc: doc2,
10723      awareness,
10724      log,
10725      onSync,
10726      onStatusChange
10727    }) {
10728      if (roomStates.has(room)) {
10729        return;
10730      }
10731      const updateQueue = createUpdateQueue([createSyncStep1Update(doc2)]);
10732      const isPrimaryRoom = 0 === roomStates.size;
10733      function onAwarenessUpdate() {
10734        roomState.localAwarenessState = awareness.getLocalState() ?? {};
10735      }
10736      function onDocUpdate(update, origin2) {
10737        if (POLLING_MANAGER_ORIGIN === origin2) {
10738          return;
10739        }
10740        if (update.byteLength > MAX_UPDATE_SIZE_IN_BYTES) {
10741          const state = roomStates.get(room);
10742          if (!state) {
10743            return;
10744          }
10745          state.log("Document size limit exceeded", {
10746            maxUpdateSizeInBytes: MAX_UPDATE_SIZE_IN_BYTES,
10747            updateSizeInBytes: update.byteLength
10748          });
10749          state.onStatusChange({
10750            status: "disconnected",
10751            error: new ConnectionError(
10752              ConnectionErrorCode.DOCUMENT_SIZE_LIMIT_EXCEEDED,
10753              "Document size limit exceeded"
10754            )
10755          });
10756          unregisterRoom(room);
10757          return;
10758        }
10759        updateQueue.add(createSyncUpdate(update, SyncUpdateType.UPDATE));
10760      }
10761      function unregister() {
10762        doc2.off("updateV2", onDocUpdate);
10763        awareness.off("change", onAwarenessUpdate);
10764        updateQueue.clear();
10765      }
10766      const roomState = {
10767        clientId: doc2.clientID,
10768        createCompactionUpdate: () => createSyncUpdate(
10769          encodeStateAsUpdateV2(doc2),
10770          SyncUpdateType.COMPACTION
10771        ),
10772        endCursor: 0,
10773        isPrimaryRoom,
10774        localAwarenessState: awareness.getLocalState() ?? {},
10775        log,
10776        onStatusChange,
10777        processAwarenessUpdate: (state) => processAwarenessUpdate(state, awareness),
10778        processDocUpdate: (update) => processDocUpdate(update, doc2, onSync),
10779        room,
10780        unregister,
10781        updateQueue
10782      };
10783      doc2.on("updateV2", onDocUpdate);
10784      awareness.on("change", onAwarenessUpdate);
10785      roomStates.set(room, roomState);
10786      if (!areListenersRegistered) {
10787        window.addEventListener("beforeunload", handleBeforeUnload);
10788        window.addEventListener("pagehide", handlePageHide);
10789        document.addEventListener("visibilitychange", handleVisibilityChange);
10790        areListenersRegistered = true;
10791      }
10792      if (!isPolling) {
10793        poll();
10794      }
10795    }
10796    function unregisterRoom(room, { sendDisconnectSignal = true } = {}) {
10797      const state = roomStates.get(room);
10798      if (state) {
10799        if (sendDisconnectSignal) {
10800          const rooms = [
10801            {
10802              after: 0,
10803              awareness: null,
10804              client_id: state.clientId,
10805              room,
10806              updates: []
10807            }
10808          ];
10809          postSyncUpdateNonBlocking({ rooms });
10810        }
10811        state.unregister();
10812        roomStates.delete(room);
10813      }
10814      if (0 === roomStates.size && areListenersRegistered) {
10815        window.removeEventListener("beforeunload", handleBeforeUnload);
10816        window.removeEventListener("pagehide", handlePageHide);
10817        document.removeEventListener(
10818          "visibilitychange",
10819          handleVisibilityChange
10820        );
10821        areListenersRegistered = false;
10822        hasCheckedConnectionLimit = false;
10823        consecutiveFailures = 0;
10824        roomOverflowOffset = 0;
10825        syncRequestBodySizeLimit = MAX_SYNC_REQUEST_BODY_SIZE_IN_BYTES;
10826      }
10827    }
10828    function retryNow() {
10829      isManualRetry = true;
10830      if (pollingTimeoutId) {
10831        clearTimeout(pollingTimeoutId);
10832        pollingTimeoutId = null;
10833        poll();
10834      }
10835    }
10836    var pollingManager = {
10837      registerRoom,
10838      retryNow,
10839      unregisterRoom
10840    };
10841  
10842    // packages/sync/build-module/providers/http-polling/http-polling-provider.mjs
10843    var HttpPollingProvider = class extends ObservableV2 {
10844      constructor(options) {
10845        super();
10846        this.options = options;
10847        this.log("Initializing", { room: options.room });
10848        this.awareness = options.awareness ?? new Awareness(options.ydoc);
10849        this.connect();
10850      }
10851      awareness;
10852      status = "disconnected";
10853      synced = false;
10854      /**
10855       * Connect to the endpoint and initialize sync.
10856       */
10857      connect() {
10858        this.log("Connecting");
10859        pollingManager.registerRoom({
10860          room: this.options.room,
10861          doc: this.options.ydoc,
10862          awareness: this.awareness,
10863          log: this.log,
10864          onStatusChange: this.emitStatus,
10865          onSync: this.onSync
10866        });
10867      }
10868      /**
10869       * Destroy the provider and cleanup resources.
10870       */
10871      destroy() {
10872        this.disconnect();
10873        super.destroy();
10874      }
10875      /**
10876       * Disconnect the provider and allow reconnection later.
10877       */
10878      disconnect() {
10879        this.log("Disconnecting");
10880        pollingManager.unregisterRoom(this.options.room);
10881        this.emitStatus({ status: "disconnected" });
10882      }
10883      /**
10884       * Emit connection status, passing the full object through so that
10885       * additional fields (e.g. `willAutoRetryInMs`) are preserved for consumers.
10886       *
10887       * @param connectionStatus The connection status object
10888       */
10889      emitStatus = (connectionStatus) => {
10890        const { status } = connectionStatus;
10891        const error = status === "disconnected" ? connectionStatus.error : void 0;
10892        if (this.status === status && !error) {
10893          return;
10894        }
10895        if (status === "connecting" && this.status !== "disconnected") {
10896          return;
10897        }
10898        this.log("Status change", { status, error });
10899        this.status = status;
10900        this.emit("status", [connectionStatus]);
10901      };
10902      /**
10903       * Log debug messages if debugging is enabled.
10904       *
10905       * @param message    The debug message
10906       * @param debug      Additional debug information
10907       * @param errorLevel The console method to use for logging
10908       * @param force      Whether to force logging regardless of debug setting
10909       */
10910      log = (message, debug = {}, errorLevel = "log", force = false) => {
10911        if (!this.options.debug && !force) {
10912          return;
10913        }
10914        const logFn = console[errorLevel] || console.log;
10915        logFn(`[$this.constructor.name}]: $message}`, {
10916          room: this.options.room,
10917          ...debug
10918        });
10919      };
10920      /**
10921       * Handle synchronization events from the polling manager.
10922       */
10923      onSync = () => {
10924        if (!this.synced) {
10925          this.synced = true;
10926          this.log("Synced");
10927        }
10928      };
10929    };
10930    function createHttpPollingProvider() {
10931      return async ({
10932        awareness,
10933        objectType,
10934        objectId,
10935        ydoc
10936      }) => {
10937        const room = objectId ? `$objectType}:$objectId}` : objectType;
10938        const provider = new HttpPollingProvider({
10939          awareness,
10940          // debug: true,
10941          room,
10942          ydoc
10943        });
10944        return {
10945          destroy: () => provider.destroy(),
10946          // Adapter: ObservableV2.on is compatible with ProviderOn
10947          // The callback receives data as the first parameter
10948          on: (event, callback) => {
10949            provider.on(event, callback);
10950          }
10951        };
10952      };
10953    }
10954  
10955    // packages/sync/build-module/providers/index.mjs
10956    var providerCreators = null;
10957    function getDefaultProviderCreators() {
10958      return [createHttpPollingProvider()];
10959    }
10960    function isProviderCreator(creator) {
10961      return "function" === typeof creator;
10962    }
10963    function getProviderCreators() {
10964      if (providerCreators) {
10965        return providerCreators;
10966      }
10967      if (!window._wpCollaborationEnabled) {
10968        return [];
10969      }
10970      const filteredProviderCreators = (0, import_hooks3.applyFilters)(
10971        "sync.providers",
10972        getDefaultProviderCreators()
10973      );
10974      if (!Array.isArray(filteredProviderCreators)) {
10975        providerCreators = [];
10976        return providerCreators;
10977      }
10978      providerCreators = filteredProviderCreators.filter(isProviderCreator);
10979      return providerCreators;
10980    }
10981  
10982    // packages/sync/build-module/y-utilities/y-multidoc-undomanager.mjs
10983    var popStackItem2 = (mum, type) => {
10984      const stack = type === "undo" ? mum.undoStack : mum.redoStack;
10985      while (stack.length > 0) {
10986        const um = (
10987          /** @type {Y.UndoManager} */
10988          stack.pop()
10989        );
10990        const prevUmStack = type === "undo" ? um.undoStack : um.redoStack;
10991        const stackItem = (
10992          /** @type {any} */
10993          prevUmStack.pop()
10994        );
10995        let actionPerformed = false;
10996        if (type === "undo") {
10997          um.undoStack = [stackItem];
10998          actionPerformed = um.undo() !== null;
10999          um.undoStack = prevUmStack;
11000        } else {
11001          um.redoStack = [stackItem];
11002          actionPerformed = um.redo() !== null;
11003          um.redoStack = prevUmStack;
11004        }
11005        if (actionPerformed) {
11006          return stackItem;
11007        }
11008      }
11009      return null;
11010    };
11011    var YMultiDocUndoManager = class extends Observable {
11012      /**
11013       * @param {Y.AbstractType<any>|Array<Y.AbstractType<any>>} typeScope Accepts either a single type, or an array of types
11014       * @param {ConstructorParameters<typeof Y.UndoManager>[1]} opts
11015       */
11016      constructor(typeScope = [], opts = {}) {
11017        super();
11018        this.docs = /* @__PURE__ */ new Map();
11019        this.trackedOrigins = opts.trackedOrigins || /* @__PURE__ */ new Set([null]);
11020        opts.trackedOrigins = this.trackedOrigins;
11021        this._defaultOpts = opts;
11022        this.undoStack = [];
11023        this.redoStack = [];
11024        this.addToScope(typeScope);
11025      }
11026      /**
11027       * @param {Array<Y.AbstractType<any>> | Y.AbstractType<any>} ytypes
11028       */
11029      addToScope(ytypes) {
11030        ytypes = isArray(ytypes) ? ytypes : [ytypes];
11031        ytypes.forEach((ytype) => {
11032          const ydoc = (
11033            /** @type {Y.Doc} */
11034            ytype.doc
11035          );
11036          const um = setIfUndefined(this.docs, ydoc, () => {
11037            const um2 = new UndoManager([ytype], this._defaultOpts);
11038            um2.on(
11039              "stack-cleared",
11040              /** @param {any} opts */
11041              ({
11042                undoStackCleared,
11043                redoStackCleared
11044              }) => {
11045                this.clear(undoStackCleared, redoStackCleared);
11046              }
11047            );
11048            ydoc.on("destroy", () => {
11049              this.docs.delete(ydoc);
11050              this.undoStack = this.undoStack.filter(
11051                (um3) => um3.doc !== ydoc
11052              );
11053              this.redoStack = this.redoStack.filter(
11054                (um3) => um3.doc !== ydoc
11055              );
11056            });
11057            um2.on(
11058              "stack-item-added",
11059              /** @param {any} change */
11060              (change) => {
11061                const stack = change.type === "undo" ? this.undoStack : this.redoStack;
11062                stack.push(um2);
11063                this.emit("stack-item-added", [
11064                  { ...change, ydoc },
11065                  this
11066                ]);
11067              }
11068            );
11069            um2.on(
11070              "stack-item-updated",
11071              /** @param {any} change */
11072              (change) => {
11073                this.emit("stack-item-updated", [
11074                  { ...change, ydoc },
11075                  this
11076                ]);
11077              }
11078            );
11079            um2.on(
11080              "stack-item-popped",
11081              /** @param {any} change */
11082              (change) => {
11083                this.emit("stack-item-popped", [
11084                  { ...change, ydoc },
11085                  this
11086                ]);
11087              }
11088            );
11089            return um2;
11090          });
11091          if (um.scope.every((yt) => yt !== ytype)) {
11092            um.scope.push(ytype);
11093          }
11094        });
11095      }
11096      /**
11097       * @param {any} origin
11098       */
11099      /* c8 ignore next 3 */
11100      addTrackedOrigin(origin2) {
11101        this.trackedOrigins.add(origin2);
11102      }
11103      /**
11104       * @param {any} origin
11105       */
11106      /* c8 ignore next 3 */
11107      removeTrackedOrigin(origin2) {
11108        this.trackedOrigins.delete(origin2);
11109      }
11110      /**
11111       * Undo last changes on type.
11112       *
11113       * @return {any?} Returns StackItem if a change was applied
11114       */
11115      undo() {
11116        return popStackItem2(this, "undo");
11117      }
11118      /**
11119       * Redo last undo operation.
11120       *
11121       * @return {any?} Returns StackItem if a change was applied
11122       */
11123      redo() {
11124        return popStackItem2(this, "redo");
11125      }
11126      clear(clearUndoStack = true, clearRedoStack = true) {
11127        if (clearUndoStack && this.canUndo() || clearRedoStack && this.canRedo()) {
11128          this.docs.forEach((um) => {
11129            clearUndoStack && (this.undoStack = []);
11130            clearRedoStack && (this.redoStack = []);
11131            um.clear(clearUndoStack, clearRedoStack);
11132          });
11133          this.emit("stack-cleared", [
11134            {
11135              undoStackCleared: clearUndoStack,
11136              redoStackCleared: clearRedoStack
11137            }
11138          ]);
11139        }
11140      }
11141      /* c8 ignore next 5 */
11142      stopCapturing() {
11143        this.docs.forEach((um) => {
11144          um.stopCapturing();
11145        });
11146      }
11147      /**
11148       * Are undo steps available?
11149       *
11150       * @return {boolean} `true` if undo is possible
11151       */
11152      canUndo() {
11153        return this.undoStack.length > 0;
11154      }
11155      /**
11156       * Are redo steps available?
11157       *
11158       * @return {boolean} `true` if redo is possible
11159       */
11160      canRedo() {
11161        return this.redoStack.length > 0;
11162      }
11163      destroy() {
11164        this.docs.forEach((um) => um.destroy());
11165        super.destroy();
11166      }
11167    };
11168  
11169    // packages/sync/build-module/undo-manager.mjs
11170    function createUndoManager() {
11171      const undoMetaHandlers = /* @__PURE__ */ new Map();
11172      const yUndoManager = new YMultiDocUndoManager([], {
11173        // Throttle undo/redo captures after 500ms of inactivity.
11174        // 500 was selected from subjective local UX testing, shorter timeouts
11175        // may cause mid-word undo stack items.
11176        captureTimeout: 500,
11177        // Ensure that we only scope the undo/redo to the current editor.
11178        // The yjs document's clientID is added once it's available.
11179        trackedOrigins: /* @__PURE__ */ new Set([LOCAL_EDITOR_ORIGIN])
11180      });
11181      const getUndoStackState = () => ({
11182        hasRedo: yUndoManager.canRedo(),
11183        hasUndo: yUndoManager.canUndo()
11184      });
11185      const notifyUndoStackChange = (ydoc) => {
11186        undoMetaHandlers.get(ydoc)?.onUndoStackChange?.(getUndoStackState());
11187      };
11188      yUndoManager.on("stack-item-added", (event) => {
11189        const handlers = undoMetaHandlers.get(event.ydoc);
11190        if (!handlers) {
11191          return;
11192        }
11193        handlers.addUndoMeta(event.ydoc, event.stackItem.meta);
11194        notifyUndoStackChange(event.ydoc);
11195      });
11196      yUndoManager.on("stack-item-updated", (event) => {
11197        notifyUndoStackChange(event.ydoc);
11198      });
11199      yUndoManager.on("stack-item-popped", (event) => {
11200        const handlers = undoMetaHandlers.get(event.ydoc);
11201        if (!handlers) {
11202          return;
11203        }
11204        handlers.restoreUndoMeta(event.ydoc, event.stackItem.meta);
11205        notifyUndoStackChange(event.ydoc);
11206      });
11207      yUndoManager.on("stack-cleared", () => {
11208        undoMetaHandlers.forEach((handlers) => {
11209          handlers.onUndoStackChange?.(getUndoStackState());
11210        });
11211      });
11212      return {
11213        /**
11214         * Record changes into the history.
11215         * Since Yjs automatically tracks changes, this method translates the WordPress
11216         * HistoryRecord format into Yjs operations.
11217         *
11218         * @param _record   A record of changes to record.
11219         * @param _isStaged Whether to immediately create an undo point or not.
11220         */
11221        addRecord(_record, _isStaged = false) {
11222        },
11223        /**
11224         * Add a Yjs map to the scope of the undo manager.
11225         *
11226         * @param {Y.Map< any >} ymap                       The Yjs map to add to the scope.
11227         * @param                handlers                   Handlers for the scoped document.
11228         * @param                handlers.addUndoMeta       Handler to add metadata to undo items.
11229         * @param                handlers.onUndoStackChange Handler for undo stack changes.
11230         * @param                handlers.restoreUndoMeta   Handler to restore metadata from undo items.
11231         */
11232        addToScope(ymap, handlers) {
11233          if (ymap.doc === null) {
11234            return;
11235          }
11236          const ydoc = ymap.doc;
11237          yUndoManager.addToScope(ymap);
11238          if (!undoMetaHandlers.has(ydoc)) {
11239            ydoc.on("destroy", () => undoMetaHandlers.delete(ydoc));
11240          }
11241          undoMetaHandlers.set(ydoc, handlers);
11242        },
11243        /**
11244         * Undo the last recorded changes.
11245         *
11246         */
11247        undo() {
11248          if (!yUndoManager.canUndo()) {
11249            return;
11250          }
11251          yUndoManager.undo();
11252          return [];
11253        },
11254        /**
11255         * Redo the last undone changes.
11256         */
11257        redo() {
11258          if (!yUndoManager.canRedo()) {
11259            return;
11260          }
11261          yUndoManager.redo();
11262          return [];
11263        },
11264        /**
11265         * Check if there are changes that can be undone.
11266         *
11267         * @return {boolean} Whether there are changes to undo.
11268         */
11269        hasUndo() {
11270          return yUndoManager.canUndo();
11271        },
11272        /**
11273         * Check if there are changes that can be redone.
11274         *
11275         * @return {boolean} Whether there are changes to redo.
11276         */
11277        hasRedo() {
11278          return yUndoManager.canRedo();
11279        },
11280        /**
11281         * Stop capturing changes into the current undo item.
11282         * The next change will create a new undo item.
11283         */
11284        stopCapturing() {
11285          yUndoManager.stopCapturing();
11286        }
11287      };
11288    }
11289  
11290    // packages/sync/build-module/utils.mjs
11291    function createYjsDoc(documentMeta = {}) {
11292      const metaMap = new Map(
11293        Object.entries(documentMeta)
11294      );
11295      return new Doc({ meta: metaMap });
11296    }
11297    function initializeYjsDoc(ydoc) {
11298      const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY);
11299      stateMap.set(CRDT_STATE_MAP_VERSION_KEY, CRDT_DOC_VERSION);
11300    }
11301    function markEntityAsSaved(ydoc) {
11302      const recordMeta = ydoc.getMap(CRDT_STATE_MAP_KEY);
11303      recordMeta.set(CRDT_STATE_MAP_SAVED_AT_KEY, Date.now());
11304      recordMeta.set(CRDT_STATE_MAP_SAVED_BY_KEY, ydoc.clientID);
11305    }
11306    function pseudoRandomID() {
11307      return Math.floor(Math.random() * 1e9);
11308    }
11309    function serializeCrdtDoc(crdtDoc) {
11310      return JSON.stringify({
11311        document: toBase64(encodeStateAsUpdateV2(crdtDoc)),
11312        updateId: pseudoRandomID()
11313        // helps with debugging
11314      });
11315    }
11316    function deserializeCrdtDoc(serializedCrdtDoc) {
11317      try {
11318        const { document: document2 } = JSON.parse(serializedCrdtDoc);
11319        const docMeta = {
11320          [CRDT_DOC_META_PERSISTENCE_KEY]: true
11321        };
11322        const ydoc = createYjsDoc(docMeta);
11323        const yupdate = fromBase64(document2);
11324        applyUpdateV2(ydoc, yupdate);
11325        ydoc.clientID = pseudoRandomID();
11326        return ydoc;
11327      } catch {
11328        return null;
11329      }
11330    }
11331  
11332    // packages/sync/build-module/manager.mjs
11333    function getEntityId(objectType, objectId) {
11334      return `$objectType}_$objectId}`;
11335    }
11336    function createSyncManager(debug = false) {
11337      const debugWrap = debug ? logPerformanceTiming : passThru;
11338      const collectionStates = /* @__PURE__ */ new Map();
11339      const entityStates = /* @__PURE__ */ new Map();
11340      let undoManager;
11341      function log(component, message, entityId, context = {}) {
11342        if (!debug) {
11343          return;
11344        }
11345        console.log(`[SyncManager][$component}]: $message}`, {
11346          ...context,
11347          entityId
11348        });
11349      }
11350      async function loadEntity(syncConfig, objectType, objectId, record, handlers) {
11351        const providerCreators2 = getProviderCreators();
11352        const entityId = getEntityId(objectType, objectId);
11353        if (0 === providerCreators2.length) {
11354          log("loadEntity", "no providers, skipping", entityId);
11355          return;
11356        }
11357        if (entityStates.has(entityId)) {
11358          log("loadEntity", "already loaded", entityId);
11359          return;
11360        }
11361        if (false === syncConfig.shouldSync?.(objectType, objectId)) {
11362          log("loadEntity", "shouldSync false, skipping", entityId);
11363          return;
11364        }
11365        log("loadEntity", "loading", entityId);
11366        handlers = {
11367          addUndoMeta: debugWrap(handlers.addUndoMeta),
11368          editRecord: debugWrap(handlers.editRecord),
11369          getEditedRecord: debugWrap(handlers.getEditedRecord),
11370          onStatusChange: debugWrap(handlers.onStatusChange),
11371          persistCRDTDoc: debugWrap(handlers.persistCRDTDoc),
11372          refetchRecord: debugWrap(handlers.refetchRecord),
11373          restoreUndoMeta: debugWrap(handlers.restoreUndoMeta),
11374          onUndoStackChange: handlers.onUndoStackChange ? debugWrap(handlers.onUndoStackChange) : void 0
11375        };
11376        const ydoc = createYjsDoc({ objectType });
11377        const recordMap = ydoc.getMap(CRDT_RECORD_MAP_KEY);
11378        const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY);
11379        const now = Date.now();
11380        let hasObserversAttached = false;
11381        let isEntityUnloaded = false;
11382        const unload = () => {
11383          log("loadEntity", "unloading", entityId);
11384          isEntityUnloaded = true;
11385          providerResults?.forEach((result) => result.destroy());
11386          handlers.onStatusChange(null);
11387          if (hasObserversAttached) {
11388            recordMap.unobserveDeep(onRecordUpdate);
11389            stateMap.unobserve(onStateMapUpdate);
11390          }
11391          ydoc.destroy();
11392          entityStates.delete(entityId);
11393        };
11394        const awareness = syncConfig.createAwareness?.(ydoc, objectId);
11395        const onRecordUpdate = (_events, transaction) => {
11396          if (transaction.local && !(transaction.origin instanceof UndoManager)) {
11397            return;
11398          }
11399          void internal.updateEntityRecord(objectType, objectId);
11400        };
11401        const onStateMapUpdate = (event, transaction) => {
11402          if (transaction.local) {
11403            return;
11404          }
11405          event.keysChanged.forEach((key) => {
11406            switch (key) {
11407              case CRDT_STATE_MAP_SAVED_AT_KEY:
11408                const savedAt = stateMap.get(CRDT_STATE_MAP_SAVED_AT_KEY);
11409                if ("number" === typeof savedAt && savedAt > now) {
11410                  log("loadEntity", "refetching record", entityId);
11411                  void handlers.refetchRecord().catch(() => {
11412                  });
11413                }
11414                break;
11415            }
11416          });
11417        };
11418        if (!undoManager) {
11419          undoManager = createUndoManager();
11420        }
11421        const { addUndoMeta, onUndoStackChange, restoreUndoMeta } = handlers;
11422        undoManager.addToScope(recordMap, {
11423          addUndoMeta,
11424          restoreUndoMeta,
11425          onUndoStackChange
11426        });
11427        let providerResults;
11428        const entityState = {
11429          awareness,
11430          handlers,
11431          objectId,
11432          objectType,
11433          syncConfig,
11434          unload,
11435          ydoc
11436        };
11437        entityStates.set(entityId, entityState);
11438        log("loadEntity", "connecting", entityId);
11439        providerResults = await Promise.all(
11440          providerCreators2.map(async (create7) => {
11441            const provider = await create7({
11442              objectType,
11443              objectId,
11444              ydoc,
11445              awareness
11446            });
11447            provider.on("status", handlers.onStatusChange);
11448            return provider;
11449          })
11450        );
11451        if (isEntityUnloaded) {
11452          log("loadEntity", "unloaded during connect, aborting", entityId);
11453          providerResults.forEach((result) => result.destroy());
11454          return;
11455        }
11456        initializeYjsDoc(ydoc);
11457        internal.applyPersistedCrdtDoc(objectType, objectId, record);
11458        recordMap.observeDeep(onRecordUpdate);
11459        stateMap.observe(onStateMapUpdate);
11460        hasObserversAttached = true;
11461      }
11462      async function loadCollection(syncConfig, objectType, handlers) {
11463        const providerCreators2 = getProviderCreators();
11464        const entityId = getEntityId(objectType, null);
11465        if (0 === providerCreators2.length) {
11466          log("loadCollection", "no providers, skipping", entityId);
11467          return;
11468        }
11469        if (collectionStates.has(objectType)) {
11470          log("loadCollection", "already loaded", entityId);
11471          return;
11472        }
11473        if (false === syncConfig.shouldSync?.(objectType, null)) {
11474          log("loadCollection", "shouldSync false, skipping", entityId);
11475          return;
11476        }
11477        log("loadCollection", "loading", entityId);
11478        const ydoc = createYjsDoc({ collection: true, objectType });
11479        const stateMap = ydoc.getMap(CRDT_STATE_MAP_KEY);
11480        const now = Date.now();
11481        let hasObserversAttached = false;
11482        let isCollectionUnloaded = false;
11483        const unload = () => {
11484          log("loadCollection", "unloading", entityId);
11485          isCollectionUnloaded = true;
11486          providerResults?.forEach((result) => result.destroy());
11487          handlers.onStatusChange(null);
11488          if (hasObserversAttached) {
11489            stateMap.unobserve(onStateMapUpdate);
11490          }
11491          ydoc.destroy();
11492          collectionStates.delete(objectType);
11493        };
11494        const onStateMapUpdate = (event, transaction) => {
11495          if (transaction.local) {
11496            return;
11497          }
11498          event.keysChanged.forEach((key) => {
11499            switch (key) {
11500              case CRDT_STATE_MAP_SAVED_AT_KEY:
11501                const newValue = stateMap.get(CRDT_STATE_MAP_SAVED_AT_KEY);
11502                if ("number" === typeof newValue && newValue > now) {
11503                  void handlers.refetchRecords().catch(() => {
11504                  });
11505                }
11506                break;
11507            }
11508          });
11509        };
11510        const awareness = syncConfig.createAwareness?.(ydoc);
11511        let providerResults;
11512        const collectionState = {
11513          awareness,
11514          handlers,
11515          syncConfig,
11516          unload,
11517          ydoc
11518        };
11519        collectionStates.set(objectType, collectionState);
11520        log("loadCollection", "connecting", entityId);
11521        providerResults = await Promise.all(
11522          providerCreators2.map(async (create7) => {
11523            const provider = await create7({
11524              awareness,
11525              objectType,
11526              objectId: null,
11527              ydoc
11528            });
11529            provider.on("status", handlers.onStatusChange);
11530            return provider;
11531          })
11532        );
11533        if (isCollectionUnloaded) {
11534          log(
11535            "loadCollection",
11536            "unloaded during connect, aborting",
11537            entityId
11538          );
11539          providerResults.forEach((result) => result.destroy());
11540          return;
11541        }
11542        stateMap.observe(onStateMapUpdate);
11543        hasObserversAttached = true;
11544        initializeYjsDoc(ydoc);
11545      }
11546      function unloadEntity(objectType, objectId) {
11547        const entityId = getEntityId(objectType, objectId);
11548        log("unloadEntity", "unloading", entityId);
11549        entityStates.get(entityId)?.unload();
11550        updateCRDTDoc(objectType, null, {}, origin, {
11551          isSave: true
11552        });
11553      }
11554      function unloadAll() {
11555        log("unloadAll", "unloading all entities", "all");
11556        for (const [, entityState] of [...entityStates]) {
11557          entityState.unload();
11558        }
11559        entityStates.clear();
11560        undoManager = void 0;
11561        for (const [, collectionState] of [...collectionStates]) {
11562          collectionState.unload();
11563        }
11564        collectionStates.clear();
11565      }
11566      function getAwareness(objectType, objectId) {
11567        const entityId = getEntityId(objectType, objectId);
11568        const entityState = entityStates.get(entityId);
11569        if (!entityState || !entityState.awareness) {
11570          return void 0;
11571        }
11572        return entityState.awareness;
11573      }
11574      function _applyPersistedCrdtDoc(objectType, objectId, record) {
11575        const entityId = getEntityId(objectType, objectId);
11576        const entityState = entityStates.get(entityId);
11577        if (!entityState) {
11578          log("applyPersistedCrdtDoc", "no entity state", entityId);
11579          return;
11580        }
11581        const {
11582          handlers,
11583          syncConfig: {
11584            applyChangesToCRDTDoc,
11585            getChangesFromCRDTDoc,
11586            getPersistedCRDTDoc
11587          },
11588          ydoc: targetDoc
11589        } = entityState;
11590        const serialized = getPersistedCRDTDoc?.(record);
11591        const tempDoc = serialized ? deserializeCrdtDoc(serialized) : null;
11592        if (!tempDoc) {
11593          log("applyPersistedCrdtDoc", "no persisted doc", entityId);
11594          targetDoc.transact(() => {
11595            applyChangesToCRDTDoc(targetDoc, record);
11596            handlers.persistCRDTDoc();
11597          }, LOCAL_SYNC_MANAGER_ORIGIN);
11598          return;
11599        }
11600        const update = encodeStateAsUpdateV2(tempDoc);
11601        applyUpdateV2(targetDoc, update);
11602        const invalidations = getChangesFromCRDTDoc(tempDoc, record);
11603        const invalidatedKeys = Object.keys(invalidations);
11604        tempDoc.destroy();
11605        if (0 === invalidatedKeys.length) {
11606          log("applyPersistedCrdtDoc", "valid persisted doc", entityId);
11607          return;
11608        }
11609        log("applyPersistedCrdtDoc", "invalidated keys", entityId, {
11610          invalidatedKeys
11611        });
11612        const changes = invalidatedKeys.reduce(
11613          (acc, key) => Object.assign(acc, {
11614            [key]: record[key]
11615          }),
11616          {}
11617        );
11618        targetDoc.transact(() => {
11619          applyChangesToCRDTDoc(targetDoc, changes);
11620          handlers.persistCRDTDoc();
11621        }, LOCAL_SYNC_MANAGER_ORIGIN);
11622      }
11623      function updateCRDTDoc(objectType, objectId, changes, origin2, options = {}) {
11624        const { isSave = false, isNewUndoLevel = false } = options;
11625        const entityId = getEntityId(objectType, objectId);
11626        const entityState = entityStates.get(entityId);
11627        const collectionState = collectionStates.get(objectType);
11628        if (entityState) {
11629          const { syncConfig, ydoc } = entityState;
11630          if (isNewUndoLevel && undoManager) {
11631            undoManager.stopCapturing?.();
11632          }
11633          ydoc.transact(() => {
11634            log("updateCRDTDoc", "applying changes", entityId, {
11635              changedKeys: Object.keys(changes)
11636            });
11637            syncConfig.applyChangesToCRDTDoc(ydoc, changes);
11638            if (isSave) {
11639              markEntityAsSaved(ydoc);
11640            }
11641          }, origin2);
11642        }
11643        if (collectionState && isSave) {
11644          collectionState.ydoc.transact(() => {
11645            markEntityAsSaved(collectionState.ydoc);
11646          }, origin2);
11647        }
11648      }
11649      const deferUpdateCRDTDoc = yieldToEventLoop(updateCRDTDoc);
11650      function updateOrDefer(objectType, objectId, changes, origin2, options = {}) {
11651        const hasRemotePeers = (getAwareness(objectType, objectId)?.getStates().size ?? 0) > 1;
11652        const update = hasRemotePeers ? updateCRDTDoc : deferUpdateCRDTDoc;
11653        update(objectType, objectId, changes, origin2, options);
11654      }
11655      async function _updateEntityRecord(objectType, objectId) {
11656        const entityId = getEntityId(objectType, objectId);
11657        const entityState = entityStates.get(entityId);
11658        if (!entityState) {
11659          log("updateEntityRecord", "no entity state", entityId);
11660          return;
11661        }
11662        const { handlers, syncConfig, ydoc } = entityState;
11663        const changes = syncConfig.getChangesFromCRDTDoc(
11664          ydoc,
11665          await handlers.getEditedRecord()
11666        );
11667        const changedKeys = Object.keys(changes);
11668        if (0 === changedKeys.length) {
11669          return;
11670        }
11671        log("updateEntityRecord", "changes", entityId, {
11672          changedKeys
11673        });
11674        handlers.editRecord(changes);
11675      }
11676      async function createPersistedCRDTDoc(objectType, objectId) {
11677        const entityId = getEntityId(objectType, objectId);
11678        const entityState = entityStates.get(entityId);
11679        if (!entityState?.ydoc) {
11680          return null;
11681        }
11682        await new Promise((resolve) => setTimeout(resolve, 0));
11683        return serializeCrdtDoc(entityState.ydoc);
11684      }
11685      const internal = {
11686        applyPersistedCrdtDoc: debugWrap(_applyPersistedCrdtDoc),
11687        updateEntityRecord: debugWrap(_updateEntityRecord)
11688      };
11689      return {
11690        createPersistedCRDTDoc: debugWrap(createPersistedCRDTDoc),
11691        getAwareness,
11692        load: debugWrap(loadEntity),
11693        loadCollection: debugWrap(loadCollection),
11694        // Use getter to ensure we always return the current value of `undoManager`.
11695        get undoManager() {
11696          return undoManager;
11697        },
11698        unload: debugWrap(unloadEntity),
11699        unloadAll: debugWrap(unloadAll),
11700        update: debugWrap(updateOrDefer)
11701      };
11702    }
11703  
11704    // node_modules/diff/libesm/diff/base.js
11705    var Diff = class {
11706      diff(oldStr, newStr, options = {}) {
11707        let callback;
11708        if (typeof options === "function") {
11709          callback = options;
11710          options = {};
11711        } else if ("callback" in options) {
11712          callback = options.callback;
11713        }
11714        const oldString = this.castInput(oldStr, options);
11715        const newString = this.castInput(newStr, options);
11716        const oldTokens = this.removeEmpty(this.tokenize(oldString, options));
11717        const newTokens = this.removeEmpty(this.tokenize(newString, options));
11718        return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);
11719      }
11720      diffWithOptionsObj(oldTokens, newTokens, options, callback) {
11721        var _a;
11722        const done = (value) => {
11723          value = this.postProcess(value, options);
11724          if (callback) {
11725            setTimeout(function() {
11726              callback(value);
11727            }, 0);
11728            return void 0;
11729          } else {
11730            return value;
11731          }
11732        };
11733        const newLen = newTokens.length, oldLen = oldTokens.length;
11734        let editLength = 1;
11735        let maxEditLength = newLen + oldLen;
11736        if (options.maxEditLength != null) {
11737          maxEditLength = Math.min(maxEditLength, options.maxEditLength);
11738        }
11739        const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;
11740        const abortAfterTimestamp = Date.now() + maxExecutionTime;
11741        const bestPath = [{ oldPos: -1, lastComponent: void 0 }];
11742        let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);
11743        if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {
11744          return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));
11745        }
11746        let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;
11747        const execEditLength = () => {
11748          for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {
11749            let basePath;
11750            const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];
11751            if (removePath) {
11752              bestPath[diagonalPath - 1] = void 0;
11753            }
11754            let canAdd = false;
11755            if (addPath) {
11756              const addPathNewPos = addPath.oldPos - diagonalPath;
11757              canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;
11758            }
11759            const canRemove = removePath && removePath.oldPos + 1 < oldLen;
11760            if (!canAdd && !canRemove) {
11761              bestPath[diagonalPath] = void 0;
11762              continue;
11763            }
11764            if (!canRemove || canAdd && removePath.oldPos < addPath.oldPos) {
11765              basePath = this.addToPath(addPath, true, false, 0, options);
11766            } else {
11767              basePath = this.addToPath(removePath, false, true, 1, options);
11768            }
11769            newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);
11770            if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {
11771              return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;
11772            } else {
11773              bestPath[diagonalPath] = basePath;
11774              if (basePath.oldPos + 1 >= oldLen) {
11775                maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);
11776              }
11777              if (newPos + 1 >= newLen) {
11778                minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);
11779              }
11780            }
11781          }
11782          editLength++;
11783        };
11784        if (callback) {
11785          (function exec() {
11786            setTimeout(function() {
11787              if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {
11788                return callback(void 0);
11789              }
11790              if (!execEditLength()) {
11791                exec();
11792              }
11793            }, 0);
11794          })();
11795        } else {
11796          while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {
11797            const ret = execEditLength();
11798            if (ret) {
11799              return ret;
11800            }
11801          }
11802        }
11803      }
11804      addToPath(path, added, removed, oldPosInc, options) {
11805        const last2 = path.lastComponent;
11806        if (last2 && !options.oneChangePerToken && last2.added === added && last2.removed === removed) {
11807          return {
11808            oldPos: path.oldPos + oldPosInc,
11809            lastComponent: { count: last2.count + 1, added, removed, previousComponent: last2.previousComponent }
11810          };
11811        } else {
11812          return {
11813            oldPos: path.oldPos + oldPosInc,
11814            lastComponent: { count: 1, added, removed, previousComponent: last2 }
11815          };
11816        }
11817      }
11818      extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {
11819        const newLen = newTokens.length, oldLen = oldTokens.length;
11820        let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;
11821        while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {
11822          newPos++;
11823          oldPos++;
11824          commonCount++;
11825          if (options.oneChangePerToken) {
11826            basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };
11827          }
11828        }
11829        if (commonCount && !options.oneChangePerToken) {
11830          basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };
11831        }
11832        basePath.oldPos = oldPos;
11833        return newPos;
11834      }
11835      equals(left, right, options) {
11836        if (options.comparator) {
11837          return options.comparator(left, right);
11838        } else {
11839          return left === right || !!options.ignoreCase && left.toLowerCase() === right.toLowerCase();
11840        }
11841      }
11842      removeEmpty(array) {
11843        const ret = [];
11844        for (let i = 0; i < array.length; i++) {
11845          if (array[i]) {
11846            ret.push(array[i]);
11847          }
11848        }
11849        return ret;
11850      }
11851      // eslint-disable-next-line @typescript-eslint/no-unused-vars
11852      castInput(value, options) {
11853        return value;
11854      }
11855      // eslint-disable-next-line @typescript-eslint/no-unused-vars
11856      tokenize(value, options) {
11857        return Array.from(value);
11858      }
11859      join(chars) {
11860        return chars.join("");
11861      }
11862      postProcess(changeObjects, options) {
11863        return changeObjects;
11864      }
11865      get useLongestToken() {
11866        return false;
11867      }
11868      buildValues(lastComponent, newTokens, oldTokens) {
11869        const components = [];
11870        let nextComponent;
11871        while (lastComponent) {
11872          components.push(lastComponent);
11873          nextComponent = lastComponent.previousComponent;
11874          delete lastComponent.previousComponent;
11875          lastComponent = nextComponent;
11876        }
11877        components.reverse();
11878        const componentLen = components.length;
11879        let componentPos = 0, newPos = 0, oldPos = 0;
11880        for (; componentPos < componentLen; componentPos++) {
11881          const component = components[componentPos];
11882          if (!component.removed) {
11883            if (!component.added && this.useLongestToken) {
11884              let value = newTokens.slice(newPos, newPos + component.count);
11885              value = value.map(function(value2, i) {
11886                const oldValue = oldTokens[oldPos + i];
11887                return oldValue.length > value2.length ? oldValue : value2;
11888              });
11889              component.value = this.join(value);
11890            } else {
11891              component.value = this.join(newTokens.slice(newPos, newPos + component.count));
11892            }
11893            newPos += component.count;
11894            if (!component.added) {
11895              oldPos += component.count;
11896            }
11897          } else {
11898            component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));
11899            oldPos += component.count;
11900          }
11901        }
11902        return components;
11903      }
11904    };
11905  
11906    // node_modules/diff/libesm/diff/character.js
11907    var CharacterDiff = class extends Diff {
11908    };
11909    var characterDiff = new CharacterDiff();
11910    function diffChars(oldStr, newStr, options) {
11911      return characterDiff.diff(oldStr, newStr, options);
11912    }
11913  
11914    // node_modules/diff/libesm/diff/line.js
11915    var LineDiff = class extends Diff {
11916      constructor() {
11917        super(...arguments);
11918        this.tokenize = tokenize;
11919      }
11920      equals(left, right, options) {
11921        if (options.ignoreWhitespace) {
11922          if (!options.newlineIsToken || !left.includes("\n")) {
11923            left = left.trim();
11924          }
11925          if (!options.newlineIsToken || !right.includes("\n")) {
11926            right = right.trim();
11927          }
11928        } else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {
11929          if (left.endsWith("\n")) {
11930            left = left.slice(0, -1);
11931          }
11932          if (right.endsWith("\n")) {
11933            right = right.slice(0, -1);
11934          }
11935        }
11936        return super.equals(left, right, options);
11937      }
11938    };
11939    var lineDiff = new LineDiff();
11940    function diffLines(oldStr, newStr, options) {
11941      return lineDiff.diff(oldStr, newStr, options);
11942    }
11943    function tokenize(value, options) {
11944      if (options.stripTrailingCr) {
11945        value = value.replace(/\r\n/g, "\n");
11946      }
11947      const retLines = [], linesAndNewlines = value.split(/(\n|\r\n)/);
11948      if (!linesAndNewlines[linesAndNewlines.length - 1]) {
11949        linesAndNewlines.pop();
11950      }
11951      for (let i = 0; i < linesAndNewlines.length; i++) {
11952        const line = linesAndNewlines[i];
11953        if (i % 2 && !options.newlineIsToken) {
11954          retLines[retLines.length - 1] += line;
11955        } else {
11956          retLines.push(line);
11957        }
11958      }
11959      return retLines;
11960    }
11961  
11962    // packages/sync/build-module/quill-delta/Delta.mjs
11963    var import_es62 = __toESM(require_es6(), 1);
11964  
11965    // packages/sync/build-module/quill-delta/AttributeMap.mjs
11966    var import_es6 = __toESM(require_es6(), 1);
11967    function cloneDeep(value) {
11968      return JSON.parse(JSON.stringify(value));
11969    }
11970    var AttributeMap;
11971    ((AttributeMap2) => {
11972      function compose(a = {}, b = {}, keepNull = false) {
11973        if (typeof a !== "object") {
11974          a = {};
11975        }
11976        if (typeof b !== "object") {
11977          b = {};
11978        }
11979        let attributes = cloneDeep(b);
11980        if (!keepNull) {
11981          attributes = Object.keys(attributes).reduce(
11982            (copy2, key) => {
11983              if (attributes[key] !== null || attributes[key] !== void 0) {
11984                copy2[key] = attributes[key];
11985              }
11986              return copy2;
11987            },
11988            {}
11989          );
11990        }
11991        for (const key in a) {
11992          if (a[key] !== void 0 && b[key] === void 0) {
11993            attributes[key] = a[key];
11994          }
11995        }
11996        return Object.keys(attributes).length > 0 ? attributes : void 0;
11997      }
11998      AttributeMap2.compose = compose;
11999      function diff(a = {}, b = {}) {
12000        if (typeof a !== "object") {
12001          a = {};
12002        }
12003        if (typeof b !== "object") {
12004          b = {};
12005        }
12006        const attributes = Object.keys(a).concat(Object.keys(b)).reduce((attrs, key) => {
12007          if (!(0, import_es6.default)(a[key], b[key])) {
12008            attrs[key] = b[key] === void 0 ? null : b[key];
12009          }
12010          return attrs;
12011        }, {});
12012        return Object.keys(attributes).length > 0 ? attributes : void 0;
12013      }
12014      AttributeMap2.diff = diff;
12015      function invert(attr = {}, base = {}) {
12016        attr = attr || {};
12017        const baseInverted = Object.keys(base).reduce(
12018          (memo, key) => {
12019            if (base[key] !== attr[key] && attr[key] !== void 0) {
12020              memo[key] = base[key];
12021            }
12022            return memo;
12023          },
12024          {}
12025        );
12026        return Object.keys(attr).reduce((memo, key) => {
12027          if (attr[key] !== base[key] && base[key] === void 0) {
12028            memo[key] = null;
12029          }
12030          return memo;
12031        }, baseInverted);
12032      }
12033      AttributeMap2.invert = invert;
12034      function transform(a, b, priority = false) {
12035        if (typeof a !== "object") {
12036          return b;
12037        }
12038        if (typeof b !== "object") {
12039          return void 0;
12040        }
12041        if (!priority) {
12042          return b;
12043        }
12044        const attributes = Object.keys(b).reduce(
12045          (attrs, key) => {
12046            if (a[key] === void 0) {
12047              attrs[key] = b[key];
12048            }
12049            return attrs;
12050          },
12051          {}
12052        );
12053        return Object.keys(attributes).length > 0 ? attributes : void 0;
12054      }
12055      AttributeMap2.transform = transform;
12056    })(AttributeMap || (AttributeMap = {}));
12057    var AttributeMap_default = AttributeMap;
12058  
12059    // packages/sync/build-module/quill-delta/Op.mjs
12060    var Op;
12061    ((Op2) => {
12062      function length2(op) {
12063        if (typeof op.delete === "number") {
12064          return op.delete;
12065        } else if (typeof op.retain === "number") {
12066          return op.retain;
12067        } else if (typeof op.retain === "object" && op.retain !== null) {
12068          return 1;
12069        }
12070        return typeof op.insert === "string" ? op.insert.length : 1;
12071      }
12072      Op2.length = length2;
12073    })(Op || (Op = {}));
12074    var Op_default = Op;
12075  
12076    // packages/sync/build-module/quill-delta/OpIterator.mjs
12077    var Iterator = class {
12078      ops;
12079      index;
12080      offset;
12081      constructor(ops) {
12082        this.ops = ops;
12083        this.index = 0;
12084        this.offset = 0;
12085      }
12086      hasNext() {
12087        return this.peekLength() < Infinity;
12088      }
12089      next(length2) {
12090        if (!length2) {
12091          length2 = Infinity;
12092        }
12093        const nextOp = this.ops[this.index];
12094        if (nextOp) {
12095          const offset = this.offset;
12096          const opLength = Op_default.length(nextOp);
12097          if (length2 >= opLength - offset) {
12098            length2 = opLength - offset;
12099            this.index += 1;
12100            this.offset = 0;
12101          } else {
12102            this.offset += length2;
12103          }
12104          if (typeof nextOp.delete === "number") {
12105            return { delete: length2 };
12106          }
12107          const retOp = {};
12108          if (nextOp.attributes) {
12109            retOp.attributes = nextOp.attributes;
12110          }
12111          if (typeof nextOp.retain === "number") {
12112            retOp.retain = length2;
12113          } else if (typeof nextOp.retain === "object" && nextOp.retain !== null) {
12114            retOp.retain = nextOp.retain;
12115          } else if (typeof nextOp.insert === "string") {
12116            retOp.insert = nextOp.insert.substr(offset, length2);
12117          } else {
12118            retOp.insert = nextOp.insert;
12119          }
12120          return retOp;
12121        }
12122        return { retain: Infinity };
12123      }
12124      peek() {
12125        return this.ops[this.index];
12126      }
12127      peekLength() {
12128        if (this.ops[this.index]) {
12129          return Op_default.length(this.ops[this.index]) - this.offset;
12130        }
12131        return Infinity;
12132      }
12133      peekType() {
12134        const op = this.ops[this.index];
12135        if (op) {
12136          if (typeof op.delete === "number") {
12137            return "delete";
12138          } else if (typeof op.retain === "number" || typeof op.retain === "object" && op.retain !== null) {
12139            return "retain";
12140          }
12141          return "insert";
12142        }
12143        return "retain";
12144      }
12145      rest() {
12146        if (!this.hasNext()) {
12147          return [];
12148        } else if (this.offset === 0) {
12149          return this.ops.slice(this.index);
12150        }
12151        const offset = this.offset;
12152        const index = this.index;
12153        const next = this.next();
12154        const rest = this.ops.slice(this.index);
12155        this.offset = offset;
12156        this.index = index;
12157        return [next].concat(rest);
12158      }
12159    };
12160  
12161    // packages/sync/build-module/quill-delta/Delta.mjs
12162    function cloneDeep2(value) {
12163      return JSON.parse(JSON.stringify(value));
12164    }
12165    var NULL_CHARACTER = String.fromCharCode(0);
12166    var STRING_TOO_LARGE_THRESHOLD = 1e4;
12167    function normalizeChangeCounts(changes) {
12168      return changes.map((change) => ({
12169        ...change,
12170        count: change.value.length
12171      }));
12172    }
12173    var getEmbedTypeAndData = (a, b) => {
12174      if (typeof a !== "object" || a === null) {
12175        throw new Error(`cannot retain a $typeof a}`);
12176      }
12177      if (typeof b !== "object" || b === null) {
12178        throw new Error(`cannot retain a $typeof b}`);
12179      }
12180      const embedType = Object.keys(a)[0];
12181      if (!embedType || embedType !== Object.keys(b)[0]) {
12182        throw new Error(
12183          `embed types not matched: $embedType} != $Object.keys(b)[0]}`
12184        );
12185      }
12186      return [embedType, a[embedType], b[embedType]];
12187    };
12188    var Delta = class _Delta {
12189      static Op = Op_default;
12190      static OpIterator = Iterator;
12191      static AttributeMap = AttributeMap_default;
12192      static handlers = {};
12193      static registerEmbed(embedType, handler) {
12194        this.handlers[embedType] = handler;
12195      }
12196      static unregisterEmbed(embedType) {
12197        delete this.handlers[embedType];
12198      }
12199      static getHandler(embedType) {
12200        const handler = this.handlers[embedType];
12201        if (!handler) {
12202          throw new Error(`no handlers for embed type "$embedType}"`);
12203        }
12204        return handler;
12205      }
12206      ops;
12207      constructor(ops) {
12208        if (Array.isArray(ops)) {
12209          this.ops = ops;
12210        } else if (ops !== null && ops !== void 0 && Array.isArray(ops.ops)) {
12211          this.ops = ops.ops;
12212        } else {
12213          this.ops = [];
12214        }
12215      }
12216      insert(arg, attributes) {
12217        const newOp = {};
12218        if (typeof arg === "string" && arg.length === 0) {
12219          return this;
12220        }
12221        newOp.insert = arg;
12222        if (attributes !== null && attributes !== void 0 && typeof attributes === "object" && Object.keys(attributes).length > 0) {
12223          newOp.attributes = attributes;
12224        }
12225        return this.push(newOp);
12226      }
12227      delete(length2) {
12228        if (length2 <= 0) {
12229          return this;
12230        }
12231        return this.push({ delete: length2 });
12232      }
12233      retain(length2, attributes) {
12234        if (typeof length2 === "number" && length2 <= 0) {
12235          return this;
12236        }
12237        const newOp = { retain: length2 };
12238        if (attributes !== null && attributes !== void 0 && typeof attributes === "object" && Object.keys(attributes).length > 0) {
12239          newOp.attributes = attributes;
12240        }
12241        return this.push(newOp);
12242      }
12243      push(newOp) {
12244        let index = this.ops.length;
12245        let lastOp = this.ops[index - 1];
12246        newOp = cloneDeep2(newOp);
12247        if (typeof lastOp === "object") {
12248          if (typeof newOp.delete === "number" && typeof lastOp.delete === "number") {
12249            this.ops[index - 1] = {
12250              delete: lastOp.delete + newOp.delete
12251            };
12252            return this;
12253          }
12254          if (typeof lastOp.delete === "number" && newOp.insert !== null && newOp.insert !== void 0) {
12255            index -= 1;
12256            lastOp = this.ops[index - 1];
12257            if (typeof lastOp !== "object") {
12258              this.ops.unshift(newOp);
12259              return this;
12260            }
12261          }
12262          if ((0, import_es62.default)(newOp.attributes, lastOp.attributes)) {
12263            if (typeof newOp.insert === "string" && typeof lastOp.insert === "string") {
12264              this.ops[index - 1] = {
12265                insert: lastOp.insert + newOp.insert
12266              };
12267              if (typeof newOp.attributes === "object") {
12268                this.ops[index - 1].attributes = newOp.attributes;
12269              }
12270              return this;
12271            } else if (typeof newOp.retain === "number" && typeof lastOp.retain === "number") {
12272              this.ops[index - 1] = {
12273                retain: lastOp.retain + newOp.retain
12274              };
12275              if (typeof newOp.attributes === "object") {
12276                this.ops[index - 1].attributes = newOp.attributes;
12277              }
12278              return this;
12279            }
12280          }
12281        }
12282        if (index === this.ops.length) {
12283          this.ops.push(newOp);
12284        } else {
12285          this.ops.splice(index, 0, newOp);
12286        }
12287        return this;
12288      }
12289      chop() {
12290        const lastOp = this.ops[this.ops.length - 1];
12291        if (lastOp && typeof lastOp.retain === "number" && !lastOp.attributes) {
12292          this.ops.pop();
12293        }
12294        return this;
12295      }
12296      filter(predicate) {
12297        return this.ops.filter(predicate);
12298      }
12299      forEach(predicate) {
12300        this.ops.forEach(predicate);
12301      }
12302      map(predicate) {
12303        return this.ops.map(predicate);
12304      }
12305      partition(predicate) {
12306        const passed = [];
12307        const failed = [];
12308        this.forEach((op) => {
12309          const target = predicate(op) ? passed : failed;
12310          target.push(op);
12311        });
12312        return [passed, failed];
12313      }
12314      reduce(predicate, initialValue) {
12315        return this.ops.reduce(predicate, initialValue);
12316      }
12317      changeLength() {
12318        return this.reduce((length2, elem) => {
12319          if (elem.insert) {
12320            return length2 + Op_default.length(elem);
12321          } else if (elem.delete) {
12322            return length2 - elem.delete;
12323          }
12324          return length2;
12325        }, 0);
12326      }
12327      length() {
12328        return this.reduce((length2, elem) => {
12329          return length2 + Op_default.length(elem);
12330        }, 0);
12331      }
12332      slice(start = 0, end = Infinity) {
12333        const ops = [];
12334        const iter = new Iterator(this.ops);
12335        let index = 0;
12336        while (index < end && iter.hasNext()) {
12337          let nextOp;
12338          if (index < start) {
12339            nextOp = iter.next(start - index);
12340          } else {
12341            nextOp = iter.next(end - index);
12342            ops.push(nextOp);
12343          }
12344          index += Op_default.length(nextOp);
12345        }
12346        return new _Delta(ops);
12347      }
12348      compose(other) {
12349        const thisIter = new Iterator(this.ops);
12350        const otherIter = new Iterator(other.ops);
12351        const ops = [];
12352        const firstOther = otherIter.peek();
12353        if (firstOther !== null && firstOther !== void 0 && typeof firstOther.retain === "number" && (firstOther.attributes === null || firstOther.attributes === void 0)) {
12354          let firstLeft = firstOther.retain;
12355          while (thisIter.peekType() === "insert" && thisIter.peekLength() <= firstLeft) {
12356            firstLeft -= thisIter.peekLength();
12357            ops.push(thisIter.next());
12358          }
12359          if (firstOther.retain - firstLeft > 0) {
12360            otherIter.next(firstOther.retain - firstLeft);
12361          }
12362        }
12363        const delta = new _Delta(ops);
12364        while (thisIter.hasNext() || otherIter.hasNext()) {
12365          if (otherIter.peekType() === "insert") {
12366            delta.push(otherIter.next());
12367          } else if (thisIter.peekType() === "delete") {
12368            delta.push(thisIter.next());
12369          } else {
12370            const length2 = Math.min(
12371              thisIter.peekLength(),
12372              otherIter.peekLength()
12373            );
12374            const thisOp = thisIter.next(length2);
12375            const otherOp = otherIter.next(length2);
12376            if (otherOp.retain) {
12377              const newOp = {};
12378              if (typeof thisOp.retain === "number") {
12379                newOp.retain = typeof otherOp.retain === "number" ? length2 : otherOp.retain;
12380              } else if (typeof otherOp.retain === "number") {
12381                if (thisOp.retain === null || thisOp.retain === void 0) {
12382                  newOp.insert = thisOp.insert;
12383                } else {
12384                  newOp.retain = thisOp.retain;
12385                }
12386              } else {
12387                const action = thisOp.retain === null || thisOp.retain === void 0 ? "insert" : "retain";
12388                const [embedType, thisData, otherData] = getEmbedTypeAndData(
12389                  thisOp[action],
12390                  otherOp.retain
12391                );
12392                const handler = _Delta.getHandler(embedType);
12393                newOp[action] = {
12394                  [embedType]: handler.compose(
12395                    thisData,
12396                    otherData,
12397                    action === "retain"
12398                  )
12399                };
12400              }
12401              const attributes = AttributeMap_default.compose(
12402                thisOp.attributes,
12403                otherOp.attributes,
12404                typeof thisOp.retain === "number"
12405              );
12406              if (attributes) {
12407                newOp.attributes = attributes;
12408              }
12409              delta.push(newOp);
12410              if (!otherIter.hasNext() && (0, import_es62.default)(delta.ops[delta.ops.length - 1], newOp)) {
12411                const rest = new _Delta(thisIter.rest());
12412                return delta.concat(rest).chop();
12413              }
12414            } else if (typeof otherOp.delete === "number" && (typeof thisOp.retain === "number" || typeof thisOp.retain === "object" && thisOp.retain !== null)) {
12415              delta.push(otherOp);
12416            }
12417          }
12418        }
12419        return delta.chop();
12420      }
12421      concat(other) {
12422        const delta = new _Delta(this.ops.slice());
12423        if (other.ops.length > 0) {
12424          delta.push(other.ops[0]);
12425          delta.ops = delta.ops.concat(other.ops.slice(1));
12426        }
12427        return delta;
12428      }
12429      diff(other) {
12430        if (this.ops === other.ops) {
12431          return new _Delta();
12432        }
12433        const strings = this.deltasToStrings(other);
12434        const diffResult = normalizeChangeCounts(
12435          diffChars(strings[0], strings[1])
12436        );
12437        const thisIter = new Iterator(this.ops);
12438        const otherIter = new Iterator(other.ops);
12439        const retDelta = this.convertChangesToDelta(
12440          diffResult,
12441          thisIter,
12442          otherIter
12443        );
12444        return retDelta.chop();
12445      }
12446      eachLine(predicate, newline = "\n") {
12447        const iter = new Iterator(this.ops);
12448        let line = new _Delta();
12449        let i = 0;
12450        while (iter.hasNext()) {
12451          if (iter.peekType() !== "insert") {
12452            return;
12453          }
12454          const thisOp = iter.peek();
12455          const start = Op_default.length(thisOp) - iter.peekLength();
12456          const index = typeof thisOp.insert === "string" ? thisOp.insert.indexOf(newline, start) - start : -1;
12457          if (index < 0) {
12458            line.push(iter.next());
12459          } else if (index > 0) {
12460            line.push(iter.next(index));
12461          } else {
12462            if (predicate(line, iter.next(1).attributes || {}, i) === false) {
12463              return;
12464            }
12465            i += 1;
12466            line = new _Delta();
12467          }
12468        }
12469        if (line.length() > 0) {
12470          predicate(line, {}, i);
12471        }
12472      }
12473      invert(base) {
12474        const inverted = new _Delta();
12475        this.reduce((baseIndex, op) => {
12476          if (op.insert) {
12477            inverted.delete(Op_default.length(op));
12478          } else if (typeof op.retain === "number" && (op.attributes === null || op.attributes === void 0)) {
12479            inverted.retain(op.retain);
12480            return baseIndex + op.retain;
12481          } else if (op.delete || typeof op.retain === "number") {
12482            const length2 = op.delete || op.retain;
12483            const slice = base.slice(baseIndex, baseIndex + length2);
12484            slice.forEach((baseOp) => {
12485              if (op.delete) {
12486                inverted.push(baseOp);
12487              } else if (op.retain && op.attributes) {
12488                inverted.retain(
12489                  Op_default.length(baseOp),
12490                  AttributeMap_default.invert(
12491                    op.attributes,
12492                    baseOp.attributes
12493                  )
12494                );
12495              }
12496            });
12497            return baseIndex + length2;
12498          } else if (typeof op.retain === "object" && op.retain !== null) {
12499            const slice = base.slice(baseIndex, baseIndex + 1);
12500            const baseOp = new Iterator(slice.ops).next();
12501            const [embedType, opData, baseOpData] = getEmbedTypeAndData(
12502              op.retain,
12503              baseOp.insert
12504            );
12505            const handler = _Delta.getHandler(embedType);
12506            inverted.retain(
12507              { [embedType]: handler.invert(opData, baseOpData) },
12508              AttributeMap_default.invert(op.attributes, baseOp.attributes)
12509            );
12510            return baseIndex + 1;
12511          }
12512          return baseIndex;
12513        }, 0);
12514        return inverted.chop();
12515      }
12516      transform(arg, priority = false) {
12517        priority = !!priority;
12518        if (typeof arg === "number") {
12519          return this.transformPosition(arg, priority);
12520        }
12521        const other = arg;
12522        const thisIter = new Iterator(this.ops);
12523        const otherIter = new Iterator(other.ops);
12524        const delta = new _Delta();
12525        while (thisIter.hasNext() || otherIter.hasNext()) {
12526          if (thisIter.peekType() === "insert" && (priority || otherIter.peekType() !== "insert")) {
12527            delta.retain(Op_default.length(thisIter.next()));
12528          } else if (otherIter.peekType() === "insert") {
12529            delta.push(otherIter.next());
12530          } else {
12531            const length2 = Math.min(
12532              thisIter.peekLength(),
12533              otherIter.peekLength()
12534            );
12535            const thisOp = thisIter.next(length2);
12536            const otherOp = otherIter.next(length2);
12537            if (thisOp.delete) {
12538              continue;
12539            } else if (otherOp.delete) {
12540              delta.push(otherOp);
12541            } else {
12542              const thisData = thisOp.retain;
12543              const otherData = otherOp.retain;
12544              let transformedData = typeof otherData === "object" && otherData !== null ? otherData : length2;
12545              if (typeof thisData === "object" && thisData !== null && typeof otherData === "object" && otherData !== null) {
12546                const embedType = Object.keys(thisData)[0];
12547                if (embedType === Object.keys(otherData)[0]) {
12548                  const handler = _Delta.getHandler(embedType);
12549                  if (handler) {
12550                    transformedData = {
12551                      [embedType]: handler.transform(
12552                        thisData[embedType],
12553                        otherData[embedType],
12554                        priority
12555                      )
12556                    };
12557                  }
12558                }
12559              }
12560              delta.retain(
12561                transformedData,
12562                AttributeMap_default.transform(
12563                  thisOp.attributes,
12564                  otherOp.attributes,
12565                  priority
12566                )
12567              );
12568            }
12569          }
12570        }
12571        return delta.chop();
12572      }
12573      transformPosition(index, priority = false) {
12574        priority = !!priority;
12575        const thisIter = new Iterator(this.ops);
12576        let offset = 0;
12577        while (thisIter.hasNext() && offset <= index) {
12578          const length2 = thisIter.peekLength();
12579          const nextType = thisIter.peekType();
12580          thisIter.next();
12581          if (nextType === "delete") {
12582            index -= Math.min(length2, index - offset);
12583            continue;
12584          } else if (nextType === "insert" && (offset < index || !priority)) {
12585            index += length2;
12586          }
12587          offset += length2;
12588        }
12589        return index;
12590      }
12591      /**
12592       * Given a Delta and a cursor position, do a diff and attempt to adjust
12593       * the diff to place insertions or deletions at the cursor position.
12594       *
12595       * @todo There are at least a few known cases where this produces a corrupted
12596       *       diff. When this is fixed, it should not be necessary to verify that the
12597       *       transformed diff applies cleanly.
12598       *
12599       * @see import("@wordpress/core-data/src/utils/crdt-blocks").mergeRichTextUpdate()
12600       *
12601       * @param other             - The other Delta to diff against.
12602       * @param cursorAfterChange - The cursor position index after the change.
12603       * @return A Delta that attempts to place insertions or deletions at the cursor position.
12604       */
12605      diffWithCursor(other, cursorAfterChange) {
12606        if (this.ops === other.ops) {
12607          return new _Delta();
12608        }
12609        const strings = this.deltasToStrings(other);
12610        const maxStringLength = Math.max(
12611          ...strings.map((str) => str.length)
12612        );
12613        if (maxStringLength > STRING_TOO_LARGE_THRESHOLD) {
12614          const diffResult = normalizeChangeCounts(
12615            diffLines(strings[0], strings[1])
12616          );
12617          const thisIterLarge = new Iterator(this.ops);
12618          const otherIterLarge = new Iterator(other.ops);
12619          return this.convertChangesToDelta(
12620            diffResult,
12621            thisIterLarge,
12622            otherIterLarge
12623          ).chop();
12624        } else if (cursorAfterChange === null) {
12625          return this.diff(other);
12626        }
12627        let diffs = normalizeChangeCounts(
12628          diffChars(strings[0], strings[1])
12629        );
12630        let lastDiffPosition = 0;
12631        const adjustedDiffs = [];
12632        for (let i = 0; i < diffs.length; i++) {
12633          const diff = diffs[i];
12634          const segmentStart = lastDiffPosition;
12635          const segmentEnd = lastDiffPosition + (diff.count ?? 0);
12636          const isCursorInSegment = cursorAfterChange > segmentStart && cursorAfterChange <= segmentEnd;
12637          const isUnchangedSegment = !diff.added && !diff.removed;
12638          const isRemovalSegment = diff.removed && !diff.added;
12639          const nextDiff = diffs[i + 1];
12640          const isNextDiffAnInsert = nextDiff && nextDiff.added && !nextDiff.removed;
12641          if (isUnchangedSegment && isCursorInSegment && isNextDiffAnInsert) {
12642            const movedSegments = this.tryMoveInsertionToCursor(
12643              diff,
12644              nextDiff,
12645              cursorAfterChange,
12646              segmentStart
12647            );
12648            if (movedSegments) {
12649              adjustedDiffs.push(...movedSegments);
12650              i++;
12651              lastDiffPosition = segmentEnd;
12652              continue;
12653            }
12654          }
12655          if (isRemovalSegment) {
12656            const movedSegments = this.tryMoveDeletionToCursor(
12657              diff,
12658              adjustedDiffs,
12659              cursorAfterChange,
12660              lastDiffPosition
12661            );
12662            if (movedSegments) {
12663              adjustedDiffs.pop();
12664              adjustedDiffs.push(...movedSegments);
12665              lastDiffPosition += diff.count ?? 0;
12666              continue;
12667            }
12668          }
12669          adjustedDiffs.push(diff);
12670          if (!diff.added) {
12671            lastDiffPosition += diff.count ?? 0;
12672          }
12673        }
12674        diffs = adjustedDiffs;
12675        const thisIter = new Iterator(this.ops);
12676        const otherIter = new Iterator(other.ops);
12677        const retDelta = this.convertChangesToDelta(
12678          diffs,
12679          thisIter,
12680          otherIter
12681        );
12682        return retDelta.chop();
12683      }
12684      /**
12685       * Try to move an insertion operation from after an unchanged segment to the cursor position within it.
12686       * This is a "look-ahead" strategy.
12687       *
12688       * @param diff              - The current unchanged diff segment.
12689       * @param nextDiff          - The next diff segment (expected to be an insertion).
12690       * @param cursorAfterChange - The cursor position after the change.
12691       * @param segmentStart      - The start position of the current segment.
12692       * @return An array of adjusted diff segments if the insertion was successfully moved, null otherwise.
12693       */
12694      tryMoveInsertionToCursor(diff, nextDiff, cursorAfterChange, segmentStart) {
12695        const nextDiffInsert = nextDiff.value;
12696        const insertLength = nextDiffInsert.length;
12697        const insertOffset = cursorAfterChange - segmentStart - insertLength;
12698        const textAtCursor = diff.value.substring(
12699          insertOffset,
12700          insertOffset + nextDiffInsert.length
12701        );
12702        const isInsertMoveable = textAtCursor === nextDiffInsert;
12703        if (!isInsertMoveable) {
12704          return null;
12705        }
12706        const beforeCursor = diff.value.substring(0, insertOffset);
12707        const afterCursor = diff.value.substring(insertOffset);
12708        const result = [];
12709        if (beforeCursor.length > 0) {
12710          result.push({
12711            value: beforeCursor,
12712            count: beforeCursor.length,
12713            added: false,
12714            removed: false
12715          });
12716        }
12717        result.push(nextDiff);
12718        if (afterCursor.length > 0) {
12719          result.push({
12720            value: afterCursor,
12721            count: afterCursor.length,
12722            added: false,
12723            removed: false
12724          });
12725        }
12726        return result;
12727      }
12728      /**
12729       * Try to move a deletion operation to the cursor position by looking back at the previous unchanged segment.
12730       * This is a "look-back" strategy.
12731       *
12732       * @param diff              - The current deletion diff segment.
12733       * @param adjustedDiffs     - The array of previously processed diff segments.
12734       * @param cursorAfterChange - The cursor position after the change.
12735       * @param lastDiffPosition  - The position in the document up to (but not including) the current diff.
12736       * @return An array of adjusted diff segments if the deletion was successfully moved, null otherwise.
12737       */
12738      tryMoveDeletionToCursor(diff, adjustedDiffs, cursorAfterChange, lastDiffPosition) {
12739        const prevDiff = adjustedDiffs[adjustedDiffs.length - 1];
12740        if (!prevDiff || prevDiff.added || prevDiff.removed) {
12741          return null;
12742        }
12743        const prevSegmentStart = lastDiffPosition - (prevDiff.count ?? 0);
12744        const prevSegmentEnd = lastDiffPosition;
12745        if (cursorAfterChange < prevSegmentStart || cursorAfterChange >= prevSegmentEnd) {
12746          return null;
12747        }
12748        const deletedChars = diff.value;
12749        const deleteOffset = cursorAfterChange - prevSegmentStart;
12750        const textAtCursor = prevDiff.value.substring(
12751          deleteOffset,
12752          deleteOffset + deletedChars.length
12753        );
12754        const canBePlacedHere = textAtCursor === deletedChars;
12755        if (!canBePlacedHere) {
12756          return null;
12757        }
12758        const beforeCursor = prevDiff.value.substring(0, deleteOffset);
12759        const atAndAfterCursor = prevDiff.value.substring(deleteOffset);
12760        const deletionLength = diff.count ?? 0;
12761        const afterDeletion = atAndAfterCursor.substring(deletionLength);
12762        const result = [];
12763        if (beforeCursor.length > 0) {
12764          result.push({
12765            value: beforeCursor,
12766            count: beforeCursor.length,
12767            added: false,
12768            removed: false
12769          });
12770        }
12771        result.push(diff);
12772        if (afterDeletion.length > 0) {
12773          result.push({
12774            value: afterDeletion,
12775            count: afterDeletion.length,
12776            added: false,
12777            removed: false
12778          });
12779        }
12780        return result;
12781      }
12782      /**
12783       * Convert two Deltas to string representations for diffing.
12784       *
12785       * @param other - The other Delta to convert.
12786       * @return A tuple of [thisString, otherString].
12787       */
12788      deltasToStrings(other) {
12789        return [this, other].map((delta) => {
12790          return delta.map((op) => {
12791            if (op.insert !== null || op.insert !== void 0) {
12792              return typeof op.insert === "string" ? op.insert : NULL_CHARACTER;
12793            }
12794            const prep = delta === other ? "on" : "with";
12795            throw new Error(
12796              "diff() called " + prep + " non-document"
12797            );
12798          }).join("");
12799        });
12800      }
12801      /**
12802       * Process diff changes and convert them to Delta operations.
12803       *
12804       * @param changes   - The array of changes from the diff algorithm.
12805       * @param thisIter  - Iterator for this Delta's operations.
12806       * @param otherIter - Iterator for the other Delta's operations.
12807       * @return A Delta containing the processed diff operations.
12808       */
12809      convertChangesToDelta(changes, thisIter, otherIter) {
12810        const retDelta = new _Delta();
12811        changes.forEach((component) => {
12812          let length2 = component.count ?? 0;
12813          while (length2 > 0) {
12814            let opLength = 0;
12815            if (component.added) {
12816              opLength = Math.min(otherIter.peekLength(), length2);
12817              retDelta.push(otherIter.next(opLength));
12818            } else if (component.removed) {
12819              opLength = Math.min(length2, thisIter.peekLength());
12820              thisIter.next(opLength);
12821              retDelta.delete(opLength);
12822            } else {
12823              opLength = Math.min(
12824                thisIter.peekLength(),
12825                otherIter.peekLength(),
12826                length2
12827              );
12828              const thisOp = thisIter.next(opLength);
12829              const otherOp = otherIter.next(opLength);
12830              if ((0, import_es62.default)(thisOp.insert, otherOp.insert)) {
12831                retDelta.retain(
12832                  opLength,
12833                  AttributeMap_default.diff(
12834                    thisOp.attributes,
12835                    otherOp.attributes
12836                  )
12837                );
12838              } else {
12839                retDelta.push(otherOp).delete(opLength);
12840              }
12841            }
12842            length2 -= opLength;
12843          }
12844        });
12845        return retDelta;
12846      }
12847    };
12848    var Delta_default = Delta;
12849  
12850    // packages/sync/build-module/private-apis.mjs
12851    var privateApis = {};
12852    lock(privateApis, {
12853      ConnectionErrorCode,
12854      createSyncManager,
12855      Delta: Delta_default,
12856      CRDT_DOC_META_PERSISTENCE_KEY,
12857      CRDT_RECORD_MAP_KEY,
12858      LOCAL_EDITOR_ORIGIN,
12859      LOCAL_UNDO_IGNORED_ORIGIN,
12860      retrySyncConnection: () => pollingManager.retryNow()
12861    });
12862  
12863    // packages/sync/build-module/index.mjs
12864    var YJS_VERSION = "13";
12865    return __toCommonJS(index_exports);
12866  })();


Generated : Fri Jul 24 08:20:19 2026 Cross-referenced by PHPXref