{"version":3,"file":"utils.cjs","sources":["../src/utils.js"],"sourcesContent":["import * as Y from 'yjs'\nimport * as syncProtocol from '@y/protocols/sync'\nimport * as awarenessProtocol from '@y/protocols/awareness'\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as map from 'lib0/map'\n\nimport * as eventloop from 'lib0/eventloop'\n\nimport { callbackHandler, isCallbackSet } from './callback.js'\n\nconst CALLBACK_DEBOUNCE_WAIT = parseInt(process.env.CALLBACK_DEBOUNCE_WAIT || '2000')\nconst CALLBACK_DEBOUNCE_MAXWAIT = parseInt(process.env.CALLBACK_DEBOUNCE_MAXWAIT || '10000')\n\nconst debouncer = eventloop.createDebouncer(CALLBACK_DEBOUNCE_WAIT, CALLBACK_DEBOUNCE_MAXWAIT)\n\nconst wsReadyStateConnecting = 0\nconst wsReadyStateOpen = 1\nconst wsReadyStateClosing = 2 // eslint-disable-line\nconst wsReadyStateClosed = 3 // eslint-disable-line\n\n// disable gc when using snapshots!\nconst gcEnabled = process.env.GC !== 'false' && process.env.GC !== '0'\n// const persistenceDir = process.env.YPERSISTENCE\n/**\n * @type {{bindState: function(string,WSSharedDoc):void, writeState:function(string,WSSharedDoc):Promise<any>, provider: any}|null}\n */\nlet persistence = null\n\n/**\n * @param {{bindState: function(string,WSSharedDoc):void,\n * writeState:function(string,WSSharedDoc):Promise<any>,provider:any}|null} persistence_\n */\nexport const setPersistence = persistence_ => {\n  persistence = persistence_\n}\n\n/**\n * @return {null|{bindState: function(string,WSSharedDoc):void,\n  * writeState:function(string,WSSharedDoc):Promise<any>}|null} used persistence layer\n  */\nexport const getPersistence = () => persistence\n\n/**\n * @type {Map<string,WSSharedDoc>}\n */\nexport const docs = new Map()\n\nconst messageSync = 0\nconst messageAwareness = 1\n// const messageAuth = 2\n\n/**\n * @param {Uint8Array} update\n * @param {any} _origin\n * @param {WSSharedDoc} doc\n * @param {any} _tr\n */\nconst updateHandler = (update, _origin, doc, _tr) => {\n  const encoder = encoding.createEncoder()\n  encoding.writeVarUint(encoder, messageSync)\n  syncProtocol.writeUpdate(encoder, update)\n  const message = encoding.toUint8Array(encoder)\n  doc.conns.forEach((_, conn) => send(doc, conn, message))\n}\n\n/**\n * @type {(ydoc: Y.Doc) => Promise<void>}\n */\nlet contentInitializor = _ydoc => Promise.resolve()\n\n/**\n * This function is called once every time a Yjs document is created. You can\n * use it to pull data from an external source or initialize content.\n *\n * @param {(ydoc: Y.Doc) => Promise<void>} f\n */\nexport const setContentInitializor = (f) => {\n  contentInitializor = f\n}\n\nexport class WSSharedDoc extends Y.Doc {\n  /**\n   * @param {string} name\n   */\n  constructor (name) {\n    super({ gc: gcEnabled })\n    this.name = name\n    /**\n     * Maps from conn to set of controlled user ids. Delete all user ids from awareness when this conn is closed\n     * @type {Map<Object, Set<number>>}\n     */\n    this.conns = new Map()\n    /**\n     * @type {awarenessProtocol.Awareness}\n     */\n    this.awareness = new awarenessProtocol.Awareness(this)\n    this.awareness.setLocalState(null)\n    /**\n     * @param {{ added: Array<number>, updated: Array<number>, removed: Array<number> }} changes\n     * @param {Object | null} conn Origin is the connection that made the change\n     */\n    const awarenessChangeHandler = ({ added, updated, removed }, conn) => {\n      const changedClients = added.concat(updated, removed)\n      if (conn !== null) {\n        const connControlledIDs = /** @type {Set<number>} */ (this.conns.get(conn))\n        if (connControlledIDs !== undefined) {\n          added.forEach(clientID => { connControlledIDs.add(clientID) })\n          removed.forEach(clientID => { connControlledIDs.delete(clientID) })\n        }\n      }\n      // broadcast awareness update\n      const encoder = encoding.createEncoder()\n      encoding.writeVarUint(encoder, messageAwareness)\n      encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClients))\n      const buff = encoding.toUint8Array(encoder)\n      this.conns.forEach((_, c) => {\n        send(this, c, buff)\n      })\n    }\n    this.awareness.on('update', awarenessChangeHandler)\n    this.on('update', /** @type {any} */ (updateHandler))\n    if (isCallbackSet) {\n      this.on('update', (_update, _origin, doc) => {\n        debouncer(() => callbackHandler(/** @type {WSSharedDoc} */ (doc)))\n      })\n    }\n    this.whenInitialized = contentInitializor(this)\n  }\n}\n\n/**\n * Gets a Y.Doc by name, whether in memory or on disk\n *\n * @param {string} docname - the name of the Y.Doc to find or create\n * @param {boolean} gc - whether to allow gc on the doc (applies only when created)\n * @return {WSSharedDoc}\n */\nexport const getYDoc = (docname, gc = true) => map.setIfUndefined(docs, docname, () => {\n  const doc = new WSSharedDoc(docname)\n  doc.gc = gc\n  if (persistence !== null) {\n    persistence.bindState(docname, doc)\n  }\n  docs.set(docname, doc)\n  return doc\n})\n\n/**\n * @param {any} conn\n * @param {WSSharedDoc} doc\n * @param {Uint8Array} message\n */\nconst messageListener = (conn, doc, message) => {\n  try {\n    const encoder = encoding.createEncoder()\n    const decoder = decoding.createDecoder(message)\n    const messageType = decoding.readVarUint(decoder)\n    switch (messageType) {\n      case messageSync:\n        encoding.writeVarUint(encoder, messageSync)\n        syncProtocol.readSyncMessage(decoder, encoder, doc, conn)\n\n        // If the `encoder` only contains the type of reply message and no\n        // message, there is no need to send the message. When `encoder` only\n        // contains the type of reply, its length is 1.\n        if (encoding.length(encoder) > 1) {\n          send(doc, conn, encoding.toUint8Array(encoder))\n        }\n        break\n      case messageAwareness: {\n        awarenessProtocol.applyAwarenessUpdate(doc.awareness, decoding.readVarUint8Array(decoder), conn)\n        break\n      }\n    }\n  } catch (err) {\n    console.error(err)\n    // @ts-ignore\n    doc.emit('error', [err])\n  }\n}\n\n/**\n * @param {WSSharedDoc} doc\n * @param {any} conn\n */\nconst closeConn = (doc, conn) => {\n  if (doc.conns.has(conn)) {\n    /**\n     * @type {Set<number>}\n     */\n    // @ts-ignore\n    const controlledIds = doc.conns.get(conn)\n    doc.conns.delete(conn)\n    awarenessProtocol.removeAwarenessStates(doc.awareness, Array.from(controlledIds), null)\n    if (doc.conns.size === 0 && persistence !== null) {\n      // if persisted, we store state and destroy ydocument\n      persistence.writeState(doc.name, doc).then(() => {\n        doc.destroy()\n      })\n      docs.delete(doc.name)\n    }\n  }\n  conn.close()\n}\n\n/**\n * @param {WSSharedDoc} doc\n * @param {import('ws').WebSocket} conn\n * @param {Uint8Array} m\n */\nconst send = (doc, conn, m) => {\n  if (conn.readyState !== wsReadyStateConnecting && conn.readyState !== wsReadyStateOpen) {\n    closeConn(doc, conn)\n  }\n  try {\n    conn.send(m, {}, err => { err != null && closeConn(doc, conn) })\n  } catch (e) {\n    closeConn(doc, conn)\n  }\n}\n\nconst pingTimeout = 30000\n\n/**\n * @param {import('ws').WebSocket} conn\n * @param {import('http').IncomingMessage} req\n * @param {any} opts\n */\nexport const setupWSConnection = (conn, req, { docName = (req.url || '').slice(1).split('?')[0], gc = true } = {}) => {\n  conn.binaryType = 'arraybuffer'\n  // get doc, initialize if it does not exist yet\n  const doc = getYDoc(docName, gc)\n  doc.conns.set(conn, new Set())\n  // listen and reply to events\n  conn.on('message', /** @param {ArrayBuffer} message */ message => messageListener(conn, doc, new Uint8Array(message)))\n\n  // Check if connection is still alive\n  let pongReceived = true\n  const pingInterval = setInterval(() => {\n    if (!pongReceived) {\n      if (doc.conns.has(conn)) {\n        closeConn(doc, conn)\n      }\n      clearInterval(pingInterval)\n    } else if (doc.conns.has(conn)) {\n      pongReceived = false\n      try {\n        conn.ping()\n      } catch (e) {\n        closeConn(doc, conn)\n        clearInterval(pingInterval)\n      }\n    }\n  }, pingTimeout)\n  conn.on('close', () => {\n    closeConn(doc, conn)\n    clearInterval(pingInterval)\n  })\n  conn.on('pong', () => {\n    pongReceived = true\n  })\n  // put the following in a variables in a block so the interval handlers don't keep in in\n  // scope\n  {\n    // send sync step 1\n    const encoder = encoding.createEncoder()\n    encoding.writeVarUint(encoder, messageSync)\n    syncProtocol.writeSyncStep1(encoder, doc)\n    send(doc, conn, encoding.toUint8Array(encoder))\n    const awarenessStates = doc.awareness.getStates()\n    if (awarenessStates.size > 0) {\n      const encoder = encoding.createEncoder()\n      encoding.writeVarUint(encoder, messageAwareness)\n      encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(doc.awareness, Array.from(awarenessStates.keys())))\n      send(doc, conn, encoding.toUint8Array(encoder))\n    }\n  }\n}\n"],"names":["eventloop","encoding","syncProtocol","Y","awarenessProtocol","isCallbackSet","callbackHandler","map","decoding"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,sBAAsB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM;AACpF,MAAM,yBAAyB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO;;AAE3F,MAAM,SAAS,GAAGA,oBAAS,CAAC,eAAe,CAAC,sBAAsB,EAAE,yBAAyB;;AAE7F,MAAM,sBAAsB,GAAG;AAC/B,MAAM,gBAAgB,GAAG;;AAIzB;AACA,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK;AACnE;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG;;AAElB;AACA;AACA;AACA;AACY,MAAC,cAAc,GAAG,YAAY,IAAI;AAC9C,EAAE,WAAW,GAAG;AAChB;;AAEA;AACA;AACA;AACA;AACY,MAAC,cAAc,GAAG,MAAM;;AAEpC;AACA;AACA;AACY,MAAC,IAAI,GAAG,IAAI,GAAG;;AAE3B,MAAM,WAAW,GAAG;AACpB,MAAM,gBAAgB,GAAG;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK;AACrD,EAAE,MAAM,OAAO,GAAGC,mBAAQ,CAAC,aAAa;AACxC,EAAEA,mBAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW;AAC5C,EAAEC,uBAAY,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM;AAC1C,EAAE,MAAM,OAAO,GAAGD,mBAAQ,CAAC,YAAY,CAAC,OAAO;AAC/C,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC;AACzD;;AAEA;AACA;AACA;AACA,IAAI,kBAAkB,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,qBAAqB,GAAG,CAAC,CAAC,KAAK;AAC5C,EAAE,kBAAkB,GAAG;AACvB;;AAEO,MAAM,WAAW,SAASE,YAAC,CAAC,GAAG,CAAC;AACvC;AACA;AACA;AACA,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE;AACrB,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE;AAC3B,IAAI,IAAI,CAAC,IAAI,GAAG;AAChB;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG;AACxB;AACA;AACA;AACA,IAAI,IAAI,CAAC,SAAS,GAAG,IAAIC,4BAAiB,CAAC,SAAS,CAAC,IAAI;AACzD,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI;AACrC;AACA;AACA;AACA;AACA,IAAI,MAAM,sBAAsB,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,KAAK;AAC1E,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO;AAC1D,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE;AACzB,QAAQ,MAAM,iBAAiB,+BAA+B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AAClF,QAAQ,IAAI,iBAAiB,KAAK,SAAS,EAAE;AAC7C,UAAU,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAC,EAAE;AACvE,UAAU,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAC,EAAE;AAC5E;AACA;AACA;AACA,MAAM,MAAM,OAAO,GAAGH,mBAAQ,CAAC,aAAa;AAC5C,MAAMA,mBAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB;AACrD,MAAMA,mBAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAEG,4BAAiB,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;AAClH,MAAM,MAAM,IAAI,GAAGH,mBAAQ,CAAC,YAAY,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AACnC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI;AAC1B,OAAO;AACP;AACA,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB;AACtD,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,sBAAsB,aAAa;AACvD,IAAI,IAAII,sBAAa,EAAE;AACvB,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,KAAK;AACnD,QAAQ,SAAS,CAAC,MAAMC,wBAAe,6BAA6B,GAAG,EAAE;AACzE,OAAO;AACP;AACA,IAAI,IAAI,CAAC,eAAe,GAAG,kBAAkB,CAAC,IAAI;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,OAAO,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,KAAKC,cAAG,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM;AACvF,EAAE,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,OAAO;AACrC,EAAE,GAAG,CAAC,EAAE,GAAG;AACX,EAAE,IAAI,WAAW,KAAK,IAAI,EAAE;AAC5B,IAAI,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG;AACtC;AACA,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG;AACvB,EAAE,OAAO;AACT,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK;AAChD,EAAE,IAAI;AACN,IAAI,MAAM,OAAO,GAAGN,mBAAQ,CAAC,aAAa;AAC1C,IAAI,MAAM,OAAO,GAAGO,mBAAQ,CAAC,aAAa,CAAC,OAAO;AAClD,IAAI,MAAM,WAAW,GAAGA,mBAAQ,CAAC,WAAW,CAAC,OAAO;AACpD,IAAI,QAAQ,WAAW;AACvB,MAAM,KAAK,WAAW;AACtB,QAAQP,mBAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW;AAClD,QAAQC,uBAAY,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI;;AAEhE;AACA;AACA;AACA,QAAQ,IAAID,mBAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC1C,UAAU,IAAI,CAAC,GAAG,EAAE,IAAI,EAAEA,mBAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;AACxD;AACA,QAAQ;AACR,MAAM,KAAK,gBAAgB,EAAE;AAC7B,QAAQG,4BAAiB,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAEI,mBAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,IAAI;AACvG,QAAQ;AACR;AACA;AACA,GAAG,CAAC,OAAO,GAAG,EAAE;AAChB,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG;AACrB;AACA,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC;AAC3B;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK;AACjC,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC3B;AACA;AACA;AACA;AACA,IAAI,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;AAC5C,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;AACzB,IAAIJ,4BAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI;AAC1F,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,IAAI,EAAE;AACtD;AACA,MAAM,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM;AACvD,QAAQ,GAAG,CAAC,OAAO;AACnB,OAAO;AACP,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;AAC1B;AACA;AACA,EAAE,IAAI,CAAC,KAAK;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK;AAC/B,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,sBAAsB,IAAI,IAAI,CAAC,UAAU,KAAK,gBAAgB,EAAE;AAC1F,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI;AACvB;AACA,EAAE,IAAI;AACN,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,EAAC,EAAE;AACnE,GAAG,CAAC,OAAO,CAAC,EAAE;AACd,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI;AACvB;AACA;;AAEA,MAAM,WAAW,GAAG;;AAEpB;AACA;AACA;AACA;AACA;AACY,MAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK;AACtH,EAAE,IAAI,CAAC,UAAU,GAAG;AACpB;AACA,EAAE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE;AACjC,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE;AAC/B;AACA,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,sCAAsC,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;;AAEvH;AACA,EAAE,IAAI,YAAY,GAAG;AACrB,EAAE,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM;AACzC,IAAI,IAAI,CAAC,YAAY,EAAE;AACvB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC/B,QAAQ,SAAS,CAAC,GAAG,EAAE,IAAI;AAC3B;AACA,MAAM,aAAa,CAAC,YAAY;AAChC,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACpC,MAAM,YAAY,GAAG;AACrB,MAAM,IAAI;AACV,QAAQ,IAAI,CAAC,IAAI;AACjB,OAAO,CAAC,OAAO,CAAC,EAAE;AAClB,QAAQ,SAAS,CAAC,GAAG,EAAE,IAAI;AAC3B,QAAQ,aAAa,CAAC,YAAY;AAClC;AACA;AACA,GAAG,EAAE,WAAW;AAChB,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM;AACzB,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI;AACvB,IAAI,aAAa,CAAC,YAAY;AAC9B,GAAG;AACH,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM;AACxB,IAAI,YAAY,GAAG;AACnB,GAAG;AACH;AACA;AACA,EAAE;AACF;AACA,IAAI,MAAM,OAAO,GAAGH,mBAAQ,CAAC,aAAa;AAC1C,IAAIA,mBAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW;AAC9C,IAAIC,uBAAY,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG;AAC5C,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,EAAED,mBAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;AAClD,IAAI,MAAM,eAAe,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS;AACnD,IAAI,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,EAAE;AAClC,MAAM,MAAM,OAAO,GAAGA,mBAAQ,CAAC,aAAa;AAC5C,MAAMA,mBAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,gBAAgB;AACrD,MAAMA,mBAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAEG,4BAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;AACrI,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAEH,mBAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;AACpD;AACA;AACA;;;;;;;;;;"}