@libraz/libsonare 1.8.0 → 1.8.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.
- package/README.md +5 -5
- package/dist/_effects_common.d.ts +2 -1
- package/dist/_effects_common.d.ts.map +1 -1
- package/dist/analysis.js +3 -0
- package/dist/analysis.js.map +1 -1
- package/dist/effects_mastering.d.ts +2 -2
- package/dist/effects_mastering.d.ts.map +1 -1
- package/dist/effects_note_ops.d.ts +55 -30
- package/dist/effects_note_ops.d.ts.map +1 -1
- package/dist/effects_timepitch.d.ts +17 -12
- package/dist/effects_timepitch.d.ts.map +1 -1
- package/dist/feature_decompose.d.ts +1 -1
- package/dist/feature_decompose.d.ts.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2098 -155
- package/dist/index.js.map +1 -1
- package/dist/instrument_types.d.ts +27 -3
- package/dist/instrument_types.d.ts.map +1 -1
- package/dist/mastering_core.d.ts +30 -3
- package/dist/mastering_core.d.ts.map +1 -1
- package/dist/mixer.d.ts +2 -2
- package/dist/mixer.d.ts.map +1 -1
- package/dist/project.d.ts +5 -4
- package/dist/project.d.ts.map +1 -1
- package/dist/project_class.d.ts +57 -3
- package/dist/project_class.d.ts.map +1 -1
- package/dist/project_internal.d.ts +35 -1
- package/dist/project_internal.d.ts.map +1 -1
- package/dist/project_types.d.ts +17 -6
- package/dist/project_types.d.ts.map +1 -1
- package/dist/public_types.d.ts +1 -0
- package/dist/public_types.d.ts.map +1 -1
- package/dist/public_types_mastering.d.ts +19 -1
- package/dist/public_types_mastering.d.ts.map +1 -1
- package/dist/public_types_playback.d.ts +1 -0
- package/dist/public_types_playback.d.ts.map +1 -1
- package/dist/public_types_spectral.d.ts +5 -5
- package/dist/public_types_spectral.d.ts.map +1 -1
- package/dist/public_types_vocal_edit.d.ts +250 -0
- package/dist/public_types_vocal_edit.d.ts.map +1 -0
- package/dist/public_types_vocal_project.d.ts +63 -0
- package/dist/public_types_vocal_project.d.ts.map +1 -0
- package/dist/realtime_engine.d.ts +106 -16
- package/dist/realtime_engine.d.ts.map +1 -1
- package/dist/repair_dereverb.d.ts +1 -0
- package/dist/repair_dereverb.d.ts.map +1 -1
- package/dist/repair_noise.d.ts +1 -0
- package/dist/repair_noise.d.ts.map +1 -1
- package/dist/sonare-analysis.wasm +0 -0
- package/dist/sonare.d.ts +89 -0
- package/dist/sonare.js +1 -1
- package/dist/sonare.wasm +0 -0
- package/dist/streaming_processors.d.ts +5 -0
- package/dist/streaming_processors.d.ts.map +1 -1
- package/dist/vocal_edit.d.ts +131 -0
- package/dist/vocal_edit.d.ts.map +1 -0
- package/dist/vocal_edit_worker.d.ts +51 -0
- package/dist/vocal_edit_worker.d.ts.map +1 -0
- package/dist/vocal_edit_worker.js +1462 -0
- package/dist/vocal_edit_worker.js.map +1 -0
- package/dist/vocal_edit_worker_client.d.ts +118 -0
- package/dist/vocal_edit_worker_client.d.ts.map +1 -0
- package/dist/vocal_edit_worker_protocol.d.ts +139 -0
- package/dist/vocal_edit_worker_protocol.d.ts.map +1 -0
- package/dist/vocal_project.d.ts +17 -0
- package/dist/vocal_project.d.ts.map +1 -0
- package/dist/web_midi.d.ts +4 -0
- package/dist/web_midi.d.ts.map +1 -1
- package/dist/worker.js.map +1 -1
- package/dist/worklet/engine-mixer-facade.d.ts +42 -5
- package/dist/worklet/engine-mixer-facade.d.ts.map +1 -1
- package/dist/worklet/engine-node.d.ts +10 -0
- package/dist/worklet/engine-node.d.ts.map +1 -1
- package/dist/worklet/engine-processor.d.ts +6 -1
- package/dist/worklet/engine-processor.d.ts.map +1 -1
- package/dist/worklet/engine-register.d.ts.map +1 -1
- package/dist/worklet/engine-strips.d.ts +8 -4
- package/dist/worklet/engine-strips.d.ts.map +1 -1
- package/dist/worklet/engine-sync.d.ts +4 -2
- package/dist/worklet/engine-sync.d.ts.map +1 -1
- package/dist/worklet/engine.d.ts +42 -9
- package/dist/worklet/engine.d.ts.map +1 -1
- package/dist/worklet/guards.d.ts +10 -2
- package/dist/worklet/guards.d.ts.map +1 -1
- package/dist/worklet/messages.d.ts +54 -9
- package/dist/worklet/messages.d.ts.map +1 -1
- package/dist/worklet/mixer-processor.d.ts +2 -2
- package/dist/worklet/mixer-processor.d.ts.map +1 -1
- package/dist/worklet/protocol.d.ts +20 -2
- package/dist/worklet/protocol.d.ts.map +1 -1
- package/dist/worklet.d.ts +1 -1
- package/dist/worklet.d.ts.map +1 -1
- package/dist/worklet.js +808 -204
- package/dist/worklet.js.map +1 -1
- package/package.json +6 -1
- package/src/_effects_common.ts +36 -6
- package/src/effects_mastering.ts +4 -0
- package/src/effects_note_ops.ts +92 -44
- package/src/effects_timepitch.ts +42 -31
- package/src/feature_decompose.ts +2 -2
- package/src/index.ts +39 -0
- package/src/instrument_types.ts +29 -3
- package/src/mastering_core.ts +98 -2
- package/src/mixer.ts +41 -21
- package/src/project.ts +8 -1
- package/src/project_class.ts +136 -1
- package/src/project_internal.ts +90 -0
- package/src/project_types.ts +18 -6
- package/src/public_types.ts +1 -0
- package/src/public_types_mastering.ts +23 -0
- package/src/public_types_playback.ts +1 -0
- package/src/public_types_spectral.ts +5 -5
- package/src/public_types_vocal_edit.ts +289 -0
- package/src/public_types_vocal_project.ts +69 -0
- package/src/realtime_engine.ts +157 -24
- package/src/repair_dereverb.ts +1 -0
- package/src/repair_noise.ts +1 -0
- package/src/sonare.js.d.ts +89 -0
- package/src/streaming_processors.ts +8 -0
- package/src/vocal_edit.ts +885 -0
- package/src/vocal_edit_worker.ts +832 -0
- package/src/vocal_edit_worker_client.ts +812 -0
- package/src/vocal_edit_worker_protocol.ts +206 -0
- package/src/vocal_project.ts +327 -0
- package/src/web_midi.ts +100 -5
- package/src/worklet/engine-mixer-facade.ts +422 -87
- package/src/worklet/engine-node.ts +69 -4
- package/src/worklet/engine-processor.ts +129 -34
- package/src/worklet/engine-register.ts +3 -0
- package/src/worklet/engine-strips.ts +36 -14
- package/src/worklet/engine-sync.ts +6 -1
- package/src/worklet/engine.ts +76 -40
- package/src/worklet/guards.ts +81 -0
- package/src/worklet/messages.ts +63 -4
- package/src/worklet/mixer-processor.ts +10 -3
- package/src/worklet/protocol.ts +39 -8
- package/src/worklet.ts +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/module_state.ts","../src/vocal_edit.ts","../src/vocal_edit_worker_protocol.ts","../src/index.ts","../src/vocal_edit_worker.ts"],"sourcesContent":["/**\n * Numeric error codes carried by a {@link SonareError}. Mirrors the C ABI\n * `SonareError` enum (and the Node / Python surfaces), so the same failure\n * reports the same numeric code on every binding.\n */\nexport enum ErrorCode {\n Ok = 0,\n FileNotFound = 1,\n InvalidFormat = 2,\n DecodeFailed = 3,\n InvalidParameter = 4,\n OutOfMemory = 5,\n NotSupported = 6,\n InvalidState = 7,\n Cancelled = 8,\n EncodeFailed = 9,\n Unknown = 99,\n}\n\n/**\n * Error thrown by libsonare on a native (C++) failure. Carries a numeric\n * {@link ErrorCode} `code` plus its canonical `codeName`, so callers can branch\n * on the cause instead of matching message text.\n *\n * Narrow a caught value with {@link isSonareError} or with `instanceof`; both\n * accept the same values. The Node package exports the same class under the\n * same name.\n */\nexport class SonareError extends Error {\n /** Numeric error code, equal to an {@link ErrorCode} value. */\n readonly code: number;\n /** Canonical name of `code`, e.g. `'InvalidParameter'`. */\n readonly codeName: string;\n\n constructor(code: number, codeName: string, message: string) {\n super(message);\n this.name = 'SonareError';\n this.code = code;\n this.codeName = codeName;\n }\n\n /**\n * Brand-based `instanceof`: an error that carries the shape narrows here even\n * when it is not literally an instance of this class. That is not a\n * hypothetical — an error posted from the analysis worker arrives as a\n * structured clone with its prototype gone, which a prototype-based\n * `instanceof` would silently miss. Delegates to {@link isSonareError} so the\n * two never disagree.\n */\n static [Symbol.hasInstance](value: unknown): value is SonareError {\n return isSonareError(value);\n }\n}\n\n/**\n * Type guard: whether a caught value is a libsonare {@link SonareError}.\n *\n * Duck-typed on purpose: a value that crossed a worker boundary has lost its\n * prototype, so a prototype check would miss it.\n */\nexport function isSonareError(value: unknown): value is SonareError {\n return (\n value instanceof Error &&\n (value as { name?: unknown }).name === 'SonareError' &&\n typeof (value as { code?: unknown }).code === 'number'\n );\n}\n","import { ErrorCode, SonareError } from './errors';\nimport type { SonareModule } from './sonare.js';\n\nlet wrappedModule: SonareModule | null = null;\n\n/**\n * Shape of the structured info the native `sonareExceptionInfo(ptr)` returns.\n */\ninterface NativeExceptionInfo {\n code: number;\n codeName: string;\n message: string;\n}\n\n/**\n * Recover the native exception-object pointer from a value thrown across the\n * WASM boundary. emscripten surfaces a C++ throw in two shapes depending on the\n * toolchain/exception mode:\n * - a raw pointer number (older / classic surfacing), or\n * - a `CppException` object exposing the pointer as `excPtr` (emscripten with\n * `-fexceptions`).\n * Returns null when the thrown value is neither (a genuine JS error), so the\n * caller rethrows it unchanged.\n */\nexport function nativeExceptionPtr(error: unknown): number | null {\n if (typeof error === 'number') {\n return error;\n }\n if (error !== null && typeof error === 'object') {\n const ptr = (error as { excPtr?: unknown }).excPtr;\n if (typeof ptr === 'number') {\n return ptr;\n }\n }\n return null;\n}\n\n/**\n * Turn a thrown native exception pointer into a {@link SonareError}. The bound\n * `sonareExceptionInfo` decodes the pointer back into { code, codeName,\n * message }, then `sonareReleaseException` drops the reference emscripten's\n * `__cxa_throw` took before rethrowing the pointer into JS.\n *\n * The release is mandatory, not an optimization: no C++ frame catches the\n * exception, so that reference is the only one and nothing else ever drops it.\n * Every rejected input would otherwise leak its exception object for the\n * lifetime of the module — and rejection-as-control-flow (re-validating markers\n * or clips on each edit, a scrub handle seeking every pointer move) is a\n * documented usage of this API. It runs in a `finally` so a decode failure\n * still frees, and after decoding because freeing invalidates the message.\n */\nfunction makeSonareError(raw: SonareModule, thrown: number): SonareError {\n let code: number = ErrorCode.Unknown;\n let codeName = 'Unknown';\n let message = `libsonare native exception (${thrown})`;\n try {\n const info = (\n raw as unknown as { sonareExceptionInfo?: (ptr: number) => NativeExceptionInfo }\n ).sonareExceptionInfo?.(thrown);\n if (info) {\n code = info.code ?? code;\n codeName = info.codeName ?? codeName;\n message = info.message || message;\n }\n } catch {\n // Fall back to the generic message if decoding fails.\n } finally {\n try {\n raw.sonareReleaseException(thrown);\n } catch {\n // A module built before the release binding existed still yields an error\n // object; it just keeps leaking, which is what this replaces.\n }\n }\n return new SonareError(code, codeName, message);\n}\n\n/**\n * Wrap the embind module so a native C++ exception (which surfaces as a raw\n * pointer number or a `CppException` carrying one) is rethrown as a\n * {@link SonareError}. Only function-valued\n * members are wrapped, and the wrapper is cached per member so repeated access\n * stays cheap; non-function members (typed-array heap views, etc.) pass through\n * unchanged.\n */\nfunction wrapModuleErrors(raw: SonareModule): SonareModule {\n const cache = new Map<PropertyKey, unknown>();\n const objectCache = new WeakMap<object, unknown>();\n const convert = (error: unknown): never => {\n const ptr = nativeExceptionPtr(error);\n if (ptr !== null) {\n throw makeSonareError(raw, ptr);\n }\n throw error;\n };\n\n const wrapNativeObject = (value: unknown): unknown => {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (ArrayBuffer.isView(value) || value instanceof ArrayBuffer || value instanceof Promise) {\n return value;\n }\n // Plain result data carries no native methods, and a Proxy cannot be\n // structured-cloned, so wrapping it would block postMessage to a worker.\n const proto = Object.getPrototypeOf(value);\n if (Array.isArray(value) || proto === Object.prototype || proto === null) {\n return value;\n }\n const objectValue = value as object;\n const cached = objectCache.get(objectValue);\n if (cached) {\n return cached;\n }\n const methodCache = new Map<PropertyKey, unknown>();\n const wrapped = new Proxy(objectValue, {\n get(target, prop, receiver) {\n const member = Reflect.get(target, prop, receiver);\n if (typeof member !== 'function') {\n return member;\n }\n const cachedMethod = methodCache.get(prop);\n if (cachedMethod) {\n return cachedMethod;\n }\n const method = member as (...a: unknown[]) => unknown;\n const wrappedMethod = (...args: unknown[]) => {\n try {\n return wrapNativeObject(Reflect.apply(method, target, args));\n } catch (error) {\n return convert(error);\n }\n };\n methodCache.set(prop, wrappedMethod);\n return wrappedMethod;\n },\n });\n objectCache.set(objectValue, wrapped);\n return wrapped;\n };\n\n const wrapFunction = (value: (...a: unknown[]) => unknown): unknown => {\n const fnCache = new Map<PropertyKey, unknown>();\n return new Proxy(value, {\n get(target, prop, receiver) {\n const member = Reflect.get(target, prop, receiver);\n if (typeof member !== 'function') {\n return member;\n }\n const cachedMember = fnCache.get(prop);\n if (cachedMember) {\n return cachedMember;\n }\n const fn = member as (...a: unknown[]) => unknown;\n const wrappedMember = (...args: unknown[]) => {\n try {\n return wrapNativeObject(Reflect.apply(fn, target, args));\n } catch (error) {\n return convert(error);\n }\n };\n fnCache.set(prop, wrappedMember);\n return wrappedMember;\n },\n apply(t, thisArg, args) {\n try {\n return wrapNativeObject(Reflect.apply(t, thisArg, args as unknown[]));\n } catch (error) {\n return convert(error);\n }\n },\n construct(t, args, newTarget) {\n try {\n return wrapNativeObject(Reflect.construct(t, args as unknown[], newTarget)) as object;\n } catch (error) {\n return convert(error) as object;\n }\n },\n });\n };\n\n return new Proxy(raw, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n if (typeof value !== 'function') {\n return value;\n }\n const cached = cache.get(prop);\n if (cached) {\n return cached;\n }\n // Wrap as a Proxy (not a plain function) so embind class constructors\n // invoked via `new module.Foo(...)` keep their `[[Construct]]` behaviour\n // and prototype while still converting thrown native pointers.\n const wrapped = wrapFunction(value as (...a: unknown[]) => unknown);\n cache.set(prop, wrapped);\n return wrapped;\n },\n }) as SonareModule;\n}\n\nexport function setSonareModule(module: SonareModule): void {\n wrappedModule = wrapModuleErrors(module);\n}\n\nexport function getSonareModule(): SonareModule {\n if (!wrappedModule) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return wrappedModule;\n}\n","import { getSonareModule } from './module_state';\nimport type {\n VocalAnalysis,\n VocalApplyRequest,\n VocalCapabilities,\n VocalCreateRequest,\n VocalEditOperation,\n VocalEditResult,\n VocalErrorShape,\n VocalHistoryState,\n VocalJobProgress,\n VocalNote,\n VocalNotesResult,\n VocalPitchEvaluation,\n VocalRange,\n VocalRenderRequest,\n VocalRenderResult,\n VocalRestoreRequest,\n VocalSessionLimits,\n VocalStateToken,\n VocalUint64,\n} from './public_types_vocal_edit';\nimport type { SonareModule } from './sonare.js';\n\n/** Native symbols registered by the full vocal-edit WASM binding. */\nexport interface VocalWasmExports {\n vocalEditApiVersion: () => number;\n vocalEditAvailable: () => number;\n vocalEditSessionCreate: (samples: Float32Array, sampleRate: number, options: unknown) => number;\n vocalEditSessionRestore: (\n samples: Float32Array,\n sampleRate: number,\n state: Uint8Array,\n options: unknown,\n ) => number;\n vocalEditSessionDestroy: (handle: number) => void;\n vocalEditSessionNotes: (handle: number) => VocalNotesResult;\n vocalEditDraftNotes: (handle: number) => VocalNotesResult;\n vocalEditSessionToken: (handle: number) => VocalStateToken;\n vocalEditDraftToken: (handle: number) => VocalStateToken;\n vocalEditSessionAnalysis: (handle: number) => VocalAnalysis;\n vocalEditSessionCapabilities: (handle: number) => VocalCapabilities;\n vocalEditSessionOutputLength: (handle: number) => number;\n vocalEditSessionHistory: (handle: number) => VocalHistoryState;\n vocalEditSessionBeginEdit: (handle: number, revision: VocalUint64) => number;\n vocalEditDraftApply: (\n handle: number,\n generation: VocalUint64,\n operations: readonly VocalEditOperation[],\n ) => VocalEditResult;\n vocalEditDraftCommit: (handle: number, revision: VocalUint64) => VocalEditResult;\n vocalEditDraftCancel: (handle: number) => void;\n vocalEditDraftDestroy: (handle: number) => void;\n vocalEditSessionApplyHistory: (\n handle: number,\n revision: VocalUint64,\n redo: boolean,\n ) => VocalEditResult;\n vocalEditEvaluatePitch: (handle: number, noteId: number, draft: boolean) => VocalPitchEvaluation;\n vocalEditMapCoordinate: (\n handle: number,\n noteId: number,\n sample: number,\n draft: boolean,\n inverse: boolean,\n ) => number;\n vocalEditCaptureSnapshot: (handle: number, draft: boolean) => number;\n vocalEditSnapshotDestroy: (handle: number) => void;\n vocalEditSnapshotOutputLength: (handle: number) => number;\n vocalEditSnapshotRender: (\n handle: number,\n startSample: number,\n endSample: number,\n requestId: VocalUint64,\n ) => VocalRenderResult;\n vocalEditRenderJobBegin: (\n handle: number,\n startSample: number,\n endSample: number,\n requestId: VocalUint64,\n ) => number;\n vocalEditRenderJobNext: (handle: number) => boolean;\n vocalEditRenderJobFinalize: (handle: number) => VocalRenderResult;\n vocalEditRenderJobAbort: (handle: number) => void;\n vocalEditRenderJobDestroy: (handle: number) => void;\n vocalEditSessionExportState: (handle: number) => Uint8Array;\n vocalEditLastErrorDetail: () => VocalErrorShape & { readonly sequence: VocalUint64 };\n}\n\ninterface VocalWasmModule extends SonareModule, VocalWasmExports {}\n\ntype VocalErrorDetail = VocalErrorShape & { readonly sequence: VocalUint64 };\n\nconst vocalErrorFields = [\n 'reason',\n 'field',\n 'expected',\n 'actual',\n 'expectedText',\n 'actualText',\n] as const satisfies readonly (keyof VocalErrorShape)[];\n\nlet cachedModuleSource: VocalWasmModule | null = null;\nlet cachedVocalModule: VocalWasmModule | null = null;\n\nfunction addVocalErrorDetail(error: unknown, detail: VocalErrorDetail): void {\n if (error === null || typeof error !== 'object') {\n return;\n }\n const candidate = error as { name?: unknown; code?: unknown } & Record<string, unknown>;\n if (candidate.name !== 'SonareError' || typeof candidate.code !== 'number') {\n return;\n }\n for (const field of vocalErrorFields) {\n Object.defineProperty(candidate, field, {\n configurable: true,\n enumerable: true,\n value: detail[field],\n writable: false,\n });\n }\n}\n\nfunction module(): VocalWasmModule {\n const source = getSonareModule() as VocalWasmModule;\n if (source === cachedModuleSource && cachedVocalModule !== null) {\n return cachedVocalModule;\n }\n const detailReader = (source as Partial<VocalWasmModule>).vocalEditLastErrorDetail;\n if (typeof detailReader !== 'function') {\n cachedModuleSource = source;\n cachedVocalModule = source;\n return source;\n }\n const functionCache = new Map<PropertyKey, (...args: unknown[]) => unknown>();\n const wrapped = new Proxy(source, {\n get(target, property, receiver) {\n const member = Reflect.get(target, property, receiver);\n if (\n property === 'vocalEditLastErrorDetail' ||\n typeof property !== 'string' ||\n !property.startsWith('vocalEdit') ||\n typeof member !== 'function'\n ) {\n return member;\n }\n const cached = functionCache.get(property);\n if (cached !== undefined) {\n return cached;\n }\n const wrappedMember = (...args: unknown[]): unknown => {\n let beforeSequence: VocalUint64 | undefined;\n try {\n beforeSequence = detailReader.call(target).sequence;\n } catch {\n // An older module may expose the function but not its complete detail\n // shape. Native errors still follow the generic module conversion.\n }\n try {\n return Reflect.apply(member, target, args);\n } catch (error) {\n if (beforeSequence !== undefined) {\n try {\n const detail = detailReader.call(target);\n if (detail.sequence !== beforeSequence) {\n addVocalErrorDetail(error, detail);\n }\n } catch {\n // Keep the original native error if detail decoding is unavailable.\n }\n }\n throw error;\n }\n };\n functionCache.set(property, wrappedMember);\n return wrappedMember;\n },\n }) as VocalWasmModule;\n cachedModuleSource = source;\n cachedVocalModule = wrapped;\n return wrapped;\n}\n\nfunction requireHandle(handle: number, subject: string): void {\n if (!Number.isSafeInteger(handle) || handle <= 0) {\n throw new TypeError(`${subject} has already been disposed`);\n }\n}\n\nfunction requireFinite(value: number, field: string): number {\n if (!Number.isFinite(value)) {\n throw new RangeError(`${field} must be finite`);\n }\n return value;\n}\n\nfunction requireSample(value: number, field: string): number {\n requireFinite(value, field);\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new RangeError(`${field} must be a non-negative safe integer`);\n }\n return value;\n}\n\nfunction requireUint32(value: number, field: string): number {\n requireSample(value, field);\n if (value > 0xffffffff) {\n throw new RangeError(`${field} must fit uint32`);\n }\n return value;\n}\n\nfunction requireSampleRate(value: number): number {\n requireSample(value, 'sampleRate');\n if (value < 8000 || value > 384000) {\n throw new RangeError('sampleRate must be an integer in [8000, 384000]');\n }\n return value;\n}\n\nfunction requireToken(value: string | undefined, field: string, fallback = '0'): VocalUint64 {\n const token = value ?? fallback;\n if (typeof token !== 'string' || !/^(0|[1-9]\\d*)$/.test(token)) {\n throw new RangeError(`${field} must be a canonical decimal uint64 string`);\n }\n if (token.length > 20 || (token.length === 20 && token > '18446744073709551615')) {\n throw new RangeError(`${field} must fit uint64`);\n }\n return token;\n}\n\ntype RevisionArgument = VocalUint64 | { expectedRevision?: VocalUint64 };\n\nfunction resolveRevision(\n argument: RevisionArgument | undefined,\n fallback: VocalUint64,\n): VocalUint64 {\n const value = typeof argument === 'string' ? argument : argument?.expectedRevision;\n return requireToken(value, 'expectedRevision', fallback);\n}\n\nfunction requireRange(range: VocalRange): VocalRange {\n if (!range || typeof range !== 'object') {\n throw new TypeError('range must be an object');\n }\n const startSample = requireSample(range.startSample, 'range.startSample');\n const endSample = requireSample(range.endSample, 'range.endSample');\n if (endSample < startSample) {\n throw new RangeError('range.endSample must be >= startSample');\n }\n return { startSample, endSample };\n}\n\nfunction copyToken(token: VocalStateToken): VocalStateToken {\n return {\n sessionEpoch: requireToken(token.sessionEpoch, 'sessionEpoch'),\n revision: requireToken(token.revision, 'revision'),\n draftId: requireToken(token.draftId, 'draftId'),\n generation: requireToken(token.generation, 'generation'),\n requestId: requireToken(token.requestId, 'requestId'),\n profileId: token.profileId,\n };\n}\n\nfunction copyRange(range: VocalRange): VocalRange {\n return { startSample: range.startSample, endSample: range.endSample };\n}\n\nfunction copyNotes(value: VocalNotesResult): VocalNotesResult {\n const notes: VocalNote[] = Array.from(value.notes, (note) => ({\n ...note,\n amplitude: new Float32Array(note.amplitude),\n edit: {\n ...note.edit,\n pitch: {\n ...note.edit.pitch,\n target:\n note.edit.pitch.target.mode === 'curve'\n ? {\n mode: 'curve' as const,\n points: note.edit.pitch.target.points.map((point) => ({ ...point })),\n }\n : { ...note.edit.pitch.target },\n },\n amplitudeEnvelope: Array.from(note.edit.amplitudeEnvelope),\n formant: { ...note.edit.formant },\n },\n }));\n return {\n notes,\n transitions: Array.from(value.transitions, (transition) => ({ ...transition })),\n };\n}\n\nfunction copyAnalysis(value: VocalAnalysis): VocalAnalysis {\n return {\n frameOriginSample: value.frameOriginSample,\n samplesPerFrame: value.samplesPerFrame,\n frameLengthSamples: value.frameLengthSamples,\n f0Hz: new Float32Array(value.f0Hz),\n voiced: new Uint8Array(value.voiced),\n algorithmId: value.algorithmId,\n algorithmVersion: value.algorithmVersion,\n sourceLengthSamples: value.sourceLengthSamples,\n sampleRate: value.sampleRate,\n sourceSha256: value.sourceSha256,\n analysisSha256: value.analysisSha256,\n fminHz: value.fminHz,\n fmaxHz: value.fmaxHz,\n yinThreshold: value.yinThreshold,\n voicedThreshold: value.voicedThreshold,\n centered: value.centered,\n segmentationThresholdCents: value.segmentationThresholdCents,\n minNoteMs: value.minNoteMs,\n referenceHz: value.referenceHz,\n };\n}\n\nfunction copyPitch(value: VocalPitchEvaluation): VocalPitchEvaluation {\n return {\n sourceSamples: new Float64Array(value.sourceSamples),\n measuredMidi: new Float64Array(value.measuredMidi),\n targetMidi: new Float64Array(value.targetMidi),\n effectiveMidi: new Float64Array(value.effectiveMidi),\n voiced: new Uint8Array(value.voiced),\n hasTarget: new Uint8Array(value.hasTarget),\n };\n}\n\nfunction copyRender(value: VocalRenderResult): VocalRenderResult {\n return {\n samples: new Float32Array(value.samples),\n startSample: value.startSample,\n token: copyToken(value.token),\n processedRanges: Array.from(value.processedRanges, copyRange),\n cacheHitUnits: requireToken(value.cacheHitUnits, 'cacheHitUnits'),\n dryPassedFrames: requireToken(value.dryPassedFrames, 'dryPassedFrames'),\n limitedCorrectionFrames: requireToken(value.limitedCorrectionFrames, 'limitedCorrectionFrames'),\n };\n}\n\nfunction validateSessionLimits(limits: VocalSessionLimits | undefined): void {\n if (limits === undefined) {\n return;\n }\n if (limits.maxHistoryBytes !== undefined) {\n requireToken(limits.maxHistoryBytes, 'limits.maxHistoryBytes');\n }\n if (limits.maxCacheBytes !== undefined) {\n requireToken(limits.maxCacheBytes, 'limits.maxCacheBytes');\n }\n}\n\nfunction copyEditResult(value: VocalEditResult): VocalEditResult {\n return {\n token: copyToken(value.token),\n dirtyRanges: Array.from(value.dirtyRanges, copyRange),\n idChanges: Array.from(value.idChanges, (change) => ({\n operationIndex: change.operationIndex,\n retiredId: change.retiredId,\n newIds: Array.from(change.newIds),\n })),\n };\n}\n\nfunction validateCreate(request: VocalCreateRequest): void {\n if (!request || typeof request !== 'object') {\n throw new TypeError('request must be an object');\n }\n if (!(request.samples instanceof Float32Array) || request.samples.length === 0) {\n throw new TypeError('samples must be a non-empty Float32Array');\n }\n for (const sample of request.samples) {\n requireFinite(sample, 'samples');\n }\n requireSampleRate(request.sampleRate);\n if (request.outputLengthSamples !== undefined) {\n requireSample(request.outputLengthSamples, 'outputLengthSamples');\n }\n validateSessionLimits(request.limits);\n if (request.analysis) {\n const analysis = request.analysis;\n if (analysis.algorithmId !== undefined) {\n if (typeof analysis.algorithmId !== 'string') {\n throw new TypeError('analysis.algorithmId must be a string');\n }\n if (analysis.algorithmId.includes('\\0')) {\n throw new RangeError('analysis.algorithmId must not contain NUL');\n }\n }\n requireFinite(analysis.frameOriginSample, 'analysis.frameOriginSample');\n requireFinite(analysis.samplesPerFrame, 'analysis.samplesPerFrame');\n if (analysis.samplesPerFrame <= 0) {\n throw new RangeError('analysis.samplesPerFrame must be positive');\n }\n requireSample(analysis.frameLengthSamples, 'analysis.frameLengthSamples');\n if (analysis.frameLengthSamples === 0) {\n throw new RangeError('analysis.frameLengthSamples must be positive');\n }\n if (!(analysis.f0Hz instanceof Float32Array) || !(analysis.voiced instanceof Uint8Array)) {\n throw new TypeError('analysis arrays must be Float32Array and Uint8Array');\n }\n if (analysis.f0Hz.length !== analysis.voiced.length) {\n throw new RangeError('analysis arrays must have equal lengths');\n }\n }\n}\n\nfunction normalizeRequest(\n request: VocalRenderRequest,\n outputLengthSamples: number,\n): {\n range: VocalRange;\n requestId: VocalUint64;\n} {\n const range =\n request.range === undefined\n ? { startSample: 0, endSample: requireSample(outputLengthSamples, 'outputLengthSamples') }\n : requireRange(request.range);\n const requestId = requireToken(request.requestId, 'requestId');\n return { range, requestId };\n}\n\n/** Whether this build has the C vocal-edit surface linked. */\nexport function vocalEditAvailable(): boolean {\n const raw = module();\n return typeof raw.vocalEditAvailable === 'function' && raw.vocalEditAvailable() !== 0;\n}\n\n/** Version of the C vocal-edit ABI exposed by the loaded WASM module. */\nexport function vocalEditApiVersion(): number {\n const raw = module();\n return typeof raw.vocalEditApiVersion === 'function' ? raw.vocalEditApiVersion() : 0;\n}\n\n/** Analyse mono PCM, or adopt a host analysis, and open an editing session. */\nexport function createVocalEditSession(request: VocalCreateRequest): VocalEditSession {\n validateCreate(request);\n if (!vocalEditAvailable()) {\n throw new Error('vocal edit is unavailable in this WASM build');\n }\n return new VocalEditSession(\n module().vocalEditSessionCreate(request.samples, request.sampleRate, request),\n );\n}\n\n/** Open a new session from an exported state blob and the same source PCM. */\nexport function restoreVocalEditSession(request: VocalRestoreRequest): VocalEditSession {\n if (!(request.samples instanceof Float32Array) || request.samples.length === 0) {\n throw new TypeError('samples must be a non-empty Float32Array');\n }\n if (!(request.state instanceof Uint8Array)) {\n throw new TypeError('state must be a Uint8Array');\n }\n for (const sample of request.samples) {\n requireFinite(sample, 'samples');\n }\n requireSampleRate(request.sampleRate);\n validateSessionLimits(request.limits);\n if (!vocalEditAvailable()) {\n throw new Error('vocal edit is unavailable in this WASM build');\n }\n return new VocalEditSession(\n module().vocalEditSessionRestore(request.samples, request.sampleRate, request.state, request),\n );\n}\n\n/** A vocal editing session. Disposing it also disposes every live draft it began. */\nexport class VocalEditSession {\n private handle: number;\n private readonly drafts = new Set<VocalEditDraft>();\n private disposed = false;\n\n /** @internal Instances are created by {@link createVocalEditSession} and {@link restoreVocalEditSession}. */\n constructor(handle: number) {\n requireHandle(handle, 'session');\n this.handle = handle;\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n for (const draft of this.drafts) {\n draft.dispose();\n }\n this.drafts.clear();\n module().vocalEditSessionDestroy(this.handle);\n this.handle = 0;\n this.disposed = true;\n }\n\n delete(): void {\n this.dispose();\n }\n\n destroy(): void {\n this.dispose();\n }\n\n private native(): number {\n if (this.disposed) {\n throw new TypeError('session has already been disposed');\n }\n requireHandle(this.handle, 'session');\n return this.handle;\n }\n\n token(): VocalStateToken {\n return copyToken(module().vocalEditSessionToken(this.native()));\n }\n\n revision(): VocalUint64 {\n return this.token().revision;\n }\n\n notes(): VocalNotesResult {\n return copyNotes(module().vocalEditSessionNotes(this.native()));\n }\n\n analysis(): VocalAnalysis {\n return copyAnalysis(module().vocalEditSessionAnalysis(this.native()));\n }\n\n capabilities(): VocalCapabilities {\n return { ...module().vocalEditSessionCapabilities(this.native()) };\n }\n\n outputLengthSamples(): number {\n return requireSample(\n module().vocalEditSessionOutputLength(this.native()),\n 'outputLengthSamples',\n );\n }\n\n history(): VocalHistoryState {\n const value = module().vocalEditSessionHistory(this.native());\n return { canUndo: value.canUndo === true, canRedo: value.canRedo === true };\n }\n\n beginEdit(options: RevisionArgument = {}): VocalEditDraft {\n const draft = new VocalEditDraft(\n module().vocalEditSessionBeginEdit(this.native(), resolveRevision(options, this.revision())),\n this,\n );\n this.drafts.add(draft);\n return draft;\n }\n\n undo(options: RevisionArgument = {}): VocalEditResult {\n return copyEditResult(\n module().vocalEditSessionApplyHistory(\n this.native(),\n resolveRevision(options, this.revision()),\n false,\n ),\n );\n }\n\n redo(options: RevisionArgument = {}): VocalEditResult {\n return copyEditResult(\n module().vocalEditSessionApplyHistory(\n this.native(),\n resolveRevision(options, this.revision()),\n true,\n ),\n );\n }\n\n evaluatePitch(noteId: number): VocalPitchEvaluation {\n return copyPitch(\n module().vocalEditEvaluatePitch(this.native(), requireUint32(noteId, 'noteId'), false),\n );\n }\n\n sourceSampleToDestinationSample(noteId: number, sourceSample: number): number {\n requireFinite(sourceSample, 'sourceSample');\n return module().vocalEditMapCoordinate(\n this.native(),\n requireUint32(noteId, 'noteId'),\n sourceSample,\n false,\n false,\n );\n }\n\n destinationSampleToSourceSample(noteId: number, destinationSample: number): number {\n requireFinite(destinationSample, 'destinationSample');\n return module().vocalEditMapCoordinate(\n this.native(),\n requireUint32(noteId, 'noteId'),\n destinationSample,\n false,\n true,\n );\n }\n\n captureRenderSnapshot(): VocalRenderSnapshot {\n return new VocalRenderSnapshot(module().vocalEditCaptureSnapshot(this.native(), false));\n }\n\n exportState(): Uint8Array {\n return new Uint8Array(module().vocalEditSessionExportState(this.native()));\n }\n\n /** @internal Used by the draft to remove itself from the owner set. */\n _forgetDraft(draft: VocalEditDraft): void {\n this.drafts.delete(draft);\n }\n}\n\nexport class VocalEditDraft {\n private handle: number;\n private disposed = false;\n private readonly owner: VocalEditSession;\n\n /** @internal Instances are created by {@link VocalEditSession.beginEdit}. */\n constructor(handle: number, owner: VocalEditSession) {\n requireHandle(handle, 'draft');\n this.handle = handle;\n this.owner = owner;\n }\n\n private native(): number {\n if (this.disposed) {\n throw new TypeError('draft has already been disposed');\n }\n requireHandle(this.handle, 'draft');\n return this.handle;\n }\n\n token(): VocalStateToken {\n return copyToken(module().vocalEditDraftToken(this.native()));\n }\n\n notes(): VocalNotesResult {\n return copyNotes(module().vocalEditDraftNotes(this.native()));\n }\n\n apply(request: VocalApplyRequest): VocalEditResult {\n if (request.expectedGeneration === undefined) {\n throw new TypeError('expectedGeneration is required');\n }\n const generation = requireToken(request.expectedGeneration, 'expectedGeneration');\n if (!Array.isArray(request.operations)) {\n throw new TypeError('operations must be an array');\n }\n return copyEditResult(\n module().vocalEditDraftApply(this.native(), generation, request.operations),\n );\n }\n\n commit(options: RevisionArgument = {}): VocalEditResult {\n const result = copyEditResult(\n module().vocalEditDraftCommit(this.native(), resolveRevision(options, this.owner.revision())),\n );\n this.dispose();\n return result;\n }\n\n cancel(): void {\n if (this.disposed) {\n return;\n }\n module().vocalEditDraftCancel(this.native());\n this.dispose();\n }\n\n evaluatePitch(noteId: number): VocalPitchEvaluation {\n return copyPitch(\n module().vocalEditEvaluatePitch(this.native(), requireUint32(noteId, 'noteId'), true),\n );\n }\n\n sourceSampleToDestinationSample(noteId: number, sourceSample: number): number {\n requireFinite(sourceSample, 'sourceSample');\n return module().vocalEditMapCoordinate(\n this.native(),\n requireUint32(noteId, 'noteId'),\n sourceSample,\n true,\n false,\n );\n }\n\n destinationSampleToSourceSample(noteId: number, destinationSample: number): number {\n requireFinite(destinationSample, 'destinationSample');\n return module().vocalEditMapCoordinate(\n this.native(),\n requireUint32(noteId, 'noteId'),\n destinationSample,\n true,\n true,\n );\n }\n\n captureRenderSnapshot(): VocalRenderSnapshot {\n return new VocalRenderSnapshot(module().vocalEditCaptureSnapshot(this.native(), true));\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n module().vocalEditDraftDestroy(this.handle);\n this.handle = 0;\n this.disposed = true;\n this.owner._forgetDraft(this);\n }\n\n delete(): void {\n this.dispose();\n }\n\n destroy(): void {\n this.dispose();\n }\n}\n\nexport class VocalRenderSnapshot {\n private handle: number;\n private disposed = false;\n\n /** @internal Instances are created by a session or draft. */\n constructor(handle: number) {\n requireHandle(handle, 'snapshot');\n this.handle = handle;\n }\n\n private native(): number {\n if (this.disposed) {\n throw new TypeError('snapshot has already been disposed');\n }\n requireHandle(this.handle, 'snapshot');\n return this.handle;\n }\n\n outputLengthSamples(): number {\n return requireSample(\n module().vocalEditSnapshotOutputLength(this.native()),\n 'outputLengthSamples',\n );\n }\n\n render(request: VocalRenderRequest): VocalRenderResult {\n const handle = this.native();\n if (request.signal?.aborted) {\n throw new DOMException('The render was aborted', 'AbortError');\n }\n const normalized = normalizeRequest(request, this.outputLengthSamples());\n return copyRender(\n module().vocalEditSnapshotRender(\n handle,\n normalized.range.startSample,\n normalized.range.endSample,\n normalized.requestId,\n ),\n );\n }\n\n beginRenderJob(request: VocalRenderRequest): VocalRenderJob {\n const handle = this.native();\n if (request.signal?.aborted) {\n throw new DOMException('The render was aborted', 'AbortError');\n }\n const normalized = normalizeRequest(request, this.outputLengthSamples());\n return new VocalRenderJob(\n module().vocalEditRenderJobBegin(\n handle,\n normalized.range.startSample,\n normalized.range.endSample,\n normalized.requestId,\n ),\n );\n }\n\n /**\n * Render one native work unit per macrotask so `request.signal` can stop the\n * job between units. A cancelled job publishes no partial PCM.\n */\n renderAsync(request: VocalRenderRequest): Promise<VocalRenderResult> {\n this.native();\n const signal = request.signal;\n if (signal?.aborted) {\n return Promise.reject(new DOMException('The render was aborted', 'AbortError'));\n }\n const job = this.beginRenderJob(request);\n return (async () => {\n try {\n while (true) {\n if (signal?.aborted) {\n job.abort();\n throw new DOMException('The render was aborted', 'AbortError');\n }\n if (job.next().complete) {\n return job.finalize();\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n }\n } catch (error) {\n job.abort();\n throw error;\n } finally {\n job.dispose();\n }\n })();\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n module().vocalEditSnapshotDestroy(this.handle);\n this.handle = 0;\n this.disposed = true;\n }\n\n delete(): void {\n this.dispose();\n }\n\n destroy(): void {\n this.dispose();\n }\n}\n\nexport class VocalRenderJob {\n private handle: number;\n private disposed = false;\n\n /** @internal Instances are created by {@link VocalRenderSnapshot.beginRenderJob}. */\n constructor(handle: number) {\n requireHandle(handle, 'render job');\n this.handle = handle;\n }\n\n private native(): number {\n if (this.disposed) {\n throw new TypeError('render job has already been disposed');\n }\n requireHandle(this.handle, 'render job');\n return this.handle;\n }\n\n next(): VocalJobProgress {\n return { complete: module().vocalEditRenderJobNext(this.native()) };\n }\n\n finalize(): VocalRenderResult {\n const result = copyRender(module().vocalEditRenderJobFinalize(this.native()));\n this.dispose();\n return result;\n }\n\n abort(): void {\n if (!this.disposed) {\n module().vocalEditRenderJobAbort(this.handle);\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n module().vocalEditRenderJobDestroy(this.handle);\n this.handle = 0;\n this.disposed = true;\n }\n\n delete(): void {\n this.dispose();\n }\n\n destroy(): void {\n this.dispose();\n }\n}\n\nexport type {\n VocalAnalysis,\n VocalCapabilities,\n VocalCreateRequest,\n VocalEditResult,\n VocalHistory,\n} from './public_types_vocal_edit';\n","import type {\n VocalAnalysis,\n VocalApplyRequest,\n VocalCapabilities,\n VocalCreateRequest,\n VocalEditResult,\n VocalHistoryState,\n VocalNotesResult,\n VocalPitchEvaluation,\n VocalRenderRequest,\n VocalRenderResult,\n VocalRestoreRequest,\n VocalStateBytes,\n VocalStateToken,\n VocalUint64,\n} from './public_types_vocal_edit';\n\nexport type VocalWorkerMutation =\n | { kind: 'beginEdit'; expectedRevision?: VocalUint64 }\n | { kind: 'apply'; request: VocalApplyRequest }\n | { kind: 'commit'; expectedRevision: VocalUint64 }\n | { kind: 'cancel' }\n | { kind: 'undo'; expectedRevision?: VocalUint64 }\n | { kind: 'redo'; expectedRevision?: VocalUint64 }\n | { kind: 'notes' }\n | { kind: 'analysis' }\n | { kind: 'capabilities' }\n | { kind: 'exportState' }\n | { kind: 'outputLength' }\n | { kind: 'history' }\n | { kind: 'draftToken' }\n | { kind: 'evaluatePitch'; noteId: number; draft?: boolean }\n | {\n kind: 'mapCoordinate';\n noteId: number;\n sample: number;\n /** `false` maps source to destination; `true` maps destination to source. */\n inverse: boolean;\n draft?: boolean;\n };\n\nexport type VocalWorkerCreateRequest =\n | { kind: 'create'; request: VocalCreateRequest }\n | { kind: 'restore'; request: VocalRestoreRequest };\n\nexport interface VocalWorkerCreateMessage {\n type: 'sonare:vocal-create';\n id: number;\n sessionId: string;\n clientIntentSequence: VocalUint64;\n request: VocalWorkerCreateRequest;\n cancelBuffer?: SharedArrayBuffer;\n}\n\nexport interface VocalWorkerMutateMessage {\n type: 'sonare:vocal-mutate';\n id: number;\n sessionId: string;\n clientIntentSequence: VocalUint64;\n baseToken?: VocalStateToken;\n mutation: VocalWorkerMutation;\n cancelBuffer?: SharedArrayBuffer;\n}\n\nexport interface VocalWorkerPreviewMessage {\n type: 'sonare:vocal-preview';\n id: number;\n sessionId: string;\n clientIntentSequence: VocalUint64;\n baseToken?: VocalStateToken;\n request: VocalRenderRequest;\n cancelBuffer?: SharedArrayBuffer;\n}\n\nexport interface VocalWorkerDisposeMessage {\n type: 'sonare:vocal-dispose';\n id: number;\n sessionId: string;\n clientIntentSequence: VocalUint64;\n}\n\nexport interface VocalWorkerCancelMessage {\n type: 'sonare:vocal-cancel';\n id: number;\n sessionId: string;\n clientIntentSequence: VocalUint64;\n}\n\nexport type VocalWorkerRequestMessage =\n | VocalWorkerCreateMessage\n | VocalWorkerMutateMessage\n | VocalWorkerPreviewMessage\n | VocalWorkerDisposeMessage\n | VocalWorkerCancelMessage;\n\nexport interface VocalWorkerCreateResult {\n sessionId: string;\n token: VocalStateToken;\n notes: VocalNotesResult;\n analysis: VocalAnalysis;\n capabilities: VocalCapabilities;\n}\n\nexport interface VocalWorkerResponseBase {\n id: number;\n sessionId: string;\n clientIntentSequence: VocalUint64;\n token?: VocalStateToken;\n}\n\nexport type VocalWorkerResult =\n | VocalWorkerCreateResult\n | VocalEditResult\n | VocalNotesResult\n | VocalAnalysis\n | VocalCapabilities\n | VocalStateBytes\n | VocalRenderResult\n | VocalStateToken\n | VocalHistoryState\n | VocalPitchEvaluation\n | number\n | null;\n\nexport interface VocalWorkerResultMessage extends VocalWorkerResponseBase {\n type: 'sonare:vocal-result';\n result: VocalWorkerResult;\n}\n\nexport interface VocalWorkerProgressMessage extends VocalWorkerResponseBase {\n type: 'sonare:vocal-progress';\n complete: boolean;\n}\n\nexport interface VocalWorkerErrorMessage extends VocalWorkerResponseBase {\n type: 'sonare:vocal-error';\n error: {\n name: string;\n message: string;\n code?: number;\n codeName?: string;\n reason?: number;\n field?: string;\n expected?: VocalUint64;\n actual?: VocalUint64;\n expectedText?: string;\n actualText?: string;\n };\n}\n\nexport type VocalWorkerResponseMessage =\n | VocalWorkerResultMessage\n | VocalWorkerProgressMessage\n | VocalWorkerErrorMessage;\n\nexport function tokenEquals(\n a: VocalStateToken | undefined,\n b: VocalStateToken | undefined,\n): boolean {\n if (!a || !b) {\n return a === b;\n }\n return (\n a.sessionEpoch === b.sessionEpoch &&\n a.revision === b.revision &&\n a.draftId === b.draftId &&\n a.generation === b.generation &&\n a.requestId === b.requestId &&\n a.profileId === b.profileId\n );\n}\n\n/** Compare the mutable session state portion of a token.\n *\n * Render results add request/profile metadata to the state token. That\n * metadata identifies the render artifact, so it must not make a snapshot's\n * state appear different from the session state used to create it.\n */\nexport function stateTokenEquals(\n a: VocalStateToken | undefined,\n b: VocalStateToken | undefined,\n): boolean {\n if (!a || !b) {\n return a === b;\n }\n return (\n a.sessionEpoch === b.sessionEpoch &&\n a.revision === b.revision &&\n a.draftId === b.draftId &&\n a.generation === b.generation &&\n a.profileId === b.profileId\n );\n}\n\n/** Decimal sequence comparison without converting a uint64 to Number. */\nexport function compareUint64(a: VocalUint64, b: VocalUint64): number {\n const left = a.replace(/^0+(?=\\d)/, '');\n const right = b.replace(/^0+(?=\\d)/, '');\n if (left.length !== right.length) {\n return left.length < right.length ? -1 : 1;\n }\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n","/**\n * sonare - Audio Analysis Library\n *\n * @example\n * ```typescript\n * import { init, detectBpm, detectKey, analyze } from '@libraz/libsonare';\n *\n * await init();\n *\n * // Detect BPM from audio samples\n * const bpm = detectBpm(samples, sampleRate);\n *\n * // Detect musical key\n * const key = detectKey(samples, sampleRate);\n *\n * // Full analysis\n * const result = analyze(samples, sampleRate);\n * ```\n */\n\nimport { setSonareModule } from './module_state';\nimport type {\n CapabilityCatalog,\n RealtimeVoiceChangerPodConfig,\n SonareCapabilities,\n VoicePresetId,\n} from './public_types';\nimport type {\n SonareModule,\n WasmDecomposeResult,\n WasmHpssWithResidualResult,\n WasmMatrix2dResult,\n} from './sonare.js';\n\nexport { alignTakeToReference } from './align_take';\nexport type { BrowserAudioDecodeOptions } from './audio';\nexport { Audio } from './audio';\nexport type {\n ClipPageStreamerEngine,\n ClipPageStreamerOptions,\n ClipPageStreamerRequest,\n ClipPageStreamSource,\n OpfsClipStream,\n OpfsClipStreamOptions,\n WorkletOpfsClipStreamHost,\n} from './clip_page_streamer';\nexport { attachOpfsClipStream, ClipPageStreamer } from './clip_page_streamer';\nexport type {\n CompressorDetector,\n CompressorOptions,\n DeclickOptions,\n DeclipOptions,\n DecrackleMode,\n DecrackleOptions,\n DehumMode,\n DehumOptions,\n DenoiseClassicalMode,\n DenoiseClassicalNoiseEstimator,\n DenoiseClassicalOptions,\n DereverbClassicalOptions,\n DynamicsProcessorResult,\n GateOptions,\n MasteringAbMatchLoudnessRequest,\n MasteringAbMatchLoudnessStereoRequest,\n MasteringAmpPresetCatalogEntry,\n MasteringAssistantParamsRequest,\n MasteringAssistantStereoParamsRequest,\n MasteringChannelPolicy,\n MasteringDynamicsCompressorRequest,\n MasteringDynamicsGateRequest,\n MasteringDynamicsTransientShaperRequest,\n MasteringInsertParamChoice,\n MasteringInsertParamInfo,\n MasteringInsertSlot,\n MasteringInsertTiming,\n MasteringPairAnalyzeRequest,\n MasteringPairProcessRequest,\n MasteringPairProcessStereoRequest,\n MasteringProcessorCatalogEntry,\n MasteringProcessorCategory,\n MasteringProcessRequest,\n MasteringProcessStereoRequest,\n MasteringRealtimeCost,\n MasteringRepairDeclickRequest,\n MasteringRepairDeclickStereoRequest,\n MasteringRepairDeclipRequest,\n MasteringRepairDeclipStereoRequest,\n MasteringRepairDecrackleRequest,\n MasteringRepairDecrackleStereoRequest,\n MasteringRepairDehumRequest,\n MasteringRepairDehumStereoRequest,\n MasteringRepairDenoiseClassicalLinkedRequest,\n MasteringRepairDenoiseClassicalRequest,\n MasteringRepairDenoiseClassicalStereoRequest,\n MasteringRepairDereverbClassicalLinkedRequest,\n MasteringRepairDereverbClassicalRequest,\n MasteringRepairDereverbClassicalStereoRequest,\n MasteringRepairDereverbConfigForRoomRequest,\n MasteringRepairDetectClicksRequest,\n MasteringRepairDetectClippingRequest,\n MasteringRepairDetectCrackleRequest,\n MasteringRepairDetectHumRequest,\n MasteringRepairDetectNoiseFloorRequest,\n MasteringRepairDetectReverbRequest,\n MasteringRepairDetectTrimRangeRequest,\n MasteringRepairDetectTrimRangeStereoRequest,\n MasteringRepairNoiseBandBinsRequest,\n MasteringRepairTrimSilenceRequest,\n MasteringRepairTrimSilenceStereoRequest,\n MasteringSamplesParamsRequest,\n MasteringStereoAnalyzeRequest,\n MasteringStereoParamsRequest,\n MasteringStreamingPreviewRequest,\n MasteringStreamingPreviewStereoRequest,\n MixStereoRequest,\n TransientShaperOptions,\n TrimSilenceMode,\n TrimSilenceOptions,\n VoiceChangeOptions,\n VoiceChangeRealtimeOptions,\n VoiceChangeRealtimeRequest,\n VoiceChangeRequest,\n} from './effects_mastering';\nexport {\n assignNoteTargets,\n decomposeNotePitch,\n extractNotes,\n extractPercussiveEvents,\n harmonic,\n hpss,\n masterAudio,\n masterAudioStereo,\n masterAudioStereoWithProgress,\n masterAudioWithProgress,\n mastering,\n masteringAbMatchLoudness,\n masteringAbMatchLoudnessStereo,\n masteringAmpPresetCatalog,\n masteringAssistantSuggest,\n masteringAssistantSuggestChain,\n masteringAssistantSuggestChainStereo,\n masteringAssistantSuggestStereo,\n masteringAudioProfile,\n masteringAudioProfileStereo,\n masteringChain,\n masteringChainStereo,\n masteringChainStereoWithProgress,\n masteringChainWithProgress,\n masteringDynamicsCompressor,\n masteringDynamicsGate,\n masteringDynamicsTransientShaper,\n masteringInsertNames,\n masteringInsertParamInfo,\n masteringInsertParamNames,\n masteringInsertTiming,\n masteringPairAnalysisNames,\n masteringPairAnalyze,\n masteringPairProcess,\n masteringPairProcessorNames,\n masteringPairProcessStereo,\n masteringPlatformNames,\n masteringPresetNames,\n masteringPresetParams,\n masteringProcess,\n masteringProcessorCatalog,\n masteringProcessorNames,\n masteringProcessStereo,\n masteringRepairDeclick,\n masteringRepairDeclickStereo,\n masteringRepairDeclip,\n masteringRepairDeclipStereo,\n masteringRepairDecrackle,\n masteringRepairDecrackleStereo,\n masteringRepairDehum,\n masteringRepairDehumStereo,\n masteringRepairDenoiseClassical,\n masteringRepairDenoiseClassicalLinked,\n masteringRepairDenoiseClassicalStereo,\n masteringRepairDereverbClassical,\n masteringRepairDereverbClassicalLinked,\n masteringRepairDereverbClassicalStereo,\n masteringRepairDereverbConfigForRoom,\n masteringRepairDetectClicks,\n masteringRepairDetectClipping,\n masteringRepairDetectCrackle,\n masteringRepairDetectHum,\n masteringRepairDetectNoiseFloor,\n masteringRepairDetectReverb,\n masteringRepairDetectTrimRange,\n masteringRepairDetectTrimRangeStereo,\n masteringRepairNoiseBandBins,\n masteringRepairTrimSilence,\n masteringRepairTrimSilenceStereo,\n masteringStereoAnalysisNames,\n masteringStereoAnalyze,\n masteringStreamingPreview,\n masteringStreamingPreviewStereo,\n mergeNotes,\n mixingScenePresetJson,\n mixingScenePresetNames,\n mixStereo,\n normalize,\n normalizeStereo,\n noteMove,\n noteStretch,\n noteTargetsFromSmf,\n percussive,\n pitchCorrectTimevarying,\n pitchCorrectToMidi,\n pitchCorrectToMidiTimevarying,\n pitchShift,\n renderNotes,\n renderPercussiveEvents,\n spectralEdit,\n splitNote,\n timeStretch,\n voiceChange,\n voiceChangeRealtime,\n} from './effects_mastering';\nexport type {\n AssignNoteTargetsRequest,\n DecomposeNotePitchRequest,\n ExtractNotesRequest,\n MergeNotesRequest,\n NoteMoveRequest,\n NoteSetRequest,\n NoteStretchRequest,\n NoteTargetsFromSmfRequest,\n RenderNotesRequest,\n SplitNoteRequest,\n} from './effects_note_ops';\nexport type {\n ExtractPercussiveEventsRequest,\n PercussiveSeparationOptions,\n RenderPercussiveEventsRequest,\n} from './effects_percussive';\nexport type { HarmonicRequest, HpssRequest, PercussiveRequest } from './effects_separation';\nexport type { SpectralEditRequest } from './effects_spectral';\nexport type {\n PitchCorrectTimevaryingRequest,\n PitchCorrectToMidiRequest,\n PitchCorrectToMidiTimevaryingRequest,\n PitchShiftRequest,\n TimeStretchRequest,\n} from './effects_timepitch';\nexport { ErrorCode, isSonareError, SonareError } from './errors';\nexport type {\n ChirpRequest,\n ClicksRequest,\n CyclicTempogramRequest,\n DbConversionRequest,\n EmphasisRequest,\n FixFramesRequest,\n FixLengthRequest,\n FrameSignalRequest,\n OnsetBacktrackRequest,\n PadCenterRequest,\n PcenRequest,\n PeakPickRequest,\n PlpRequest,\n SilenceCommonReport,\n SilenceRequest,\n SplitSilenceCommonRequest,\n SplitSilenceCommonWithReportResult,\n TempogramRequest,\n ToneRequest,\n TonnetzRequest,\n VectorNormalizeRequest,\n} from './feature_core';\nexport type {\n DecomposeRequest,\n DecomposeStemsLinkedRequest,\n DecomposeStemsLinkedResult,\n DecomposeStemsRequest,\n DecomposeStemsResult,\n DecomposeWithInitRequest,\n HpssWithResidualRequest,\n NnFilterRequest,\n RemixRequest,\n SegmentAgglomerativeRequest,\n SegmentCrossSimilarityRequest,\n SegmentLagToRecurrenceRequest,\n SegmentPathEnhanceRequest,\n SegmentRecurrenceMatrixRequest,\n SegmentRecurrenceToLagRequest,\n SegmentSubsegmentRequest,\n} from './feature_decompose';\nexport type {\n GriffinLimRequest,\n MelToAudioRequest,\n MelToStftRequest,\n MfccToAudioRequest,\n MfccToMelRequest,\n PhaseVocoderRequest,\n} from './feature_inverse';\nexport type {\n Ebur128LoudnessRangeRequest,\n LufsInterleavedRequest,\n LufsSeriesInterleavedRequest,\n} from './feature_loudness';\nexport type {\n AnalyzeMelodyRequest,\n AnalyzeSectionsRequest,\n CqtRequest,\n CqtToAudioRequest,\n DetectBoundariesRequest,\n FourierTempogramRequest,\n LufsRequest,\n MelodyOptions,\n NnlsChromaRequest,\n OnsetEnvelopeRequest,\n OnsetStrengthMultiRequest,\n TempogramRatioRequest,\n VqtRequest,\n VqtToAudioRequest,\n} from './feature_music';\nexport type {\n EstimateTuningRequest,\n NoteSegmentsRequest,\n PiptrackRequest,\n PitchPyinRequest,\n PitchTuningRequest,\n PitchYinRequest,\n} from './feature_pitch';\nexport type { ResampleRequest } from './feature_resample';\nexport type {\n PolyFeaturesRequest,\n SpectralContrastRequest,\n SpectralFrameRequest,\n SpectralRolloffRequest,\n ZeroCrossingRateRequest,\n ZeroCrossingsRequest,\n} from './feature_spectral';\nexport type {\n BassChromaSpectrogramRequest,\n ChromaSpectrogramRequest,\n MelDeltaRequest,\n MelSpectrogramRequest,\n MfccRequest,\n ReassignedSpectrogramRequest,\n SpectrogramRequest,\n TrimRequest,\n} from './feature_spectrogram';\nexport {\n amplitudeToDb,\n analyzeMelody,\n analyzeSections,\n bassChroma,\n chirp,\n chroma,\n chromaCens,\n chromaCqt,\n clicks,\n cqt,\n cqtToAudio,\n cyclicTempogram,\n dbToAmplitude,\n dbToPower,\n decompose,\n decomposeStems,\n decomposeStemsLinked,\n decomposeWithInit,\n deemphasis,\n detectBoundaries,\n ebur128LoudnessRange,\n estimateTuning,\n fixFrames,\n fixLength,\n fourierTempogram,\n frameSignal,\n framesToSamples,\n framesToTime,\n griffinLim,\n hpssWithResidual,\n hybridCqt,\n hzToMel,\n hzToMidi,\n hzToNote,\n lufs,\n lufsInterleaved,\n lufsSeriesInterleaved,\n melDelta,\n melSpectrogram,\n melToAudio,\n melToHz,\n melToStft,\n mfcc,\n mfccToAudio,\n mfccToMel,\n midiToHz,\n momentaryLufs,\n nnFilter,\n nnlsChroma,\n noteSegments,\n noteToHz,\n onsetBacktrack,\n onsetEnvelope,\n onsetStrengthMulti,\n padCenter,\n pcen,\n peakPick,\n phaseVocoder,\n piptrack,\n pitchPyin,\n pitchTuning,\n pitchYin,\n plp,\n polyFeatures,\n powerToDb,\n preemphasis,\n pseudoCqt,\n reassignedSpectrogram,\n remix,\n remixAlignedIntervals,\n resample,\n rmsEnergy,\n samplesToFrames,\n segmentAgglomerative,\n segmentCrossSimilarity,\n segmentLagToRecurrence,\n segmentPathEnhance,\n segmentRecurrenceMatrix,\n segmentRecurrenceToLag,\n segmentSubsegment,\n shortTermLufs,\n spectralBandwidth,\n spectralCentroid,\n spectralContrast,\n spectralFlatness,\n spectralFlux,\n spectralRolloff,\n splitSilence,\n splitSilenceCommon,\n splitSilenceCommonWithReport,\n stft,\n stftDb,\n tempogram,\n tempogramRatio,\n timeToFrames,\n tone,\n tonnetz,\n trim,\n trimSilence,\n vectorNormalize,\n vqt,\n vqtToAudio,\n zeroCrossingRate,\n zeroCrossings,\n} from './features';\nexport type { BindMicrophoneInputOptions, MicrophoneInputBinding } from './live_audio';\nexport { bindMicrophoneInput } from './live_audio';\nexport type {\n MasterAudioRequest,\n MasterAudioStereoRequest,\n MasteringChainRequest,\n MasteringChainStereoRequest,\n NormalizeMode,\n NormalizeRequest,\n NormalizeStereoRequest,\n NormalizeStereoResult,\n} from './mastering_chain';\nexport type { MasteringRequest } from './mastering_core';\nexport type {\n ClippingRegion,\n ClippingReport,\n DynamicRangeReport,\n MeteringDetectClippingOptions,\n MeteringDetectClippingRequest,\n MeteringDynamicRangeOptions,\n MeteringDynamicRangeRequest,\n MeteringSamplesRequest,\n MeteringSilenceRatioRequest,\n MeteringSpectrumFrameRequest,\n MeteringSpectrumRequest,\n MeteringStereoDecimatedRequest,\n MeteringStereoRequest,\n MeteringTruePeakRequest,\n PhaseScopeReport,\n SpectrumOptions,\n SpectrumReport,\n VectorscopeReport,\n WaveformPeakPyramidOptions,\n WaveformPeakPyramidRequest,\n WaveformPeaksOptions,\n WaveformPeaksReport,\n WaveformPeaksRequest,\n} from './metering';\nexport {\n meteringCrestFactorDb,\n meteringCrestFactorDbStereo,\n meteringDcOffset,\n meteringDetectClipping,\n meteringDynamicRange,\n meteringPeakDb,\n meteringPhaseScope,\n meteringPhaseScopeDecimated,\n meteringRmsDb,\n meteringSilenceRatio,\n meteringSpectrum,\n meteringSpectrumFrame,\n meteringStereoCorrelation,\n meteringStereoWidth,\n meteringTruePeakDb,\n meteringVectorscope,\n meteringVectorscopeDecimated,\n waveformPeakPyramid,\n waveformPeaks,\n} from './metering';\nexport type { SuggestMixSceneRequest } from './mixing_assistant';\nexport {\n mixSourceClassFromName,\n mixSourceClassNames,\n suggestMixScene,\n suggestMixSceneJson,\n} from './mixing_assistant';\nexport type {\n OpfsClipPageProviderBinding,\n OpfsClipPageProviderOptions,\n} from './opfs_clip_pages';\nexport {\n createOpfsClipPageProvider,\n createOpfsClipPageWorker,\n opfsClipPageWorkerSource,\n} from './opfs_clip_pages';\nexport {\n HrtfSet,\n PlaybackLoudnessMeter,\n PlaybackRenderer,\n renderPlayback,\n} from './playback_renderer';\nexport type { AnalyzePolyphonicRequest } from './polyphony';\nexport { analyzePolyphonic, PolyphonicAnalysis } from './polyphony';\nexport type {\n AlignTakeToReferenceRequest,\n AlignTakeToReferenceResult,\n Articulation,\n BuiltinSynthBinding,\n BuiltinSynthConfig,\n BuiltinSynthWaveform,\n ControllerAxis,\n ControllerBinding,\n ControllerInput,\n ExternalSeparatedStem,\n ExternalSeparatedStemImportRequest,\n ExternalSeparatedStemImportResult,\n MidiCcLearnOptions,\n MpeDimension,\n NoteTracking,\n PartRig,\n PartRigInsert,\n PartRigMode,\n ProjectAssistSidecar,\n ProjectAssistSidecarInput,\n ProjectAutomationCurve,\n ProjectAutomationLaneDesc,\n ProjectAutomationPoint,\n ProjectAutomationTargetKind,\n ProjectBounceOptions,\n ProjectChordSymbol,\n ProjectClip,\n ProjectClipCompSegment,\n ProjectClipDesc,\n ProjectClipFade,\n ProjectClipTake,\n ProjectCompileResult,\n ProjectCompileTimelineResult,\n ProjectFadeCurve,\n ProjectKeySegment,\n ProjectLoopMode,\n ProjectLoopRecordingDesc,\n ProjectLoopRecordingResult,\n ProjectMarker,\n ProjectMidiClipResult,\n ProjectMidiEvent,\n ProjectMidiFxBakeRequest,\n ProjectMidiFxBakeResult,\n ProjectMidiFxPreviewRequest,\n ProjectNotePairValidation,\n ProjectSource,\n ProjectTempoCandidate,\n ProjectTempoOptions,\n ProjectTempoSegment,\n ProjectTimeSignatureSegment,\n ProjectTrack,\n ProjectTrackDesc,\n ProjectTrackKind,\n ProjectTranscribeRequest,\n ProjectWarpAnchor,\n ProjectWarpMapDesc,\n SampleDesc,\n SampleDescLoopMode,\n SampleKeyTrack,\n SampleLoopMode,\n SampleZoneDesc,\n Sf2InstrumentConfig,\n Sf2ProgramStatus,\n SourceBackend,\n SynthBodyType,\n SynthEngineMode,\n SynthEnumTables,\n SynthFilterModel,\n SynthFilterOutput,\n SynthModDestination,\n SynthModRouting,\n SynthModSource,\n SynthOscWaveform,\n SynthPatch,\n SynthRetrigger,\n TakeAlignment,\n TranscribeOptions,\n TranscribeResult,\n} from './project';\nexport {\n ARTICULATIONS,\n AutomationTargetKind,\n BUILTIN_SYNTH_WAVEFORMS,\n CONTROLLER_AXES,\n CONTROLLER_INPUTS,\n controllerProfileNames,\n EXPECTED_PROJECT_ABI_VERSION,\n MarkerKind,\n MPE_DIMENSIONS,\n NOTE_TRACKINGS,\n PART_RIG_ALL_PARTS,\n PART_RIG_MODES,\n PROJECT_AUTOMATION_TARGET_OPAQUE,\n PROJECT_AUTOMATION_TARGET_TRACK_FADER_DB,\n PROJECT_AUTOMATION_TARGET_TRACK_PAN,\n Project,\n ProjectTimeline,\n projectAbiVersion,\n SAMPLE_KEY_TRACKS,\n SAMPLE_LOOP_MODES,\n SampleBank,\n SYNTH_BODY_TYPES,\n SYNTH_ENGINE_MODES,\n SYNTH_FILTER_MODELS,\n SYNTH_FILTER_OUTPUTS,\n SYNTH_MOD_DESTINATIONS,\n SYNTH_MOD_SOURCES,\n SYNTH_OSC_WAVEFORMS,\n SYNTH_RETRIGGERS,\n synthEnumTables,\n synthGsDrumKitIsVoicedApart,\n synthGsDrumKitName,\n synthGsVariationIsVoicedApart,\n synthPresetNames,\n synthPresetPatch,\n} from './project';\nexport type {\n AcousticOptions,\n AcousticResult,\n AnalysisChord,\n AnalysisResult,\n AnalyzeBpmOptions,\n AnalyzeDynamicsOptions,\n AnalyzeRhythmOptions,\n AnalyzeSectionsOptions,\n AnalyzeTimbreOptions,\n AutomationCurve,\n Beat,\n Boundary,\n BoundaryOptions,\n BoundaryResult,\n BpmHypothesis,\n CapabilityCatalog,\n CapabilityCatalogMasteringPreset,\n CapabilityCatalogParameter,\n CapabilityCatalogPresets,\n CapabilityCatalogProcessor,\n Chord,\n ChordAnalysisResult,\n ChordDetectionOptions,\n ChromaResult,\n ClickDetection,\n ClipDetection,\n CqtResult,\n CrackleDetection,\n DeclickReport,\n DeclipReport,\n DecrackleReport,\n DehumReport,\n DenoiseReport,\n DereverbReport,\n Dynamics,\n EqBand,\n EqBandPhase,\n EqBandType,\n EqCoeffMode,\n EqMatchOptions,\n EqSpectrumSnapshot,\n EqStereoPlacement,\n GoniometerPoint,\n HpssResult,\n HumDetection,\n Key,\n KeyCandidate,\n KeyDetectionOptions,\n KeyProfileName,\n LoudnessMatchResult,\n LoudnessMatchStereoResult,\n LufsResult,\n LufsSeriesResult,\n MasteringAssistantParams,\n MasteringChainConfig,\n MasteringChainResult,\n MasteringChainStereoResult,\n MasteringLoudnessSummary,\n MasteringOptions,\n MasteringPreset,\n MasteringProcessorParams,\n MasteringRepairDeclickStereoResult,\n MasteringRepairDeclipStereoResult,\n MasteringRepairDecrackleStereoResult,\n MasteringRepairDehumStereoResult,\n MasteringRepairDenoiseClassicalLinkedResult,\n MasteringRepairDenoiseClassicalStereoResult,\n MasteringRepairDereverbClassicalLinkedResult,\n MasteringRepairDereverbClassicalStereoResult,\n MasteringRepairTrimSilenceStereoResult,\n MasteringReport,\n MasteringResult,\n MasteringStereoChainResult,\n MasteringStereoResult,\n MelodyPoint,\n MelodyResult,\n MelPowerResult,\n MelSpectrogramResult,\n MeterTap,\n MfccResult,\n MixAnalysisBand,\n MixAssistantMixProfile,\n MixAssistantOptions,\n MixAssistantResult,\n MixAssistantTrack,\n MixAssistantTrackProfile,\n MixBandDominance,\n MixBandOccupancy,\n MixCrowdedBand,\n MixerProcessResult,\n MixMeterSnapshot,\n MixMonoRisk,\n MixOptions,\n MixResult,\n MixSceneBus,\n MixSceneConnection,\n MixSceneDocument,\n MixSceneInsert,\n MixSceneSend,\n MixSceneStrip,\n MixSceneVcaGroup,\n MixTrackAlignment,\n NoiseDetection,\n NoteEdit,\n NoteEditInput,\n NoteExtractorOptions,\n NoteObject,\n NoteObjectInput,\n NoteSegment,\n NoteSetEntry,\n NoteStretchOptions,\n NoteTarget,\n NoteTargetAssignResult,\n NoteTargetUnmatchedPolicy,\n PairAnalysis,\n PairProcessor,\n PanLaw,\n PanLawInput,\n PanLawName,\n PanMode,\n PercussiveEvent,\n PercussiveEventEdit,\n PercussiveEventEditInput,\n PercussiveEventInput,\n PitchCorrectOptions,\n PitchDecompositionResult,\n PitchResult,\n PlaybackBassManagementConfig,\n PlaybackChannelRole,\n PlaybackDiagnostics,\n PlaybackHeadTrackingConfig,\n PlaybackInputConfig,\n PlaybackLoudnessConfig,\n PlaybackNightModeConfig,\n PlaybackOutputLimiterConfig,\n PlaybackRendererConfig,\n PlaybackRendererOptions,\n PlaybackRoomConfig,\n PlaybackSpeakerConfig,\n PlaybackStageLatency,\n PlaybackStageName,\n PlaybackTargetConfig,\n PlaybackUpmixConfig,\n PolyphonicAnalysisOptions,\n PolyphonicRenderOptions,\n RealtimeVoiceChangerConfigInput,\n RealtimeVoiceChangerPodConfig,\n RenderPlaybackRequest,\n RenderPlaybackResult,\n ReverbDetection,\n RhythmFeatures,\n RirDiagnostic,\n RirResult,\n RirSynthOptions,\n RoomEstimateOptions,\n RoomEstimateResult,\n RoomGeometryOptions,\n RoomMorphOptions,\n RoomMorphResult,\n Section,\n SegmentMatrix,\n SendTiming,\n SidechainSourceKind,\n SoloProcessor,\n SonareCapabilities,\n SpectralEditMode,\n SpectralEditOptions,\n SpectralEditWindow,\n SpectralRegionOp,\n StageGainReduction,\n StereoAnalysis,\n StereoPairProcessor,\n StftPowerResult,\n StftResult,\n StreamingEqualizerConfig,\n StreamingMasteringChainConfig,\n StreamingPlatform,\n StreamingRetuneConfig,\n TempogramMode,\n Timbre,\n TimeSignature,\n TrimRange,\n TrimReport,\n UmpWords,\n VoicedFlags,\n VoicePresetId,\n} from './public_types';\nexport {\n ChordQuality,\n KeyProfile,\n Mode,\n PitchClass,\n SectionType,\n} from './public_types';\nexport type * from './public_types_vocal_edit';\nexport type {\n AnalyzeBpmRequest,\n AnalyzeDynamicsRequest,\n AnalyzeImpulseResponseRequest,\n AnalyzeRhythmRequest,\n AnalyzeTimbreRequest,\n AnalyzeWithProgressRequest,\n BpmAnalysisResult,\n BpmCandidate,\n ChordFunctionalAnalysisRequest,\n DetectAcousticRequest,\n DetectChordsRequest,\n DetectKeyRequest,\n DetectOnsetsRequest,\n DynamicsAnalysisResult,\n DynamicsResult,\n EstimateMeterRequest,\n EstimateRoomRequest,\n MusicAnalyzeRequest,\n RhythmAnalysisResult,\n RoomMorphRequest,\n SamplesRequest,\n TimbreAnalysisResult,\n TimbreFrame,\n} from './quick_analysis';\nexport {\n analyze,\n analyzeBpm,\n analyzeDynamics,\n analyzeImpulseResponse,\n analyzeRhythm,\n analyzeTimbre,\n analyzeWithProgress,\n chordFunctionalAnalysis,\n detectAcoustic,\n detectBeats,\n detectBpm,\n detectChords,\n detectDownbeats,\n detectKey,\n detectKeyCandidates,\n detectOnsets,\n estimateMeter,\n estimateRoom,\n hasFfmpegSupport,\n roomMorph,\n synthesizeRir,\n} from './quick_analysis';\nexport type {\n ClipPageRequest,\n EngineAutomationPoint,\n EngineBounceOptions,\n EngineBounceResult,\n EngineBus,\n EngineCapabilities,\n EngineCaptureSource,\n EngineCaptureStatus,\n EngineClip,\n EngineFreezeOptions,\n EngineFreezeResult,\n EngineGraphSpec,\n EngineMarker,\n EngineMeterTelemetry,\n EngineMeterTelemetryWide,\n EngineMetronomeConfig,\n EngineMidiClipSchedule,\n EngineMidiEvent,\n EngineParameterInfo,\n EngineScopeTelemetry,\n EngineTelemetry,\n EngineTempoSegment,\n EngineTimeSignatureSegment,\n EngineTrackLane,\n EngineTrackMonitorMode,\n EngineTrackSend,\n EngineTransportState,\n ExternalMidiEvent,\n MidiCcBindOptions,\n RenderOfflineRequest,\n TrackMonitorMode,\n} from './realtime_engine';\nexport {\n ClipPageProvider,\n EXPECTED_ENGINE_ABI_VERSION,\n engineCapabilities,\n RealtimeEngine,\n} from './realtime_engine';\nexport { scaleCorrectionSemitones, scalePitchClassEnabled, scaleQuantizeMidi } from './scale';\nexport type { ProgressCallback } from './sonare.js';\nexport { StreamAnalyzer, streamAnalyzerConfigDefaults } from './stream_analyzer';\nexport type {\n AnalyzerStats,\n BarChord,\n ChordChange,\n FrameBuffer,\n PatternScore,\n ProgressiveEstimate,\n StreamConfig,\n StreamConfigDefaults,\n StreamFramesI16,\n StreamFramesU8,\n StreamQuantizeConfig,\n} from './stream_types';\nexport type {\n MixerMeterSnapshot,\n MixerRealtimeBuffer,\n RealtimeVoiceChangerInterleavedBuffer,\n RealtimeVoiceChangerMonoBuffer,\n RealtimeVoiceChangerPlanarBuffer,\n StripMeteringOptions,\n} from './streaming_mixing';\nexport {\n Mixer,\n RealtimeVoiceChanger,\n realtimeVoiceChangerPresetJson,\n realtimeVoiceChangerPresetNames,\n StreamingEqualizer,\n StreamingMasteringChain,\n StreamingRetune,\n validateRealtimeVoiceChangerPresetJson,\n} from './streaming_mixing';\nexport type { TranscribeRequest } from './transcribe';\nexport { transcribe } from './transcribe';\nexport type { ValidateOptions } from './validation';\nexport {\n createVocalEditSession,\n restoreVocalEditSession,\n VocalEditDraft,\n VocalEditSession,\n VocalRenderJob,\n VocalRenderSnapshot,\n vocalEditApiVersion,\n vocalEditAvailable,\n} from './vocal_edit';\nexport type {\n VocalEditWorker,\n VocalEditWorkerCallOptions,\n VocalEditWorkerClientOptions,\n VocalEditWorkerTransferOptions,\n} from './vocal_edit_worker_client';\nexport {\n VocalEditWorkerClient,\n VocalEditWorkerSession,\n VocalEditWorkerStaleResultError,\n VocalEditWorkerTask,\n} from './vocal_edit_worker_client';\nexport type * from './vocal_edit_worker_protocol';\nexport type {\n BindWebMidiOptions,\n WebMidiBinding,\n WebMidiCcBinding,\n WebMidiInputInfo,\n} from './web_midi';\nexport { bindWebMidi, isWebMidiAvailable } from './web_midi';\nexport type {\n OfflineWorker,\n OfflineWorkerCallOptions,\n OfflineWorkerClientOptions,\n OfflineWorkerProgress,\n} from './worker_client';\nexport { OfflineWorkerClient, OfflineWorkerTask } from './worker_client';\n\n/** Row-major 2-D matrix as a flat buffer plus its dimensions. */\nexport type Matrix2dResult = WasmMatrix2dResult;\n/** NMF factor matrices { w, h } from {@link decompose}. */\nexport type DecomposeResult = WasmDecomposeResult;\n/** Harmonic / percussive / residual signals from {@link hpssWithResidual}. */\nexport type HpssWithResidualResult = WasmHpssWithResidualResult;\n\n// ============================================================================\n// Module State\n// ============================================================================\n\nlet module: SonareModule | null = null;\nlet initPromise: Promise<void> | null = null;\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize the WASM module.\n * Must be called before using any analysis functions.\n *\n * @param options - Optional module configuration\n * @returns Promise that resolves when initialization is complete\n */\nexport async function init(options?: {\n locateFile?: (path: string, prefix: string) => string;\n wasmBinary?: ArrayBuffer | Uint8Array;\n moduleFactory?: (options?: {\n locateFile?: (path: string, prefix: string) => string;\n wasmBinary?: ArrayBuffer | Uint8Array;\n }) => Promise<SonareModule>;\n}): Promise<void> {\n if (module) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async () => {\n try {\n const createModule = options?.moduleFactory ?? (await import('./sonare.js')).default;\n module = await createModule(options);\n setSonareModule(module);\n } catch (error) {\n initPromise = null;\n throw error;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if the module is initialized.\n */\nexport function isInitialized(): boolean {\n return module !== null;\n}\n\n/**\n * Get the library version.\n */\nexport function version(): string {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.version();\n}\n\n/**\n * Return the capabilities of the loaded WASM build.\n *\n * This is synchronous and only describes the already-initialized module.\n */\nexport function capabilities(): SonareCapabilities {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.capabilities();\n}\n\n/** Return the initialized module's processors, parameters, and presets. */\nexport function capabilityCatalog(): CapabilityCatalog {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return JSON.parse(module.capabilityCatalog()) as CapabilityCatalog;\n}\n\n/**\n * Aggregate native ABI version: the per-subsystem ABI macros folded into one\n * 32-bit value. It bumps whenever any flat C POD layout changes, so callers can\n * detect an incompatible prebuilt binary. Matches the Node/Python `abiVersion()`.\n */\nexport function abiVersion(): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.abiVersion();\n}\n\nexport function engineAbiVersion(): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.engineAbiVersion();\n}\n\nexport function voiceChangerAbiVersion(): number {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.voiceChangerAbiVersion();\n}\n\n// Canonical ordinal order of the built-in voice-character presets, matching the\n// C ABI SonareVoiceCharacterPreset enum and SONARE_REALTIME_VOICE_CHANGER_PRESET_IDS.\nconst VOICE_PRESET_ORDINALS: readonly VoicePresetId[] = [\n 'neutral-monitor',\n 'bright-idol',\n 'soft-whisper',\n 'deep-narrator',\n 'robot-mascot',\n 'dark-villain',\n];\n\nfunction resolveVoicePresetOrdinal(preset: VoicePresetId | number): number {\n if (typeof preset === 'number') {\n if (!Number.isSafeInteger(preset) || preset < 0 || preset >= VOICE_PRESET_ORDINALS.length) {\n throw new RangeError(`Unknown voice-character preset ordinal: ${String(preset)}`);\n }\n return preset;\n }\n const ordinal = VOICE_PRESET_ORDINALS.indexOf(preset);\n if (ordinal < 0) {\n throw new Error(`Unknown voice character preset: ${preset}`);\n }\n return ordinal;\n}\n\n/**\n * Map a voice-character preset ordinal (or canonical id) to its canonical id\n * string (e.g. `'bright-idol'`). Unknown numeric ordinals return `null`;\n * unknown preset ids throw.\n */\nexport function voiceCharacterPresetId(preset: VoicePresetId | number): VoicePresetId | null {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n if (\n typeof preset === 'number' &&\n (!Number.isSafeInteger(preset) || preset < 0 || preset >= VOICE_PRESET_ORDINALS.length)\n ) {\n return null;\n }\n return module.voiceCharacterPresetId(resolveVoicePresetOrdinal(preset)) as VoicePresetId;\n}\n\n/**\n * Return the canonical (normalized) flat POD config for a built-in voice\n * preset, skipping the JSON round-trip. Accepts a canonical preset id or its\n * integer ordinal. Invalid ordinals throw.\n */\nexport function realtimeVoiceChangerPresetConfig(\n preset: VoicePresetId | number,\n): RealtimeVoiceChangerPodConfig {\n if (!module) {\n throw new Error('Module not initialized. Call init() first.');\n }\n return module.realtimeVoiceChangerPresetConfig(resolveVoicePresetOrdinal(preset));\n}\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport { PitchClass as Pitch } from './public_types';\n\nexport type * from './public_types_vocal_project';\n","import { init } from './index';\nimport type {\n VocalAnalysis,\n VocalCapabilities,\n VocalCreateRequest,\n VocalEditOperation,\n VocalEditResult,\n VocalHistoryState,\n VocalNotesResult,\n VocalPitchEvaluation,\n VocalRenderResult,\n VocalRestoreRequest,\n VocalStateBytes,\n VocalStateToken,\n} from './public_types_vocal_edit';\nimport {\n createVocalEditSession,\n restoreVocalEditSession,\n type VocalRenderJob,\n type VocalRenderSnapshot,\n} from './vocal_edit';\nimport {\n compareUint64,\n type VocalWorkerCreateMessage,\n type VocalWorkerCreateResult,\n type VocalWorkerErrorMessage,\n type VocalWorkerMutateMessage,\n type VocalWorkerPreviewMessage,\n type VocalWorkerRequestMessage,\n type VocalWorkerResponseMessage,\n type VocalWorkerResult,\n} from './vocal_edit_worker_protocol';\n\nexport interface VocalEditWorkerEndpoint {\n postMessage(message: VocalWorkerResponseMessage, transfer?: Transferable[]): void;\n addEventListener(\n type: 'message',\n listener: (event: MessageEvent<VocalWorkerRequestMessage>) => void,\n ): void;\n}\n\nexport interface VocalEditWorkerNativeDraft {\n token(): VocalStateToken;\n notes(): VocalNotesResult;\n apply(request: {\n expectedGeneration: string;\n operations: readonly VocalEditOperation[];\n }): VocalEditResult;\n commit(expectedRevision: string): VocalEditResult;\n cancel(): void;\n evaluatePitch(noteId: number): VocalPitchEvaluation;\n sourceSampleToDestinationSample(noteId: number, sourceSample: number): number;\n destinationSampleToSourceSample(noteId: number, destinationSample: number): number;\n captureRenderSnapshot(): VocalRenderSnapshot;\n exportState?(): VocalStateBytes;\n dispose(): void;\n}\n\nexport interface VocalEditWorkerNativeSession {\n token(): VocalStateToken;\n notes(): VocalNotesResult;\n analysis(): VocalAnalysis;\n capabilities(): VocalCapabilities;\n beginEdit(expectedRevision?: string): VocalEditWorkerNativeDraft;\n undo(expectedRevision?: string): VocalEditResult;\n redo(expectedRevision?: string): VocalEditResult;\n outputLengthSamples(): number;\n history(): VocalHistoryState;\n evaluatePitch(noteId: number): VocalPitchEvaluation;\n sourceSampleToDestinationSample(noteId: number, sourceSample: number): number;\n destinationSampleToSourceSample(noteId: number, destinationSample: number): number;\n captureRenderSnapshot(): VocalRenderSnapshot;\n exportState(): Uint8Array;\n dispose(): void;\n}\n\nexport interface VocalEditWorkerFactory {\n create(request: VocalCreateRequest): VocalEditWorkerNativeSession;\n restore(request: VocalRestoreRequest): VocalEditWorkerNativeSession;\n}\n\nconst productionFactory: VocalEditWorkerFactory = {\n create: createVocalEditSession,\n restore: restoreVocalEditSession,\n};\n\ninterface ActiveCommand {\n id: number;\n cancelled: boolean;\n preview: boolean;\n cancelBuffer?: SharedArrayBuffer;\n}\n\ninterface QueuedCommand {\n message: VocalWorkerMutateMessage | VocalWorkerPreviewMessage;\n active: ActiveCommand;\n}\n\ninterface WorkerSession {\n value: VocalEditWorkerNativeSession;\n draft?: VocalEditWorkerNativeDraft;\n latestIntent: string;\n queue: QueuedCommand[];\n running: ActiveCommand | undefined;\n draining: boolean;\n /** Set synchronously when a dispose arrives; the session accepts no more work. */\n disposing: boolean;\n /** Settles once the native session is released. */\n released?: Promise<void>;\n}\n\nfunction errorPayload(error: unknown): VocalWorkerErrorMessage['error'] {\n const candidate = error as Partial<Error> & {\n code?: number;\n codeName?: string;\n reason?: number;\n field?: string;\n expected?: string;\n actual?: string;\n expectedText?: string;\n actualText?: string;\n };\n return {\n name: candidate.name ?? 'Error',\n message: candidate.message ?? String(error),\n ...(candidate.code === undefined ? {} : { code: candidate.code }),\n ...(candidate.codeName === undefined ? {} : { codeName: candidate.codeName }),\n ...(candidate.reason === undefined ? {} : { reason: candidate.reason }),\n ...(candidate.field === undefined ? {} : { field: candidate.field }),\n ...(candidate.expected === undefined ? {} : { expected: candidate.expected }),\n ...(candidate.actual === undefined ? {} : { actual: candidate.actual }),\n ...(candidate.expectedText === undefined ? {} : { expectedText: candidate.expectedText }),\n ...(candidate.actualText === undefined ? {} : { actualText: candidate.actualText }),\n };\n}\n\nfunction transferables(value: unknown): Transferable[] {\n const result: Transferable[] = [];\n const seen = new Set<ArrayBuffer>();\n const visit = (item: unknown): void => {\n if (item === null || item === undefined || typeof item !== 'object') {\n return;\n }\n if (ArrayBuffer.isView(item)) {\n const buffer = item.buffer;\n if (buffer instanceof ArrayBuffer && !seen.has(buffer)) {\n seen.add(buffer);\n result.push(buffer);\n }\n return;\n }\n if (item instanceof ArrayBuffer) {\n if (!seen.has(item)) {\n seen.add(item);\n result.push(item);\n }\n return;\n }\n if (Array.isArray(item)) {\n item.forEach(visit);\n return;\n }\n Object.values(item).forEach(visit);\n };\n visit(value);\n return result;\n}\n\nfunction cancelledError(): Error {\n const error = new Error('Vocal render cancelled');\n error.name = 'AbortError';\n return error;\n}\n\nfunction isCancelled(active: ActiveCommand): boolean {\n return (\n active.cancelled ||\n (active.cancelBuffer !== undefined &&\n Atomics.load(new Int32Array(active.cancelBuffer), 0) !== 0)\n );\n}\n\nfunction nextMacrotask(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\nfunction resultToken(value: unknown, session: WorkerSession): VocalStateToken {\n const candidate = value as { token?: VocalStateToken } | null;\n return candidate?.token ?? currentToken(session);\n}\n\nfunction currentToken(session: WorkerSession): VocalStateToken {\n return session.draft?.token() ?? session.value.token();\n}\n\nfunction postResult(\n endpoint: VocalEditWorkerEndpoint,\n id: number,\n sessionId: string,\n clientIntentSequence: string,\n result: VocalWorkerResult,\n token?: VocalStateToken,\n): void {\n endpoint.postMessage(\n {\n type: 'sonare:vocal-result',\n id,\n sessionId,\n clientIntentSequence,\n result,\n ...(token ? { token } : {}),\n },\n transferables(result),\n );\n}\n\nfunction postError(\n endpoint: VocalEditWorkerEndpoint,\n id: number,\n sessionId: string,\n clientIntentSequence: string,\n error: unknown,\n token?: VocalStateToken,\n): void {\n endpoint.postMessage({\n type: 'sonare:vocal-error',\n id,\n sessionId,\n clientIntentSequence,\n error: errorPayload(error),\n ...(token ? { token } : {}),\n });\n}\n\nfunction rejectQueuedCommands(\n endpoint: VocalEditWorkerEndpoint,\n session: WorkerSession,\n error: Error,\n): void {\n for (const queued of session.queue) {\n postError(\n endpoint,\n queued.message.id,\n queued.message.sessionId,\n queued.message.clientIntentSequence,\n error,\n currentToken(session),\n );\n }\n session.queue = [];\n}\n\n// Mutations are validated by the native expectedRevision/expectedGeneration\n// checks when they run, not against the token the client held at enqueue time:\n// a pipelined mutation queued behind another one legitimately carries an older\n// base token. Only a token from a different session epoch is refused here.\nfunction ensureSameEpoch(\n message: VocalWorkerMutateMessage | VocalWorkerPreviewMessage,\n session: WorkerSession,\n): void {\n if (message.baseToken && message.baseToken.sessionEpoch !== currentToken(session).sessionEpoch) {\n const error = new Error('The vocal edit request targets another session epoch');\n error.name = 'StaleResultError';\n throw error;\n }\n}\n\nfunction draftRequired(session: WorkerSession): VocalEditWorkerNativeDraft {\n if (!session.draft) {\n throw new Error('No vocal edit draft is open');\n }\n return session.draft;\n}\n\n/** The open draft when `draft` is set, otherwise the session. */\nfunction readTarget(\n session: WorkerSession,\n draft: boolean | undefined,\n): VocalEditWorkerNativeDraft | VocalEditWorkerNativeSession {\n return draft === true ? draftRequired(session) : session.value;\n}\n\nasync function runPreview(\n message: VocalWorkerPreviewMessage,\n session: WorkerSession,\n active: ActiveCommand,\n endpoint: VocalEditWorkerEndpoint,\n): Promise<VocalRenderResult> {\n const snapshot = session.draft\n ? session.draft.captureRenderSnapshot()\n : session.value.captureRenderSnapshot();\n let job: VocalRenderJob | undefined;\n try {\n job = snapshot.beginRenderJob({ ...message.request, signal: undefined });\n while (true) {\n if (isCancelled(active)) {\n job.abort();\n throw cancelledError();\n }\n const progress = job.next();\n endpoint.postMessage({\n type: 'sonare:vocal-progress',\n id: message.id,\n sessionId: message.sessionId,\n clientIntentSequence: message.clientIntentSequence,\n complete: progress.complete,\n token: currentToken(session),\n });\n if (progress.complete) {\n return job.finalize();\n }\n // One job_next call per macrotask is intentional. Without the yield a\n // cancel message cannot reach a synchronous WASM renderer on browsers\n // that do not expose SharedArrayBuffer.\n await nextMacrotask();\n }\n } finally {\n job?.dispose();\n snapshot.dispose();\n }\n}\n\nasync function execute(\n command: QueuedCommand,\n session: WorkerSession,\n endpoint: VocalEditWorkerEndpoint,\n): Promise<void> {\n const message = command.message;\n const active = command.active;\n session.running = active;\n try {\n ensureSameEpoch(message, session);\n let result: VocalWorkerResult;\n if (message.type === 'sonare:vocal-preview') {\n result = await runPreview(message, session, active, endpoint);\n } else {\n const mutation = message.mutation;\n switch (mutation.kind) {\n case 'beginEdit':\n if (session.draft) {\n throw new Error('A vocal edit draft is already open');\n }\n session.draft = session.value.beginEdit(mutation.expectedRevision);\n result = session.draft.token();\n break;\n case 'apply':\n result = draftRequired(session).apply(mutation.request);\n break;\n case 'commit':\n result = draftRequired(session).commit(mutation.expectedRevision);\n session.draft?.dispose();\n session.draft = undefined;\n break;\n case 'cancel':\n draftRequired(session).cancel();\n session.draft?.dispose();\n session.draft = undefined;\n result = null;\n break;\n case 'undo':\n if (session.draft) {\n throw new Error('Cancel or commit the vocal draft before undo');\n }\n result = session.value.undo(mutation.expectedRevision);\n break;\n case 'redo':\n if (session.draft) {\n throw new Error('Cancel or commit the vocal draft before redo');\n }\n result = session.value.redo(mutation.expectedRevision);\n break;\n case 'notes':\n result = session.draft ? session.draft.notes() : session.value.notes();\n break;\n case 'analysis':\n result = session.value.analysis();\n break;\n case 'capabilities':\n result = session.value.capabilities();\n break;\n case 'exportState':\n if (session.draft) {\n throw new Error('Commit or cancel the vocal draft before export');\n }\n result = { data: session.value.exportState() };\n break;\n case 'outputLength':\n result = session.value.outputLengthSamples();\n break;\n case 'history':\n result = session.value.history();\n break;\n case 'draftToken':\n result = draftRequired(session).token();\n break;\n case 'evaluatePitch':\n result = readTarget(session, mutation.draft).evaluatePitch(mutation.noteId);\n break;\n case 'mapCoordinate': {\n const target = readTarget(session, mutation.draft);\n result = mutation.inverse\n ? target.destinationSampleToSourceSample(mutation.noteId, mutation.sample)\n : target.sourceSampleToDestinationSample(mutation.noteId, mutation.sample);\n break;\n }\n }\n }\n // A mutation that ran is reported as run: cancellation covers renders only.\n if (message.type === 'sonare:vocal-preview' && isCancelled(active)) {\n throw cancelledError();\n }\n postResult(\n endpoint,\n message.id,\n message.sessionId,\n message.clientIntentSequence,\n result,\n resultToken(result, session),\n );\n } catch (error) {\n postError(\n endpoint,\n message.id,\n message.sessionId,\n message.clientIntentSequence,\n error,\n currentToken(session),\n );\n } finally {\n session.running = undefined;\n }\n}\n\nasync function drain(session: WorkerSession, endpoint: VocalEditWorkerEndpoint): Promise<void> {\n if (session.draining) {\n return;\n }\n session.draining = true;\n try {\n while (session.queue.length !== 0 && !session.disposing) {\n const command = session.queue.shift() as QueuedCommand;\n await execute(command, session, endpoint);\n }\n } finally {\n session.draining = false;\n }\n}\n\nfunction queueCommand(\n endpoint: VocalEditWorkerEndpoint,\n sessions: Map<string, WorkerSession>,\n message: VocalWorkerMutateMessage | VocalWorkerPreviewMessage,\n): void {\n const session = sessions.get(message.sessionId);\n if (!session || session.disposing) {\n postError(\n endpoint,\n message.id,\n message.sessionId,\n message.clientIntentSequence,\n new Error('Unknown vocal session'),\n );\n return;\n }\n if (compareUint64(message.clientIntentSequence, session.latestIntent) <= 0) {\n const error = new Error('A stale vocal client intent was rejected');\n error.name = 'StaleResultError';\n postError(\n endpoint,\n message.id,\n message.sessionId,\n message.clientIntentSequence,\n error,\n currentToken(session),\n );\n return;\n }\n session.latestIntent = message.clientIntentSequence;\n if (message.type === 'sonare:vocal-preview') {\n // Only previews that have not started may be coalesced. Mutations remain\n // FIFO so a rapid sequence of drag updates cannot reorder the edit state.\n const stale = session.queue.filter(\n (command) => command.message.type === 'sonare:vocal-preview',\n );\n session.queue = session.queue.filter(\n (command) => command.message.type !== 'sonare:vocal-preview',\n );\n for (const command of stale) {\n postError(\n endpoint,\n command.message.id,\n command.message.sessionId,\n command.message.clientIntentSequence,\n Object.assign(new Error('Preview superseded'), { name: 'StaleResultError' }),\n currentToken(session),\n );\n }\n }\n session.queue.push({\n message,\n active: {\n id: message.id,\n cancelled: false,\n preview: message.type === 'sonare:vocal-preview',\n cancelBuffer: message.cancelBuffer,\n },\n });\n void drain(session, endpoint);\n}\n\nexport interface VocalEditWorkerDependencies {\n factory?: VocalEditWorkerFactory;\n initialize?: () => Promise<void>;\n}\n\nconst UINT64_MAX = '18446744073709551615';\n\nconst mutationKinds = new Set<string>([\n 'beginEdit',\n 'apply',\n 'commit',\n 'cancel',\n 'undo',\n 'redo',\n 'notes',\n 'analysis',\n 'capabilities',\n 'exportState',\n 'outputLength',\n 'history',\n 'draftToken',\n 'evaluatePitch',\n 'mapCoordinate',\n]);\n\nfunction malformed(message: string): TypeError {\n return new TypeError(`malformed vocal Worker message: ${message}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\nfunction isDecimalUint64(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n /^(0|[1-9]\\d*)$/.test(value) &&\n compareUint64(value, UINT64_MAX) <= 0\n );\n}\n\nfunction optionalDecimal(value: unknown, field: string): void {\n if (value !== undefined && !isDecimalUint64(value)) {\n throw malformed(`${field} must be a decimal uint64 string`);\n }\n}\n\n/** The request id a reply can be addressed to, or undefined when none can. */\nfunction replyId(data: unknown): number | undefined {\n // A cancel names another request's id; answering it would settle that call.\n if (!isRecord(data) || data.type === 'sonare:vocal-cancel') {\n return undefined;\n }\n return Number.isSafeInteger(data.id) && (data.id as number) > 0 ? (data.id as number) : undefined;\n}\n\n/** Check the shape of an incoming message; payload contents are checked natively. */\nfunction validateRequest(data: unknown): VocalWorkerRequestMessage {\n if (!isRecord(data)) {\n throw malformed('message must be an object');\n }\n if (!Number.isSafeInteger(data.id) || (data.id as number) <= 0) {\n throw malformed('id must be a positive safe integer');\n }\n if (typeof data.sessionId !== 'string' || data.sessionId.length === 0) {\n throw malformed('sessionId must be a non-empty string');\n }\n if (!isDecimalUint64(data.clientIntentSequence)) {\n throw malformed('clientIntentSequence must be a decimal uint64 string');\n }\n if (\n data.cancelBuffer !== undefined &&\n !(\n typeof SharedArrayBuffer !== 'undefined' &&\n data.cancelBuffer instanceof SharedArrayBuffer &&\n data.cancelBuffer.byteLength >= Int32Array.BYTES_PER_ELEMENT\n )\n ) {\n throw malformed('cancelBuffer must be a SharedArrayBuffer');\n }\n if (\n data.baseToken !== undefined &&\n !(isRecord(data.baseToken) && isDecimalUint64(data.baseToken.sessionEpoch))\n ) {\n throw malformed('baseToken must be a state token');\n }\n switch (data.type) {\n case 'sonare:vocal-create': {\n const request = data.request;\n if (\n !isRecord(request) ||\n (request.kind !== 'create' && request.kind !== 'restore') ||\n !isRecord(request.request)\n ) {\n throw malformed('create request must name create or restore with a request object');\n }\n break;\n }\n case 'sonare:vocal-mutate': {\n const mutation = data.mutation;\n if (\n !isRecord(mutation) ||\n typeof mutation.kind !== 'string' ||\n !mutationKinds.has(mutation.kind)\n ) {\n throw malformed('mutation.kind is not a vocal Worker mutation');\n }\n if (mutation.kind === 'apply' && !isRecord(mutation.request)) {\n throw malformed('apply mutation must carry a request object');\n }\n if (mutation.kind === 'commit' && !isDecimalUint64(mutation.expectedRevision)) {\n throw malformed('commit expectedRevision must be a decimal uint64 string');\n }\n optionalDecimal(mutation.expectedRevision, 'expectedRevision');\n break;\n }\n case 'sonare:vocal-preview':\n if (!isRecord(data.request)) {\n throw malformed('preview request must be an object');\n }\n break;\n case 'sonare:vocal-dispose':\n case 'sonare:vocal-cancel':\n break;\n default:\n throw malformed('unknown message type');\n }\n return data as unknown as VocalWorkerRequestMessage;\n}\n\n/** Install the dedicated vocal-edit protocol on a browser or Node endpoint. */\nexport function installVocalEditWorkerEndpoint(\n endpoint: VocalEditWorkerEndpoint,\n dependencies: VocalEditWorkerDependencies = {},\n): void {\n const sessions = new Map<string, WorkerSession>();\n const creating = new Map<number, ActiveCommand>();\n const factory = dependencies.factory ?? productionFactory;\n const initialize = dependencies.initialize ?? init;\n\n const cancel = (message: VocalWorkerRequestMessage): void => {\n const pendingCreate = creating.get(message.id);\n if (pendingCreate) {\n pendingCreate.cancelled = true;\n return;\n }\n const session = sessions.get(message.sessionId);\n if (!session) {\n return;\n }\n // Mutations are FIFO and never dropped, so a cancel reaches previews only.\n const running = session.running;\n if (running?.id === message.id && running.preview) {\n running.cancelled = true;\n return;\n }\n const queuedIndex = session.queue.findIndex(\n (command) =>\n command.message.id === message.id && command.message.type === 'sonare:vocal-preview',\n );\n if (queuedIndex >= 0) {\n const [queued] = session.queue.splice(queuedIndex, 1);\n postError(\n endpoint,\n queued.message.id,\n queued.message.sessionId,\n queued.message.clientIntentSequence,\n cancelledError(),\n currentToken(session),\n );\n }\n };\n\n const create = async (message: VocalWorkerCreateMessage): Promise<void> => {\n const active: ActiveCommand = {\n id: message.id,\n cancelled: false,\n preview: false,\n cancelBuffer: message.cancelBuffer,\n };\n creating.set(message.id, active);\n let value: VocalEditWorkerNativeSession | undefined;\n try {\n await initialize();\n if (isCancelled(active)) {\n throw cancelledError();\n }\n if (sessions.has(message.sessionId)) {\n throw new Error('Vocal session id is already in use');\n }\n value =\n message.request.kind === 'create'\n ? factory.create(message.request.request)\n : factory.restore(message.request.request);\n if (isCancelled(active)) {\n throw cancelledError();\n }\n const result: VocalWorkerCreateResult = {\n sessionId: message.sessionId,\n token: value.token(),\n notes: value.notes(),\n analysis: value.analysis(),\n capabilities: value.capabilities(),\n };\n sessions.set(message.sessionId, {\n value,\n latestIntent: message.clientIntentSequence,\n queue: [],\n running: undefined,\n draining: false,\n disposing: false,\n });\n value = undefined;\n postResult(\n endpoint,\n message.id,\n message.sessionId,\n message.clientIntentSequence,\n result,\n result.token,\n );\n } catch (error) {\n value?.dispose();\n postError(endpoint, message.id, message.sessionId, message.clientIntentSequence, error);\n } finally {\n creating.delete(message.id);\n }\n };\n\n const dispose = (message: VocalWorkerRequestMessage): void => {\n const session = sessions.get(message.sessionId);\n if (!session) {\n // Nothing to release, but the client still waits for this reply.\n postResult(endpoint, message.id, message.sessionId, message.clientIntentSequence, null);\n return;\n }\n if (session.disposing) {\n // A repeated dispose settles with the first one.\n void session.released?.then(() =>\n postResult(endpoint, message.id, message.sessionId, message.clientIntentSequence, null),\n );\n return;\n }\n session.disposing = true;\n const active = session.running;\n if (active) {\n active.cancelled = true;\n }\n rejectQueuedCommands(endpoint, session, new Error('Vocal session disposed'));\n session.released = (async (): Promise<void> => {\n while (session.draining) {\n await nextMacrotask();\n }\n session.draft?.dispose();\n session.value.dispose();\n sessions.delete(message.sessionId);\n })();\n void session.released.then(() =>\n postResult(endpoint, message.id, message.sessionId, message.clientIntentSequence, null),\n );\n };\n\n endpoint.addEventListener('message', (event) => {\n const data: unknown = event.data;\n try {\n const message = validateRequest(data);\n switch (message.type) {\n case 'sonare:vocal-cancel':\n cancel(message);\n return;\n case 'sonare:vocal-create':\n void create(message);\n return;\n case 'sonare:vocal-dispose':\n dispose(message);\n return;\n default:\n queueCommand(endpoint, sessions, message);\n }\n } catch (error) {\n const id = replyId(data);\n if (id === undefined) {\n return;\n }\n const record = data as Record<string, unknown>;\n try {\n postError(\n endpoint,\n id,\n typeof record.sessionId === 'string' ? record.sessionId : '',\n isDecimalUint64(record.clientIntentSequence) ? record.clientIntentSequence : '0',\n error,\n );\n } catch {\n // The endpoint itself failed; there is no channel left to report on.\n }\n }\n });\n}\n\nfunction browserEndpoint(): VocalEditWorkerEndpoint | null {\n const scope = globalThis as unknown as {\n document?: unknown;\n postMessage?: (message: VocalWorkerResponseMessage, transfer?: Transferable[]) => void;\n addEventListener?: (\n type: 'message',\n listener: (event: MessageEvent<VocalWorkerRequestMessage>) => void,\n ) => void;\n };\n if (scope.document !== undefined || !scope.postMessage || !scope.addEventListener) {\n return null;\n }\n return {\n postMessage: (message, transfer) => scope.postMessage?.(message, transfer),\n addEventListener: (type, listener) => scope.addEventListener?.(type, listener),\n };\n}\n\nconst endpoint = browserEndpoint();\nif (endpoint) {\n installVocalEditWorkerEndpoint(endpoint);\n}\n"],"mappings":";AA4BO,IAAM,cAAN,cAA0B,MAAM;AAAA,EAMrC,YAAY,MAAc,UAAkB,SAAiB;AAC3D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ,OAAO,WAAW,EAAE,OAAsC;AAChE,WAAO,cAAc,KAAK;AAAA,EAC5B;AACF;AAQO,SAAS,cAAc,OAAsC;AAClE,SACE,iBAAiB,SAChB,MAA6B,SAAS,iBACvC,OAAQ,MAA6B,SAAS;AAElD;;;AC/DA,IAAI,gBAAqC;AAqBlC,SAAS,mBAAmB,OAA+B;AAChE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,UAAM,MAAO,MAA+B;AAC5C,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAgBA,SAAS,gBAAgB,KAAmB,QAA6B;AACvE,MAAI;AACJ,MAAI,WAAW;AACf,MAAI,UAAU,+BAA+B,MAAM;AACnD,MAAI;AACF,UAAM,OACJ,IACA,sBAAsB,MAAM;AAC9B,QAAI,MAAM;AACR,aAAO,KAAK,QAAQ;AACpB,iBAAW,KAAK,YAAY;AAC5B,gBAAU,KAAK,WAAW;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER,UAAE;AACA,QAAI;AACF,UAAI,uBAAuB,MAAM;AAAA,IACnC,QAAQ;AAAA,IAGR;AAAA,EACF;AACA,SAAO,IAAI,YAAY,MAAM,UAAU,OAAO;AAChD;AAUA,SAAS,iBAAiB,KAAiC;AACzD,QAAM,QAAQ,oBAAI,IAA0B;AAC5C,QAAM,cAAc,oBAAI,QAAyB;AACjD,QAAM,UAAU,CAAC,UAA0B;AACzC,UAAM,MAAM,mBAAmB,KAAK;AACpC,QAAI,QAAQ,MAAM;AAChB,YAAM,gBAAgB,KAAK,GAAG;AAAA,IAChC;AACA,UAAM;AAAA,EACR;AAEA,QAAM,mBAAmB,CAAC,UAA4B;AACpD,QAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,aAAO;AAAA,IACT;AACA,QAAI,YAAY,OAAO,KAAK,KAAK,iBAAiB,eAAe,iBAAiB,SAAS;AACzF,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,QAAI,MAAM,QAAQ,KAAK,KAAK,UAAU,OAAO,aAAa,UAAU,MAAM;AACxE,aAAO;AAAA,IACT;AACA,UAAM,cAAc;AACpB,UAAM,SAAS,YAAY,IAAI,WAAW;AAC1C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,cAAc,oBAAI,IAA0B;AAClD,UAAM,UAAU,IAAI,MAAM,aAAa;AAAA,MACrC,IAAI,QAAQ,MAAM,UAAU;AAC1B,cAAM,SAAS,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AACjD,YAAI,OAAO,WAAW,YAAY;AAChC,iBAAO;AAAA,QACT;AACA,cAAM,eAAe,YAAY,IAAI,IAAI;AACzC,YAAI,cAAc;AAChB,iBAAO;AAAA,QACT;AACA,cAAM,SAAS;AACf,cAAM,gBAAgB,IAAI,SAAoB;AAC5C,cAAI;AACF,mBAAO,iBAAiB,QAAQ,MAAM,QAAQ,QAAQ,IAAI,CAAC;AAAA,UAC7D,SAAS,OAAO;AACd,mBAAO,QAAQ,KAAK;AAAA,UACtB;AAAA,QACF;AACA,oBAAY,IAAI,MAAM,aAAa;AACnC,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,gBAAY,IAAI,aAAa,OAAO;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,UAAiD;AACrE,UAAM,UAAU,oBAAI,IAA0B;AAC9C,WAAO,IAAI,MAAM,OAAO;AAAA,MACtB,IAAI,QAAQ,MAAM,UAAU;AAC1B,cAAM,SAAS,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AACjD,YAAI,OAAO,WAAW,YAAY;AAChC,iBAAO;AAAA,QACT;AACA,cAAM,eAAe,QAAQ,IAAI,IAAI;AACrC,YAAI,cAAc;AAChB,iBAAO;AAAA,QACT;AACA,cAAM,KAAK;AACX,cAAM,gBAAgB,IAAI,SAAoB;AAC5C,cAAI;AACF,mBAAO,iBAAiB,QAAQ,MAAM,IAAI,QAAQ,IAAI,CAAC;AAAA,UACzD,SAAS,OAAO;AACd,mBAAO,QAAQ,KAAK;AAAA,UACtB;AAAA,QACF;AACA,gBAAQ,IAAI,MAAM,aAAa;AAC/B,eAAO;AAAA,MACT;AAAA,MACA,MAAM,GAAG,SAAS,MAAM;AACtB,YAAI;AACF,iBAAO,iBAAiB,QAAQ,MAAM,GAAG,SAAS,IAAiB,CAAC;AAAA,QACtE,SAAS,OAAO;AACd,iBAAO,QAAQ,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,MACA,UAAU,GAAG,MAAM,WAAW;AAC5B,YAAI;AACF,iBAAO,iBAAiB,QAAQ,UAAU,GAAG,MAAmB,SAAS,CAAC;AAAA,QAC5E,SAAS,OAAO;AACd,iBAAO,QAAQ,KAAK;AAAA,QACtB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,MAAM,KAAK;AAAA,IACpB,IAAI,QAAQ,MAAM,UAAU;AAC1B,YAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAChD,UAAI,OAAO,UAAU,YAAY;AAC/B,eAAO;AAAA,MACT;AACA,YAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAIA,YAAM,UAAU,aAAa,KAAqC;AAClE,YAAM,IAAI,MAAM,OAAO;AACvB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEO,SAAS,gBAAgBA,SAA4B;AAC1D,kBAAgB,iBAAiBA,OAAM;AACzC;AAEO,SAAS,kBAAgC;AAC9C,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;;;ACrHA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,qBAA6C;AACjD,IAAI,oBAA4C;AAEhD,SAAS,oBAAoB,OAAgB,QAAgC;AAC3E,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C;AAAA,EACF;AACA,QAAM,YAAY;AAClB,MAAI,UAAU,SAAS,iBAAiB,OAAO,UAAU,SAAS,UAAU;AAC1E;AAAA,EACF;AACA,aAAW,SAAS,kBAAkB;AACpC,WAAO,eAAe,WAAW,OAAO;AAAA,MACtC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,OAAO,OAAO,KAAK;AAAA,MACnB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEA,SAAS,SAA0B;AACjC,QAAM,SAAS,gBAAgB;AAC/B,MAAI,WAAW,sBAAsB,sBAAsB,MAAM;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,eAAgB,OAAoC;AAC1D,MAAI,OAAO,iBAAiB,YAAY;AACtC,yBAAqB;AACrB,wBAAoB;AACpB,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,oBAAI,IAAkD;AAC5E,QAAM,UAAU,IAAI,MAAM,QAAQ;AAAA,IAChC,IAAI,QAAQ,UAAU,UAAU;AAC9B,YAAM,SAAS,QAAQ,IAAI,QAAQ,UAAU,QAAQ;AACrD,UACE,aAAa,8BACb,OAAO,aAAa,YACpB,CAAC,SAAS,WAAW,WAAW,KAChC,OAAO,WAAW,YAClB;AACA,eAAO;AAAA,MACT;AACA,YAAM,SAAS,cAAc,IAAI,QAAQ;AACzC,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,MACT;AACA,YAAM,gBAAgB,IAAI,SAA6B;AACrD,YAAI;AACJ,YAAI;AACF,2BAAiB,aAAa,KAAK,MAAM,EAAE;AAAA,QAC7C,QAAQ;AAAA,QAGR;AACA,YAAI;AACF,iBAAO,QAAQ,MAAM,QAAQ,QAAQ,IAAI;AAAA,QAC3C,SAAS,OAAO;AACd,cAAI,mBAAmB,QAAW;AAChC,gBAAI;AACF,oBAAM,SAAS,aAAa,KAAK,MAAM;AACvC,kBAAI,OAAO,aAAa,gBAAgB;AACtC,oCAAoB,OAAO,MAAM;AAAA,cACnC;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AACA,oBAAc,IAAI,UAAU,aAAa;AACzC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,uBAAqB;AACrB,sBAAoB;AACpB,SAAO;AACT;AAEA,SAAS,cAAc,QAAgB,SAAuB;AAC5D,MAAI,CAAC,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG;AAChD,UAAM,IAAI,UAAU,GAAG,OAAO,4BAA4B;AAAA,EAC5D;AACF;AAEA,SAAS,cAAc,OAAe,OAAuB;AAC3D,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,UAAM,IAAI,WAAW,GAAG,KAAK,iBAAiB;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe,OAAuB;AAC3D,gBAAc,OAAO,KAAK;AAC1B,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,WAAW,GAAG,KAAK,sCAAsC;AAAA,EACrE;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe,OAAuB;AAC3D,gBAAc,OAAO,KAAK;AAC1B,MAAI,QAAQ,YAAY;AACtB,UAAM,IAAI,WAAW,GAAG,KAAK,kBAAkB;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAuB;AAChD,gBAAc,OAAO,YAAY;AACjC,MAAI,QAAQ,OAAQ,QAAQ,OAAQ;AAClC,UAAM,IAAI,WAAW,iDAAiD;AAAA,EACxE;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAA2B,OAAe,WAAW,KAAkB;AAC3F,QAAM,QAAQ,SAAS;AACvB,MAAI,OAAO,UAAU,YAAY,CAAC,iBAAiB,KAAK,KAAK,GAAG;AAC9D,UAAM,IAAI,WAAW,GAAG,KAAK,4CAA4C;AAAA,EAC3E;AACA,MAAI,MAAM,SAAS,MAAO,MAAM,WAAW,MAAM,QAAQ,wBAAyB;AAChF,UAAM,IAAI,WAAW,GAAG,KAAK,kBAAkB;AAAA,EACjD;AACA,SAAO;AACT;AAIA,SAAS,gBACP,UACA,UACa;AACb,QAAM,QAAQ,OAAO,aAAa,WAAW,WAAW,UAAU;AAClE,SAAO,aAAa,OAAO,oBAAoB,QAAQ;AACzD;AAEA,SAAS,aAAa,OAA+B;AACnD,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,UAAM,IAAI,UAAU,yBAAyB;AAAA,EAC/C;AACA,QAAM,cAAc,cAAc,MAAM,aAAa,mBAAmB;AACxE,QAAM,YAAY,cAAc,MAAM,WAAW,iBAAiB;AAClE,MAAI,YAAY,aAAa;AAC3B,UAAM,IAAI,WAAW,wCAAwC;AAAA,EAC/D;AACA,SAAO,EAAE,aAAa,UAAU;AAClC;AAEA,SAAS,UAAU,OAAyC;AAC1D,SAAO;AAAA,IACL,cAAc,aAAa,MAAM,cAAc,cAAc;AAAA,IAC7D,UAAU,aAAa,MAAM,UAAU,UAAU;AAAA,IACjD,SAAS,aAAa,MAAM,SAAS,SAAS;AAAA,IAC9C,YAAY,aAAa,MAAM,YAAY,YAAY;AAAA,IACvD,WAAW,aAAa,MAAM,WAAW,WAAW;AAAA,IACpD,WAAW,MAAM;AAAA,EACnB;AACF;AAEA,SAAS,UAAU,OAA+B;AAChD,SAAO,EAAE,aAAa,MAAM,aAAa,WAAW,MAAM,UAAU;AACtE;AAEA,SAAS,UAAU,OAA2C;AAC5D,QAAM,QAAqB,MAAM,KAAK,MAAM,OAAO,CAAC,UAAU;AAAA,IAC5D,GAAG;AAAA,IACH,WAAW,IAAI,aAAa,KAAK,SAAS;AAAA,IAC1C,MAAM;AAAA,MACJ,GAAG,KAAK;AAAA,MACR,OAAO;AAAA,QACL,GAAG,KAAK,KAAK;AAAA,QACb,QACE,KAAK,KAAK,MAAM,OAAO,SAAS,UAC5B;AAAA,UACE,MAAM;AAAA,UACN,QAAQ,KAAK,KAAK,MAAM,OAAO,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAAA,QACrE,IACA,EAAE,GAAG,KAAK,KAAK,MAAM,OAAO;AAAA,MACpC;AAAA,MACA,mBAAmB,MAAM,KAAK,KAAK,KAAK,iBAAiB;AAAA,MACzD,SAAS,EAAE,GAAG,KAAK,KAAK,QAAQ;AAAA,IAClC;AAAA,EACF,EAAE;AACF,SAAO;AAAA,IACL;AAAA,IACA,aAAa,MAAM,KAAK,MAAM,aAAa,CAAC,gBAAgB,EAAE,GAAG,WAAW,EAAE;AAAA,EAChF;AACF;AAEA,SAAS,aAAa,OAAqC;AACzD,SAAO;AAAA,IACL,mBAAmB,MAAM;AAAA,IACzB,iBAAiB,MAAM;AAAA,IACvB,oBAAoB,MAAM;AAAA,IAC1B,MAAM,IAAI,aAAa,MAAM,IAAI;AAAA,IACjC,QAAQ,IAAI,WAAW,MAAM,MAAM;AAAA,IACnC,aAAa,MAAM;AAAA,IACnB,kBAAkB,MAAM;AAAA,IACxB,qBAAqB,MAAM;AAAA,IAC3B,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,cAAc,MAAM;AAAA,IACpB,iBAAiB,MAAM;AAAA,IACvB,UAAU,MAAM;AAAA,IAChB,4BAA4B,MAAM;AAAA,IAClC,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,EACrB;AACF;AAEA,SAAS,UAAU,OAAmD;AACpE,SAAO;AAAA,IACL,eAAe,IAAI,aAAa,MAAM,aAAa;AAAA,IACnD,cAAc,IAAI,aAAa,MAAM,YAAY;AAAA,IACjD,YAAY,IAAI,aAAa,MAAM,UAAU;AAAA,IAC7C,eAAe,IAAI,aAAa,MAAM,aAAa;AAAA,IACnD,QAAQ,IAAI,WAAW,MAAM,MAAM;AAAA,IACnC,WAAW,IAAI,WAAW,MAAM,SAAS;AAAA,EAC3C;AACF;AAEA,SAAS,WAAW,OAA6C;AAC/D,SAAO;AAAA,IACL,SAAS,IAAI,aAAa,MAAM,OAAO;AAAA,IACvC,aAAa,MAAM;AAAA,IACnB,OAAO,UAAU,MAAM,KAAK;AAAA,IAC5B,iBAAiB,MAAM,KAAK,MAAM,iBAAiB,SAAS;AAAA,IAC5D,eAAe,aAAa,MAAM,eAAe,eAAe;AAAA,IAChE,iBAAiB,aAAa,MAAM,iBAAiB,iBAAiB;AAAA,IACtE,yBAAyB,aAAa,MAAM,yBAAyB,yBAAyB;AAAA,EAChG;AACF;AAEA,SAAS,sBAAsB,QAA8C;AAC3E,MAAI,WAAW,QAAW;AACxB;AAAA,EACF;AACA,MAAI,OAAO,oBAAoB,QAAW;AACxC,iBAAa,OAAO,iBAAiB,wBAAwB;AAAA,EAC/D;AACA,MAAI,OAAO,kBAAkB,QAAW;AACtC,iBAAa,OAAO,eAAe,sBAAsB;AAAA,EAC3D;AACF;AAEA,SAAS,eAAe,OAAyC;AAC/D,SAAO;AAAA,IACL,OAAO,UAAU,MAAM,KAAK;AAAA,IAC5B,aAAa,MAAM,KAAK,MAAM,aAAa,SAAS;AAAA,IACpD,WAAW,MAAM,KAAK,MAAM,WAAW,CAAC,YAAY;AAAA,MAClD,gBAAgB,OAAO;AAAA,MACvB,WAAW,OAAO;AAAA,MAClB,QAAQ,MAAM,KAAK,OAAO,MAAM;AAAA,IAClC,EAAE;AAAA,EACJ;AACF;AAEA,SAAS,eAAe,SAAmC;AACzD,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,UAAM,IAAI,UAAU,2BAA2B;AAAA,EACjD;AACA,MAAI,EAAE,QAAQ,mBAAmB,iBAAiB,QAAQ,QAAQ,WAAW,GAAG;AAC9E,UAAM,IAAI,UAAU,0CAA0C;AAAA,EAChE;AACA,aAAW,UAAU,QAAQ,SAAS;AACpC,kBAAc,QAAQ,SAAS;AAAA,EACjC;AACA,oBAAkB,QAAQ,UAAU;AACpC,MAAI,QAAQ,wBAAwB,QAAW;AAC7C,kBAAc,QAAQ,qBAAqB,qBAAqB;AAAA,EAClE;AACA,wBAAsB,QAAQ,MAAM;AACpC,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,QAAQ;AACzB,QAAI,SAAS,gBAAgB,QAAW;AACtC,UAAI,OAAO,SAAS,gBAAgB,UAAU;AAC5C,cAAM,IAAI,UAAU,uCAAuC;AAAA,MAC7D;AACA,UAAI,SAAS,YAAY,SAAS,IAAI,GAAG;AACvC,cAAM,IAAI,WAAW,2CAA2C;AAAA,MAClE;AAAA,IACF;AACA,kBAAc,SAAS,mBAAmB,4BAA4B;AACtE,kBAAc,SAAS,iBAAiB,0BAA0B;AAClE,QAAI,SAAS,mBAAmB,GAAG;AACjC,YAAM,IAAI,WAAW,2CAA2C;AAAA,IAClE;AACA,kBAAc,SAAS,oBAAoB,6BAA6B;AACxE,QAAI,SAAS,uBAAuB,GAAG;AACrC,YAAM,IAAI,WAAW,8CAA8C;AAAA,IACrE;AACA,QAAI,EAAE,SAAS,gBAAgB,iBAAiB,EAAE,SAAS,kBAAkB,aAAa;AACxF,YAAM,IAAI,UAAU,qDAAqD;AAAA,IAC3E;AACA,QAAI,SAAS,KAAK,WAAW,SAAS,OAAO,QAAQ;AACnD,YAAM,IAAI,WAAW,yCAAyC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,SAAS,iBACP,SACA,qBAIA;AACA,QAAM,QACJ,QAAQ,UAAU,SACd,EAAE,aAAa,GAAG,WAAW,cAAc,qBAAqB,qBAAqB,EAAE,IACvF,aAAa,QAAQ,KAAK;AAChC,QAAM,YAAY,aAAa,QAAQ,WAAW,WAAW;AAC7D,SAAO,EAAE,OAAO,UAAU;AAC5B;AAGO,SAAS,qBAA8B;AAC5C,QAAM,MAAM,OAAO;AACnB,SAAO,OAAO,IAAI,uBAAuB,cAAc,IAAI,mBAAmB,MAAM;AACtF;AASO,SAAS,uBAAuB,SAA+C;AACpF,iBAAe,OAAO;AACtB,MAAI,CAAC,mBAAmB,GAAG;AACzB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO,IAAI;AAAA,IACT,OAAO,EAAE,uBAAuB,QAAQ,SAAS,QAAQ,YAAY,OAAO;AAAA,EAC9E;AACF;AAGO,SAAS,wBAAwB,SAAgD;AACtF,MAAI,EAAE,QAAQ,mBAAmB,iBAAiB,QAAQ,QAAQ,WAAW,GAAG;AAC9E,UAAM,IAAI,UAAU,0CAA0C;AAAA,EAChE;AACA,MAAI,EAAE,QAAQ,iBAAiB,aAAa;AAC1C,UAAM,IAAI,UAAU,4BAA4B;AAAA,EAClD;AACA,aAAW,UAAU,QAAQ,SAAS;AACpC,kBAAc,QAAQ,SAAS;AAAA,EACjC;AACA,oBAAkB,QAAQ,UAAU;AACpC,wBAAsB,QAAQ,MAAM;AACpC,MAAI,CAAC,mBAAmB,GAAG;AACzB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO,IAAI;AAAA,IACT,OAAO,EAAE,wBAAwB,QAAQ,SAAS,QAAQ,YAAY,QAAQ,OAAO,OAAO;AAAA,EAC9F;AACF;AAGO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAM5B,YAAY,QAAgB;AAJ5B,SAAiB,SAAS,oBAAI,IAAoB;AAClD,SAAQ,WAAW;AAIjB,kBAAc,QAAQ,SAAS;AAC/B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,QAAQ;AAAA,IAChB;AACA,SAAK,OAAO,MAAM;AAClB,WAAO,EAAE,wBAAwB,KAAK,MAAM;AAC5C,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,SAAe;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,SAAiB;AACvB,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,UAAU,mCAAmC;AAAA,IACzD;AACA,kBAAc,KAAK,QAAQ,SAAS;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAyB;AACvB,WAAO,UAAU,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,CAAC;AAAA,EAChE;AAAA,EAEA,WAAwB;AACtB,WAAO,KAAK,MAAM,EAAE;AAAA,EACtB;AAAA,EAEA,QAA0B;AACxB,WAAO,UAAU,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,CAAC;AAAA,EAChE;AAAA,EAEA,WAA0B;AACxB,WAAO,aAAa,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,eAAkC;AAChC,WAAO,EAAE,GAAG,OAAO,EAAE,6BAA6B,KAAK,OAAO,CAAC,EAAE;AAAA,EACnE;AAAA,EAEA,sBAA8B;AAC5B,WAAO;AAAA,MACL,OAAO,EAAE,6BAA6B,KAAK,OAAO,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAA6B;AAC3B,UAAM,QAAQ,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC;AAC5D,WAAO,EAAE,SAAS,MAAM,YAAY,MAAM,SAAS,MAAM,YAAY,KAAK;AAAA,EAC5E;AAAA,EAEA,UAAU,UAA4B,CAAC,GAAmB;AACxD,UAAM,QAAQ,IAAI;AAAA,MAChB,OAAO,EAAE,0BAA0B,KAAK,OAAO,GAAG,gBAAgB,SAAS,KAAK,SAAS,CAAC,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,SAAK,OAAO,IAAI,KAAK;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,UAA4B,CAAC,GAAoB;AACpD,WAAO;AAAA,MACL,OAAO,EAAE;AAAA,QACP,KAAK,OAAO;AAAA,QACZ,gBAAgB,SAAS,KAAK,SAAS,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,UAA4B,CAAC,GAAoB;AACpD,WAAO;AAAA,MACL,OAAO,EAAE;AAAA,QACP,KAAK,OAAO;AAAA,QACZ,gBAAgB,SAAS,KAAK,SAAS,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,QAAsC;AAClD,WAAO;AAAA,MACL,OAAO,EAAE,uBAAuB,KAAK,OAAO,GAAG,cAAc,QAAQ,QAAQ,GAAG,KAAK;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,gCAAgC,QAAgB,cAA8B;AAC5E,kBAAc,cAAc,cAAc;AAC1C,WAAO,OAAO,EAAE;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,cAAc,QAAQ,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gCAAgC,QAAgB,mBAAmC;AACjF,kBAAc,mBAAmB,mBAAmB;AACpD,WAAO,OAAO,EAAE;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,cAAc,QAAQ,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,wBAA6C;AAC3C,WAAO,IAAI,oBAAoB,OAAO,EAAE,yBAAyB,KAAK,OAAO,GAAG,KAAK,CAAC;AAAA,EACxF;AAAA,EAEA,cAA0B;AACxB,WAAO,IAAI,WAAW,OAAO,EAAE,4BAA4B,KAAK,OAAO,CAAC,CAAC;AAAA,EAC3E;AAAA;AAAA,EAGA,aAAa,OAA6B;AACxC,SAAK,OAAO,OAAO,KAAK;AAAA,EAC1B;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAM1B,YAAY,QAAgB,OAAyB;AAJrD,SAAQ,WAAW;AAKjB,kBAAc,QAAQ,OAAO;AAC7B,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,SAAiB;AACvB,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,UAAU,iCAAiC;AAAA,IACvD;AACA,kBAAc,KAAK,QAAQ,OAAO;AAClC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,QAAyB;AACvB,WAAO,UAAU,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,CAAC;AAAA,EAC9D;AAAA,EAEA,QAA0B;AACxB,WAAO,UAAU,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,SAA6C;AACjD,QAAI,QAAQ,uBAAuB,QAAW;AAC5C,YAAM,IAAI,UAAU,gCAAgC;AAAA,IACtD;AACA,UAAM,aAAa,aAAa,QAAQ,oBAAoB,oBAAoB;AAChF,QAAI,CAAC,MAAM,QAAQ,QAAQ,UAAU,GAAG;AACtC,YAAM,IAAI,UAAU,6BAA6B;AAAA,IACnD;AACA,WAAO;AAAA,MACL,OAAO,EAAE,oBAAoB,KAAK,OAAO,GAAG,YAAY,QAAQ,UAAU;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,OAAO,UAA4B,CAAC,GAAoB;AACtD,UAAM,SAAS;AAAA,MACb,OAAO,EAAE,qBAAqB,KAAK,OAAO,GAAG,gBAAgB,SAAS,KAAK,MAAM,SAAS,CAAC,CAAC;AAAA,IAC9F;AACA,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEA,SAAe;AACb,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,WAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC;AAC3C,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,cAAc,QAAsC;AAClD,WAAO;AAAA,MACL,OAAO,EAAE,uBAAuB,KAAK,OAAO,GAAG,cAAc,QAAQ,QAAQ,GAAG,IAAI;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,gCAAgC,QAAgB,cAA8B;AAC5E,kBAAc,cAAc,cAAc;AAC1C,WAAO,OAAO,EAAE;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,cAAc,QAAQ,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gCAAgC,QAAgB,mBAAmC;AACjF,kBAAc,mBAAmB,mBAAmB;AACpD,WAAO,OAAO,EAAE;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,cAAc,QAAQ,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,wBAA6C;AAC3C,WAAO,IAAI,oBAAoB,OAAO,EAAE,yBAAyB,KAAK,OAAO,GAAG,IAAI,CAAC;AAAA,EACvF;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,WAAO,EAAE,sBAAsB,KAAK,MAAM;AAC1C,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,MAAM,aAAa,IAAI;AAAA,EAC9B;AAAA,EAEA,SAAe;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,sBAAN,MAA0B;AAAA;AAAA,EAK/B,YAAY,QAAgB;AAH5B,SAAQ,WAAW;AAIjB,kBAAc,QAAQ,UAAU;AAChC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,SAAiB;AACvB,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,UAAU,oCAAoC;AAAA,IAC1D;AACA,kBAAc,KAAK,QAAQ,UAAU;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,sBAA8B;AAC5B,WAAO;AAAA,MACL,OAAO,EAAE,8BAA8B,KAAK,OAAO,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAgD;AACrD,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,aAAa,0BAA0B,YAAY;AAAA,IAC/D;AACA,UAAM,aAAa,iBAAiB,SAAS,KAAK,oBAAoB,CAAC;AACvE,WAAO;AAAA,MACL,OAAO,EAAE;AAAA,QACP;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,SAA6C;AAC1D,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,QAAQ,QAAQ,SAAS;AAC3B,YAAM,IAAI,aAAa,0BAA0B,YAAY;AAAA,IAC/D;AACA,UAAM,aAAa,iBAAiB,SAAS,KAAK,oBAAoB,CAAC;AACvE,WAAO,IAAI;AAAA,MACT,OAAO,EAAE;AAAA,QACP;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,WAAW,MAAM;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,SAAyD;AACnE,SAAK,OAAO;AACZ,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ,SAAS;AACnB,aAAO,QAAQ,OAAO,IAAI,aAAa,0BAA0B,YAAY,CAAC;AAAA,IAChF;AACA,UAAM,MAAM,KAAK,eAAe,OAAO;AACvC,YAAQ,YAAY;AAClB,UAAI;AACF,eAAO,MAAM;AACX,cAAI,QAAQ,SAAS;AACnB,gBAAI,MAAM;AACV,kBAAM,IAAI,aAAa,0BAA0B,YAAY;AAAA,UAC/D;AACA,cAAI,IAAI,KAAK,EAAE,UAAU;AACvB,mBAAO,IAAI,SAAS;AAAA,UACtB;AACA,gBAAM,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,QAC7D;AAAA,MACF,SAAS,OAAO;AACd,YAAI,MAAM;AACV,cAAM;AAAA,MACR,UAAE;AACA,YAAI,QAAQ;AAAA,MACd;AAAA,IACF,GAAG;AAAA,EACL;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,WAAO,EAAE,yBAAyB,KAAK,MAAM;AAC7C,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,SAAe;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAK1B,YAAY,QAAgB;AAH5B,SAAQ,WAAW;AAIjB,kBAAc,QAAQ,YAAY;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEQ,SAAiB;AACvB,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,UAAU,sCAAsC;AAAA,IAC5D;AACA,kBAAc,KAAK,QAAQ,YAAY;AACvC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAyB;AACvB,WAAO,EAAE,UAAU,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,EAAE;AAAA,EACpE;AAAA,EAEA,WAA8B;AAC5B,UAAM,SAAS,WAAW,OAAO,EAAE,2BAA2B,KAAK,OAAO,CAAC,CAAC;AAC5E,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO,EAAE,wBAAwB,KAAK,MAAM;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,WAAO,EAAE,0BAA0B,KAAK,MAAM;AAC9C,SAAK,SAAS;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,SAAe;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ;AAAA,EACf;AACF;;;ACzqBO,SAAS,cAAc,GAAgB,GAAwB;AACpE,QAAM,OAAO,EAAE,QAAQ,aAAa,EAAE;AACtC,QAAM,QAAQ,EAAE,QAAQ,aAAa,EAAE;AACvC,MAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,WAAO,KAAK,SAAS,MAAM,SAAS,KAAK;AAAA,EAC3C;AACA,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,QAAQ,KAAK;AAC7B;;;AC6yBA,IAAIC,UAA8B;AAClC,IAAI,cAAoC;AAaxC,eAAsB,KAAK,SAOT;AAChB,MAAIA,SAAQ;AACV;AAAA,EACF;AAEA,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,iBAAe,YAAY;AACzB,QAAI;AACF,YAAM,eAAe,SAAS,kBAAkB,MAAM,OAAO,aAAa,GAAG;AAC7E,MAAAA,UAAS,MAAM,aAAa,OAAO;AACnC,sBAAgBA,OAAM;AAAA,IACxB,SAAS,OAAO;AACd,oBAAc;AACd,YAAM;AAAA,IACR;AAAA,EACF,GAAG;AAEH,SAAO;AACT;;;ACn9BA,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AACX;AA2BA,SAAS,aAAa,OAAkD;AACtE,QAAM,YAAY;AAUlB,SAAO;AAAA,IACL,MAAM,UAAU,QAAQ;AAAA,IACxB,SAAS,UAAU,WAAW,OAAO,KAAK;AAAA,IAC1C,GAAI,UAAU,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,UAAU,KAAK;AAAA,IAC/D,GAAI,UAAU,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,UAAU,SAAS;AAAA,IAC3E,GAAI,UAAU,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,UAAU,OAAO;AAAA,IACrE,GAAI,UAAU,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,UAAU,MAAM;AAAA,IAClE,GAAI,UAAU,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,UAAU,SAAS;AAAA,IAC3E,GAAI,UAAU,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,UAAU,OAAO;AAAA,IACrE,GAAI,UAAU,iBAAiB,SAAY,CAAC,IAAI,EAAE,cAAc,UAAU,aAAa;AAAA,IACvF,GAAI,UAAU,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,UAAU,WAAW;AAAA,EACnF;AACF;AAEA,SAAS,cAAc,OAAgC;AACrD,QAAM,SAAyB,CAAC;AAChC,QAAM,OAAO,oBAAI,IAAiB;AAClC,QAAM,QAAQ,CAAC,SAAwB;AACrC,QAAI,SAAS,QAAQ,SAAS,UAAa,OAAO,SAAS,UAAU;AACnE;AAAA,IACF;AACA,QAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,YAAM,SAAS,KAAK;AACpB,UAAI,kBAAkB,eAAe,CAAC,KAAK,IAAI,MAAM,GAAG;AACtD,aAAK,IAAI,MAAM;AACf,eAAO,KAAK,MAAM;AAAA,MACpB;AACA;AAAA,IACF;AACA,QAAI,gBAAgB,aAAa;AAC/B,UAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AACnB,aAAK,IAAI,IAAI;AACb,eAAO,KAAK,IAAI;AAAA,MAClB;AACA;AAAA,IACF;AACA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAK,QAAQ,KAAK;AAClB;AAAA,IACF;AACA,WAAO,OAAO,IAAI,EAAE,QAAQ,KAAK;AAAA,EACnC;AACA,QAAM,KAAK;AACX,SAAO;AACT;AAEA,SAAS,iBAAwB;AAC/B,QAAM,QAAQ,IAAI,MAAM,wBAAwB;AAChD,QAAM,OAAO;AACb,SAAO;AACT;AAEA,SAAS,YAAY,QAAgC;AACnD,SACE,OAAO,aACN,OAAO,iBAAiB,UACvB,QAAQ,KAAK,IAAI,WAAW,OAAO,YAAY,GAAG,CAAC,MAAM;AAE/D;AAEA,SAAS,gBAA+B;AACtC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AACxD;AAEA,SAAS,YAAY,OAAgB,SAAyC;AAC5E,QAAM,YAAY;AAClB,SAAO,WAAW,SAAS,aAAa,OAAO;AACjD;AAEA,SAAS,aAAa,SAAyC;AAC7D,SAAO,QAAQ,OAAO,MAAM,KAAK,QAAQ,MAAM,MAAM;AACvD;AAEA,SAAS,WACPC,WACA,IACA,WACA,sBACA,QACA,OACM;AACN,EAAAA,UAAS;AAAA,IACP;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC3B;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AACF;AAEA,SAAS,UACPA,WACA,IACA,WACA,sBACA,OACA,OACM;AACN,EAAAA,UAAS,YAAY;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,aAAa,KAAK;AAAA,IACzB,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B,CAAC;AACH;AAEA,SAAS,qBACPA,WACA,SACA,OACM;AACN,aAAW,UAAU,QAAQ,OAAO;AAClC;AAAA,MACEA;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,OAAO,QAAQ;AAAA,MACf;AAAA,MACA,aAAa,OAAO;AAAA,IACtB;AAAA,EACF;AACA,UAAQ,QAAQ,CAAC;AACnB;AAMA,SAAS,gBACP,SACA,SACM;AACN,MAAI,QAAQ,aAAa,QAAQ,UAAU,iBAAiB,aAAa,OAAO,EAAE,cAAc;AAC9F,UAAM,QAAQ,IAAI,MAAM,sDAAsD;AAC9E,UAAM,OAAO;AACb,UAAM;AAAA,EACR;AACF;AAEA,SAAS,cAAc,SAAoD;AACzE,MAAI,CAAC,QAAQ,OAAO;AAClB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AACA,SAAO,QAAQ;AACjB;AAGA,SAAS,WACP,SACA,OAC2D;AAC3D,SAAO,UAAU,OAAO,cAAc,OAAO,IAAI,QAAQ;AAC3D;AAEA,eAAe,WACb,SACA,SACA,QACAA,WAC4B;AAC5B,QAAM,WAAW,QAAQ,QACrB,QAAQ,MAAM,sBAAsB,IACpC,QAAQ,MAAM,sBAAsB;AACxC,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,eAAe,EAAE,GAAG,QAAQ,SAAS,QAAQ,OAAU,CAAC;AACvE,WAAO,MAAM;AACX,UAAI,YAAY,MAAM,GAAG;AACvB,YAAI,MAAM;AACV,cAAM,eAAe;AAAA,MACvB;AACA,YAAM,WAAW,IAAI,KAAK;AAC1B,MAAAA,UAAS,YAAY;AAAA,QACnB,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,sBAAsB,QAAQ;AAAA,QAC9B,UAAU,SAAS;AAAA,QACnB,OAAO,aAAa,OAAO;AAAA,MAC7B,CAAC;AACD,UAAI,SAAS,UAAU;AACrB,eAAO,IAAI,SAAS;AAAA,MACtB;AAIA,YAAM,cAAc;AAAA,IACtB;AAAA,EACF,UAAE;AACA,SAAK,QAAQ;AACb,aAAS,QAAQ;AAAA,EACnB;AACF;AAEA,eAAe,QACb,SACA,SACAA,WACe;AACf,QAAM,UAAU,QAAQ;AACxB,QAAM,SAAS,QAAQ;AACvB,UAAQ,UAAU;AAClB,MAAI;AACF,oBAAgB,SAAS,OAAO;AAChC,QAAI;AACJ,QAAI,QAAQ,SAAS,wBAAwB;AAC3C,eAAS,MAAM,WAAW,SAAS,SAAS,QAAQA,SAAQ;AAAA,IAC9D,OAAO;AACL,YAAM,WAAW,QAAQ;AACzB,cAAQ,SAAS,MAAM;AAAA,QACrB,KAAK;AACH,cAAI,QAAQ,OAAO;AACjB,kBAAM,IAAI,MAAM,oCAAoC;AAAA,UACtD;AACA,kBAAQ,QAAQ,QAAQ,MAAM,UAAU,SAAS,gBAAgB;AACjE,mBAAS,QAAQ,MAAM,MAAM;AAC7B;AAAA,QACF,KAAK;AACH,mBAAS,cAAc,OAAO,EAAE,MAAM,SAAS,OAAO;AACtD;AAAA,QACF,KAAK;AACH,mBAAS,cAAc,OAAO,EAAE,OAAO,SAAS,gBAAgB;AAChE,kBAAQ,OAAO,QAAQ;AACvB,kBAAQ,QAAQ;AAChB;AAAA,QACF,KAAK;AACH,wBAAc,OAAO,EAAE,OAAO;AAC9B,kBAAQ,OAAO,QAAQ;AACvB,kBAAQ,QAAQ;AAChB,mBAAS;AACT;AAAA,QACF,KAAK;AACH,cAAI,QAAQ,OAAO;AACjB,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AACA,mBAAS,QAAQ,MAAM,KAAK,SAAS,gBAAgB;AACrD;AAAA,QACF,KAAK;AACH,cAAI,QAAQ,OAAO;AACjB,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AACA,mBAAS,QAAQ,MAAM,KAAK,SAAS,gBAAgB;AACrD;AAAA,QACF,KAAK;AACH,mBAAS,QAAQ,QAAQ,QAAQ,MAAM,MAAM,IAAI,QAAQ,MAAM,MAAM;AACrE;AAAA,QACF,KAAK;AACH,mBAAS,QAAQ,MAAM,SAAS;AAChC;AAAA,QACF,KAAK;AACH,mBAAS,QAAQ,MAAM,aAAa;AACpC;AAAA,QACF,KAAK;AACH,cAAI,QAAQ,OAAO;AACjB,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AACA,mBAAS,EAAE,MAAM,QAAQ,MAAM,YAAY,EAAE;AAC7C;AAAA,QACF,KAAK;AACH,mBAAS,QAAQ,MAAM,oBAAoB;AAC3C;AAAA,QACF,KAAK;AACH,mBAAS,QAAQ,MAAM,QAAQ;AAC/B;AAAA,QACF,KAAK;AACH,mBAAS,cAAc,OAAO,EAAE,MAAM;AACtC;AAAA,QACF,KAAK;AACH,mBAAS,WAAW,SAAS,SAAS,KAAK,EAAE,cAAc,SAAS,MAAM;AAC1E;AAAA,QACF,KAAK,iBAAiB;AACpB,gBAAM,SAAS,WAAW,SAAS,SAAS,KAAK;AACjD,mBAAS,SAAS,UACd,OAAO,gCAAgC,SAAS,QAAQ,SAAS,MAAM,IACvE,OAAO,gCAAgC,SAAS,QAAQ,SAAS,MAAM;AAC3E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,0BAA0B,YAAY,MAAM,GAAG;AAClE,YAAM,eAAe;AAAA,IACvB;AACA;AAAA,MACEA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,YAAY,QAAQ,OAAO;AAAA,IAC7B;AAAA,EACF,SAAS,OAAO;AACd;AAAA,MACEA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,aAAa,OAAO;AAAA,IACtB;AAAA,EACF,UAAE;AACA,YAAQ,UAAU;AAAA,EACpB;AACF;AAEA,eAAe,MAAM,SAAwBA,WAAkD;AAC7F,MAAI,QAAQ,UAAU;AACpB;AAAA,EACF;AACA,UAAQ,WAAW;AACnB,MAAI;AACF,WAAO,QAAQ,MAAM,WAAW,KAAK,CAAC,QAAQ,WAAW;AACvD,YAAM,UAAU,QAAQ,MAAM,MAAM;AACpC,YAAM,QAAQ,SAAS,SAASA,SAAQ;AAAA,IAC1C;AAAA,EACF,UAAE;AACA,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,SAAS,aACPA,WACA,UACA,SACM;AACN,QAAM,UAAU,SAAS,IAAI,QAAQ,SAAS;AAC9C,MAAI,CAAC,WAAW,QAAQ,WAAW;AACjC;AAAA,MACEA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,IAAI,MAAM,uBAAuB;AAAA,IACnC;AACA;AAAA,EACF;AACA,MAAI,cAAc,QAAQ,sBAAsB,QAAQ,YAAY,KAAK,GAAG;AAC1E,UAAM,QAAQ,IAAI,MAAM,0CAA0C;AAClE,UAAM,OAAO;AACb;AAAA,MACEA;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,aAAa,OAAO;AAAA,IACtB;AACA;AAAA,EACF;AACA,UAAQ,eAAe,QAAQ;AAC/B,MAAI,QAAQ,SAAS,wBAAwB;AAG3C,UAAM,QAAQ,QAAQ,MAAM;AAAA,MAC1B,CAAC,YAAY,QAAQ,QAAQ,SAAS;AAAA,IACxC;AACA,YAAQ,QAAQ,QAAQ,MAAM;AAAA,MAC5B,CAAC,YAAY,QAAQ,QAAQ,SAAS;AAAA,IACxC;AACA,eAAW,WAAW,OAAO;AAC3B;AAAA,QACEA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,OAAO,OAAO,IAAI,MAAM,oBAAoB,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAAA,QAC3E,aAAa,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,UAAQ,MAAM,KAAK;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,MACN,IAAI,QAAQ;AAAA,MACZ,WAAW;AAAA,MACX,SAAS,QAAQ,SAAS;AAAA,MAC1B,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF,CAAC;AACD,OAAK,MAAM,SAASA,SAAQ;AAC9B;AAOA,IAAM,aAAa;AAEnB,IAAM,gBAAgB,oBAAI,IAAY;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,UAAU,SAA4B;AAC7C,SAAO,IAAI,UAAU,mCAAmC,OAAO,EAAE;AACnE;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU;AAC5C;AAEA,SAAS,gBAAgB,OAAiC;AACxD,SACE,OAAO,UAAU,YACjB,iBAAiB,KAAK,KAAK,KAC3B,cAAc,OAAO,UAAU,KAAK;AAExC;AAEA,SAAS,gBAAgB,OAAgB,OAAqB;AAC5D,MAAI,UAAU,UAAa,CAAC,gBAAgB,KAAK,GAAG;AAClD,UAAM,UAAU,GAAG,KAAK,kCAAkC;AAAA,EAC5D;AACF;AAGA,SAAS,QAAQ,MAAmC;AAElD,MAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,uBAAuB;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,OAAO,cAAc,KAAK,EAAE,KAAM,KAAK,KAAgB,IAAK,KAAK,KAAgB;AAC1F;AAGA,SAAS,gBAAgB,MAA0C;AACjE,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,UAAM,UAAU,2BAA2B;AAAA,EAC7C;AACA,MAAI,CAAC,OAAO,cAAc,KAAK,EAAE,KAAM,KAAK,MAAiB,GAAG;AAC9D,UAAM,UAAU,oCAAoC;AAAA,EACtD;AACA,MAAI,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,WAAW,GAAG;AACrE,UAAM,UAAU,sCAAsC;AAAA,EACxD;AACA,MAAI,CAAC,gBAAgB,KAAK,oBAAoB,GAAG;AAC/C,UAAM,UAAU,sDAAsD;AAAA,EACxE;AACA,MACE,KAAK,iBAAiB,UACtB,EACE,OAAO,sBAAsB,eAC7B,KAAK,wBAAwB,qBAC7B,KAAK,aAAa,cAAc,WAAW,oBAE7C;AACA,UAAM,UAAU,0CAA0C;AAAA,EAC5D;AACA,MACE,KAAK,cAAc,UACnB,EAAE,SAAS,KAAK,SAAS,KAAK,gBAAgB,KAAK,UAAU,YAAY,IACzE;AACA,UAAM,UAAU,iCAAiC;AAAA,EACnD;AACA,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,uBAAuB;AAC1B,YAAM,UAAU,KAAK;AACrB,UACE,CAAC,SAAS,OAAO,KAChB,QAAQ,SAAS,YAAY,QAAQ,SAAS,aAC/C,CAAC,SAAS,QAAQ,OAAO,GACzB;AACA,cAAM,UAAU,kEAAkE;AAAA,MACpF;AACA;AAAA,IACF;AAAA,IACA,KAAK,uBAAuB;AAC1B,YAAM,WAAW,KAAK;AACtB,UACE,CAAC,SAAS,QAAQ,KAClB,OAAO,SAAS,SAAS,YACzB,CAAC,cAAc,IAAI,SAAS,IAAI,GAChC;AACA,cAAM,UAAU,8CAA8C;AAAA,MAChE;AACA,UAAI,SAAS,SAAS,WAAW,CAAC,SAAS,SAAS,OAAO,GAAG;AAC5D,cAAM,UAAU,4CAA4C;AAAA,MAC9D;AACA,UAAI,SAAS,SAAS,YAAY,CAAC,gBAAgB,SAAS,gBAAgB,GAAG;AAC7E,cAAM,UAAU,yDAAyD;AAAA,MAC3E;AACA,sBAAgB,SAAS,kBAAkB,kBAAkB;AAC7D;AAAA,IACF;AAAA,IACA,KAAK;AACH,UAAI,CAAC,SAAS,KAAK,OAAO,GAAG;AAC3B,cAAM,UAAU,mCAAmC;AAAA,MACrD;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH;AAAA,IACF;AACE,YAAM,UAAU,sBAAsB;AAAA,EAC1C;AACA,SAAO;AACT;AAGO,SAAS,+BACdA,WACA,eAA4C,CAAC,GACvC;AACN,QAAM,WAAW,oBAAI,IAA2B;AAChD,QAAM,WAAW,oBAAI,IAA2B;AAChD,QAAM,UAAU,aAAa,WAAW;AACxC,QAAM,aAAa,aAAa,cAAc;AAE9C,QAAM,SAAS,CAAC,YAA6C;AAC3D,UAAM,gBAAgB,SAAS,IAAI,QAAQ,EAAE;AAC7C,QAAI,eAAe;AACjB,oBAAc,YAAY;AAC1B;AAAA,IACF;AACA,UAAM,UAAU,SAAS,IAAI,QAAQ,SAAS;AAC9C,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ;AACxB,QAAI,SAAS,OAAO,QAAQ,MAAM,QAAQ,SAAS;AACjD,cAAQ,YAAY;AACpB;AAAA,IACF;AACA,UAAM,cAAc,QAAQ,MAAM;AAAA,MAChC,CAAC,YACC,QAAQ,QAAQ,OAAO,QAAQ,MAAM,QAAQ,QAAQ,SAAS;AAAA,IAClE;AACA,QAAI,eAAe,GAAG;AACpB,YAAM,CAAC,MAAM,IAAI,QAAQ,MAAM,OAAO,aAAa,CAAC;AACpD;AAAA,QACEA;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,eAAe;AAAA,QACf,aAAa,OAAO;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,YAAqD;AACzE,UAAM,SAAwB;AAAA,MAC5B,IAAI,QAAQ;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,cAAc,QAAQ;AAAA,IACxB;AACA,aAAS,IAAI,QAAQ,IAAI,MAAM;AAC/B,QAAI;AACJ,QAAI;AACF,YAAM,WAAW;AACjB,UAAI,YAAY,MAAM,GAAG;AACvB,cAAM,eAAe;AAAA,MACvB;AACA,UAAI,SAAS,IAAI,QAAQ,SAAS,GAAG;AACnC,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AACA,cACE,QAAQ,QAAQ,SAAS,WACrB,QAAQ,OAAO,QAAQ,QAAQ,OAAO,IACtC,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;AAC7C,UAAI,YAAY,MAAM,GAAG;AACvB,cAAM,eAAe;AAAA,MACvB;AACA,YAAM,SAAkC;AAAA,QACtC,WAAW,QAAQ;AAAA,QACnB,OAAO,MAAM,MAAM;AAAA,QACnB,OAAO,MAAM,MAAM;AAAA,QACnB,UAAU,MAAM,SAAS;AAAA,QACzB,cAAc,MAAM,aAAa;AAAA,MACnC;AACA,eAAS,IAAI,QAAQ,WAAW;AAAA,QAC9B;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,OAAO,CAAC;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,MACb,CAAC;AACD,cAAQ;AACR;AAAA,QACEA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,aAAO,QAAQ;AACf,gBAAUA,WAAU,QAAQ,IAAI,QAAQ,WAAW,QAAQ,sBAAsB,KAAK;AAAA,IACxF,UAAE;AACA,eAAS,OAAO,QAAQ,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,YAA6C;AAC5D,UAAM,UAAU,SAAS,IAAI,QAAQ,SAAS;AAC9C,QAAI,CAAC,SAAS;AAEZ,iBAAWA,WAAU,QAAQ,IAAI,QAAQ,WAAW,QAAQ,sBAAsB,IAAI;AACtF;AAAA,IACF;AACA,QAAI,QAAQ,WAAW;AAErB,WAAK,QAAQ,UAAU;AAAA,QAAK,MAC1B,WAAWA,WAAU,QAAQ,IAAI,QAAQ,WAAW,QAAQ,sBAAsB,IAAI;AAAA,MACxF;AACA;AAAA,IACF;AACA,YAAQ,YAAY;AACpB,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ;AACV,aAAO,YAAY;AAAA,IACrB;AACA,yBAAqBA,WAAU,SAAS,IAAI,MAAM,wBAAwB,CAAC;AAC3E,YAAQ,YAAY,YAA2B;AAC7C,aAAO,QAAQ,UAAU;AACvB,cAAM,cAAc;AAAA,MACtB;AACA,cAAQ,OAAO,QAAQ;AACvB,cAAQ,MAAM,QAAQ;AACtB,eAAS,OAAO,QAAQ,SAAS;AAAA,IACnC,GAAG;AACH,SAAK,QAAQ,SAAS;AAAA,MAAK,MACzB,WAAWA,WAAU,QAAQ,IAAI,QAAQ,WAAW,QAAQ,sBAAsB,IAAI;AAAA,IACxF;AAAA,EACF;AAEA,EAAAA,UAAS,iBAAiB,WAAW,CAAC,UAAU;AAC9C,UAAM,OAAgB,MAAM;AAC5B,QAAI;AACF,YAAM,UAAU,gBAAgB,IAAI;AACpC,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK;AACH,iBAAO,OAAO;AACd;AAAA,QACF,KAAK;AACH,eAAK,OAAO,OAAO;AACnB;AAAA,QACF,KAAK;AACH,kBAAQ,OAAO;AACf;AAAA,QACF;AACE,uBAAaA,WAAU,UAAU,OAAO;AAAA,MAC5C;AAAA,IACF,SAAS,OAAO;AACd,YAAM,KAAK,QAAQ,IAAI;AACvB,UAAI,OAAO,QAAW;AACpB;AAAA,MACF;AACA,YAAM,SAAS;AACf,UAAI;AACF;AAAA,UACEA;AAAA,UACA;AAAA,UACA,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY;AAAA,UAC1D,gBAAgB,OAAO,oBAAoB,IAAI,OAAO,uBAAuB;AAAA,UAC7E;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBAAkD;AACzD,QAAM,QAAQ;AAQd,MAAI,MAAM,aAAa,UAAa,CAAC,MAAM,eAAe,CAAC,MAAM,kBAAkB;AACjF,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,aAAa,CAAC,SAAS,aAAa,MAAM,cAAc,SAAS,QAAQ;AAAA,IACzE,kBAAkB,CAAC,MAAM,aAAa,MAAM,mBAAmB,MAAM,QAAQ;AAAA,EAC/E;AACF;AAEA,IAAM,WAAW,gBAAgB;AACjC,IAAI,UAAU;AACZ,iCAA+B,QAAQ;AACzC;","names":["module","module","endpoint"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { VocalAnalysis, VocalApplyRequest, VocalCapabilities, VocalCreateRequest, VocalEditResult, VocalHistoryState, VocalNotesResult, VocalPitchEvaluation, VocalRenderRequest, VocalRenderResult, VocalRestoreRequest, VocalStateBytes, VocalStateToken, VocalUint64 } from './public_types_vocal_edit';
|
|
2
|
+
import { type VocalWorkerCreateResult, type VocalWorkerMutation } from './vocal_edit_worker_protocol';
|
|
3
|
+
export interface VocalEditWorker {
|
|
4
|
+
postMessage(message: unknown, transfer?: Transferable[]): void;
|
|
5
|
+
terminate(): unknown;
|
|
6
|
+
addEventListener?(type: string, listener: EventListener): void;
|
|
7
|
+
removeEventListener?(type: string, listener: EventListener): void;
|
|
8
|
+
on?(type: 'message' | 'error', listener: (...args: unknown[]) => void): unknown;
|
|
9
|
+
off?(type: 'message' | 'error', listener: (...args: unknown[]) => void): unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface VocalEditWorkerClientOptions {
|
|
12
|
+
worker?: VocalEditWorker;
|
|
13
|
+
workerUrl?: string | URL;
|
|
14
|
+
workerFactory?: (url: URL) => VocalEditWorker;
|
|
15
|
+
terminateWorkerOnDispose?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Per-call transfer behaviour for a request that carries typed arrays. */
|
|
18
|
+
export interface VocalEditWorkerTransferOptions {
|
|
19
|
+
/**
|
|
20
|
+
* Preserve the caller's typed arrays by copying them before dispatch.
|
|
21
|
+
*
|
|
22
|
+
* The default is `false`: typed-array buffers are transferred to the Worker
|
|
23
|
+
* and become detached on the calling thread, avoiding a second copy.
|
|
24
|
+
*/
|
|
25
|
+
copy?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface VocalEditWorkerCallOptions extends VocalEditWorkerTransferOptions {
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
export declare class VocalEditWorkerStaleResultError extends Error {
|
|
31
|
+
constructor(message?: string);
|
|
32
|
+
}
|
|
33
|
+
export declare class VocalEditWorkerTask<T> implements PromiseLike<T> {
|
|
34
|
+
readonly result: Promise<T>;
|
|
35
|
+
private readonly cancelRequest;
|
|
36
|
+
constructor(result: Promise<T>, cancelRequest: () => void);
|
|
37
|
+
cancel(): void;
|
|
38
|
+
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
39
|
+
catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
|
|
40
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
41
|
+
}
|
|
42
|
+
type RevisionArgument = VocalUint64 | {
|
|
43
|
+
expectedRevision?: VocalUint64;
|
|
44
|
+
};
|
|
45
|
+
export declare class VocalEditWorkerClient {
|
|
46
|
+
private readonly worker;
|
|
47
|
+
private readonly ownsWorker;
|
|
48
|
+
private readonly pending;
|
|
49
|
+
private readonly latestIntent;
|
|
50
|
+
private readonly sessions;
|
|
51
|
+
private nextId;
|
|
52
|
+
private nextSession;
|
|
53
|
+
private closed;
|
|
54
|
+
private usesEventTarget;
|
|
55
|
+
constructor(options?: VocalEditWorkerClientOptions);
|
|
56
|
+
create(request: VocalCreateRequest, options?: VocalEditWorkerCallOptions): VocalEditWorkerTask<VocalEditWorkerSession>;
|
|
57
|
+
restore(request: VocalRestoreRequest, options?: VocalEditWorkerCallOptions): VocalEditWorkerTask<VocalEditWorkerSession>;
|
|
58
|
+
private postDisposeMessage;
|
|
59
|
+
private postCancelMessage;
|
|
60
|
+
dispose(): void;
|
|
61
|
+
/** @internal Called by VocalEditWorkerSession. */
|
|
62
|
+
disposeSession(session: VocalEditWorkerSession): VocalEditWorkerTask<null>;
|
|
63
|
+
/** @internal */
|
|
64
|
+
callMutation<T>(session: VocalEditWorkerSession, mutation: VocalWorkerMutation, options?: VocalEditWorkerTransferOptions): VocalEditWorkerTask<T>;
|
|
65
|
+
/** @internal */
|
|
66
|
+
callPreview(session: VocalEditWorkerSession, request: VocalRenderRequest, options?: VocalEditWorkerTransferOptions): VocalEditWorkerTask<VocalRenderResult>;
|
|
67
|
+
private intent;
|
|
68
|
+
private openSession;
|
|
69
|
+
private callCreate;
|
|
70
|
+
private call;
|
|
71
|
+
private readonly onMessage;
|
|
72
|
+
private readonly onError;
|
|
73
|
+
private readonly onNodeMessage;
|
|
74
|
+
private readonly onNodeError;
|
|
75
|
+
}
|
|
76
|
+
/** Selects the open draft instead of the committed session for a read-only call. */
|
|
77
|
+
export interface VocalEditWorkerReadOptions {
|
|
78
|
+
draft?: boolean;
|
|
79
|
+
}
|
|
80
|
+
export declare class VocalEditWorkerSession {
|
|
81
|
+
readonly sessionId: string;
|
|
82
|
+
private tokenValue;
|
|
83
|
+
private disposed;
|
|
84
|
+
readonly created: VocalWorkerCreateResult;
|
|
85
|
+
private readonly client;
|
|
86
|
+
/** @internal Created by VocalEditWorkerClient.create/restore. */
|
|
87
|
+
constructor(client: VocalEditWorkerClient, sessionId: string, token: VocalStateToken, created: VocalWorkerCreateResult);
|
|
88
|
+
currentToken(): VocalStateToken;
|
|
89
|
+
updateToken(token: VocalStateToken): void;
|
|
90
|
+
/** @internal The adopted token, readable after dispose for reply checks. */
|
|
91
|
+
latestToken(): VocalStateToken;
|
|
92
|
+
token(): VocalStateToken;
|
|
93
|
+
/** The adopted revision; like {@link token}, it follows replies already received. */
|
|
94
|
+
revision(): VocalUint64;
|
|
95
|
+
notes(): VocalEditWorkerTask<VocalNotesResult>;
|
|
96
|
+
analysis(): VocalEditWorkerTask<VocalAnalysis>;
|
|
97
|
+
capabilities(): VocalEditWorkerTask<VocalCapabilities>;
|
|
98
|
+
outputLengthSamples(): VocalEditWorkerTask<number>;
|
|
99
|
+
history(): VocalEditWorkerTask<VocalHistoryState>;
|
|
100
|
+
/** Token of the open draft; rejects when no draft is open. */
|
|
101
|
+
draftToken(): VocalEditWorkerTask<VocalStateToken>;
|
|
102
|
+
evaluatePitch(noteId: number, options?: VocalEditWorkerReadOptions): VocalEditWorkerTask<VocalPitchEvaluation>;
|
|
103
|
+
sourceSampleToDestinationSample(noteId: number, sourceSample: number, options?: VocalEditWorkerReadOptions): VocalEditWorkerTask<number>;
|
|
104
|
+
destinationSampleToSourceSample(noteId: number, destinationSample: number, options?: VocalEditWorkerReadOptions): VocalEditWorkerTask<number>;
|
|
105
|
+
beginEdit(options?: RevisionArgument): VocalEditWorkerTask<VocalStateToken>;
|
|
106
|
+
apply(request: VocalApplyRequest, options?: VocalEditWorkerTransferOptions): VocalEditWorkerTask<VocalEditResult>;
|
|
107
|
+
commit(options?: RevisionArgument): VocalEditWorkerTask<VocalEditResult>;
|
|
108
|
+
cancel(): VocalEditWorkerTask<null>;
|
|
109
|
+
undo(options?: RevisionArgument): VocalEditWorkerTask<VocalEditResult>;
|
|
110
|
+
redo(options?: RevisionArgument): VocalEditWorkerTask<VocalEditResult>;
|
|
111
|
+
exportState(): VocalEditWorkerTask<VocalStateBytes>;
|
|
112
|
+
preview(request: VocalRenderRequest, options?: VocalEditWorkerTransferOptions): VocalEditWorkerTask<VocalRenderResult>;
|
|
113
|
+
/** Releases the Worker session and any open draft; later calls on it are rejected. */
|
|
114
|
+
dispose(): VocalEditWorkerTask<null>;
|
|
115
|
+
private requireAlive;
|
|
116
|
+
}
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=vocal_edit_worker_client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vocal_edit_worker_client.d.ts","sourceRoot":"","sources":["../src/vocal_edit_worker_client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { VocalAnalysis, VocalApplyRequest, VocalCapabilities, VocalCreateRequest, VocalEditResult, VocalHistoryState, VocalNotesResult, VocalPitchEvaluation, VocalRenderRequest, VocalRenderResult, VocalRestoreRequest, VocalStateBytes, VocalStateToken, VocalUint64 } from './public_types_vocal_edit';
|
|
2
|
+
export type VocalWorkerMutation = {
|
|
3
|
+
kind: 'beginEdit';
|
|
4
|
+
expectedRevision?: VocalUint64;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'apply';
|
|
7
|
+
request: VocalApplyRequest;
|
|
8
|
+
} | {
|
|
9
|
+
kind: 'commit';
|
|
10
|
+
expectedRevision: VocalUint64;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'cancel';
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'undo';
|
|
15
|
+
expectedRevision?: VocalUint64;
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'redo';
|
|
18
|
+
expectedRevision?: VocalUint64;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'notes';
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'analysis';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'capabilities';
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'exportState';
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'outputLength';
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'history';
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'draftToken';
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'evaluatePitch';
|
|
35
|
+
noteId: number;
|
|
36
|
+
draft?: boolean;
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'mapCoordinate';
|
|
39
|
+
noteId: number;
|
|
40
|
+
sample: number;
|
|
41
|
+
/** `false` maps source to destination; `true` maps destination to source. */
|
|
42
|
+
inverse: boolean;
|
|
43
|
+
draft?: boolean;
|
|
44
|
+
};
|
|
45
|
+
export type VocalWorkerCreateRequest = {
|
|
46
|
+
kind: 'create';
|
|
47
|
+
request: VocalCreateRequest;
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'restore';
|
|
50
|
+
request: VocalRestoreRequest;
|
|
51
|
+
};
|
|
52
|
+
export interface VocalWorkerCreateMessage {
|
|
53
|
+
type: 'sonare:vocal-create';
|
|
54
|
+
id: number;
|
|
55
|
+
sessionId: string;
|
|
56
|
+
clientIntentSequence: VocalUint64;
|
|
57
|
+
request: VocalWorkerCreateRequest;
|
|
58
|
+
cancelBuffer?: SharedArrayBuffer;
|
|
59
|
+
}
|
|
60
|
+
export interface VocalWorkerMutateMessage {
|
|
61
|
+
type: 'sonare:vocal-mutate';
|
|
62
|
+
id: number;
|
|
63
|
+
sessionId: string;
|
|
64
|
+
clientIntentSequence: VocalUint64;
|
|
65
|
+
baseToken?: VocalStateToken;
|
|
66
|
+
mutation: VocalWorkerMutation;
|
|
67
|
+
cancelBuffer?: SharedArrayBuffer;
|
|
68
|
+
}
|
|
69
|
+
export interface VocalWorkerPreviewMessage {
|
|
70
|
+
type: 'sonare:vocal-preview';
|
|
71
|
+
id: number;
|
|
72
|
+
sessionId: string;
|
|
73
|
+
clientIntentSequence: VocalUint64;
|
|
74
|
+
baseToken?: VocalStateToken;
|
|
75
|
+
request: VocalRenderRequest;
|
|
76
|
+
cancelBuffer?: SharedArrayBuffer;
|
|
77
|
+
}
|
|
78
|
+
export interface VocalWorkerDisposeMessage {
|
|
79
|
+
type: 'sonare:vocal-dispose';
|
|
80
|
+
id: number;
|
|
81
|
+
sessionId: string;
|
|
82
|
+
clientIntentSequence: VocalUint64;
|
|
83
|
+
}
|
|
84
|
+
export interface VocalWorkerCancelMessage {
|
|
85
|
+
type: 'sonare:vocal-cancel';
|
|
86
|
+
id: number;
|
|
87
|
+
sessionId: string;
|
|
88
|
+
clientIntentSequence: VocalUint64;
|
|
89
|
+
}
|
|
90
|
+
export type VocalWorkerRequestMessage = VocalWorkerCreateMessage | VocalWorkerMutateMessage | VocalWorkerPreviewMessage | VocalWorkerDisposeMessage | VocalWorkerCancelMessage;
|
|
91
|
+
export interface VocalWorkerCreateResult {
|
|
92
|
+
sessionId: string;
|
|
93
|
+
token: VocalStateToken;
|
|
94
|
+
notes: VocalNotesResult;
|
|
95
|
+
analysis: VocalAnalysis;
|
|
96
|
+
capabilities: VocalCapabilities;
|
|
97
|
+
}
|
|
98
|
+
export interface VocalWorkerResponseBase {
|
|
99
|
+
id: number;
|
|
100
|
+
sessionId: string;
|
|
101
|
+
clientIntentSequence: VocalUint64;
|
|
102
|
+
token?: VocalStateToken;
|
|
103
|
+
}
|
|
104
|
+
export type VocalWorkerResult = VocalWorkerCreateResult | VocalEditResult | VocalNotesResult | VocalAnalysis | VocalCapabilities | VocalStateBytes | VocalRenderResult | VocalStateToken | VocalHistoryState | VocalPitchEvaluation | number | null;
|
|
105
|
+
export interface VocalWorkerResultMessage extends VocalWorkerResponseBase {
|
|
106
|
+
type: 'sonare:vocal-result';
|
|
107
|
+
result: VocalWorkerResult;
|
|
108
|
+
}
|
|
109
|
+
export interface VocalWorkerProgressMessage extends VocalWorkerResponseBase {
|
|
110
|
+
type: 'sonare:vocal-progress';
|
|
111
|
+
complete: boolean;
|
|
112
|
+
}
|
|
113
|
+
export interface VocalWorkerErrorMessage extends VocalWorkerResponseBase {
|
|
114
|
+
type: 'sonare:vocal-error';
|
|
115
|
+
error: {
|
|
116
|
+
name: string;
|
|
117
|
+
message: string;
|
|
118
|
+
code?: number;
|
|
119
|
+
codeName?: string;
|
|
120
|
+
reason?: number;
|
|
121
|
+
field?: string;
|
|
122
|
+
expected?: VocalUint64;
|
|
123
|
+
actual?: VocalUint64;
|
|
124
|
+
expectedText?: string;
|
|
125
|
+
actualText?: string;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export type VocalWorkerResponseMessage = VocalWorkerResultMessage | VocalWorkerProgressMessage | VocalWorkerErrorMessage;
|
|
129
|
+
export declare function tokenEquals(a: VocalStateToken | undefined, b: VocalStateToken | undefined): boolean;
|
|
130
|
+
/** Compare the mutable session state portion of a token.
|
|
131
|
+
*
|
|
132
|
+
* Render results add request/profile metadata to the state token. That
|
|
133
|
+
* metadata identifies the render artifact, so it must not make a snapshot's
|
|
134
|
+
* state appear different from the session state used to create it.
|
|
135
|
+
*/
|
|
136
|
+
export declare function stateTokenEquals(a: VocalStateToken | undefined, b: VocalStateToken | undefined): boolean;
|
|
137
|
+
/** Decimal sequence comparison without converting a uint64 to Number. */
|
|
138
|
+
export declare function compareUint64(a: VocalUint64, b: VocalUint64): number;
|
|
139
|
+
//# sourceMappingURL=vocal_edit_worker_protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vocal_edit_worker_protocol.d.ts","sourceRoot":"","sources":["../src/vocal_edit_worker_protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ProjectVocalEditApplyRequest, ProjectVocalEditApplyResult, ProjectVocalEditDependency, ProjectVocalOriginalSource, ProjectVocalRehydrateItem } from './public_types_vocal_project';
|
|
2
|
+
/** The embind Project object is deliberately structural here. */
|
|
3
|
+
export interface VocalProjectNative {
|
|
4
|
+
applyVocalEdit: (request: unknown) => unknown;
|
|
5
|
+
getVocalEditDependencies: () => unknown;
|
|
6
|
+
rehydrateVocalEdits: (originals: unknown, cancel?: unknown) => unknown;
|
|
7
|
+
}
|
|
8
|
+
/** Apply a complete committed vocal render to a native Project object. */
|
|
9
|
+
export declare function projectApplyVocalEdit(native: VocalProjectNative, request: ProjectVocalEditApplyRequest): ProjectVocalEditApplyResult;
|
|
10
|
+
/** Return copied vocal sidecar dependencies in native storage order. */
|
|
11
|
+
export declare function projectGetVocalEditDependencies(native: VocalProjectNative): ProjectVocalEditDependency[];
|
|
12
|
+
/**
|
|
13
|
+
* Rehydrate unresolved vocal PCM without creating a Project history entry.
|
|
14
|
+
* Any truthy return from `cancel` cancels the call.
|
|
15
|
+
*/
|
|
16
|
+
export declare function projectRehydrateVocalEdits(native: VocalProjectNative, originals: readonly ProjectVocalOriginalSource[], cancel?: () => boolean): ProjectVocalRehydrateItem[];
|
|
17
|
+
//# sourceMappingURL=vocal_project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vocal_project.d.ts","sourceRoot":"","sources":["../src/vocal_project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAE1B,yBAAyB,EAC1B,MAAM,8BAA8B,CAAC;AAGtC,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;IAC9C,wBAAwB,EAAE,MAAM,OAAO,CAAC;IACxC,mBAAmB,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;CACxE;AAiPD,0EAA0E;AAC1E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAG7B;AAED,wEAAwE;AACxE,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,kBAAkB,GACzB,0BAA0B,EAAE,CAM9B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,kBAAkB,EAC1B,SAAS,EAAE,SAAS,0BAA0B,EAAE,EAChD,MAAM,CAAC,EAAE,MAAM,OAAO,GACrB,yBAAyB,EAAE,CAyC7B"}
|