browser-git-ops 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +145 -146
  3. package/dist/git/githubAdapter.d.ts.map +1 -1
  4. package/dist/git/gitlabAdapter.d.ts.map +1 -1
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1167 -13
  8. package/dist/index.js.map +7 -0
  9. package/dist/index.mjs +1143 -0
  10. package/dist/index.mjs.map +7 -0
  11. package/dist/virtualfs/indexedDbStorage.d.ts +62 -0
  12. package/dist/virtualfs/indexedDbStorage.d.ts.map +1 -0
  13. package/dist/virtualfs/opfsStorage.d.ts +66 -0
  14. package/dist/virtualfs/opfsStorage.d.ts.map +1 -0
  15. package/dist/virtualfs/storageBackend.d.ts +44 -0
  16. package/dist/virtualfs/storageBackend.d.ts.map +1 -0
  17. package/dist/virtualfs/virtualfs.d.ts +8 -7
  18. package/dist/virtualfs/virtualfs.d.ts.map +1 -1
  19. package/package.json +60 -47
  20. package/dist/git/adapter.js +0 -2
  21. package/dist/git/githubAdapter.js +0 -179
  22. package/dist/git/gitlabAdapter.js +0 -182
  23. package/dist/test/e2e/github.spec.d.ts +0 -2
  24. package/dist/test/e2e/github.spec.d.ts.map +0 -1
  25. package/dist/test/e2e/github.spec.js +0 -47
  26. package/dist/test/e2e/gitlab.spec.d.ts +0 -2
  27. package/dist/test/e2e/gitlab.spec.d.ts.map +0 -1
  28. package/dist/test/e2e/gitlab.spec.js +0 -34
  29. package/dist/test/e2e/virtualfs.spec.d.ts +0 -2
  30. package/dist/test/e2e/virtualfs.spec.d.ts.map +0 -1
  31. package/dist/test/e2e/virtualfs.spec.js +0 -409
  32. package/dist/virtualfs/persistence.d.ts +0 -149
  33. package/dist/virtualfs/persistence.d.ts.map +0 -1
  34. package/dist/virtualfs/persistence.js +0 -294
  35. package/dist/virtualfs/types.js +0 -2
  36. package/dist/virtualfs/virtualfs.js +0 -496
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/virtualfs/opfsStorage.ts", "../src/virtualfs/virtualfs.ts", "../src/virtualfs/indexedDbStorage.ts", "../src/git/githubAdapter.ts", "../src/git/gitlabAdapter.ts"],
4
+ "sourcesContent": ["export { default as VirtualFS } from './virtualfs/virtualfs'\nexport { default as IndexedDbStorage } from './virtualfs/indexedDbStorage'\nexport { default as OpfsStorage } from './virtualfs/opfsStorage'\nexport { default as GitHubAdapter } from './git/githubAdapter'\nexport { default as GitLabAdapter } from './git/gitlabAdapter'\nexport { default } from './virtualfs/virtualfs'\n", "import { IndexFile } from './types'\nimport { StorageBackend } from './storageBackend'\n\nconst ERR_OPFS_DIR_API = 'OPFS directory API not available'\n\n/** OPFS (origin private file system) \u3092\u5229\u7528\u3059\u308B\u6C38\u7D9A\u5316\u5B9F\u88C5 */\nexport class OpfsStorage implements StorageBackend {\n /**\n * \u540C\u671F\u7684\u306B OPFS \u5229\u7528\u53EF\u5426\u3092\u5224\u5B9A\u3057\u307E\u3059\uFF08\u30EC\u30AC\u30B7\u30FC\u30D2\u30F3\u30C8\u3082\u542B\u3080\uFF09\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n let ok = false\n try {\n const nav = (globalThis as any).navigator\n // If navigator.storage.persist exists, treat as OPFS-capable hint (legacy detection)\n if (nav && nav.storage && typeof nav.storage.persist === 'function') ok = true\n if (nav && nav.storage && typeof nav.storage.getDirectory === 'function') ok = true\n } catch (_) {\n void 0\n }\n if (!ok && (globalThis as any).originPrivateFileSystem && typeof (globalThis as any).originPrivateFileSystem.getDirectory === 'function') ok = true\n return ok\n }\n\n /** \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\uFF08OPFS \u306F\u521D\u671F\u5316\u4E0D\u8981\uFF09 */\n constructor() {}\n\n /**\n * \u521D\u671F\u5316\uFF08OPFS \u306F\u30E9\u30F3\u30BF\u30A4\u30E0\u5224\u5B9A\u306E\u307F\uFF09\n * @returns {Promise<void>} \u521D\u671F\u5316\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async init(): Promise<void> {\n void 0\n }\n\n // legacy canUseOpfs removed; use static canUse() instead\n\n /**\n * OPFS \u306E\u30EB\u30FC\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30CF\u30F3\u30C9\u30EB\u3092\u53D6\u5F97\u3057\u307E\u3059\u3002\u5931\u6557\u6642\u306F null \u3092\u8FD4\u3059\u3002\n * @returns {Promise<any|null>} \u30EB\u30FC\u30C8\u30CF\u30F3\u30C9\u30EB\u307E\u305F\u306F null\n */\n private async getOpfsRoot(): Promise<any | null> {\n const nav = (globalThis as any).navigator\n if (nav && nav.storage && typeof nav.storage.getDirectory === 'function') {\n try {\n return await nav.storage.getDirectory()\n } catch (_) {\n // fallthrough to originPrivateFileSystem\n }\n }\n try {\n if ((globalThis as any).originPrivateFileSystem && typeof (globalThis as any).originPrivateFileSystem.getDirectory === 'function') {\n return await (globalThis as any).originPrivateFileSystem.getDirectory()\n }\n } catch (_) {\n return null\n }\n return null\n }\n\n /**\n * \u6307\u5B9A\u30D1\u30B9\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u518D\u5E30\u7684\u306B\u4F5C\u6210\u3057\u3066\u8FD4\u3059\n * @returns {Promise<any>} \u751F\u6210\u3055\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30CF\u30F3\u30C9\u30EB\n */\n private async ensureDir(root: any, parts: string[]): Promise<any> {\n let dir = root\n for (const p of parts) {\n if (dir && typeof dir.getDirectoryHandle === 'function') {\n dir = await dir.getDirectoryHandle(p, { create: true })\n } else if (dir && typeof dir.getDirectory === 'function') {\n dir = await dir.getDirectory(p, { create: true })\n } else {\n throw new Error(ERR_OPFS_DIR_API)\n }\n }\n return dir\n }\n\n /**\n * index \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<IndexFile|null>} \u8AAD\u307F\u51FA\u3057\u305F IndexFile\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readIndex(): Promise<IndexFile | null> {\n try {\n const root = await this.getOpfsRoot()\n if (!root) return null\n const fh = await root.getFileHandle('index')\n const file = await fh.getFile()\n const txt = await file.text()\n return txt ? (JSON.parse(txt) as IndexFile) : null\n } catch (_) {\n return null\n }\n }\n\n /**\n * index \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeIndex(index: IndexFile): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) throw new Error('OPFS not available')\n const fh = await root.getFileHandle('index', { create: true })\n const writable = await fh.createWritable()\n await writable.write(JSON.stringify(index))\n await writable.close()\n }\n\n /**\n * blob \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeBlob(filepath: string, content: string): Promise<void> {\n const root = await this.getOpfsRoot()\n if (!root) throw new Error('OPFS not available')\n const parts = filepath.split('/')\n if (parts.length > 1) {\n const dirParts = parts.slice(0, parts.length - 1)\n const parent = await this.ensureDir(root, dirParts)\n const fh = await parent.getFileHandle(parts[parts.length - 1], { create: true })\n const writable = await fh.createWritable()\n await writable.write(content)\n await writable.close()\n return\n }\n const fh = await root.getFileHandle(filepath, { create: true })\n const writable = await fh.createWritable()\n await writable.write(content)\n await writable.close()\n }\n\n /**\n * blob \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string): Promise<string | null> {\n try {\n const root = await this.getOpfsRoot()\n if (!root) return null\n const parts = filepath.split('/')\n const dir = await this.traverseDir(root, parts.slice(0, parts.length - 1))\n const fh = await dir.getFileHandle(parts[parts.length - 1])\n const file = await fh.getFile()\n const txt = await file.text()\n return txt ?? null\n } catch (_) {\n return null\n }\n }\n\n /**\n * blob \u3092\u524A\u9664\u3059\u308B\n * @returns {Promise<void>} \u524A\u9664\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async deleteBlob(filepath: string): Promise<void> {\n try {\n const root = await this.getOpfsRoot()\n if (!root) return\n const parts = filepath.split('/')\n const dir = await this.traverseDir(root, parts.slice(0, parts.length - 1))\n const name = parts[parts.length - 1]\n if (typeof dir.removeEntry === 'function') {\n await dir.removeEntry(name)\n return\n }\n if (typeof dir.getFileHandle === 'function') {\n await this.tryRemoveFileHandle(dir, name)\n return\n }\n } catch (_) {\n void 0\n }\n }\n\n /**\n * Traverse into nested directories without creating them.\n * @param root The starting directory handle\n * @param parts Path parts to traverse\n * @returns The final directory handle\n */\n private async traverseDir(root: any, parts: string[]): Promise<any> {\n let dir = root\n for (const p of parts) {\n if (dir && typeof dir.getDirectoryHandle === 'function') {\n dir = await dir.getDirectoryHandle(p)\n } else if (dir && typeof dir.getDirectory === 'function') {\n dir = await dir.getDirectory(p)\n } else {\n throw new Error(ERR_OPFS_DIR_API)\n }\n }\n return dir\n }\n\n /**\n * Try to remove a file via its file handle.\n * @returns {Promise<boolean>} true when removed, false otherwise\n */\n private async tryRemoveFileHandle(dir: any, name: string): Promise<boolean> {\n try {\n const fh = await dir.getFileHandle(name)\n if (fh && typeof (fh as any).remove === 'function') {\n await (fh as any).remove()\n return true\n }\n } catch (_) {\n // ignore\n }\n return false\n }\n}\n\nexport default OpfsStorage\n", "import { IndexFile, TombstoneEntry } from './types'\nimport { StorageBackend } from './storageBackend'\nimport { OpfsStorage } from './opfsStorage'\n\n/** Virtual file system - \u6C38\u7D9A\u5316\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u3092\u62BD\u8C61\u5316\u3057\u305F\u4EEE\u60F3\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0 */\nexport class VirtualFS {\n private storageDir: string | undefined\n private base = new Map<string, { sha: string; content: string }>()\n private workspace = new Map<string, { sha: string; content: string }>()\n private tombstones = new Map<string, TombstoneEntry>()\n private index: IndexFile = { head: '', entries: {} }\n private backend: StorageBackend\n\n /**\n * VirtualFS \u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param options \u30AA\u30D7\u30B7\u30E7\u30F3\n * @returns {void}\n */\n constructor(options?: { storageDir?: string; backend?: StorageBackend }) {\n this.storageDir = options?.storageDir\n if (options?.backend) this.backend = options.backend\n else this.backend = new OpfsStorage()\n }\n\n\n /**\n * \u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089 SHA1 \u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param {string} content \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {string} \u8A08\u7B97\u3055\u308C\u305F SHA\n */\n private async shaOf(content: string) {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const hashBuffer = await crypto.subtle.digest('SHA-1', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * VirtualFS \u306E\u521D\u671F\u5316\u3092\u884C\u3044\u307E\u3059\uFF08\u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u521D\u671F\u5316\u3068 index \u8AAD\u307F\u8FBC\u307F\uFF09\u3002\n * @returns {Promise<void>}\n */\n async init() {\n await this.backend.init()\n await this.loadIndex()\n }\n\n /**\n * \u6C38\u7D9A\u5316\u30EC\u30A4\u30E4\u30FC\u304B\u3089 index \u3092\u8AAD\u307F\u8FBC\u307F\u3001\u5185\u90E8\u30DE\u30C3\u30D7\u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async loadIndex() {\n try {\n const raw = await this.backend.readIndex()\n if (raw) this.index = raw\n // Populate internal maps lightly (only shas known)\n for (const [p, e] of Object.entries(this.index.entries)) {\n if (e.baseSha) {\n this.base.set(p, { sha: e.baseSha, content: '' })\n }\n if (e.workspaceSha) {\n this.workspace.set(p, { sha: e.workspaceSha, content: '' })\n }\n }\n } catch (err) {\n this.index = { head: '', entries: {} }\n await this.saveIndex()\n }\n }\n\n /**\n * \u5185\u90E8\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u3092\u6C38\u7D9A\u5316\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async saveIndex() {\n await this.backend.writeIndex(this.index)\n }\n\n /**\n *\n */\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3059\uFF08\u30ED\u30FC\u30AB\u30EB\u7DE8\u96C6\uFF09\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @param {string} content \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {Promise<void>}\n */\n async writeWorkspace(filepath: string, content: string) {\n const sha = await this.shaOf(content)\n this.workspace.set(filepath, { sha, content })\n const now = Date.now()\n const existing = this.index.entries[filepath]\n const state = existing && existing.baseSha ? 'modified' : 'added'\n this.index.entries[filepath] = {\n path: filepath,\n state: state as any,\n baseSha: existing?.baseSha,\n workspaceSha: sha,\n updatedAt: now,\n }\n // persist workspace blob (optional)\n await this.backend.writeBlob(filepath, content)\n await this.saveIndex()\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u4E0A\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u307E\u3059\uFF08\u30C8\u30A5\u30FC\u30E0\u30B9\u30C8\u30FC\u30F3\u4F5C\u6210\u3092\u542B\u3080\uFF09\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<void>}\n */\n async deleteWorkspace(filepath: string) {\n // if file existed in base, create tombstone\n const entry = this.index.entries[filepath]\n const now = Date.now()\n if (entry && entry.baseSha) {\n this.tombstones.set(filepath, { path: filepath, baseSha: entry.baseSha!, deletedAt: now })\n this.index.entries[filepath] = {\n path: filepath,\n state: 'deleted',\n baseSha: entry.baseSha,\n updatedAt: now,\n }\n } else {\n // created in workspace and deleted before push\n delete this.index.entries[filepath]\n this.workspace.delete(filepath)\n await this.backend.deleteBlob(filepath)\n }\n await this.saveIndex()\n }\n\n /**\n * rename \u3092 delete + create \u306E\u5408\u6210\u3067\u884C\u3046\u30D8\u30EB\u30D1\n * @param from \u5143\u30D1\u30B9\n * @param to \u65B0\u30D1\u30B9\n */\n async renameWorkspace(from: string, to: string) {\n // read content from workspace if present, otherwise from base\n const w = this.workspace.get(from)\n const content = w ? w.content : (this.base.get(from)?.content ?? null)\n if (content === null) throw new Error('source not found')\n\n // create new workspace entry\n await this.writeWorkspace(to, content)\n\n // delete original path (creates tombstone if base existed)\n await this.deleteWorkspace(from)\n }\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9/\u30D9\u30FC\u30B9\u304B\u3089\u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3092\u8AAD\u307F\u51FA\u3057\u307E\u3059\u3002\n * @param {string} filepath \u30D5\u30A1\u30A4\u30EB\u30D1\u30B9\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u307E\u305F\u306F null\n */\n async readWorkspace(filepath: string) {\n const w = this.workspace.get(filepath)\n if (w) return w.content\n // try backend blob\n const blob = await this.backend.readBlob(filepath)\n if (blob !== null) return blob\n const b = this.base.get(filepath)\n if (b && b.content) return b.content\n return null\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30D9\u30FC\u30B9\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u9069\u7528\u3057\u307E\u3059\u3002\n * @param {{[path:string]:string}} snapshot path->content \u306E\u30DE\u30C3\u30D7\n * @param {string} headSha \u30EA\u30E2\u30FC\u30C8 HEAD\n * @returns {Promise<void>}\n */\n async applyBaseSnapshot(snapshot: Record<string, string>, headSha: string) {\n // snapshot: path -> content\n this.base.clear()\n for (const [p, c] of Object.entries(snapshot)) {\n this.base.set(p, { sha: await this.shaOf(c), content: c })\n // persist base blob\n await this.backend.writeBlob(p, c)\n }\n // update index entries for files not touched in workspace\n for (const [p, be] of this.base.entries()) {\n const existing = this.index.entries[p]\n if (!existing) {\n this.index.entries[p] = {\n path: p,\n state: 'base',\n baseSha: be.sha,\n updatedAt: Date.now(),\n }\n } else if (existing.state === 'base') {\n existing.baseSha = be.sha\n existing.updatedAt = Date.now()\n }\n }\n this.index.head = headSha\n await this.saveIndex()\n }\n\n /**\n * \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {IndexFile}\n */\n getIndex(): IndexFile {\n return this.index\n }\n\n /**\n * \u767B\u9332\u3055\u308C\u3066\u3044\u308B\u30D1\u30B9\u4E00\u89A7\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {string[]}\n */\n listPaths(): string[] {\n return Object.keys(this.index.entries)\n }\n\n /**\n * tombstone \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {TombstoneEntry[]}\n */\n getTombstones(): TombstoneEntry[] {\n return Array.from(this.tombstones.values())\n }\n\n /**\n * tombstone \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @returns {TombstoneEntry[]}\n */\n\n /**\n * \u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3068\u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u304B\u3089\u5909\u66F4\u30BB\u30C3\u30C8\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Promise<Array<{type:string,path:string,content?:string,baseSha?:string}>>} \u5909\u66F4\u30EA\u30B9\u30C8\n */\n async getChangeSet() {\n // produce Change[] per spec\n type Change =\n | { type: 'create'; path: string; content: string }\n | { type: 'update'; path: string; content: string; baseSha?: string }\n | { type: 'delete'; path: string; baseSha: string }\n\n const changes: Change[] = []\n changes.push(...this._changesFromTombstones())\n changes.push(...this._changesFromIndexEntries())\n return changes\n }\n\n /**\n * tombstone \u304B\u3089\u306E\u524A\u9664\u5909\u66F4\u30EA\u30B9\u30C8\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Array<{type:'delete',path:string,baseSha:string}>}\n */\n private _changesFromTombstones(): Array<{ type: 'delete'; path: string; baseSha: string }> {\n const out: Array<{ type: 'delete'; path: string; baseSha: string }> = []\n for (const t of this.tombstones.values()) out.push({ type: 'delete', path: t.path, baseSha: t.baseSha })\n return out\n }\n\n /**\n * index entries \u304B\u3089 create/update \u306E\u5909\u66F4\u30EA\u30B9\u30C8\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Array<{type:'create'|'update',path:string,content:string,baseSha?:string}>}\n */\n private _changesFromIndexEntries(): Array<{ type: 'create' | 'update'; path: string; content: string; baseSha?: string }> {\n const out: Array<{ type: 'create' | 'update'; path: string; content: string; baseSha?: string }> = []\n out.push(...this._changesFromAddedEntries())\n out.push(...this._changesFromModifiedEntries())\n return out\n }\n\n /**\n * \u8FFD\u52A0\u72B6\u614B\u306E\u30A8\u30F3\u30C8\u30EA\u304B\u3089 create \u5909\u66F4\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Array<{type:'create',path:string,content:string}>}\n */\n private _changesFromAddedEntries(): Array<{ type: 'create'; path: string; content: string }> {\n const out: Array<{ type: 'create'; path: string; content: string }> = []\n for (const [p, e] of Object.entries(this.index.entries)) {\n if (e.state === 'added') {\n const w = this.workspace.get(p)\n if (w) out.push({ type: 'create', path: p, content: w.content })\n }\n }\n return out\n }\n\n /**\n * \u5909\u66F4\u72B6\u614B\u306E\u30A8\u30F3\u30C8\u30EA\u304B\u3089 update \u5909\u66F4\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @returns {Array<{type:'update',path:string,content:string,baseSha:string}>}\n */\n private _changesFromModifiedEntries(): Array<{ type: 'update'; path: string; content: string; baseSha: string }> {\n const out: Array<{ type: 'update'; path: string; content: string; baseSha: string }> = []\n for (const [p, e] of Object.entries(this.index.entries)) {\n if (e.state === 'modified') {\n const w = this.workspace.get(p)\n if (w && e.baseSha) out.push({ type: 'update', path: p, content: w.content, baseSha: e.baseSha })\n }\n }\n return out\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u304B\u3089\u306E\u5DEE\u5206\u53D6\u308A\u8FBC\u307F\u6642\u306B\u3001\u5358\u4E00\u30D1\u30B9\u3092\u8A55\u4FA1\u3057\u3066\n * \u5FC5\u8981\u306A\u3089 conflicts \u306B\u8FFD\u52A0\u3001\u3082\u3057\u304F\u306F base \u3092\u66F4\u65B0\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async _handleRemotePath(p: string, remoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<import('./types').ConflictEntry>) {\n const idxEntry = this.index.entries[p]\n const localWorkspace = this.workspace.get(p)\n const localBase = this.base.get(p)\n\n if (!idxEntry) return await this._handleRemoteNew(p, remoteSha, baseSnapshot, conflicts, localWorkspace, localBase)\n return await this._handleRemoteExisting(p, idxEntry, remoteSha, baseSnapshot, conflicts, localWorkspace)\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306B\u5B58\u5728\u3059\u308B\u304C\u30ED\u30FC\u30AB\u30EB\u306B\u306A\u3044\u30D1\u30B9\u3092\u51E6\u7406\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async _handleRemoteNew(p: string, remoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<import('./types').ConflictEntry>, localWorkspace: { sha: string; content: string } | undefined, localBase: { sha: string; content: string } | undefined) {\n if (localWorkspace) {\n // workspace has uncommitted changes -> conflict\n conflicts.push({ path: p, remoteSha, workspaceSha: localWorkspace.sha, baseSha: localBase?.sha })\n } else {\n // safe to add to base\n const content = baseSnapshot[p]\n this.base.set(p, { sha: remoteSha, content })\n this.index.entries[p] = { path: p, state: 'base', baseSha: remoteSha, updatedAt: Date.now() }\n await this.backend.writeBlob(p, content)\n }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306B\u5B58\u5728\u3057\u3001\u304B\u3064\u30ED\u30FC\u30AB\u30EB\u306B\u30A8\u30F3\u30C8\u30EA\u304C\u3042\u308B\u30D1\u30B9\u3092\u51E6\u7406\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async _handleRemoteExisting(p: string, idxEntry: any, remoteSha: string, baseSnapshot: Record<string, string>, conflicts: Array<import('./types').ConflictEntry>, localWorkspace: { sha: string; content: string } | undefined) {\n const baseSha = idxEntry.baseSha\n if (baseSha === remoteSha) return\n // remote changed\n if (!localWorkspace || localWorkspace.sha === baseSha) {\n // workspace unchanged -> update base\n const content = baseSnapshot[p]\n this.base.set(p, { sha: remoteSha, content })\n idxEntry.baseSha = remoteSha\n idxEntry.state = 'base'\n idxEntry.updatedAt = Date.now()\n await this.backend.writeBlob(p, content)\n } else {\n // workspace modified -> conflict\n conflicts.push({ path: p, baseSha, remoteSha, workspaceSha: localWorkspace?.sha })\n }\n }\n\n /**\n * \u30ED\u30FC\u30AB\u30EB\u306B\u5BFE\u3059\u308B\u5909\u66F4\uFF08create/update/delete\uFF09\u3092\u9069\u7528\u3059\u308B\u30D8\u30EB\u30D1\u30FC\n * @param {any} ch \u5909\u66F4\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n * @returns {Promise<void>}\n */\n private async _applyChangeLocally(ch: any) {\n if (ch.type === 'create' || ch.type === 'update') {\n const sha = await this.shaOf(ch.content)\n this.base.set(ch.path, { sha, content: ch.content })\n const entry = this.index.entries[ch.path] || ({ path: ch.path } as any)\n entry.baseSha = sha\n entry.state = 'base'\n entry.updatedAt = Date.now()\n entry.workspaceSha = undefined\n this.index.entries[ch.path] = entry\n await this.backend.writeBlob(ch.path, ch.content)\n this.workspace.delete(ch.path)\n } else if (ch.type === 'delete') {\n delete this.index.entries[ch.path]\n this.base.delete(ch.path)\n this.tombstones.delete(ch.path)\n await this.backend.deleteBlob(ch.path)\n this.workspace.delete(ch.path)\n }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u5074\u3067\u524A\u9664\u3055\u308C\u305F\u30A8\u30F3\u30C8\u30EA\u3092\u30ED\u30FC\u30AB\u30EB\u306B\u53CD\u6620\u3057\u307E\u3059\u3002\n * @returns {Promise<void>}\n */\n private async _handleRemoteDeletion(p: string, e: any, _remoteShas: Record<string, string>, conflicts: Array<import('./types').ConflictEntry>) {\n const localWorkspace = this.workspace.get(p)\n if (!localWorkspace || localWorkspace.sha === e.baseSha) {\n // safe to delete locally\n delete this.index.entries[p]\n this.base.delete(p)\n await this.backend.deleteBlob(p)\n } else {\n conflicts.push({ path: p, baseSha: e.baseSha, workspaceSha: localWorkspace?.sha })\n }\n }\n\n /**\n * GitLab \u98A8\u306E actions \u30D9\u30FC\u30B9\u30B3\u30DF\u30C3\u30C8\u30D5\u30ED\u30FC\u3067 push \u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @returns {Promise<{commitSha:string}>}\n */\n private async _pushWithActions(adapter: any, input: any, branch: string) {\n const commitSha = await adapter.createCommitWithActions(branch, input.message, input.changes as any[])\n try {\n await adapter.updateRef(`heads/${branch}`, commitSha)\n } catch (e) {\n // ignore; adapter may not support updateRef\n }\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n this.index.head = commitSha\n await this.saveIndex()\n return { commitSha }\n }\n\n /**\n * GitHub \u98A8\u306E blob/tree/commit \u30D5\u30ED\u30FC\u3067 push \u3092\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @returns {Promise<{commitSha:string}>}\n */\n private async _pushWithGitHubFlow(adapter: any, input: any, branch: string) {\n const blobMap = await adapter.createBlobs(input.changes as any[])\n const changesWithBlob = (input.changes as any[]).map((c) => ({ ...c, blobSha: blobMap[c.path] }))\n const treeSha = await adapter.createTree(changesWithBlob)\n const commitSha = await adapter.createCommit(input.message, input.parentSha, treeSha)\n try {\n await adapter.updateRef(`heads/${branch}`, commitSha)\n } catch (e) {\n // ignore; adapter may not support updateRef\n }\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n this.index.head = commitSha\n await this.saveIndex()\n return { commitSha }\n }\n\n /**\n * \u30EA\u30E2\u30FC\u30C8\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u308A\u8FBC\u307F\u3001\u30B3\u30F3\u30D5\u30EA\u30AF\u30C8\u60C5\u5831\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string} remoteHead \u30EA\u30E2\u30FC\u30C8 HEAD\n * @param {{[path:string]:string}} baseSnapshot path->content \u30DE\u30C3\u30D7\n * @returns {Promise<{conflicts:Array<import('./types').ConflictEntry>}>}\n */\n async pull(remoteHead: string, baseSnapshot: Record<string, string>) {\n const conflicts: Array<import('./types').ConflictEntry> = []\n\n // compute remote shas\n const remoteShas: Record<string, string> = {}\n for (const [p, c] of Object.entries(baseSnapshot)) {\n remoteShas[p] = await this.shaOf(c)\n }\n\n // handle remote additions/updates via helper\n for (const [p, remoteSha] of Object.entries(remoteShas)) {\n await this._handleRemotePath(p, remoteSha, baseSnapshot, conflicts)\n }\n\n // handle remote deletions via helper\n for (const [p, e] of Object.entries(this.index.entries)) {\n if (!(p in remoteShas)) {\n await this._handleRemoteDeletion(p, e, remoteShas, conflicts)\n }\n }\n\n if (conflicts.length === 0) {\n this.index.head = remoteHead\n await this.saveIndex()\n }\n\n return { conflicts }\n }\n\n /**\n * \u5909\u66F4\u3092\u30B3\u30DF\u30C3\u30C8\u3057\u3066\u30EA\u30E2\u30FC\u30C8\u3078\u53CD\u6620\u3057\u307E\u3059\u3002adapter \u304C\u7121\u3051\u308C\u3070\u30ED\u30FC\u30AB\u30EB\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u3057\u307E\u3059\u3002\n * @param {import('./types').CommitInput} input \u30B3\u30DF\u30C3\u30C8\u5165\u529B\n * @param {import('../git/adapter').GitAdapter} [adapter] \u4EFB\u610F\u306E\u30A2\u30C0\u30D7\u30BF\n * @returns {Promise<{commitSha:string}>}\n */\n async push(input: import('./types').CommitInput, adapter?: import('../git/adapter').GitAdapter) {\n // pre-check\n if (input.parentSha !== this.index.head) {\n throw new Error('HEAD changed. pull required')\n }\n\n // generate commitKey for idempotency if not provided\n if (!input.commitKey) {\n // commitKey = hash(parentSha + JSON.stringify(changes))\n input.commitKey = await this.shaOf(input.parentSha + JSON.stringify(input.changes))\n }\n\n // ensure changes are present\n if (!input.changes || input.changes.length === 0) throw new Error('No changes to commit')\n\n // If adapter provided, perform remote API reflect\n if (adapter) {\n const branch = (input as any).ref || 'main'\n const messageWithKey = `${input.message}\\n\\napigit-commit-key:${input.commitKey}`\n\n // If adapter supports createCommitWithActions (GitLab style), use it directly\n if ((adapter as any).createCommitWithActions) {\n // ensure message contains commitKey\n (input as any).message = messageWithKey\n const res = await this._pushWithActions(adapter, input, branch)\n // record commitKey in index metadata\n this.index.lastCommitKey = input.commitKey\n return res\n }\n\n // Fallback to GitHub-style flow: delegate to helper\n (input as any).message = messageWithKey\n const res = await this._pushWithGitHubFlow(adapter, input, branch)\n this.index.lastCommitKey = input.commitKey\n return res\n }\n\n // fallback: simulate commit locally\n const commitSha = await this.shaOf(input.parentSha + '|' + input.commitKey)\n\n for (const ch of input.changes as any[]) {\n await this._applyChangeLocally(ch)\n }\n\n this.index.head = commitSha\n this.index.lastCommitKey = input.commitKey\n await this.saveIndex()\n\n return { commitSha }\n }\n}\n\nexport default VirtualFS\n", "import { IndexFile } from './types'\nimport { StorageBackend } from './storageBackend'\n\n/**\n * IndexedDB \u3092\u7528\u3044\u305F\u6C38\u7D9A\u5316\u5B9F\u88C5\n */\nexport class IndexedDbStorage implements StorageBackend {\n /**\n * \u74B0\u5883\u306B IndexedDB \u304C\u5B58\u5728\u3059\u308B\u304B\u3092\u540C\u671F\u691C\u67FB\u3057\u307E\u3059\u3002\n * @returns {boolean} \u5229\u7528\u53EF\u80FD\u306A\u3089 true\n */\n static canUse(): boolean {\n try {\n return !!(globalThis as any).indexedDB\n } catch (_) {\n return false\n }\n }\n private dbName = 'apigit_storage'\n private dbPromise: Promise<IDBDatabase>\n\n /** \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF */\n constructor() {\n this.dbPromise = this.openDb()\n }\n\n /**\n * \u521D\u671F\u5316: DB \u3092\u30AA\u30FC\u30D7\u30F3\u3059\u308B\u307E\u3067\u5F85\u3064\n * @returns {Promise<void>} \u521D\u671F\u5316\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async init(): Promise<void> {\n await this.dbPromise\n }\n\n /**\n * DB \u3092\u958B\u3044\u3066 objectStore \u3092\u521D\u671F\u5316\u3059\u308B\n * @returns {Promise<IDBDatabase>} Opened IDBDatabase\n */\n private openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const idb = (globalThis as any).indexedDB\n if (!idb) return reject(new Error('IndexedDB is not available'))\n const req = idb.open(this.dbName, 1)\n\n /**\n * DB \u30B9\u30AD\u30FC\u30DE\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u6642\u306E\u30CF\u30F3\u30C9\u30E9\n * @param {IDBVersionChangeEvent} ev \u30A4\u30D9\u30F3\u30C8\n */\n function handleUpgrade(ev: any) {\n const db = (ev.target as IDBOpenDBRequest).result\n if (!db.objectStoreNames.contains('blobs')) db.createObjectStore('blobs')\n if (!db.objectStoreNames.contains('index')) db.createObjectStore('index')\n }\n req.onupgradeneeded = handleUpgrade\n\n /**\n * \u6307\u5B9A DB \u306B\u5BFE\u3059\u308B onversionchange \u30CF\u30F3\u30C9\u30E9\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @param dbParam \u5BFE\u8C61\u306E DB\n */\n /**\n * \u6307\u5B9A DB \u306B\u5BFE\u3059\u308B onversionchange \u30CF\u30F3\u30C9\u30E9\u3092\u751F\u6210\u3057\u307E\u3059\u3002\n * @param dbParam \u5BFE\u8C61\u306E DB\n * @returns {() => void} \u30CF\u30F3\u30C9\u30E9\u95A2\u6570\n */\n function makeVersionChangeHandler(dbParam: IDBDatabase) {\n return function () { try { dbParam.close() } catch (_) { void 0 } }\n }\n\n /**\n * \u6210\u529F\u6642\u306E\u30CF\u30F3\u30C9\u30E9\n * @returns {void}\n */\n function handleSuccess() {\n const db = req.result\n try {\n db.onversionchange = makeVersionChangeHandler(db)\n } catch (_) { void 0 }\n resolve(db)\n }\n\n /** \u30A8\u30E9\u30FC\u6642\u30CF\u30F3\u30C9\u30E9 */\n function handleError() { reject(req.error) }\n\n req.onsuccess = handleSuccess\n req.onerror = handleError\n })\n }\n\n /**\n * \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E9\u30C3\u30D1\u30FC\u3002cb \u5185\u306E\u51E6\u7406\u3092\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u3067\u5B9F\u884C\u3057\u3001\n * \u5FC5\u8981\u306A\u3089\u518D\u8A66\u884C\u3057\u307E\u3059\u3002\n */\n /**\n * \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30E9\u30C3\u30D1\u30FC\u3002cb \u5185\u306E\u51E6\u7406\u3092\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u3067\u5B9F\u884C\u3057\u3001\u5FC5\u8981\u306A\u3089\u518D\u8A66\u884C\u3057\u307E\u3059\u3002\n * @returns {Promise<void>} \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u51E6\u7406\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n private async tx(storeName: string, mode: IDBTransactionMode, cb: (_store: IDBObjectStore) => void | Promise<void>): Promise<void> {\n /**\n * \u5358\u4E00\u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u8A66\u884C\u5B9F\u884C\u3092\u884C\u3044\u307E\u3059\u3002\n * @returns {Promise<void>} \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u51E6\u7406\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n const attempt = async (): Promise<void> => {\n const db = await this.dbPromise\n return new Promise<void>((resolve, reject) => {\n let tx: IDBTransaction\n try { tx = db.transaction(storeName, mode) } catch (err) { return reject(err) }\n const storeObj = tx.objectStore(storeName)\n\n /** \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u5B8C\u4E86\u30CF\u30F3\u30C9\u30E9 */\n function handleTxComplete() { resolve() }\n\n /** \u30C8\u30E9\u30F3\u30B6\u30AF\u30B7\u30E7\u30F3\u30A8\u30E9\u30FC\u30CF\u30F3\u30C9\u30E9 */\n function handleTxError() { reject(tx.error) }\n\n Promise.resolve(cb(storeObj)).then(() => {\n tx.oncomplete = handleTxComplete\n tx.onerror = handleTxError\n }).catch(reject)\n })\n }\n\n try { return await attempt() } catch (err: any) {\n const isInvalidState = err && (err.name === 'InvalidStateError' || /closing/i.test(String(err.message || '')))\n if (isInvalidState) { this.dbPromise = this.openDb(); return await attempt() }\n throw err\n }\n }\n\n // legacy canUseOpfs removed; use static canUse() instead\n\n /**\n * index \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<IndexFile|null>} \u8AAD\u307F\u51FA\u3057\u305F IndexFile\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readIndex(): Promise<IndexFile | null> {\n const db = await this.dbPromise\n return new Promise<IndexFile | null>((resolve, reject) => {\n const tx = db.transaction('index', 'readonly')\n const store = tx.objectStore('index')\n const req = store.get('index')\n\n /** index \u53D6\u5F97\u6210\u529F\u30CF\u30F3\u30C9\u30E9 */\n function handleIndexSuccess() { resolve(req.result ?? null) }\n\n /** index \u53D6\u5F97\u30A8\u30E9\u30FC\u30CF\u30F3\u30C9\u30E9 */\n function handleIndexError() { reject(req.error) }\n\n req.onsuccess = handleIndexSuccess\n req.onerror = handleIndexError\n })\n }\n\n /**\n * index \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeIndex(index: IndexFile): Promise<void> {\n await this.tx('index', 'readwrite', (store) => { store.put(index, 'index') })\n }\n\n /**\n * blob \u3092\u66F8\u304D\u8FBC\u3080\n * @returns {Promise<void>} \u66F8\u8FBC\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async writeBlob(filepath: string, content: string): Promise<void> {\n await this.tx('blobs', 'readwrite', (store) => { store.put(content, filepath) })\n }\n\n /**\n * blob \u3092\u8AAD\u307F\u51FA\u3059\n * @returns {Promise<string|null>} \u30D5\u30A1\u30A4\u30EB\u5185\u5BB9\u3001\u5B58\u5728\u3057\u306A\u3051\u308C\u3070 null\n */\n async readBlob(filepath: string): Promise<string | null> {\n const db = await this.dbPromise\n return new Promise<string | null>((resolve, reject) => {\n const tx = db.transaction('blobs', 'readonly')\n const store = tx.objectStore('blobs')\n const req = store.get(filepath)\n\n /** blob \u53D6\u5F97\u6210\u529F\u30CF\u30F3\u30C9\u30E9 */\n function handleBlobSuccess() { resolve(req.result ?? null) }\n\n /** blob \u53D6\u5F97\u30A8\u30E9\u30FC\u30CF\u30F3\u30C9\u30E9 */\n function handleBlobError() { reject(req.error) }\n\n req.onsuccess = handleBlobSuccess\n req.onerror = handleBlobError\n })\n }\n\n /**\n * blob \u3092\u524A\u9664\u3059\u308B\n * @returns {Promise<void>} \u524A\u9664\u5B8C\u4E86\u6642\u306B\u89E3\u6C7A\n */\n async deleteBlob(filepath: string): Promise<void> {\n await this.tx('blobs', 'readwrite', (store) => { store.delete(filepath) })\n }\n}\n\nexport default IndexedDbStorage\n", "import { GitAdapter } from './adapter'\n// Use Web Crypto directly for SHA-1\n\ntype GHOptions = {\n owner: string\n repo: string\n token: string\n}\n\n/**\n * \u30EA\u30C8\u30E9\u30A4\u53EF\u80FD\u306A\u30A8\u30E9\u30FC\u3002\n */\nexport class RetryableError extends Error {}\n\n/**\n * \u30EA\u30C8\u30E9\u30A4\u4E0D\u53EF\u80FD\u306A\u30A8\u30E9\u30FC\u3002\n */\nexport class NonRetryableError extends Error {}\n\n/**\n * \u6307\u5B9A\u30DF\u30EA\u79D2\u3060\u3051 sleep \u3059\u308B\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\n * @param ms \u30DF\u30EA\u79D2\n */\nfunction sleep(ms: number) {\n return new Promise((res) => setTimeout(res, ms))\n}\n\n/**\n * fetch \u3092\u518D\u8A66\u884C\u4ED8\u304D\u3067\u5B9F\u884C\u3059\u308B\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u3002\n * 5xx \u3084 429 \u306F\u30EA\u30C8\u30E9\u30A4\u5BFE\u8C61\u3001\u305D\u308C\u4EE5\u5916\u306F NonRetryableError \u3092\u6295\u3052\u308B\u3002\n * @param input RequestInfo\n * @param init RequestInit\n * @param attempts \u8A66\u884C\u56DE\u6570\n * @param baseDelay \u30D9\u30FC\u30B9\u306E\u9045\u5EF6(ms)\n */\n/* istanbul ignore next */\nasync function fetchWithRetry(input: RequestInfo, init: RequestInit, attempts = 4, baseDelay = 300) {\n let lastErr: any\n for (let i = 0; i < attempts; i++) {\n try {\n const res = await fetch(input, init)\n return await processResponseWithDelay(res, i, baseDelay)\n /* istanbul ignore next */\n } catch (err) {\n if (err instanceof NonRetryableError) throw err\n lastErr = err\n await sleep(getDelayForResponse(null, i, baseDelay))\n }\n }\n throw new RetryableError(`Failed after ${attempts} attempts: ${lastErr}`)\n}\n\nfunction classifyStatus(status: number) {\n return status >= 500 || status === 429\n}\n\nfunction getDelayForResponse(res: Response | null, i: number, baseDelay: number) {\n if (!res) return baseDelay * Math.pow(2, i) + Math.random() * 100\n const retryAfter = res.headers.get('Retry-After')\n return retryAfter ? Number(retryAfter) * 1000 : baseDelay * Math.pow(2, i) + Math.random() * 100\n}\n\nasync function processResponseWithDelay(res: Response, i: number, baseDelay: number) {\n if (res.ok) return res\n if (classifyStatus(res.status)) {\n await sleep(getDelayForResponse(res, i, baseDelay))\n throw new RetryableError(`HTTP ${res.status}`)\n }\n const txt = await res.text().catch(() => '')\n throw new NonRetryableError(`HTTP ${res.status}: ${txt}`)\n}\n\n/**\n * \u975E\u540C\u671F\u30DE\u30C3\u30D7\u3092\u4E26\u5217\u5B9F\u884C\u3059\u308B\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\n * @param items \u5165\u529B\u914D\u5217\n * @param mapper \u30DE\u30C3\u30D4\u30F3\u30B0\u95A2\u6570\n * @param concurrency \u540C\u6642\u5B9F\u884C\u6570\n */\n/* istanbul ignore next */\nfunction mapWithConcurrency<T, R>(items: T[], mapper: (_t: T) => Promise<R>, concurrency = 5) {\n const results: R[] = []\n let idx = 0\n const runners: Promise<void>[] = []\n const run = async () => {\n while (idx < items.length) {\n const i = idx++\n if (i >= items.length) break\n const r = await mapper(items[i])\n results[i] = r\n }\n }\n for (let i = 0; i < Math.min(concurrency, items.length); i++) runners.push(run())\n return Promise.all(runners).then(() => results)\n}\n\nexport class GitHubAdapter implements GitAdapter {\n private baseUrl: string\n private headers: Record<string, string>\n private _fetchWithRetry: (_: RequestInfo, __: RequestInit, ___?: number, ____?: number) => Promise<Response>\n // simple in-memory blob cache: contentSha -> blobSha\n private blobCache: Map<string, string> = new Map()\n constructor(private opts: GHOptions) {\n this.baseUrl = `https://api.github.com/repos/${opts.owner}/${opts.repo}`\n this.headers = {\n Authorization: `token ${opts.token}`,\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n }\n this._fetchWithRetry = fetchWithRetry\n }\n\n async createBlobs(changes: any[], concurrency = 5) {\n const tasks = changes.filter((c) => c.type === 'create' || c.type === 'update')\n const mapper = async (ch: any) => {\n // compute simple content hash to enable cache lookup (Web Crypto)\n const encoder = new TextEncoder()\n const data = encoder.encode(ch.content || '')\n const buf = await crypto.subtle.digest('SHA-1', data)\n const contentHash = Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, '0')).join('')\n const cached = this.blobCache.get(contentHash)\n if (cached) return { path: ch.path, sha: cached }\n const body = JSON.stringify({ content: ch.content, encoding: 'utf-8' })\n const res = await this._fetchWithRetry(`${this.baseUrl}/git/blobs`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const j = await res.json()\n if (!j.sha) throw new NonRetryableError('blob response missing sha')\n this.blobCache.set(contentHash, j.sha)\n return { path: ch.path, sha: j.sha }\n }\n\n const results = await mapWithConcurrency(tasks, mapper, concurrency)\n const map: Record<string, string> = {}\n for (const r of results) map[r.path] = r.sha\n return map\n }\n\n async createTree(changes: any[], baseTreeSha?: string) {\n const tree = [] as any[]\n for (const c of changes) {\n if (c.type === 'delete') {\n tree.push({ path: c.path, mode: '100644', sha: null })\n } else {\n if (!c.blobSha) throw new NonRetryableError(`missing blobSha for ${c.path}`)\n tree.push({ path: c.path, mode: '100644', type: 'blob', sha: c.blobSha })\n }\n }\n const body: any = { tree }\n if (baseTreeSha) body.base_tree = baseTreeSha\n const res = await this._fetchWithRetry(`${this.baseUrl}/git/trees`, { method: 'POST', headers: this.headers, body: JSON.stringify(body) }, 4, 300)\n const j = await res.json()\n if (!j.sha) throw new NonRetryableError('createTree response missing sha')\n return j.sha as string\n }\n\n async createCommit(message: string, parentSha: string, treeSha: string) {\n const body = JSON.stringify({ message, tree: treeSha, parents: [parentSha] })\n const res = await this._fetchWithRetry(`${this.baseUrl}/git/commits`, { method: 'POST', headers: this.headers, body }, 4, 300)\n const j = await res.json()\n if (!j.sha) throw new NonRetryableError('createCommit response missing sha')\n return j.sha as string\n }\n\n async updateRef(ref: string, commitSha: string, force = false) {\n const body = JSON.stringify({ sha: commitSha, force })\n const res = await this._fetchWithRetry(`${this.baseUrl}/git/refs/${ref}`, { method: 'PATCH', headers: this.headers, body }, 4, 300)\n if (!res.ok) {\n const txt = await res.text().catch(() => '')\n throw new NonRetryableError(`updateRef failed: ${res.status} ${txt}`)\n }\n }\n}\n\nexport { fetchWithRetry, classifyStatus, getDelayForResponse, processResponseWithDelay, mapWithConcurrency }\nexport default GitHubAdapter\n", "import { GitAdapter } from './adapter'\n// Use Web Crypto directly for SHA-1\n\ntype GLOpts = { projectId: string; token: string; host?: string }\n\n/**\n *\n */\nexport class GitLabAdapter implements GitAdapter {\n private baseUrl: string\n private headers: Record<string, string>\n private pendingActions: Array<{ action: string; file_path: string; content?: string }> | null = null\n private maxRetries = 3\n private baseBackoff = 300\n\n /**\n * GitLabAdapter \u3092\u521D\u671F\u5316\u3057\u307E\u3059\u3002\n * @param {GLOpts} opts \u8A2D\u5B9A\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\n */\n constructor(private opts: GLOpts) {\n const host = opts.host || 'https://gitlab.com'\n this.baseUrl = `${host}/api/v4/projects/${encodeURIComponent(opts.projectId)}`\n this.headers = { 'PRIVATE-TOKEN': opts.token, 'Content-Type': 'application/json' }\n }\n\n /**\n * \u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089 sha1 \u3092\u7B97\u51FA\u3057\u307E\u3059\u3002\n * @param {string} content \u30B3\u30F3\u30C6\u30F3\u30C4\n * @returns {string} sha1 \u30CF\u30C3\u30B7\u30E5\n */\n private async shaOf(content: string) {\n const encoder = new TextEncoder()\n const data = encoder.encode(content)\n const buf = await crypto.subtle.digest('SHA-1', data)\n return Array.from(new Uint8Array(buf)).map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n /**\n * \u5909\u66F4\u4E00\u89A7\u304B\u3089 blob sha \u306E\u30DE\u30C3\u30D7\u3092\u4F5C\u6210\u3057\u307E\u3059\uFF08\u7591\u4F3C\u5B9F\u88C5\uFF09\u3002\n * @param {any[]} changes \u5909\u66F4\u4E00\u89A7\n * @returns {Promise<Record<string,string>>} path->sha \u30DE\u30C3\u30D7\n */\n async createBlobs(changes: any[]) {\n const map: Record<string, string> = {}\n for (const c of changes) {\n if (c.type === 'create' || c.type === 'update') map[c.path] = await this.shaOf(c.content)\n }\n return map\n }\n /**\n * \u4E92\u63DB\u7528\u306E\u30C4\u30EA\u30FC\u4F5C\u6210\u3002\u5B9F\u969B\u306B\u306F actions \u3092\u4FDD\u6301\u3057\u3066\u304A\u304D\u3001\u30DE\u30FC\u30AB\u30FC\u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {any[]} _changes \u5909\u66F4\u4E00\u89A7\n * @param {string} [_baseTreeSha] \u30D9\u30FC\u30B9\u30C4\u30EA\u30FC\uFF08\u672A\u4F7F\u7528\uFF09\n * @returns {Promise<string>} \u30DE\u30FC\u30AB\u30FC\u6587\u5B57\u5217\n */\n async createTree(_changes: any[], _baseTreeSha?: string) {\n // Store actions for later commit; return marker token\n const actions = (_changes || []).map((c: any) => {\n if (c.type === 'delete') return { action: 'delete', file_path: c.path }\n if (c.type === 'create') return { action: 'create', file_path: c.path, content: c.content }\n return { action: 'update', file_path: c.path, content: c.content }\n })\n this.pendingActions = actions\n return `gitlab-tree-${Date.now()}-${Math.floor(Math.random() * 100000)}`\n }\n\n /**\n * createTree \u3067\u4FDD\u6301\u3057\u305F actions \u304C\u3042\u308C\u3070\u30B3\u30DF\u30C3\u30C8\u3057\u3001\u306A\u3051\u308C\u3070 parentSha \u3092\u8FD4\u3057\u307E\u3059\u3002\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {string} parentSha \u89AA\u30B3\u30DF\u30C3\u30C8 SHA\n * @param {string} _treeSha \u30C4\u30EA\u30FC SHA\uFF08\u672A\u4F7F\u7528\uFF09\n * @returns {Promise<string>} \u65B0\u898F\u30B3\u30DF\u30C3\u30C8 SHA \u307E\u305F\u306F parentSha\n */\n async createCommit(message: string, parentSha: string, _treeSha: string) {\n // If pendingActions exist (created via createTree), use commits API\n if (this.pendingActions && this.pendingActions.length > 0) {\n const branch = 'main'\n const res = await this.createCommitWithActions(\n branch,\n message,\n this.pendingActions.map((a) => ({ type: a.action === 'delete' ? 'delete' : a.action === 'create' ? 'create' : 'update', path: a.file_path, content: a.content }))\n )\n this.pendingActions = null\n return res\n }\n // Fallback: no-op commit (return parentSha)\n return parentSha\n }\n\n /**\n * actions \u3092\u7528\u3044\u3066 GitLab \u306E\u30B3\u30DF\u30C3\u30C8 API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\n * @param {string} branch \u30D6\u30E9\u30F3\u30C1\u540D\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {{type:string,path:string,content?:string}[]} changes \u5909\u66F4\u4E00\u89A7\n * @returns {Promise<any>} \u30B3\u30DF\u30C3\u30C8\u5FDC\u7B54\uFF08id \u306A\u3069\uFF09\n */\n async createCommitWithActions(branch: string, message: string, changes: Array<{ type: string; path: string; content?: string }>) {\n const url = `${this.baseUrl}/repository/commits`\n const actions = changes.map((c) => {\n if (c.type === 'delete') return { action: 'delete', file_path: c.path }\n if (c.type === 'create') return { action: 'create', file_path: c.path, content: c.content }\n return { action: 'update', file_path: c.path, content: c.content }\n })\n /**\n * GitLab \u306E\u30B3\u30DF\u30C3\u30C8 API \u3092\u547C\u3073\u51FA\u3057\u307E\u3059\u3002\n * @param {string} branch \u30D6\u30E9\u30F3\u30C1\u540D\n * @param {string} message \u30B3\u30DF\u30C3\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8\n * @param {{type:string,path:string,content?:string}[]} changes \u5909\u66F4\u4E00\u89A7\n * @returns {Promise<any>} \u4F5C\u6210\u3055\u308C\u305F\u30B3\u30DF\u30C3\u30C8\u306E\u8B58\u5225\u5B50\n */\n const body = JSON.stringify({ branch, commit_message: message, actions })\n\n const res = await this.fetchWithRetry(url, { method: 'POST', headers: this.headers, body })\n const text = await res.text().catch(() => '')\n let j: any = null\n try {\n j = text ? JSON.parse(text) : null\n } catch (err) {\n throw new Error(`GitLab commit invalid JSON response: ${text}`)\n }\n\n // validate expected fields (GitLab returns 'id' for commit id)\n if (!j || (!j.id && !j.commit)) {\n throw new Error(`GitLab commit unexpected response: ${JSON.stringify(j)}`)\n }\n return j.id || j.commit || j\n }\n\n /**\n * fetch \u3092\u30EA\u30C8\u30E9\u30A4\u4ED8\u304D\u3067\u5B9F\u884C\u3057\u307E\u3059\u3002\n * @param {string} url \u30EA\u30AF\u30A8\u30B9\u30C8 URL\n * @param {RequestInit} opts fetch \u30AA\u30D7\u30B7\u30E7\u30F3\n * @param {number} [retries] \u6700\u5927\u30EA\u30C8\u30E9\u30A4\u56DE\u6570\n * @returns {Promise<Response>} \u30EC\u30B9\u30DD\u30F3\u30B9\n */\n private async fetchWithRetry(url: string, opts: RequestInit, retries = this.maxRetries): Promise<Response> {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n const res = await fetch(url, opts)\n if (!this.isRetryableStatus(res.status)) return res\n if (attempt === retries) return res\n const wait = this.backoffMs(attempt)\n await new Promise((r) => setTimeout(r, wait))\n } catch (err) {\n if (attempt === retries) throw err\n const wait = this.backoffMs(attempt)\n await new Promise((r) => setTimeout(r, wait))\n }\n }\n // should not reach here\n throw new Error('fetchWithRetry: unexpected exit')\n }\n\n /**\n * \u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u518D\u8A66\u884C\u5BFE\u8C61\u304B\u5224\u5B9A\u3057\u307E\u3059\u3002\n * @param {number} status \u30B9\u30C6\u30FC\u30BF\u30B9\u30B3\u30FC\u30C9\n * @returns {boolean}\n */\n private isRetryableStatus(status: number) {\n return status === 429 || (status >= 500 && status < 600)\n }\n\n /**\n * \u30D0\u30C3\u30AF\u30AA\u30D5\u6642\u9593\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param {number} attempt \u8A66\u884C\u56DE\u6570\uFF081..\uFF09\n * @returns {number} \u30DF\u30EA\u79D2\n */\n private backoffMs(attempt: number) {\n const base = this.baseBackoff * Math.pow(2, attempt - 1)\n const jitter = Math.floor(Math.random() * base * 0.3)\n return base + jitter\n }\n\n /**\n * \u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u66F4\u65B0\u306F\u4E0D\u8981\u306A\u305F\u3081 noop \u5B9F\u88C5\u3067\u3059\u3002\n * @param {string} _ref ref \u540D\n * @param {string} _commitSha \u30B3\u30DF\u30C3\u30C8 SHA\n * @param {boolean} [_force]\n * @returns {Promise<void>}\n */\n async updateRef(_ref: string, _commitSha: string, _force = false) {\n // Not required when using commits API\n }\n}\n\nexport default GitLabAdapter\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,MAAM,mBAAmB;AAGlB,MAAM,cAAN,MAA4C;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjD,OAAO,SAAkB;AACvB,UAAI,KAAK;AACT,UAAI;AACF,cAAM,MAAO,WAAmB;AAEhC,YAAI,OAAO,IAAI,WAAW,OAAO,IAAI,QAAQ,YAAY;AAAY,eAAK;AAC1E,YAAI,OAAO,IAAI,WAAW,OAAO,IAAI,QAAQ,iBAAiB;AAAY,eAAK;AAAA,MACjF,SAAS,GAAG;AAAA,MAEZ;AACA,UAAI,CAAC,MAAO,WAAmB,2BAA2B,OAAQ,WAAmB,wBAAwB,iBAAiB;AAAY,aAAK;AAC/I,aAAO;AAAA,IACT;AAAA;AAAA,IAGA,cAAc;AAAA,IAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAMf,MAAM,OAAsB;AAAA,IAE5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAc,cAAmC;AAC/C,YAAM,MAAO,WAAmB;AAChC,UAAI,OAAO,IAAI,WAAW,OAAO,IAAI,QAAQ,iBAAiB,YAAY;AACxE,YAAI;AACF,iBAAO,MAAM,IAAI,QAAQ,aAAa;AAAA,QACxC,SAAS,GAAG;AAAA,QAEZ;AAAA,MACF;AACA,UAAI;AACF,YAAK,WAAmB,2BAA2B,OAAQ,WAAmB,wBAAwB,iBAAiB,YAAY;AACjI,iBAAO,MAAO,WAAmB,wBAAwB,aAAa;AAAA,QACxE;AAAA,MACF,SAAS,GAAG;AACV,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,UAAU,MAAW,OAA+B;AAChE,UAAI,MAAM;AACV,iBAAW,KAAK,OAAO;AACrB,YAAI,OAAO,OAAO,IAAI,uBAAuB,YAAY;AACvD,gBAAM,MAAM,IAAI,mBAAmB,GAAG,EAAE,QAAQ,KAAK,CAAC;AAAA,QACxD,WAAW,OAAO,OAAO,IAAI,iBAAiB,YAAY;AACxD,gBAAM,MAAM,IAAI,aAAa,GAAG,EAAE,QAAQ,KAAK,CAAC;AAAA,QAClD,OAAO;AACL,gBAAM,IAAI,MAAM,gBAAgB;AAAA,QAClC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,YAAuC;AAC3C,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,YAAY;AACpC,YAAI,CAAC;AAAM,iBAAO;AAClB,cAAM,KAAK,MAAM,KAAK,cAAc,OAAO;AAC3C,cAAM,OAAO,MAAM,GAAG,QAAQ;AAC9B,cAAM,MAAM,MAAM,KAAK,KAAK;AAC5B,eAAO,MAAO,KAAK,MAAM,GAAG,IAAkB;AAAA,MAChD,SAAS,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,WAAW,OAAiC;AAChD,YAAM,OAAO,MAAM,KAAK,YAAY;AACpC,UAAI,CAAC;AAAM,cAAM,IAAI,MAAM,oBAAoB;AAC/C,YAAM,KAAK,MAAM,KAAK,cAAc,SAAS,EAAE,QAAQ,KAAK,CAAC;AAC7D,YAAM,WAAW,MAAM,GAAG,eAAe;AACzC,YAAM,SAAS,MAAM,KAAK,UAAU,KAAK,CAAC;AAC1C,YAAM,SAAS,MAAM;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,UAAU,UAAkB,SAAgC;AAChE,YAAM,OAAO,MAAM,KAAK,YAAY;AACpC,UAAI,CAAC;AAAM,cAAM,IAAI,MAAM,oBAAoB;AAC/C,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,WAAW,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAChD,cAAM,SAAS,MAAM,KAAK,UAAU,MAAM,QAAQ;AAClD,cAAMA,MAAK,MAAM,OAAO,cAAc,MAAM,MAAM,SAAS,CAAC,GAAG,EAAE,QAAQ,KAAK,CAAC;AAC/E,cAAMC,YAAW,MAAMD,IAAG,eAAe;AACzC,cAAMC,UAAS,MAAM,OAAO;AAC5B,cAAMA,UAAS,MAAM;AACrB;AAAA,MACF;AACA,YAAM,KAAK,MAAM,KAAK,cAAc,UAAU,EAAE,QAAQ,KAAK,CAAC;AAC9D,YAAM,WAAW,MAAM,GAAG,eAAe;AACzC,YAAM,SAAS,MAAM,OAAO;AAC5B,YAAM,SAAS,MAAM;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,SAAS,UAA0C;AACvD,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,YAAY;AACpC,YAAI,CAAC;AAAM,iBAAO;AAClB,cAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,cAAM,MAAM,MAAM,KAAK,YAAY,MAAM,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC;AACzE,cAAM,KAAK,MAAM,IAAI,cAAc,MAAM,MAAM,SAAS,CAAC,CAAC;AAC1D,cAAM,OAAO,MAAM,GAAG,QAAQ;AAC9B,cAAM,MAAM,MAAM,KAAK,KAAK;AAC5B,eAAO,OAAO;AAAA,MAChB,SAAS,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,WAAW,UAAiC;AAChD,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,YAAY;AACpC,YAAI,CAAC;AAAM;AACX,cAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,cAAM,MAAM,MAAM,KAAK,YAAY,MAAM,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC;AACzE,cAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAI,OAAO,IAAI,gBAAgB,YAAY;AACzC,gBAAM,IAAI,YAAY,IAAI;AAC1B;AAAA,QACF;AACA,YAAI,OAAO,IAAI,kBAAkB,YAAY;AAC3C,gBAAM,KAAK,oBAAoB,KAAK,IAAI;AACxC;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAc,YAAY,MAAW,OAA+B;AAClE,UAAI,MAAM;AACV,iBAAW,KAAK,OAAO;AACrB,YAAI,OAAO,OAAO,IAAI,uBAAuB,YAAY;AACvD,gBAAM,MAAM,IAAI,mBAAmB,CAAC;AAAA,QACtC,WAAW,OAAO,OAAO,IAAI,iBAAiB,YAAY;AACxD,gBAAM,MAAM,IAAI,aAAa,CAAC;AAAA,QAChC,OAAO;AACL,gBAAM,IAAI,MAAM,gBAAgB;AAAA,QAClC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,oBAAoB,KAAU,MAAgC;AAC1E,UAAI;AACF,cAAM,KAAK,MAAM,IAAI,cAAc,IAAI;AACvC,YAAI,MAAM,OAAQ,GAAW,WAAW,YAAY;AAClD,gBAAO,GAAW,OAAO;AACzB,iBAAO;AAAA,QACT;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAO,sBAAQ;;;AChNR,MAAM,YAAN,MAAgB;AAAA,IACb;AAAA,IACA,OAAO,oBAAI,IAA8C;AAAA,IACzD,YAAY,oBAAI,IAA8C;AAAA,IAC9D,aAAa,oBAAI,IAA4B;AAAA,IAC7C,QAAmB,EAAE,MAAM,IAAI,SAAS,CAAC,EAAE;AAAA,IAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOR,YAAY,SAA6D;AACvE,WAAK,aAAa,SAAS;AAC3B,UAAI,SAAS;AAAS,aAAK,UAAU,QAAQ;AAAA;AACxC,aAAK,UAAU,IAAI,YAAY;AAAA,IACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAc,MAAM,SAAiB;AACnC,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,OAAO,QAAQ,OAAO,OAAO;AACnC,YAAM,aAAa,MAAM,OAAO,OAAO,OAAO,SAAS,IAAI;AAC3D,YAAM,YAAY,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;AACvD,aAAO,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,IACtE;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,OAAO;AACX,YAAM,KAAK,QAAQ,KAAK;AACxB,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,YAAY;AACxB,UAAI;AACF,cAAM,MAAM,MAAM,KAAK,QAAQ,UAAU;AACzC,YAAI;AAAK,eAAK,QAAQ;AAEtB,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,MAAM,OAAO,GAAG;AACvD,cAAI,EAAE,SAAS;AACb,iBAAK,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,SAAS,SAAS,GAAG,CAAC;AAAA,UAClD;AACA,cAAI,EAAE,cAAc;AAClB,iBAAK,UAAU,IAAI,GAAG,EAAE,KAAK,EAAE,cAAc,SAAS,GAAG,CAAC;AAAA,UAC5D;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,QAAQ,EAAE,MAAM,IAAI,SAAS,CAAC,EAAE;AACrC,cAAM,KAAK,UAAU;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,YAAY;AACxB,YAAM,KAAK,QAAQ,WAAW,KAAK,KAAK;AAAA,IAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,MAAM,eAAe,UAAkB,SAAiB;AACtD,YAAM,MAAM,MAAM,KAAK,MAAM,OAAO;AACpC,WAAK,UAAU,IAAI,UAAU,EAAE,KAAK,QAAQ,CAAC;AAC7C,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,WAAW,KAAK,MAAM,QAAQ,QAAQ;AAC5C,YAAM,QAAQ,YAAY,SAAS,UAAU,aAAa;AAC1D,WAAK,MAAM,QAAQ,QAAQ,IAAI;AAAA,QAC7B,MAAM;AAAA,QACN;AAAA,QACA,SAAS,UAAU;AAAA,QACnB,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAEA,YAAM,KAAK,QAAQ,UAAU,UAAU,OAAO;AAC9C,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,gBAAgB,UAAkB;AAEtC,YAAM,QAAQ,KAAK,MAAM,QAAQ,QAAQ;AACzC,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,SAAS,MAAM,SAAS;AAC1B,aAAK,WAAW,IAAI,UAAU,EAAE,MAAM,UAAU,SAAS,MAAM,SAAU,WAAW,IAAI,CAAC;AACzF,aAAK,MAAM,QAAQ,QAAQ,IAAI;AAAA,UAC7B,MAAM;AAAA,UACN,OAAO;AAAA,UACP,SAAS,MAAM;AAAA,UACf,WAAW;AAAA,QACb;AAAA,MACF,OAAO;AAEL,eAAO,KAAK,MAAM,QAAQ,QAAQ;AAClC,aAAK,UAAU,OAAO,QAAQ;AAC9B,cAAM,KAAK,QAAQ,WAAW,QAAQ;AAAA,MACxC;AACA,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,gBAAgB,MAAc,IAAY;AAE9C,YAAM,IAAI,KAAK,UAAU,IAAI,IAAI;AACjC,YAAM,UAAU,IAAI,EAAE,UAAW,KAAK,KAAK,IAAI,IAAI,GAAG,WAAW;AACjE,UAAI,YAAY;AAAM,cAAM,IAAI,MAAM,kBAAkB;AAGxD,YAAM,KAAK,eAAe,IAAI,OAAO;AAGrC,YAAM,KAAK,gBAAgB,IAAI;AAAA,IACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,cAAc,UAAkB;AACpC,YAAM,IAAI,KAAK,UAAU,IAAI,QAAQ;AACrC,UAAI;AAAG,eAAO,EAAE;AAEhB,YAAM,OAAO,MAAM,KAAK,QAAQ,SAAS,QAAQ;AACjD,UAAI,SAAS;AAAM,eAAO;AAC1B,YAAM,IAAI,KAAK,KAAK,IAAI,QAAQ;AAChC,UAAI,KAAK,EAAE;AAAS,eAAO,EAAE;AAC7B,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,kBAAkB,UAAkC,SAAiB;AAEzE,WAAK,KAAK,MAAM;AAChB,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC7C,aAAK,KAAK,IAAI,GAAG,EAAE,KAAK,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;AAEzD,cAAM,KAAK,QAAQ,UAAU,GAAG,CAAC;AAAA,MACnC;AAEA,iBAAW,CAAC,GAAG,EAAE,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,cAAM,WAAW,KAAK,MAAM,QAAQ,CAAC;AACrC,YAAI,CAAC,UAAU;AACb,eAAK,MAAM,QAAQ,CAAC,IAAI;AAAA,YACtB,MAAM;AAAA,YACN,OAAO;AAAA,YACP,SAAS,GAAG;AAAA,YACZ,WAAW,KAAK,IAAI;AAAA,UACtB;AAAA,QACF,WAAW,SAAS,UAAU,QAAQ;AACpC,mBAAS,UAAU,GAAG;AACtB,mBAAS,YAAY,KAAK,IAAI;AAAA,QAChC;AAAA,MACF;AACA,WAAK,MAAM,OAAO;AAClB,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,WAAsB;AACpB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,YAAsB;AACpB,aAAO,OAAO,KAAK,KAAK,MAAM,OAAO;AAAA,IACvC;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,gBAAkC;AAChC,aAAO,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,IAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWE,MAAM,eAAe;AAOrB,YAAM,UAAoB,CAAC;AAC3B,cAAQ,KAAK,GAAG,KAAK,uBAAuB,CAAC;AAC7C,cAAQ,KAAK,GAAG,KAAK,yBAAyB,CAAC;AAC/C,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMQ,yBAAmF;AACzF,YAAM,MAAgE,CAAC;AACvE,iBAAW,KAAK,KAAK,WAAW,OAAO;AAAG,YAAI,KAAK,EAAE,MAAM,UAAU,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,CAAC;AACvG,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMQ,2BAAkH;AACxH,YAAM,MAA6F,CAAC;AACpG,UAAI,KAAK,GAAG,KAAK,yBAAyB,CAAC;AAC3C,UAAI,KAAK,GAAG,KAAK,4BAA4B,CAAC;AAC9C,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMQ,2BAAqF;AAC3F,YAAM,MAAgE,CAAC;AACvE,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,MAAM,OAAO,GAAG;AACvD,YAAI,EAAE,UAAU,SAAS;AACvB,gBAAM,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9B,cAAI;AAAG,gBAAI,KAAK,EAAE,MAAM,UAAU,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC;AAAA,QACjE;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMQ,8BAAyG;AAC/G,YAAM,MAAiF,CAAC;AACxF,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,MAAM,OAAO,GAAG;AACvD,YAAI,EAAE,UAAU,YAAY;AAC1B,gBAAM,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9B,cAAI,KAAK,EAAE;AAAS,gBAAI,KAAK,EAAE,MAAM,UAAU,MAAM,GAAG,SAAS,EAAE,SAAS,SAAS,EAAE,QAAQ,CAAC;AAAA,QAClG;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAc,kBAAkB,GAAW,WAAmB,cAAsC,WAAmD;AACrJ,YAAM,WAAW,KAAK,MAAM,QAAQ,CAAC;AACrC,YAAM,iBAAiB,KAAK,UAAU,IAAI,CAAC;AAC3C,YAAM,YAAY,KAAK,KAAK,IAAI,CAAC;AAEjC,UAAI,CAAC;AAAU,eAAO,MAAM,KAAK,iBAAiB,GAAG,WAAW,cAAc,WAAW,gBAAgB,SAAS;AAClH,aAAO,MAAM,KAAK,sBAAsB,GAAG,UAAU,WAAW,cAAc,WAAW,cAAc;AAAA,IACzG;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,iBAAiB,GAAW,WAAmB,cAAsC,WAAmD,gBAA8D,WAAyD;AAC3Q,UAAI,gBAAgB;AAElB,kBAAU,KAAK,EAAE,MAAM,GAAG,WAAW,cAAc,eAAe,KAAK,SAAS,WAAW,IAAI,CAAC;AAAA,MAClG,OAAO;AAEL,cAAM,UAAU,aAAa,CAAC;AAC9B,aAAK,KAAK,IAAI,GAAG,EAAE,KAAK,WAAW,QAAQ,CAAC;AAC5C,aAAK,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,QAAQ,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE;AAC5F,cAAM,KAAK,QAAQ,UAAU,GAAG,OAAO;AAAA,MACzC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,sBAAsB,GAAW,UAAe,WAAmB,cAAsC,WAAmD,gBAA8D;AACtO,YAAM,UAAU,SAAS;AACzB,UAAI,YAAY;AAAW;AAE3B,UAAI,CAAC,kBAAkB,eAAe,QAAQ,SAAS;AAErD,cAAM,UAAU,aAAa,CAAC;AAC9B,aAAK,KAAK,IAAI,GAAG,EAAE,KAAK,WAAW,QAAQ,CAAC;AAC5C,iBAAS,UAAU;AACnB,iBAAS,QAAQ;AACjB,iBAAS,YAAY,KAAK,IAAI;AAC9B,cAAM,KAAK,QAAQ,UAAU,GAAG,OAAO;AAAA,MACzC,OAAO;AAEL,kBAAU,KAAK,EAAE,MAAM,GAAG,SAAS,WAAW,cAAc,gBAAgB,IAAI,CAAC;AAAA,MACnF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAc,oBAAoB,IAAS;AACzC,UAAI,GAAG,SAAS,YAAY,GAAG,SAAS,UAAU;AAChD,cAAM,MAAM,MAAM,KAAK,MAAM,GAAG,OAAO;AACvC,aAAK,KAAK,IAAI,GAAG,MAAM,EAAE,KAAK,SAAS,GAAG,QAAQ,CAAC;AACnD,cAAM,QAAQ,KAAK,MAAM,QAAQ,GAAG,IAAI,KAAM,EAAE,MAAM,GAAG,KAAK;AAC9D,cAAM,UAAU;AAChB,cAAM,QAAQ;AACd,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,eAAe;AACrB,aAAK,MAAM,QAAQ,GAAG,IAAI,IAAI;AAC9B,cAAM,KAAK,QAAQ,UAAU,GAAG,MAAM,GAAG,OAAO;AAChD,aAAK,UAAU,OAAO,GAAG,IAAI;AAAA,MAC/B,WAAW,GAAG,SAAS,UAAU;AAC/B,eAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;AACjC,aAAK,KAAK,OAAO,GAAG,IAAI;AACxB,aAAK,WAAW,OAAO,GAAG,IAAI;AAC9B,cAAM,KAAK,QAAQ,WAAW,GAAG,IAAI;AACrC,aAAK,UAAU,OAAO,GAAG,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,sBAAsB,GAAW,GAAQ,aAAqC,WAAmD;AAC7I,YAAM,iBAAiB,KAAK,UAAU,IAAI,CAAC;AAC3C,UAAI,CAAC,kBAAkB,eAAe,QAAQ,EAAE,SAAS;AAEvD,eAAO,KAAK,MAAM,QAAQ,CAAC;AAC3B,aAAK,KAAK,OAAO,CAAC;AAClB,cAAM,KAAK,QAAQ,WAAW,CAAC;AAAA,MACjC,OAAO;AACL,kBAAU,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,cAAc,gBAAgB,IAAI,CAAC;AAAA,MACnF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,iBAAiB,SAAc,OAAY,QAAgB;AACvE,YAAM,YAAY,MAAM,QAAQ,wBAAwB,QAAQ,MAAM,SAAS,MAAM,OAAgB;AACrG,UAAI;AACF,cAAM,QAAQ,UAAU,SAAS,MAAM,IAAI,SAAS;AAAA,MACtD,SAAS,GAAG;AAAA,MAEZ;AACA,iBAAW,MAAM,MAAM,SAAkB;AACvC,cAAM,KAAK,oBAAoB,EAAE;AAAA,MACnC;AACA,WAAK,MAAM,OAAO;AAClB,YAAM,KAAK,UAAU;AACrB,aAAO,EAAE,UAAU;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAc,oBAAoB,SAAc,OAAY,QAAgB;AAC1E,YAAM,UAAU,MAAM,QAAQ,YAAY,MAAM,OAAgB;AAChE,YAAM,kBAAmB,MAAM,QAAkB,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,SAAS,QAAQ,EAAE,IAAI,EAAE,EAAE;AAChG,YAAM,UAAU,MAAM,QAAQ,WAAW,eAAe;AACxD,YAAM,YAAY,MAAM,QAAQ,aAAa,MAAM,SAAS,MAAM,WAAW,OAAO;AACpF,UAAI;AACF,cAAM,QAAQ,UAAU,SAAS,MAAM,IAAI,SAAS;AAAA,MACtD,SAAS,GAAG;AAAA,MAEZ;AACA,iBAAW,MAAM,MAAM,SAAkB;AACvC,cAAM,KAAK,oBAAoB,EAAE;AAAA,MACnC;AACA,WAAK,MAAM,OAAO;AAClB,YAAM,KAAK,UAAU;AACrB,aAAO,EAAE,UAAU;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,KAAK,YAAoB,cAAsC;AACnE,YAAM,YAAoD,CAAC;AAG3D,YAAM,aAAqC,CAAC;AAC5C,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,YAAY,GAAG;AACjD,mBAAW,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC;AAAA,MACpC;AAGA,iBAAW,CAAC,GAAG,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD,cAAM,KAAK,kBAAkB,GAAG,WAAW,cAAc,SAAS;AAAA,MACpE;AAGA,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,MAAM,OAAO,GAAG;AACvD,YAAI,EAAE,KAAK,aAAa;AACtB,gBAAM,KAAK,sBAAsB,GAAG,GAAG,YAAY,SAAS;AAAA,QAC9D;AAAA,MACF;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,aAAK,MAAM,OAAO;AAClB,cAAM,KAAK,UAAU;AAAA,MACvB;AAEA,aAAO,EAAE,UAAU;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,KAAK,OAAsC,SAA+C;AAE9F,UAAI,MAAM,cAAc,KAAK,MAAM,MAAM;AACvC,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AAGA,UAAI,CAAC,MAAM,WAAW;AAEpB,cAAM,YAAY,MAAM,KAAK,MAAM,MAAM,YAAY,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,MACpF;AAGA,UAAI,CAAC,MAAM,WAAW,MAAM,QAAQ,WAAW;AAAG,cAAM,IAAI,MAAM,sBAAsB;AAGxF,UAAI,SAAS;AACX,cAAM,SAAU,MAAc,OAAO;AACrC,cAAM,iBAAiB,GAAG,MAAM,OAAO;AAAA;AAAA,oBAAyB,MAAM,SAAS;AAG/E,YAAK,QAAgB,yBAAyB;AAE5C,UAAC,MAAc,UAAU;AACzB,gBAAMC,OAAM,MAAM,KAAK,iBAAiB,SAAS,OAAO,MAAM;AAE9D,eAAK,MAAM,gBAAgB,MAAM;AACjC,iBAAOA;AAAA,QACT;AAGA,QAAC,MAAc,UAAU;AACzB,cAAM,MAAM,MAAM,KAAK,oBAAoB,SAAS,OAAO,MAAM;AACjE,aAAK,MAAM,gBAAgB,MAAM;AACjC,eAAO;AAAA,MACT;AAGA,YAAM,YAAY,MAAM,KAAK,MAAM,MAAM,YAAY,MAAM,MAAM,SAAS;AAE1E,iBAAW,MAAM,MAAM,SAAkB;AACvC,cAAM,KAAK,oBAAoB,EAAE;AAAA,MACnC;AAEA,WAAK,MAAM,OAAO;AAClB,WAAK,MAAM,gBAAgB,MAAM;AACjC,YAAM,KAAK,UAAU;AAErB,aAAO,EAAE,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,MAAO,oBAAQ;;;ACtgBR,MAAM,mBAAN,MAAiD;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtD,OAAO,SAAkB;AACvB,UAAI;AACF,eAAO,CAAC,CAAE,WAAmB;AAAA,MAC/B,SAAS,GAAG;AACV,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACQ,SAAS;AAAA,IACT;AAAA;AAAA,IAGR,cAAc;AACZ,WAAK,YAAY,KAAK,OAAO;AAAA,IAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,OAAsB;AAC1B,YAAM,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMQ,SAA+B;AACrC,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,MAAO,WAAmB;AAChC,YAAI,CAAC;AAAK,iBAAO,OAAO,IAAI,MAAM,4BAA4B,CAAC;AAC/D,cAAM,MAAM,IAAI,KAAK,KAAK,QAAQ,CAAC;AAMnC,iBAAS,cAAc,IAAS;AAC9B,gBAAM,KAAM,GAAG,OAA4B;AAC3C,cAAI,CAAC,GAAG,iBAAiB,SAAS,OAAO;AAAG,eAAG,kBAAkB,OAAO;AACxE,cAAI,CAAC,GAAG,iBAAiB,SAAS,OAAO;AAAG,eAAG,kBAAkB,OAAO;AAAA,QAC1E;AACA,YAAI,kBAAkB;AAWtB,iBAAS,yBAAyB,SAAsB;AACtD,iBAAO,WAAY;AAAE,gBAAI;AAAE,sBAAQ,MAAM;AAAA,YAAE,SAAS,GAAG;AAAA,YAAS;AAAA,UAAE;AAAA,QACpE;AAMA,iBAAS,gBAAgB;AACvB,gBAAM,KAAK,IAAI;AACf,cAAI;AACF,eAAG,kBAAkB,yBAAyB,EAAE;AAAA,UAClD,SAAS,GAAG;AAAA,UAAS;AACrB,kBAAQ,EAAE;AAAA,QACZ;AAGA,iBAAS,cAAc;AAAE,iBAAO,IAAI,KAAK;AAAA,QAAE;AAE3C,YAAI,YAAY;AAChB,YAAI,UAAU;AAAA,MAChB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,MAAc,GAAG,WAAmB,MAA0B,IAAqE;AAKjI,YAAM,UAAU,YAA2B;AACzC,cAAM,KAAK,MAAM,KAAK;AACtB,eAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,cAAI;AACJ,cAAI;AAAE,iBAAK,GAAG,YAAY,WAAW,IAAI;AAAA,UAAE,SAAS,KAAK;AAAE,mBAAO,OAAO,GAAG;AAAA,UAAE;AAC9E,gBAAM,WAAW,GAAG,YAAY,SAAS;AAGzC,mBAAS,mBAAmB;AAAE,oBAAQ;AAAA,UAAE;AAGxC,mBAAS,gBAAgB;AAAE,mBAAO,GAAG,KAAK;AAAA,UAAE;AAE5C,kBAAQ,QAAQ,GAAG,QAAQ,CAAC,EAAE,KAAK,MAAM;AACvC,eAAG,aAAa;AAChB,eAAG,UAAU;AAAA,UACf,CAAC,EAAE,MAAM,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAEA,UAAI;AAAE,eAAO,MAAM,QAAQ;AAAA,MAAE,SAAS,KAAU;AAC9C,cAAM,iBAAiB,QAAQ,IAAI,SAAS,uBAAuB,WAAW,KAAK,OAAO,IAAI,WAAW,EAAE,CAAC;AAC5G,YAAI,gBAAgB;AAAE,eAAK,YAAY,KAAK,OAAO;AAAG,iBAAO,MAAM,QAAQ;AAAA,QAAE;AAC7E,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,YAAuC;AAC3C,YAAM,KAAK,MAAM,KAAK;AACtB,aAAO,IAAI,QAA0B,CAAC,SAAS,WAAW;AACxD,cAAM,KAAK,GAAG,YAAY,SAAS,UAAU;AAC7C,cAAM,QAAQ,GAAG,YAAY,OAAO;AACpC,cAAM,MAAM,MAAM,IAAI,OAAO;AAG7B,iBAAS,qBAAqB;AAAE,kBAAQ,IAAI,UAAU,IAAI;AAAA,QAAE;AAG5D,iBAAS,mBAAmB;AAAE,iBAAO,IAAI,KAAK;AAAA,QAAE;AAEhD,YAAI,YAAY;AAChB,YAAI,UAAU;AAAA,MAChB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,WAAW,OAAiC;AAChD,YAAM,KAAK,GAAG,SAAS,aAAa,CAAC,UAAU;AAAE,cAAM,IAAI,OAAO,OAAO;AAAA,MAAE,CAAC;AAAA,IAC9E;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,UAAU,UAAkB,SAAgC;AAChE,YAAM,KAAK,GAAG,SAAS,aAAa,CAAC,UAAU;AAAE,cAAM,IAAI,SAAS,QAAQ;AAAA,MAAE,CAAC;AAAA,IACjF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,SAAS,UAA0C;AACvD,YAAM,KAAK,MAAM,KAAK;AACtB,aAAO,IAAI,QAAuB,CAAC,SAAS,WAAW;AACrD,cAAM,KAAK,GAAG,YAAY,SAAS,UAAU;AAC7C,cAAM,QAAQ,GAAG,YAAY,OAAO;AACpC,cAAM,MAAM,MAAM,IAAI,QAAQ;AAG9B,iBAAS,oBAAoB;AAAE,kBAAQ,IAAI,UAAU,IAAI;AAAA,QAAE;AAG3D,iBAAS,kBAAkB;AAAE,iBAAO,IAAI,KAAK;AAAA,QAAE;AAE/C,YAAI,YAAY;AAChB,YAAI,UAAU;AAAA,MAChB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,WAAW,UAAiC;AAChD,YAAM,KAAK,GAAG,SAAS,aAAa,CAAC,UAAU;AAAE,cAAM,OAAO,QAAQ;AAAA,MAAE,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,MAAO,2BAAQ;;;AC3LR,MAAM,iBAAN,cAA6B,MAAM;AAAA,EAAC;AAKpC,MAAM,oBAAN,cAAgC,MAAM;AAAA,EAAC;AAM9C,WAAS,MAAM,IAAY;AACzB,WAAO,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,EAAE,CAAC;AAAA,EACjD;AAWA,iBAAe,eAAe,OAAoB,MAAmB,WAAW,GAAG,YAAY,KAAK;AAClG,QAAI;AACJ,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,OAAO,IAAI;AACnC,eAAO,MAAM,yBAAyB,KAAK,GAAG,SAAS;AAAA,MAEzD,SAAS,KAAK;AACZ,YAAI,eAAe;AAAmB,gBAAM;AAC5C,kBAAU;AACV,cAAM,MAAM,oBAAoB,MAAM,GAAG,SAAS,CAAC;AAAA,MACrD;AAAA,IACF;AACA,UAAM,IAAI,eAAe,gBAAgB,QAAQ,cAAc,OAAO,EAAE;AAAA,EAC1E;AAEA,WAAS,eAAe,QAAgB;AACtC,WAAO,UAAU,OAAO,WAAW;AAAA,EACrC;AAEA,WAAS,oBAAoB,KAAsB,GAAW,WAAmB;AAC/E,QAAI,CAAC;AAAK,aAAO,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI;AAC9D,UAAM,aAAa,IAAI,QAAQ,IAAI,aAAa;AAChD,WAAO,aAAa,OAAO,UAAU,IAAI,MAAO,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI;AAAA,EAC/F;AAEA,iBAAe,yBAAyB,KAAe,GAAW,WAAmB;AACnF,QAAI,IAAI;AAAI,aAAO;AACnB,QAAI,eAAe,IAAI,MAAM,GAAG;AAC9B,YAAM,MAAM,oBAAoB,KAAK,GAAG,SAAS,CAAC;AAClD,YAAM,IAAI,eAAe,QAAQ,IAAI,MAAM,EAAE;AAAA,IAC/C;AACA,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC3C,UAAM,IAAI,kBAAkB,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE;AAAA,EAC1D;AASA,WAAS,mBAAyB,OAAY,QAA+B,cAAc,GAAG;AAC5F,UAAM,UAAe,CAAC;AACtB,QAAI,MAAM;AACV,UAAM,UAA2B,CAAC;AAClC,UAAM,MAAM,YAAY;AACtB,aAAO,MAAM,MAAM,QAAQ;AACzB,cAAM,IAAI;AACV,YAAI,KAAK,MAAM;AAAQ;AACvB,cAAM,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;AAC/B,gBAAQ,CAAC,IAAI;AAAA,MACf;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,MAAM,MAAM,GAAG;AAAK,cAAQ,KAAK,IAAI,CAAC;AAChF,WAAO,QAAQ,IAAI,OAAO,EAAE,KAAK,MAAM,OAAO;AAAA,EAChD;AAEO,MAAM,gBAAN,MAA0C;AAAA,IAM/C,YAAoB,MAAiB;AAAjB;AAClB,WAAK,UAAU,gCAAgC,KAAK,KAAK,IAAI,KAAK,IAAI;AACtE,WAAK,UAAU;AAAA,QACb,eAAe,SAAS,KAAK,KAAK;AAAA,QAClC,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AACA,WAAK,kBAAkB;AAAA,IACzB;AAAA,IAbQ;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA,YAAiC,oBAAI,IAAI;AAAA,IAWjD,MAAM,YAAY,SAAgB,cAAc,GAAG;AACjD,YAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,QAAQ;AAC9E,YAAM,SAAS,OAAO,OAAY;AAEhC,cAAM,UAAU,IAAI,YAAY;AAChC,cAAM,OAAO,QAAQ,OAAO,GAAG,WAAW,EAAE;AAC5C,cAAM,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,IAAI;AACpD,cAAM,cAAc,MAAM,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACvG,cAAM,SAAS,KAAK,UAAU,IAAI,WAAW;AAC7C,YAAI;AAAQ,iBAAO,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO;AAChD,cAAM,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG,SAAS,UAAU,QAAQ,CAAC;AACtE,cAAM,MAAM,MAAM,KAAK,gBAAgB,GAAG,KAAK,OAAO,cAAc,EAAE,QAAQ,QAAQ,SAAS,KAAK,SAAS,KAAK,GAAG,GAAG,GAAG;AAC3H,cAAM,IAAI,MAAM,IAAI,KAAK;AACzB,YAAI,CAAC,EAAE;AAAK,gBAAM,IAAI,kBAAkB,2BAA2B;AACnE,aAAK,UAAU,IAAI,aAAa,EAAE,GAAG;AACrC,eAAO,EAAE,MAAM,GAAG,MAAM,KAAK,EAAE,IAAI;AAAA,MACrC;AAEA,YAAM,UAAU,MAAM,mBAAmB,OAAO,QAAQ,WAAW;AACnE,YAAM,MAA8B,CAAC;AACrC,iBAAW,KAAK;AAAS,YAAI,EAAE,IAAI,IAAI,EAAE;AACzC,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAW,SAAgB,aAAsB;AACrD,YAAM,OAAO,CAAC;AACd,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,SAAS,UAAU;AACvB,eAAK,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,UAAU,KAAK,KAAK,CAAC;AAAA,QACvD,OAAO;AACL,cAAI,CAAC,EAAE;AAAS,kBAAM,IAAI,kBAAkB,uBAAuB,EAAE,IAAI,EAAE;AAC3E,eAAK,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,QAAQ,CAAC;AAAA,QAC1E;AAAA,MACF;AACA,YAAM,OAAY,EAAE,KAAK;AACzB,UAAI;AAAa,aAAK,YAAY;AAClC,YAAM,MAAM,MAAM,KAAK,gBAAgB,GAAG,KAAK,OAAO,cAAc,EAAE,QAAQ,QAAQ,SAAS,KAAK,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE,GAAG,GAAG,GAAG;AACjJ,YAAM,IAAI,MAAM,IAAI,KAAK;AACzB,UAAI,CAAC,EAAE;AAAK,cAAM,IAAI,kBAAkB,iCAAiC;AACzE,aAAO,EAAE;AAAA,IACX;AAAA,IAEA,MAAM,aAAa,SAAiB,WAAmB,SAAiB;AACtE,YAAM,OAAO,KAAK,UAAU,EAAE,SAAS,MAAM,SAAS,SAAS,CAAC,SAAS,EAAE,CAAC;AAC5E,YAAM,MAAM,MAAM,KAAK,gBAAgB,GAAG,KAAK,OAAO,gBAAgB,EAAE,QAAQ,QAAQ,SAAS,KAAK,SAAS,KAAK,GAAG,GAAG,GAAG;AAC7H,YAAM,IAAI,MAAM,IAAI,KAAK;AACzB,UAAI,CAAC,EAAE;AAAK,cAAM,IAAI,kBAAkB,mCAAmC;AAC3E,aAAO,EAAE;AAAA,IACX;AAAA,IAEA,MAAM,UAAU,KAAa,WAAmB,QAAQ,OAAO;AAC7D,YAAM,OAAO,KAAK,UAAU,EAAE,KAAK,WAAW,MAAM,CAAC;AACrD,YAAM,MAAM,MAAM,KAAK,gBAAgB,GAAG,KAAK,OAAO,aAAa,GAAG,IAAI,EAAE,QAAQ,SAAS,SAAS,KAAK,SAAS,KAAK,GAAG,GAAG,GAAG;AAClI,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC3C,cAAM,IAAI,kBAAkB,qBAAqB,IAAI,MAAM,IAAI,GAAG,EAAE;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAGA,MAAO,wBAAQ;;;ACpKR,MAAM,gBAAN,MAA0C;AAAA;AAAA;AAAA;AAAA;AAAA,IAW/C,YAAoB,MAAc;AAAd;AAClB,YAAM,OAAO,KAAK,QAAQ;AAC1B,WAAK,UAAU,GAAG,IAAI,oBAAoB,mBAAmB,KAAK,SAAS,CAAC;AAC5E,WAAK,UAAU,EAAE,iBAAiB,KAAK,OAAO,gBAAgB,mBAAmB;AAAA,IACnF;AAAA,IAdQ;AAAA,IACA;AAAA,IACA,iBAAwF;AAAA,IACxF,aAAa;AAAA,IACb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBtB,MAAc,MAAM,SAAiB;AACnC,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,OAAO,QAAQ,OAAO,OAAO;AACnC,YAAM,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,IAAI;AACpD,aAAO,MAAM,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,IAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,YAAY,SAAgB;AAChC,YAAM,MAA8B,CAAC;AACrC,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,SAAS,YAAY,EAAE,SAAS;AAAU,cAAI,EAAE,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,OAAO;AAAA,MAC1F;AACA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,WAAW,UAAiB,cAAuB;AAEvD,YAAM,WAAW,YAAY,CAAC,GAAG,IAAI,CAAC,MAAW;AAC/C,YAAI,EAAE,SAAS;AAAU,iBAAO,EAAE,QAAQ,UAAU,WAAW,EAAE,KAAK;AACtE,YAAI,EAAE,SAAS;AAAU,iBAAO,EAAE,QAAQ,UAAU,WAAW,EAAE,MAAM,SAAS,EAAE,QAAQ;AAC1F,eAAO,EAAE,QAAQ,UAAU,WAAW,EAAE,MAAM,SAAS,EAAE,QAAQ;AAAA,MACnE,CAAC;AACD,WAAK,iBAAiB;AACtB,aAAO,eAAe,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAM,CAAC;AAAA,IACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAM,aAAa,SAAiB,WAAmB,UAAkB;AAEvE,UAAI,KAAK,kBAAkB,KAAK,eAAe,SAAS,GAAG;AACzD,cAAM,SAAS;AACf,cAAM,MAAM,MAAM,KAAK;AAAA,UACrB;AAAA,UACA;AAAA,UACA,KAAK,eAAe,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,WAAW,WAAW,EAAE,WAAW,WAAW,WAAW,UAAU,MAAM,EAAE,WAAW,SAAS,EAAE,QAAQ,EAAE;AAAA,QAClK;AACA,aAAK,iBAAiB;AACtB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAM,wBAAwB,QAAgB,SAAiB,SAAkE;AAC/H,YAAM,MAAM,GAAG,KAAK,OAAO;AAC3B,YAAM,UAAU,QAAQ,IAAI,CAAC,MAAM;AACjC,YAAI,EAAE,SAAS;AAAU,iBAAO,EAAE,QAAQ,UAAU,WAAW,EAAE,KAAK;AACtE,YAAI,EAAE,SAAS;AAAU,iBAAO,EAAE,QAAQ,UAAU,WAAW,EAAE,MAAM,SAAS,EAAE,QAAQ;AAC1F,eAAO,EAAE,QAAQ,UAAU,WAAW,EAAE,MAAM,SAAS,EAAE,QAAQ;AAAA,MACnE,CAAC;AAQD,YAAM,OAAO,KAAK,UAAU,EAAE,QAAQ,gBAAgB,SAAS,QAAQ,CAAC;AAExE,YAAM,MAAM,MAAM,KAAK,eAAe,KAAK,EAAE,QAAQ,QAAQ,SAAS,KAAK,SAAS,KAAK,CAAC;AAC1F,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAI,IAAS;AACb,UAAI;AACF,YAAI,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,MAChC,SAAS,KAAK;AACZ,cAAM,IAAI,MAAM,wCAAwC,IAAI,EAAE;AAAA,MAChE;AAGA,UAAI,CAAC,KAAM,CAAC,EAAE,MAAM,CAAC,EAAE,QAAS;AAC9B,cAAM,IAAI,MAAM,sCAAsC,KAAK,UAAU,CAAC,CAAC,EAAE;AAAA,MAC3E;AACA,aAAO,EAAE,MAAM,EAAE,UAAU;AAAA,IAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAc,eAAe,KAAa,MAAmB,UAAU,KAAK,YAA+B;AACzG,eAAS,UAAU,GAAG,WAAW,SAAS,WAAW;AACnD,YAAI;AACF,gBAAM,MAAM,MAAM,MAAM,KAAK,IAAI;AACjC,cAAI,CAAC,KAAK,kBAAkB,IAAI,MAAM;AAAG,mBAAO;AAChD,cAAI,YAAY;AAAS,mBAAO;AAChC,gBAAM,OAAO,KAAK,UAAU,OAAO;AACnC,gBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAAA,QAC9C,SAAS,KAAK;AACZ,cAAI,YAAY;AAAS,kBAAM;AAC/B,gBAAM,OAAO,KAAK,UAAU,OAAO;AACnC,gBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,kBAAkB,QAAgB;AACxC,aAAO,WAAW,OAAQ,UAAU,OAAO,SAAS;AAAA,IACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,UAAU,SAAiB;AACjC,YAAM,OAAO,KAAK,cAAc,KAAK,IAAI,GAAG,UAAU,CAAC;AACvD,YAAM,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,OAAO,GAAG;AACpD,aAAO,OAAO;AAAA,IAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAM,UAAU,MAAc,YAAoB,SAAS,OAAO;AAAA,IAElE;AAAA,EACF;AAEA,MAAO,wBAAQ;",
6
+ "names": ["fh", "writable", "res"]
7
+ }